Project

General

Profile

Download (6.49 KB) Statistics
| Branch: | Tag: | Revision:
1
/*******************************************************************************
2
 * Copyright (c) 2008, 2010 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 *******************************************************************************/
11
package org.eclipse.gef.internal.ui.palette.editparts;
12

    
13
import java.beans.PropertyChangeEvent;
14
import java.util.Iterator;
15
import java.util.List;
16

    
17
import org.eclipse.draw2d.IFigure;
18

    
19
import org.eclipse.gef.EditPart;
20
import org.eclipse.gef.GraphicalEditPart;
21
import org.eclipse.gef.Request;
22
import org.eclipse.gef.palette.PaletteListener;
23
import org.eclipse.gef.palette.PaletteStack;
24
import org.eclipse.gef.palette.ToolEntry;
25
import org.eclipse.gef.ui.palette.PaletteViewer;
26
import org.eclipse.gef.ui.palette.editparts.IPinnableEditPart;
27
import org.eclipse.gef.ui.palette.editparts.PaletteEditPart;
28

    
29
/**
30
 * The EditPart for a pinnable PaletteStack to be used in a drawer or group.
31
 * Some of this code has been take from <code>PaletteStackEditPart</code>, but
32
 * they are significantly different to warrant two editpart classes.
33
 * 
34
 * @author Whitney Sorenson, crevells
35
 * @since 3.4
36
 */
