blob: 2ff97108aa8746fa2e9fde09eb7763a35856402b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others.
* 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:
* Soyatec - initial API and implementation
*******************************************************************************/
package org.eclipse.xwt.tools.ui.designer.editor.actions;
import java.util.List;
import org.eclipse.xwt.IConstants;
import org.eclipse.xwt.XWT;
import org.eclipse.xwt.metadata.IMetaclass;
import org.eclipse.xwt.metadata.IProperty;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.xwt.tools.ui.designer.core.editor.EditDomain;
import org.eclipse.xwt.tools.ui.designer.dialogs.TextValueDialog;
import org.eclipse.xwt.tools.ui.designer.utils.XWTUtility;
import org.eclipse.xwt.tools.ui.xaml.XamlAttribute;
import org.eclipse.xwt.tools.ui.xaml.XamlElement;
import org.eclipse.xwt.tools.ui.xaml.XamlFactory;
/**
* @author jliu jin.liu@soyatec.com
*/
public class ChangeTextAction extends SelectionAction {
public static final String ID = "org.eclipse.xwt.tools.ui.designer.editor.actions.ChageTextAction";
public ChangeTextAction(IWorkbenchPart part) {
super(part);
setText("Change Text");
setId(ID);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#run()
*/
public void run() {
EditPart editPart = (EditPart) getSelectedObjects().get(0);
Object model = editPart.getModel();
if (model instanceof XamlElement) {
// Check text property of a control is or not exist.
XamlElement element = (XamlElement) model;
if (element == null) {
return;
}
String name = element.getName();
if (name == null || name.equals("")) {
return;
}
String namespace = element.getNamespace();
IMetaclass metaclass = XWT.getMetaclass(Character.toUpperCase(name.charAt(0)) + name.substring(1), namespace);
IProperty property = metaclass.findProperty("text");
if (property == null) {
return;
}
XamlAttribute attribute = element.getAttribute("text");
boolean isNew = false;
if (attribute == null) {
attribute = XamlFactory.eINSTANCE.createAttribute("text", IConstants.XWT_NAMESPACE);
isNew = true;
}
String oldValue = attribute.getValue() != null ? attribute.getValue().toString() : null;
TextValueDialog dialog = new TextValueDialog(new Shell(), oldValue);
dialog.create();
dialog.getShell().setText("Set New Text");
dialog.setTitle("New Text");
dialog.setMessage("Input a new text value.");
if (dialog.open() == Window.OK) {
String newValue = dialog.getNewValue();
Command cmd = createCommand((XamlElement) model, attribute, isNew, oldValue, newValue);
EditDomain.getEditDomain(editPart).getCommandStack().execute(cmd);
}
}
}
private Command createCommand(final XamlElement element, final XamlAttribute attribute, final boolean isNew, final String oldValue, final String newValue) {
Command command = new Command() {
public void execute() {
attribute.setValue(newValue);
if (isNew) {
element.getAttributes().add(attribute);
}
}
public void undo() {
attribute.setValue(oldValue);
if (isNew) {
element.getAttributes().add(attribute);
}
}
};
command.setLabel("Set Text");
return command;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.actions.WorkbenchPartAction#calculateEnabled()
*/
protected boolean calculateEnabled() {
List<?> selectedObjects = getSelectedObjects();
if (selectedObjects.size() != 1) {
return false;
}
Object object = selectedObjects.get(0);
if (!(object instanceof EditPart) || !(((EditPart) object).getModel() instanceof XamlElement)) {
return false;
}
XamlElement element = (XamlElement) ((EditPart) object).getModel();
IMetaclass metaclass = XWTUtility.getMetaclass(element);
if (metaclass == null || metaclass.findProperty("text") == null) {
return false;
}
return true;
}
}