View | Details | Raw Unified | Return to bug 115905 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/gmf/runtime/diagram/ui/editpolicies/ResizableCompartmentEditPolicy.java (-25 / +145 lines)
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
}

Return to bug 115905