/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.ui.navigator.model; import static org.teiid.designer.ui.navigator.model.ModelNavigatorMessages.renameNotSupportedMessage; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.IPath; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.ui.IActionDelegate; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.actions.RenameResourceAction; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.ui.UiConstants; import org.teiid.designer.ui.actions.DelegatableAction; import org.teiid.designer.ui.actions.TreeViewerRenameAction; import org.teiid.designer.ui.common.eventsupport.SelectionUtilities; import org.teiid.designer.ui.common.util.WidgetUtil; import org.teiid.designer.ui.refactor.actions.RenameRefactorAction; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * ModelNavigatorRenameAction is a specialization of ResourceNavigatorRenameAction that also handles in-line renaming of EObjects. * In addition, it prevents renaming of ModelResources that are open in a ModelEditor. */ public class ModelNavigatorRenameAction extends RenameResourceAction implements ISelectionProvider, UiConstants { private final IAction actRefactorRename; private final IActionDelegate delRefactorRename; private final TreeViewerRenameAction inlineRenameAction; private final TreeViewer viewer; /** * Construct an instance of ModelExplorerRenameAction. * * @param shell * @param viewer */ public ModelNavigatorRenameAction( IWorkbenchWindow window, TreeViewer viewer ) { super(window); this.viewer = viewer; // create the TreeViewerRenameAction for inline editing of EObject names this.inlineRenameAction = new TreeViewerRenameAction(); this.inlineRenameAction.setTreeViewer(this.viewer, (ILabelProvider)viewer.getLabelProvider()); this.delRefactorRename = new RenameRefactorAction(); this.actRefactorRename = new DelegatableAction(this.delRefactorRename, window); this.actRefactorRename.setEnabled(false); } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ @Override public void addSelectionChangedListener( ISelectionChangedListener listener ) { throw new RuntimeException("ModelExplorerRenameAction.addSelectionChangedListener is not supported"); //$NON-NLS-1$ } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() */ @Override public ISelection getSelection() { return getStructuredSelection(); } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ @Override public void removeSelectionChangedListener( ISelectionChangedListener listener ) { throw new RuntimeException("ModelExplorerRenameAction.removeSelectionChangedListener is not supported"); //$NON-NLS-1$ } private void renameModelResource( IResource theResource ) { this.delRefactorRename.selectionChanged(this.actRefactorRename, getSelection()); if ((this.actRefactorRename != null) && this.actRefactorRename.isEnabled()) { this.actRefactorRename.run(); } } /** * {@inheritDoc} * * @see org.eclipse.ui.actions.RenameResourceAction#run() */ @Override public void run() { Object selection = getStructuredSelection().getFirstElement(); if (selection instanceof EObject) { // set the selection on the TreeViewerRenameAction and run it this.inlineRenameAction.selectionChanged(new SelectionChangedEvent(this, getStructuredSelection())); this.inlineRenameAction.run(); } else if ((selection instanceof IResource) && ModelerCore.hasModelNature(((IResource)selection).getProject())) { if (selection instanceof IFile) { final IFile file = (IFile)selection; if (ModelUtilities.isModelFile(file)) { renameModelResource(file); } else if (file.getFileExtension() != null && ModelerCore.VDB_FILE_EXTENSION.endsWith(file.getFileExtension().toLowerCase())) { WidgetUtil.showError(renameNotSupportedMessage); } else { super.run(); } } else if (selection instanceof IProject) { renameModelResource((IResource)selection); } else if (selection instanceof IFolder) { renameModelResource((IResource)selection); } else { super.run(); } } else { super.run(); } } /** * {@inheritDoc} * * @see org.eclipse.ui.actions.RenameResourceAction#runWithNewPath(org.eclipse.core.runtime.IPath, * org.eclipse.core.resources.IResource) */ @Override protected void runWithNewPath( IPath path, IResource resource ) { IWorkspaceRoot root = resource.getProject().getWorkspace().getRoot(); super.runWithNewPath(path, resource); if (this.viewer != null) { IResource newResource = root.findMember(path); if (newResource != null) { this.viewer.setSelection(new StructuredSelection(newResource), true); } } } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection) */ @Override public void setSelection( ISelection selection ) { throw new RuntimeException("ModelExplorerRenameAction.setSelection is not supported"); //$NON-NLS-1$ } /** * {@inheritDoc} * * @see org.eclipse.ui.actions.RenameResourceAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection) */ @Override protected boolean updateSelection( IStructuredSelection selection ) { boolean result = SelectionUtilities.isSingleSelection(selection); if (result) { EObject selectedEObject = SelectionUtilities.getSelectedEObject(selection); if (selectedEObject != null) { this.inlineRenameAction.selectionChanged(new SelectionChangedEvent(this, selection)); result = this.inlineRenameAction.isEnabled(); } else { this.delRefactorRename.selectionChanged(this.actRefactorRename, selection); result = this.actRefactorRename.isEnabled(); } } return result; } }