KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > ui > internal > browser > WebBrowserPreferencePage


1 /*******************************************************************************
2  * Copyright (c) 2003, 2006 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - Initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.ui.internal.browser;
12
13 import java.io.File JavaDoc;
14 import java.lang.reflect.InvocationTargetException JavaDoc;
15 import java.util.ArrayList JavaDoc;
16 import java.util.Iterator JavaDoc;
17 import java.util.List JavaDoc;
18
19 import org.eclipse.core.runtime.IProgressMonitor;
20 import org.eclipse.jface.dialogs.Dialog;
21 import org.eclipse.jface.dialogs.ProgressMonitorDialog;
22 import org.eclipse.jface.operation.IRunnableWithProgress;
23 import org.eclipse.jface.preference.PreferencePage;
24 import org.eclipse.jface.viewers.CheckStateChangedEvent;
25 import org.eclipse.jface.viewers.CheckboxTableViewer;
26 import org.eclipse.jface.viewers.ColumnWeightData;
27 import org.eclipse.jface.viewers.DoubleClickEvent;
28 import org.eclipse.jface.viewers.ICheckStateListener;
29 import org.eclipse.jface.viewers.IDoubleClickListener;
30 import org.eclipse.jface.viewers.ILabelProviderListener;
31 import org.eclipse.jface.viewers.ISelection;
32 import org.eclipse.jface.viewers.ISelectionChangedListener;
33 import org.eclipse.jface.viewers.IStructuredContentProvider;
34 import org.eclipse.jface.viewers.IStructuredSelection;
35 import org.eclipse.jface.viewers.ITableLabelProvider;
36 import org.eclipse.jface.viewers.SelectionChangedEvent;
37 import org.eclipse.jface.viewers.TableLayout;
38 import org.eclipse.jface.viewers.Viewer;
39 import org.eclipse.jface.window.Window;
40 import org.eclipse.osgi.util.NLS;
41 import org.eclipse.swt.SWT;
42 import org.eclipse.swt.events.KeyEvent;
43 import org.eclipse.swt.events.KeyListener;
44 import org.eclipse.swt.events.SelectionAdapter;
45 import org.eclipse.swt.events.SelectionEvent;
46 import org.eclipse.swt.graphics.Image;
47 import org.eclipse.swt.layout.GridData;
48 import org.eclipse.swt.layout.GridLayout;
49 import org.eclipse.swt.widgets.Button;
50 import org.eclipse.swt.widgets.Composite;
51 import org.eclipse.swt.widgets.Control;
52 import org.eclipse.swt.widgets.DirectoryDialog;
53 import org.eclipse.swt.widgets.Label;
54 import org.eclipse.swt.widgets.Table;
55 import org.eclipse.swt.widgets.TableColumn;
56 import org.eclipse.swt.widgets.TableItem;
57 import org.eclipse.ui.IWorkbench;
58 import org.eclipse.ui.IWorkbenchPreferencePage;
59 import org.eclipse.ui.PlatformUI;
60
61 /**
62  * The preference page that holds Web browser preferences.
63  */