37
public class PinnablePaletteStackEditPart extends PaletteEditPart implements
38
		IPaletteStackEditPart, IPinnableEditPart {
39

    
40
	// listen to see if active tool is changed in the palette
41
	private PaletteListener paletteListener = new PaletteListener() {
42

    
43
		public void activeToolChanged(PaletteViewer palette, ToolEntry tool) {
44
			if (!getStackFigure().isPinnedOpen()
45
					&& getStack().getChildren().contains(tool)) {
46
				if (!getStack().getActiveEntry().equals(tool)) {
47
					getStack().setActiveEntry(tool);
48
				}
49
			}
50
			if (!getStackFigure().isPinnedOpen()) {
51
				getStackFigure().setExpanded(false);
52
			}
53
		}
54
	};
55

    
56
	/**
57
	 * Creates a new PaletteStackEditPart with the given PaletteStack as its
58
	 * model.
59
	 * 
60
	 * @param model
61
	 *            the PaletteStack to associate with this EditPart.
62
	 */
63
	public PinnablePaletteStackEditPart(PaletteStack model) {
64
		super(model);
65
	}
66

    
67
	/**
68
	 * @see org.eclipse.gef.EditPart#activate()
69
	 */
70
	public void activate() {
71
		// in case the model is out of sync
72
		checkActiveEntrySync();
73
		getPaletteViewer().addPaletteListener(paletteListener);
74
		super.activate();
75
	}
76

    
77
	/**
78
	 * Called when the active entry has changed.
79
	 * 
80
	 * @param oldValue
81
	 *            the old model value (can be null)
82
	 * @param newValue
83
	 *            the new model value (can be null)
84
	 */
85
	private void activeEntryChanged(Object oldValue, Object newValue) {
86
		GraphicalEditPart part = null;
87
		IFigure oldFigure = null;
88
		IFigure newFigure = null;
89
		int index = -1;
90

    
91
		if (oldValue != null) {
92
			part = (GraphicalEditPart) getViewer().getEditPartRegistry().get(
93
					oldValue);
94
			// if part is null, its no longer a child.
95
			if (part != null) {
96
				oldFigure = part.getFigure();
97

    
98
				// preserve the original order of the palette stack children
99
				index = getModelChildren().indexOf(part.getModel());
100
			}
101
		}
102

    
103
		if (newValue != null) {
104
			part = (GraphicalEditPart) getViewer().getEditPartRegistry().get(
105
					newValue);
106
			newFigure = part.getFigure();
107
		}
108

    
109
		getStackFigure().activeEntryChanged(oldFigure, index, newFigure);
110
	}
111

    
112
	private void checkActiveEntrySync() {
113
		if (getStackFigure().getActiveFigure() == null)
114
			activeEntryChanged(null, getStack().getActiveEntry());
115
	}
116

    
117
	public IFigure createFigure() {
118
		return new PinnablePaletteStackFigure();
119
	}
120

    
121
	private PinnablePaletteStackFigure getStackFigure() {
122
		return (PinnablePaletteStackFigure) getFigure();
123
	}
124

    
125
	public void deactivate() {
126
		getPaletteViewer().removePaletteListener(paletteListener);
127
		super.deactivate();
128
	}
129

    
130
	public void eraseTargetFeedback(Request request) {
131
		Iterator children = getChildren().iterator();
132

    
133
		while (children.hasNext()) {
134
			PaletteEditPart part = (PaletteEditPart) children.next();
135
			part.eraseTargetFeedback(request);
136
		}
137
		super.eraseTargetFeedback(request);
138
	}
139

    
140
	public IFigure getContentPane() {
141
		// not completely accurate, but is there any other way?
142
		return getStackFigure().getContentPane();
143
	}
144

    
145
	protected void removeChildVisual(EditPart childEditPart) {
146
		IFigure child = ((GraphicalEditPart) childEditPart).getFigure();
147
		getStackFigure().getContentPane(child).remove(child);
148
	}
149

    
150
	protected void addChild(EditPart childEP, int index) {
151
		index = updateIndexBasedOnActiveFigure(index, childEP);
152
		super.addChild(childEP, index);
153
	}
154

    
155
	protected void reorderChild(EditPart childEP, int index) {
156
		IFigure childFigure = ((GraphicalEditPart) childEP).getFigure();
157
		if (childFigure == getStackFigure().getActiveFigure()) {
158
			// no need to reorder figures if this is the active figure
159
			List children = getChildren();
160
			children.remove(childEP);
161
			children.add(index, childEP);
162
		} else {
163
			removeChildVisual(childEP);
164
			List children = getChildren();
165
			children.remove(childEP);
166
			children.add(index, childEP);
167
			index = updateIndexBasedOnActiveFigure(index, childEP);
168
			addChildVisual(childEP, index);
169
		}
170
	}
171

    
172
	private int updateIndexBasedOnActiveFigure(int index, EditPart childEP) {
173
		for (int i = 0; i < index; i++) {
174
			Object ep = getChildren().get(i);
175
			if (((GraphicalEditPart) ep).getFigure() == getStackFigure()
176
					.getActiveFigure()) {
177
				return index - 1;
178
			}
179
		}
180
		return index;
181
	}
182

    
183
	private PaletteStack getStack() {
184
		return (PaletteStack) getModel();
185
	}
186

    
187
	public void propertyChange(PropertyChangeEvent event) {
188
		if (event.getPropertyName().equals(PaletteStack.PROPERTY_ACTIVE_ENTRY))
189
			activeEntryChanged(event.getOldValue(), event.getNewValue());
190
		else
191
			super.propertyChange(event);
192
	}
193

    
194
	protected void refreshChildren() {
195
		super.refreshChildren();
196
		checkActiveEntrySync();
197
	}
198

    
199
	protected void refreshVisuals() {
200
		getStackFigure().setLayoutMode(getLayoutSetting());
201
	}
202

    
203
	public void openMenu() {
204
		setExpanded(true);
205
	}
206

    
207
	public void setExpanded(boolean value) {
208
		getStackFigure().setExpanded(value);
209
	}
210

    
211
	public boolean isExpanded() {
212
		return getStackFigure().isExpanded();
213
	}
214

    
215
	public boolean canBePinned() {
216
		return isExpanded();
217
	}
218

    
219
	public boolean isPinnedOpen() {
220
		return getStackFigure().isPinnedOpen();
221
	}
222

    
223
	public void setPinnedOpen(boolean pinned) {
224
		getStackFigure().setPinned(pinned);
225
	}
226

    
227
	public PaletteEditPart getActiveEntry() {
228
		return (PaletteEditPart) getViewer().getEditPartRegistry().get(
229
				getStack().getActiveEntry());
230
	}
231

    
232
}
(14-14/22)