| package org.eclipse.uml2.diagram.profile.edit.parts; |
| |
| import org.eclipse.draw2d.ColorConstants; |
| import org.eclipse.draw2d.FreeformLayout; |
| import org.eclipse.draw2d.Graphics; |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.LayoutAnimator; |
| import org.eclipse.draw2d.LayoutListener; |
| import org.eclipse.draw2d.MarginBorder; |
| import org.eclipse.draw2d.TreeSearch; |
| import org.eclipse.draw2d.geometry.Rectangle; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemsAwareFreeFormLayer; |
| import org.eclipse.gmf.runtime.notation.View; |
| |
| public class UmlDiagramEditPart extends DiagramEditPart{ |
| |
| public UmlDiagramEditPart(View diagramView) { |
| super(diagramView); |
| } |
| protected IFigure createFigure() { |
| return new DiagramEditPartFigure(); |
| } |
| protected class DiagramEditPartFigure extends BorderItemsAwareFreeFormLayer { |
| public DiagramEditPartFigure() { |
| setLayoutManager(new FreeformLayout()); |
| addLayoutListener(LayoutAnimator.getDefault()); |
| addLayoutListener(new PageBreaksLayoutListener()); |
| setBorder(new MarginBorder(20)); |
| } |
| public boolean containsPoint(int x, int y) { |
| return getBounds().contains(x, y); |
| } |
| public IFigure findFigureAt(int x, int y, TreeSearch search) { |
| if (!isEnabled()) |
| return null; |
| if (!containsPoint(x, y)) |
| return null; |
| if (search.prune(this)) |
| return null; |
| IFigure child = findDescendantAtExcluding(x, y, search); |
| if (child != null) |
| return child; |
| if (search.accept(this)) |
| return this; |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.draw2d.Figure#validate() |
| */ |
| public void validate() { |
| super.validate(); |
| boolean shouldUpdatePageBreakLocation=false; |
| if (shouldUpdatePageBreakLocation){ |
| shouldUpdatePageBreakLocation = false; |
| updatePageBreaksLocation(); |
| } |
| } |
| @Override |
| public void paint(Graphics graphics) { |
| super.paint(graphics); |
| graphics.pushState(); |
| graphics.setLineStyle(3); |
| graphics.setForegroundColor(ColorConstants.red); |
| graphics.setBackgroundColor(ColorConstants.blue); |
| Rectangle bounds = getBounds(); |
| graphics.drawRectangle(bounds.x+3, bounds.y+3, bounds.width - 4, bounds.height - 4); |
| graphics.popState(); |
| } |
| |
| } |
| /** |
| * @author mmostafa |
| * PageBreaksLayoutListener Listens to post layout so it can update the page breaks |
| */ |
| private class PageBreaksLayoutListener extends LayoutListener.Stub { |
| |
| public void postLayout(IFigure container) { |
| super.postLayout(container); |
| updatePageBreaksLocation(); |
| } |
| |
| |
| } |
| } |