1 package net.sourceforge.phpdt.internal.debug.ui.preferences;
4 import java.util.ArrayList;
7 import net.sourceforge.phpdt.internal.debug.ui.PHPDebugUiMessages;
8 import net.sourceforge.phpdt.internal.launching.PHPInterpreter;
9 import net.sourceforge.phpdt.internal.launching.PHPRuntime;
11 import org.eclipse.core.runtime.Platform;
12 import org.eclipse.jface.preference.PreferencePage;
13 import org.eclipse.jface.viewers.CheckStateChangedEvent;
14 import org.eclipse.jface.viewers.CheckboxTableViewer;
15 import org.eclipse.jface.viewers.DoubleClickEvent;
16 import org.eclipse.jface.viewers.ICheckStateListener;
17 import org.eclipse.jface.viewers.IDoubleClickListener;
18 import org.eclipse.jface.viewers.ISelectionChangedListener;
19 import org.eclipse.jface.viewers.IStructuredSelection;
20 import org.eclipse.jface.viewers.SelectionChangedEvent;
21 import org.eclipse.swt.SWT;
22 import org.eclipse.swt.layout.GridData;
23 import org.eclipse.swt.layout.GridLayout;
24 import org.eclipse.swt.widgets.Button;
25 import org.eclipse.swt.widgets.Composite;
26 import org.eclipse.swt.widgets.Control;
27 import org.eclipse.swt.widgets.Event;
28 import org.eclipse.swt.widgets.FileDialog;
29 import org.eclipse.swt.widgets.Listener;
30 import org.eclipse.swt.widgets.Shell;
31 import org.eclipse.swt.widgets.Table;
32 import org.eclipse.swt.widgets.TableColumn;
33 import org.eclipse.swt.widgets.TableItem;
34 import org.eclipse.ui.IWorkbench;
35 import org.eclipse.ui.IWorkbenchPreferencePage;
37 public class PHPInterpreterPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
38 protected CheckboxTableViewer tableViewer;
40 protected Button addButton, editButton, removeButton;
42 public PHPInterpreterPreferencePage() {
46 public void init(IWorkbench workbench) {
49 protected Control createContents(Composite parent) {
50 noDefaultAndApplyButton();
52 Composite composite = createPageRoot(parent);
53 Table table = createInstalledInterpretersTable(composite);
54 createInstalledInterpretersTableViewer(table);
55 createButtonGroup(composite);
57 tableViewer.setInput(PHPRuntime.getDefault().getInstalledInterpreters());
58 PHPInterpreter selectedInterpreter = PHPRuntime.getDefault().getSelectedInterpreter();
59 if (selectedInterpreter != null)
60 tableViewer.setChecked(selectedInterpreter, true);
67 protected void createButtonGroup(Composite composite) {
68 Composite buttons = new Composite(composite, SWT.NULL);
69 buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
70 GridLayout layout = new GridLayout();
71 layout.marginHeight = 0;
72 layout.marginWidth = 0;
73 buttons.setLayout(layout);
75 addButton = new Button(buttons, SWT.PUSH);
76 addButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
77 addButton.setText(PHPDebugUiMessages.getString("PHPInterpreterPreferencePage.addButton.label")); //$NON-NLS-1$
78 addButton.addListener(SWT.Selection, new Listener() {
79 public void handleEvent(Event evt) {
84 editButton = new Button(buttons, SWT.PUSH);
85 editButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
86 editButton.setText(PHPDebugUiMessages.getString("PHPInterpreterPreferencePage.editButton.label")); //$NON-NLS-1$
87 editButton.addListener(SWT.Selection, new Listener() {
88 public void handleEvent(Event evt) {
93 removeButton = new Button(buttons, SWT.PUSH);
94 removeButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
95 removeButton.setText(PHPDebugUiMessages.getString("PHPInterpreterPreferencePage.removeButton.label")); //$NON-NLS-1$
96 removeButton.addListener(SWT.Selection, new Listener() {
97 public void handleEvent(Event evt) {
103 protected void createInstalledInterpretersTableViewer(Table table) {
104 tableViewer = new CheckboxTableViewer(table);
106 tableViewer.setLabelProvider(new PHPInterpreterLabelProvider());
107 tableViewer.setContentProvider(new PHPInterpreterContentProvider());
109 tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
110 public void selectionChanged(SelectionChangedEvent evt) {
115 tableViewer.addCheckStateListener(new ICheckStateListener() {
116 public void checkStateChanged(CheckStateChangedEvent event) {
117 updateSelectedInterpreter(event.getElement());
121 tableViewer.addDoubleClickListener(new IDoubleClickListener() {
122 public void doubleClick(DoubleClickEvent e) {
128 protected Table createInstalledInterpretersTable(Composite composite) {
129 Table table = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.FULL_SELECTION);
131 GridData data = new GridData(GridData.FILL_BOTH);
132 data.widthHint = convertWidthInCharsToPixels(80);
133 data.heightHint = convertHeightInCharsToPixels(10);
134 table.setLayoutData(data);
135 table.setHeaderVisible(true);
136 table.setLinesVisible(false);
138 TableColumn column = new TableColumn(table, SWT.NULL);
139 column.setText(PHPDebugUiMessages.getString("PHPInterpreterPreferencePage.PHPInterpreterTable.interpreterPath")); //$NON-NLS-1$
140 column.setWidth(400);
142 // column = new TableColumn(table, SWT.NULL);
143 // column.setText(PHPDebugUiMessages.getString("PHPInterpreterPreferencePage.PHPInterpreterTable.interpreterPath"));
145 // column.setWidth(350);
150 protected Composite createPageRoot(Composite parent) {
151 Composite composite = new Composite(parent, SWT.NULL);
152 GridLayout layout = new GridLayout();
153 layout.numColumns = 2;
154 composite.setLayout(layout);
158 protected void addInterpreter() {
159 PHPInterpreter newInterpreter = new PHPInterpreter(null);
160 File phpRuntime = getFile(getShell(), null);
161 if (phpRuntime != null) {
162 newInterpreter.setInstallLocation(phpRuntime);
163 tableViewer.add(newInterpreter);
167 protected void removeInterpreter() {
168 tableViewer.remove(getSelectedInterpreter());
171 protected void enableButtons() {
172 if (getSelectedInterpreter() != null) {
173 editButton.setEnabled(true);
174 removeButton.setEnabled(true);
176 editButton.setEnabled(false);
177 removeButton.setEnabled(false);
181 protected void updateSelectedInterpreter(Object interpreter) {
182 Object[] checkedElements = tableViewer.getCheckedElements();
183 for (int i = 0; i < checkedElements.length; i++) {
184 tableViewer.setChecked(checkedElements[i], false);
187 tableViewer.setChecked(interpreter, true);
190 protected void editInterpreter() {
191 PHPInterpreter anInterpreter = getSelectedInterpreter();
192 File phpRuntime = anInterpreter.getInstallLocation();
193 if (phpRuntime != null) {
194 File parent = phpRuntime.getParentFile();
195 phpRuntime = getFile(getShell(), parent);
197 phpRuntime = getFile(getShell(), null);
199 if (phpRuntime != null) {
200 anInterpreter.setInstallLocation(phpRuntime);
201 tableViewer.update(anInterpreter, null);
206 protected PHPInterpreter getSelectedInterpreter() {
207 IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
208 return (PHPInterpreter) selection.getFirstElement();
211 public boolean performOk() {
212 TableItem[] tableItems = tableViewer.getTable().getItems();
213 List installedInterpreters = new ArrayList(tableItems.length);
214 for (int i = 0; i < tableItems.length; i++)
215 installedInterpreters.add(tableItems[i].getData());
216 PHPRuntime.getDefault().setInstalledInterpreters(installedInterpreters);
218 Object[] checkedElements = tableViewer.getCheckedElements();
219 if (checkedElements.length > 0)
220 PHPRuntime.getDefault().setSelectedInterpreter((PHPInterpreter) checkedElements[0]);
222 return super.performOk();
226 * Helper to open the file chooser dialog.
228 * @param startingDirectory
229 * the directory to open the dialog on.
230 * @return File The File the user selected or <code>null</code> if they do not.
232 public static File getFile(Shell shell, File startingDirectory) {
234 FileDialog dialog = new FileDialog(shell, SWT.OPEN);
235 if (startingDirectory != null) {
236 dialog.setFileName(startingDirectory.getPath());
238 String operatingSystem = Platform.getOS();
239 if (operatingSystem.equals(Platform.OS_WIN32)) {
240 String[] extensions = { "*.exe" };
241 dialog.setFilterExtensions(extensions);
243 String file = dialog.open();
246 if (file.length() > 0)
247 return new File(file);