### Eclipse Workspace Patch 1.0 #P org.eclipse.help.ui Index: src/org/eclipse/help/ui/internal/Messages.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/Messages.java,v retrieving revision 1.42 diff -u -r1.42 Messages.java --- src/org/eclipse/help/ui/internal/Messages.java 5 Feb 2010 18:04:20 -0000 1.42 +++ src/org/eclipse/help/ui/internal/Messages.java 12 Apr 2010 17:51:32 -0000 @@ -74,6 +74,8 @@ public static String SearchPart_expand; public static String SearchPart_potential_hit; public static String WorkingSetContent; + public static String WorkingSetCriteria; + public static String UncategorizedCriteria; public static String selectAll; public static String selectWorkingSet; public static String FederatedSearchPart_advanced; Index: src/org/eclipse/help/ui/internal/Messages.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/Messages.properties,v retrieving revision 1.55 diff -u -r1.55 Messages.properties --- src/org/eclipse/help/ui/internal/Messages.properties 5 Feb 2010 18:04:20 -0000 1.55 +++ src/org/eclipse/help/ui/internal/Messages.properties 12 Apr 2010 17:51:32 -0000 @@ -86,6 +86,8 @@ # LocalHelpPage WorkingSetContent = Working set &content: +WorkingSetCriteria = Working set cr&iteria: +UncategorizedCriteria=Uncategorized selectAll=Sea&rch all topics selectWorkingSet=Search only the following &topics FederatedSearchPart_advanced=Advanced Settings Index: src/org/eclipse/help/ui/internal/search/HelpCriteriaContentProvider.java =================================================================== RCS file: src/org/eclipse/help/ui/internal/search/HelpCriteriaContentProvider.java diff -N src/org/eclipse/help/ui/internal/search/HelpCriteriaContentProvider.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/help/ui/internal/search/HelpCriteriaContentProvider.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,164 @@ +/******************************************************************************* + * Copyright (c) 2010 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.help.ui.internal.search; + +import org.eclipse.help.internal.base.BaseHelpSystem; +import org.eclipse.help.ui.internal.Messages; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.Viewer; + +public class HelpCriteriaContentProvider implements ITreeContentProvider { + + public static final String UNCATEGORIZED = "Uncategorized"; //$NON-NLS-1$ + + public static class CriterionName{ + public CriterionName(String id, Object parent) { + this.id = id; + this.parent = parent; + } + + private String id; + private Object parent; + + public String getId() { + return id; + } + + public String getName() { + return id; + } + + public Object getParent() { + return parent; + } + + public boolean equals(Object arg0) { + if (arg0 instanceof CriterionName) { + CriterionName other = (CriterionName) arg0; + return other.id.equals(this.id); + } + return false; + } + + public int hashCode() { + return id.hashCode(); + } + } + + public static class CriterionValue{ + public CriterionValue(String id, Object parent) { + this.id = id; + this.parent = parent; + } + + private String id; + private Object parent; + + public String getId() { + return id; + } + + public String getName() { + if (id.equals(UNCATEGORIZED)) { + return Messages.UncategorizedCriteria; + } + return id; + } + + public Object getParent() { + return parent; + } + + public boolean equals(Object arg0) { + if (arg0 instanceof CriterionValue) { + CriterionValue other = (CriterionValue) arg0; + return other.id.equals(this.id) && parent.equals(other.parent); + } + return false; + } + + public int hashCode() { + return id.hashCode() + parent.hashCode(); + } + } + + /** + * Constructor for HelpWorkingSetTreeContentProvider. + */ + public HelpCriteriaContentProvider() { + super(); + } + + /** + * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) + */ + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof String[]) { + String[] names = (String[]) parentElement; + CriterionName criterionNames[] = new CriterionName[names.length]; + for (int i = 0; i < names.length; i++) { + criterionNames[i] = new CriterionName(names[i], parentElement); + } + return criterionNames; + } else if (parentElement instanceof CriterionName) { + CriterionName parentCriterion = (CriterionName) parentElement; + + String[] values = BaseHelpSystem.getWorkingSetManager().getCriterionValueIds(parentCriterion.getId()); + CriterionValue[] criterionValues = new CriterionValue[values.length]; + for (int i = 0; i < values.length; i++) { + criterionValues[i] = new CriterionValue(values[i], parentElement); + } + return criterionValues; + } else { + return new Object[0]; + } + } + + /** + * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) + */ + public Object getParent(Object element) { + if (element instanceof CriterionName) { + return ((CriterionName) element).getParent(); + } else if (element instanceof CriterionValue) { + return ((CriterionValue) element).getParent(); + } else + return null; + } + + /** + * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) + */ + public boolean hasChildren(Object element) { + return getChildren(element).length > 0; + } + + /** + * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) + */ + public Object[] getElements(Object inputElement) { + return getChildren(inputElement); + } + + /** + * @see org.eclipse.jface.viewers.IContentProvider#dispose() + */ + public void dispose() { + } + + /** + * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, + * java.lang.Object, java.lang.Object) + */ + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + +} Index: src/org/eclipse/help/ui/internal/search/HelpCriteriaLabelProvider.java =================================================================== RCS file: src/org/eclipse/help/ui/internal/search/HelpCriteriaLabelProvider.java diff -N src/org/eclipse/help/ui/internal/search/HelpCriteriaLabelProvider.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/help/ui/internal/search/HelpCriteriaLabelProvider.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2010 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.help.ui.internal.search; + +import org.eclipse.help.ui.internal.search.HelpCriteriaContentProvider.CriterionName; +import org.eclipse.help.ui.internal.search.HelpCriteriaContentProvider.CriterionValue; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.swt.graphics.Image; + +public class HelpCriteriaLabelProvider extends LabelProvider { + + /** + * Constructor for HelpWorkingSetElementLabelProvider. + */ + public HelpCriteriaLabelProvider() { + super(); + } + + /** + * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object) + */ + public Image getImage(Object element) { + return null; + } + + /** + * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) + */ + public String getText(Object element) { + if (element instanceof HelpCriteriaContentProvider.CriterionName) { + CriterionName criterionName = (HelpCriteriaContentProvider.CriterionName)element; + return criterionName.getName(); + } else if (element instanceof HelpCriteriaContentProvider.CriterionValue) { + CriterionValue criterionValue = (HelpCriteriaContentProvider.CriterionValue)element; + return criterionValue.getName(); + } + return null; + } + +} Index: src/org/eclipse/help/ui/internal/search/LocalHelpPage.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.help.ui/src/org/eclipse/help/ui/internal/search/LocalHelpPage.java,v retrieving revision 1.19 diff -u -r1.19 LocalHelpPage.java --- src/org/eclipse/help/ui/internal/search/LocalHelpPage.java 8 Apr 2010 21:04:52 -0000 1.19 +++ src/org/eclipse/help/ui/internal/search/LocalHelpPage.java 12 Apr 2010 17:51:40 -0000 @@ -12,11 +12,17 @@ package org.eclipse.help.ui.internal.search; import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.eclipse.help.internal.HelpPlugin; import org.eclipse.help.internal.base.*; +import org.eclipse.help.internal.criteria.CriterionResource; import org.eclipse.help.internal.workingset.*; import org.eclipse.help.ui.*; import org.eclipse.help.ui.internal.Messages; +import org.eclipse.help.ui.internal.search.HelpCriteriaContentProvider.CriterionName; +import org.eclipse.help.ui.internal.search.HelpCriteriaContentProvider.CriterionValue; import org.eclipse.jface.viewers.*; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; @@ -33,11 +39,17 @@ private Button searchSelected; - private CheckboxTreeViewer tree; + private CheckboxTreeViewer contentTree; - private ITreeContentProvider treeContentProvider; + private ITreeContentProvider contentTreeContentProvider; - private ILabelProvider elementLabelProvider; + private ILabelProvider contentTreeLabelProvider; + + private CheckboxTreeViewer criteriaTree; + + private ITreeContentProvider criteriaTreeContentProvider; + + private ILabelProvider criteriaTreeLabelProvider; //private boolean firstCheck; @@ -73,8 +85,8 @@ searchAll.setLayoutData(gd); searchAll.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { - tree.getTree().setEnabled(false); - // searchQueryData.setBookFiltering(false); + contentTree.getTree().setEnabled(false); + criteriaTree.getTree().setEnabled(false); } }); @@ -85,8 +97,8 @@ searchSelected.setLayoutData(gd); searchSelected.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { - tree.getTree().setEnabled(true); - // searchQueryData.setBookFiltering(false); + contentTree.getTree().setEnabled(true); + criteriaTree.getTree().setEnabled(true); } }); @@ -95,64 +107,135 @@ else searchSelected.setSelection(true); - Label label = new Label(parent, SWT.WRAP); - label.setFont(font); - label.setText(Messages.WorkingSetContent); + Label contentLabel = new Label(parent, SWT.WRAP); + contentLabel.setFont(font); + contentLabel.setText(Messages.WorkingSetContent); gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER); gd.horizontalSpan = 2; - label.setLayoutData(gd); + contentLabel.setLayoutData(gd); + + createContentTree(parent, font); + + if (HelpPlugin.getCriteriaManager().isCriteriaEnabled()) { + Label criteriaLabel = new Label(parent, SWT.WRAP); + criteriaLabel.setFont(font); + criteriaLabel.setText(Messages.WorkingSetCriteria); + gd = new GridData(GridData.GRAB_HORIZONTAL + | GridData.HORIZONTAL_ALIGN_FILL + | GridData.VERTICAL_ALIGN_CENTER); + gd.horizontalSpan = 2; + criteriaLabel.setLayoutData(gd); + createCriteriaTree(parent, font); + } + + initializeCheckedState(); + applyDialogFont(parent); - tree = new CheckboxTreeViewer(parent, SWT.BORDER | SWT.H_SCROLL + // Set help for the page + // WorkbenchHelp.setHelp(tree, "help_workingset_page"); + return 1; + } + + protected void createContentTree(Composite parent, Font font) { + GridData gd; + contentTree = new CheckboxTreeViewer(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL); - gd.heightHint = convertHeightInCharsToPixels(15); + gd.heightHint = getTreeHeightHint(); gd.horizontalSpan = 2; - tree.getControl().setLayoutData(gd); - tree.getControl().setFont(font); + contentTree.getControl().setLayoutData(gd); + contentTree.getControl().setFont(font); - treeContentProvider = new HelpWorkingSetTreeContentProvider(); - tree.setContentProvider(treeContentProvider); + contentTreeContentProvider = new HelpWorkingSetTreeContentProvider(); + contentTree.setContentProvider(contentTreeContentProvider); - elementLabelProvider = new HelpWorkingSetElementLabelProvider(); - tree.setLabelProvider(elementLabelProvider); + contentTreeLabelProvider = new HelpWorkingSetElementLabelProvider(); + contentTree.setLabelProvider(contentTreeLabelProvider); - tree.setUseHashlookup(true); + contentTree.setUseHashlookup(true); - tree.setInput(BaseHelpSystem.getWorkingSetManager().getRoot()); + contentTree.setInput(BaseHelpSystem.getWorkingSetManager().getRoot()); - tree.addCheckStateListener(new ICheckStateListener() { + contentTree.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { - handleCheckStateChange(event); + handleCheckStateChange(event, contentTree, contentTreeContentProvider); } }); - tree.addTreeListener(new ITreeViewerListener() { + contentTree.addTreeListener(new ITreeViewerListener() { public void treeCollapsed(TreeExpansionEvent event) { } public void treeExpanded(TreeExpansionEvent event) { final Object element = event.getElement(); - if (tree.getGrayed(element) == false) + if (contentTree.getGrayed(element) == false) BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() { public void run() { - setSubtreeChecked(element, tree - .getChecked(element), false); + setSubtreeChecked(element, contentTree + .getChecked(element), false, contentTree, contentTreeContentProvider); } }); } }); - tree.getTree().setEnabled(workingSet != null); - - initializeCheckedState(); - applyDialogFont(parent); + contentTree.getTree().setEnabled(workingSet != null); + } - // Set help for the page - // WorkbenchHelp.setHelp(tree, "help_workingset_page"); - return 1; + protected int getTreeHeightHint() { + if (HelpPlugin.getCriteriaManager().isCriteriaEnabled()) { + return convertHeightInCharsToPixels(8); + } + return convertHeightInCharsToPixels(15); } + + + protected void createCriteriaTree(Composite parent, Font font) { + GridData gd; + criteriaTree = new CheckboxTreeViewer(parent, SWT.BORDER | SWT.H_SCROLL + | SWT.V_SCROLL); + gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL); + gd.heightHint = getTreeHeightHint(); + gd.horizontalSpan = 2; + criteriaTree.getControl().setLayoutData(gd); + criteriaTree.getControl().setFont(font); + + criteriaTreeContentProvider = new HelpCriteriaContentProvider(); + criteriaTree.setContentProvider(criteriaTreeContentProvider); + + criteriaTreeLabelProvider = new HelpCriteriaLabelProvider(); + criteriaTree.setLabelProvider(criteriaTreeLabelProvider); + + criteriaTree.setUseHashlookup(true); + + criteriaTree.setInput(BaseHelpSystem.getWorkingSetManager().getCriterionIds()); + + criteriaTree.addCheckStateListener(new ICheckStateListener() { + public void checkStateChanged(CheckStateChangedEvent event) { + handleCheckStateChange(event, criteriaTree, criteriaTreeContentProvider); + } + }); + + criteriaTree.addTreeListener(new ITreeViewerListener() { + public void treeCollapsed(TreeExpansionEvent event) { + } + + public void treeExpanded(TreeExpansionEvent event) { + final Object element = event.getElement(); + if (criteriaTree.getGrayed(element) == false) + BusyIndicator.showWhile(getShell().getDisplay(), + new Runnable() { + public void run() { + setSubtreeChecked(element, criteriaTree + .getChecked(element), false, criteriaTree, criteriaTreeContentProvider); + } + }); + } + }); + criteriaTree.getTree().setEnabled(workingSet != null); + } + private void initializeCheckedState() { if (workingSet == null) @@ -160,33 +243,30 @@ BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() { public void run() { - Object[] elements = workingSet.getElements(); - tree.setCheckedElements(elements); - for (int i = 0; i < elements.length; i++) { - Object element = elements[i]; - if (isExpandable(element)) - setSubtreeChecked(element, true, true); - updateParentState(element, true); + initializeContentTree(); + if (HelpPlugin.getCriteriaManager().isCriteriaEnabled()) { + initializeCriteriaTree(); } } }); } - boolean isExpandable(Object element) { - return treeContentProvider.hasChildren(element); + boolean isExpandable(Object element, ITreeContentProvider contentProvider) { + return contentProvider.hasChildren(element); } - void updateParentState(Object child, boolean baseChildState) { + void updateParentState(Object child, boolean baseChildState, + CheckboxTreeViewer tree, ITreeContentProvider contentProvider) { if (child == null) return; - Object parent = treeContentProvider.getParent(child); + Object parent = contentProvider.getParent(child); if (parent == null) return; boolean allSameState = true; Object[] children = null; - children = treeContentProvider.getChildren(parent); + children = contentProvider.getChildren(parent); for (int i = children.length - 1; i >= 0; i--) { if (tree.getChecked(children[i]) != baseChildState @@ -199,13 +279,14 @@ tree.setGrayed(parent, !allSameState); tree.setChecked(parent, !allSameState || baseChildState); - updateParentState(parent, baseChildState); + updateParentState(parent, baseChildState, tree, contentProvider); } void setSubtreeChecked(Object parent, boolean state, - boolean checkExpandedState) { + boolean checkExpandedState, + CheckboxTreeViewer tree, ITreeContentProvider contentProvider) { - Object[] children = treeContentProvider.getChildren(parent); + Object[] children = contentProvider.getChildren(parent); for (int i = children.length - 1; i >= 0; i--) { Object element = children[i]; if (state) { @@ -213,33 +294,56 @@ tree.setGrayed(element, false); } else tree.setGrayChecked(element, false); - if (isExpandable(element)) - setSubtreeChecked(element, state, checkExpandedState); + if (isExpandable(element, contentProvider)) + setSubtreeChecked(element, state, checkExpandedState, tree, contentProvider); } } - private void findCheckedElements(java.util.List checkedResources, - Object parent) { - Object[] children = treeContentProvider.getChildren(parent); + private void findCheckedElements(java.util.List checkedResources, Object parent, + CheckboxTreeViewer tree, ITreeContentProvider contentProvider) { + Object[] children = contentProvider.getChildren(parent); for (int i = 0; i < children.length; i++) { if (tree.getGrayed(children[i])) - findCheckedElements(checkedResources, children[i]); + findCheckedElements(checkedResources, children[i], tree, contentProvider); else if (tree.getChecked(children[i])) checkedResources.add(children[i]); } } + + private CriterionResource[] findCheckedCriteria(Object parent, + CheckboxTreeViewer tree, ITreeContentProvider contentProvider) { + Object[] children = contentProvider.getChildren(parent); + List resources = new ArrayList(); + for (int i = 0; i < children.length; i++) { + // First level children are names + CriterionName name = (CriterionName) children[i]; + CriterionResource resource = new CriterionResource(name.getId()); + Object[] grandChildren = contentProvider.getChildren(name); + for (int j = 0; j < grandChildren.length; j++) { + if (tree.getChecked(grandChildren[j])) { + CriterionValue value = (CriterionValue) grandChildren[j]; + resource.addCriterionValue(value.getId()); + } + } + if (resource.getCriterionValues().size() > 0) { + resources.add(resource); + } + } + return (CriterionResource[])resources.toArray(new CriterionResource[resources.size()]); + } - void handleCheckStateChange(final CheckStateChangedEvent event) { + void handleCheckStateChange(final CheckStateChangedEvent event, + final CheckboxTreeViewer tree, final ITreeContentProvider contentProvider) { BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() { public void run() { Object element = event.getElement(); boolean state = event.getChecked(); tree.setGrayed(element, false); - if (isExpandable(element)) - setSubtreeChecked(element, state, state); + if (isExpandable(element, contentProvider)) + setSubtreeChecked(element, state, state, tree, contentProvider); // only check subtree if state is set to true - updateParentState(element, state); + updateParentState(element, state, tree, contentProvider); // validateInput(); } }); @@ -247,16 +351,26 @@ public WorkingSet getWorkingSet() { ArrayList elements = new ArrayList(10); - findCheckedElements(elements, tree.getInput()); + CriterionResource[] criteria; + if (!HelpPlugin.getCriteriaManager().isCriteriaEnabled()) { + criteria = new CriterionResource[0]; + } else { + criteria = findCheckedCriteria( + criteriaTree.getInput(), + criteriaTree, + criteriaTreeContentProvider); + } + findCheckedElements(elements, contentTree.getInput(), contentTree, contentTreeContentProvider); if (workingSet == null) { workingSet = new WorkingSet( getScopeSetName(), (AdaptableHelpResource[]) elements - .toArray(new AdaptableHelpResource[elements.size()])); + .toArray(new AdaptableHelpResource[elements.size()]), criteria); } else { workingSet.setName(getScopeSetName()); workingSet.setElements((AdaptableHelpResource[]) elements .toArray(new AdaptableHelpResource[elements.size()])); + workingSet.setCriteria(criteria); } return workingSet; } @@ -286,4 +400,31 @@ private String getKey(String key) { return getEngineDescriptor().getId() + "." + key; //$NON-NLS-1$ } + + protected void initializeContentTree() { + Object[] elements = workingSet.getElements(); + contentTree.setCheckedElements(elements); + for (int i = 0; i < elements.length; i++) { + Object element = elements[i]; + if (isExpandable(element, contentTreeContentProvider)) + setSubtreeChecked(element, true, true, contentTree, contentTreeContentProvider); + updateParentState(element, true, contentTree, contentTreeContentProvider); + } + } + + protected void initializeCriteriaTree() { + CriterionResource[] criteria = workingSet.getCriteria(); + criteriaTree.setCheckedElements(criteria); + for (int i = 0; i < criteria.length; i++) { + CriterionResource element = criteria[i]; + CriterionName name = new CriterionName(element.getCriterionName(), null); + List values = element.getCriterionValues(); + for (Iterator iter = values.iterator(); iter.hasNext();) { + String valueString = (String) iter.next(); + CriterionValue value = new CriterionValue(valueString, name); + criteriaTree.setChecked(value, true); + updateParentState(value, true, criteriaTree, criteriaTreeContentProvider); + } + } + } }