KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > help > ui > internal > workingset > HelpWorkingSetPage


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

11 package org.eclipse.help.ui.internal.workingset;
12
13 import java.util.*;
14
15 import org.eclipse.core.runtime.*;
16 import org.eclipse.help.internal.base.*;
17 import org.eclipse.help.internal.workingset.*;
18 import org.eclipse.help.ui.internal.*;
19 import org.eclipse.help.ui.internal.ide.*;
20 import org.eclipse.jface.util.*;
21 import org.eclipse.jface.viewers.*;
22 import org.eclipse.jface.wizard.*;
23 import org.eclipse.swt.*;
24 import org.eclipse.swt.custom.*;
25 import org.eclipse.swt.events.*;
26 import org.eclipse.swt.graphics.*;
27 import org.eclipse.swt.layout.*;
28 import org.eclipse.swt.widgets.*;
29 import org.eclipse.ui.*;
30 import org.eclipse.ui.dialogs.*;
31
32 /**
33  * Page for help working sets.
34  */

35 public class HelpWorkingSetPage extends WizardPage implements IWorkingSetPage {
36     // In 3.0 this class moved to org.eclipse.help.ide plug-in
37
// but user might have help working sets created in 2.1, with page ID from
38
// help.ui plug-in
39
public final static String JavaDoc PAGE_ID = HelpUIPlugin.PLUGIN_ID
40             + ".HelpWorkingSetPage"; //$NON-NLS-1$
41
public final static String JavaDoc PAGE_TITLE = HelpIdeResources
42             .getString("WorkingSetPageTitle"); //$NON-NLS-1$
43
public final static String JavaDoc PAGE_DESCRIPTION = HelpIdeResources
44             .getString("WorkingSetPageDescription"); //$NON-NLS-1$
45

46     private Text workingSetName;
47     CheckboxTreeViewer tree;
48     private ITreeContentProvider treeContentProvider;
49     private ILabelProvider elementLabelProvider;
50
51     private boolean firstCheck;
52     IWorkingSet workingSet;
53
54     /**
55      * Default constructor.
56      */

57     public HelpWorkingSetPage() {
58         super(PAGE_ID, PAGE_TITLE, null);
59         setDescription(PAGE_DESCRIPTION);
60         firstCheck = true;
61     }
62
63     /**
64      * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
65      */

66     public void createControl(Composite parent) {
67         Font font = parent.getFont();
68         initializeDialogUnits(parent);
69
70         Composite composite = new Composite(parent, SWT.NONE);
71         composite.setLayout(new GridLayout());
72         composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
73         setControl(composite);
74
75         Label label = new Label(composite, SWT.WRAP);
76         label.setFont(font);
77         label.setText(HelpIdeResources.getString("WorkingSetName")); //$NON-NLS-1$
78
GridData gd = new GridData(GridData.GRAB_HORIZONTAL
79                 | GridData.HORIZONTAL_ALIGN_FILL
80                 | GridData.VERTICAL_ALIGN_CENTER);
81         label.setLayoutData(gd);
82
83         workingSetName = new Text(composite, SWT.SINGLE | SWT.BORDER);
84         workingSetName.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
85                 | GridData.HORIZONTAL_ALIGN_FILL));
86         workingSetName.addModifyListener(new ModifyListener() {
87             public void modifyText(ModifyEvent e) {
88                 validateInput();
89             }
90         });
91         workingSetName.setFocus();
92         workingSetName.setFont(font);
93
94         label = new Label(composite, SWT.WRAP);
95         label.setFont(font);
96         label.setText(HelpIdeResources.getString("WorkingSetContent")); //$NON-NLS-1$
97
gd = new GridData(GridData.GRAB_HORIZONTAL
98                 | GridData.HORIZONTAL_ALIGN_FILL
99                 | GridData.VERTICAL_ALIGN_CENTER);
100         label.setLayoutData(gd);
101
102         tree = new CheckboxTreeViewer(composite, SWT.BORDER | SWT.H_SCROLL
103                 | SWT.V_SCROLL);
104         gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL);
105         gd.heightHint = convertHeightInCharsToPixels(15);
106         tree.getControl().setLayoutData(gd);
107         tree.getControl().setFont(font);
108
109         treeContentProvider = new HelpWorkingSetTreeContentProvider();
110         tree.setContentProvider(treeContentProvider);
111
112         elementLabelProvider = new HelpWorkingSetElementLabelProvider();
113         tree.setLabelProvider(elementLabelProvider);
114
115         tree.setUseHashlookup(true);
116
117         tree.setInput(BaseHelpSystem.getWorkingSetManager().getRoot());
118
119         tree.addCheckStateListener(new ICheckStateListener() {
120             public void checkStateChanged(CheckStateChangedEvent event) {
121                 handleCheckStateChange(event);
122             }
123         });
124
125         tree.addTreeListener(new ITreeViewerListener() {
126             public void treeCollapsed(TreeExpansionEvent event) {
127             }
128             public void treeExpanded(TreeExpansionEvent event) {
129                 final Object JavaDoc element = event.getElement();
130                 if (tree.getGrayed(element) == false)
131                     BusyIndicator.showWhile(getShell().getDisplay(),
132                             new Runnable JavaDoc() {
133                                 public void run() {
134                                     setSubtreeChecked(element, tree
135                                             .getChecked(element), false);
136                                 }
137                             });
138             }
139         });
140
141         if (workingSet != null) {
142             workingSetName.setText(workingSet.getName());
143             // May need to reconcile working sets
144
HelpIdePlugin.getDefault().getWorkingSetSynchronizer()
145                     .addWorkingSet(workingSet);
146         }
147         initializeCheckedState();
148         validateInput();
149
150         // Set help for the page
151
//WorkbenchHelp.setHelp(tree, "help_workingset_page");
152
}
153
154     /**
155      * @see org.eclipse.ui.dialogs.IWorkingSetPage#finish()
156      */

