| /******************************************************************************* |
| * Copyright (c) 2009 xored software, Inc. |
| * |
| * 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: |
| * xored software, Inc. - initial API and Implementation (Alex Panchenko) |
| *******************************************************************************/ |
| package org.eclipse.dltk.tcl.internal.ui; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.dltk.tcl.core.packages.TclPackagesFactory; |
| import org.eclipse.dltk.tcl.core.packages.VariableValue; |
| import org.eclipse.dltk.ui.dialogs.IStatusDialog; |
| import org.eclipse.dltk.ui.dialogs.MultipleInputDialog; |
| import org.eclipse.dltk.ui.dialogs.StatusInfo; |
| import org.eclipse.emf.common.util.BasicEMap; |
| import org.eclipse.emf.common.util.EMap; |
| import org.eclipse.emf.ecore.util.EcoreUtil; |
| import org.eclipse.jface.viewers.IBaseLabelProvider; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| 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.jface.window.Window; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.graphics.Font; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| |
| /** |
| * Control used to edit the environment variables associated with a Interpreter |
| * install |
| * |
| * @since 2.0 |
| */ |
| public class GlobalVariableBlock |
| implements SelectionListener, ISelectionChangedListener { |
| |
| private static final String NAME_LABEL = TclInterpreterMessages.GlobalVariableBlock_Name; |
| private static final String VALUE_LABEL = TclInterpreterMessages.GlobalVariableBlock_Value; |
| |
| // widgets |
| protected GlobalVariableContentProvider fContentProvider; |
| protected TreeViewer fVariablesViewer; |
| private Button fRemoveButton; |
| private Button fAddButton; |
| private Button fEditButton; |
| |
| private final IStatusDialog fDialog; |
| |
| public GlobalVariableBlock(IStatusDialog fDialog) { |
| this.fDialog = fDialog; |
| } |
| |
| /** |
| * Creates and returns the source lookup control. |
| * |
| * @param parent |
| * the parent widget of this control |
| */ |
| public void createControlsIn(Composite parent) { |
| Font font = parent.getFont(); |
| |
| fVariablesViewer = new TreeViewer(parent); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| gd.heightHint = 6; |
| fVariablesViewer.getControl().setLayoutData(gd); |
| fContentProvider = new GlobalVariableContentProvider(); |
| fVariablesViewer.setContentProvider(fContentProvider); |
| fVariablesViewer.setLabelProvider(getLabelProvider()); |
| fVariablesViewer.setInput(this); |
| fVariablesViewer.addSelectionChangedListener(this); |
| |
| Composite pathButtonComp = new Composite(parent, SWT.NONE); |
| GridLayout pathButtonLayout = new GridLayout(); |
| pathButtonLayout.marginHeight = 0; |
| pathButtonLayout.marginWidth = 0; |
| pathButtonComp.setLayout(pathButtonLayout); |
| gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING |
| | GridData.HORIZONTAL_ALIGN_FILL); |
| pathButtonComp.setLayoutData(gd); |
| pathButtonComp.setFont(font); |
| |
| fAddButton = createPushButton(pathButtonComp, |
| TclInterpreterMessages.GlobalVariableBlock_Add); |
| fAddButton.addSelectionListener(this); |
| |
| fEditButton = createPushButton(pathButtonComp, |
| TclInterpreterMessages.GlobalVariableBlock_Edit); |
| fEditButton.addSelectionListener(this); |
| |
| fRemoveButton = createPushButton(pathButtonComp, |
| TclInterpreterMessages.GlobalVariableBlock_Remove); |
| fRemoveButton.addSelectionListener(this); |
| } |
| |
| /** |
| * Creates and returns a button |
| * |
| * @param parent |
| * parent widget |
| * @param label |
| * label |
| * @return Button |
| */ |
| protected Button createPushButton(Composite parent, String label) { |
| Button button = new Button(parent, SWT.PUSH); |
| button.setFont(parent.getFont()); |
| button.setText(label); |
| setButtonLayoutData(button); |
| return button; |
| } |
| |
| /** |
| * Updates buttons and status based on current libraries |
| */ |
| public void update() { |
| updateButtons(); |
| IStatus status = Status.OK_STATUS; |
| GlobalVariableEntry[] vars = fContentProvider.getVariables(); |
| for (GlobalVariableEntry var : vars) { |
| if (var.getValue() == null || var.getValue().length() == 0) { |
| status = new StatusInfo(IStatus.ERROR, |
| TclInterpreterMessages.GlobalVariableBlock_ErrorNoValue); |
| break; |
| } |
| } |
| updateDialogStatus(status); |
| } |
| |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| Object source = e.getSource(); |
| if (source == fRemoveButton) { |
| fContentProvider.remove( |
| ((IStructuredSelection) fVariablesViewer.getSelection()) |
| .toList()); |
| } else if (source == fAddButton) { |
| handleAdd(); |
| } else if (source == fEditButton) { |
| edit((IStructuredSelection) fVariablesViewer.getSelection()); |
| } |
| update(); |
| } |
| |
| private void edit(IStructuredSelection selection) { |
| GlobalVariableEntry var = (GlobalVariableEntry) selection |
| .getFirstElement(); |
| if (var == null) { |
| return; |
| } |
| MultipleInputDialog dialog = new MultipleInputDialog(fDialog.getShell(), |
| TclInterpreterMessages.GlobalVariableBlock_EditTitle); |
| dialog.addTextField(NAME_LABEL, var.getName(), false); |
| dialog.addVariablesField(VALUE_LABEL, var.getValue(), true); |
| |
| if (dialog.open() != Window.OK) { |
| return; |
| } |
| String name = dialog.getStringValue(NAME_LABEL); |
| String value = dialog.getStringValue(VALUE_LABEL); |
| if (!var.getName().equals(name)) { |
| final GlobalVariableEntry newVar = new GlobalVariableEntry(name, |
| value); |
| if (fContentProvider.replaceVariable(newVar, var)) { |
| fVariablesViewer.refresh(); |
| fVariablesViewer.setSelection(new StructuredSelection(newVar), |
| true); |
| } |
| } else { |
| var.setValue(value); |
| fVariablesViewer.refresh(true); |
| } |
| } |
| |
| @Override |
| public void widgetDefaultSelected(SelectionEvent e) { |
| } |
| |
| private void handleAdd() { |
| GlobalVariableEntry newVar = add(); |
| if (newVar != null) { |
| fContentProvider.replaceVariable(newVar, null); |
| fVariablesViewer.setSelection(new StructuredSelection(newVar), |
| true); |
| fVariablesViewer.refresh(); |
| update(); |
| } |
| } |
| |
| private GlobalVariableEntry add() { |
| MultipleInputDialog dialog = new MultipleInputDialog(fDialog.getShell(), |
| TclInterpreterMessages.GlobalVariableBlock_AddTitle); |
| dialog.addTextField(NAME_LABEL, null, false); |
| dialog.addVariablesField(VALUE_LABEL, null, true); |
| |
| if (dialog.open() != Window.OK) { |
| return null; |
| } |
| |
| String name = dialog.getStringValue(NAME_LABEL); |
| String value = dialog.getStringValue(VALUE_LABEL); |
| |
| if (name != null && value != null && name.length() > 0 |
| && value.length() > 0) { |
| return new GlobalVariableEntry(name.trim(), value.trim()); |
| } |
| return null; |
| } |
| |
| @Override |
| public void selectionChanged(SelectionChangedEvent event) { |
| updateButtons(); |
| } |
| |
| /** |
| * Refresh the enable/disable state for the buttons. |
| */ |
| private void updateButtons() { |
| IStructuredSelection selection = (IStructuredSelection) fVariablesViewer |
| .getSelection(); |
| fRemoveButton.setEnabled(!selection.isEmpty()); |
| fEditButton.setEnabled(selection.size() == 1); |
| } |
| |
| public void setValues(final EMap<String, VariableValue> vars) { |
| List<GlobalVariableEntry> list = new ArrayList<>(); |
| for (Map.Entry<String, VariableValue> entry : vars.entrySet()) { |
| if (entry.getValue() != null) { |
| list.add(new GlobalVariableEntry(entry.getKey(), |
| entry.getValue().getValue())); |
| } |
| } |
| fContentProvider.setVariables( |
| list.toArray(new GlobalVariableEntry[list.size()])); |
| update(); |
| } |
| |
| public EMap<String, VariableValue> getValues() { |
| EMap<String, VariableValue> map = new BasicEMap<>(); |
| for (GlobalVariableEntry var : fContentProvider.getVariables()) { |
| VariableValue value = TclPackagesFactory.eINSTANCE |
| .createVariableValue(); |
| value.setValue(var.getValue()); |
| map.put(var.getName(), value); |
| } |
| return map; |
| } |
| |
| protected IBaseLabelProvider getLabelProvider() { |
| return new GlobalVariableLabelProvider(); |
| } |
| |
| protected void updateDialogStatus(IStatus status) { |
| // fDialog.setSystemLibraryStatus(status); |
| fDialog.updateStatusLine(); |
| } |
| |
| protected void setButtonLayoutData(Button button) { |
| fDialog.setButtonLayoutData(button); |
| } |
| |
| public static boolean equalsEMap(EMap<String, VariableValue> a, |
| EMap<String, VariableValue> b) { |
| if (a.size() != b.size()) { |
| return false; |
| } |
| for (Map.Entry<String, VariableValue> entry : a.entrySet()) { |
| final VariableValue value = b.get(entry.getKey()); |
| if (value == null) { |
| return false; |
| } |
| if (!EcoreUtil.equals(entry.getValue(), value)) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| } |