A massive organize imports and formatting of the sources using default Eclipse code...
[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
38                 IWorkbenchPreferencePage {
39         protected CheckboxTableViewer tableViewer;
40
41         protected Button addButton, editButton, removeButton;
42
43         public PHPInterpreterPreferencePage() {
44                 super();
45         }
46
47         public void init(IWorkbench workbench) {
48         }
49
50         protected Control createContents(Composite parent) {
51                 noDefaultAndApplyButton();
52
53                 Composite composite = createPageRoot(parent);
54                 Table table = createInstalledInterpretersTable(composite);
55                 createInstalledInterpretersTableViewer(table);
56                 createButtonGroup(composite);
57
58                 tableViewer
59                                 .setInput(PHPRuntime.getDefault().getInstalledInterpreters());
60                 PHPInterpreter selectedInterpreter = PHPRuntime.getDefault()
61                                 .getSelectedInterpreter();
62                 if (selectedInterpreter != null)
63                         tableViewer.setChecked(selectedInterpreter, true);
64
65                 enableButtons();
66
67                 return composite;
68         }
69
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);
77
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) {
84                                 addInterpreter();
85                         }
86                 });
87
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) {
94                                 editInterpreter();
95                         }
96                 });
97
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) {
104                                 removeInterpreter();
105                         }
106                 });
107         }
108
109         protected void createInstalledInterpretersTableViewer(Table table) {
110                 tableViewer = new CheckboxTableViewer(table);
111
112                 tableViewer.setLabelProvider(new PHPInterpreterLabelProvider());
113                 tableViewer.setContentProvider(new PHPInterpreterContentProvider());
114
115                 tableViewer
116                                 .addSelectionChangedListener(new ISelectionChangedListener() {
117                                         public void selectionChanged(SelectionChangedEvent evt) {
118                                                 enableButtons();
119                                         }
120                                 });
121
122                 tableViewer.addCheckStateListener(new ICheckStateListener() {
123                         public void checkStateChanged(CheckStateChangedEvent event) {
124                                 updateSelectedInterpreter(event.getElement());
125                         }
126                 });
127
128                 tableViewer.addDoubleClickListener(new IDoubleClickListener() {
129                         public void doubleClick(DoubleClickEvent e) {
130                                 editInterpreter();
131                         }
132                 });
133         }
134
135         protected Table createInstalledInterpretersTable(Composite composite) {
136                 Table table = new Table(composite, SWT.CHECK | SWT.BORDER
137                                 | SWT.FULL_SELECTION);
138
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);
145
146                 TableColumn column = new TableColumn(table, SWT.NULL);
147                 column
148                                 .setText(PHPDebugUiMessages
149                                                 .getString("PHPInterpreterPreferencePage.PHPInterpreterTable.interpreterPath")); //$NON-NLS-1$
150                 column.setWidth(400);
151
152                 // column = new TableColumn(table, SWT.NULL);
153                 // column.setText(PHPDebugUiMessages.getString("PHPInterpreterPreferencePage.PHPInterpreterTable.interpreterPath"));
154                 // //$NON-NLS-1$
155                 // column.setWidth(350);
156
157                 return table;
158         }
159
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);
165                 return composite;
166         }
167
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);
174                 }
175         }
176
177         protected void removeInterpreter() {
178                 tableViewer.remove(getSelectedInterpreter());
179         }
180
181         protected void enableButtons() {
182                 if (getSelectedInterpreter() != null) {
183                         editButton.setEnabled(true);
184                         removeButton.setEnabled(true);
185                 } else {
186                         editButton.setEnabled(false);
187                         removeButton.setEnabled(false);
188                 }
189         }
190
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);
195                 }
196
197                 tableViewer.setChecked(interpreter, true);
198         }
199
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);
206                 } else {
207                         phpRuntime = getFile(getShell(), null);
208                 }
209                 if (phpRuntime != null) {
210                         anInterpreter.setInstallLocation(phpRuntime);
211                         tableViewer.update(anInterpreter, null);
212                 }
213
214         }
215
216         protected PHPInterpreter getSelectedInterpreter() {
217                 IStructuredSelection selection = (IStructuredSelection) tableViewer
218                                 .getSelection();
219                 return (PHPInterpreter) selection.getFirstElement();
220         }
221
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);
228
229                 Object[] checkedElements = tableViewer.getCheckedElements();
230                 if (checkedElements.length > 0)
231                         PHPRuntime.getDefault().setSelectedInterpreter(
232                                         (PHPInterpreter) checkedElements[0]);
233
234                 return super.performOk();
235         }
236
237         /**
238          * Helper to open the file chooser dialog.
239          * 
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
243          *         not.
244          */
245         public static File getFile(Shell shell, File startingDirectory) {
246
247                 FileDialog dialog = new FileDialog(shell, SWT.OPEN);
248                 if (startingDirectory != null) {
249                         dialog.setFileName(startingDirectory.getPath());
250                 }
251                 String operatingSystem = Platform.getOS();
252                 if (operatingSystem.equals(Platform.OS_WIN32)) {
253                         String[] extensions = { "*.exe" };
254                         dialog.setFilterExtensions(extensions);
255                 }
256                 String file = dialog.open();
257                 if (file != null) {
258                         file = file.trim();
259                         if (file.length() > 0)
260                                 return new File(file);
261                 }
262
263                 return null;
264         }
265 }