|
Link Here
|
| 20 |
import javax.annotation.PreDestroy; |
20 |
import javax.annotation.PreDestroy; |
| 21 |
import javax.inject.Inject; |
21 |
import javax.inject.Inject; |
| 22 |
import org.eclipse.e4.core.contexts.ContextInjectionFactory; |
22 |
import org.eclipse.e4.core.contexts.ContextInjectionFactory; |
|
|
23 |
import org.eclipse.e4.core.contexts.IContextFunction; |
| 23 |
import org.eclipse.e4.core.contexts.IEclipseContext; |
24 |
import org.eclipse.e4.core.contexts.IEclipseContext; |
| 24 |
import org.eclipse.e4.core.contexts.RunAndTrack; |
25 |
import org.eclipse.e4.core.contexts.RunAndTrack; |
| 25 |
import org.eclipse.e4.core.services.events.IEventBroker; |
26 |
import org.eclipse.e4.core.services.events.IEventBroker; |
| 26 |
import org.eclipse.e4.core.services.log.Logger; |
27 |
import org.eclipse.e4.core.services.log.Logger; |
| 27 |
import org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer; |
28 |
import org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer; |
| 28 |
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer; |
|
|
| 29 |
import org.eclipse.e4.ui.model.application.MApplication; |
29 |
import org.eclipse.e4.ui.model.application.MApplication; |
| 30 |
import org.eclipse.e4.ui.model.application.ui.MContext; |
30 |
import org.eclipse.e4.ui.model.application.ui.MCoreExpression; |
| 31 |
import org.eclipse.e4.ui.model.application.ui.MElementContainer; |
31 |
import org.eclipse.e4.ui.model.application.ui.MElementContainer; |
| 32 |
import org.eclipse.e4.ui.model.application.ui.MUIElement; |
32 |
import org.eclipse.e4.ui.model.application.ui.MUIElement; |
| 33 |
import org.eclipse.e4.ui.model.application.ui.MUILabel; |
33 |
import org.eclipse.e4.ui.model.application.ui.MUILabel; |
|
Link Here
|
| 39 |
import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement; |
39 |
import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement; |
| 40 |
import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem; |
40 |
import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem; |
| 41 |
import org.eclipse.e4.ui.model.application.ui.menu.MMenuSeparator; |
41 |
import org.eclipse.e4.ui.model.application.ui.menu.MMenuSeparator; |
|
|
42 |
import org.eclipse.e4.ui.model.application.ui.menu.MOpaqueMenu; |
| 43 |
import org.eclipse.e4.ui.model.application.ui.menu.MOpaqueMenuItem; |
| 44 |
import org.eclipse.e4.ui.model.application.ui.menu.MOpaqueMenuSeparator; |
| 42 |
import org.eclipse.e4.ui.model.application.ui.menu.MPopupMenu; |
45 |
import org.eclipse.e4.ui.model.application.ui.menu.MPopupMenu; |
|
|
46 |
import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenuItem; |
| 47 |
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl; |
| 43 |
import org.eclipse.e4.ui.workbench.IResourceUtilities; |
48 |
import org.eclipse.e4.ui.workbench.IResourceUtilities; |
| 44 |
import org.eclipse.e4.ui.workbench.UIEvents; |
49 |
import org.eclipse.e4.ui.workbench.UIEvents; |
| 45 |
import org.eclipse.e4.ui.workbench.modeling.ExpressionContext; |
50 |
import org.eclipse.e4.ui.workbench.modeling.ExpressionContext; |
|
Link Here
|
| 48 |
import org.eclipse.emf.ecore.EObject; |
53 |
import org.eclipse.emf.ecore.EObject; |
| 49 |
import org.eclipse.emf.ecore.util.EcoreUtil; |
54 |
import org.eclipse.emf.ecore.util.EcoreUtil; |
| 50 |
import org.eclipse.jface.action.AbstractGroupMarker; |
55 |
import org.eclipse.jface.action.AbstractGroupMarker; |
|
|
56 |
import org.eclipse.jface.action.ContributionItem; |
| 51 |
import org.eclipse.jface.action.GroupMarker; |
57 |
import org.eclipse.jface.action.GroupMarker; |
| 52 |
import org.eclipse.jface.action.IContributionItem; |
58 |
import org.eclipse.jface.action.IContributionItem; |
| 53 |
import org.eclipse.jface.action.IMenuListener; |
|
|
| 54 |
import org.eclipse.jface.action.IMenuManager; |
| 55 |
import org.eclipse.jface.action.MenuManager; |
59 |
import org.eclipse.jface.action.MenuManager; |
| 56 |
import org.eclipse.jface.action.Separator; |
60 |
import org.eclipse.jface.action.Separator; |
| 57 |
import org.eclipse.jface.resource.ImageDescriptor; |
61 |
import org.eclipse.jface.resource.ImageDescriptor; |
|
|
62 |
import org.eclipse.swt.SWT; |
| 58 |
import org.eclipse.swt.events.DisposeEvent; |
63 |
import org.eclipse.swt.events.DisposeEvent; |
| 59 |
import org.eclipse.swt.events.DisposeListener; |
64 |
import org.eclipse.swt.events.DisposeListener; |
| 60 |
import org.eclipse.swt.widgets.Control; |
65 |
import org.eclipse.swt.widgets.Control; |
| 61 |
import org.eclipse.swt.widgets.Decorations; |
66 |
import org.eclipse.swt.widgets.Decorations; |
|
|
67 |
import org.eclipse.swt.widgets.Display; |
| 62 |
import org.eclipse.swt.widgets.Menu; |
68 |
import org.eclipse.swt.widgets.Menu; |
| 63 |
import org.osgi.service.event.Event; |
69 |
import org.osgi.service.event.Event; |
| 64 |
import org.osgi.service.event.EventHandler; |
70 |
import org.osgi.service.event.EventHandler; |
|
Link Here
|
| 72 |
private Map<MMenu, MenuManager> modelToManager = new HashMap<MMenu, MenuManager>(); |
78 |
private Map<MMenu, MenuManager> modelToManager = new HashMap<MMenu, MenuManager>(); |
| 73 |
private Map<MenuManager, MMenu> managerToModel = new HashMap<MenuManager, MMenu>(); |
79 |
private Map<MenuManager, MMenu> managerToModel = new HashMap<MenuManager, MMenu>(); |
| 74 |
|
80 |
|
| 75 |
private Map<MMenuItem, IContributionItem> modelToContribution = new HashMap<MMenuItem, IContributionItem>(); |
81 |
private Map<MMenuElement, IContributionItem> modelToContribution = new HashMap<MMenuElement, IContributionItem>(); |
|
|
82 |
private Map<IContributionItem, MMenuElement> contributionToModel = new HashMap<IContributionItem, MMenuElement>(); |
| 76 |
|
83 |
|
| 77 |
private Map<MMenuElement, ContributionRecord> modelContributionToRecord = new HashMap<MMenuElement, ContributionRecord>(); |
84 |
private Map<MMenuElement, ContributionRecord> modelContributionToRecord = new HashMap<MMenuElement, ContributionRecord>(); |
| 78 |
|
85 |
|
|
Link Here
|
| 126 |
modelProcessSwitch(parent, itemModel); |
133 |
modelProcessSwitch(parent, itemModel); |
| 127 |
} |
134 |
} |
| 128 |
} else { |
135 |
} else { |
| 129 |
IContributionItem ici = modelToContribution |
136 |
IContributionItem ici = getContribution(itemModel); |
| 130 |
.remove(itemModel); |
137 |
clearModelToContribution(itemModel, ici); |
| 131 |
if (ici != null && parent != null) { |
138 |
if (ici != null && parent != null) { |
| 132 |
parent.remove(ici); |
139 |
parent.remove(ici); |
| 133 |
} |
140 |
} |
|
Link Here
|
| 145 |
return; |
152 |
return; |
| 146 |
} |
153 |
} |
| 147 |
manager.setVisible(menuModel.isVisible()); |
154 |
manager.setVisible(menuModel.isVisible()); |
|
|
155 |
if (manager.getParent() != null) { |
| 156 |
manager.getParent().markDirty(); |
| 157 |
} |
| 148 |
} else if (element instanceof MMenuElement) { |
158 |
} else if (element instanceof MMenuElement) { |
| 149 |
MMenuElement itemModel = (MMenuElement) element; |
159 |
MMenuElement itemModel = (MMenuElement) element; |
| 150 |
IContributionItem ici = getContribution(itemModel); |
160 |
Object obj = getContribution(itemModel); |
| 151 |
if (ici == null) { |
161 |
if (!(obj instanceof ContributionItem)) { |
| 152 |
return; |
162 |
return; |
| 153 |
} |
163 |
} |
| 154 |
ici.setVisible(itemModel.isVisible()); |
164 |
ContributionItem item = (ContributionItem) obj; |
|
|
165 |
item.setVisible(itemModel.isVisible()); |
| 166 |
if (item.getParent() != null) { |
| 167 |
item.getParent().markDirty(); |
| 168 |
} |
| 155 |
} |
169 |
} |
| 156 |
} |
170 |
} |
| 157 |
} |
171 |
} |
|
Link Here
|
| 165 |
|
179 |
|
| 166 |
MMenuItem itemModel = (MMenuItem) event |
180 |
MMenuItem itemModel = (MMenuItem) event |
| 167 |
.getProperty(UIEvents.EventTags.ELEMENT); |
181 |
.getProperty(UIEvents.EventTags.ELEMENT); |
| 168 |
IContributionItem ici = modelToContribution.get(itemModel); |
182 |
IContributionItem ici = getContribution(itemModel); |
| 169 |
if (ici != null) { |
183 |
if (ici != null) { |
| 170 |
ici.update(); |
184 |
ici.update(); |
| 171 |
} |
185 |
} |
|
Link Here
|
| 180 |
|
194 |
|
| 181 |
MMenuItem itemModel = (MMenuItem) event |
195 |
MMenuItem itemModel = (MMenuItem) event |
| 182 |
.getProperty(UIEvents.EventTags.ELEMENT); |
196 |
.getProperty(UIEvents.EventTags.ELEMENT); |
| 183 |
IContributionItem ici = modelToContribution.get(itemModel); |
197 |
IContributionItem ici = getContribution(itemModel); |
| 184 |
if (ici != null) { |
198 |
if (ici != null) { |
| 185 |
ici.update(); |
199 |
ici.update(); |
| 186 |
} |
200 |
} |
| 187 |
} |
201 |
} |
| 188 |
}; |
202 |
}; |
| 189 |
|
203 |
|
| 190 |
private IMenuListener visibilityCalculationListener = new IMenuListener() { |
204 |
private MenuManagerRendererFilter rendererFilter; |
| 191 |
public void menuAboutToShow(IMenuManager manager) { |
|
|
| 192 |
MenuManager menuManager = (MenuManager) manager; |
| 193 |
if (menuManager.getMenu() == null) { |
| 194 |
return; |
| 195 |
} |
| 196 |
MMenu menuModel = getMenuModel(menuManager); |
| 197 |
if (menuModel == null) { |
| 198 |
Menu menu = menuManager.getMenu(); |
| 199 |
Object obj = menu.getData(AbstractPartRenderer.OWNING_ME); |
| 200 |
if (obj == null && menu.getParentItem() != null) { |
| 201 |
obj = menu.getParentItem().getData( |
| 202 |
AbstractPartRenderer.OWNING_ME); |
| 203 |
} |
| 204 |
if (!(obj instanceof MMenu)) { |
| 205 |
return; |
| 206 |
} |
| 207 |
menuModel = (MMenu) obj; |
| 208 |
} else if (menuModel.getWidget() == null) { |
| 209 |
bindWidget(menuModel, menuManager.getMenu()); |
| 210 |
} |
| 211 |
final IEclipseContext evalContext; |
| 212 |
if (menuModel instanceof MContext) { |
| 213 |
evalContext = ((MContext) menuModel).getContext(); |
| 214 |
} else { |
| 215 |
evalContext = modelService.getContainingContext(menuModel); |
| 216 |
} |
| 217 |
HashSet<ContributionRecord> records = new HashSet<ContributionRecord>(); |
| 218 |
for (MMenuElement element : menuModel.getChildren()) { |
| 219 |
ContributionRecord record = modelContributionToRecord |
| 220 |
.get(element); |
| 221 |
if (record != null && records.add(record)) { |
| 222 |
record.updateVisibility(evalContext); |
| 223 |
} |
| 224 |
} |
| 225 |
} |
| 226 |
}; |
| 227 |
|
205 |
|
| 228 |
@PostConstruct |
206 |
@PostConstruct |
| 229 |
public void init() { |
207 |
public void init() { |
|
Link Here
|
| 237 |
eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC), |
215 |
eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC), |
| 238 |
toBeRenderedUpdater); |
216 |
toBeRenderedUpdater); |
| 239 |
|
217 |
|
|
|
218 |
context.set(MenuManagerRenderer.class, this); |
| 219 |
Display display = context.get(Display.class); |
| 220 |
rendererFilter = ContextInjectionFactory.make( |
| 221 |
MenuManagerRendererFilter.class, context); |
| 222 |
display.addFilter(SWT.Show, rendererFilter); |
| 223 |
display.addFilter(SWT.Hide, rendererFilter); |
| 224 |
display.addFilter(SWT.Dispose, rendererFilter); |
| 225 |
context.set(MenuManagerRendererFilter.class, rendererFilter); |
| 226 |
|
| 240 |
} |
227 |
} |
| 241 |
|
228 |
|
| 242 |
@PreDestroy |
229 |
@PreDestroy |
|
Link Here
|
| 245 |
eventBroker.unsubscribe(selectionUpdater); |
232 |
eventBroker.unsubscribe(selectionUpdater); |
| 246 |
eventBroker.unsubscribe(enabledUpdater); |
233 |
eventBroker.unsubscribe(enabledUpdater); |
| 247 |
eventBroker.unsubscribe(toBeRenderedUpdater); |
234 |
eventBroker.unsubscribe(toBeRenderedUpdater); |
|
|
235 |
|
| 236 |
context.remove(MenuManagerRendererFilter.class); |
| 237 |
Display display = context.get(Display.class); |
| 238 |
if (display != null && !display.isDisposed() && rendererFilter != null) { |
| 239 |
display.removeFilter(SWT.Show, rendererFilter); |
| 240 |
display.removeFilter(SWT.Hide, rendererFilter); |
| 241 |
display.removeFilter(SWT.Dispose, rendererFilter); |
| 242 |
} |
| 243 |
if (rendererFilter != null) { |
| 244 |
ContextInjectionFactory.uninject(rendererFilter, context); |
| 245 |
rendererFilter = null; |
| 246 |
} |
| 247 |
context.remove(MenuManagerRenderer.class); |
| 248 |
} |
248 |
} |
| 249 |
|
249 |
|
| 250 |
/* |
250 |
/* |
|
Link Here
|
| 261 |
|
261 |
|
| 262 |
final MMenu menuModel = (MMenu) element; |
262 |
final MMenu menuModel = (MMenu) element; |
| 263 |
Menu newMenu = null; |
263 |
Menu newMenu = null; |
|
|
264 |
MenuManager menuManager = null; |
| 264 |
boolean menuBar = false; |
265 |
boolean menuBar = false; |
| 265 |
|
266 |
|
| 266 |
if (parent instanceof Decorations) { |
267 |
if (parent instanceof Decorations) { |
| 267 |
MUIElement container = (MUIElement) ((EObject) element) |
268 |
MUIElement container = (MUIElement) ((EObject) element) |
| 268 |
.eContainer(); |
269 |
.eContainer(); |
| 269 |
if (container instanceof MWindow) { |
270 |
if (container instanceof MWindow) { |
| 270 |
MenuManager menuBarManager = getManager(menuModel); |
271 |
menuManager = getManager(menuModel); |
| 271 |
if (menuBarManager == null) { |
272 |
if (menuManager == null) { |
| 272 |
menuBarManager = new MenuManager(NO_LABEL, |
273 |
menuManager = new MenuManager(NO_LABEL, |
| 273 |
menuModel.getElementId()); |
274 |
menuModel.getElementId()); |
| 274 |
linkModelToManager(menuModel, menuBarManager); |
275 |
linkModelToManager(menuModel, menuManager); |
| 275 |
} |
276 |
} |
| 276 |
newMenu = menuBarManager.createMenuBar((Decorations) parent); |
277 |
newMenu = menuManager.createMenuBar((Decorations) parent); |
| 277 |
((Decorations) parent).setMenuBar(newMenu); |
278 |
((Decorations) parent).setMenuBar(newMenu); |
| 278 |
newMenu.setData(menuBarManager); |
279 |
newMenu.setData(menuManager); |
| 279 |
menuBar = true; |
280 |
menuBar = true; |
| 280 |
} else { |
281 |
} else { |
| 281 |
MenuManager popupManager = getManager(menuModel); |
282 |
menuManager = getManager(menuModel); |
| 282 |
if (popupManager == null) { |
283 |
if (menuManager == null) { |
| 283 |
popupManager = new MenuManager(NO_LABEL, |
284 |
menuManager = new MenuManager(NO_LABEL, |
| 284 |
menuModel.getElementId()); |
285 |
menuModel.getElementId()); |
| 285 |
linkModelToManager(menuModel, popupManager); |
286 |
linkModelToManager(menuModel, menuManager); |
| 286 |
} |
287 |
} |
| 287 |
newMenu = popupManager.createContextMenu((Control) parent); |
288 |
newMenu = menuManager.createContextMenu((Control) parent); |
| 288 |
((Control) parent).setMenu(newMenu); |
289 |
// we can't be sure this is the correct parent. |
| 289 |
newMenu.setData(popupManager); |
290 |
// ((Control) parent).setMenu(newMenu); |
|
|
291 |
newMenu.setData(menuManager); |
| 290 |
} |
292 |
} |
| 291 |
} else if (parent instanceof Menu) { |
293 |
} else if (parent instanceof Menu) { |
| 292 |
// Object data = ((Menu) parent).getData(); |
294 |
// Object data = ((Menu) parent).getData(); |
| 293 |
logger.debug(new Exception(), "Trying to render a sub menu " //$NON-NLS-1$ |
295 |
logger.debug(new Exception(), "Trying to render a sub menu " //$NON-NLS-1$ |
| 294 |
+ menuModel + "\n\t" + parent); //$NON-NLS-1$ |
296 |
+ menuModel + "\n\t" + parent); //$NON-NLS-1$ |
|
|
297 |
return null; |
| 295 |
|
298 |
|
| 296 |
} else if (parent instanceof Control) { |
299 |
} else if (parent instanceof Control) { |
| 297 |
MenuManager popupManager = getManager(menuModel); |
300 |
menuManager = getManager(menuModel); |
| 298 |
if (popupManager == null) { |
301 |
if (menuManager == null) { |
| 299 |
popupManager = new MenuManager(NO_LABEL, |
302 |
menuManager = new MenuManager(NO_LABEL, |
| 300 |
menuModel.getElementId()); |
303 |
menuModel.getElementId()); |
| 301 |
linkModelToManager(menuModel, popupManager); |
304 |
linkModelToManager(menuModel, menuManager); |
| 302 |
} |
305 |
} |
| 303 |
newMenu = popupManager.createContextMenu((Control) parent); |
306 |
newMenu = menuManager.createContextMenu((Control) parent); |
| 304 |
((Control) parent).setMenu(newMenu); |
307 |
// we can't be sure this is the correct parent. |
| 305 |
newMenu.setData(popupManager); |
308 |
// ((Control) parent).setMenu(newMenu); |
|
|
309 |
newMenu.setData(menuManager); |
| 310 |
} |
| 311 |
if (!menuManager.getRemoveAllWhenShown()) { |
| 312 |
processContributions(menuModel, menuBar); |
| 306 |
} |
313 |
} |
| 307 |
processContributions(menuModel, menuBar); |
|
|
| 308 |
if (newMenu != null) { |
314 |
if (newMenu != null) { |
| 309 |
newMenu.addDisposeListener(new DisposeListener() { |
315 |
newMenu.addDisposeListener(new DisposeListener() { |
| 310 |
public void widgetDisposed(DisposeEvent e) { |
316 |
public void widgetDisposed(DisposeEvent e) { |
|
Link Here
|
| 318 |
/** |
324 |
/** |
| 319 |
* @param menuModel |
325 |
* @param menuModel |
| 320 |
*/ |
326 |
*/ |
| 321 |
protected void cleanUp(MMenu menuModel) { |
327 |
public void cleanUp(MMenu menuModel) { |
| 322 |
Collection<ContributionRecord> vals = modelContributionToRecord |
328 |
Collection<ContributionRecord> vals = modelContributionToRecord |
| 323 |
.values(); |
329 |
.values(); |
| 324 |
for (ContributionRecord record : vals |
330 |
for (ContributionRecord record : vals |
|
Link Here
|
| 333 |
MenuManager copyManager = getManager(menuCopy); |
339 |
MenuManager copyManager = getManager(menuCopy); |
| 334 |
clearModelToManager(menuCopy, copyManager); |
340 |
clearModelToManager(menuCopy, copyManager); |
| 335 |
if (copyManager != null) { |
341 |
if (copyManager != null) { |
|
|
342 |
record.manager.remove(copyManager); |
| 336 |
copyManager.dispose(); |
343 |
copyManager.dispose(); |
| 337 |
} |
344 |
} |
| 338 |
} else { |
345 |
} else { |
| 339 |
IContributionItem ici = modelToContribution |
346 |
IContributionItem ici = getContribution(copy); |
| 340 |
.remove(copy); |
347 |
clearModelToContribution(copy, ici); |
| 341 |
if (ici != null) { |
348 |
if (ici != null) { |
| 342 |
record.manager.remove(ici); |
349 |
record.manager.remove(ici); |
| 343 |
} |
350 |
} |
|
Link Here
|
| 352 |
* @param menuModel |
359 |
* @param menuModel |
| 353 |
* @param menuBar |
360 |
* @param menuBar |
| 354 |
*/ |
361 |
*/ |
| 355 |
private void processContributions(MMenu menuModel, boolean menuBar) { |
362 |
public void processContributions(MMenu menuModel, boolean menuBar) { |
| 356 |
final ArrayList<MMenuContribution> toContribute = new ArrayList<MMenuContribution>(); |
363 |
final ArrayList<MMenuContribution> toContribute = new ArrayList<MMenuContribution>(); |
| 357 |
ContributionsAnalyzer.XXXgatherMenuContributions(menuModel, |
364 |
ContributionsAnalyzer.XXXgatherMenuContributions(menuModel, |
| 358 |
application.getMenuContributions(), menuModel.getElementId(), |
365 |
application.getMenuContributions(), menuModel.getElementId(), |
|
Link Here
|
| 500 |
boolean isVisible = ContributionsAnalyzer.isVisible( |
507 |
boolean isVisible = ContributionsAnalyzer.isVisible( |
| 501 |
menuContribution, exprContext); |
508 |
menuContribution, exprContext); |
| 502 |
for (MMenuElement item : generatedElements) { |
509 |
for (MMenuElement item : generatedElements) { |
| 503 |
item.setVisible(isVisible); |
510 |
if (isVisible && item.getVisibleWhen() != null) { |
|
|
511 |
MenuManagerRenderer.updateVisibility(manager, item, |
| 512 |
exprContext); |
| 513 |
} else { |
| 514 |
item.setVisible(isVisible); |
| 515 |
} |
| 504 |
} |
516 |
} |
| 505 |
manager.markDirty(); |
517 |
manager.markDirty(); |
| 506 |
} |
518 |
} |
|
Link Here
|
| 564 |
* @param menuModel |
576 |
* @param menuModel |
| 565 |
*/ |
577 |
*/ |
| 566 |
private void processMenu(MenuManager parentManager, MMenu menuModel) { |
578 |
private void processMenu(MenuManager parentManager, MMenu menuModel) { |
| 567 |
String menuText = getText(menuModel); |
579 |
MenuManager menuManager = getManager(menuModel); |
| 568 |
ImageDescriptor desc = getImageDescriptor(menuModel); |
580 |
if (menuManager == null) { |
| 569 |
MenuManager menuManager = new MenuManager(menuText, desc, |
581 |
String menuText = getText(menuModel); |
| 570 |
menuModel.getElementId()); |
582 |
ImageDescriptor desc = getImageDescriptor(menuModel); |
| 571 |
linkModelToManager(menuModel, menuManager); |
583 |
menuManager = new MenuManager(menuText, desc, |
| 572 |
menuManager.setVisible(menuModel.isVisible()); |
584 |
menuModel.getElementId()); |
| 573 |
parentManager.add(menuManager); |
585 |
linkModelToManager(menuModel, menuManager); |
|
|
586 |
menuManager.setVisible(menuModel.isVisible()); |
| 587 |
parentManager.add(menuManager); |
| 588 |
} |
| 574 |
processContributions(menuModel, false); |
589 |
processContributions(menuModel, false); |
| 575 |
List<MMenuElement> parts = menuModel.getChildren(); |
590 |
List<MMenuElement> parts = menuModel.getChildren(); |
| 576 |
if (parts != null) { |
591 |
if (parts != null) { |
|
Link Here
|
| 591 |
if (!childME.isToBeRendered()) { |
606 |
if (!childME.isToBeRendered()) { |
| 592 |
return; |
607 |
return; |
| 593 |
} |
608 |
} |
| 594 |
if (childME instanceof MHandledMenuItem) { |
609 |
if (childME instanceof MRenderedMenuItem) { |
|
|
610 |
MRenderedMenuItem itemModel = (MRenderedMenuItem) childME; |
| 611 |
processRenderedItem(menuManager, itemModel); |
| 612 |
} else if (childME instanceof MHandledMenuItem) { |
| 595 |
MHandledMenuItem itemModel = (MHandledMenuItem) childME; |
613 |
MHandledMenuItem itemModel = (MHandledMenuItem) childME; |
| 596 |
processHandledItem(menuManager, itemModel); |
614 |
processHandledItem(menuManager, itemModel); |
| 597 |
} else if (childME instanceof MDirectMenuItem) { |
615 |
} else if (childME instanceof MDirectMenuItem) { |
|
Link Here
|
| 600 |
} else if (childME instanceof MMenuSeparator) { |
618 |
} else if (childME instanceof MMenuSeparator) { |
| 601 |
MMenuSeparator sep = (MMenuSeparator) childME; |
619 |
MMenuSeparator sep = (MMenuSeparator) childME; |
| 602 |
processSeparator(menuManager, sep); |
620 |
processSeparator(menuManager, sep); |
|
|
621 |
} else if (childME instanceof MOpaqueMenu) { |
| 622 |
// I'm not sure what to do here |
| 623 |
// so I'll just take it out of the running |
| 603 |
} else if (childME instanceof MMenu) { |
624 |
} else if (childME instanceof MMenu) { |
| 604 |
MMenu itemModel = (MMenu) childME; |
625 |
MMenu itemModel = (MMenu) childME; |
| 605 |
processMenu(menuManager, itemModel); |
626 |
processMenu(menuManager, itemModel); |
|
Link Here
|
| 607 |
} |
628 |
} |
| 608 |
|
629 |
|
| 609 |
/** |
630 |
/** |
|
|
631 |
* @param parentManager |
| 632 |
* @param itemModel |
| 633 |
*/ |
| 634 |
void processRenderedItem(MenuManager parentManager, |
| 635 |
MRenderedMenuItem itemModel) { |
| 636 |
IContributionItem ici = getContribution(itemModel); |
| 637 |
if (ici != null) { |
| 638 |
return; |
| 639 |
} |
| 640 |
Object obj = itemModel.getContributionItem(); |
| 641 |
if (obj instanceof IContextFunction) { |
| 642 |
final IEclipseContext lclContext = getContext(itemModel); |
| 643 |
ici = (IContributionItem) ((IContextFunction) obj) |
| 644 |
.compute(lclContext); |
| 645 |
itemModel.setContributionItem(ici); |
| 646 |
} else if (obj instanceof IContributionItem) { |
| 647 |
ici = (IContributionItem) obj; |
| 648 |
} |
| 649 |
ici.setVisible(itemModel.isVisible()); |
| 650 |
parentManager.add(ici); |
| 651 |
linkModelToContribution(itemModel, ici); |
| 652 |
} |
| 653 |
|
| 654 |
/** |
| 610 |
* @param menuManager |
655 |
* @param menuManager |
| 611 |
* @param itemModel |
656 |
* @param itemModel |
| 612 |
*/ |
657 |
*/ |
| 613 |
private void processSeparator(MenuManager menuManager, |
658 |
private void processSeparator(MenuManager menuManager, |
| 614 |
MMenuSeparator itemModel) { |
659 |
MMenuSeparator itemModel) { |
|
|
660 |
IContributionItem ici = getContribution(itemModel); |
| 661 |
if (ici != null) { |
| 662 |
return; |
| 663 |
} |
| 615 |
AbstractGroupMarker marker = null; |
664 |
AbstractGroupMarker marker = null; |
| 616 |
if (itemModel.isVisible()) { |
665 |
if (itemModel.isVisible()) { |
| 617 |
marker = new Separator(); |
666 |
marker = new Separator(); |
|
Link Here
|
| 622 |
} |
671 |
} |
| 623 |
} |
672 |
} |
| 624 |
menuManager.add(marker); |
673 |
menuManager.add(marker); |
|
|
674 |
linkModelToContribution(itemModel, marker); |
| 625 |
} |
675 |
} |
| 626 |
|
676 |
|
| 627 |
/** |
677 |
/** |
| 628 |
* @param parentManager |
678 |
* @param parentManager |
| 629 |
* @param itemModel |
679 |
* @param itemModel |
| 630 |
* @param id |
680 |
* @param id |
| 631 |
* TODO |
|
|
| 632 |
*/ |
681 |
*/ |
| 633 |
void processDirectItem(MenuManager parentManager, |
682 |
void processDirectItem(MenuManager parentManager, |
| 634 |
MDirectMenuItem itemModel, String id) { |
683 |
MDirectMenuItem itemModel, String id) { |
|
|
684 |
IContributionItem ici = getContribution(itemModel); |
| 685 |
if (ici != null) { |
| 686 |
return; |
| 687 |
} |
| 635 |
final IEclipseContext lclContext = getContext(itemModel); |
688 |
final IEclipseContext lclContext = getContext(itemModel); |
| 636 |
DirectContributionItem ci = ContextInjectionFactory.make( |
689 |
DirectContributionItem ci = ContextInjectionFactory.make( |
| 637 |
DirectContributionItem.class, lclContext); |
690 |
DirectContributionItem.class, lclContext); |
| 638 |
ci.setModel(itemModel); |
691 |
ci.setModel(itemModel); |
| 639 |
ci.setVisible(itemModel.isVisible()); |
692 |
ci.setVisible(itemModel.isVisible()); |
| 640 |
parentManager.add(ci); |
693 |
parentManager.add(ci); |
| 641 |
modelToContribution.put(itemModel, ci); |
694 |
linkModelToContribution(itemModel, ci); |
| 642 |
} |
695 |
} |
| 643 |
|
696 |
|
| 644 |
/** |
697 |
/** |
|
Link Here
|
| 647 |
*/ |
700 |
*/ |
| 648 |
void processHandledItem(MenuManager parentManager, |
701 |
void processHandledItem(MenuManager parentManager, |
| 649 |
MHandledMenuItem itemModel) { |
702 |
MHandledMenuItem itemModel) { |
|
|
703 |
IContributionItem ici = getContribution(itemModel); |
| 704 |
if (ici != null) { |
| 705 |
return; |
| 706 |
} |
| 650 |
final IEclipseContext lclContext = getContext(itemModel); |
707 |
final IEclipseContext lclContext = getContext(itemModel); |
| 651 |
HandledContributionItem ci = ContextInjectionFactory.make( |
708 |
HandledContributionItem ci = ContextInjectionFactory.make( |
| 652 |
HandledContributionItem.class, lclContext); |
709 |
HandledContributionItem.class, lclContext); |
| 653 |
ci.setModel(itemModel); |
710 |
ci.setModel(itemModel); |
| 654 |
ci.setVisible(itemModel.isVisible()); |
711 |
ci.setVisible(itemModel.isVisible()); |
| 655 |
parentManager.add(ci); |
712 |
parentManager.add(ci); |
| 656 |
modelToContribution.put(itemModel, ci); |
713 |
linkModelToContribution(itemModel, ci); |
| 657 |
} |
714 |
} |
| 658 |
|
715 |
|
| 659 |
private String getText(MMenu menuModel) { |
716 |
private String getText(MMenu menuModel) { |
|
Link Here
|
| 686 |
public void linkModelToManager(MMenu model, MenuManager manager) { |
743 |
public void linkModelToManager(MMenu model, MenuManager manager) { |
| 687 |
modelToManager.put(model, manager); |
744 |
modelToManager.put(model, manager); |
| 688 |
managerToModel.put(manager, model); |
745 |
managerToModel.put(manager, model); |
| 689 |
manager.addMenuListener(visibilityCalculationListener); |
|
|
| 690 |
} |
746 |
} |
| 691 |
|
747 |
|
| 692 |
public void clearModelToManager(MMenu model, MenuManager manager) { |
748 |
public void clearModelToManager(MMenu model, MenuManager manager) { |
| 693 |
modelToManager.remove(model); |
749 |
modelToManager.remove(model); |
| 694 |
managerToModel.remove(manager); |
750 |
managerToModel.remove(manager); |
| 695 |
if (manager != null) { |
|
|
| 696 |
manager.removeMenuListener(visibilityCalculationListener); |
| 697 |
} |
| 698 |
} |
751 |
} |
| 699 |
|
752 |
|
| 700 |
public IContributionItem getContribution(MMenuElement model) { |
753 |
public IContributionItem getContribution(MMenuElement model) { |
| 701 |
return modelToContribution.get(model); |
754 |
return modelToContribution.get(model); |
| 702 |
} |
755 |
} |
|
|
756 |
|
| 757 |
public MMenuElement getMenuElement(IContributionItem item) { |
| 758 |
return contributionToModel.get(item); |
| 759 |
} |
| 760 |
|
| 761 |
public void linkModelToContribution(MMenuElement model, |
| 762 |
IContributionItem item) { |
| 763 |
modelToContribution.put(model, item); |
| 764 |
contributionToModel.put(item, model); |
| 765 |
} |
| 766 |
|
| 767 |
public void clearModelToContribution(MMenuElement model, |
| 768 |
IContributionItem item) { |
| 769 |
modelToContribution.remove(model); |
| 770 |
contributionToModel.remove(item); |
| 771 |
} |
| 772 |
|
| 773 |
public ContributionRecord getContributionRecord(MMenuElement element) { |
| 774 |
return modelContributionToRecord.get(element); |
| 775 |
} |
| 776 |
|
| 777 |
/** |
| 778 |
* @param menuManager |
| 779 |
* @param menuModel |
| 780 |
*/ |
| 781 |
public void reconcileManagerToModel(MenuManager menuManager, MMenu menuModel) { |
| 782 |
List<MMenuElement> modelChildren = menuModel.getChildren(); |
| 783 |
|
| 784 |
HashSet<MOpaqueMenuItem> oldModelItems = new HashSet<MOpaqueMenuItem>(); |
| 785 |
HashSet<MOpaqueMenu> oldMenus = new HashSet<MOpaqueMenu>(); |
| 786 |
HashSet<MOpaqueMenuSeparator> oldSeps = new HashSet<MOpaqueMenuSeparator>(); |
| 787 |
for (MMenuElement itemModel : modelChildren) { |
| 788 |
if (itemModel instanceof MOpaqueMenuSeparator) { |
| 789 |
oldSeps.add((MOpaqueMenuSeparator) itemModel); |
| 790 |
} else if (itemModel instanceof MOpaqueMenuItem) { |
| 791 |
oldModelItems.add((MOpaqueMenuItem) itemModel); |
| 792 |
} else if (itemModel instanceof MOpaqueMenu) { |
| 793 |
oldMenus.add((MOpaqueMenu) itemModel); |
| 794 |
} |
| 795 |
} |
| 796 |
|
| 797 |
IContributionItem[] items = menuManager.getItems(); |
| 798 |
for (int src = 0, dest = 0; src < items.length; src++, dest++) { |
| 799 |
IContributionItem item = items[src]; |
| 800 |
if (item instanceof MenuManager) { |
| 801 |
MenuManager childManager = (MenuManager) item; |
| 802 |
MMenu childModel = getMenuModel(childManager); |
| 803 |
if (childModel == null) { |
| 804 |
MMenu legacyModel = MenuFactoryImpl.eINSTANCE |
| 805 |
.createOpaqueMenu(); |
| 806 |
legacyModel.setElementId(childManager.getId()); |
| 807 |
legacyModel.setVisible(childManager.isVisible()); |
| 808 |
linkModelToManager(legacyModel, childManager); |
| 809 |
modelChildren.add(dest, legacyModel); |
| 810 |
} else { |
| 811 |
if (childModel instanceof MOpaqueMenu) { |
| 812 |
oldMenus.remove(childModel); |
| 813 |
} |
| 814 |
if (modelChildren.size() > dest) { |
| 815 |
if (modelChildren.get(dest) != childModel) { |
| 816 |
modelChildren.remove(childModel); |
| 817 |
modelChildren.add(dest, childModel); |
| 818 |
} |
| 819 |
} else { |
| 820 |
modelChildren.add(childModel); |
| 821 |
} |
| 822 |
} |
| 823 |
} else if (item.isSeparator() || item.isGroupMarker()) { |
| 824 |
MMenuElement menuElement = getMenuElement(item); |
| 825 |
if (menuElement == null) { |
| 826 |
MOpaqueMenuSeparator legacySep = MenuFactoryImpl.eINSTANCE |
| 827 |
.createOpaqueMenuSeparator(); |
| 828 |
legacySep.setElementId(item.getId()); |
| 829 |
legacySep.setVisible(item.isVisible()); |
| 830 |
legacySep.setOpaqueItem(item); |
| 831 |
linkModelToContribution(legacySep, item); |
| 832 |
modelChildren.add(dest, legacySep); |
| 833 |
} else if (menuElement instanceof MOpaqueMenuSeparator) { |
| 834 |
MOpaqueMenuSeparator legacySep = (MOpaqueMenuSeparator) menuElement; |
| 835 |
oldSeps.remove(legacySep); |
| 836 |
if (modelChildren.size() > dest) { |
| 837 |
if (modelChildren.get(dest) != legacySep) { |
| 838 |
modelChildren.remove(legacySep); |
| 839 |
modelChildren.add(dest, legacySep); |
| 840 |
} |
| 841 |
} else { |
| 842 |
modelChildren.add(legacySep); |
| 843 |
} |
| 844 |
} |
| 845 |
} else { |
| 846 |
MMenuElement menuElement = getMenuElement(item); |
| 847 |
if (menuElement == null) { |
| 848 |
MOpaqueMenuItem legacyItem = MenuFactoryImpl.eINSTANCE |
| 849 |
.createOpaqueMenuItem(); |
| 850 |
legacyItem.setElementId(item.getId()); |
| 851 |
legacyItem.setVisible(item.isVisible()); |
| 852 |
legacyItem.setOpaqueItem(item); |
| 853 |
linkModelToContribution(legacyItem, item); |
| 854 |
modelChildren.add(dest, legacyItem); |
| 855 |
} else if (menuElement instanceof MOpaqueMenuItem) { |
| 856 |
MOpaqueMenuItem legacyItem = (MOpaqueMenuItem) menuElement; |
| 857 |
oldModelItems.remove(legacyItem); |
| 858 |
if (modelChildren.size() > dest) { |
| 859 |
if (modelChildren.get(dest) != legacyItem) { |
| 860 |
modelChildren.remove(legacyItem); |
| 861 |
modelChildren.add(dest, legacyItem); |
| 862 |
} |
| 863 |
} else { |
| 864 |
modelChildren.add(legacyItem); |
| 865 |
} |
| 866 |
} |
| 867 |
} |
| 868 |
} |
| 869 |
if (!oldModelItems.isEmpty()) { |
| 870 |
modelChildren.removeAll(oldModelItems); |
| 871 |
for (MOpaqueMenuItem model : oldModelItems) { |
| 872 |
clearModelToContribution(model, |
| 873 |
(IContributionItem) model.getOpaqueItem()); |
| 874 |
} |
| 875 |
} |
| 876 |
if (!oldMenus.isEmpty()) { |
| 877 |
modelChildren.removeAll(oldMenus); |
| 878 |
for (MOpaqueMenu oldMenu : oldMenus) { |
| 879 |
MenuManager oldManager = getManager(oldMenu); |
| 880 |
clearModelToManager(oldMenu, oldManager); |
| 881 |
} |
| 882 |
} |
| 883 |
if (!oldSeps.isEmpty()) { |
| 884 |
modelChildren.removeAll(oldSeps); |
| 885 |
for (MOpaqueMenuSeparator model : oldSeps) { |
| 886 |
clearModelToContribution(model, |
| 887 |
(IContributionItem) model.getOpaqueItem()); |
| 888 |
} |
| 889 |
} |
| 890 |
} |
| 891 |
|
| 892 |
/** |
| 893 |
* @param menuManager |
| 894 |
* @param element |
| 895 |
* @param evalContext |
| 896 |
*/ |
| 897 |
public static void updateVisibility(MenuManager menuManager, |
| 898 |
MMenuElement element, ExpressionContext evalContext) { |
| 899 |
if (!(element.getVisibleWhen() instanceof MCoreExpression)) { |
| 900 |
return; |
| 901 |
} |
| 902 |
boolean val = ContributionsAnalyzer.isVisible( |
| 903 |
(MCoreExpression) element.getVisibleWhen(), evalContext); |
| 904 |
if (val != element.isVisible()) { |
| 905 |
element.setVisible(val); |
| 906 |
menuManager.markDirty(); |
| 907 |
} |
| 908 |
} |
| 703 |
} |
909 |
} |