/******************************************************************************* * Copyright (c) 2005, 2016 QNX Software Systems 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: * QNX Software Systems - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.launch.ui; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Map; import java.util.Properties; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.launch.internal.ui.LaunchImages; import org.eclipse.cdt.launch.internal.ui.LaunchMessages; import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.window.Window; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; 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.graphics.FontMetrics; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; 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.Control; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; /** * @deprecated */ @Deprecated public class CEnvironmentTab extends CLaunchConfigurationTab { protected Properties fElements; protected TableViewer fVariableList; protected Button fBtnNew; protected Button fBtnEdit; protected Button fBtnRemove; protected Button fBtnImport; class SimpleSorter extends ViewerSorter { public boolean isSorterProperty(Object element, Object property) { return true; } } class ElementsContentProvider implements IStructuredContentProvider { Object input = null; @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public void dispose() { } @Override public Object[] getElements(Object parent) { return fElements.entrySet().toArray(); } } class ElementsLabelProvider extends LabelProvider implements ITableLabelProvider { @Override public Image getColumnImage(Object element, int columnIndex) { return null; } @Override public String getColumnText(Object element, int columnIndex) { if (element != null && element instanceof Map.Entry) { return (columnIndex == 0) ? ((Map.Entry) element).getKey().toString() : ((Map.Entry) element).getValue().toString(); } return null; } } class EntryDialog extends Dialog { private String fName; private String fValue; private boolean fEdit = false; private Button fBtnOk = null; private Text fTextName = null; private Text fTextValue = null; public EntryDialog(String name, String value, boolean edit) { super(CEnvironmentTab.this.getControl().getShell()); fName = name; fValue = value; fEdit = edit; } @Override protected Control createContents(Composite parent) { Control result = super.createContents(parent); updateButtonsState(); return result; } @Override protected void configureShell(Shell shell) { super.configureShell(shell); String title = (fEdit) ? LaunchMessages.CEnvironmentTab_Edit_Variable : LaunchMessages.CEnvironmentTab_New_Variable; shell.setText(title); } @Override protected Control createDialogArea(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginWidth = 5; layout.numColumns = 2; composite.setLayout(layout); GC gc = new GC(composite); gc.setFont(composite.getFont()); FontMetrics metrics = gc.getFontMetrics(); gc.dispose(); int fieldWidthHint = convertWidthInCharsToPixels(metrics, 50); Label label = new Label(composite, SWT.NONE); label.setText(LaunchMessages.CEnvironmentTab_NameColon); fTextName = new Text(composite, SWT.SINGLE | SWT.BORDER); GridData gd = new GridData(GridData.FILL_BOTH); gd.grabExcessHorizontalSpace = true; gd.widthHint = fieldWidthHint; fTextName.setLayoutData(gd); label = new Label(composite, SWT.NONE); label.setText(LaunchMessages.CEnvironmentTab_ValueColon); fTextValue = new Text(composite, SWT.SINGLE | SWT.BORDER); gd = new GridData(GridData.FILL_BOTH); gd.grabExcessHorizontalSpace = true; gd.widthHint = fieldWidthHint; fTextValue.setLayoutData(gd); fTextName.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { updateButtonsState(); } }); fTextValue.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { updateButtonsState(); } }); fTextName.setText(fName); fTextValue.setText(fValue); return composite; } @Override protected void createButtonsForButtonBar(Composite parent) { fBtnOk = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } protected void updateButtonsState() { if (fBtnOk != null) fBtnOk.setEnabled(fTextName.getText().trim().length() > 0); } protected String getName() { return fName; } protected String getValue() { return fValue; } @Override protected void okPressed() { fName = fTextName.getText().trim(); fValue = fTextValue.getText().trim(); setReturnCode(OK); close(); } } @Override public void createControl(Composite parent) { fElements = new Properties(); Composite control = new Composite(parent, SWT.NONE); setControl(control); LaunchUIPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(getControl(), ICDTLaunchHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_ENVIRONMENT_TAB); GridLayout gl = new GridLayout(2, false); createVerticalSpacer(control, 2); control.setLayout(gl); createVariableList(control); createButtons(control); fVariableList.setInput(fElements); fVariableList.getTable().setFocus(); } public void set(String env) { fElements.clear(); ByteArrayInputStream input = new ByteArrayInputStream(env.getBytes()); try { fElements.load(input); } catch (IOException e) { } fVariableList.refresh(); fVariableList.getTable().setFocus(); if (fVariableList.getTable().getItemCount() > 0) fVariableList.getTable().setSelection(0); } public String get() { String result = ""; //$NON-NLS-1$ Object[] entries = fElements.entrySet().toArray(); for (int i = 0; i < entries.length; ++i) result += entries[i].toString() + '\n'; return result; } public Properties getProperties() { return fElements; } public Object[] toArray() { return fElements.entrySet().toArray(); } private void createVariableList(Composite parent) { fVariableList = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); fVariableList.setContentProvider(new ElementsContentProvider()); fVariableList.setLabelProvider(new ElementsLabelProvider()); fVariableList.setSorter(new SimpleSorter()); Table table = fVariableList.getTable(); TableLayout tableLayout = new TableLayout(); table.setLayout(tableLayout); GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL); gd.grabExcessVerticalSpace = true; gd.grabExcessHorizontalSpace = true; table.setLayoutData(gd); table.setHeaderVisible(true); table.setLinesVisible(true); TableColumn column1 = new TableColumn(table, SWT.NULL); column1.setText(LaunchMessages.CEnvironmentTab_Name); tableLayout.addColumnData(new ColumnWeightData(30)); TableColumn column2 = new TableColumn(table, SWT.NULL); column2.setText(LaunchMessages.CEnvironmentTab_Value); tableLayout.addColumnData(new ColumnWeightData(30)); fVariableList.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent e) { elementDoubleClicked((IStructuredSelection) e.getSelection()); } }); fVariableList.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent e) { updateButtons(); } }); } private void createButtons(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); composite.setLayout(new GridLayout(1, true)); fBtnNew = new Button(composite, SWT.NONE); fBtnNew.setText(LaunchMessages.CEnvironmentTab_New); fBtnNew.setLayoutData(new GridData(GridData.FILL_BOTH)); fBtnNew.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { newEntry(); } }); fBtnImport = new Button(composite, SWT.NONE); fBtnImport.setText(LaunchMessages.CEnvironmentTab_Import); fBtnImport.setLayoutData(new GridData(GridData.FILL_BOTH)); fBtnImport.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { importEntries(); } }); fBtnEdit = new Button(composite, SWT.NONE); fBtnEdit.setText(LaunchMessages.CEnvironmentTab_Edit); fBtnEdit.setLayoutData(new GridData(GridData.FILL_BOTH)); fBtnEdit.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { edit(); } }); fBtnRemove = new Button(composite, SWT.NONE); fBtnRemove.setText(LaunchMessages.CEnvironmentTab_Remove); fBtnRemove.setLayoutData(new GridData(GridData.FILL_BOTH)); fBtnRemove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { remove(); } }); } protected void updateButtons() { IStructuredSelection selection = (IStructuredSelection) fVariableList.getSelection(); fBtnEdit.setEnabled(selection.size() == 1); fBtnRemove.setEnabled(selection.size() > 0); } protected void elementDoubleClicked(IStructuredSelection selection) { if (selection.size() != 1) return; doEdit((Map.Entry) selection.getFirstElement()); } protected void newEntry() { EntryDialog dialog = new EntryDialog("", "", false); //$NON-NLS-1$ //$NON-NLS-2$ if (dialog.open() == Window.OK) { fElements.setProperty(dialog.getName(), dialog.getValue()); fVariableList.refresh(); } updateButtons(); updateLaunchConfigurationDialog(); } protected void importEntries() { FileDialog fileDialog = new FileDialog(getShell(), SWT.OPEN); final String filename = fileDialog.open(); if (filename == null) { return; } parseImportFile(filename); updateButtons(); updateLaunchConfigurationDialog(); } protected void parseImportFile(String filename) { File file = new File(filename); if (!file.exists()) { return; } //Iterate through each key/value property we discover try { BufferedReader reader = new BufferedReader(new FileReader(file)); String line, key, value; while((line = reader.readLine()) != null) { line = line.trim(); if (line.length() == 0) { continue; } int demarcation = line.indexOf("="); //$NON-NLS-1$ if (demarcation == -1) { key = line; value = ""; //$NON-NLS-1$ } else { key = line.substring(0, demarcation); value = line.substring(demarcation + 1, line.length()); } if (fElements.getProperty(key) != null) { boolean overwrite; overwrite = MessageDialog.openQuestion(getShell(), LaunchMessages.CEnvironmentTab_Existing_Environment_Variable, NLS.bind(LaunchMessages.CEnvironmentTab_Environment_variable_NAME_exists, key)); if (!overwrite) { continue; } } fElements.setProperty(key, value); } } catch(Exception ex) { } fVariableList.refresh(); } protected void edit() { IStructuredSelection selection = (IStructuredSelection) fVariableList.getSelection(); doEdit((Map.Entry) selection.getFirstElement()); } protected void doEdit(Map.Entry entry) { EntryDialog dialog = new EntryDialog(entry.getKey().toString(), entry.getValue().toString(), true); if (dialog.open() == Window.OK) { fElements.remove(entry.getKey()); fElements.setProperty(dialog.getName(), dialog.getValue()); fVariableList.refresh(); } updateButtons(); updateLaunchConfigurationDialog(); } protected void remove() { IStructuredSelection selection = (IStructuredSelection) fVariableList.getSelection(); Object[] elements = selection.toArray(); for (int i = 0; i < elements.length; ++i) fElements.remove(((Map.Entry) elements[i]).getKey()); fVariableList.refresh(); updateButtons(); updateLaunchConfigurationDialog(); } @Override public void setDefaults(ILaunchConfigurationWorkingCopy config) { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ENVIROMENT_MAP, (Map) null); config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ENVIROMENT_INHERIT, true); } @Override public void initializeFrom(ILaunchConfiguration config) { try { Map env = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ENVIROMENT_MAP, (Map) null); if (env != null) { fElements.clear(); fElements.putAll(env); fVariableList.refresh(); updateButtons(); } // config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ENVIROMENT_INHERIT, true); } catch (CoreException e) { } } @Override public void performApply(ILaunchConfigurationWorkingCopy config) { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ENVIROMENT_MAP, (Map) fElements.clone()); config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ENVIROMENT_INHERIT, true); } /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName() */ @Override public String getName() { return LaunchMessages.CEnvironmentTab_Environment; } /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage() */ @Override public Image getImage() { return LaunchImages.get(LaunchImages.IMG_VIEW_ENVIRONMENT_TAB); } }