Search in sources :

Example 16 with Node

use of ini.trakem2.display.Node in project TrakEM2 by trakem2.

the class ProjectTree method keyPressed.

@Override
public void keyPressed(final KeyEvent ke) {
    super.keyPressed(ke);
    if (ke.isConsumed())
        return;
    if (!ke.getSource().equals(ProjectTree.this) || !project.isInputEnabled()) {
        return;
    }
    // get the first selected node only
    TreePath path = getSelectionPath();
    if (null == path)
        return;
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
    if (null == node)
        return;
    final ProjectThing pt = (ProjectThing) node.getUserObject();
    if (null == pt)
        return;
    // 
    final int flags = ke.getModifiers();
    switch(ke.getKeyCode()) {
        case KeyEvent.VK_PAGE_UP:
            move(node, -1);
            // in any case
            ke.consume();
            break;
        case KeyEvent.VK_PAGE_DOWN:
            move(node, 1);
            // in any case
            ke.consume();
            break;
        case KeyEvent.VK_F2:
            rename(pt);
            ke.consume();
            break;
        case KeyEvent.VK_H:
            if (0 == (flags ^ Event.ALT_MASK)) {
                pt.setVisible(true);
                ke.consume();
            } else if (0 == flags) {
                pt.setVisible(false);
                ke.consume();
            }
            break;
        case KeyEvent.VK_A:
            if (0 == flags || (0 == (flags ^ Event.SHIFT_MASK))) {
                selectInDisplay(pt, 0 == (flags ^ Event.SHIFT_MASK));
                ke.consume();
            }
            break;
        case KeyEvent.VK_3:
            if (0 == flags) {
                ini.trakem2.display.Display3D.showAndResetView(pt);
                ke.consume();
                break;
            }
        // else, flow:
        case KeyEvent.VK_1:
        case KeyEvent.VK_2:
        case KeyEvent.VK_4:
        case KeyEvent.VK_5:
        case KeyEvent.VK_6:
        case KeyEvent.VK_7:
        case KeyEvent.VK_8:
        case KeyEvent.VK_9:
            // run a plugin, if any
            if (pt.getObject() instanceof Displayable && null != Utils.launchTPlugIn(ke, "Project Tree", project, (Displayable) pt.getObject())) {
                ke.consume();
            }
            break;
    }
    ke.consume();
}
Also used : Displayable(ini.trakem2.display.Displayable) ZDisplayable(ini.trakem2.display.ZDisplayable) TreePath(javax.swing.tree.TreePath) DefaultMutableTreeNode(javax.swing.tree.DefaultMutableTreeNode)

Example 17 with Node

use of ini.trakem2.display.Node in project TrakEM2 by trakem2.

the class ProjectTree method remove.

/**
 * If the given node is null, it will be searched for.
 */
public boolean remove(final boolean check, final ProjectThing thing, final DefaultMutableTreeNode node) {
    final Object obd = thing.getObject();
    // shortcut to remove everything regardless.
    if (obd.getClass() == Project.class)
        return ((Project) obd).remove(check);
    final boolean b = thing.remove(check) && removeNode(null != node ? node : findNode(thing, this));
    Display.repaint();
    return b;
}
Also used : DBObject(ini.trakem2.persistence.DBObject)

Example 18 with Node

use of ini.trakem2.display.Node in project TrakEM2 by trakem2.

the class ProjectTree method getPopupMenu.

/**
 * Get a custom, context-sensitive popup menu for the selected node.
 */
