package com.hundsun.ares.studio.ui.editor.actions;
import java.util.Collection;
import java.util.EventObject;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.common.command.UnexecutableCommand;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.PasteFromClipboardCommand;
import org.eclipse.emf.edit.ui.action.PasteAction;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchPart;
/**
* Jres�Ƚ�ͨ�õ�PasteAction.
* ��EMF�����PasteAction��ͬ���ǣ����ڴ���paste Commandd��ʱ��ֱ��ʹ��Viewer��input��ΪOwner��
* ����������Щģ�ͱ����нṹ����������������Action.
* @author sundl
*/
public abstract class JresPasteAction extends PasteAction {
private static final Logger logger = Logger.getLogger(JresPasteAction.class);
protected IWorkbenchPart part;
@Override
public Command createCommand(Collection<?> selection) {
if (selection.size() == 1) {
return PasteFromClipboardCommand.create(domain, getOwner(selection), getFeature());
} else {
return UnexecutableCommand.INSTANCE;
}
}
/**
* @since 2.1.0
*/
public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart) {
this.part = workbenchPart;
super.setActiveWorkbenchPart(workbenchPart);
// Paste Action�Ŀ����Բ�����Selection�йأ�����CommandStack�йأ���Ϊ���Ƶĸı�Ҳ��Ӱ��ճ���Ƿ����
if (domain != null) {
domain.getCommandStack().addCommandStackListener(new CommandStackListener() {
@Override
public void commandStackChanged(EventObject event) {
selectionChanged(getStructuredSelection());
logger.debug("Command stack changed, update action enablement... Class: [" + JresPasteAction.this.getClass().getSimpleName() + "] " + isEnabled());
}
});
}
}
protected ColumnViewer getColumnViewer() {
ISelectionProvider selectionProvider = part.getSite().getSelectionProvider();
if (selectionProvider instanceof ColumnViewer) {
return (ColumnViewer) selectionProvider;
}
return null;
}
@Override
public boolean updateSelection(IStructuredSelection selection) {
boolean enabled = super.updateSelection(selection);
logger.debug("Paste action selection changed: [" + this.getClass().getSimpleName() + "] " + enabled);
return enabled;
}
/**
* ��ȡճ����ʱ��ʹ�õ�Owner��
* Ĭ�ϵĹ���Ϊ��
* ���SelectionProvider��һ��Viewer�������Viewer��Input��
* ����selection����
* @param selection
* @return
*/
protected Object getOwner(Collection<?> selection) {
Object sel = selection.iterator().next();
if (sel instanceof EObject) {
return ((EObject) sel).eContainer();
}
return sel;
}
/**
* ��ȡճ����ʱ��ʹ�õ�Feature,Ĭ�Ϸ���null������EMF�Լ��ж�Ӧ��ճ�����ĸ�Feature.
* ������������Ըı�Command�Ŀ�����(�������������һ��feature����ʵ���ϼ��а��е�������ճ�������feature��command�����)
* @return
*/
protected Object getFeature() {
return null;
}
}