I have an eclipse rcp application (Indigo version 3.7) (eclipse plugin project). And I read the textbook "Eclipse Commands Advanced" (Revision 0.2-2.1, 04.11.2009-24.09.2011) Lars Vogel.
First I created a menu extension using menuContribution with menus and with some commands.
The second I created a team extension with some teams.
Thirdly, I defined the extension of the handlers (handlers with the expression included).
And fourth, I wrote a service extension with a variable.
My plugin.xml looks like this:
<?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.4"?> <plugin> <extension id="application" point="org.eclipse.core.runtime.applications"> ... </extension> <extension point="org.eclipse.ui.perspectives"> ... </extension> <extension id="product" point="org.eclipse.core.runtime.products"> ... </extension> <extension point="org.eclipse.ui.views"> ... </extension> <extension point="org.eclipse.ui.menus"> <menuContribution allPopups="false" locationURI="menu:org.eclipse.ui.main.menu"> <menu id="fileMenuItem" label="File" mnemonic="F"> <command commandId="de.falk.rcp37.drawfigures.commands.new" id="newFileMenuItem" label="New" mnemonic="N" style="push"> </command> <command commandId="de.falk.rcp37.drawfigures.commands.open" id="openFileMenuItem" label="Open..." mnemonic="O" style="push"> </command> <separator name="de.falk.rcp37.drawfigures.menu.file.separator1" visible="true"> </separator> <command commandId="de.falk.rcp37.drawfigures.commands.close" id="closeFileMenuItem" label="Close" mnemonic="C" style="push"> </command> <separator name="de.falk.rcp37.drawfigures.menu.file.separator2" visible="true"> </separator> <command commandId="de.falk.rcp37.drawfigures.commands.save" id="saveFileMenuItem" label="Save" mnemonic="S" style="push"> </command> <command commandId="de.falk.rcp37.drawfigures.commands.saveas" id="saveAsFileMenuItem" label="Save as..." mnemonic="a" style="push"> </command> <separator name="de.falk.rcp37.drawfigures.menu.file.separator3" visible="true"> </separator> <command commandId="de.falk.rcp37.drawfigures.commands.exit" id="exitFileMenuItem" label="Exit" mnemonic="x" style="push"> </command> <command commandId="de.falk.rcp37.drawfigures.commands.change" id="changeFileMenuItem" label="Change" mnemonic="h" style="push"> </command> </menu> </menuContribution> </extension> <extension point="org.eclipse.ui.commands"> <command id="de.falk.rcp37.drawfigures.commands.new" name="newFileCommand"></command> <command id="de.falk.rcp37.drawfigures.commands.open" name="openFileCommand"></command> <command id="de.falk.rcp37.drawfigures.commands.close" name="closeFileCommand"></command> <command id="de.falk.rcp37.drawfigures.commands.save" name="saveFileCommand"></command> <command id="de.falk.rcp37.drawfigures.commands.saveas" name="saveAsFileCommand"></command> <command id="de.falk.rcp37.drawfigures.commands.exit" name="exitFileCommand"></command> <command id="de.falk.rcp37.drawfigures.commands.change" name="changeFileCommand"></command> </extension> <extension point="org.eclipse.ui.handlers"> <handler class="de.falk.rcp37.drawfigures.handler.NewHandler" commandId="de.falk.rcp37.drawfigures.commands.new"></handler> <handler class="de.falk.rcp37.drawfigures.handler.OpenHandler" commandId="de.falk.rcp37.drawfigures.commands.open"></handler> <handler class="de.falk.rcp37.drawfigures.handler.CloseHandler" commandId="de.falk.rcp37.drawfigures.commands.close"> <enabledWhen> <with variable="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.closestate"> <equals value="true"></equals> </with> </enabledWhen> </handler> <handler class="de.falk.rcp37.drawfigures.handler.SaveHandler" commandId="de.falk.rcp37.drawfigures.commands.save"> <enabledWhen> <with variable="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.savestate"> <equals value="true"></equals> </with> </enabledWhen> </handler> <handler class="de.falk.rcp37.drawfigures.handler.SaveAsHandler" commandId="de.falk.rcp37.drawfigures.commands.saveas"> <enabledWhen> <with variable="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.saveasstate"> <equals value="true"></equals> </with> </enabledWhen> </handler> <handler class="de.falk.rcp37.drawfigures.handler.ExitHandler" commandId="de.falk.rcp37.drawfigures.commands.exit"></handler> <handler class="de.falk.rcp37.drawfigures.handler.ChangeHandler" commandId="de.falk.rcp37.drawfigures.commands.change"></handler> </extension> <extension point="org.eclipse.ui.services"> <sourceProvider provider="de.falk.rcp37.drawfigures.miscellaneous.MenuItemsStateSourceProvider"> <variable name="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.closestate" priorityLevel="workbench"></variable> <variable name="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.savestate" priorityLevel="workbench"></variable> <variable name="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.saveasstate" priorityLevel="workbench"></variable> </sourceProvider> </extension> </plugin>
In addition, I implemented MenuItemsStateSourceProvider:
package de.falk.rcp37.drawfigures.miscellaneous; import java.util.HashMap; import java.util.Map; import org.eclipse.ui.AbstractSourceProvider; public class MenuItemsStateSourceProvider extends AbstractSourceProvider { public static final String ID = "de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider"; public static final String DRAWING_CLOSE_STATE = "de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.closestate"; public static final String DRAWING_SAVE_STATE = "de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.savestate"; public static final String DRAWING_SAVEAS_STATE = "de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.saveasstate"; @Override public void dispose() { } @SuppressWarnings("rawtypes") @Override public Map getCurrentState() { HashMap<String, String> hashMap = new HashMap<String, String>(); hashMap.put(ID, ID); hashMap.put(DRAWING_CLOSE_STATE, "false"); hashMap.put(DRAWING_SAVE_STATE, "false"); hashMap.put(DRAWING_SAVEAS_STATE, "false"); return hashMap; } @Override public String[] getProvidedSourceNames() { return new String[] { ID, DRAWING_CLOSE_STATE, DRAWING_SAVE_STATE, DRAWING_SAVEAS_STATE }; } public void setDrawingNewed(boolean drawingNewed) { if (ModelDefinitions.currentDrawing.getNewed() != drawingNewed) { ModelDefinitions.currentDrawing.setNewed(drawingNewed); fireSourceChanged(ISources.WORKBENCH, DRAWING_SAVEAS_STATE, ModelDefinitions.currentDrawing.getSaveAsStateString()); } } public void setDrawingOpend(boolean drawingOpend) { if (ModelDefinitions.currentDrawing.getOpend() != drawingOpend) { ModelDefinitions.currentDrawing.setOpend(drawingOpend); fireSourceChanged(ISources.WORKBENCH, DRAWING_CLOSE_STATE, ModelDefinitions.currentDrawing.getCloseStateString()); fireSourceChanged(ISources.WORKBENCH, DRAWING_SAVE_STATE, ModelDefinitions.currentDrawing.getSaveStateString()); fireSourceChanged(ISources.WORKBENCH, DRAWING_SAVEAS_STATE, ModelDefinitions.currentDrawing.getSaveAsStateString()); } } public void setDrawingChanged(boolean drawingChanged) { if (ModelDefinitions.currentDrawing.getChanged() != drawingChanged) { ModelDefinitions.currentDrawing.setChanged(drawingChanged); fireSourceChanged(ISources.WORKBENCH, DRAWING_SAVE_STATE, ModelDefinitions.currentDrawing.getSaveStateString()); } } }
And another handler:
public class ChangeHandler extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException {
or
public class NewHandler extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException {
etc. (for all handlers) ...
and finally in the Drawing class:
public String getCloseStateString() { return (opend) ? "true" : "false"; } public String getSaveStateString() { return (opend && changed) ? "true" : "false"; } public String getSaveAsStateString() { return (opend || newed) ? "true" : "false"; } public void setNewed(boolean newed) { this.newed = newed; } public void setOpend(boolean opend) { this.opend = opend; } public void setChanged(boolean changed) { this.changed = changed; }
But nothing works! Can anyone help?
Thanks Rumo