blob: dbcb180676b9237587e9a71d635845c7f53fbe6b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 TwelveTone LLC 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:
* Steven Spungin <steven@spungin.tv> - initial API and implementation, Ongoing Maintenance
* Olivier Prouvost <olivier.prouvost@opcoach.com> - Bug 466731
*******************************************************************************/
package org.eclipse.e4.tools.emf.ui.internal.common;
import java.util.Arrays;
import java.util.List;
import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor;
import org.eclipse.e4.tools.emf.ui.internal.Messages;
import org.eclipse.e4.tools.emf.ui.internal.ResourceProvider;
import org.eclipse.e4.ui.model.application.MApplicationElement;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.MoveCommand;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
/**
* A PickList for creating a string list. Action include ordering, adding,
* removing, and replacing.
*
* @author Steven Spungin
*
*/
public class E4StringPickList extends AbstractPickList {
private Text text;
private Button tiReplace;
private AbstractComponentEditor editor;
private EStructuralFeature feature;
public E4StringPickList(Composite parent, int flags, List<PickListFeatures> list, Messages messages, AbstractComponentEditor editor, EStructuralFeature feature) {
super(parent, flags, Arrays.asList(PickListFeatures.NO_PICKER), messages, editor);
this.editor = editor;
this.feature = feature;
// TODO does not respect NO_ORDER yet
tiReplace = new Button(getToolBar(), SWT.PUSH);
tiReplace.setToolTipText(messages.E4StringPickList_Replace);
tiReplace.setImage(editor.createImage(ResourceProvider.IMG_Obj16_world_edit));
tiReplace.setFont(getButtonFont());
Composite valueParent = new Composite(getToolBar().getParent(), SWT.BORDER);
valueParent.setLayout(new GridLayout(5, false));
valueParent.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
Label l = new Label(valueParent, SWT.NONE);
l.setText(messages.E4StringPickList_NewValue);
l.setToolTipText(messages.E4StringPickList_ToolTipNewValue);
text = new Text(valueParent, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
text.setToolTipText(messages.E4StringPickList_ToolTipNewValue);
tiReplace.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleReplaceText();
}
});
getList().setContentProvider(new ObservableListContentProvider());
text.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
updateUiState();
}
});
text.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
updateUiState();
}
});
updateUiState();
}
@Override
protected void moveUpPressed() {
if (!viewer.getSelection().isEmpty()) {
IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
if (s.size() == 1) {
Object obj = s.getFirstElement();
Object container = editor.getMaster().getValue();
tryEObjectMove(obj, (EObject) container, -1);
}
}
}
@Override
protected void moveDownPressed() {
if (!viewer.getSelection().isEmpty()) {
IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
if (s.size() == 1) {
Object obj = s.getFirstElement();
Object container = editor.getMaster().getValue();
tryEObjectMove(obj, (EObject) container, 1);
}
}
}
@Override
protected void removePressed() {
if (!viewer.getSelection().isEmpty()) {
List<?> keybinding = ((IStructuredSelection) viewer.getSelection()).toList();
Command cmd = RemoveCommand.create(editor.getEditingDomain(), editor.getMaster().getValue(), feature, keybinding);
if (cmd.canExecute()) {
editor.getEditingDomain().getCommandStack().execute(cmd);
}
}
}
protected void handleReplaceText() {
if (getTextWidget().getText().trim().length() > 0) {
if (!viewer.getSelection().isEmpty()) {
String[] tags = getTextWidget().getText().split(";"); //$NON-NLS-1$
for (int i = 0; i < tags.length; i++) {
tags[i] = tags[i].trim();
}
MApplicationElement appEl = (MApplicationElement) editor.getMaster().getValue();
EObject el = (EObject) editor.getMaster().getValue();
List<?> ids = ((IStructuredSelection) viewer.getSelection()).toList();
Object curVal = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
EObject container = (EObject) editor.getMaster().getValue();
List<?> l = (List<?>) container.eGet(feature);
int idx = l.indexOf(curVal);
if (idx >= 0) {
Command cmdRemove = RemoveCommand.create(editor.getEditingDomain(), el, feature, ids);
Command cmdInsert = AddCommand.create(editor.getEditingDomain(), appEl, feature, Arrays.asList(tags), idx);
if (cmdRemove.canExecute() && cmdInsert.canExecute()) {
editor.getEditingDomain().getCommandStack().execute(cmdRemove);
editor.getEditingDomain().getCommandStack().execute(cmdInsert);
}
getTextWidget().setText(""); //$NON-NLS-1$
}
}
}
}
@Override
public void updateUiState() {
super.updateUiState();
if (text != null) {
IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
Object firstViewerElement = sel.getFirstElement();
String txt = text.getText();
boolean diff = !txt.equals(firstViewerElement);
tiReplace.setEnabled(firstViewerElement != null && !getTextWidget().getText().isEmpty() && diff);
tiAdd.setEnabled(txt.length() > 0 && text.isFocusControl());
}
}
@Override
protected int getItemCount() {
if (viewer.getContentProvider() == null || viewer.getInput() == null) {
return 0;
}
return ((ObservableListContentProvider) viewer.getContentProvider()).getElements(viewer.getInput()).length;
}
protected Button getReplaceWidget() {
return tiReplace;
}
public Text getTextWidget() {
return text;
}
protected void tryEObjectMove(Object obj, EObject container, int delta) {
List<?> l = (List<?>) container.eGet(feature);
int idx = l.indexOf(obj) + delta;
if ((delta > 0 && idx < l.size()) || (delta < 0 && idx >= 0)) {
Command cmd = MoveCommand.create(editor.getEditingDomain(), editor.getMaster().getValue(), feature, obj, idx);
if (cmd.canExecute()) {
editor.getEditingDomain().getCommandStack().execute(cmd);
viewer.setSelection(new StructuredSelection(obj));
}
}
}
}