/** * This method calculates the size of this compound model and then recursively calculates the size * of its parent, which continues until root. */ public void calculateSizeUp() { if (getParentModel() != null && !isRoot) { if (this.children.size() == 0) { setSize(CompoundModel.DEFAULT_SIZE); } else { Rectangle bound = calculateBounds(); Dimension diff = getLocationAbs().getDifference(bound.getLocation()); setLocationAbs(new Point(bound.x - this.MARGIN_SIZE, bound.y - this.MARGIN_SIZE)); setSize( new Dimension( bound.width + (2 * this.MARGIN_SIZE), bound.height + (2 * this.MARGIN_SIZE) + this.labelHeight)); Iterator iter = this.children.iterator(); while (iter.hasNext()) { NodeModel child = (NodeModel) iter.next(); child.setLocationAbs( child .getLocationAbs() .translate(diff.width + this.MARGIN_SIZE, diff.height + this.MARGIN_SIZE)); } } (getParentModel()).calculateSizeUp(); } updatePolygonsOfChildren(); }
/** This method calculates sizes of children recursively and then calculates its own size. */ public void calculateSizeDown() { // First, recursively calculate sizes of children compounds Iterator iter = this.children.iterator(); while (iter.hasNext()) { NodeModel child = (NodeModel) iter.next(); if (child instanceof CompoundModel) { ((CompoundModel) child).calculateSizeDown(); } } if (getParentModel() != null && !isRoot) { // Second, calculate size of this compound model if (this.children.size() == 0) { setSize(CompoundModel.DEFAULT_SIZE); } else { Rectangle bound = calculateBounds(); Dimension diff = getLocationAbs().getDifference(bound.getLocation()); setLocationAbs(new Point(bound.x - this.MARGIN_SIZE, bound.y - this.MARGIN_SIZE)); setSize( new Dimension( bound.width + (2 * this.MARGIN_SIZE), bound.height + (2 * this.MARGIN_SIZE) + this.labelHeight)); iter = this.children.iterator(); while (iter.hasNext()) { NodeModel child = (NodeModel) iter.next(); child.setLocationAbs( child .getLocationAbs() .translate(diff.width + this.MARGIN_SIZE, diff.height + this.MARGIN_SIZE)); } } } }