@Override public void bringToFront(Figure figure) { if (children.remove(figure)) { children.add(figure); needsSorting = true; fireAreaInvalidated(figure.getDrawingArea()); } } @Override
@Override public void sendToBack(Figure figure) { if (children.remove(figure)) { children.add(0, figure); needsSorting = true; fireAreaInvalidated(figure.getDrawingArea()); } }
@Override public void bringToFront(Figure figure) { if (children.remove(figure)) { children.add(figure); needsSorting = true; fireAreaInvalidated(figure.getDrawingArea()); } }
@Override public void sendToBack(Figure figure) { if (children.remove(figure)) { children.add(0, figure); needsSorting = true; fireAreaInvalidated(figure.getDrawingArea()); } }
@Override public void basicAdd(int index, Figure figure) { children.add(index, figure); quadTree.add(figure, figure.getDrawingArea()); figure.addFigureListener(figureHandler); needsSorting = true; } @Override
@Override public Rectangle2D.Double getDrawingArea() { if (cachedDrawingArea == null) { if (getChildCount() == 0) { cachedDrawingArea = new Rectangle2D.Double(); } else { for (Figure f : children) { if (cachedDrawingArea == null) { cachedDrawingArea = f.getDrawingArea(); } else { cachedDrawingArea.add(f.getDrawingArea()); } } } } return (Rectangle2D.Double) cachedDrawingArea.clone(); }
@Override public void basicAdd(int index, Figure figure) { super.basicAdd(index, figure); quadTree.add(figure, figure.getDrawingArea()); needsSorting = true; }
/** * Notify all listenerList that have registered interest for * notification on this event type. */ protected void fireFigureAdded(Figure f, int zIndex) { CompositeFigureEvent event = null; // Notify all listeners that have registered interest for // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length-2; i>=0; i-=2) { if (listeners[i] == CompositeFigureListener.class) { // Lazily create the event: if (event == null) event = new CompositeFigureEvent(this, f, f.getDrawingArea(), zIndex); ((CompositeFigureListener)listeners[i+1]).figureAdded(event); } } }
/** * Sends a figure to the back of the composite figure. * * @param figure that is part of this composite figure */ public void sendToBack(Figure figure) { if (basicRemove(figure) != -1) { basicAdd(0, figure); fireAreaInvalidated(figure.getDrawingArea()); } }
@Override public final Rectangle2D.Double getDrawingArea() { Rectangle2D.Double r = getFigureDrawingArea(); if (decorator != null) { updateDecoratorBounds(); r.add(decorator.getDrawingArea()); } return r; } protected Rectangle2D.Double getFigureDrawingArea() {
@Override protected Rectangle basicGetBounds() { return getView().drawingToView(getOwner().getDrawingArea()); } /**
/** * Brings a figure to the front of the drawing. * * @param figure that is part of the drawing */ public void bringToFront(Figure figure) { if (basicRemove(figure) != -1) { basicAdd(figure); fireAreaInvalidated(figure.getDrawingArea()); } }
@Override public void draw(Graphics2D g) { synchronized (getLock()) { ensureSorted(); ArrayList<Figure> toDraw = new ArrayList<Figure>(getChildren().size()); Rectangle clipRect = g.getClipBounds(); for (Figure f : getChildren()) { if (f.getDrawingArea().intersects(clipRect)) { toDraw.add(f); } } draw(g, toDraw); } }
/** * Return the draw area. This method is delegated to the * encapsulated presentation figure. */ @Override public Rectangle2D.Double getDrawingArea() { Rectangle2D.Double r = super.getDrawingArea(); if (getPresentationFigure() != null) { r.add(getPresentationFigure().getDrawingArea()); } return r; }
@Override public QuadTreeDrawing clone() { QuadTreeDrawing that = (QuadTreeDrawing) super.clone(); that.quadTree = new QuadTree<Figure>(); for (Figure f : getChildren()) { quadTree.add(f, f.getDrawingArea()); } return that; }
@Override public Rectangle2D.Double getDrawingArea() { if (cachedDrawingArea == null) { cachedDrawingArea = super.getDrawingArea(); for (Figure child : getChildrenFrontToBack()) { if (child.isVisible()) { Rectangle2D.Double childBounds = child.getDrawingArea(); if (! childBounds.isEmpty()) { cachedDrawingArea.add(childBounds); } } } } return (Rectangle2D.Double) cachedDrawingArea.clone(); } @Override
public void draw(Graphics2D g, Collection<Figure> children) { Rectangle2D clipBounds = g.getClipBounds(); if (clipBounds != null) { for (Figure f : children) { if (f.isVisible() && f.getDrawingArea().intersects(clipBounds)) { f.draw(g); } } } else { for (Figure f : children) { if (f.isVisible()) { f.draw(g); } } } }
@Override public void figureChanged(FigureEvent e) { quadTree.remove(e.getFigure()); quadTree.add(e.getFigure(), e.getFigure().getDrawingArea()); needsSorting = true; if (! isChanging()) fireAreaInvalidated(e.getInvalidatedArea()); } @Override public void figureRequestRemove(FigureEvent e) {
@Override public void figureChanged(FigureEvent e) { if (!isChanging()) { quadTree.remove(e.getFigure()); quadTree.add(e.getFigure(), e.getFigure().getDrawingArea()); needsSorting = true; invalidate(); fireAreaInvalidated(e.getInvalidatedArea()); } } }
@Override public void draw(Graphics2D g) { Rectangle2D clipBounds = g.getClipBounds(); if (clipBounds != null) { for (Figure child : getChildren()) { if (child.isVisible() && child.getDrawingArea().intersects(clipBounds)) { child.draw(g); } } } else { for (Figure child : getChildren()) { if (child.isVisible()) { child.draw(g); } } } }