package kr.co.apexsoft.stella.modeler.explorer.actionprovider; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.facet.infra.browser.uicore.internal.model.ModelElementItem; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.papyrus.infra.onefile.model.IPapyrusFile; import org.eclipse.papyrus.infra.onefile.model.impl.PapyrusFile; import org.eclipse.papyrus.infra.services.controlmode.util.ControlModeUtil; import org.eclipse.ui.IActionBars; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionContext; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.actions.RenameResourceAction; import org.eclipse.ui.navigator.CommonActionProvider; import org.eclipse.ui.navigator.ICommonActionExtensionSite; import org.eclipse.ui.navigator.ICommonMenuConstants; import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite; public class RenameControlledFileActionProvider extends CommonActionProvider { private boolean fInViewPart = false; private ICommonViewerWorkbenchSite workbenchSite; private Action renameAction; public RenameControlledFileActionProvider() { } @Override public void fillActionBars(IActionBars actionBars) { if(fInViewPart) { if (renameAction.isEnabled()) { actionBars.setGlobalActionHandler(ActionFactory.RENAME.getId(), renameAction); } } super.fillActionBars(actionBars); } @Override public void fillContextMenu(IMenuManager menu) { super.fillContextMenu(menu); appendToGroup(menu, renameAction, ICommonMenuConstants.GROUP_ADDITIONS); } private void appendToGroup(IMenuManager menu, IAction action, String id) { if(action != null && action.isEnabled()) { menu.appendToGroup(id, action); } } @Override public void init(ICommonActionExtensionSite site) { if(site.getViewSite() instanceof ICommonViewerWorkbenchSite) { workbenchSite = (ICommonViewerWorkbenchSite)site.getViewSite(); } if(workbenchSite != null) { if(workbenchSite.getPart() != null && workbenchSite.getPart() instanceof IViewPart) { fInViewPart = true; } makeActions(); } } private void makeActions() { final IWorkbenchPartSite provider = workbenchSite.getSite(); final ActionHelper helper = new ActionHelper(); renameAction = new RenameResourceAction(provider) { @Override public IStructuredSelection getStructuredSelection() { return new StructuredSelection(helper.getSelectedElements(getContext())); } @Override protected List getSelectedResources() { // helper 에 해당 controlled 패키지에서 di 파일셋을 가져오도록 구현 return helper.getRelatedResources(getContext()); } @Override public boolean isEnabled() { boolean enabled = false; List<Object> element = helper.getSelectedElements(getContext()); if ( super.isEnabled() && element.size() == 1 ) { Object obj = element.get(0); if ( isControlled(obj) ) { enabled = true; } } return enabled; } }; } public boolean isControlled(Object toTest) { boolean result = false; if ( toTest instanceof ModelElementItem ) { ModelElementItem aMitem = (ModelElementItem)toTest; EObject eObj = aMitem.getEObject(); result = ControlModeUtil.canUncontrol(eObj); } return result; } protected void makeAction(Action action, String id, String imgTool, String imgToolDisabled) { if(action != null) { ISharedImages images = PlatformUI.getWorkbench().getSharedImages(); if(id != null) { action.setId(id); action.setActionDefinitionId(id); } if(imgTool != null) { action.setImageDescriptor(images.getImageDescriptor(imgTool)); } if(imgToolDisabled != null) { action.setDisabledImageDescriptor(images.getImageDescriptor(imgToolDisabled)); } } } public static class ActionHelper { // public IStructuredSelection getStructuredSelection(ActionContext context) { // return new StructuredSelection(getSelectedResources(context)); // } /** * 선택된 패키지가 Control되어 생성된 3가지 papyrus file(di, uml, notation) list 반환 * * @param context * @return */ public List getRelatedResources(ActionContext context) { List result = new ArrayList(); List<Object> elements = getSelectedElements(context); if ( elements.size() == 1 ) { Object obj = elements.get(0); EObject eObj = ((ModelElementItem)obj).getEObject(); String resourcePath = ResourcesPlugin.getWorkspace().getRoot().getLocation().toString(); String platformRelativePath = eObj.eResource().getURI().toPlatformString(true); String umlFilePath = resourcePath.concat(platformRelativePath); IFile controlledUMLFile = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(umlFilePath)); IPapyrusFile papyrusFile = new PapyrusFile(controlledUMLFile); for ( IResource res : papyrusFile.getAssociatedResources() ) { result.add(res); } } return result; } // // protected List getSelectedResources(ActionContext context) { // ISelection selec = context.getSelection(); // List<IResource> resources = new ArrayList<IResource>(); // if(selec instanceof IStructuredSelection) { // IStructuredSelection struc = (IStructuredSelection)selec; // for(Iterator<Object> i = struc.iterator(); i.hasNext();) { // Object o = i.next(); // if(o instanceof IWorkspaceRoot == false && o instanceof IResource == true) { // IResource res = (IResource)o; // resources.add(res); // } // } // } // return resources; // } public List<Object> getSelectedElements(ActionContext context) { ISelection selec = context.getSelection(); List<Object> elements = new ArrayList<Object>(); if(selec instanceof IStructuredSelection) { IStructuredSelection struc = (IStructuredSelection)selec; for(Iterator<Object> i = struc.iterator(); i.hasNext();) { Object o = i.next(); elements.add(o); } } return elements; } } }