1 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 35 public class HelpWorkingSetPage extends WizardPage implements IWorkingSetPage { 36 public final static String PAGE_ID = HelpUIPlugin.PLUGIN_ID 40 + ".HelpWorkingSetPage"; public final static String PAGE_TITLE = HelpIdeResources 42 .getString("WorkingSetPageTitle"); public final static String PAGE_DESCRIPTION = HelpIdeResources 44 .getString("WorkingSetPageDescription"); 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 57 public HelpWorkingSetPage() { 58 super(PAGE_ID, PAGE_TITLE, null); 59 setDescription(PAGE_DESCRIPTION); 60 firstCheck = true; 61 } 62 63 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")); 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")); 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 element = event.getElement(); 130 if (tree.getGrayed(element) == false) 131 BusyIndicator.showWhile(getShell().getDisplay(), 132 new Runnable () { 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 HelpIdePlugin.getDefault().getWorkingSetSynchronizer() 145 .addWorkingSet(workingSet); 146 } 147 initializeCheckedState(); 148 validateInput(); 149 150 } 153 154 157 public void finish() { 158 String 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 177 public IWorkingSet getSelection() { 178 return workingSet; 179 } 180 181 184 public void setSelection(IWorkingSet workingSet) { 185 Assert.isNotNull(workingSet, "Working set must not be null"); 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 errorMessage = null; 198 String newText = workingSetName.getText(); 199 200 if (newText.equals(newText.trim()) == false) 201 errorMessage = HelpIdeResources.getString("WE030"); if (newText.equals("")) { if (firstCheck) { 204 setPageComplete(false); 205 firstCheck = false; 206 return; 207 } else 208 errorMessage = HelpIdeResources.getString("WE031"); } 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"); } 221 } 222 } 223 if (errorMessage == null && tree.getCheckedElements().length == 0) 224 errorMessage = HelpIdeResources.getString("WE033"); 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 () { 235 public void run() { 236 Object [] elements = workingSet.getElements(); 237 tree.setCheckedElements(elements); 238 for (int i = 0; i < elements.length; i++) { 239 Object 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 element) { 249 return treeContentProvider.hasChildren(element); 250 } 251 252 void updateParentState(Object child, boolean baseChildState) { 253 if (child == null) 254 return; 255 256 Object parent = treeContentProvider.getParent(child); 257 if (parent == null) 258 return; 259 260 boolean allSameState = true; 261 Object [] 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 parent, boolean state, 279 boolean checkExpandedState) { 280 281 Object [] children = treeContentProvider.getChildren(parent); 282 for (int i = children.length - 1; i >= 0; i--) { 283 Object 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 checkedResources, 295 Object parent) { 296 Object [] 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 () { 307 public void run() { 308 Object element = event.getElement(); 309 boolean state = event.getChecked(); 310 tree.setGrayed(element, false); 311 if (isExpandable(element)) 312 setSubtreeChecked(element, state, state); 313 315 updateParentState(element, state); 316 validateInput(); 317 } 318 }); 319 } 320 321 } 322 | Popular Tags |