content: /**
   *      Copyright (C) 2010 EdgyTech LLC.
   *
   *   Licensed under the Apache License, Version 2.0 (the "License");
   *   you may not use this file except in compliance with the License.
   *   You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *   Unless required by applicable law or agreed to in writing, software
   *   distributed under the License is distributed on an "AS IS" BASIS,
   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *   See the License for the specific language governing permissions and
   *   limitations under the License.
   */
  package com.edgytech.umongo;
  
  import com.edgytech.swingfast.EnumListener;
  import com.edgytech.swingfast.XmlComponentUnit;
  import com.mongodb.DBRef;
  import com.mongodb.DBRefBase;
  import javax.swing.JDialog;
  import org.bson.types.ObjectId;
  import com.edgytech.umongo.EditObjectIdDialog.Item;
  
  /**
   *
   * @author antoine
   */
  public class EditObjectIdDialog extends EditFieldDialog implements EnumListener<Item> {
  
      enum Item {
  
          string,
          time,
          machine,
          inc,
          currentTime,
          currentMachine,
          currentInc,
          namespace
      }
  
      public EditObjectIdDialog() {
          setEnumBinding(Item.values(), this);
      }
  
      @Override
      public Object getValue() {
          String str = getStringFieldValue(Item.string);
          ObjectId id = null;
          if (!str.isEmpty()) {
              id = new ObjectId(str);
          } else {
              int time = getIntFieldValue(Item.time);
              int machine = getIntFieldValue(Item.machine);
              int inc = getIntFieldValue(Item.inc);
              id = new ObjectId(time, machine, inc);
          }
          String ns = getStringFieldValue(Item.namespace);
          if (ns.trim().isEmpty()) {
              return id;
          }
          return new DBRef(null, ns, id);
      }
  
      @Override
      public void setValue(Object value) {
          ObjectId id = null;
          if (value instanceof DBRefBase) {
              DBRefBase ref = (DBRefBase) value;
              setStringFieldValue(Item.namespace, ref.getRef());
              id = (ObjectId) ref.getId();
          } else {
              id = (ObjectId) value;
          }
          setStringFieldValue(Item.string, id.toString());
          setIntFieldValue(Item.time, id._time());
          setIntFieldValue(Item.machine, id.getMachine());
          setIntFieldValue(Item.inc, id.getInc());
      }
  
      @Override
      protected void updateComponentCustom(JDialog old) {
          super.updateComponentCustom(old);
          setStringFieldValue(Item.currentTime, String.valueOf(System.currentTimeMillis() / 1000));
          setStringFieldValue(Item.currentMachine, String.valueOf(ObjectId.getGenMachineId()));
          setStringFieldValue(Item.currentInc, String.valueOf(ObjectId.getCurrentInc()));
      }
  
      public void actionPerformed(Item enm, XmlComponentUnit unit, Object src) {
          switch (enm) {
              case string:
                  String str = getComponentStringFieldValue(Item.string);
                  if (!str.isEmpty()) {
                      ObjectId oid = new ObjectId(str);
                      setComponentIntFieldValue(Item.time, oid.getTimeSecond());
                      setComponentIntFieldValue(Item.machine, oid.getMachine());
                      setComponentIntFieldValue(Item.inc, oid.getInc());
                  }
                  break;
              case time:
              case machine:
              case inc:
                  int time = getComponentIntFieldValue(Item.time);
                  int machine = getComponentIntFieldValue(Item.machine);
                  int inc = getComponentIntFieldValue(Item.inc);
                  ObjectId oid = new ObjectId(time, machine, inc);
                  setComponentStringFieldValue(Item.string, oid.toString());
                  break;
          }
      }
  }
  