public void addTree(DrawableTree newTree) { TreeElement newElement = new TreeElement(this); newTree.setScaleType(DrawableTree.NO_SCALE_BAR); newElement.setScale(getWidth(), getHeight(), null); newElement.setTree(newTree); treeElements.add(newElement); super.addElement(newElement); FigureElement scaleElement = null; if (currentScaleType == DrawableTree.SCALE_AXIS) { scaleElement = new ScaleAxisElement(this); scaleElement.setZPosition(-5); // draw underneath the tree so grid lines aren't on top ((ScaleAxisElement) scaleElement).setTreeDrawer(newElement.getTreeDrawer()); addElement(scaleElement); scaleElements.put(newElement, scaleElement); } if (currentScaleType == DrawableTree.SCALE_BAR) { scaleElement = new ScaleBarElement(this); scaleElement.setMobile(true); ((ScaleBarElement) scaleElement).setTreeDrawer(newElement.getTreeDrawer()); addElement(scaleElement); scaleElements.put(newElement, scaleElement); } layoutTrees(); if (currentScaleType == DrawableTree.SCALE_AXIS && scaleElement != null) { scaleElement.setBounds( newElement.getX(), 0.9, 0.1, 0.01); // Width and height parts are ignored } if (currentScaleType == DrawableTree.SCALE_BAR && scaleElement != null) { scaleElement.setBounds( Math.max(0, newElement.getX() + newElement.getWidth() / 2.0 - 0.05), 0.9, 0.1, 0.1); // Width and height parts are ignored } }
/** * Note that there is a bit of disagreement regarding what controls the 'scale bar' and 'scale * axis' properties. In MultiTreeDisplays, this is a property of the tree. Here, since we use the * Figure interface, the ScaleBar and ScaleAxis are a type of FigureElement, and TreeFigure * controls which one (or none) is shown. * * @param type */ public void setScaleType(int type) { currentScaleType = type; // Remove all scale elements first for (TreeElement treeElement : treeElements) { removeScaleForTree(treeElement); } for (TreeElement treeElement : treeElements) { double x = treeElement.getX(); double y = treeElement.getY(); double width = treeElement.getWidth(); if (type == DrawableTree.SCALE_BAR) { ScaleBarElement scaleElement = new ScaleBarElement(this); scaleElement.setBounds( Math.max(0, x + width / 2.0 - 0.05), 0.9, 0.1, 0.1); // Width and height parts are ignored scaleElement.setMobile(true); scaleElement.setTreeDrawer(treeElement.getTreeDrawer()); treeElement.setBounds(x, y, width, 0.9); addElement(scaleElement); scaleElements.put(treeElement, scaleElement); } if (type == DrawableTree.SCALE_AXIS) { ScaleAxisElement scaleElement = new ScaleAxisElement(this); scaleElement.setZPosition(-5); // draw underneath the tree so grid lines aren't on top scaleElement.setBounds(x, 0.9, width, 0.075); // Width and height parts are ignored scaleElement.setTreeDrawer(treeElement.getTreeDrawer()); treeElement.setBounds(x, y, width, 0.9); addElement(scaleElement); scaleElements.put(treeElement, scaleElement); } } }
/** * Called when the selection rectangle has changed, happens repeatedly when user drags the * selection rectangle * * @param selectRect2 */ public void selectionRectUpdated(Rectangle selRect) { boolean anythingIsSelected = false; for (TreeElement treeElement : treeElements) { double tx = treeElement.getTreeDrawer().translatePixelToTreeX(selRect.x); double ty = treeElement.getTreeDrawer().translatePixelToTreeY(selRect.y); double twidth = ((double) selRect.width / (double) treeElement.getDrawingWidth()); double theight = ((double) selRect.height / (double) treeElement.getDrawingHeight()); translatedRect.setRect(tx, ty, twidth, theight); boolean selected = treeElement.getTree().setSelectedNodes(translatedRect); anythingIsSelected = selected || anythingIsSelected; } display.setSomethingIsSelected(anythingIsSelected); }