/** * */ package com.topsun.posclient.application; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.plugin.AbstractUIPlugin; public class ContributionItemActionDescriptor extends ContributionItemDescriptor { // private static final Logger logger = SystemLogFactory.getLogger(ContributionItemActionDescriptor.class); private String toolTipText; private ImageDescriptor imageDescriptor; private int style; private Listener listener; private String keyBinding; private boolean defaultEnable = true; private List<String> enableWhenPartOpened = new ArrayList<String>(); private List<String> enableWhenPartActivated = new ArrayList<String>(); public IContributionItem createItem() { if (text == null && imageDescriptor == null) { return null; } final Action action = new Action(text, style) { public void runWithEvent(Event event) { if (listener != null) { listener.handleEvent(event); } } public void run() { if (listener != null) { listener.handleEvent(null); } } }; action.setId(id); if (text.length() > 4) { action.setText(text.substring(0, 4) + "..."); } if (imageDescriptor != null) { action.setImageDescriptor(imageDescriptor); } action.setToolTipText(toolTipText == null ? text : toolTipText); action.setEnabled(false); IContributionItem item = new ContributionItemAction(action, listener); item.setVisible(isVisible()); PlatformUI.getWorkbench().addWindowListener(new WindowListenerAdaptor() { public void windowOpened(IWorkbenchWindow window) { //bindKey(); setEnableListener(action); // ��ʱ�Ե�listener,����Ϳ���ɾ�� PlatformUI.getWorkbench().removeWindowListener(this); } }); return item; } private void setEnableListener(final IAction action) { if (enableWhenPartOpened.size() == 0 && enableWhenPartActivated.size() == 0) { action.setEnabled(true); return; } WorkbenchUtil.getWorkbenchWindow().getPartService().addPartListener(new IPartListener() { public void partOpened(IWorkbenchPart part) { if (isMatch(enableWhenPartOpened, part)) { action.setEnabled(true); } } public void partActivated(IWorkbenchPart part) { if (isMatch(enableWhenPartActivated, part)) { action.setEnabled(true); } } public void partDeactivated(IWorkbenchPart part) { if (isMatch(enableWhenPartActivated, part)) { action.setEnabled(false); } } public void partClosed(IWorkbenchPart part) { if (isMatch(enableWhenPartOpened, part)) { action.setEnabled(false); } } public void partBroughtToTop(IWorkbenchPart part) { } }); } private boolean isMatch(List<String> partIdPatternList, IWorkbenchPart part) { String partId = part.getSite().getId(); String secondaryId = null; if (part instanceof IViewPart) { secondaryId = ((IViewPart) part).getViewSite().getSecondaryId(); } return isMatch(partIdPatternList, partId, secondaryId); } private boolean isMatch(List<String> partIdPatternList, String partId, String secondaryId) { String partIdToUse = secondaryId != null ? partId + ":" + secondaryId : partId; for (String partIdPattern : partIdPatternList) { int wildcardIdx = partIdPattern.indexOf('*'); if (wildcardIdx < 0) { if (partIdPattern.equals(partIdToUse)) { return true; } } else { String prefix = partIdPattern.substring(0, wildcardIdx); String suffix = partIdPattern.substring(wildcardIdx + 1); if (partIdToUse.startsWith(prefix) && partIdToUse.endsWith(suffix)) { return true; } } } return false; } public void init(IConfigurationElement element) { super.init(element); setDefaultEnable(Boolean.parseBoolean(element.getAttribute("defaultEnable"))); if (element.getAttribute("icon") != null) { setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(element.getDeclaringExtension().getNamespaceIdentifier(), element.getAttribute("icon"))); } setKeyBinding(element.getAttribute("keyBinding")); try { String clazz = element.getAttribute("listener"); if (clazz != null && clazz.trim().length() > 0) setListener((Listener) element.createExecutableExtension("listener")); } catch (Throwable e) { // logger.error(e); } try { setStyle(Integer.parseInt(element.getAttribute("style"))); } catch (NumberFormatException ignored) { } setToolTipText(element.getAttribute("toolTipText")); String partIds = element.getAttribute("enableWhenPartActivated"); if (partIds != null) { addEnableWhenPartActivated(partIds.split(",")); } partIds = element.getAttribute("enableWhenPartOpened"); if (partIds != null) { addEnableWhenPartOpened(partIds.split(",")); } } // ////// // // // // // //////////// public String getToolTipText() { return toolTipText; } public void setToolTipText(String toolTipText) { this.toolTipText = toolTipText; } public ImageDescriptor getImageDescriptor() { return imageDescriptor; } public void setImageDescriptor(ImageDescriptor imageDescriptor) { this.imageDescriptor = imageDescriptor; } public int getStyle() { return style; } public void setStyle(int style) { this.style = style; } public Listener getListener() { return listener; } public void setListener(Listener listener) { this.listener = listener; } public String getKeyBinding() { return keyBinding; } public void setKeyBinding(String keyBinding) { this.keyBinding = keyBinding; } public boolean isDefaultEnable() { return defaultEnable; } public void setDefaultEnable(boolean defaultEnable) { this.defaultEnable = defaultEnable; } public void addEnableWhenPartOpened(String partId) { if (partId == null) { return; } enableWhenPartOpened.add(partId); } public void addEnableWhenPartOpened(String[] partIds) { if (partIds == null) { return; } for (String partId : partIds) { addEnableWhenPartOpened(partId); } } public void removeEnableWhenPartOpened(String partId) { enableWhenPartOpened.remove(partId); } public void addEnableWhenPartActivated(String partId) { if (partId == null) { return; } enableWhenPartActivated.add(partId); } public void addEnableWhenPartActivated(String[] partIds) { if (partIds == null) { return; } for (String partId : partIds) { addEnableWhenPartActivated(partId); } } public void removeEnableWhenPartActivated(String partId) { enableWhenPartActivated.remove(partId); } }