Lines 13-39
Link Here
|
13 |
|
13 |
|
14 |
import java.util.ArrayList; |
14 |
import java.util.ArrayList; |
15 |
import java.util.List; |
15 |
import java.util.List; |
|
|
16 |
import java.util.ListIterator; |
16 |
|
17 |
|
|
|
18 |
import org.eclipse.draw2d.FigureListener; |
17 |
import org.eclipse.draw2d.IFigure; |
19 |
import org.eclipse.draw2d.IFigure; |
18 |
import org.eclipse.draw2d.PositionConstants; |
20 |
import org.eclipse.draw2d.PositionConstants; |
19 |
import org.eclipse.draw2d.geometry.Dimension; |
21 |
import org.eclipse.draw2d.geometry.Dimension; |
20 |
import org.eclipse.draw2d.geometry.Point; |
22 |
import org.eclipse.draw2d.geometry.Point; |
21 |
import org.eclipse.emf.common.notify.Notification; |
23 |
import org.eclipse.draw2d.geometry.Rectangle; |
22 |
import org.eclipse.emf.transaction.TransactionalEditingDomain; |
24 |
import org.eclipse.emf.transaction.TransactionalEditingDomain; |
23 |
import org.eclipse.gef.EditPart; |
25 |
import org.eclipse.gef.EditPart; |
24 |
import org.eclipse.gef.EditPartListener; |
26 |
import org.eclipse.gef.EditPartListener; |
|
|
27 |
import org.eclipse.gef.LayerConstants; |
25 |
import org.eclipse.gef.commands.Command; |
28 |
import org.eclipse.gef.commands.Command; |
26 |
import org.eclipse.gef.requests.ChangeBoundsRequest; |
29 |
import org.eclipse.gef.requests.ChangeBoundsRequest; |
27 |
import org.eclipse.gmf.runtime.diagram.core.listener.DiagramEventBroker; |
30 |
import org.eclipse.gmf.runtime.diagram.core.listener.DiagramEventBroker; |
28 |
import org.eclipse.gmf.runtime.diagram.core.listener.NotificationListener; |
|
|
29 |
import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart; |
31 |
import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart; |
30 |
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; |
32 |
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; |
31 |
import org.eclipse.gmf.runtime.diagram.ui.editparts.ResizableCompartmentEditPart; |
33 |
import org.eclipse.gmf.runtime.diagram.ui.editparts.ResizableCompartmentEditPart; |
|
|
34 |
import org.eclipse.gmf.runtime.diagram.ui.editparts.TopGraphicEditPart; |
32 |
import org.eclipse.gmf.runtime.diagram.ui.figures.BorderedNodeFigure; |
35 |
import org.eclipse.gmf.runtime.diagram.ui.figures.BorderedNodeFigure; |
33 |
import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure; |
36 |
import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure; |
34 |
import org.eclipse.gmf.runtime.diagram.ui.handles.CompartmentCollapseHandle; |
37 |
import org.eclipse.gmf.runtime.diagram.ui.handles.CompartmentCollapseHandle; |
35 |
import org.eclipse.gmf.runtime.diagram.ui.internal.handles.CompartmentResizeHandle; |
38 |
import org.eclipse.gmf.runtime.diagram.ui.internal.handles.CompartmentResizeHandle; |
36 |
import org.eclipse.gmf.runtime.notation.NotationPackage; |
39 |
import org.eclipse.jface.util.Assert; |
37 |
|
40 |
|
38 |
/** |
41 |
/** |
39 |
* A resizable editpolicy for resizable compartments. The editpolicy could be |
42 |
* A resizable editpolicy for resizable compartments. The editpolicy could be |
Lines 45-50
Link Here
|
45 |
extends ResizableEditPolicyEx { |
48 |
extends ResizableEditPolicyEx { |
46 |
|
49 |
|
47 |
private boolean horizontal; |
50 |
private boolean horizontal; |
|
|
51 |
|
52 |
/** |
53 |
* Listener to determine bounds changes of compartment figure and/or its container |
54 |
* to display or hide collapse handles accordingly (Bugzilla #115905) |
55 |
*/ |
56 |
private FigureListener figureListener = new FigureListener() { |
57 |
public void figureMoved(IFigure source) { |
58 |
if (handles != null) { |
59 |
ResizableCompartmentFigure compartment = getCompartmentFigure(); |
60 |
Dimension minClientDimension = compartment.getMinClientDimension(); |
61 |
if (source.equals(compartment)) |
62 |
{ |
63 |
Rectangle intersection = getGraphicalEditPart() |
64 |
.getTopGraphicEditPart().getFigure().getBounds().getCopy() |
65 |
.intersect(source.getBounds()); |
66 |
|
67 |
refreshCollapseHandles(intersection.height>minClientDimension.height && intersection.width>minClientDimension.width); |
68 |
} |
69 |
else if (source.equals(getGraphicalEditPart().getTopGraphicEditPart().getFigure())) |
70 |
{ |
71 |
Rectangle intersection = source.getBounds().getCopy().intersect(compartment.getBounds()); |
72 |
refreshCollapseHandles(intersection.height>minClientDimension.height && intersection.width>minClientDimension.width); |
73 |
} |
74 |
} |
75 |
} |
76 |
}; |
48 |
|
77 |
|
49 |
/** |
78 |
/** |
50 |
* Creates a new vertical ResizableCompartmentEditPolicy |
79 |
* Creates a new vertical ResizableCompartmentEditPolicy |
Lines 79-88
Link Here
|
79 |
IGraphicalEditPart part = (IGraphicalEditPart) getHost(); |
108 |
IGraphicalEditPart part = (IGraphicalEditPart) getHost(); |
80 |
|
109 |
|
81 |
List collapseHandles = new ArrayList(); |
110 |
List collapseHandles = new ArrayList(); |
|
|
111 |
|
82 |
collapseHandles.add(new CompartmentCollapseHandle(part)); |
112 |
collapseHandles.add(new CompartmentCollapseHandle(part)); |
83 |
return collapseHandles; |
113 |
return collapseHandles; |
84 |
} |
114 |
} |
85 |
|
115 |
|
86 |
/** |
116 |
/** |
87 |
* @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#createSelectionHandles() |
117 |
* @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#createSelectionHandles() |
88 |
*/ |
118 |
*/ |
Lines 93-99
Link Here
|
93 |
int d2 = isHorizontal() ? PositionConstants.EAST |
123 |
int d2 = isHorizontal() ? PositionConstants.EAST |
94 |
: PositionConstants.SOUTH; |
124 |
: PositionConstants.SOUTH; |
95 |
List selectionHandles = new ArrayList(); |
125 |
List selectionHandles = new ArrayList(); |
96 |
selectionHandles.addAll(createCollapseHandles()); |
126 |
|
|
|
127 |
TopGraphicEditPart wrapper = part.getTopGraphicEditPart(); |
128 |
Rectangle intersection = null; |
129 |
ResizableCompartmentFigure compartment = getCompartmentFigure(); |
130 |
if (wrapper != null && compartment != null) |
131 |
intersection = wrapper.getFigure().getBounds().getCopy().intersect( |
132 |
compartment.getBounds()); |
133 |
if (intersection == null |
134 |
|| (intersection.width > compartment.getMinClientDimension().width && intersection.height > compartment |
135 |
.getMinClientDimension().height)) |
136 |
selectionHandles.addAll(createCollapseHandles()); |
137 |
|
97 |
selectionHandles.add(new CompartmentResizeHandle(part, d1)); |
138 |
selectionHandles.add(new CompartmentResizeHandle(part, d1)); |
98 |
selectionHandles.add(new CompartmentResizeHandle(part, d2)); |
139 |
selectionHandles.add(new CompartmentResizeHandle(part, d2)); |
99 |
return selectionHandles; |
140 |
return selectionHandles; |
Lines 133-141
Link Here
|
133 |
*/ |
174 |
*/ |
134 |
protected void showSelection() { |
175 |
protected void showSelection() { |
135 |
super.showSelection(); |
176 |
super.showSelection(); |
136 |
if (getHost().getSelected() != EditPart.SELECTED_NONE) { |
177 |
ResizableCompartmentFigure compartmentFigure = getCompartmentFigure(); |
137 |
ResizableCompartmentFigure compartmentFigure = getCompartmentFigure(); |
178 |
if (compartmentFigure != null) { |
138 |
if (compartmentFigure != null) { |
179 |
if (getGraphicalEditPart().getTopGraphicEditPart() != null) |
|
|
180 |
getGraphicalEditPart().getTopGraphicEditPart().getFigure().addFigureListener(figureListener); |
181 |
compartmentFigure.addFigureListener(figureListener); |
182 |
if (getHost().getSelected() != EditPart.SELECTED_NONE) { |
139 |
compartmentFigure.setSelected(true); |
183 |
compartmentFigure.setSelected(true); |
140 |
} |
184 |
} |
141 |
} |
185 |
} |
Lines 146-154
Link Here
|
146 |
*/ |
190 |
*/ |
147 |
protected void hideSelection() { |
191 |
protected void hideSelection() { |
148 |
super.hideSelection(); |
192 |
super.hideSelection(); |
149 |
if (getHost().getSelected() == EditPart.SELECTED_NONE) { |
193 |
if (getGraphicalEditPart().getTopGraphicEditPart() != null) |
150 |
ResizableCompartmentFigure compartmentFigure = getCompartmentFigure(); |
194 |
getGraphicalEditPart().getTopGraphicEditPart().getFigure().removeFigureListener(figureListener); |
151 |
if (compartmentFigure != null) { |
195 |
ResizableCompartmentFigure compartmentFigure = getCompartmentFigure(); |
|
|
196 |
if (compartmentFigure != null) { |
197 |
compartmentFigure.removeFigureListener(figureListener); |
198 |
if (getHost().getSelected() == EditPart.SELECTED_NONE) { |
152 |
compartmentFigure.setSelected(false); |
199 |
compartmentFigure.setSelected(false); |
153 |
} |
200 |
} |
154 |
} |
201 |
} |
Lines 158-165
Link Here
|
158 |
|
205 |
|
159 |
private EditPartListener parentListener; |
206 |
private EditPartListener parentListener; |
160 |
|
207 |
|
161 |
private NotificationListener propertyListener; |
|
|
162 |
|
163 |
/** |
208 |
/** |
164 |
* @see org.eclipse.gef.editpolicies.SelectionEditPolicy#addSelectionListener() |
209 |
* @see org.eclipse.gef.editpolicies.SelectionEditPolicy#addSelectionListener() |
165 |
*/ |
210 |
*/ |
Lines 180-204
Link Here
|
180 |
} |
225 |
} |
181 |
}; |
226 |
}; |
182 |
getParentGraphicEditPart().addEditPartListener(parentListener); |
227 |
getParentGraphicEditPart().addEditPartListener(parentListener); |
|
|
228 |
|
229 |
} |
183 |
|
230 |
|
184 |
propertyListener = new NotificationListener() { |
231 |
/* (non-Javadoc) |
185 |
|
232 |
* @see org.eclipse.gef.editpolicies.SelectionEditPolicy#activate() |
186 |
public void notifyChanged(Notification notification) { |
233 |
*/ |
187 |
if (NotationPackage.eINSTANCE.getView_Visible().equals( |
234 |
public void activate() { |
188 |
notification.getFeature())) |
235 |
super.activate(); |
189 |
setSelectedState(); |
236 |
setSelectedState(); |
190 |
} |
237 |
} |
191 |
}; |
238 |
|
192 |
getDiagramEventBroker().addNotificationListener( |
239 |
/* (non-Javadoc) |
193 |
getGraphicalEditPart().getNotationView(), propertyListener); |
240 |
* @see org.eclipse.gef.editpolicies.NonResizableEditPolicy#deactivate() |
|
|
241 |
*/ |
242 |
public void deactivate() { |
243 |
super.deactivate(); |
244 |
setSelectedState(); |
194 |
} |
245 |
} |
195 |
|
246 |
|
196 |
/** |
247 |
/** |
197 |
* @see org.eclipse.gef.editpolicies.SelectionEditPolicy#removeSelectionListener() |
248 |
* @see org.eclipse.gef.editpolicies.SelectionEditPolicy#removeSelectionListener() |
198 |
*/ |
249 |
*/ |
199 |
protected void removeSelectionListener() { |
250 |
protected void removeSelectionListener() { |
200 |
getDiagramEventBroker().removeNotificationListener( |
|
|
201 |
getGraphicalEditPart().getNotationView(), propertyListener); |
202 |
getHost().removeEditPartListener(hostListener); |
251 |
getHost().removeEditPartListener(hostListener); |
203 |
getParentGraphicEditPart().removeEditPartListener(parentListener); |
252 |
getParentGraphicEditPart().removeEditPartListener(parentListener); |
204 |
} |
253 |
} |
Lines 291-294
Link Here
|
291 |
} |
340 |
} |
292 |
return null; |
341 |
return null; |
293 |
} |
342 |
} |
|
|
343 |
|
344 |
/** |
345 |
* Refreshes collapse handles - displays them if they need to be displayed but not displaying |
346 |
* and removes them if they shouldn't be displayed, but are displayed. |
347 |
* Method assumes that handles are not <code>null</code>, i.e. handles are being displayed |
348 |
* |
349 |
* @param shouldHaveHandles <code>true</code> if collapse handles need to be displayed |
350 |
*/ |
351 |
private void refreshCollapseHandles(boolean shouldHaveHandles) |
352 |
{ |
353 |
Assert.isTrue(handles!=null); |
354 |
|
355 |
boolean hasHandles = dispalyingCollapseHandles(); |
356 |
|
357 |
if (shouldHaveHandles && !hasHandles) |
358 |
addCollapseHandles(); |
359 |
else if (!shouldHaveHandles && hasHandles) |
360 |
removeCollapseHandles(); |
361 |
} |
362 |
|
363 |
/** |
364 |
* Adds collapse handles to the list of handles and displays them |
365 |
* Method assumes that handles are not <code>null</code>, i.e. handles are being displayed |
366 |
*/ |
367 |
private void addCollapseHandles() |
368 |
{ |
369 |
Assert.isTrue(handles!=null); |
370 |
List collapseHandles = createCollapseHandles(); |
371 |
IFigure layer = getLayer(LayerConstants.HANDLE_LAYER); |
372 |
handles.addAll(collapseHandles); |
373 |
for (ListIterator handlesIterator = collapseHandles |
374 |
.listIterator(); handlesIterator.hasNext();) |
375 |
layer.add((IFigure) handlesIterator.next()); |
376 |
} |
377 |
|
378 |
/** |
379 |
* Tries to remove collapse handles if any displayed |
380 |
* Method assumes that handles are not <code>null</code>, i.e. handles are being displayed |
381 |
* |
382 |
*/ |
383 |
private void removeCollapseHandles() |
384 |
{ |
385 |
Assert.isTrue(handles!=null); |
386 |
IFigure layer = getLayer(LayerConstants.HANDLE_LAYER); |
387 |
for (ListIterator handlesIterator = handles.listIterator(); handlesIterator.hasNext();) |
388 |
{ |
389 |
IFigure handle = (IFigure) handlesIterator.next(); |
390 |
if (handle instanceof CompartmentCollapseHandle) { |
391 |
layer.remove(handle); |
392 |
handlesIterator.remove(); |
393 |
} |
394 |
} |
395 |
} |
396 |
|
397 |
/** |
398 |
* Checks whether connection handles are being displayed. |
399 |
* Method assumes that handles are not <code>null</code>, i.e. handles are being displayed |
400 |
* |
401 |
* @return <code>true</code> if collapse handles are being displayed |
402 |
*/ |
403 |
private boolean dispalyingCollapseHandles() |
404 |
{ |
405 |
Assert.isTrue(handles!=null); |
406 |
for (ListIterator handlesIterator = handles.listIterator(); handlesIterator.hasNext();) |
407 |
{ |
408 |
if (handlesIterator.next() instanceof CompartmentCollapseHandle) |
409 |
return true; |
410 |
} |
411 |
return false; |
412 |
} |
413 |
|
294 |
} |
414 |
} |