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.umongo.DocumentMenu.Item;
  import com.edgytech.swingfast.*;
  import com.mongodb.BasicDBObject;
  import com.mongodb.DBCollection;
  import com.mongodb.DBObject;
  import java.awt.Toolkit;
  import java.awt.datatransfer.Clipboard;
  import java.awt.datatransfer.StringSelection;
  
  /**
   *
   * @author antoine
   */
  public class DocumentMenu extends PopUpMenu implements EnumListener<Item> {
  
      enum Item {
          update,
          upUpdate,
          remove,
          copyValue
      }
  
      public DocumentMenu() {
          setEnumBinding(Item.values(), this);
      }
      
      @Override
      public void actionPerformed(Item enm, XmlComponentUnit unit, Object src) {
      }
      
      public void update(ButtonBase button) {
          final DocView dv = (DocView) (UMongo.instance.getTabbedResult().getSelectedUnit());
          TreeNodeDocument node = (TreeNodeDocument) dv.getSelectedNode().getUserObject();
          final DBObject doc = node.getDBObject();
  
          ((DocBuilderField) getBoundUnit(Item.upUpdate)).setDBObject((BasicDBObject) doc);
          if (!((MenuItem) getBoundUnit(Item.update)).getDialog().show()) {
              return;
          }
                  
          final DBObject query = doc.containsField("_id") ? new BasicDBObject("_id", doc.get("_id")) : doc;
          final DBObject update = ((DocBuilderField) getBoundUnit(Item.upUpdate)).getDBObject();
  
          if (dv.getDBCursor() == null) {
              // local data
              Tree tree = dv.getTree();
              tree.removeChild(node);
              dv.addDocument(update, null);
              tree.structureComponent();
              tree.expandNode(tree.getTreeNode());
              return;
          }
          
          final DBCollection col = dv.getDBCursor().getCollection();
          new DbJob() {
  
              @Override
              public Object doRun() {
                  return col.update(query, update, false, false);
              }
  
              @Override
              public String getNS() {
                  return col.getFullName();
              }
  
              @Override
              public String getShortName() {
                  return "Update";
              }
  
              @Override
              public DBObject getRoot(Object result) {
                  BasicDBObject obj = new BasicDBObject("query", query);
                  obj.put("update", update);
                  return obj;
              }
  
              @Override
              public void wrapUp(Object res) {
                  super.wrapUp(res);
                  dv.refresh(null);
              }
          }.addJob();
      }
      
      public void remove(ButtonBase button) {
          final DocView dv = (DocView) (UMongo.instance.getTabbedResult().getSelectedUnit());
          TreeNodeDocument node = (TreeNodeDocument) dv.getSelectedNode().getUserObject();
          final DBObject doc = node.getDBObject();
  
          if (dv.getDBCursor() == null) {
              // local data
              Tree tree = dv.getTree();
              tree.removeChild(node);
              tree.structureComponent();
              tree.expandNode(tree.getTreeNode());
              return;
          }
  
          // go by _id if possible
          final DBObject query = doc.containsField("_id") ? new BasicDBObject("_id", doc.get("_id")) : doc;
          final DBCollection col = dv.getDBCursor().getCollection();
          new DbJob() {
  
              @Override
              public Object doRun() {
                  return col.remove(query);
              }
  
              @Override
              public String getNS() {
                  return col.getFullName();
              }
  
              @Override
              public String getShortName() {
                  return "Remove";
              }
  
              @Override
              public void wrapUp(Object res) {
                  super.wrapUp(res);
                  dv.refresh(null);
              }
  
              @Override
              public DBObject getRoot(Object result) {
                  return query;
              }
          }.addJob();
      }
  
      public void copyValue(ButtonBase button) {
          final DocView dv = (DocView) (UMongo.instance.getTabbedResult().getSelectedUnit());
          TreeNodeDocument node = (TreeNodeDocument) dv.getSelectedNode().getUserObject();
          final DBObject doc = node.getDBObject();
          String selection = MongoUtils.getJSON(doc);
          StringSelection data = new StringSelection(selection);
          Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
          clipboard.setContents(data, data);
      }
      
  }
  