private JPopupMenu getPopupMenu(DefaultMutableTreeNode node) {
    Object ob = node.getUserObject();
    ProjectThing thing = null;
    if (ob instanceof ProjectThing) {
        thing = (ProjectThing) ob;
    } else {
        return null;
    }
    // context-sensitive popup
    JMenuItem[] items = thing.getPopupItems(this);
    if (0 == items.length)
        return null;
    JPopupMenu popup = new JPopupMenu();
    for (int i = 0; i < items.length; i++) {
        popup.add(items[i]);
    }
    JMenu node_menu = new JMenu("Node");
    JMenuItem item = new JMenuItem("Move up");
    item.addActionListener(this);
    item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0, true));
    node_menu.add(item);
    item = new JMenuItem("Move down");
    item.addActionListener(this);
    item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0, true));
    node_menu.add(item);
    item = new JMenuItem("Collapse nodes of children nodes");
    item.addActionListener(this);
    node_menu.add(item);
    popup.add(node_menu);
    JMenu send_menu = new JMenu("Send to");
    item = new JMenuItem("Sibling project");
    item.addActionListener(this);
    send_menu.add(item);
    popup.add(send_menu);
    return popup;
}
Also used : DBObject(ini.trakem2.persistence.DBObject) JMenuItem(javax.swing.JMenuItem) JPopupMenu(javax.swing.JPopupMenu) JMenu(javax.swing.JMenu)

Example 19 with Node

use of ini.trakem2.display.Node in project TrakEM2 by trakem2.

the class ProjectTree method remove.

/**
 * Remove the Thing and DefaultMutableTreeNode that wrap each of the Displayable;
 *  calls softRemove on each Displayable, and does NOT call remove on the Displayable.
 *  If a Displayable is not found, it returns it in a set of not found objects.
 *  If all are removed, returns an empty set.
 */
public final Set<Displayable> remove(final Set<? extends Displayable> displayables, final DefaultMutableTreeNode top) {
    final Enumeration<?> en = (null == top ? (DefaultMutableTreeNode) getModel().getRoot() : top).depthFirstEnumeration();
    final HashSet<DefaultMutableTreeNode> to_remove = new HashSet<DefaultMutableTreeNode>();
    final HashSet<Displayable> remaining = new HashSet<Displayable>(displayables);
    while (en.hasMoreElements()) {
        final DefaultMutableTreeNode node = (DefaultMutableTreeNode) en.nextElement();
        final ProjectThing pt = (ProjectThing) node.getUserObject();
        if (remaining.remove(pt.getObject())) {
            // don't call remove on the object!
            pt.remove(false, false);
            ((Displayable) pt.getObject()).softRemove();
            to_remove.add(node);
        }
    }
    // Updates the model properly:
    for (final DefaultMutableTreeNode node : to_remove) {
        ((DefaultTreeModel) this.getModel()).removeNodeFromParent(node);
    }
    if (!remaining.isEmpty()) {
        Utils.log("Could not remove:", remaining);
    }
    return remaining;
}
Also used : Displayable(ini.trakem2.display.Displayable) ZDisplayable(ini.trakem2.display.ZDisplayable) DefaultMutableTreeNode(javax.swing.tree.DefaultMutableTreeNode) DefaultTreeModel(javax.swing.tree.DefaultTreeModel) HashSet(java.util.HashSet)

Example 20 with Node

use of ini.trakem2.display.Node in project TrakEM2 by trakem2.

the class TemplateTree method mousePressed.

