Tried to implement ConsoleLineTracker (see plugin.xml) for PHP stack traces in the...
[phpeclipse.git] / net.sourceforge.phpeclipse.debug.ui / src / net / sourceforge / phpdt / internal / debug / ui / preferences / PHPInterpreterPreferencePage.java
1 package net.sourceforge.phpdt.internal.debug.ui.preferences;
2
3 import java.io.File;
4 import java.util.ArrayList;
5 import java.util.List;
6
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;
10
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;
36
37 public class PHPInterpreterPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
38   protected CheckboxTableViewer tableViewer;
39
40   protected Button addButton, editButton, removeButton;
41
42   public PHPInterpreterPreferencePage() {
43     super();
44   }
45
46   public void init(IWorkbench workbench) {
47   }
48
49   protected Control createContents(Composite parent) {
50     noDefaultAndApplyButton();
51
52     Composite composite = createPageRoot(parent);
53     Table table = createInstalledInterpretersTable(composite);
54     createInstalledInterpretersTableViewer(table);
55     createButtonGroup(composite);
56
57     tableViewer.setInput(PHPRuntime.getDefault().getInstalledInterpreters());
58     PHPInterpreter selectedInterpreter = PHPRuntime.getDefault().getSelectedInterpreter();
59     if (selectedInterpreter != null)
60       tableViewer.setChecked(selectedInterpreter, true);
61
62     enableButtons();
63
64     return composite;
65   }
66
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);
74
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) {
80         addInterpreter();
81       }
82     });
83
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) {
89         editInterpreter();
90       }
91     });
92
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) {
98         removeInterpreter();
99       }
100     });
101   }
102
103   protected void createInstalledInterpretersTableViewer(Table table) {
104     tableViewer = new CheckboxTableViewer(table);
105
106     tableViewer.setLabelProvider(new PHPInterpreterLabelProvider());
107     tableViewer.setContentProvider(new PHPInterpreterContentProvider());
108
109     tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
110       public void selectionChanged(SelectionChangedEvent evt) {
111         enableButtons();
112       }
113     });
114
115     tableViewer.addCheckStateListener(new ICheckStateListener() {
116       public void checkStateChanged(CheckStateChangedEvent event) {
117         updateSelectedInterpreter(event.getElement());
118       }
119     });
120
121     tableViewer.addDoubleClickListener(new IDoubleClickListener() {
122       public void doubleClick(DoubleClickEvent e) {
123         editInterpreter();
124       }
125     });
126   }
127
128   protected Table createInstalledInterpretersTable(Composite composite) {
129     Table table = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.FULL_SELECTION);
130
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);
137
138     TableColumn column = new TableColumn(table, SWT.NULL);
139     column.setText(PHPDebugUiMessages.getString("PHPInterpreterPreferencePage.PHPInterpreterTable.interpreterPath")); //$NON-NLS-1$
140     column.setWidth(400);
141
142     //    column = new TableColumn(table, SWT.NULL);
143     //    column.setText(PHPDebugUiMessages.getString("PHPInterpreterPreferencePage.PHPInterpreterTable.interpreterPath"));
144     // //$NON-NLS-1$
145     //    column.setWidth(350);
146
147     return table;
148   }
149
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);
155     return composite;
156   }
157
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);
164     }
165   }
166
167   protected void removeInterpreter() {
168     tableViewer.remove(getSelectedInterpreter());
169   }
170
171   protected void enableButtons() {
172     if (getSelectedInterpreter() != null) {
173       editButton.setEnabled(true);
174       removeButton.setEnabled(true);
175     } else {
176       editButton.setEnabled(false);
177       removeButton.setEnabled(false);
178     }
179   }
180
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);
185     }
186
187     tableViewer.setChecked(interpreter, true);
188   }
189
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);
196     } else {
197       phpRuntime = getFile(getShell(), null);
198     }
199     if (phpRuntime != null) {
200       anInterpreter.setInstallLocation(phpRuntime);
201       tableViewer.update(anInterpreter, null);
202     }
203
204   }
205
206   protected PHPInterpreter getSelectedInterpreter() {
207     IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
208     return (PHPInterpreter) selection.getFirstElement();
209   }
210
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);
217
218     Object[] checkedElements = tableViewer.getCheckedElements();
219     if (checkedElements.length > 0)
220       PHPRuntime.getDefault().setSelectedInterpreter((PHPInterpreter) checkedElements[0]);
221
222     return super.performOk();
223   }
224
225   /**
226    * Helper to open the file chooser dialog.
227    * 
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.
231    */
232   public static File getFile(Shell shell, File startingDirectory) {
233
234     FileDialog dialog = new FileDialog(shell, SWT.OPEN);
235     if (startingDirectory != null) {
236       dialog.setFileName(startingDirectory.getPath());
237     }
238     String operatingSystem = Platform.getOS();
239     if (operatingSystem.equals(Platform.OS_WIN32)) {
240       String[] extensions = { "*.exe" };
241       dialog.setFilterExtensions(extensions);
242     }
243     String file = dialog.open();
244     if (file != null) {
245       file = file.trim();
246       if (file.length() > 0)
247         return new File(file);
248     }
249
250     return null;
251   }
252 }