/** * */ package com.hundsun.ares.studio.ui.editor.actions; import java.util.List; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.transaction.RecordingCommand; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import com.hundsun.ares.studio.ui.util.ARESEMFClipboard; /** * * ��Ҫ����selection Action�б� * @author gongyf * */ public class ColumnViewerPasteAction extends ColumnViewerAction { protected EObject owner; protected EReference reference; /** * @param viewer * @param editingDomain * @param owner * @param reference */ public ColumnViewerPasteAction(ColumnViewer viewer, EditingDomain editingDomain, EObject owner, EReference reference) { super(viewer, editingDomain); this.owner = owner; this.reference = reference; setText("ճ��"); setEnabled(false); setId(IActionIDConstant.CV_PASTE); ISharedImages sharedImages = PlatformUI.getWorkbench() .getSharedImages(); setImageDescriptor(sharedImages .getImageDescriptor(ISharedImages.IMG_TOOL_PASTE)); setDisabledImageDescriptor(sharedImages .getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED)); } public void setOwner(EObject owner) { this.owner = owner; clearCommand(); } public void setReference(EReference reference) { this.reference = reference; clearCommand(); } /* (non-Javadoc) * @see com.hundsun.ares.studio.jres.ui.actions.ColumnViewerAction#createCommand() */ @Override protected Command createCommand() { if (owner != null && reference != null) { IStructuredSelection selection = (IStructuredSelection)getViewer().getSelection(); return new PasteCommand((TransactionalEditingDomain) getEditingDomain(), owner, reference, selection.getFirstElement()); } return null; } static protected class PasteCommand extends RecordingCommand { protected EObject owner; protected TransactionalEditingDomain domain; protected EReference reference; protected EList<Object> ownerList; protected Object position; /** * @param domain * @param owner * @param reference */ public PasteCommand(TransactionalEditingDomain domain, EObject owner, EReference reference, Object position) { super(domain); this.owner = owner; this.domain = domain; this.reference = reference; this.position = position; if (owner != null || reference != null) { ownerList = getOwnerList(owner, reference); } } static EList<Object> getOwnerList(EObject owner, EStructuralFeature feature) { return owner.eClass().getEAllStructuralFeatures().contains(feature) && feature.isMany() ? (EList<Object>) owner.eGet(feature) : null; } /* (non-Javadoc) * @see org.eclipse.emf.common.command.AbstractCommand#canExecute() */ @Override public boolean canExecute() { if (ownerList == null) { return false; } if (domain.isReadOnly(owner.eResource())) { return false; } List<EObject> eObjects = getCopyedObjects(); return !eObjects.isEmpty(); } /* (non-Javadoc) * @see org.eclipse.emf.transaction.RecordingCommand#doExecute() */ @Override protected void doExecute() { List<EObject> eObjects = getCopyedObjects(); if (position != null && ownerList.contains(position)) { ownerList.addAll(ownerList.indexOf(position)+1, eObjects); } else { ownerList.addAll(eObjects); } } protected List<EObject> getCopyedObjects() { return (List<EObject>) ARESEMFClipboard.getInstance().pasteFromClipboard(reference.getEReferenceType().getInstanceClass()); } } }