1 11 12 package org.eclipse.help.ui.internal.search; 13 14 import java.util.ArrayList ; 15 16 import org.eclipse.help.internal.base.*; 17 import org.eclipse.help.internal.workingset.*; 18 import org.eclipse.help.ui.*; 19 import org.eclipse.help.ui.internal.Messages; 20 import org.eclipse.jface.preference.IPreferenceStore; 21 import org.eclipse.jface.viewers.*; 22 import org.eclipse.swt.SWT; 23 import org.eclipse.swt.custom.BusyIndicator; 24 import org.eclipse.swt.events.*; 25 import org.eclipse.swt.graphics.Font; 26 import org.eclipse.swt.layout.*; 27 import org.eclipse.swt.widgets.*; 28 29 32 public class LocalHelpPage extends RootScopePage { 33 private Button searchAll; 34 35 private Button searchSelected; 36 37 private CheckboxTreeViewer tree; 38 39 private ITreeContentProvider treeContentProvider; 40 41 private ILabelProvider elementLabelProvider; 42 43 45 private WorkingSet workingSet; 46 47 private Button capabilityFiltering; 48 49 public void init(IEngineDescriptor ed, String scopeSetName) { 50 super.init(ed, scopeSetName); 51 if (scopeSetName != null) 52 workingSet = BaseHelpSystem.getWorkingSetManager().getWorkingSet( 53 scopeSetName); 54 } 55 56 59 public LocalHelpPage() { 60 } 62 63 68 protected int createScopeContents(Composite parent) { 69 Font font = parent.getFont(); 70 initializeDialogUnits(parent); 71 72 searchAll = new Button(parent, SWT.RADIO); 73 searchAll.setText(Messages.selectAll); 74 GridData gd = new GridData(); 75 gd.horizontalSpan = 2; 76 searchAll.setLayoutData(gd); 77 searchAll.addSelectionListener(new SelectionAdapter() { 78 public void widgetSelected(SelectionEvent e) { 79 tree.getTree().setEnabled(false); 80 } 82 }); 83 84 searchSelected = new Button(parent, SWT.RADIO); 85 searchSelected.setText(Messages.selectWorkingSet); 86 gd = new GridData(); 87 gd.horizontalSpan = 2; 88 searchSelected.setLayoutData(gd); 89 searchSelected.addSelectionListener(new SelectionAdapter() { 90 public void widgetSelected(SelectionEvent e) { 91 tree.getTree().setEnabled(true); 92 } 94 }); 95 96 if (workingSet == null) 97 searchAll.setSelection(true); 98 else 99 searchSelected.setSelection(true); 100 101 Label label = new Label(parent, SWT.WRAP); 102 label.setFont(font); 103 label.setText(Messages.WorkingSetContent); 104 gd = new GridData(GridData.GRAB_HORIZONTAL 105 | GridData.HORIZONTAL_ALIGN_FILL 106 | GridData.VERTICAL_ALIGN_CENTER); 107 gd.horizontalSpan = 2; 108 label.setLayoutData(gd); 109 110 tree = new CheckboxTreeViewer(parent, SWT.BORDER | SWT.H_SCROLL 111 | SWT.V_SCROLL); 112 gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL); 113 gd.heightHint = convertHeightInCharsToPixels(15); 114 gd.horizontalSpan = 2; 115 tree.getControl().setLayoutData(gd); 116 tree.getControl().setFont(font); 117 118 treeContentProvider = new HelpWorkingSetTreeContentProvider(); 119 tree.setContentProvider(treeContentProvider); 120 121 elementLabelProvider = new HelpWorkingSetElementLabelProvider(); 122 tree.setLabelProvider(elementLabelProvider); 123 124 tree.setUseHashlookup(true); 125 126 tree.setInput(BaseHelpSystem.getWorkingSetManager().getRoot()); 127 128 tree.addCheckStateListener(new ICheckStateListener() { 129 public void checkStateChanged(CheckStateChangedEvent event) { 130 handleCheckStateChange(event); 131 } 132 }); 133 134 tree.addTreeListener(new ITreeViewerListener() { 135 public void treeCollapsed(TreeExpansionEvent event) { 136 } 137 138 public void treeExpanded(TreeExpansionEvent event) { 139 final Object element = event.getElement(); 140 if (tree.getGrayed(element) == false) 141 BusyIndicator.showWhile(getShell().getDisplay(), 142 new Runnable () { 143 public void run() { 144 setSubtreeChecked(element, tree 145 .getChecked(element), false); 146 } 147 }); 148 } 149 }); 150 tree.getTree().setEnabled(workingSet != null); 151 capabilityFiltering = new Button(parent, SWT.CHECK); 152 String checkboxLabel = HelpBasePlugin.getActivitySupport().getLocalScopeCheckboxLabel(); 153 if (checkboxLabel==null) 154 checkboxLabel = Messages.LocalHelpPage_capabilityFiltering_name; 155 capabilityFiltering.setText(checkboxLabel); 156 gd = new GridData(); 157 gd.horizontalSpan = 2; 158 capabilityFiltering.setLayoutData(gd); 159 160 initializeCheckedState(); 161 applyDialogFont(parent); 162 163 return 1; 166 } 167 168 private void initializeCheckedState() { 169 IPreferenceStore store = getPreferenceStore(); 170 capabilityFiltering.setSelection(store.getBoolean(getEngineDescriptor() 171 .getId() 172 + "." + LocalSearchScopeFactory.P_CAPABILITY_FILTERING)); if (workingSet == null) 174 return; 175 176 BusyIndicator.showWhile(getShell().getDisplay(), new Runnable () { 177 public void run() { 178 Object [] elements = workingSet.getElements(); 179 tree.setCheckedElements(elements); 180 for (int i = 0; i < elements.length; i++) { 181 Object element = elements[i]; 182 if (isExpandable(element)) 183 setSubtreeChecked(element, true, true); 184 updateParentState(element, true); 185 } 186 } 187 }); 188 } 189 190 boolean isExpandable(Object element) { 191 return treeContentProvider.hasChildren(element); 192 } 193 194 void updateParentState(Object child, boolean baseChildState) { 195 if (child == null) 196 return; 197 198 Object parent = treeContentProvider.getParent(child); 199 if (parent == null) 200 return; 201 202 boolean allSameState = true; 203 Object [] children = null; 204 children = treeContentProvider.getChildren(parent); 205 206 for (int i = children.length - 1; i >= 0; i--) { 207 if (tree.getChecked(children[i]) != baseChildState 208 || tree.getGrayed(children[i])) { 209 allSameState = false; 210 break; 211 } 212 } 213 214 tree.setGrayed(parent, !allSameState); 215 tree.setChecked(parent, !allSameState || baseChildState); 216 217 updateParentState(parent, baseChildState); 218 } 219 220 void setSubtreeChecked(Object parent, boolean state, 221 boolean checkExpandedState) { 222 223 Object [] children = treeContentProvider.getChildren(parent); 224 for (int i = children.length - 1; i >= 0; i--) { 225 Object element = children[i]; 226 if (state) { 227 tree.setChecked(element, true); 228 tree.setGrayed(element, false); 229 } else 230 tree.setGrayChecked(element, false); 231 if (isExpandable(element)) 232 setSubtreeChecked(element, state, checkExpandedState); 233 } 234 } 235 236 private void findCheckedElements(java.util.List checkedResources, 237 Object parent) { 238 Object [] children = treeContentProvider.getChildren(parent); 239 for (int i = 0; i < children.length; i++) { 240 if (tree.getGrayed(children[i])) 241 findCheckedElements(checkedResources, children[i]); 242 else if (tree.getChecked(children[i])) 243 checkedResources.add(children[i]); 244 } 245 } 246 247 void handleCheckStateChange(final CheckStateChangedEvent event) { 248 BusyIndicator.showWhile(getShell().getDisplay(), new Runnable () { 249 public void run() { 250 Object element = event.getElement(); 251 boolean state = event.getChecked(); 252 tree.setGrayed(element, false); 253 if (isExpandable(element)) 254 setSubtreeChecked(element, state, state); 255 257 updateParentState(element, state); 258 } 260 }); 261 } 262 263 public WorkingSet getWorkingSet() { 264 ArrayList elements = new ArrayList (10); 265 findCheckedElements(elements, tree.getInput()); 266 if (workingSet == null) { 267 workingSet = new WorkingSet( 268 getScopeSetName(), 269 (AdaptableHelpResource[]) elements 270 .toArray(new AdaptableHelpResource[elements.size()])); 271 } else { 272 workingSet.setName(getScopeSetName()); 273 workingSet.setElements((AdaptableHelpResource[]) elements 274 .toArray(new AdaptableHelpResource[elements.size()])); 275 } 276 return workingSet; 277 } 278 279 284 public boolean performOk() { 285 if (searchSelected.getSelection()) 286 BaseHelpSystem.getWorkingSetManager() 287 .addWorkingSet(getWorkingSet()); 288 else 289 BaseHelpSystem.getWorkingSetManager().removeWorkingSet( 290 getWorkingSet()); 291 292 getPreferenceStore().setValue( 293 getKey(LocalSearchScopeFactory.P_WORKING_SET), 294 getScopeSetName()); 295 getPreferenceStore().setValue( 296 getKey(LocalSearchScopeFactory.P_CAPABILITY_FILTERING), 297 capabilityFiltering.getSelection()); 298 return super.performOk(); 299 } 300 301 private String getKey(String key) { 302 return getEngineDescriptor().getId() + "." + key; } 304 } 305 | Popular Tags |