64 public class WebBrowserPreferencePage extends PreferencePage implements
65         IWorkbenchPreferencePage {
66     protected Button internal;
67
68     protected Button external;
69
70     protected Table table;
71
72     protected CheckboxTableViewer tableViewer;
73
74     protected Button edit;
75
76     protected Button remove;
77
78     protected Button search;
79
80     protected Label location;
81
82     protected Label parameters;
83     
84     protected IBrowserDescriptor checkedBrowser;
85
86     class BrowserContentProvider implements IStructuredContentProvider {
87         public Object JavaDoc[] getElements(Object JavaDoc inputElement) {
88             List JavaDoc list = new ArrayList JavaDoc();
89             Iterator JavaDoc iterator = BrowserManager.getInstance().getWebBrowsers()
90                     .iterator();
91             while (iterator.hasNext()) {
92                 IBrowserDescriptor browser = (IBrowserDescriptor) iterator
93                         .next();
94                 list.add(browser);
95             }
96             return list.toArray();
97         }
98
99         public void inputChanged(Viewer viewer, Object JavaDoc oldInput, Object JavaDoc newInput) {
100             // do nothing
101
}
102
103         public void dispose() {
104             // do nothing
105
}
106     }
107
108     class BrowserTableLabelProvider implements ITableLabelProvider {
109         public Image getColumnImage(Object JavaDoc element, int columnIndex) {
110             return null;
111         }
112
113         public String JavaDoc getColumnText(Object JavaDoc element, int columnIndex) {
114             IBrowserDescriptor browser = (IBrowserDescriptor) element;
115             return notNull(browser.getName());
116         }
117
118         protected String JavaDoc notNull(String JavaDoc s) {
119             if (s == null)
120                 return ""; //$NON-NLS-1$
121
return s;
122         }
123
124         public boolean isLabelProperty(Object JavaDoc element, String JavaDoc property) {
125             return false;
126         }
127
128         public void addListener(ILabelProviderListener listener) {
129             // do nothing
130
}
131
132         public void removeListener(ILabelProviderListener listener) {
133             // do nothing
134
}
135
136         public void dispose() {
137             // do nothing
138
}
139     }
140
141     /**
142      * WebBrowserPreferencePage constructor comment.
143      */

144     public WebBrowserPreferencePage() {
145         super();
146     }
147
148     /**
149      * Create the preference options.
150      *
151      * @param parent
152      * org.eclipse.swt.widgets.Composite
153      * @return org.eclipse.swt.widgets.Control
154      */

155     protected Control createContents(Composite parent) {
156         initializeDialogUnits(parent);
157         PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
158                 ContextIds.PREF_BROWSER);
159
160         Composite composite = new Composite(parent, SWT.NONE);
161         GridLayout layout = new GridLayout();
162         layout.numColumns = 2;
163         layout.horizontalSpacing = convertHorizontalDLUsToPixels(4);
164         layout.verticalSpacing = convertVerticalDLUsToPixels(3);
165         layout.marginWidth = 0;
166         layout.marginHeight = 0;
167         composite.setLayout(layout);
168         GridData data = new GridData(GridData.FILL_HORIZONTAL
169                 | GridData.VERTICAL_ALIGN_FILL);
170         composite.setLayoutData(data);
171
172         Label label = new Label(composite, SWT.WRAP);
173         label.setText(Messages.preferenceWebBrowserDescription);
174         data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
175         data.horizontalSpan = 2;
176         label.setLayoutData(data);
177         
178         label = new Label(composite, SWT.WRAP);
179         data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
180         data.horizontalSpan = 2;
181         label.setLayoutData(data);
182
183         internal = new Button(composite, SWT.RADIO);
184         internal.setText(Messages.prefInternalBrowser);
185         data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
186         data.horizontalSpan = 2;
187         internal.setLayoutData(data);
188
189         if (!WebBrowserUtil.canUseInternalWebBrowser())
190             internal.setEnabled(false);
191
192         external = new Button(composite, SWT.RADIO);
193         external.setText(Messages.prefExternalBrowser);
194         data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
195         data.horizontalSpan = 2;
196         external.setLayoutData(data);
197
198         label = new Label(composite, SWT.NONE);
199         label.setText(Messages.browserList);
200         data = new GridData(GridData.FILL_HORIZONTAL
201                 | GridData.VERTICAL_ALIGN_CENTER);
202         data.horizontalSpan = 2;
203         label.setLayoutData(data);
204
205         table = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL
206                 | SWT.H_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION);
207         data = new GridData(GridData.FILL_BOTH);
208         table.setLayoutData(data);
209         table.setHeaderVisible(false);
210         table.setLinesVisible(false);
211
212         TableLayout tableLayout = new TableLayout();
213         new TableColumn(table, SWT.NONE);
214         tableLayout.addColumnData(new ColumnWeightData(100));
215         table.setLayout(tableLayout);
216
217         tableViewer = new CheckboxTableViewer(table);
218         tableViewer.setContentProvider(new BrowserContentProvider());
219         tableViewer.setLabelProvider(new BrowserTableLabelProvider());
220         tableViewer.setInput("root"); //$NON-NLS-1$
221

