use of ini.trakem2.display.Dissector in project TrakEM2 by trakem2.
the class Display method getPopupMenu.
/**
* Return a context-sensitive popup menu.
*/
protected JPopupMenu getPopupMenu() {
// get the job canceling dialog
if (!canvas.isInputEnabled()) {
return project.getLoader().getJobsPopup(this);
}
// create new
this.popup = new JPopupMenu();
JMenuItem item = null;
JMenu menu = null;
if (mode instanceof InspectPatchTrianglesMode) {
item = new JMenuItem("Exit inspection");
item.addActionListener(this);
popup.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true));
return popup;
} else if (canvas.isTransforming()) {
item = new JMenuItem("Apply transform");
item.addActionListener(this);
popup.add(item);
// dummy, for I don't add a MenuKeyListener, but "works" through the normal key listener. It's here to provide a visual cue
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true));
item = new JMenuItem("Apply transform propagating to last layer");
item.addActionListener(this);
popup.add(item);
if (layer.getParent().indexOf(layer) == layer.getParent().size() - 1)
item.setEnabled(false);
if (!(getMode().getClass() == AffineTransformMode.class || getMode().getClass() == NonLinearTransformMode.class))
item.setEnabled(false);
item = new JMenuItem("Apply transform propagating to first layer");
item.addActionListener(this);
popup.add(item);
if (0 == layer.getParent().indexOf(layer))
item.setEnabled(false);
if (!(getMode().getClass() == AffineTransformMode.class || getMode().getClass() == NonLinearTransformMode.class))
item.setEnabled(false);
item = new JMenuItem("Cancel transform");
item.addActionListener(this);
popup.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true));
item = new JMenuItem("Specify transform...");
item.addActionListener(this);
popup.add(item);
if (getMode().getClass() != AffineTransformMode.class)
item.setEnabled(false);
if (getMode().getClass() == ManualAlignMode.class) {
final JMenuItem lexport = new JMenuItem("Export landmarks");
popup.add(lexport);
final JMenuItem limport = new JMenuItem("Import landmarks");
popup.add(limport);
final ActionListener a = new ActionListener() {
@Override
public void actionPerformed(final ActionEvent ae) {
final ManualAlignMode mam = (ManualAlignMode) getMode();
final Object source = ae.getSource();
if (lexport == source) {
mam.exportLandmarks();
} else if (limport == source) {
mam.importLandmarks();
}
}
};
lexport.addActionListener(a);
limport.addActionListener(a);
}
return popup;
}
final Class<?> aclass = null == active ? null : active.getClass();
if (null != active) {
if (Profile.class == aclass) {
item = new JMenuItem("Duplicate, link and send to next layer");
item.addActionListener(this);
popup.add(item);
Layer nl = layer.getParent().next(layer);
if (nl == layer)
item.setEnabled(false);
item = new JMenuItem("Duplicate, link and send to previous layer");
item.addActionListener(this);
popup.add(item);
nl = layer.getParent().previous(layer);
if (nl == layer)
item.setEnabled(false);
menu = new JMenu("Duplicate, link and send to");
int i = 1;
for (final Layer la : layer.getParent().getLayers()) {
// TODO should label which layers contain Profile instances linked to the one being duplicated
item = new JMenuItem(i + ": z = " + la.getZ());
// TODO should label which layers contain Profile instances linked to the one being duplicated
item.addActionListener(this);
// TODO should label which layers contain Profile instances linked to the one being duplicated
menu.add(item);
if (la == this.layer)
item.setEnabled(false);
i++;
}
popup.add(menu);
item = new JMenuItem("Duplicate, link and send to...");
item.addActionListener(this);
popup.add(item);
popup.addSeparator();
item = new JMenuItem("Unlink from images");
item.addActionListener(this);
popup.add(item);
// isLinked() checks if it's linked to a Patch in its own layer
if (!active.isLinked())
item.setEnabled(false);
item = new JMenuItem("Show in 3D");
item.addActionListener(this);
popup.add(item);
popup.addSeparator();
} else if (Patch.class == aclass) {
final JMenu m = new JMenu("Patch");
item = new JMenuItem("Fill ROI in alpha mask");
item.addActionListener(this);
m.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, 0));
item.setEnabled(null != getRoi());
item = new JMenuItem("Fill inverse ROI in alpha mask");
item.addActionListener(this);
m.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, Event.SHIFT_MASK));
item.setEnabled(null != getRoi());
item = new JMenuItem("Remove alpha mask");
item.addActionListener(this);
m.add(item);
if (!((Patch) active).hasAlphaMask())
item.setEnabled(false);
item = new JMenuItem("Unlink from images");
item.addActionListener(this);
m.add(item);
if (!active.isLinked(Patch.class))
item.setEnabled(false);
if (((Patch) active).isStack()) {
item = new JMenuItem("Unlink slices");
item.addActionListener(this);
m.add(item);
}
final int n_sel_patches = selection.getSelected(Patch.class).size();
item = new JMenuItem("Snap");
item.addActionListener(this);
m.add(item);
item.setEnabled(1 == n_sel_patches);
item = new JMenuItem("Montage");
item.addActionListener(this);
m.add(item);
item.setEnabled(n_sel_patches > 1);
item = new JMenuItem("Lens correction");
item.addActionListener(this);
m.add(item);
item.setEnabled(n_sel_patches > 1);
item = new JMenuItem("Blend");
item.addActionListener(this);
m.add(item);
item.setEnabled(n_sel_patches > 1);
item = new JMenuItem("Open image");
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
for (final Patch p : selection.get(Patch.class)) {
p.getImagePlus().show();
}
}
});
m.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, KeyEvent.SHIFT_MASK, true));
item = new JMenuItem("Open original image");
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
for (final Patch p : selection.get(Patch.class)) {
p.getProject().getLoader().releaseToFit(p.getOWidth(), p.getOHeight(), p.getType(), 5);
p.getProject().getLoader().openImagePlus(p.getImageFilePath()).show();
}
}
});
item = new JMenuItem("View volume");
item.addActionListener(this);
m.add(item);
final HashSet<Displayable> hs = active.getLinked(Patch.class);
if (null == hs || 0 == hs.size())
item.setEnabled(false);
item = new JMenuItem("View orthoslices");
item.addActionListener(this);
m.add(item);
// if no Patch instances among the directly linked, then it's not a stack
if (null == hs || 0 == hs.size())
item.setEnabled(false);
popup.add(m);
popup.addSeparator();
} else {
item = new JMenuItem("Unlink");
item.addActionListener(this);
popup.add(item);
item = new JMenuItem("Show in 3D");
item.addActionListener(this);
popup.add(item);
popup.addSeparator();
}
if (AreaList.class == aclass) {
final ArrayList<?> al = selection.getSelected();
int n = 0;
for (final Iterator<?> it = al.iterator(); it.hasNext(); ) {
if (it.next().getClass() == AreaList.class)
n++;
}
item = new JMenuItem("Merge");
item.addActionListener(this);
popup.add(item);
if (n < 2)
item.setEnabled(false);
item = new JMenuItem("Split");
item.addActionListener(this);
popup.add(item);
if (n < 1)
item.setEnabled(false);
addAreaListAreasMenu(popup, active);
popup.addSeparator();
} else if (Pipe.class == aclass) {
item = new JMenuItem("Reverse point order");
item.addActionListener(this);
popup.add(item);
popup.addSeparator();
} else if (Treeline.class == aclass || AreaTree.class == aclass) {
if (AreaTree.class == aclass)
addAreaTreeAreasMenu(popup, (AreaTree) active);
item = new JMenuItem("Reroot");
item.addActionListener(this);
popup.add(item);
item = new JMenuItem("Part subtree");
item.addActionListener(this);
popup.add(item);
item = new JMenuItem("Join");
item.addActionListener(this);
popup.add(item);
item = new JMenuItem("Show tabular view");
item.addActionListener(this);
popup.add(item);
final Collection<Tree> trees = selection.get(Tree.class);
//
final JMenu nodeMenu = new JMenu("Nodes");
item = new JMenuItem("Mark");
item.addActionListener(this);
nodeMenu.add(item);
item = new JMenuItem("Clear marks (selected Trees)");
item.addActionListener(this);
nodeMenu.add(item);
final JMenuItem nodeColor = new JMenuItem("Color...");
nodeMenu.add(nodeColor);
nodeColor.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.SHIFT_MASK, true));
final JMenuItem nodePairColor = new JMenuItem("Color path between two nodes tagged as...");
nodeMenu.add(nodePairColor);
final JMenuItem nodeRadius = active instanceof Treeline ? new JMenuItem("Radius...") : null;
if (null != nodeRadius) {
nodeMenu.add(nodeRadius);
nodeRadius.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, 0, true));
}
final JMenuItem removeAllTags = new JMenuItem("Drop all tags (selected trees)");
nodeMenu.add(removeAllTags);
final JMenuItem removeTag = new JMenuItem("Drop all occurrences of tag...");
nodeMenu.add(removeTag);
final JMenuItem colorizeByNodeCentrality = new JMenuItem("Colorize by node betweenness centrality");
nodeMenu.add(colorizeByNodeCentrality);
final JMenuItem colorizeByBranchCentrality = new JMenuItem("Colorize by branch betweenness centrality");
nodeMenu.add(colorizeByBranchCentrality);
popup.add(nodeMenu);
final ActionListener ln = new ActionListener() {
@Override
public void actionPerformed(final ActionEvent ae) {
if (null == active) {
Utils.showMessage("No tree selected!");
return;
}
if (!(active instanceof Tree)) {
Utils.showMessage("The selected object is not a Tree!");
return;
}
final Tree tree = (Tree) active;
final Object src = ae.getSource();
//
if (src == nodeColor) {
final Node nd = tree.getLastVisited();
if (null == nd) {
Utils.showMessage("Select a node first by clicking on it\nor moving the mouse over it and pushing 'g'.");
return;
}
// sets an undo step
tree.adjustNodeColors(nd);
} else if (src == nodePairColor) {
final TreeMap<String, Tag> sm = getTags(tree);
if (null == sm)
return;
if (1 == sm.size()) {
Utils.showMessage("Need at least two different tags in the tree!");
return;
}
final Color color = tree.getColor();
final GenericDialog gd = new GenericDialog("Node colors");
gd.addSlider("Red: ", 0, 255, color.getRed());
gd.addSlider("Green: ", 0, 255, color.getGreen());
gd.addSlider("Blue: ", 0, 255, color.getBlue());
final String[] stags = asStrings(sm);
sm.keySet().toArray(stags);
gd.addChoice("Upstream tag:", stags, stags[0]);
gd.addChoice("Downstream tag:", stags, stags[1]);
gd.showDialog();
if (gd.wasCanceled())
return;
final Color newColor = new Color((int) gd.getNextNumber(), (int) gd.getNextNumber(), (int) gd.getNextNumber());
final Tag upstreamTag = sm.get(gd.getNextChoice());
final Tag downstreamTag = sm.get(gd.getNextChoice());
final List<Tree<?>.NodePath> pairs = tree.findTaggedPairs(upstreamTag, downstreamTag);
if (null == pairs || pairs.isEmpty()) {
Utils.showMessage("No pairs found for '" + upstreamTag + "' and '" + downstreamTag + "'");
return;
}
getLayerSet().addDataEditStep(tree);
for (final Tree<?>.NodePath pair : pairs) {
for (final Node<?> nd : pair.path) {
nd.setColor(newColor);
}
}
getLayerSet().addDataEditStep(tree);
Display.repaint();
} else if (src == nodeRadius) {
if (!(tree instanceof Treeline))
return;
final Node nd = tree.getLastVisited();
if (null == nd) {
Utils.showMessage("Select a node first by clicking on it\nor moving the mouse over it and pushing 'g'.");
return;
}
// sets an undo step
((Treeline) tree).askAdjustRadius(nd);
} else if (src == removeAllTags) {
if (!Utils.check("Really remove all tags from all selected trees?"))
return;
final List<Tree> sel = selection.get(Tree.class);
getLayerSet().addDataEditStep(new HashSet<Displayable>(sel));
try {
for (final Tree t : sel) {
t.dropAllTags();
}
// current state
getLayerSet().addDataEditStep(new HashSet<Displayable>(sel));
} catch (final Exception e) {
getLayerSet().undoOneStep();
IJError.print(e);
}
Display.repaint();
} else if (src == removeTag) {
final TreeMap<String, Tag> tags = getTags(tree);
final String[] ts = asStrings(tags);
final GenericDialog gd = new GenericDialog("Remove tags");
gd.addChoice("Tag:", ts, ts[0]);
final String[] c = new String[] { "Active tree", "All selected trees and connectors", "All trees and connectors" };
gd.addChoice("From: ", c, c[0]);
gd.showDialog();
if (gd.wasCanceled())
return;
final HashSet<Displayable> ds = new HashSet<Displayable>();
final Tag tag = tags.get(gd.getNextChoice());
switch(gd.getNextChoiceIndex()) {
case 0:
ds.add(tree);
break;
case 1:
ds.addAll(selection.get(Tree.class));
case 2:
ds.addAll(getLayerSet().getZDisplayables(Tree.class, true));
}
getLayerSet().addDataEditStep(ds);
try {
for (final Displayable d : ds) {
final Tree t = (Tree) d;
t.removeTag(tag);
}
getLayerSet().addDataEditStep(ds);
} catch (final Exception e) {
getLayerSet().undoOneStep();
IJError.print(e);
}
Display.repaint();
} else if (src == colorizeByNodeCentrality) {
final List<Tree> ts = selection.get(Tree.class);
final HashSet<Tree> ds = new HashSet<Tree>(ts);
getLayerSet().addDataEditStep(ds);
try {
for (final Tree t : ts) {
t.colorizeByNodeBetweennessCentrality();
}
getLayerSet().addDataEditStep(ds);
Display.repaint();
} catch (final Exception e) {
getLayerSet().undoOneStep();
IJError.print(e);
}
} else if (src == colorizeByBranchCentrality) {
final List<Tree> ts = selection.get(Tree.class);
final HashSet<Tree> ds = new HashSet<Tree>(ts);
getLayerSet().addDataEditStep(ds);
try {
for (final Tree t : ts) {
t.colorizeByBranchBetweennessCentrality(2);
}
getLayerSet().addDataEditStep(ds);
Display.repaint();
} catch (final Exception e) {
getLayerSet().undoOneStep();
IJError.print(e);
}
}
}
};
for (final JMenuItem a : new JMenuItem[] { nodeColor, nodePairColor, nodeRadius, removeAllTags, removeTag, colorizeByNodeCentrality, colorizeByBranchCentrality }) {
if (null == a)
continue;
a.addActionListener(ln);
}
//
final JMenu review = new JMenu("Review");
final JMenuItem tgenerate = new JMenuItem("Generate review stacks (selected Trees)");
review.add(tgenerate);
tgenerate.setEnabled(trees.size() > 0);
final JMenuItem tslab = new JMenuItem("Generate review stack for current slab");
review.add(tslab);
final JMenuItem tsubtree = new JMenuItem("Generate review stacks for subtree");
review.add(tsubtree);
final JMenuItem tremove = new JMenuItem("Remove reviews (selected Trees)");
review.add(tremove);
tremove.setEnabled(trees.size() > 0);
final JMenuItem tconnectors = new JMenuItem("View table of outgoing/incoming connectors");
review.add(tconnectors);
final ActionListener l = new ActionListener() {
@Override
public void actionPerformed(final ActionEvent ae) {
if (!Utils.check("Really " + ae.getActionCommand())) {
return;
}
dispatcher.exec(new Runnable() {
@Override
public void run() {
int count = 0;
for (final Tree<?> t : trees) {
Utils.log("Processing " + (++count) + "/" + trees.size());
Bureaucrat bu = null;
if (ae.getSource() == tgenerate)
bu = t.generateAllReviewStacks();
else if (ae.getSource() == tremove)
bu = t.removeReviews();
else if (ae.getSource() == tslab) {
final Point po = canvas.consumeLastPopupPoint();
Utils.log2(po, layer, 1.0);
bu = t.generateReviewStackForSlab(po.x, po.y, Display.this.layer, 1.0);
} else if (ae.getSource() == tsubtree) {
final Point po = canvas.consumeLastPopupPoint();
bu = t.generateSubtreeReviewStacks(po.x, po.y, Display.this.layer, 1.0);
}
if (null != bu)
try {
bu.getWorker().join();
} catch (final InterruptedException ie) {
return;
}
}
}
});
}
};
for (final JMenuItem c : new JMenuItem[] { tgenerate, tslab, tsubtree, tremove }) c.addActionListener(l);
tconnectors.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent ae) {
for (final Tree<?> t : trees) TreeConnectorsView.create(t);
}
});
popup.add(review);
final JMenu go = new JMenu("Go");
item = new JMenuItem("Previous branch node or start");
item.addActionListener(this);
go.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, 0, true));
item = new JMenuItem("Next branch node or end");
item.addActionListener(this);
go.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 0, true));
item = new JMenuItem("Root");
item.addActionListener(this);
go.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, 0, true));
go.addSeparator();
item = new JMenuItem("Last added node");
item.addActionListener(this);
go.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, 0, true));
item = new JMenuItem("Last edited node");
item.addActionListener(this);
go.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, 0, true));
popup.add(go);
final JMenu tmeasure = new JMenu("Measure");
final JMenuItem dist_to_root = new JMenuItem("Distance from this node to root");
tmeasure.add(dist_to_root);
final JMenuItem dist_to_tag = new JMenuItem("Distance from this node to all nodes tagged as...");
tmeasure.add(dist_to_tag);
final JMenuItem dist_to_mark = new JMenuItem("Distance from this node to the marked node");
tmeasure.add(dist_to_mark);
final JMenuItem dist_pairs = new JMenuItem("Shortest distances between all pairs of nodes tagged as...");
tmeasure.add(dist_pairs);
final ActionListener tma = getTreePathMeasureListener((Tree<?>) active);
for (final JMenuItem mi : new JMenuItem[] { dist_to_root, dist_to_tag, dist_to_mark, dist_pairs }) {
mi.addActionListener(tma);
}
popup.add(tmeasure);
final String[] name = new String[] { AreaTree.class.getSimpleName(), Treeline.class.getSimpleName() };
if (Treeline.class == aclass) {
final String a = name[0];
name[0] = name[1];
name[1] = a;
}
item = new JMenuItem("Duplicate " + name[0] + " as " + name[1]);
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
Bureaucrat.createAndStart(new Worker.Task("Converting") {
@Override
public void exec() {
try {
getLayerSet().addChangeTreesStep();
final Map<Tree<?>, Tree<?>> m = Tree.duplicateAs(selection.getSelected(), (Class<Tree<?>>) (Treeline.class == aclass ? AreaTree.class : Treeline.class));
if (m.isEmpty()) {
getLayerSet().removeLastUndoStep();
} else {
getLayerSet().addChangeTreesStep();
}
} catch (final Exception e) {
IJError.print(e);
}
}
}, getProject());
}
});
popup.add(item);
popup.addSeparator();
} else if (Connector.class == aclass) {
item = new JMenuItem("Merge");
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent ae) {
if (null == getActive() || getActive().getClass() != Connector.class) {
Utils.log("Active object must be a Connector!");
return;
}
final List<Connector> col = selection.get(Connector.class);
if (col.size() < 2) {
Utils.log("Select more than one Connector!");
return;
}
if (col.get(0) != getActive()) {
if (col.remove(getActive())) {
col.add(0, (Connector) getActive());
} else {
Utils.log("ERROR: cannot find active object in selection list!");
return;
}
}
Bureaucrat.createAndStart(new Worker.Task("Merging connectors") {
@Override
public void exec() {
getLayerSet().addChangeTreesStep();
Connector base = null;
try {
base = Connector.merge(col);
} catch (final Exception e) {
IJError.print(e);
}
if (null == base) {
Utils.log("ERROR: could not merge connectors!");
getLayerSet().undoOneStep();
} else {
getLayerSet().addChangeTreesStep();
}
Display.repaint();
}
}, getProject());
}
});
popup.add(item);
item.setEnabled(selection.getSelected(Connector.class).size() > 1);
popup.addSeparator();
}
item = new JMenuItem("Duplicate");
item.addActionListener(this);
popup.add(item);
item = new JMenuItem("Color...");
item.addActionListener(this);
popup.add(item);
if (active instanceof LayerSet)
item.setEnabled(false);
if (active.isLocked()) {
item = new JMenuItem("Unlock");
item.addActionListener(this);
popup.add(item);
} else {
item = new JMenuItem("Lock");
item.addActionListener(this);
popup.add(item);
}
menu = new JMenu("Move");
popup.addSeparator();
final LayerSet ls = layer.getParent();
item = new JMenuItem("Move to top");
item.addActionListener(this);
menu.add(item);
// this is just to draw the key name by the menu; it does not incur on any event being generated (that I know if), and certainly not any event being listened to by TrakEM2.
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0, true));
if (ls.isTop(active))
item.setEnabled(false);
item = new JMenuItem("Move up");
item.addActionListener(this);
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0, true));
if (ls.isTop(active))
item.setEnabled(false);
item = new JMenuItem("Move down");
item.addActionListener(this);
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0, true));
if (ls.isBottom(active))
item.setEnabled(false);
item = new JMenuItem("Move to bottom");
item.addActionListener(this);
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_END, 0, true));
if (ls.isBottom(active))
item.setEnabled(false);
popup.add(menu);
popup.addSeparator();
item = new JMenuItem("Delete...");
item.addActionListener(this);
popup.add(item);
try {
if (Patch.class == aclass) {
if (!active.isOnlyLinkedTo(Patch.class)) {
item.setEnabled(false);
}
}
} catch (final Exception e) {
IJError.print(e);
item.setEnabled(false);
}
if (Patch.class == aclass) {
item = new JMenuItem("Revert");
item.addActionListener(this);
popup.add(item);
if (null == ((Patch) active).getOriginalPath())
item.setEnabled(false);
popup.addSeparator();
}
item = new JMenuItem("Properties...");
item.addActionListener(this);
popup.add(item);
item = new JMenuItem("Show centered");
item.addActionListener(this);
popup.add(item);
popup.addSeparator();
if (!(active instanceof ZDisplayable)) {
final int i_layer = layer.getParent().indexOf(layer);
final int n_layers = layer.getParent().size();
item = new JMenuItem("Send to previous layer");
item.addActionListener(this);
popup.add(item);
if (1 == n_layers || 0 == i_layer || active.isLinked())
item.setEnabled(false);
else // check if the active is a profile and contains a link to another profile in the layer it is going to be sent to, or it is linked
if (active instanceof Profile && !active.canSendTo(layer.getParent().previous(layer)))
item.setEnabled(false);
item = new JMenuItem("Send to next layer");
item.addActionListener(this);
popup.add(item);
if (1 == n_layers || n_layers - 1 == i_layer || active.isLinked())
item.setEnabled(false);
else if (active instanceof Profile && !active.canSendTo(layer.getParent().next(layer)))
item.setEnabled(false);
menu = new JMenu("Send linked group to...");
if (active.hasLinkedGroupWithinLayer(this.layer)) {
int i = 1;
for (final Layer la : ls.getLayers()) {
String layer_title = i + ": " + la.getTitle();
if (-1 == layer_title.indexOf(' '))
layer_title += " ";
item = new JMenuItem(layer_title);
item.addActionListener(this);
menu.add(item);
if (la == this.layer)
item.setEnabled(false);
i++;
}
popup.add(menu);
} else {
menu.setEnabled(false);
// Utils.log("Active's linked group not within layer.");
}
popup.add(menu);
popup.addSeparator();
}
}
item = new JMenuItem("Undo");
item.addActionListener(this);
popup.add(item);
if (!layer.getParent().canUndo() || canvas.isTransforming())
item.setEnabled(false);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Utils.getControlModifier(), true));
item = new JMenuItem("Redo");
item.addActionListener(this);
popup.add(item);
if (!layer.getParent().canRedo() || canvas.isTransforming())
item.setEnabled(false);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.SHIFT_MASK | Utils.getControlModifier(), true));
popup.addSeparator();
try {
menu = new JMenu("Hide/Unhide");
item = new JMenuItem("Hide deselected");
item.addActionListener(this);
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.SHIFT_MASK, true));
boolean none = 0 == selection.getNSelected();
if (none)
item.setEnabled(false);
item = new JMenuItem("Hide deselected except images");
item.addActionListener(this);
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.SHIFT_MASK | Event.ALT_MASK, true));
if (none)
item.setEnabled(false);
item = new JMenuItem("Hide selected");
item.addActionListener(this);
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, 0, true));
if (none)
item.setEnabled(false);
none = !layer.getParent().containsDisplayable(DLabel.class);
item = new JMenuItem("Hide all labels");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
item = new JMenuItem("Unhide all labels");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
none = !layer.getParent().contains(AreaList.class);
item = new JMenuItem("Hide all arealists");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
item = new JMenuItem("Unhide all arealists");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
none = !layer.contains(Profile.class);
item = new JMenuItem("Hide all profiles");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
item = new JMenuItem("Unhide all profiles");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
none = !layer.getParent().contains(Pipe.class);
item = new JMenuItem("Hide all pipes");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
item = new JMenuItem("Unhide all pipes");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
none = !layer.getParent().contains(Polyline.class);
item = new JMenuItem("Hide all polylines");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
item = new JMenuItem("Unhide all polylines");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
none = !layer.getParent().contains(Treeline.class);
item = new JMenuItem("Hide all treelines");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
item = new JMenuItem("Unhide all treelines");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
none = !layer.getParent().contains(AreaTree.class);
item = new JMenuItem("Hide all areatrees");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
item = new JMenuItem("Unhide all areatrees");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
none = !layer.getParent().contains(Ball.class);
item = new JMenuItem("Hide all balls");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
item = new JMenuItem("Unhide all balls");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
none = !layer.getParent().contains(Connector.class);
item = new JMenuItem("Hide all connectors");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
item = new JMenuItem("Unhide all connectors");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
none = !layer.getParent().containsDisplayable(Patch.class);
item = new JMenuItem("Hide all images");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
item = new JMenuItem("Unhide all images");
item.addActionListener(this);
menu.add(item);
if (none)
item.setEnabled(false);
item = new JMenuItem("Hide all but images");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Unhide all");
item.addActionListener(this);
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.ALT_MASK, true));
popup.add(menu);
} catch (final Exception e) {
IJError.print(e);
}
// plugins, if any
Utils.addPlugIns(popup, "Display", project, new Callable<Displayable>() {
@Override
public Displayable call() {
return Display.this.getActive();
}
});
final JMenu align_menu = new JMenu("Align");
item = new JMenuItem("Align stack slices");
item.addActionListener(this);
align_menu.add(item);
if (selection.isEmpty() || !(getActive().getClass() == Patch.class && ((Patch) getActive()).isStack()))
item.setEnabled(false);
item = new JMenuItem("Align layers");
item.addActionListener(this);
align_menu.add(item);
if (1 == layer.getParent().size())
item.setEnabled(false);
item = new JMenuItem("Align layers manually with landmarks");
item.addActionListener(this);
align_menu.add(item);
if (1 == layer.getParent().size())
item.setEnabled(false);
item = new JMenuItem("Align multi-layer mosaic");
item.addActionListener(this);
align_menu.add(item);
if (1 == layer.getParent().size())
item.setEnabled(false);
item = new JMenuItem("Montage all images in this layer");
item.addActionListener(this);
align_menu.add(item);
if (layer.getDisplayables(Patch.class).size() < 2)
item.setEnabled(false);
item = new JMenuItem("Montage selected images");
item.addActionListener(this);
align_menu.add(item);
if (selection.getSelected(Patch.class).size() < 2)
item.setEnabled(false);
item = new JMenuItem("Montage multiple layers");
item.addActionListener(this);
align_menu.add(item);
popup.add(align_menu);
final JMenuItem st = new JMenu("Transform");
final StartTransformMenuListener tml = new StartTransformMenuListener();
item = new JMenuItem("Transform (affine)");
item.addActionListener(tml);
st.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, 0, true));
if (null == active)
item.setEnabled(false);
item = new JMenuItem("Transform (non-linear)");
item.addActionListener(tml);
st.add(item);
if (null == active)
item.setEnabled(false);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, Event.SHIFT_MASK, true));
item = new JMenuItem("Cancel transform");
st.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true));
// just added as a self-documenting cue; no listener
item.setEnabled(false);
item = new JMenuItem("Remove rotation, scaling and shear (selected images)");
item.addActionListener(tml);
st.add(item);
if (null == active)
item.setEnabled(false);
item = new JMenuItem("Remove rotation, scaling and shear layer-wise");
item.addActionListener(tml);
st.add(item);
item = new JMenuItem("Remove coordinate transforms (selected images)");
item.addActionListener(tml);
st.add(item);
if (null == active)
item.setEnabled(false);
item = new JMenuItem("Remove coordinate transforms layer-wise");
item.addActionListener(tml);
st.add(item);
item = new JMenuItem("Adjust mesh resolution (selected images)");
item.addActionListener(tml);
st.add(item);
if (null == active)
item.setEnabled(false);
item = new JMenuItem("Adjust mesh resolution layer-wise");
item.addActionListener(tml);
st.add(item);
item = new JMenuItem("Set coordinate transform of selected image to other selected images");
item.addActionListener(tml);
st.add(item);
if (null == active)
item.setEnabled(false);
item = new JMenuItem("Set coordinate transform of selected image layer-wise");
item.addActionListener(tml);
st.add(item);
if (null == active)
item.setEnabled(false);
item = new JMenuItem("Set affine transform of selected image to other selected images");
item.addActionListener(tml);
st.add(item);
if (null == active)
item.setEnabled(false);
item = new JMenuItem("Set affine transform of selected image layer-wise");
item.addActionListener(tml);
st.add(item);
if (null == active)
item.setEnabled(false);
popup.add(st);
final JMenu link_menu = new JMenu("Link");
item = new JMenuItem("Link images...");
item.addActionListener(this);
link_menu.add(item);
item = new JMenuItem("Unlink all selected images");
item.addActionListener(this);
link_menu.add(item);
item.setEnabled(selection.getSelected(Patch.class).size() > 0);
item = new JMenuItem("Unlink all");
item.addActionListener(this);
link_menu.add(item);
popup.add(link_menu);
final JMenu adjust_menu = new JMenu("Adjust images");
item = new JMenuItem("Enhance contrast layer-wise...");
item.addActionListener(this);
adjust_menu.add(item);
item = new JMenuItem("Enhance contrast (selected images)...");
item.addActionListener(this);
adjust_menu.add(item);
if (selection.isEmpty())
item.setEnabled(false);
item = new JMenuItem("Adjust image filters (selected images)");
item.addActionListener(this);
adjust_menu.add(item);
if (selection.isEmpty())
item.setEnabled(false);
item = new JMenuItem("Set Min and Max layer-wise...");
item.addActionListener(this);
adjust_menu.add(item);
item = new JMenuItem("Set Min and Max (selected images)...");
item.addActionListener(this);
adjust_menu.add(item);
if (selection.isEmpty())
item.setEnabled(false);
item = new JMenuItem("Adjust min and max (selected images)...");
item.addActionListener(this);
adjust_menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_J, 0));
if (selection.isEmpty())
item.setEnabled(false);
item = new JMenuItem("Mask image borders (layer-wise)...");
item.addActionListener(this);
adjust_menu.add(item);
item = new JMenuItem("Mask image borders (selected images)...");
item.addActionListener(this);
adjust_menu.add(item);
if (selection.isEmpty())
item.setEnabled(false);
item = new JMenuItem("Remove alpha masks (layer-wise)...");
item.addActionListener(this);
adjust_menu.add(item);
item = new JMenuItem("Remove alpha masks (selected images)...");
item.addActionListener(this);
adjust_menu.add(item);
if (selection.isEmpty())
item.setEnabled(false);
item = new JMenuItem("Split images under polyline ROI");
item.addActionListener(this);
adjust_menu.add(item);
final Roi roi = canvas.getFakeImagePlus().getRoi();
if (null == roi || !(roi.getType() == Roi.POLYLINE || roi.getType() == Roi.FREELINE))
item.setEnabled(false);
item = new JMenuItem("Blend (layer-wise)...");
item.addActionListener(this);
adjust_menu.add(item);
item = new JMenuItem("Blend (selected images)...");
item.addActionListener(this);
adjust_menu.add(item);
if (selection.isEmpty())
item.setEnabled(false);
item = new JMenuItem("Match intensities (layer-wise)...");
item.addActionListener(this);
adjust_menu.add(item);
item = new JMenuItem("Remove intensity maps (layer-wise)...");
item.addActionListener(this);
adjust_menu.add(item);
popup.add(adjust_menu);
final JMenu script = new JMenu("Script");
final MenuScriptListener msl = new MenuScriptListener();
item = new JMenuItem("Set preprocessor script layer-wise...");
item.addActionListener(msl);
script.add(item);
item = new JMenuItem("Set preprocessor script (selected images)...");
item.addActionListener(msl);
script.add(item);
if (selection.isEmpty())
item.setEnabled(false);
item = new JMenuItem("Remove preprocessor script layer-wise...");
item.addActionListener(msl);
script.add(item);
item = new JMenuItem("Remove preprocessor script (selected images)...");
item.addActionListener(msl);
script.add(item);
if (selection.isEmpty())
item.setEnabled(false);
popup.add(script);
menu = new JMenu("Import");
item = new JMenuItem("Import image");
item.addActionListener(this);
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, Event.ALT_MASK & Event.SHIFT_MASK, true));
item = new JMenuItem("Import stack...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Import stack with landmarks...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Import grid...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Import sequence as grid...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Import from text file...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Import labels as arealists...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Tags ...");
item.addActionListener(this);
menu.add(item);
popup.add(menu);
menu = new JMenu("Export");
final boolean has_arealists = layer.getParent().contains(AreaList.class);
item = new JMenuItem("Make flat image...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Arealists as labels (tif)");
item.addActionListener(this);
menu.add(item);
item.setEnabled(has_arealists);
item = new JMenuItem("Arealists as labels (amira)");
item.addActionListener(this);
menu.add(item);
item.setEnabled(has_arealists);
item = new JMenuItem("Image stack under selected Arealist");
item.addActionListener(this);
menu.add(item);
item.setEnabled(null != active && AreaList.class == active.getClass());
item = new JMenuItem("Fly through selected Treeline/AreaTree");
item.addActionListener(this);
menu.add(item);
item.setEnabled(null != active && Tree.class.isInstance(active));
item = new JMenuItem("Tags...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Connectivity graph...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("NeuroML...");
item.addActionListener(this);
menu.add(item);
popup.add(menu);
menu = new JMenu("Display");
item = new JMenuItem("Resize canvas/LayerSet...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Autoresize canvas/LayerSet");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Resize canvas/LayerSet to ROI");
item.addActionListener(this);
menu.add(item);
item.setEnabled(null != canvas.getFakeImagePlus().getRoi());
item = new JMenuItem("Properties ...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Calibration...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Grid overlay...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Adjust snapping parameters...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Adjust fast-marching parameters...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Adjust arealist paint parameters...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Show current 2D position in 3D");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Show layers as orthoslices in 3D");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Inspect image mesh triangles");
item.addActionListener(this);
menu.add(item);
popup.add(menu);
menu = new JMenu("Project");
this.project.getLoader().setupMenuItems(menu, this.getProject());
item = new JMenuItem("Project properties...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Create subproject");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Create sibling project with retiled layers");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Release memory...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Flush image cache");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Regenerate all mipmaps");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Regenerate mipmaps (selected images)");
item.addActionListener(this);
menu.add(item);
menu.addSeparator();
item = new JMenuItem("Measurement options...");
item.addActionListener(this);
menu.add(item);
popup.add(menu);
menu = new JMenu("Selection");
item = new JMenuItem("Select all");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Select all visible");
item.addActionListener(this);
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Utils.getControlModifier(), true));
if (0 == layer.getDisplayableList().size() && 0 == layer.getParent().getDisplayableList().size())
item.setEnabled(false);
item = new JMenuItem("Select all that match...");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Select none");
item.addActionListener(this);
menu.add(item);
if (0 == selection.getNSelected())
item.setEnabled(false);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true));
final JMenu bytype = new JMenu("Select all by type");
item = new JMenuItem("AreaList");
item.addActionListener(bytypelistener);
bytype.add(item);
item = new JMenuItem("AreaTree");
item.addActionListener(bytypelistener);
bytype.add(item);
item = new JMenuItem("Ball");
item.addActionListener(bytypelistener);
bytype.add(item);
item = new JMenuItem("Connector");
item.addActionListener(bytypelistener);
bytype.add(item);
item = new JMenuItem("Dissector");
item.addActionListener(bytypelistener);
bytype.add(item);
item = new JMenuItem("Image");
item.addActionListener(bytypelistener);
bytype.add(item);
item = new JMenuItem("Pipe");
item.addActionListener(bytypelistener);
bytype.add(item);
item = new JMenuItem("Polyline");
item.addActionListener(bytypelistener);
bytype.add(item);
item = new JMenuItem("Profile");
item.addActionListener(bytypelistener);
bytype.add(item);
item = new JMenuItem("Text");
item.addActionListener(bytypelistener);
bytype.add(item);
item = new JMenuItem("Treeline");
item.addActionListener(bytypelistener);
bytype.add(item);
menu.add(bytype);
item = new JMenuItem("Restore selection");
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Select under ROI");
item.addActionListener(this);
menu.add(item);
if (canvas.getFakeImagePlus().getRoi() == null)
item.setEnabled(false);
final JMenu graph = new JMenu("Graph");
final GraphMenuListener gl = new GraphMenuListener();
item = new JMenuItem("Select outgoing Connectors");
item.addActionListener(gl);
graph.add(item);
item = new JMenuItem("Select incoming Connectors");
item.addActionListener(gl);
graph.add(item);
item = new JMenuItem("Select downstream targets");
item.addActionListener(gl);
graph.add(item);
item = new JMenuItem("Select upstream targets");
item.addActionListener(gl);
graph.add(item);
graph.setEnabled(!selection.isEmpty());
menu.add(graph);
item = new JMenuItem("Measure");
item.addActionListener(this);
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, 0, true));
item.setEnabled(!selection.isEmpty());
popup.add(menu);
menu = new JMenu("Tool");
item = new JMenuItem("Rectangular ROI");
item.addActionListener(new SetToolListener(Toolbar.RECTANGLE));
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0, true));
item = new JMenuItem("Polygon ROI");
item.addActionListener(new SetToolListener(Toolbar.POLYGON));
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0, true));
item = new JMenuItem("Freehand ROI");
item.addActionListener(new SetToolListener(Toolbar.FREEROI));
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3, 0, true));
item = new JMenuItem("Text");
item.addActionListener(new SetToolListener(Toolbar.TEXT));
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, 0, true));
item = new JMenuItem("Magnifier glass");
item.addActionListener(new SetToolListener(Toolbar.MAGNIFIER));
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0, true));
item = new JMenuItem("Hand");
item.addActionListener(new SetToolListener(Toolbar.HAND));
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F6, 0, true));
item = new JMenuItem("Select");
item.addActionListener(new SetToolListener(ProjectToolbar.SELECT));
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F9, 0, true));
item = new JMenuItem("Pencil");
item.addActionListener(new SetToolListener(ProjectToolbar.PENCIL));
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0, true));
item = new JMenuItem("Pen");
item.addActionListener(new SetToolListener(ProjectToolbar.PEN));
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F11, 0, true));
popup.add(menu);
item = new JMenuItem("Search...");
item.addActionListener(this);
popup.add(item);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, Utils.getControlModifier(), true));
// canvas.add(popup);
return popup;
}
use of ini.trakem2.display.Dissector in project TrakEM2 by trakem2.
the class Project method adjustProperties.
public void adjustProperties() {
// should be more generic, but for now it'll do
GenericDialog gd = new GenericDialog("Properties");
gd.addMessage("Ignore image linking for:");
boolean link_labels = addBox(gd, DLabel.class);
boolean nolink_segmentations = "true".equals(ht_props.get("segmentations_nolinks"));
gd.addCheckbox("Segmentations", nolink_segmentations);
gd.addMessage("Currently linked objects will remain so\nunless explicitly unlinked.");
boolean dissector_zoom = "true".equals(ht_props.get("dissector_zoom"));
gd.addCheckbox("Zoom-invariant markers for Dissector", dissector_zoom);
gd.addChoice("Image_resizing_mode: ", Loader.MIPMAP_MODES.values().toArray(new String[Loader.MIPMAP_MODES.size()]), Loader.getMipMapModeName(mipmaps_mode));
gd.addChoice("mipmaps format:", FSLoader.MIPMAP_FORMATS, FSLoader.MIPMAP_FORMATS[loader.getMipMapFormat()]);
gd.addNumericField("Save mipmap images from level", this.first_mipmap_level_saved, 0);
boolean layer_mipmaps = "true".equals(ht_props.get("layer_mipmaps"));
gd.addCheckbox("Layer_mipmaps", layer_mipmaps);
boolean keep_mipmaps = "true".equals(ht_props.get("keep_mipmaps"));
// coping with the fact that thee is no Action context ... there should be one in the Worker thread.
gd.addCheckbox("Keep_mipmaps_when_deleting_images", keep_mipmaps);
int bucket_side = (int) getProperty("bucket_side", Bucket.MIN_BUCKET_SIZE);
gd.addNumericField("Bucket side length: ", bucket_side, 0, 6, "pixels");
boolean no_shutdown_hook = "true".equals(ht_props.get("no_shutdown_hook"));
gd.addCheckbox("No_shutdown_hook to save the project", no_shutdown_hook);
int n_undo_steps = getProperty("n_undo_steps", 32);
gd.addSlider("Undo steps", 32, 200, n_undo_steps);
boolean flood_fill_to_image_edge = "true".equals(ht_props.get("flood_fill_to_image_edge"));
gd.addCheckbox("AreaList_flood_fill_to_image_edges", flood_fill_to_image_edge);
int look_ahead_cache = (int) getProperty("look_ahead_cache", 0);
gd.addNumericField("Look_ahead_cache:", look_ahead_cache, 0, 6, "layers");
// default: every 10 minutes
int autosaving_interval = getProperty("autosaving_interval", 10);
gd.addNumericField("Autosave every:", autosaving_interval, 0, 6, "minutes");
int n_mipmap_threads = getProperty("n_mipmap_threads", 1);
gd.addSlider("Number of threads for mipmaps", 1, n_mipmap_threads, n_mipmap_threads);
int meshResolution = getProperty("mesh_resolution", 32);
gd.addSlider("Default mesh resolution for images", 1, 512, meshResolution);
//
gd.showDialog();
//
if (gd.wasCanceled())
return;
setLinkProp(link_labels, gd.getNextBoolean(), DLabel.class);
boolean nolink_segmentations2 = gd.getNextBoolean();
if (nolink_segmentations) {
if (!nolink_segmentations2)
ht_props.remove("segmentations_nolinks");
} else if (nolink_segmentations2)
ht_props.put("segmentations_nolinks", "true");
if (adjustProp("dissector_zoom", dissector_zoom, gd.getNextBoolean())) {
// TODO: should repaint nested LayerSets as well
Display.repaint(layer_set);
}
this.mipmaps_mode = Loader.getMipMapModeIndex(gd.getNextChoice());
final int new_mipmap_format = gd.getNextChoiceIndex();
final int old_mipmap_format = loader.getMipMapFormat();
if (new_mipmap_format != old_mipmap_format) {
YesNoDialog yn = new YesNoDialog("MipMaps format", "Changing mipmaps format to '" + FSLoader.MIPMAP_FORMATS[new_mipmap_format] + "'requires regenerating all mipmaps. Proceed?");
if (yn.yesPressed()) {
if (loader.setMipMapFormat(new_mipmap_format)) {
loader.updateMipMapsFormat(old_mipmap_format, new_mipmap_format);
}
}
}
setFirstMipMapLevelSaved(gd.getNextNumber());
boolean layer_mipmaps2 = gd.getNextBoolean();
if (adjustProp("layer_mipmaps", layer_mipmaps, layer_mipmaps2)) {
if (layer_mipmaps && !layer_mipmaps2) {
// TODO
// 1 - ask first
// 2 - remove all existing images from layer.mipmaps folder
} else if (!layer_mipmaps && layer_mipmaps2) {
// TODO
// 1 - ask first
// 2 - create de novo all layer mipmaps in a background task
}
}
adjustProp("keep_mipmaps", keep_mipmaps, gd.getNextBoolean());
Utils.log2("keep_mipmaps: " + getBooleanProperty("keep_mipmaps"));
//
bucket_side = (int) gd.getNextNumber();
if (bucket_side > Bucket.MIN_BUCKET_SIZE) {
setProperty("bucket_side", Integer.toString(bucket_side));
layer_set.recreateBuckets(true);
}
adjustProp("no_shutdown_hook", no_shutdown_hook, gd.getNextBoolean());
n_undo_steps = (int) gd.getNextNumber();
if (n_undo_steps < 0)
n_undo_steps = 0;
setProperty("n_undo_steps", Integer.toString(n_undo_steps));
adjustProp("flood_fill_to_image_edge", flood_fill_to_image_edge, gd.getNextBoolean());
double d_look_ahead_cache = gd.getNextNumber();
if (!Double.isNaN(d_look_ahead_cache) && d_look_ahead_cache >= 0) {
setProperty("look_ahead_cache", Integer.toString((int) d_look_ahead_cache));
if (0 == d_look_ahead_cache) {
Display.clearColumnScreenshots(this.layer_set);
} else {
Utils.logAll("WARNING: look-ahead cache is incomplete.\n Expect issues when editing objects, adding new ones, and the like.\n Use \"Project - Flush image cache\" to fix any lack of refreshing issues you encounter.");
}
} else {
Utils.log2("Ignoring invalid 'look ahead cache' value " + d_look_ahead_cache);
}
double autosaving_interval2 = gd.getNextNumber();
if (((int) (autosaving_interval2)) == autosaving_interval) {
// do nothing
} else if (autosaving_interval2 < 0 || Double.isNaN(autosaving_interval)) {
Utils.log("IGNORING invalid autosaving interval: " + autosaving_interval2);
} else {
setProperty("autosaving_interval", Integer.toString((int) autosaving_interval2));
restartAutosaving();
}
int n_mipmap_threads2 = (int) Math.max(1, gd.getNextNumber());
if (n_mipmap_threads != n_mipmap_threads2) {
setProperty("n_mipmap_threads", Integer.toString(n_mipmap_threads2));
// WARNING: this does it for a static service, affecting all projects!
FSLoader.restartMipMapThreads(n_mipmap_threads2);
}
int meshResolution2 = (int) gd.getNextNumber();
if (meshResolution != meshResolution2) {
if (meshResolution2 > 0) {
setProperty("mesh_resolution", Integer.toString(meshResolution2));
} else {
Utils.log("WARNING: ignoring invalid mesh resolution value " + meshResolution2);
}
}
}
use of ini.trakem2.display.Dissector in project TrakEM2 by trakem2.
the class Project method getUniqueTypes.
/**
* Returns a list of existing unique types in the template tree
* (thus the 'project' type is not included, nor the label).
* The basic types are guaranteed to be present even if there are no instances in the template tree.
* As a side effect, this method populates the HashMap of unique TemplateThing types.
*/
public String[] getUniqueTypes() {
synchronized (ht_unique_tt) {
// ensure the basic types (pipe, ball, profile, profile_list) are present
if (!ht_unique_tt.containsKey("profile"))
ht_unique_tt.put("profile", new TemplateThing("profile"));
if (!ht_unique_tt.containsKey("profile_list")) {
TemplateThing tpl = new TemplateThing("profile_list");
tpl.addChild((TemplateThing) ht_unique_tt.get("profile"));
ht_unique_tt.put("profile_list", tpl);
}
if (!ht_unique_tt.containsKey("pipe"))
ht_unique_tt.put("pipe", new TemplateThing("pipe"));
if (!ht_unique_tt.containsKey("polyline"))
ht_unique_tt.put("polyline", new TemplateThing("polyline"));
if (!ht_unique_tt.containsKey("treeline"))
ht_unique_tt.put("treeline", new TemplateThing("treeline"));
if (!ht_unique_tt.containsKey("areatree"))
ht_unique_tt.put("areatree", new TemplateThing("areatree"));
if (!ht_unique_tt.containsKey("connector"))
ht_unique_tt.put("connector", new TemplateThing("connector"));
if (!ht_unique_tt.containsKey("ball"))
ht_unique_tt.put("ball", new TemplateThing("ball"));
if (!ht_unique_tt.containsKey("area_list"))
ht_unique_tt.put("area_list", new TemplateThing("area_list"));
if (!ht_unique_tt.containsKey("dissector"))
ht_unique_tt.put("dissector", new TemplateThing("dissector"));
// this should be done automagically by querying the classes in the package ... but java can't do that without peeking into the .jar .class files. Buh.
TemplateThing project_tt = ht_unique_tt.remove("project");
/* // debug
for (Iterator it = ht_unique_tt.keySet().iterator(); it.hasNext(); ) {
Utils.log2("class: " + it.next().getClass().getName());
} */
final String[] ut = new String[ht_unique_tt.size()];
ht_unique_tt.keySet().toArray(ut);
ht_unique_tt.put("project", project_tt);
Arrays.sort(ut);
return ut;
}
}
use of ini.trakem2.display.Dissector in project TrakEM2 by trakem2.
the class TMLHandler method makeLayerThing.
private LayerThing makeLayerThing(String type, final HashMap<String, String> ht_attributes) {
try {
type = type.toLowerCase();
if (0 == type.indexOf("t2_")) {
type = type.substring(3);
}
// long id = -1;
// final String sid = ht_attributes.get("id");
// if (null != sid) id = Long.parseLong(sid);
long oid = -1;
final String soid = ht_attributes.get("oid");
if (null != soid)
oid = Long.parseLong(soid);
if (type.equals("node")) {
if (null == last_tree) {
throw new NullPointerException("Can't create a node for null last_tree!");
}
final Node<?> node = last_tree.newNode(ht_attributes);
taggables.add(node);
// Put node into the list of nodes with that layer id, to update to proper Layer pointer later
final long ndlid = Long.parseLong(ht_attributes.get("lid"));
List<Node<?>> list = node_layer_table.get(ndlid);
if (null == list) {
list = new ArrayList<Node<?>>();
node_layer_table.put(ndlid, list);
}
list.add(node);
// Set node as root node or add as child to last node in the stack
if (null == last_root_node) {
last_root_node = node;
} else {
final String sconf = ht_attributes.get("c");
nodes.getLast().add((Node) node, null == sconf ? Node.MAX_EDGE_CONFIDENCE : Byte.parseByte(sconf));
}
// color?
final String scolor = ht_attributes.get("color");
if (null != scolor) {
final Color color = Utils.getRGBColorFromHex(scolor);
Collection<Node<?>> nodes = node_colors.get(color);
if (null == nodes) {
nodes = new ArrayList<Node<?>>();
node_colors.put(color, nodes);
}
nodes.add(node);
}
// Put node into stack of nodes (to be removed on closing the tag)
nodes.add(node);
} else if (type.equals("profile")) {
Profile profile = new Profile(this.project, oid, ht_attributes, ht_links);
profile.addToDatabase();
ht_displayables.put(oid, profile);
addToLastOpenLayer(profile);
last_displayable = profile;
return null;
} else if (type.equals("pipe")) {
Pipe pipe = new Pipe(this.project, oid, ht_attributes, ht_links);
pipe.addToDatabase();
ht_displayables.put(new Long(oid), pipe);
ht_zdispl.put(new Long(oid), pipe);
last_displayable = pipe;
addToLastOpenLayerSet(pipe);
return null;
} else if (type.equals("polyline")) {
Polyline pline = new Polyline(this.project, oid, ht_attributes, ht_links);
pline.addToDatabase();
last_displayable = pline;
ht_displayables.put(new Long(oid), pline);
ht_zdispl.put(new Long(oid), pline);
addToLastOpenLayerSet(pline);
return null;
} else if (type.equals("connector")) {
final Connector con = new Connector(this.project, oid, ht_attributes, ht_links);
if (ht_attributes.containsKey("origin")) {
legacy.add(new Runnable() {
public void run() {
con.readLegacyXML(al_layer_sets.get(al_layer_sets.size() - 1), ht_attributes, ht_links);
}
});
}
con.addToDatabase();
last_connector = con;
last_tree = con;
last_displayable = con;
ht_displayables.put(new Long(oid), con);
ht_zdispl.put(new Long(oid), con);
addToLastOpenLayerSet(con);
return null;
} else if (type.equals("path")) {
if (null != reca) {
reca.add(ht_attributes.get("d"));
return null;
}
return null;
} else if (type.equals("area")) {
reca = new ReconstructArea();
if (null != last_area_list) {
last_area_list_layer_id = Long.parseLong(ht_attributes.get("layer_id"));
}
return null;
} else if (type.equals("area_list")) {
AreaList area = new AreaList(this.project, oid, ht_attributes, ht_links);
// why? This looks like an onion
area.addToDatabase();
last_area_list = area;
last_displayable = area;
ht_displayables.put(new Long(oid), area);
ht_zdispl.put(new Long(oid), area);
addToLastOpenLayerSet(area);
return null;
} else if (type.equals("tag")) {
Taggable t = taggables.getLast();
if (null != t) {
Object ob = ht_attributes.get("key");
// defaults to 't'
int keyCode = KeyEvent.VK_T;
// KeyEvent.VK_U is char U, not u
if (null != ob)
keyCode = (int) ((String) ob).toUpperCase().charAt(0);
Tag tag = al_layer_sets.get(al_layer_sets.size() - 1).putTag(ht_attributes.get("name"), keyCode);
// could be null if name is not found
if (null != tag)
t.addTag(tag);
}
} else if (type.equals("ball_ob")) {
// add a ball to the last open Ball
if (null != last_ball) {
last_ball.addBall(Double.parseDouble(ht_attributes.get("x")), Double.parseDouble(ht_attributes.get("y")), Double.parseDouble(ht_attributes.get("r")), Long.parseLong(ht_attributes.get("layer_id")));
}
return null;
} else if (type.equals("ball")) {
Ball ball = new Ball(this.project, oid, ht_attributes, ht_links);
ball.addToDatabase();
last_ball = ball;
last_displayable = ball;
ht_displayables.put(new Long(oid), ball);
ht_zdispl.put(new Long(oid), ball);
addToLastOpenLayerSet(ball);
return null;
} else if (type.equals("stack")) {
Stack stack = new Stack(this.project, oid, ht_attributes, ht_links);
stack.addToDatabase();
last_stack = stack;
last_displayable = stack;
ht_displayables.put(new Long(oid), stack);
ht_zdispl.put(new Long(oid), stack);
addToLastOpenLayerSet(stack);
} else if (type.equals("treeline")) {
Treeline tline = new Treeline(this.project, oid, ht_attributes, ht_links);
tline.addToDatabase();
last_treeline = tline;
last_tree = tline;
last_treeline_data = new StringBuilder();
last_displayable = tline;
ht_displayables.put(oid, tline);
ht_zdispl.put(oid, tline);
addToLastOpenLayerSet(tline);
} else if (type.equals("areatree")) {
AreaTree art = new AreaTree(this.project, oid, ht_attributes, ht_links);
art.addToDatabase();
last_areatree = art;
last_tree = art;
last_displayable = art;
ht_displayables.put(oid, art);
ht_zdispl.put(oid, art);
addToLastOpenLayerSet(art);
} else if (type.equals("dd_item")) {
if (null != last_dissector) {
last_dissector.addItem(Integer.parseInt(ht_attributes.get("tag")), Integer.parseInt(ht_attributes.get("radius")), ht_attributes.get("points"));
}
} else if (type.equals("label")) {
DLabel label = new DLabel(project, oid, ht_attributes, ht_links);
label.addToDatabase();
ht_displayables.put(new Long(oid), label);
addToLastOpenLayer(label);
last_displayable = label;
return null;
} else if (type.equals("annot")) {
last_annotation = new StringBuilder();
return null;
} else if (type.equals("patch")) {
Patch patch = new Patch(project, oid, ht_attributes, ht_links);
patch.addToDatabase();
ht_displayables.put(new Long(oid), patch);
addToLastOpenLayer(patch);
last_patch = patch;
last_displayable = patch;
checkAlphaMasks(patch);
return null;
} else if (type.equals("filter")) {
last_patch_filters.add(newFilter(ht_attributes));
} else if (type.equals("dissector")) {
Dissector dissector = new Dissector(this.project, oid, ht_attributes, ht_links);
dissector.addToDatabase();
last_dissector = dissector;
last_displayable = dissector;
ht_displayables.put(new Long(oid), dissector);
ht_zdispl.put(new Long(oid), dissector);
addToLastOpenLayerSet(dissector);
} else if (type.equals("layer")) {
// find last open LayerSet, if any
for (int i = al_layer_sets.size() - 1; i > -1; ) {
LayerSet set = al_layer_sets.get(i);
Layer layer = new Layer(project, oid, ht_attributes);
layer.addToDatabase();
set.addSilently(layer);
al_layers.add(layer);
Object ot = ht_attributes.get("title");
return new LayerThing(template_layer_thing, project, -1, (null == ot ? null : (String) ot), layer, null);
}
} else if (type.equals("layer_set")) {
LayerSet set = new LayerSet(project, oid, ht_attributes, ht_links);
last_displayable = set;
set.addToDatabase();
ht_displayables.put(new Long(oid), set);
al_layer_sets.add(set);
addToLastOpenLayer(set);
Object ot = ht_attributes.get("title");
return new LayerThing(template_layer_set_thing, project, -1, (null == ot ? null : (String) ot), set, null);
} else if (type.equals("calibration")) {
// find last open LayerSet if any
for (int i = al_layer_sets.size() - 1; i > -1; ) {
LayerSet set = al_layer_sets.get(i);
set.restoreCalibration(ht_attributes);
return null;
}
} else if (type.equals("prop")) {
// Add property to last created Displayable
if (null != last_displayable) {
last_displayable.setProperty(ht_attributes.get("key"), ht_attributes.get("value"));
}
} else if (type.equals("linked_prop")) {
// Add linked property to last created Displayable. Has to wait until the Displayable ids have been resolved to instances.
if (null != last_displayable) {
putLinkedProperty(last_displayable, ht_attributes);
}
} else {
Utils.log2("TMLHandler Unknown type: " + type);
}
} catch (Exception e) {
IJError.print(e);
}
// default:
return null;
}
Aggregations