diff options
author | rmah | 2006-07-28 18:01:46 +0000 |
---|---|---|
committer | rmah | 2006-07-28 18:01:46 +0000 |
commit | 07623ec4da673b272da5a98c5c93185da23f5dff (patch) | |
tree | 277b3c0b81f545435783493eb57349cc37a2d37f | |
parent | 66894854cbbd506485a8a524ee270612a1ea68ef (diff) | |
download | webtools.webservices-07623ec4da673b272da5a98c5c93185da23f5dff.tar.gz webtools.webservices-07623ec4da673b272da5a98c5c93185da23f5dff.tar.xz webtools.webservices-07623ec4da673b272da5a98c5c93185da23f5dff.zip |
[141070] WSDL Editor: Open in XML Schema Link Icon not refreshing properly
6 files changed, 492 insertions, 334 deletions
diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd-wsdl11/org/eclipse/wst/wsdl/ui/internal/InternalWSDLMultiPageEditor.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd-wsdl11/org/eclipse/wst/wsdl/ui/internal/InternalWSDLMultiPageEditor.java index f18dfbb06..5dfd91d1b 100644 --- a/bundles/org.eclipse.wst.wsdl.ui/src-asd-wsdl11/org/eclipse/wst/wsdl/ui/internal/InternalWSDLMultiPageEditor.java +++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd-wsdl11/org/eclipse/wst/wsdl/ui/internal/InternalWSDLMultiPageEditor.java @@ -170,6 +170,10 @@ public class InternalWSDLMultiPageEditor extends ASDMultiPageEditor { return ((Adapter)model).getTarget(); } + else if (type == IOpenExternalEditorHelper.class) { + return new W11OpenExternalEditorHelper(((IFileEditorInput) getEditorInput()).getFile()); + } + else if (type == XSDTypeReferenceEditManager.class) { IEditorInput editorInput = getEditorInput(); @@ -467,6 +471,9 @@ public class InternalWSDLMultiPageEditor extends ASDMultiPageEditor registry.registerAction(directEditAction); } + /* + * @deprecated: rmah: remove the method below post WTP1.5. Use getAdapter() method instead. + */ public IOpenExternalEditorHelper getOpenExternalEditorHelper() { return new W11OpenExternalEditorHelper(((IFileEditorInput) getEditorInput()).getFile()); } diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/AbstractBoxtEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/AbstractBoxtEditPart.java index 827b7dbb7..e66cb21a9 100644 --- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/AbstractBoxtEditPart.java +++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/AbstractBoxtEditPart.java @@ -48,7 +48,7 @@ public abstract class AbstractBoxtEditPart extends BaseEditPart implements IName public IFigure getContentPane() { - return ((BoxComponentFigure) getFigure()).getContentPane(); + return figure.getContentPane(); } protected void createEditPolicies() @@ -91,8 +91,8 @@ public abstract class AbstractBoxtEditPart extends BaseEditPart implements IName { super.refreshVisuals(); WSDLBaseAdapter box = (WSDLBaseAdapter) getModel(); - ((BoxComponentFigure) getFigure()).headingFigure.setIsReadOnly(box.isReadOnly()); - ((BoxComponentFigure) getFigure()).getLabel().setText(box.getName()); + figure.headingFigure.setIsReadOnly(box.isReadOnly()); + figure.getLabel().setText(box.getName()); } public void addFeedback() diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingEditPart.java index 91775d998..9484c232f 100644 --- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingEditPart.java +++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingEditPart.java @@ -29,7 +29,6 @@ import org.eclipse.gef.RequestConstants; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.wst.wsdl.ui.internal.asd.Messages; import org.eclipse.wst.wsdl.ui.internal.asd.design.connections.CenteredConnectionAnchor; -import org.eclipse.wst.wsdl.ui.internal.asd.design.connections.TopLeftConnectionAnchor; import org.eclipse.wst.wsdl.ui.internal.asd.design.editpolicies.ASDSelectionEditPolicy; import org.eclipse.wst.wsdl.ui.internal.asd.design.figures.BoxComponentFigure; import org.eclipse.wst.wsdl.ui.internal.asd.design.figures.ComponentReferenceConnection; @@ -61,7 +60,7 @@ public class BindingEditPart extends BaseEditPart public IFigure getContentPane() { - return ((BoxComponentFigure) getFigure()).getContentPane(); + return figure.getContentPane(); } protected List getModelChildren() @@ -240,9 +239,9 @@ public class BindingEditPart extends BaseEditPart if (connectionFigure != null) { AbstractGraphicalEditPart referenceTypePart = (AbstractGraphicalEditPart) getViewer().getEditPartRegistry().get(typeBeingRef); - BoxComponentFigure boxComponentFigure = (BoxComponentFigure) referenceTypePart.getFigure(); + IFigure refFigure= referenceTypePart.getFigure(); connectionFigure.setSourceAnchor(new CenteredConnectionAnchor(getFigure(), CenteredConnectionAnchor.RIGHT, 0)); - connectionFigure.setTargetAnchor(new TopLeftConnectionAnchor(boxComponentFigure, boxComponentFigure.getLabel())); + connectionFigure.setTargetAnchor(new CenteredConnectionAnchor(refFigure, CenteredConnectionAnchor.HEADER_LEFT, 0, 11)); connectionFigure.setHighlight(false); connectionFigure.setVisible(true); } diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/InterfaceEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/InterfaceEditPart.java index 1670abbe5..16907f14f 100644 --- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/InterfaceEditPart.java +++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/InterfaceEditPart.java @@ -10,20 +10,30 @@ *******************************************************************************/ package org.eclipse.wst.wsdl.ui.internal.asd.design.editparts; +import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.ColorConstants; +import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.LineBorder; import org.eclipse.draw2d.PositionConstants; +import org.eclipse.draw2d.RectangleFigure; import org.eclipse.draw2d.ToolbarLayout; +import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; +import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.wst.wsdl.ui.internal.asd.design.DesignViewGraphicsConstants; import org.eclipse.wst.wsdl.ui.internal.asd.design.figures.BoxComponentFigure; +import org.eclipse.wst.wsdl.ui.internal.asd.design.figures.LinkIconFigure; import org.eclipse.wst.wsdl.ui.internal.asd.design.layouts.RowLayout; import org.eclipse.wst.wsdl.ui.internal.asd.facade.IInterface; public class InterfaceEditPart extends AbstractBoxtEditPart implements IFeedbackHandler -{ +{ + private RectangleFigure linkIconColumn; + protected BoxComponentFigure boxFigure; public InterfaceEditPart() { columnData.setColumnWeight("MessageLabel", 0); //$NON-NLS-1$ @@ -34,13 +44,72 @@ public class InterfaceEditPart extends AbstractBoxtEditPart implements IFeedback protected IFigure createFigure() { - BoxComponentFigure figure = (BoxComponentFigure)super.createFigure(); - figure.getLabel().setIcon(((IInterface) getModel()).getImage()); - figure.setBackgroundColor(ColorConstants.orange); - figure.setBorder(new LineBorder(1)); + IFigure outer = new Figure(); + outer.setLayoutManager(new ToolbarLayout(true)); + boxFigure = (BoxComponentFigure)super.createFigure(); + boxFigure.getLabel().setIcon(((IInterface) getModel()).getImage()); + boxFigure.setBackgroundColor(ColorConstants.orange); + boxFigure.setBorder(new LineBorder(1)); ToolbarLayout toolbarLayout = new ToolbarLayout(false); toolbarLayout.setStretchMinorAxis(true); - figure.setLayoutManager(toolbarLayout); + boxFigure.setLayoutManager(toolbarLayout); + outer.add(boxFigure); + linkIconColumn = new RectangleFigure(); + linkIconColumn.setOutline(false); + linkIconColumn.setLayoutManager(new ToolbarLayout() { + public void layout(IFigure parent) { + super.layout(parent); + + // We need to layout on the y-axis + Iterator children = parent.getChildren().iterator(); + while (children.hasNext()) { + Object item = children.next(); + if (item instanceof LinkIconFigure) { + LinkIconFigure linkFigure = (LinkIconFigure) item; + AbstractGraphicalEditPart ep = linkFigure.getAssociatedEditPart(); + IFigure associatedFigure = ep.getFigure(); + if (associatedFigure != null) { + // Update the bounds + Rectangle associatedBounds = associatedFigure.getBounds(); + Rectangle linkFigureBounds = linkFigure.getBounds(); + if (linkFigureBounds.y == associatedBounds.y) { + break; + } + + linkFigure.setFigureLocation(new Point(associatedBounds.x, associatedBounds.y)); + } + } + } + } + + protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) { + Dimension dimension = super.calculatePreferredSize(container, wHint, hHint); + + // Calculate the height + Iterator it = getFigure().getChildren().iterator(); + while (it.hasNext()) { + Object item = it.next(); + if (item instanceof BoxComponentFigure) { + dimension.height = ((IFigure) item).getPreferredSize().height; + break; + } + } + + // Calculate the width + it = container.getChildren().iterator(); + while (it.hasNext()) { + Object item = it.next(); + if (item instanceof LinkIconFigure) { + dimension.width = dimension.width + ((LinkIconFigure) item).horizontalBuffer; + break; + } + } + + return dimension; + } + }); + + outer.add(linkIconColumn); // rmah: The block of code below has been moved from refreshVisuals(). We're // assuming the read-only state of the EditPart will never change once the @@ -54,7 +123,7 @@ public class InterfaceEditPart extends AbstractBoxtEditPart implements IFeedback figure.getLabel().setForegroundColor(ColorConstants.black); } - return figure; + return outer; } public static void attachToInterfaceEditPart(EditPart editPart, RowLayout rowLayout) @@ -78,8 +147,6 @@ public class InterfaceEditPart extends AbstractBoxtEditPart implements IFeedback protected void refreshVisuals() { super.refreshVisuals(); - - BoxComponentFigure fig = (BoxComponentFigure) getFigure(); } protected List getModelChildren() @@ -94,8 +161,7 @@ public class InterfaceEditPart extends AbstractBoxtEditPart implements IFeedback public void removeFeedback() { super.removeFeedback(); - } - + } public EditPart getRelativeEditPart(int direction) { @@ -105,4 +171,8 @@ public class InterfaceEditPart extends AbstractBoxtEditPart implements IFeedback } return super.getRelativeEditPart(direction); } + + public IFigure getLinkIconColumn() { + return linkIconColumn; + } } diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterTypeEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterTypeEditPart.java index 0e768c40a..66a16dc3e 100644 --- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterTypeEditPart.java +++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterTypeEditPart.java @@ -13,17 +13,15 @@ package org.eclipse.wst.wsdl.ui.internal.asd.design.editparts; import java.util.Iterator; import org.eclipse.draw2d.ColorConstants; +import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.MarginBorder; import org.eclipse.draw2d.MouseEvent; import org.eclipse.draw2d.MouseListener; import org.eclipse.draw2d.Panel; -import org.eclipse.draw2d.Polygon; import org.eclipse.draw2d.PositionConstants; -import org.eclipse.draw2d.XYLayout; import org.eclipse.draw2d.geometry.Point; -import org.eclipse.draw2d.geometry.PointList; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; @@ -34,12 +32,13 @@ import org.eclipse.gef.commands.Command; import org.eclipse.gef.editpolicies.DirectEditPolicy; import org.eclipse.gef.requests.DirectEditRequest; import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PlatformUI; import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11ParameterForPart; -import org.eclipse.wst.wsdl.ui.internal.asd.ASDEditorPlugin; -import org.eclipse.wst.wsdl.ui.internal.asd.ASDMultiPageEditor; import org.eclipse.wst.wsdl.ui.internal.asd.design.DesignViewGraphicsConstants; import org.eclipse.wst.wsdl.ui.internal.asd.design.directedit.TypeReferenceDirectEditManager; import org.eclipse.wst.wsdl.ui.internal.asd.design.editpolicies.ASDSelectionEditPolicy; +import org.eclipse.wst.wsdl.ui.internal.asd.design.figures.LinkIconFigure; import org.eclipse.wst.wsdl.ui.internal.asd.design.layouts.RowLayout; import org.eclipse.wst.wsdl.ui.internal.asd.facade.IParameter; import org.eclipse.wst.wsdl.ui.internal.asd.util.IOpenExternalEditorHelper; @@ -49,323 +48,316 @@ import org.eclipse.draw2d.MouseMotionListener.Stub; public class ParameterTypeEditPart extends BaseEditPart implements IFeedbackHandler, INamedEditPart { protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy(); - protected Label parameterType; - protected RowLayout rowLayout = new RowLayout(); + protected Label parameterType; + protected RowLayout rowLayout = new RowLayout(); - protected MyMouseEventListener mouseEventListener; - - protected IFigure createFigure() - { - IFigure figure = new Panel(); - figure.setLayoutManager(rowLayout); - - parameterType = new Label(); - parameterType.setLabelAlignment(Label.LEFT); - parameterType.setBorder(new MarginBorder(4,12,4,20)); - figure.add(parameterType); - - // rmah: The block of code below has been moved from refreshVisuals(). We're - // assuming the read-only state of the EditPart will never change once the - // EditPart has been created. - if (isReadOnly()) - { - parameterType.setForegroundColor(DesignViewGraphicsConstants.readOnlyLabelColor); - } - else - { - parameterType.setForegroundColor(ColorConstants.black); - } - - return figure; - } - - protected void refreshVisuals() - { - super.refreshVisuals(); - IParameter param = (IParameter) getModel(); - String name = param.getComponentName(); - parameterType.setText(name); - - - // TODO (cs) this evil bit of code needs to be fixed post WTP 1.5 when we have more freedom to - // clean up our internal code structure. We shouldn't have hardcoded adapter references here! - if (getModel() instanceof W11ParameterForPart) - { - Image image = ((W11ParameterForPart)getModel()).getSecondaryImage(); - if (image != null) - { - parameterType.setIcon(image); - } - } - } - - public void addFeedback() { - figure.setBackgroundColor(DesignViewGraphicsConstants.tableCellSelectionColor); - } - - public void removeFeedback() { - figure.setBackgroundColor(figure.getParent().getBackgroundColor()); - } - - public Label getLabelFigure() { - return parameterType; - } - - protected void createEditPolicies() - { - super.createEditPolicies(); - installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ASDSelectionEditPolicy()); - installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy); - } - - public void performDirectEdit(Point cursorLocation) { - if (cursorLocation == null || (hitTest(parameterType, cursorLocation) && !isReadOnly())) { - IParameter param = (IParameter) getModel(); - - TypeReferenceDirectEditManager manager = new TypeReferenceDirectEditManager(param, this, parameterType); - simpleDirectEditPolicy.setDelegate(manager); - manager.show(); - - - } - else if (hitTest(parameterType, cursorLocation) && isReadOnly()) { - doOpenNewEditor(); - } - } - public void performRequest(Request req) { if (req.getType().equals(RequestConstants.REQ_DIRECT_EDIT)) { performDirectEdit(null); } } - public void activate() { - super.activate(); - - // Setup a MouseMotionListener so we know when to display the 'open in XSD Editor' figure - IFigure feedBackLayer = getLayer(LayerConstants.FEEDBACK_LAYER); - if (!(feedBackLayer.getLayoutManager() instanceof XYLayout)) { - feedBackLayer.setLayoutManager(new XYLayout()); // We could probably move this line elsewhere - } - - IFigure primaryLayer = getLayer(LayerConstants.PRIMARY_LAYER); - mouseEventListener = new MyMouseEventListener(getModel()); - primaryLayer.addMouseMotionListener(mouseEventListener); - primaryLayer.addMouseListener(mouseEventListener); - } - - public void deactivate() { - if (mouseEventListener != null) { - mouseEventListener.discardLinkFigure(); - IFigure primaryLayer = getLayer(LayerConstants.PRIMARY_LAYER); - primaryLayer.removeMouseMotionListener(mouseEventListener); - primaryLayer.removeMouseListener(mouseEventListener); - } - } - - private class MyLinkFigure extends Polygon { - private PointList points = new PointList(); - public int horizontalBuffer = 4; - public int verticalBuffer = 6; - - public MyLinkFigure() { - // Draw the arrow - points.addPoint(new Point(horizontalBuffer + 0, 4 + verticalBuffer)); - points.addPoint(new Point(horizontalBuffer + 9, 4 + verticalBuffer)); - points.addPoint(new Point(horizontalBuffer + 9, 0 + verticalBuffer)); - points.addPoint(new Point(horizontalBuffer + 14, 5 + verticalBuffer)); - points.addPoint(new Point(horizontalBuffer + 9, 10 + verticalBuffer)); - points.addPoint(new Point(horizontalBuffer + 9, 6 + verticalBuffer)); - points.addPoint(new Point(horizontalBuffer + 0, 6 + verticalBuffer)); - points.addPoint(new Point(horizontalBuffer + 0, 4 + verticalBuffer)); - setFill(true); - } + protected MyMouseEventListener mouseEventListener; + private LinkIconFigure linkIconFigure; - public void setLocation(Point newLocation) { - PointList translatedPoints = new PointList(); - - for (int index = 0; index < points.size(); index++) { - Point origPoint = points.getPoint(index); - translatedPoints.addPoint(origPoint.translate(newLocation)); - } - - setPoints(translatedPoints); - } - } - - private class MyMouseEventListener extends Stub implements MouseListener { - private MyLinkFigure linkFigure; - private Object object; - private IOpenExternalEditorHelper openExternalEditorHelper; - - public MyMouseEventListener(Object object) { - this.object = object; - linkFigure = new MyLinkFigure(); - unemphasizeLinkFigure(); - } - - public void mouseMoved(MouseEvent me) { - Point pointer = me.getLocation(); - Rectangle figBounds = getFigure().getParent().getParent().getBounds(); - - if (getExternalEditorOpener().linkApplicable()) { - getLayer(LayerConstants.FEEDBACK_LAYER).add(linkFigure); - setLinkFigureLocation(); - if (pointerInRange(figBounds, pointer)) { - emphasizeLinkFigure(); - } - else { - unemphasizeLinkFigure(); - } - } - else { - if (containsLinkFigure()) { - getLayer(LayerConstants.FEEDBACK_LAYER).remove(linkFigure); - } - } - } - - private boolean containsLinkFigure() { - IFigure figure = getLayer(LayerConstants.FEEDBACK_LAYER); - Iterator it = figure.getChildren().iterator(); - while (it.hasNext()) { - Object item = it.next(); - if (item.equals(linkFigure)) { - return true; - } - } - - return false; - } - - private Rectangle getLinkFigureBounds() { - if (containsLinkFigure()) { - return linkFigure.getBounds(); - } - else { - return null; - } - } - - private boolean pointerInRange(Rectangle figBounds, Point pointer) { - Rectangle linkBounds = getLinkFigureBounds(); - - int entireX = figBounds.x; - int entireY = figBounds.y; - int entireWidth = figBounds.width + linkBounds.width + linkFigure.horizontalBuffer; - int entireHeight = figBounds.height; - Rectangle entireBounds = new Rectangle(entireX, entireY, entireWidth, entireHeight); - - return entireBounds.contains(pointer); - } - - protected void setLinkFigureLocation() { - Rectangle figureBounds = getFigure().getBounds(); - int xStart = figureBounds.x + figureBounds.width; - int yStart = figureBounds.y; - - Point aPoint = new Point(xStart, yStart); - linkFigure.setLocation(aPoint); - } - - public void discardLinkFigure() { - if (containsLinkFigure()) { - getLayer(LayerConstants.FEEDBACK_LAYER).remove(linkFigure); - } - } - - protected void emphasizeLinkFigure() { - linkFigure.setForegroundColor(ColorConstants.blue); - linkFigure.setBackgroundColor(ColorConstants.blue); - } - - protected void unemphasizeLinkFigure() { - linkFigure.setForegroundColor(ColorConstants.lightGray); - linkFigure.setBackgroundColor(ColorConstants.lightGray); - } + protected IFigure createFigure() + { + IFigure figure = new Panel(); + figure.setLayoutManager(rowLayout); - public void mouseReleased(MouseEvent me) { } - public void mouseDoubleClicked(MouseEvent me) { } - public void mousePressed(MouseEvent me) { - if (me.button != 1) { - return; - } - - Point pointer = me.getLocation(); - Rectangle linkFigBounds = getLinkFigureBounds(); - if (linkFigBounds == null) { - return; - } - - Rectangle testbounds = new Rectangle(linkFigBounds.x, linkFigBounds.y, 0, linkFigBounds.height); - - if (getExternalEditorOpener().linkApplicable() && pointerInRange(testbounds, pointer)) { - setLinkFigureLocation(); - // Open in XSD Editor - getExternalEditorOpener().openExternalEditor(); - } - } - - private IOpenExternalEditorHelper getExternalEditorOpener() { - if (openExternalEditorHelper == null) { - openExternalEditorHelper = ((ASDMultiPageEditor) ASDEditorPlugin.getActiveEditor()).getOpenExternalEditorHelper(); - openExternalEditorHelper.setModel(object); - } - - return openExternalEditorHelper; - } - } - - private class SimpleDirectEditPolicy extends DirectEditPolicy - { - protected TypeReferenceDirectEditManager delegate; - - public void setDelegate(TypeReferenceDirectEditManager delegate) - { - this.delegate = delegate; - } - - protected org.eclipse.gef.commands.Command getDirectEditCommand(final DirectEditRequest request) - { - return new Command() //AbstractCommand() - { - public void execute() - { - if (delegate != null) - { - delegate.performEdit(request.getCellEditor()); - } - } - - public void redo() - { - } - - public void undo() - { - } - - public boolean canExecute() - { - return true; - } - }; - } - - protected void showCurrentEditValue(DirectEditRequest request) - { - //hack to prevent async layout from placing the cell editor twice. - getHostFigure().getUpdateManager().performUpdate(); - } - } - - public EditPart getRelativeEditPart(int direction) - { - EditPart editPart = super.getRelativeEditPart(direction); - if (direction == PositionConstants.SOUTH && editPart == null) - { - editPart = EditPartNavigationHandlerUtil.getNextInterface(this); - } - return editPart; - } - }
\ No newline at end of file + parameterType = new Label(); + parameterType.setLabelAlignment(Label.LEFT); + parameterType.setBorder(new MarginBorder(4,12,4,20)); + figure.add(parameterType); + + // rmah: The block of code below has been moved from refreshVisuals(). We're + // assuming the read-only state of the EditPart will never change once the + // EditPart has been created. + if (isReadOnly()) + { + parameterType.setForegroundColor(DesignViewGraphicsConstants.readOnlyLabelColor); + } + else + { + parameterType.setForegroundColor(ColorConstants.black); + } + + return figure; + } + + protected void refreshVisuals() + { + super.refreshVisuals(); + IParameter param = (IParameter) getModel(); + String name = param.getComponentName(); + parameterType.setText(name); + + + // TODO (cs) this evil bit of code needs to be fixed post WTP 1.5 when we have more freedom to + // clean up our internal code structure. We shouldn't have hardcoded adapter references here! + if (getModel() instanceof W11ParameterForPart) + { + Image image = ((W11ParameterForPart)getModel()).getSecondaryImage(); + if (image != null) + { + parameterType.setIcon(image); + } + } + + // Force the LinkIconColumn to resize and relayout itself. + ((Figure) getInterfaceEditPart().getLinkIconColumn()).invalidate(); + refreshLinkFigure(new Point(-1, -1)); + } + + private InterfaceEditPart getInterfaceEditPart() { + EditPart ep = getParent(); + while (ep != null && !(ep instanceof InterfaceEditPart)) { + ep = ep.getParent(); + } + + if (ep instanceof InterfaceEditPart) { + return (InterfaceEditPart) ep; + } + + return null; + } + + public void addFeedback() { + figure.setBackgroundColor(DesignViewGraphicsConstants.tableCellSelectionColor); + } + + public void removeFeedback() { + figure.setBackgroundColor(figure.getParent().getBackgroundColor()); + } + + public Label getLabelFigure() { + return parameterType; + } + + protected void createEditPolicies() + { + super.createEditPolicies(); + installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ASDSelectionEditPolicy()); + installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy); + } + + public void performDirectEdit(Point cursorLocation) { + if (cursorLocation == null || (hitTest(parameterType, cursorLocation) && !isReadOnly())) { + IParameter param = (IParameter) getModel(); + + TypeReferenceDirectEditManager manager = new TypeReferenceDirectEditManager(param, this, parameterType); + simpleDirectEditPolicy.setDelegate(manager); + manager.show(); + + + } + else if (hitTest(parameterType, cursorLocation) && isReadOnly()) { + doOpenNewEditor(); + } + } + + public void activate() { + super.activate(); + + IFigure primaryLayer = getLayer(LayerConstants.PRIMARY_LAYER); + mouseEventListener = new MyMouseEventListener(); + primaryLayer.addMouseMotionListener(mouseEventListener); + primaryLayer.addMouseListener(mouseEventListener); + } + + public void deactivate() { + if (mouseEventListener != null) { + IFigure primaryLayer = getLayer(LayerConstants.PRIMARY_LAYER); + primaryLayer.removeMouseMotionListener(mouseEventListener); + primaryLayer.removeMouseListener(mouseEventListener); + } + + InterfaceEditPart ep = getInterfaceEditPart(); + if (ep != null && linkIconFigure != null) { + IFigure fig = ep.getLinkIconColumn(); + if (fig.getChildren().contains(linkIconFigure)) { + ep.getLinkIconColumn().remove(linkIconFigure); + } + } + } + + + private class SimpleDirectEditPolicy extends DirectEditPolicy + { + protected TypeReferenceDirectEditManager delegate; + + public void setDelegate(TypeReferenceDirectEditManager delegate) + { + this.delegate = delegate; + } + + protected org.eclipse.gef.commands.Command getDirectEditCommand(final DirectEditRequest request) + { + return new Command() //AbstractCommand() + { + public void execute() + { + if (delegate != null) + { + delegate.performEdit(request.getCellEditor()); + } + } + + public void redo() + { + } + + public void undo() + { + } + + public boolean canExecute() + { + return true; + } + }; + } + + protected void showCurrentEditValue(DirectEditRequest request) + { + //hack to prevent async layout from placing the cell editor twice. + getHostFigure().getUpdateManager().performUpdate(); + } + } + + public EditPart getRelativeEditPart(int direction) + { + EditPart editPart = super.getRelativeEditPart(direction); + if (direction == PositionConstants.SOUTH && editPart == null) + { + editPart = EditPartNavigationHandlerUtil.getNextInterface(this); + } + return editPart; + } + + private class MyMouseEventListener extends Stub implements MouseListener { + public void mouseReleased(MouseEvent me) { } + public void mouseDoubleClicked(MouseEvent me) { } + + public void mouseMoved(MouseEvent me) { + Point pointer = me.getLocation(); + refreshLinkFigure(pointer); + } + + public void mousePressed(MouseEvent me) { + Point pointer = me.getLocation(); + openExternalEditor(pointer); + } + } + + // Methods below handle the Link Figure..... + private void emphasizeLinkFigure() { + linkIconFigure.setForegroundColor(ColorConstants.blue); + linkIconFigure.setBackgroundColor(ColorConstants.blue); + } + + private void unemphasizeLinkFigure() { + linkIconFigure.setForegroundColor(ColorConstants.lightGray); + linkIconFigure.setBackgroundColor(ColorConstants.lightGray); + } + + private boolean pointerInRange(Rectangle figBounds, Point pointer) { + Rectangle linkBounds = getLinkFigureBounds(); + + int entireX = figBounds.x; + int entireY = figBounds.y; + int entireWidth = figBounds.width + linkBounds.width + linkIconFigure.horizontalBuffer; + int entireHeight = figBounds.height; + Rectangle entireBounds = new Rectangle(entireX, entireY, entireWidth, entireHeight); + + return entireBounds.contains(pointer); + } + + private boolean containsLinkFigure() { + Iterator it = getInterfaceEditPart().getLinkIconColumn().getChildren().iterator(); + while (it.hasNext()) { + Object item = it.next(); + if (item.equals(linkIconFigure)) { + return true; + } + } + + return false; + } + + private Rectangle getLinkFigureBounds() { + if (containsLinkFigure()) { + return linkIconFigure.getBounds(); + } + else { + return null; + } + } + + private IOpenExternalEditorHelper openExternalEditorHelper; + private IOpenExternalEditorHelper getExternalEditorOpener() { + if (openExternalEditorHelper == null) { + if (PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() != null) { + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + if (page.getActiveEditor() != null) { + Object adapted = page.getActiveEditor().getAdapter(IOpenExternalEditorHelper.class); + if (adapted instanceof IOpenExternalEditorHelper) { + openExternalEditorHelper = (IOpenExternalEditorHelper) adapted; + openExternalEditorHelper.setModel(getModel()); + } + } + } + } + + return openExternalEditorHelper; + } + + private void refreshLinkFigure(Point point) { + Rectangle figBounds = getFigure().getParent().getParent().getBounds(); + if (getExternalEditorOpener() != null) { + if (getExternalEditorOpener().linkApplicable()) { + if (!figureContainsLinkFigure(getInterfaceEditPart().getLinkIconColumn())) { + linkIconFigure = new LinkIconFigure(this); + getInterfaceEditPart().getLinkIconColumn().add(linkIconFigure); + } + + if (pointerInRange(figBounds, point)) { + emphasizeLinkFigure(); + } + else { + unemphasizeLinkFigure(); + } + } + else { + if (containsLinkFigure()) { + getInterfaceEditPart().getLinkIconColumn().remove(linkIconFigure); + } + } + } + } + + private boolean figureContainsLinkFigure(IFigure parent) { + Iterator it = parent.getChildren().iterator(); + while (it.hasNext()) { + if (it.next().equals(linkIconFigure)) { + return true; + } + } + + return false; + } + + private void openExternalEditor(Point point) { + Rectangle linkFigBounds = getLinkFigureBounds(); + if (linkFigBounds == null || getExternalEditorOpener() == null) { + return; + } + + Rectangle testbounds = new Rectangle(linkFigBounds.x, linkFigBounds.y, 0, linkFigBounds.height); + + if (getExternalEditorOpener().linkApplicable() && pointerInRange(testbounds, point)) { + // Open in XSD Editor + getExternalEditorOpener().openExternalEditor(); + } + } +} diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/figures/LinkIconFigure.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/figures/LinkIconFigure.java new file mode 100644 index 000000000..8107a381f --- /dev/null +++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/figures/LinkIconFigure.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright (c) 2001, 2006 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.wsdl.ui.internal.asd.design.figures; + +import org.eclipse.draw2d.Graphics; +import org.eclipse.draw2d.Polygon; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.draw2d.geometry.PointList; +import org.eclipse.gef.editparts.AbstractGraphicalEditPart; + +public class LinkIconFigure extends Polygon { + private AbstractGraphicalEditPart editPart; + private Point figLocation; + private PointList points = new PointList(); + public int horizontalBuffer = 5; + public int verticalBuffer = 7; + + public LinkIconFigure(AbstractGraphicalEditPart ep) { + editPart = ep; + + // Draw the arrow + points.addPoint(new Point(horizontalBuffer + 0, 4 + verticalBuffer)); + points.addPoint(new Point(horizontalBuffer + 9, 4 + verticalBuffer)); + points.addPoint(new Point(horizontalBuffer + 9, 0 + verticalBuffer)); + points.addPoint(new Point(horizontalBuffer + 14, 5 + verticalBuffer)); + points.addPoint(new Point(horizontalBuffer + 9, 10 + verticalBuffer)); + points.addPoint(new Point(horizontalBuffer + 9, 6 + verticalBuffer)); + points.addPoint(new Point(horizontalBuffer + 0, 6 + verticalBuffer)); + points.addPoint(new Point(horizontalBuffer + 0, 4 + verticalBuffer)); + + setFill(true); + setPoints(points); + } + + public void paintFigure(Graphics graphics) { + super.paintFigure(graphics); + } + + public void setFigureLocation(Point newStartingLocation) { + int dy = newStartingLocation.y; + + if (figLocation != null) { + dy = newStartingLocation.y - figLocation.y; + } + + // Update the points + PointList newPoints = new PointList(); + PointList pList = getPoints(); + for (int index = 0; index < pList.size(); index++) { + Point point = pList.getPoint(index); + // Add 5 for the padding + Point newPoint = new Point(point.x + horizontalBuffer, point.y + dy); + newPoints.addPoint(newPoint); + } + setPoints(newPoints); + + figLocation = newStartingLocation; + } + + public void primTranslate(int dx, int dy) { + bounds.x += dx; + bounds.y += dy; + + PointList pList = getPoints(); + PointList newList = new PointList(); + for (int index = 0; index < pList.size(); index++) { + Point point = pList.getPoint(index); + Point newPoint = new Point(point.x + dx, point.y); + newList.addPoint(newPoint); + } + setPoints(newList); + + if (useLocalCoordinates()) { + fireCoordinateSystemChanged(); + return; + } + } + + public AbstractGraphicalEditPart getAssociatedEditPart() { + return editPart; + } +} |