diff options
Diffstat (limited to 'plugins/infra/ui/org.eclipse.papyrus.infra.onefile.ui/src/org/eclipse/papyrus/infra/onefile/internal/ui/providers/PapyrusModelActionProvider.java')
-rw-r--r-- | plugins/infra/ui/org.eclipse.papyrus.infra.onefile.ui/src/org/eclipse/papyrus/infra/onefile/internal/ui/providers/PapyrusModelActionProvider.java | 479 |
1 files changed, 479 insertions, 0 deletions
diff --git a/plugins/infra/ui/org.eclipse.papyrus.infra.onefile.ui/src/org/eclipse/papyrus/infra/onefile/internal/ui/providers/PapyrusModelActionProvider.java b/plugins/infra/ui/org.eclipse.papyrus.infra.onefile.ui/src/org/eclipse/papyrus/infra/onefile/internal/ui/providers/PapyrusModelActionProvider.java new file mode 100644 index 00000000000..626e22efcc1 --- /dev/null +++ b/plugins/infra/ui/org.eclipse.papyrus.infra.onefile.ui/src/org/eclipse/papyrus/infra/onefile/internal/ui/providers/PapyrusModelActionProvider.java @@ -0,0 +1,479 @@ +/***************************************************************************** + * Copyright (c) 2011 Atos Origin Integration - CEA LIST. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tristan Faure (Atos Origin Integration) tristan.faure@atosorigin.com - Initial API and implementation + * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr + * Benoit Maggi (CEA LIST) benoit.maggi@cea.fr - Add copy Action + *****************************************************************************/ +package org.eclipse.papyrus.infra.onefile.internal.ui.providers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +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.jface.wizard.IWizardPage; +import org.eclipse.ltk.core.refactoring.RefactoringStatus; +import org.eclipse.ltk.internal.core.refactoring.resource.RenameResourceProcessor; +import org.eclipse.ltk.internal.ui.refactoring.RefactoringUIMessages; +import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation; +import org.eclipse.ltk.ui.refactoring.UserInputWizardPage; +import org.eclipse.ltk.ui.refactoring.resource.RenameResourceWizard; +import org.eclipse.papyrus.infra.onefile.internal.ui.Activator; +import org.eclipse.papyrus.infra.onefile.model.IPapyrusFile; +import org.eclipse.papyrus.infra.onefile.utils.OneFileUtils; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWorkbenchCommandConstants; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPartSite; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.WorkbenchException; +import org.eclipse.ui.actions.ActionContext; +import org.eclipse.ui.actions.ActionFactory; +import org.eclipse.ui.actions.DeleteResourceAction; +import org.eclipse.ui.actions.MoveResourceAction; +import org.eclipse.ui.actions.RefreshAction; +import org.eclipse.ui.actions.RenameResourceAction; +import org.eclipse.ui.internal.ide.IDEWorkbenchMessages; +import org.eclipse.ui.navigator.CommonActionProvider; +import org.eclipse.ui.navigator.ICommonActionConstants; +import org.eclipse.ui.navigator.ICommonActionExtensionSite; +import org.eclipse.ui.navigator.ICommonMenuConstants; +import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite; +import org.eclipse.ui.part.FileEditorInput; + +/** + * Actions available through an {@link IPapyrusFile} + * + * @author tfaure + * + */ +@SuppressWarnings({ "restriction", "rawtypes" }) +public class PapyrusModelActionProvider extends CommonActionProvider { + + private boolean fInViewPart = false; + + private ICommonViewerWorkbenchSite workbenchSite; + + private Action openAction; + + private Action deleteAction; + + private Action copyAction; + + private Action renameAction; + + private Action refreshAction; + + private Action moveAction; + + public PapyrusModelActionProvider() { + + } + + @Override + protected boolean filterAction(IAction action) { + return super.filterAction(action); + } + + @Override + public void fillActionBars(IActionBars actionBars) { + if (fInViewPart) { + actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openAction); + actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction); + actionBars.setGlobalActionHandler(ActionFactory.RENAME.getId(), renameAction); + actionBars.setGlobalActionHandler(ActionFactory.MOVE.getId(), moveAction); + actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction); + actionBars.setGlobalActionHandler(ActionFactory.REFRESH.getId(), refreshAction); + } + super.fillActionBars(actionBars); + } + + @Override + public void fillContextMenu(IMenuManager menu) { + super.fillContextMenu(menu); + appendToGroup(menu, openAction, ICommonMenuConstants.GROUP_OPEN); + appendToGroup(menu, deleteAction, ICommonMenuConstants.GROUP_EDIT); + appendToGroup(menu, moveAction, ICommonMenuConstants.GROUP_EDIT); + appendToGroup(menu, copyAction, ICommonMenuConstants.GROUP_EDIT); + appendToGroup(menu, renameAction, ICommonMenuConstants.GROUP_EDIT); + appendToGroup(menu, refreshAction, ICommonMenuConstants.GROUP_EDIT); + } + + 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(); + openAction = new Action() { + + @Override + public void run() { + if (getIFile() != null) { + try { + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + page.openEditor(new FileEditorInput(getIFile()), "org.eclipse.papyrus.infra.core.papyrusEditor", true, IWorkbenchPage.MATCH_ID | IWorkbenchPage.MATCH_INPUT); + } catch (WorkbenchException e) { + Activator.log.error(e); + } + } + } + + public IFile getIFile() { + return helper.getIFile(getContext()); + } + + @Override + public boolean isEnabled() { + return getIFile() != null; + } + + @Override + public String getText() { + return IDEWorkbenchMessages.OpenFileAction_text; + } + }; + + deleteAction = new DeleteResourceAction(provider) { + + @Override + public boolean isEnabled() { + return getSelectedResources() != null && getSelectedResources().size() > 0 && OneFileUtils.isDi((IResource) getSelectedResources().get(0)); + + } + + @Override + public IStructuredSelection getStructuredSelection() { + return helper.getStructuredSelection(getContext()); + } + + @Override + protected List getSelectedResources() { + return helper.getSelectedResources(getContext()); + } + }; + + moveAction = new MoveResourceAction(provider) { + + @Override + public IStructuredSelection getStructuredSelection() { + return helper.getStructuredSelection(getContext()); + } + + @Override + protected List getSelectedResources() { + return helper.getSelectedResources(getContext()); + } + }; + + copyAction = new CopyToClipboardAction(provider) { + + @Override + public IStructuredSelection getStructuredSelection() { + return helper.getStructuredSelection(getContext()); + } + + @Override + protected List getSelectedResources() { + return helper.getSelectedResources(getContext()); + } + + }; + + renameAction = new OneFileRenameAction(provider); + + refreshAction = new RefreshAction(provider) { + + @Override + public void run() { + super.run(); + } + + }; + + makeAction(openAction, ICommonActionConstants.OPEN, ISharedImages.IMG_TOOL_COPY, ISharedImages.IMG_TOOL_COPY_DISABLED); + makeAction(deleteAction, IWorkbenchCommandConstants.EDIT_DELETE, ISharedImages.IMG_TOOL_DELETE, ISharedImages.IMG_TOOL_DELETE_DISABLED); + makeAction(moveAction, ActionFactory.MOVE.getId(), null, null); + makeAction(copyAction, IWorkbenchCommandConstants.EDIT_CUT, ISharedImages.IMG_TOOL_CUT, ISharedImages.IMG_TOOL_CUT_DISABLED); + makeAction(copyAction, IWorkbenchCommandConstants.EDIT_COPY, ISharedImages.IMG_TOOL_COPY, ISharedImages.IMG_TOOL_COPY_DISABLED); + makeAction(refreshAction, ActionFactory.REFRESH.getCommandId(), null, null); + } + + /** + * A Rename action applying to an IPapyrusFile + * The action will rename only the *.di file + * (Refactoring from infra.ui.resources will rename related files and fix URIs) + * + * The user won't be asked for a file extension (*.di will be kept) + * + * @author Camille Letavernier + */ + public class OneFileRenameAction extends RenameResourceAction { + + final ActionHelper helper = new ActionHelper(); + + private IWorkbenchPartSite partSiteProvider; + + public OneFileRenameAction(IWorkbenchPartSite provider) { + super(provider); + this.partSiteProvider = provider; + } + + private Shell getShell() { + return partSiteProvider.getShell(); + } + + @Override + public void run() { + + ISelection selection = partSiteProvider.getSelectionProvider().getSelection(); + + if (selection instanceof IStructuredSelection) { + IStructuredSelection structuredSelection = (IStructuredSelection) selection; + if (structuredSelection.size() != 1) { + return; + } + + Object selectedElement = structuredSelection.getFirstElement(); + if (selectedElement instanceof IPapyrusFile) { + IPapyrusFile modelToRename = (IPapyrusFile) selectedElement; + + RenamePapyrusModelWizard refactoringWizard = new RenamePapyrusModelWizard(modelToRename); + RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(refactoringWizard); + try { + op.run(getShell(), RefactoringUIMessages.RenameResourceHandler_title); + } catch (InterruptedException e) { + // do nothing + } + } + } + } + } + + private static class RenamePapyrusModelWizard extends RenameResourceWizard { + + private IPapyrusFile papyrusFile; + + public RenamePapyrusModelWizard(IPapyrusFile papyrusFile) { + super(papyrusFile.getMainFile()); + this.papyrusFile = papyrusFile; + } + + @Override + protected void addUserInputPages() { + RenameResourceProcessor processor = getRefactoring().getAdapter(RenameResourceProcessor.class); + addPage(new RenamePapyrusModelPage(processor)); + } + + private class RenamePapyrusModelPage extends UserInputWizardPage { + + private final RenameResourceProcessor fRefactoringProcessor; + + private Text fNameField; + + public RenamePapyrusModelPage(RenameResourceProcessor processor) { + super("RenamePapyrusModelRefactoringInputPage"); //$NON-NLS-1$ + fRefactoringProcessor = processor; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) + */ + public void createControl(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + composite.setFont(parent.getFont()); + + Label label = new Label(composite, SWT.NONE); + label.setText(RefactoringUIMessages.RenameResourceWizard_name_field_label); + label.setLayoutData(new GridData()); + + fNameField = new Text(composite, SWT.BORDER); + fNameField.setText(papyrusFile.getMainFile().getFullPath().removeFileExtension().lastSegment()); + fNameField.setFont(composite.getFont()); + fNameField.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false)); + fNameField.addModifyListener(new ModifyListener() { + + public void modifyText(ModifyEvent e) { + validatePage(); + } + }); + + fNameField.selectAll(); + setPageComplete(false); + setControl(composite); + } + + @Override + public void setVisible(boolean visible) { + if (visible) { + fNameField.setFocus(); + } + super.setVisible(visible); + } + + protected final void validatePage() { + String text = fNameField.getText() + ".di"; + RefactoringStatus status = fRefactoringProcessor.validateNewElementName(text); + setPageComplete(status); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ltk.ui.refactoring.UserInputWizardPage#performFinish() + */ + @Override + protected boolean performFinish() { + initializeRefactoring(); + storeSettings(); + return super.performFinish(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ltk.ui.refactoring.UserInputWizardPage#getNextPage() + */ + @Override + public IWizardPage getNextPage() { + initializeRefactoring(); + storeSettings(); + return super.getNextPage(); + } + + private void storeSettings() { + } + + private void initializeRefactoring() { + fRefactoringProcessor.setNewResourceName(fNameField.getText() + ".di"); + } + } + } + + 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)); + } + + public List getOneSelectedResources(ActionContext context) { + List selectedResources = getSelectedResources(context); + if (selectedResources.size() > 0) { + for (Iterator<?> i = selectedResources.iterator(); i.hasNext();) { + Object o = i.next(); + if (o instanceof IFile) { + IFile file = (IFile) o; + if (!OneFileUtils.isDi(file)) { + i.remove(); + } + } + } + return selectedResources; + } + return Collections.EMPTY_LIST; + } + + public IStructuredSelection getOneStructuredSelection(ActionContext context) { + List selectedResources = getOneSelectedResources(context); + if (selectedResources.size() > 0) { + return new StructuredSelection(selectedResources); + } + return null; + } + + 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 IPapyrusFile) { + IPapyrusFile papy = (IPapyrusFile) o; + resources.addAll(Arrays.asList(papy.getAssociatedResources())); + } + } + } + return resources; + } + + public IFile getIFile(ActionContext context) { + ISelection selec = context.getSelection(); + if (selec instanceof IStructuredSelection) { + IStructuredSelection struc = (IStructuredSelection) selec; + Object firstElement = struc.getFirstElement(); + if (firstElement instanceof IFile) { + IFile file = (IFile) firstElement; + return file; + } else if (firstElement instanceof IPapyrusFile) { + return ((IPapyrusFile) firstElement).getMainFile(); + } + } + return null; + } + } + +} |