4

I've got a toolbar item with its own icon, defined in the plugin.xml file like:

<action
class="MyActionClass"
id="MyActionID"
label="MyActionLabel"
menubarPath="MyActionMenuBarPath"
toolbarPath="MyActionToolBarPath"
icon="icon/myicon.png" <---- this one
     ...
</action>

How do I change this dynamically when needed? I mean changing it from code

Brendan Long
  • 53,280
  • 21
  • 146
  • 188
Marco A.
  • 43,032
  • 26
  • 132
  • 246

2 Answers2

5

Use org.eclipse.ui.menus extension point instead and add menuContribution with dynamic. The class of dynamic should subclass ControlContribution and implement createControl method to create a button.

Martti Käärik
  • 3,601
  • 18
  • 28
3

You should implements IElementUpdater in your Handler class.
Please refer to : https://stackoverflow.com/a/23742598/2893073

  1. Handler class

    import java.util.Map;    
    import org.eclipse.core.commands.AbstractHandler;
    import org.eclipse.core.commands.ExecutionEvent;
    import org.eclipse.core.commands.ExecutionException;
    import org.eclipse.jface.resource.ImageDescriptor;
    import org.eclipse.ui.commands.IElementUpdater;
    import org.eclipse.ui.menus.UIElement;    
    import com.packpub.e4.menu.Activator;     
    public class SampleHandler2 extends 
                 AbstractHandler implements IElementUpdater{       
        private static ImageDescriptor image_enable = 
            Activator.getImageDescriptor("icons/btn_adapt_enable.png");
        private static ImageDescriptor image_disable = 
            Activator.getImageDescriptor("icons/btn_adapt_disable.png");        
        /**
         * The constructor.
         */
        public SampleHandler2() {
    
        }    
        /**
         * the command has been executed, so extract extract the needed information
         * from the application context.
         */
        public Object execute(ExecutionEvent event) throws ExecutionException {
            //...
            return null;
        }    
        @Override
        public void updateElement(UIElement element, @SuppressWarnings("rawtypes") Map map) {
            boolean condition = false;            
            //...            
            if( condition ) { 
                element.setIcon(image_disable);
            }else{
                element.setIcon(image_enable);
            }        
        }
    }
    
  2. invoke this Handler using ICommandService:

        IWorkbenchWindow window = part.getSite().getWorkbenchWindow();
        ICommandService commandService = (ICommandService) window.getService(ICommandService.class);
        if (commandService != null) {
            commandService.refreshElements("com.packpub.e4.menu.commands.sampleCommand", null);
        }
    

Thanks.

Community
  • 1
  • 1
Eddy
  • 3,623
  • 37
  • 44