/*
* 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.diagram.ui.pakkage.actions;
import java.util.List;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPart;
import org.teiid.core.designer.util.I18nUtil;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.diagram.ui.actions.DiagramAction;
import org.teiid.designer.diagram.ui.editor.DiagramEditor;
import org.teiid.designer.diagram.ui.model.DiagramModelNode;
import org.teiid.designer.diagram.ui.util.directedit.DirectEditPart;
import org.teiid.designer.ui.UiConstants;
import org.teiid.designer.ui.common.eventsupport.SelectionUtilities;
import org.teiid.designer.ui.common.util.WidgetFactory;
import org.teiid.designer.ui.common.widget.Dialog;
import org.teiid.designer.ui.viewsupport.ModelObjectUtilities;
/**
* @since 8.0
*/
public class RenameAction extends DiagramAction implements UiConstants {
private static final String I18N_PREFIX = I18nUtil.getPropertyPrefix(RenameAction.class);
private static final String RENAME_LABEL_ID = "renameLabel"; //$NON-NLS-1$
private static final String DIALOG_TITLE = getString("dialogTitle"); //$NON-NLS-1$
private DiagramEditor diagramEditor;
/**
* @since 4.0
*/
private static String getString( final String id ) {
return Util.getString(I18N_PREFIX + id);
}
/**
* @since 4.0
*/
static String getString( final String id,
final Object parameter ) {
return Util.getString(I18N_PREFIX + id, parameter);
}
String name;
private EAttribute nameAttr;
/**
* @since 4.0
*/
public RenameAction() {
super();
}
/**
* @see org.eclipse.jface.action.Action#run()
* @since 4.0
*/
@Override
protected void doRun() {
final EObject obj = (EObject)getSelectedObject();
boolean wasRenamed = false;
// We need to:
// 1) get the current diagram editor
// 2) using the selected object, get the edit part for it
// 3) and call it's rename.....
if (diagramEditor != null) {
List seps = diagramEditor.getDiagramViewer().getSelectedEditParts();
if (seps != null && !seps.isEmpty() && seps.size() == 1) {
EditPart ep = (EditPart)seps.get(0);
if (ep instanceof DirectEditPart && ((DiagramModelNode)ep.getModel()).getModelObject() == obj) {
((DirectEditPart)ep).performDirectEdit();
wasRenamed = true;
}
}
}
if (!wasRenamed) renameWithDialog();
}
private void renameWithDialog() {
final EObject obj = (EObject)getSelectedObject();
String existingName = ModelerCore.getModelEditor().getName(obj);
if (existingName != null) {
final String oldName = existingName;
final Dialog dlg = new Dialog(Display.getDefault().getActiveShell(), DIALOG_TITLE) {
@Override
protected Control createDialogArea( final Composite parent ) {
final Composite dlgPanel = (Composite)super.createDialogArea(parent);
WidgetFactory.createLabel(dlgPanel, getString(RENAME_LABEL_ID, oldName));
final Text nameText = WidgetFactory.createTextField(dlgPanel, GridData.FILL_HORIZONTAL, oldName);
nameText.setSelection(0, oldName.length());
nameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText( final ModifyEvent event ) {
handleModifyText(nameText);
}
});
return dlgPanel;
}
@Override
protected void createButtonsForButtonBar( final Composite parent ) {
super.createButtonsForButtonBar(parent);
getButton(IDialogConstants.OK_ID).setEnabled(false);
}
void handleModifyText( Text nameText ) {
final String newName = nameText.getText();
final boolean valid = (newName.length() > 0 && !newName.equals(oldName));
getButton(IDialogConstants.OK_ID).setEnabled(valid);
if (valid) {
name = nameText.getText();
}
}
};
if (dlg.open() == Window.OK) {
ModelObjectUtilities.rename(obj, this.name, this);
}
}
}
/**
* @see org.eclipse.ui.ISelectionListener#selectionChanged(IWorkbenchPart, ISelection)
* @since 4.0
*/
@Override
public void selectionChanged( final IWorkbenchPart part,
final ISelection selection ) {
super.selectionChanged(part, selection);
determineEnablement();
}
/**
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged( SelectionChangedEvent theEvent ) {
super.selectionChanged(theEvent);
determineEnablement();
}
/**
* @since 4.0
*/
protected EAttribute getNameAttribute() {
return this.nameAttr;
}
/**
* @since 4.0
*/
protected void determineEnablement() {
boolean enable = false;
if (!isEmptySelection() && !isReadOnly() && canLegallyEditResource()) {
if (SelectionUtilities.isSingleSelection(getSelection())) {
final EObject eObj = SelectionUtilities.getSelectedEObject(getSelection());
if (eObj != null) {
enable = (ModelerCore.getModelEditor().hasName(eObj) && ModelerCore.getModelEditor().getName(eObj) != null);
}
}
}
setEnabled(enable);
}
/**
* @see org.teiid.designer.ui.actions.ModelObjectAction#requiresEditorForRun()
*/
@Override
protected boolean requiresEditorForRun() {
return true;
}
/**
* @param editor
*/
public void setDiagramEditor( DiagramEditor editor ) {
diagramEditor = editor;
}
}