/*******************************************************************************
* Copyright (c) 2007, 2009 Intel Corporation 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:
* Intel Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.newui;
//import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
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.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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.internal.ui.newui.Messages;
/**
* @noextend This class is not intended to be subclassed by clients.
*/
public class ExpDialog extends AbstractPropertyDialog {
protected static final String TO_ALL = Messages.ExpDialog_5;
protected static final String EMPTY_NAME = Messages.ExpDialog_8;
protected static final String EMPTY_VALUE = Messages.ExpDialog_10;
public String[] sel_types = null;
public String[] sel_langs = null;
private Text txt1;
private Text txt2;
private List langs;
private List types;
private Label message;
private Button c_langs;
private Button c_types;
private Button c_all;
private Button c_wsp;
private Button b_vars;
private Button b_work;
private Button b_file;
private Button b_ok;
private Button b_ko;
private boolean newAction, isWsp;
private int kind;
private ICConfigurationDescription cfgd;
private String[] names_l, names_t;
private java.util.List<String> existing;
public ExpDialog(Shell parent, boolean _newAction,
String title, String _data1, String _data2,
ICConfigurationDescription _cfgd,
String[] _langs, String[] _types,
int _kind, String[] _names_l, String[] _names_t,
java.util.List<String> _existing, boolean _isWsp) {
super(parent, title);
super.text1 = (_data1 == null) ? EMPTY_STR : _data1;
super.text2 = (_data2 == null) ? EMPTY_STR : _data2;
newAction = _newAction;
cfgd = _cfgd;
sel_langs = _langs;
sel_types = _types;
kind = _kind;
names_l = _names_l;
names_t = _names_t;
existing = _existing;
isWsp = _isWsp;
}
@Override
protected Control createDialogArea(Composite c) {
GridData gd;
if (c.getLayoutData() instanceof GridData) {
gd = (GridData)c.getLayoutData();
gd.horizontalIndent = 10;
c.setLayoutData(gd);
}
c.setLayout(new GridLayout(4, true));
Label l1 = new Label(c, SWT.NONE);
l1.setText(Messages.ExpDialog_6);
l1.setLayoutData(new GridData(GridData.BEGINNING));
txt1 = new Text(c, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
gd.widthHint = 300;
txt1.setLayoutData(gd);
txt1.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
setButtons(false);
}});
Label l2 = new Label(c, SWT.NONE);
l2.setText(Messages.ExpDialog_7);
l2.setLayoutData(new GridData(GridData.BEGINNING));
txt2 = new Text(c, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
gd.widthHint = 300;
txt2.setLayoutData(gd);
txt2.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
setButtons(false);
}});
if (kind != ICSettingEntry.MACRO) {
l1.setVisible(false);
txt1.setVisible(false);
txt2.setText(super.text1); // note that name edited by 2nd text widget
} else {
txt1.setText(super.text1);
txt2.setText(super.text1);
if (!newAction) txt1.setEnabled(false); // macro name
}
b_vars = setupButton(c, AbstractCPropertyTab.VARIABLESBUTTON_NAME);
c_all = new Button(c, SWT.CHECK);
c_all.setText(Messages.ExpDialog_0);
gd = new GridData(GridData.BEGINNING);
gd.horizontalSpan = 2;
c_all.setLayoutData(gd);
c_all.setVisible(newAction);
b_work = setupButton(c, AbstractCPropertyTab.WORKSPACEBUTTON_NAME);
b_file = setupButton(c, AbstractCPropertyTab.FILESYSTEMBUTTON_NAME);
c_wsp = new Button(c, SWT.CHECK);
c_wsp.setText(Messages.ExpDialog_4);
gd = new GridData(GridData.BEGINNING);
gd.horizontalSpan = 3;
c_wsp.setLayoutData(gd);
c_wsp.setSelection(isWsp);
c_wsp.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
c_wsp.setImage(AbstractExportTab.getWspImage(c_wsp.getSelection()));
}});
c_wsp.setImage(AbstractExportTab.getWspImage(isWsp));
if (kind == ICSettingEntry.MACRO) {
b_work.setVisible(false);
b_file.setVisible(false);
c_wsp.setVisible(false);
}
Group dest = new Group(c, SWT.NONE);
dest.setText(Messages.ExpDialog_1);
dest.setLayout(new GridLayout(2, true));
gd = new GridData(GridData.FILL_BOTH);
gd.horizontalSpan = 4;
dest.setLayoutData(gd);
Label l = new Label(dest, SWT.NONE);
l.setText(Messages.ExpDialog_2);
l.setLayoutData(new GridData(GridData.BEGINNING));
l = new Label(dest, SWT.NONE);
l.setText(Messages.ExpDialog_3);
l.setLayoutData(new GridData(GridData.BEGINNING));
c_langs = new Button(dest, SWT.CHECK);
c_langs.setText(TO_ALL);
c_langs.setLayoutData(new GridData(GridData.BEGINNING));
c_langs.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
langs.setEnabled(!c_langs.getSelection());
}});
c_types = new Button(dest, SWT.CHECK);
c_types.setText(TO_ALL);
c_types.setLayoutData(new GridData(GridData.BEGINNING));
c_types.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
types.setEnabled(!c_types.getSelection());
}});
langs = new List(dest, SWT.BORDER | SWT.MULTI);
langs.setLayoutData(new GridData(GridData.FILL_BOTH));
langs.setItems(names_l);
setSelections(sel_langs, langs, c_langs);
types = new List(dest, SWT.BORDER | SWT.MULTI);
types.setLayoutData(new GridData(GridData.FILL_BOTH));
types.setItems(names_t);
setSelections(sel_types, types, c_types);
message = new Label(c, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 4;
message.setLayoutData(gd);
message.setForeground(c.getDisplay().getSystemColor(SWT.COLOR_RED));
// DUMMY PLACEHOLDER
new Label(c, 0).setLayoutData(new GridData(GridData.BEGINNING));
b_ok = setupButton(c, IDialogConstants.OK_LABEL);
b_ko = setupButton(c, IDialogConstants.CANCEL_LABEL);
c.getShell().setDefaultButton(b_ok);
c.pack();
setButtons(true);
return c;
}
private void setButtons(boolean anew) {
if (b_ok == null) return; // while init only
message.setText(EMPTY_STR);
String name;
boolean enabled = true;
if (kind == ICSettingEntry.MACRO)
name = txt1.getText().trim();
else
name = txt2.getText().trim();
if (name.length() == 0) {
enabled = false;
if (!anew) {
if (kind == ICSettingEntry.MACRO)
message.setText(EMPTY_NAME);
else
message.setText(EMPTY_VALUE);
}
}
if (enabled && existing != null && existing.contains(name)) {
message.setText(Messages.ExpDialog_9);
enabled = false;
}
b_ok.setEnabled(enabled);
}
@Override
public void buttonPressed(SelectionEvent e) {
String s;
if (e.widget.equals(b_ok)) {
if (kind == ICSettingEntry.MACRO)
super.text1 = txt1.getText();
super.text2 = txt2.getText();
super.check1 = c_all.getSelection();
super.check2 = c_wsp.getSelection();
sel_langs = (c_langs.getSelection()) ? null : langs.getSelection();
sel_types = (c_types.getSelection()) ? null : types.getSelection();
result = true;
shell.dispose();
} else if (e.widget.equals(b_ko)) {
shell.dispose();
} else if (e.widget.equals(b_vars)) {
s = AbstractCPropertyTab.getVariableDialog(shell, cfgd);
if (s != null) txt2.insert(s);
} else if (e.widget.equals(b_work)) {
if (kind == ICSettingEntry.INCLUDE_PATH ||
kind == ICSettingEntry.LIBRARY_PATH)
s = AbstractCPropertyTab.getWorkspaceDirDialog(shell, txt2.getText());
else
s = AbstractCPropertyTab.getWorkspaceFileDialog(shell, txt2.getText());
if (s != null) {
s = strip_wsp(s);
txt2.setText(s);
c_wsp.setSelection(true);
c_wsp.setImage(AbstractExportTab.getWspImage(c_wsp.getSelection()));
}
} else if (e.widget.equals(b_file)) {
if (kind == ICSettingEntry.INCLUDE_PATH ||
kind == ICSettingEntry.LIBRARY_PATH) {
s = AbstractCPropertyTab.getFileSystemDirDialog(shell, txt2.getText());
} else if (kind==ICSettingEntry.INCLUDE_FILE) {
s = AbstractCPropertyTab.getFileSystemFileDialog(shell, txt2.getText(), IncludeDialog.FILTER_INCLUDE_FILE);
} else if (kind==ICSettingEntry.LIBRARY_FILE) {
s = AbstractCPropertyTab.getFileSystemFileDialog(shell, txt2.getText(), IncludeDialog.FILTER_LIBRARY_FILE);
} else {
s = AbstractCPropertyTab.getFileSystemFileDialog(shell, txt2.getText());
}
if (s != null) {
txt2.setText(s);
c_wsp.setSelection(false);
c_wsp.setImage(AbstractExportTab.getWspImage(c_wsp.getSelection()));
}
}
}
protected void setSelections(String[] sel, List lst, Button check) {
if (sel == null) {
lst.setEnabled(false);
check.setSelection(true);
} else {
lst.setEnabled(true);
check.setSelection(false);
if (sel.length == 0) return;
int cnt = 0;
String[] items = lst.getItems();
int[] indices = new int[items.length];
for (int i=0; i<indices.length; i++) indices[i] = -1;
for (int i=0; i<items.length; i++) {
for (String element : sel) {
if (items[i].equals(element)) {
indices[cnt++] = i;
break;
}
}
}
lst.setSelection(indices);
}
}
}