| /******************************************************************************* |
| * Copyright (c) 2014, 2017 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.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(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)); |
| } |
| } |
| } |
| } |