public void mousePressed(MouseEvent me) {
    Object source = me.getSource();
    if (!source.equals(this) || !project.isInputEnabled()) {
        return;
    }
    /*if (!(me.isPopupTrigger() || me.isControlDown() || MouseEvent.BUTTON2 == me.getButton() || 0 != (me.getModifiers() & Event.META_MASK))) { // the last block is from ij.gui.ImageCanvas, aparently to make the right-click work on windows?
			return;
		}*/
    if (!Utils.isPopupTrigger(me))
        return;
    int x = me.getX();
    int y = me.getY();
    // find the node and set it selected
    TreePath path = getPathForLocation(x, y);
    if (null == path)
        return;
    setSelectionPath(path);
    this.selected_node = (DefaultMutableTreeNode) path.getLastPathComponent();
    final TemplateThing tt = (TemplateThing) selected_node.getUserObject();
    String type = tt.getType();
    // 
    JPopupMenu popup = new JPopupMenu();
    JMenuItem item;
    if (!Project.isBasicType(type) && !tt.isNested()) {
        JMenu menu = new JMenu("Add new child");
        popup.add(menu);
        item = new JMenuItem("new...");
        item.addActionListener(this);
        menu.add(item);
        // Add also from other open projects
        if (ControlWindow.getProjects().size() > 1) {
            menu.addSeparator();
            JMenu other = new JMenu("From project...");
            menu.add(other);
            for (Iterator<Project> itp = ControlWindow.getProjects().iterator(); itp.hasNext(); ) {
                final Project pr = (Project) itp.next();
                if (root.getProject() == pr)
                    continue;
                item = new JMenuItem(pr.toString());
                other.add(item);
                item.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent ae) {
                        GenericDialog gd = new GenericDialog(pr.toString());
                        gd.addMessage("Project: " + pr.toString());
                        final HashMap<String, TemplateThing> hm = pr.getTemplateTree().root.getUniqueTypes(new HashMap<String, TemplateThing>());
                        final String[] u_types = hm.keySet().toArray(new String[0]);
                        gd.addChoice("type:", u_types, u_types[0]);
                        gd.showDialog();
                        if (gd.wasCanceled())
                            return;
                        TemplateThing tt_chosen = hm.get(gd.getNextChoice());
                        // must solve conflicts!
                        // Recurse into children: if any type that is not a basic type exists in the target project, ban the operation.
                        ArrayList al = tt_chosen.collectAllChildren(new ArrayList());
                        for (Iterator ital = al.iterator(); ital.hasNext(); ) {
                            TemplateThing child = (TemplateThing) ital.next();
                            if (root.getProject().typeExists(child.getType()) && !pr.isBasicType(child.getType())) {
                                Utils.showMessage("Type conflict: cannot add type " + tt_chosen.getType());
                                return;
                            }
                        }
                        // Else add it, recursive into children
                        // Target is tt
                        addCopiesRecursively(tt, tt_chosen);
                        rebuild(selected_node, true);
                    }
                });
            }
        }
        menu.addSeparator();
        String[] ut = tt.getProject().getUniqueTypes();
        for (int i = 0; i < ut.length; i++) {
            item = new JMenuItem(ut[i]);
            item.addActionListener(this);
            menu.add(item);
        }
    }
    item = new JMenuItem("Delete...");
    item.addActionListener(this);
    popup.add(item);
    // disable deletion of root.
    if (null == selected_node.getParent())
        item.setEnabled(false);
    if (!Project.isBasicType(type)) {
        item = new JMenuItem("Rename...");
        item.addActionListener(this);
        popup.add(item);
    }
    popup.addSeparator();
    item = new JMenuItem("Export XML template...");
    item.addActionListener(this);
    popup.add(item);
    popup.show(this, x, y);
}
Also used : HashMap(java.util.HashMap) ActionEvent(java.awt.event.ActionEvent) ArrayList(java.util.ArrayList) JPopupMenu(javax.swing.JPopupMenu) Project(ini.trakem2.Project) TreePath(javax.swing.tree.TreePath) ActionListener(java.awt.event.ActionListener) GenericDialog(ij.gui.GenericDialog) Iterator(java.util.Iterator) JMenuItem(javax.swing.JMenuItem) JMenu(javax.swing.JMenu)

Aggregations

DBObject (ini.trakem2.persistence.DBObject)16 ProjectThing (ini.trakem2.tree.ProjectThing)12 HashMap (java.util.HashMap)12 HashSet (java.util.HashSet)12 TreePath (javax.swing.tree.TreePath)12 DefaultMutableTreeNode (javax.swing.tree.DefaultMutableTreeNode)11 Displayable (ini.trakem2.display.Displayable)9 ZDisplayable (ini.trakem2.display.ZDisplayable)9 ArrayList (java.util.ArrayList)9 GenericDialog (ij.gui.GenericDialog)8 Layer (ini.trakem2.display.Layer)7 LayerThing (ini.trakem2.tree.LayerThing)6 Point (java.awt.Point)6 Map (java.util.Map)6 JMenuItem (javax.swing.JMenuItem)6 JPopupMenu (javax.swing.JPopupMenu)6 Project (ini.trakem2.Project)5 TemplateThing (ini.trakem2.tree.TemplateThing)5 Color (java.awt.Color)5 AreaTree (ini.trakem2.display.AreaTree)4