222         // uncheck any other elements that might be checked and leave only the
223
// element checked to remain checked since one can only chose one
224
// brower at a time to be current.
225
tableViewer.addCheckStateListener(new ICheckStateListener() {
226             public void checkStateChanged(CheckStateChangedEvent e) {
227                 checkNewDefaultBrowser(e.getElement());
228                 checkedBrowser = (IBrowserDescriptor) e.getElement();
229                 
230                 // if no other browsers are checked, don't allow the single one
231
// currently checked to become unchecked, and lose a current
232
// browser. That is, don't permit unchecking if no other item
233
// is checked which is supposed to be the case.
234
Object JavaDoc[] obj = tableViewer.getCheckedElements();
235                 if (obj.length == 0)
236                     tableViewer.setChecked(e.getElement(), true);
237             }
238         });
239
240         // set a default, checked browser based on the current browser. If there
241
// is not a current browser, but the first item exists, use that instead.
242
// This will work currently until workbench shutdown, because current
243
// browser is not yet persisted.
244
checkedBrowser = BrowserManager.getInstance().getCurrentWebBrowser();
245         if (checkedBrowser != null)
246             tableViewer.setChecked(checkedBrowser, true);
247         else {
248             Object JavaDoc obj = tableViewer.getElementAt(0);
249             if (obj != null)
250                 tableViewer.setChecked(obj, true);
251         }
252
253         tableViewer
254                 .addSelectionChangedListener(new ISelectionChangedListener() {
255                     public void selectionChanged(SelectionChangedEvent event) {
256                         IStructuredSelection sele = ((IStructuredSelection) tableViewer
257                                 .getSelection());
258                         boolean sel = sele.getFirstElement() != null &&
259                                 !(sele.getFirstElement() instanceof SystemBrowserDescriptor);
260                         remove.setEnabled(sel);
261                         edit.setEnabled(sel);
262                     }
263                 });
264
265         tableViewer.addDoubleClickListener(new IDoubleClickListener() {
266             public void doubleClick(DoubleClickEvent event) {
267                 IStructuredSelection sel = ((IStructuredSelection) tableViewer
268                         .getSelection());
269                 Object JavaDoc firstElem = sel.getFirstElement();
270                 if (firstElem != null && !(firstElem instanceof SystemBrowserDescriptor)) {
271                     IBrowserDescriptor browser2 = (IBrowserDescriptor) sel
272                             .getFirstElement();
273                     IBrowserDescriptorWorkingCopy wc = browser2
274                             .getWorkingCopy();
275                     BrowserDescriptorDialog dialog = new BrowserDescriptorDialog(
276                             getShell(), wc);
277                     if (dialog.open() != Window.CANCEL) {
278                         try {
279                             tableViewer.refresh(wc.save());
280                         } catch (Exception JavaDoc ex) {
281                             // ignore
282
}
283                     }
284                 }
285             }
286         });
287
288         table.addKeyListener(new KeyListener() {
289             public void keyPressed(KeyEvent e) {
290                 if (e.character == SWT.DEL) {
291                     IStructuredSelection sel = ((IStructuredSelection) tableViewer
292                             .getSelection());
293                     if (sel.getFirstElement() != null) {
294                         IBrowserDescriptor browser2 = (IBrowserDescriptor) sel
295                                 .getFirstElement();
296                         try {
297                             browser2.delete();
298                             tableViewer.remove(browser2);
299
300                             // need here to ensure that if the item deleted was
301
// checked, ie. was
302
// the current browser, that the new current browser
303
// will be the first in the
304
// list, typically, the internal browser, which
305
// cannot be
306
// deleted, and be current
307
BrowserManager manager = BrowserManager.getInstance();
308                             if (browser2 == checkedBrowser) {
309                                 if (manager.browsers.size() > 0) {
310                                     checkedBrowser = (IBrowserDescriptor) manager.browsers.get(0);
311                                     tableViewer.setChecked(checkedBrowser, true);
312                                 }
313                             }
314                         } catch (Exception JavaDoc ex) {
315                             // ignore
316
}
317                     }
318                 }
319             }
320
321             public void keyReleased(KeyEvent e) {
322                 // ignore
323
}
324         });
325
326         Composite buttonComp = new Composite(composite, SWT.NONE);
327         layout = new GridLayout();
328         layout.horizontalSpacing = 0;
329         layout.verticalSpacing = convertVerticalDLUsToPixels(3);
330         layout.marginWidth = 0;
331         layout.marginHeight = 0;
332         layout.numColumns = 1;
333         buttonComp.setLayout(layout);
334         data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
335                 | GridData.VERTICAL_ALIGN_FILL);
336         buttonComp.setLayoutData(data);
337
338         final Button add = SWTUtil.createButton(buttonComp, Messages.add);
339         add.addSelectionListener(new SelectionAdapter() {
340             public void widgetSelected(SelectionEvent e) {
341                 BrowserDescriptorDialog dialog = new BrowserDescriptorDialog(
342                         getShell());
343                 if (dialog.open() == Window.CANCEL)
344                     return;
345                 tableViewer.refresh();
346                 if (checkedBrowser != null)
347                     tableViewer.setChecked(checkedBrowser, true);
348             }
349         });
350
351         edit = SWTUtil.createButton(buttonComp, Messages.edit);
352         edit.addSelectionListener(new SelectionAdapter() {
353             public void widgetSelected(SelectionEvent e) {
354                 IStructuredSelection sel = ((IStructuredSelection) tableViewer
355                         .getSelection());
356                 IBrowserDescriptor browser2 = (IBrowserDescriptor) sel
357                         .getFirstElement();
358                 IBrowserDescriptorWorkingCopy wc = browser2.getWorkingCopy();
359                 BrowserDescriptorDialog dialog = new BrowserDescriptorDialog(
360                         getShell(), wc);
361                 if (dialog.open() != Window.CANCEL) {
362                     try {
363                         tableViewer.refresh(wc.save());
364                     } catch (Exception JavaDoc ex) {
365                         // ignore
366
}
367                 }
368             }
369         });
370
371         remove = SWTUtil.createButton(buttonComp, Messages.remove);
372         remove.addSelectionListener(new SelectionAdapter() {
373             public void widgetSelected(SelectionEvent e) {
374                 IStructuredSelection sel = ((IStructuredSelection) tableViewer
375                         .getSelection());
376                 IBrowserDescriptor browser2 = (IBrowserDescriptor) sel
377                         .getFirstElement();
378                 try {
379                     browser2.delete();
380                     tableViewer.remove(browser2);
381
382                     // need here to ensure that if the item deleted was checked,
383
// ie. was
384
// the current browser, that the new current browser will be
385
// the first in the
386
// list, typically, the internal browser, which cannot be
387
// deleted, and be current
388
BrowserManager manager = BrowserManager.getInstance();
389                     if (browser2 == checkedBrowser) {
390                         if (manager.browsers.size() > 0) {
391                             checkedBrowser = (IBrowserDescriptor) manager.browsers.get(0);
392                             tableViewer.setChecked(checkedBrowser, true);
393                         }
394                     }
395                 } catch (Exception JavaDoc ex) {
396                     // ignore
397
}
398             }
399         });
400
401         search = SWTUtil.createButton(buttonComp, Messages.search);
402         data = (GridData) search.getLayoutData();
403         data.verticalIndent = 9;
404         search.addSelectionListener(new SelectionAdapter() {
405             public void widgetSelected(SelectionEvent e) {
406                 final List JavaDoc foundBrowsers = new ArrayList JavaDoc();
407                 final List JavaDoc existingPaths = WebBrowserUtil
408                         .getExternalBrowserPaths();
409
410                 // select a target directory for the search
411
DirectoryDialog dialog = new DirectoryDialog(getShell());
412                 dialog.setMessage(Messages.selectDirectory);
413                 dialog.setText(Messages.directoryDialogTitle);
414
415                 String JavaDoc path = dialog.open();
416                 if (path == null)
417                     return;
418
419                 final File JavaDoc rootDir = new File JavaDoc(path);
420                 ProgressMonitorDialog pm = new ProgressMonitorDialog(getShell());
421
422                 IRunnableWithProgress r = new IRunnableWithProgress() {
423                     public void run(IProgressMonitor monitor) {
424                         monitor.beginTask(Messages.searchingTaskName,
425                                 IProgressMonitor.UNKNOWN);
426                         search(rootDir, existingPaths, foundBrowsers, monitor);
427                         monitor.done();
428                     }
429                 };
430
431                 try {
432                     pm.run(true, true, r);
433                 } catch (InvocationTargetException JavaDoc ex) {
434                     Trace.trace(Trace.SEVERE,
435                             "Invocation Exception occured running monitor: " //$NON-NLS-1$
436
+ ex);
437                 } catch (InterruptedException JavaDoc ex) {
438                     Trace.trace(Trace.SEVERE,
439                             "Interrupted exception occured running monitor: " //$NON-NLS-1$
440
+ ex);
441                     return;
442                 }
443
444                 if (pm.getProgressMonitor().isCanceled())
445                     return;
446
447                 List JavaDoc browsersToCreate = foundBrowsers;
448
449                 if (browsersToCreate == null) // cancelled
450
return;
451
452                 if (browsersToCreate.isEmpty()) { // no browsers found
453
WebBrowserUtil.openMessage(Messages.searchingNoneFound);
454                     return;
455                 }
456
457                 Iterator JavaDoc iterator = browsersToCreate.iterator();
458                 while (iterator.hasNext()) {
459                     IBrowserDescriptorWorkingCopy browser2 = (IBrowserDescriptorWorkingCopy) iterator
460                             .next();
461                     browser2.save();
462                 }
463                 tableViewer.refresh();
464                 
465                 if (checkedBrowser != null)
466                     tableViewer.setChecked(checkedBrowser, true);
467             }
468         });
469
470         tableViewer.addCheckStateListener(new ICheckStateListener() {
471             public void checkStateChanged(CheckStateChangedEvent e) {
472                 checkNewDefaultBrowser(e.getElement());
473                 checkedBrowser = (IBrowserDescriptor) e
474                         .getElement();
475             }
476         });
477
478         /*external.addSelectionListener(new SelectionListener() {
479             public void widgetSelected(SelectionEvent e) {
480                 boolean sel = !tableViewer.getSelection().isEmpty();
481                 edit.setEnabled(sel);
482                 remove.setEnabled(sel);
483             }
484
485             public void widgetDefaultSelected(SelectionEvent e) {
486                 // ignore
487             }
488         });*/

