package org.eclipse.uml2.diagram.timing.draw2d; import org.eclipse.draw2d.BorderLayout; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.MarginBorder; import org.eclipse.draw2d.RectangleFigure; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPartViewer; import org.eclipse.uml2.diagram.timing.draw2d.layout.ValueLineLayout; public class ValueLineShape extends RectangleFigure { public static final int LABEL_PREFERRED_WIDTH = 80; public static final int SPACING = 25; private Label myNameLabel; private Tail myTail; public ValueLineShape(){ BorderLayout layout = new BorderLayout(); layout.setHorizontalSpacing(SPACING); setLayoutManager(layout); myNameLabel = addLabel(); myTail = addTail(); setLabelPreferredWidth(LABEL_PREFERRED_WIDTH); } public void setViewer(EditPartViewer viewer){ myTail.setViewer(viewer); } private Label addLabel(){ Label result = new Label(); result.setBorder(new MarginBorder(5, 5, 5, 5)); this.add(result, BorderLayout.LEFT); return result; } private Tail addTail(){ Tail result = new Tail(); result.setBorder(new MarginBorder(0, 0, 0, 15)); result.setShowTail(true); this.add(result, BorderLayout.CENTER); return result; } public Label getNameLabel() { return myNameLabel; } public Tail getTail() { return myTail; } public void setLabelPreferredWidth(int width){ myNameLabel.setPreferredSize(width, -1); } public static class Tail extends RectangleFigure { private final Rectangle TEMP = new Rectangle(); private boolean myShowTail = true; private int myEndGap; private ValueLineLayout myLayout; public Tail(){ setOpaque(false); setFill(false); setLineStyle(Graphics.LINE_DASH); setEndGap(15); myLayout = new ValueLineLayout(); setLayoutManager(myLayout); } public void setEndGap(int gap){ myEndGap = gap; requestRepaint(); } private void setViewer(EditPartViewer viewer){ myLayout.setViewer(viewer); } @Override protected void outlineShape(Graphics graphics) { TEMP.setBounds(getBounds()); int centerY = TEMP.y + TEMP.height / 2; graphics.drawLine(TEMP.x, centerY, Math.max(TEMP.x + TEMP.width - myEndGap, TEMP.x), centerY); } public void setShowTail(boolean showTail) { if (myShowTail != showTail){ myShowTail = showTail; requestRepaint(); } } private void requestRepaint(){ if (getParent() != null){ repaint(); } } } }