/**
*
*/
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);
}
}