489         internal.setSelection(WebBrowserPreference.getBrowserChoice() == WebBrowserPreference.INTERNAL);
490         external.setSelection(WebBrowserPreference.getBrowserChoice() == WebBrowserPreference.EXTERNAL);
491
492         //boolean sel = !tableViewer.getSelection().isEmpty();
493
IStructuredSelection sele = ((IStructuredSelection) tableViewer
494                 .getSelection());
495         boolean sel = sele.getFirstElement() != null &&
496                 !(sele.getFirstElement() instanceof SystemBrowserDescriptor);
497         edit.setEnabled(sel);
498         remove.setEnabled(sel);
499
500         Dialog.applyDialogFont(composite);
501
502         return composite;
503     }
504
505     /**
506      * Initializes this preference page using the passed workbench.
507      *
508      * @param workbench
509      * the current workbench
510      */

511     public void init(IWorkbench workbench) {
512         // do nothing
513
}
514
515     /**
516      *
517      */

518     public void setVisible(boolean visible) {
519         super.setVisible(visible);
520         if (visible)
521             setTitle(Messages.preferenceWebBrowserTitle);
522     }
523
524     protected Object JavaDoc getSelection(ISelection sel2) {
525         IStructuredSelection sel = (IStructuredSelection) sel2;
526         return sel.getFirstElement();
527     }
528
529     // Uncheck all the items except the current one that was just checked
530
protected void checkNewDefaultBrowser(Object JavaDoc browser) {
531         TableItem[] children = tableViewer.getTable().getItems();
532         for (int i = 0; i < children.length; i++) {
533             TableItem item = children[i];
534
535             if (!(item.getData().equals(browser)))
536                 item.setChecked(false);
537         }
538     }
539
540     protected static void search(File JavaDoc directory, List JavaDoc existingPaths,
541             List JavaDoc foundBrowsers, IProgressMonitor monitor) {
542         if (monitor.isCanceled())
543             return;
544
545         monitor.subTask(NLS.bind(Messages.searching,
546                 new String JavaDoc[] { Integer.toString(foundBrowsers.size()), directory.getAbsolutePath()}));
547         
548         String JavaDoc[] names = directory.list();
549         List JavaDoc subDirs = new ArrayList JavaDoc();
550
551         for (int i = 0; i < names.length; i++) {
552             if (monitor.isCanceled())
553                 return;
554
555             File JavaDoc file = new File JavaDoc(directory, names[i]);
556
557             if (existingPaths.contains(file.getAbsolutePath().toLowerCase()))
558                 continue;
559
560             IBrowserDescriptorWorkingCopy wc = WebBrowserUtil
561                     .createExternalBrowser(file);
562             if (wc != null)
563                 foundBrowsers.add(wc);
564             
565             if (file.isDirectory()) {
566                 if (monitor.isCanceled())
567                     return;
568                 subDirs.add(file);
569             }
570         }
571         while (!subDirs.isEmpty()) {
572             File JavaDoc subDir = (File JavaDoc) subDirs.remove(0);
573             search(subDir, existingPaths, foundBrowsers, monitor);
574             if (monitor.isCanceled()) {
575                 return;
576             }
577         }
578     }
579
580     /**
581      * Performs special processing when this page's Defaults button has been
582      * pressed.
583      */

584     protected void performDefaults() {
585         internal.setSelection(WebBrowserPreference
586                 .isDefaultUseInternalBrowser());
587         external.setSelection(!WebBrowserPreference.
588                 isDefaultUseInternalBrowser());
589         
590         BrowserManager.getInstance().currentBrowser = null;
591         BrowserManager.getInstance().setupDefaultBrowsers();
592         tableViewer.refresh();
593         
594         checkedBrowser = BrowserManager.getInstance().getCurrentWebBrowser();
595         if (checkedBrowser != null)
596             tableViewer.setChecked(checkedBrowser, true);
597         
598         super.performDefaults();
599     }
600
601     /**
602      * Method declared on IPreferencePage. Subclasses should override
603      */

604     public boolean performOk() {
605         int choice;
606         if (internal.getSelection())
607             choice = WebBrowserPreference.INTERNAL;
608         else
609             choice = WebBrowserPreference.EXTERNAL;
610         WebBrowserPreference.setBrowserChoice(choice);
611         if (checkedBrowser != null)
612             BrowserManager.getInstance().setCurrentWebBrowser(checkedBrowser);
613
614         return true;
615     }
616 }
617
Popular Tags