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
38 IWorkbenchPreferencePage {
39 protected CheckboxTableViewer tableViewer;
41 protected Button addButton, editButton, removeButton;
43 public PHPInterpreterPreferencePage() {
47 public void init(IWorkbench workbench) {
50 protected Control createContents(Composite parent) {
51 noDefaultAndApplyButton();
53 Composite composite = createPageRoot(parent);
54 Table table = createInstalledInterpretersTable(composite);
55 createInstalledInterpretersTableViewer(table);
56 createButtonGroup(composite);
59 .setInput(PHPRuntime.getDefault().getInstalledInterpreters());
60 PHPInterpreter selectedInterpreter = PHPRuntime.getDefault()
61 .getSelectedInterpreter();
62 if (selectedInterpreter != null)
63 tableViewer.setChecked(selectedInterpreter, true);
70 protected void createButtonGroup(Composite composite) {
71 Composite buttons = new Composite(composite, SWT.NULL);
72 buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
73 GridLayout layout = new GridLayout();
74 layout.marginHeight = 0;
75 layout.marginWidth = 0;
76 buttons.setLayout(layout);
78 addButton = new Button(buttons, SWT.PUSH);
79 addButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
80 addButton.setText(PHPDebugUiMessages
81 .getString("PHPInterpreterPreferencePage.addButton.label")); //$NON-NLS-1$
82 addButton.addListener(SWT.Selection, new Listener() {
83 public void handleEvent(Event evt) {
88 editButton = new Button(buttons, SWT.PUSH);
89 editButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
90 editButton.setText(PHPDebugUiMessages
91 .getString("PHPInterpreterPreferencePage.editButton.label")); //$NON-NLS-1$
92 editButton.addListener(SWT.Selection, new Listener() {
93 public void handleEvent(Event evt) {
98 removeButton = new Button(buttons, SWT.PUSH);
99 removeButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
100 removeButton.setText(PHPDebugUiMessages
101 .getString("PHPInterpreterPreferencePage.removeButton.label")); //$NON-NLS-1$
102 removeButton.addListener(SWT.Selection, new Listener() {
103 public void handleEvent(Event evt) {
109 protected void createInstalledInterpretersTableViewer(Table table) {
110 tableViewer = new CheckboxTableViewer(table);
112 tableViewer.setLabelProvider(new PHPInterpreterLabelProvider());
113 tableViewer.setContentProvider(new PHPInterpreterContentProvider());
116 .addSelectionChangedListener(new ISelectionChangedListener() {
117 public void selectionChanged(SelectionChangedEvent evt) {
122 tableViewer.addCheckStateListener(new ICheckStateListener() {
123 public void checkStateChanged(CheckStateChangedEvent event) {
124 updateSelectedInterpreter(event.getElement());
128 tableViewer.addDoubleClickListener(new IDoubleClickListener() {
129 public void doubleClick(DoubleClickEvent e) {
135 protected Table createInstalledInterpretersTable(Composite composite) {
136 Table table = new Table(composite, SWT.CHECK | SWT.BORDER
137 | SWT.FULL_SELECTION);
139 GridData data = new GridData(GridData.FILL_BOTH);
140 data.widthHint = convertWidthInCharsToPixels(80);
141 data.heightHint = convertHeightInCharsToPixels(10);
142 table.setLayoutData(data);
143 table.setHeaderVisible(true);
144 table.setLinesVisible(false);
146 TableColumn column = new TableColumn(table, SWT.NULL);
148 .setText(PHPDebugUiMessages
149 .getString("PHPInterpreterPreferencePage.PHPInterpreterTable.interpreterPath")); //$NON-NLS-1$
150 column.setWidth(400);
152 // column = new TableColumn(table, SWT.NULL);
153 // column.setText(PHPDebugUiMessages.getString("PHPInterpreterPreferencePage.PHPInterpreterTable.interpreterPath"));
155 // column.setWidth(350);
160 protected Composite createPageRoot(Composite parent) {
161 Composite composite = new Composite(parent, SWT.NULL);
162 GridLayout layout = new GridLayout();
163 layout.numColumns = 2;
164 composite.setLayout(layout);
168 protected void addInterpreter() {
169 PHPInterpreter newInterpreter = new PHPInterpreter(null);
170 File phpRuntime = getFile(getShell(), null);
171 if (phpRuntime != null) {
172 newInterpreter.setInstallLocation(phpRuntime);
173 tableViewer.add(newInterpreter);
177 protected void removeInterpreter() {
178 tableViewer.remove(getSelectedInterpreter());
181 protected void enableButtons() {
182 if (getSelectedInterpreter() != null) {
183 editButton.setEnabled(true);
184 removeButton.setEnabled(true);
186 editButton.setEnabled(false);
187 removeButton.setEnabled(false);
191 protected void updateSelectedInterpreter(Object interpreter) {
192 Object[] checkedElements = tableViewer.getCheckedElements();
193 for (int i = 0; i < checkedElements.length; i++) {
194 tableViewer.setChecked(checkedElements[i], false);
197 tableViewer.setChecked(interpreter, true);
200 protected void editInterpreter() {
201 PHPInterpreter anInterpreter = getSelectedInterpreter();
202 File phpRuntime = anInterpreter.getInstallLocation();
203 if (phpRuntime != null) {
204 File parent = phpRuntime.getParentFile();
205 phpRuntime = getFile(getShell(), parent);
207 phpRuntime = getFile(getShell(), null);
209 if (phpRuntime != null) {
210 anInterpreter.setInstallLocation(phpRuntime);
211 tableViewer.update(anInterpreter, null);
216 protected PHPInterpreter getSelectedInterpreter() {
217 IStructuredSelection selection = (IStructuredSelection) tableViewer
219 return (PHPInterpreter) selection.getFirstElement();
222 public boolean performOk() {
223 TableItem[] tableItems = tableViewer.getTable().getItems();
224 List installedInterpreters = new ArrayList(tableItems.length);
225 for (int i = 0; i < tableItems.length; i++)
226 installedInterpreters.add(tableItems[i].getData());
227 PHPRuntime.getDefault().setInstalledInterpreters(installedInterpreters);
229 Object[] checkedElements = tableViewer.getCheckedElements();
230 if (checkedElements.length > 0)
231 PHPRuntime.getDefault().setSelectedInterpreter(
232 (PHPInterpreter) checkedElements[0]);
234 return super.performOk();
238 * Helper to open the file chooser dialog.
240 * @param startingDirectory
241 * the directory to open the dialog on.
242 * @return File The File the user selected or <code>null</code> if they do
245 public static File getFile(Shell shell, File startingDirectory) {
247 FileDialog dialog = new FileDialog(shell, SWT.OPEN);
248 if (startingDirectory != null) {
249 dialog.setFileName(startingDirectory.getPath());
251 String operatingSystem = Platform.getOS();
252 if (operatingSystem.equals(Platform.OS_WIN32)) {
253 String[] extensions = { "*.exe" };
254 dialog.setFilterExtensions(extensions);
256 String file = dialog.open();
259 if (file.length() > 0)
260 return new File(file);