157     public void finish() {
158         String JavaDoc workingSetName = this.workingSetName.getText();
159         ArrayList elements = new ArrayList(10);
160         findCheckedElements(elements, tree.getInput());
161         if (workingSet == null) {
162             HelpWorkingSet ws = new HelpWorkingSet(
163                     workingSetName,
164                     (AdaptableHelpResource[]) elements
165                             .toArray(new AdaptableHelpResource[elements.size()]));
166             workingSet = ws.getIWorkingSet();
167         } else {
168             workingSet.setName(workingSetName);
169             workingSet.setElements((IAdaptable[]) elements
170                     .toArray(new IAdaptable[elements.size()]));
171         }
172     }
173
174     /**
175      * @see org.eclipse.ui.dialogs.IWorkingSetPage#getSelection()
176      */

177     public IWorkingSet getSelection() {
178         return workingSet;
179     }
180
181     /**
182      * @see org.eclipse.ui.dialogs.IWorkingSetPage#setSelection(org.eclipse.ui.IWorkingSet)
183      */

184     public void setSelection(IWorkingSet workingSet) {
185         Assert.isNotNull(workingSet, "Working set must not be null"); //$NON-NLS-1$
186
this.workingSet = workingSet;
187         if (getContainer() != null && getShell() != null
188                 && workingSetName != null) {
189             firstCheck = false;
190             workingSetName.setText(workingSet.getName());
191             initializeCheckedState();
192             validateInput();
193         }
194     }
195
196     void validateInput() {
197         String JavaDoc errorMessage = null;
198         String JavaDoc newText = workingSetName.getText();
199
200         if (newText.equals(newText.trim()) == false)
201             errorMessage = HelpIdeResources.getString("WE030"); //$NON-NLS-1$
202
if (newText.equals("")) { //$NON-NLS-1$
203
if (firstCheck) {
204                 setPageComplete(false);
205                 firstCheck = false;
206                 return;
207             } else
208                 errorMessage = HelpIdeResources.getString("WE031"); //$NON-NLS-1$
209
}
210
211         firstCheck = false;
212
213         if (errorMessage == null
214                 && (workingSet == null || newText.equals(workingSet.getName()) == false)) {
215             IWorkingSet[] workingSets = PlatformUI.getWorkbench()
216                     .getWorkingSetManager().getWorkingSets();
217             for (int i = 0; i < workingSets.length; i++) {
218                 if (newText.equals(workingSets[i].getName())) {
219                     errorMessage = HelpIdeResources.getString("WE032"); //$NON-NLS-1$
220
}
221             }
222         }
223         if (errorMessage == null && tree.getCheckedElements().length == 0)
224             errorMessage = HelpIdeResources.getString("WE033"); //$NON-NLS-1$
225

226         setErrorMessage(errorMessage);
227         setPageComplete(errorMessage == null);
228     }
229
230     private void initializeCheckedState() {
231         if (workingSet == null)
232             return;
233
234         BusyIndicator.showWhile(getShell().getDisplay(), new Runnable JavaDoc() {
235             public void run() {
236                 Object JavaDoc[] elements = workingSet.getElements();
237                 tree.setCheckedElements(elements);
238                 for (int i = 0; i < elements.length; i++) {
239                     Object JavaDoc element = elements[i];
240                     if (isExpandable(element))
241                         setSubtreeChecked(element, true, true);
242                     updateParentState(element, true);
243                 }
244             }
245         });
246     }
247
248     boolean isExpandable(Object JavaDoc element) {
249         return treeContentProvider.hasChildren(element);
250     }
251
252     void updateParentState(Object JavaDoc child, boolean baseChildState) {
253         if (child == null)
254             return;
255
256         Object JavaDoc parent = treeContentProvider.getParent(child);
257         if (parent == null)
258             return;
259
260         boolean allSameState = true;
261         Object JavaDoc[] children = null;
262         children = treeContentProvider.getChildren(parent);
263
264         for (int i = children.length - 1; i >= 0; i--) {
265             if (tree.getChecked(children[i]) != baseChildState
266                     || tree.getGrayed(children[i])) {
267                 allSameState = false;
268                 break;
269             }
270         }
271
272         tree.setGrayed(parent, !allSameState);
273         tree.setChecked(parent, !allSameState || baseChildState);
274
275         updateParentState(parent, baseChildState);
276     }
277
278     void setSubtreeChecked(Object JavaDoc parent, boolean state,
279             boolean checkExpandedState) {
280
281         Object JavaDoc[] children = treeContentProvider.getChildren(parent);
282         for (int i = children.length - 1; i >= 0; i--) {
283             Object JavaDoc element = children[i];
284             if (state) {
285                 tree.setChecked(element, true);
286                 tree.setGrayed(element, false);
287             } else
288                 tree.setGrayChecked(element, false);
289             if (isExpandable(element))
290                 setSubtreeChecked(element, state, checkExpandedState);
291         }
292     }
293
294     private void findCheckedElements(java.util.List JavaDoc checkedResources,
295             Object JavaDoc parent) {
296         Object JavaDoc[] children = treeContentProvider.getChildren(parent);
297         for (int i = 0; i < children.length; i++) {
298             if (tree.getGrayed(children[i]))
299                 findCheckedElements(checkedResources, children[i]);
300             else if (tree.getChecked(children[i]))
301                 checkedResources.add(children[i]);
302         }
303     }
304
305     void handleCheckStateChange(final CheckStateChangedEvent event) {
306         BusyIndicator.showWhile(getShell().getDisplay(), new Runnable JavaDoc() {
307             public void run() {
308                 Object JavaDoc element = event.getElement();
309                 boolean state = event.getChecked();
310                 tree.setGrayed(element, false);
311                 if (isExpandable(element))
312                     setSubtreeChecked(element, state, state);
313                 // only check subtree if state is set to true
314

315                 updateParentState(element, state);
316                 validateInput();
317             }
318         });
319     }
320
321 }
322
Popular Tags