diff options
Diffstat (limited to 'basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ComponentResultsView.java')
-rw-r--r-- | basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ComponentResultsView.java | 531 |
1 files changed, 531 insertions, 0 deletions
diff --git a/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ComponentResultsView.java b/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ComponentResultsView.java new file mode 100644 index 0000000..158361d --- /dev/null +++ b/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ComponentResultsView.java @@ -0,0 +1,531 @@ +/******************************************************************************* + * Copyright (c) 2000, 2009 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.test.internal.performance.results.ui; + +import java.util.StringTokenizer; + +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; +import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TreeSelection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CTabFolder; +import org.eclipse.swt.custom.CTabItem; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Table; +import org.eclipse.test.internal.performance.results.model.BuildResultsElement; +import org.eclipse.test.internal.performance.results.model.ComponentResultsElement; +import org.eclipse.test.internal.performance.results.model.ConfigResultsElement; +import org.eclipse.test.internal.performance.results.model.DimResultsElement; +import org.eclipse.test.internal.performance.results.model.PerformanceResultsElement; +import org.eclipse.test.internal.performance.results.model.ResultsElement; +import org.eclipse.test.internal.performance.results.model.ScenarioResultsElement; +import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants; +import org.eclipse.test.internal.performance.results.utils.Util; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.IMemento; +import org.eclipse.ui.IViewSite; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.part.ViewPart; + + +/** + * This view show for each performance machine the results of all builds + * run since the beginning of the current version development. + * <p> + * Each machine results are show in a separate tab. + * </p><p> + * There's no real action available action from this view, only the possibility + * to change how is displayed the line selection (full or only first column) + * and also filter the results: + * <ul> + * <li>Filter for builds: + * <ul> + * <li>Filter nightly: hide the nightly builds (starting with 'N')</li> + * <li>Filter non-important builds: hide all non-important builds, which means non-milestone builds and those after the last milestone</li> + * </ul> + * </li> + * </li>Filter for scenarios: + * <ul> + * <li>Filter non-fingerprints: hide the scenarios which are not in the fingerprints</li> + * </ul> + * </li> + * </ul> + * </p><p> + * Note that these filters are synchronized with the ones applied in the + * {@link ComponentsView Components view}. + * </p> + * + * @see ConfigTab Folder tab containing all the results for a configuration. + */ +public class ComponentResultsView extends ViewPart implements ISelectionChangedListener, IPreferenceChangeListener { + + // Constants + private static final String ORG_ECLIPSE = "org.eclipse."; + + // SWT resources + CTabFolder tabFolder; + + // Model information + ConfigTab[] tabs; + ComponentResultsElement componentResultsElement; + + // Action + Action fullLineSelection; + Action filterAdvancedScenarios; + Action filterOldBuilds; + Action filterNightlyBuilds; + ImageDescriptor fullSelectionImageDescriptor; + + // Views + IMemento viewState; + + // Eclipse preferences + IEclipsePreferences preferences; + +/* + * Default constructor: + * - create the image descriptor + * - register the view as a properties listener + */ +public ComponentResultsView() { + this.fullSelectionImageDescriptor = ImageDescriptor.createFromFile(getClass(), "icallout_obj.gif"); + this.preferences = new InstanceScope().getNode(IPerformancesConstants.PLUGIN_ID); + this.preferences.addPreferenceChangeListener(this); + Util.initMilestones(this.preferences); +} + +/* + * Contribute the local tools bar and the pull-down menu to the action bars. + */ +void contributeToActionBars() { + IActionBars bars = getViewSite().getActionBars(); + fillLocalPullDown(bars.getMenuManager()); + fillLocalToolBar(bars.getToolBarManager()); +} + +/* + * (non-Javadoc) + * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) + */ +public void createPartControl(Composite parent) { + + // Create the tab folder + this.tabFolder = new CTabFolder(parent, SWT.BORDER); + + // Add results view as listener to viewer selection changes + Display.getDefault().asyncExec(new Runnable() { + public void run() { + PerformancesView performancesView = (PerformancesView) PerformancesView.getWorkbenchView("org.eclipse.test.internal.performance.results.ui.ComponentsView"); + if (performancesView != null) { + performancesView.viewer.addSelectionChangedListener(ComponentResultsView.this); + } + } + }); + + // Set actions + PlatformUI.getWorkbench().getHelpSystem().setHelp(this.tabFolder, "org.eclipse.test.performance.ui.results"); + makeActions(); + contributeToActionBars(); + + // Restore state + restoreState(); + + // Create tabs + createTabs(); + + // Set selections (tab and line) + this.tabFolder.setSimple(false); +} + +/* + * Create the tab folder pages. There's one tab per performance machine. + * The list of these machines is got from the DB_Results contants. + */ +void createTabs() { + if (this.componentResultsElement == null) return; + PerformanceResultsElement performanceResultsElement = (PerformanceResultsElement) this.componentResultsElement.getParent(null); + String[] configNames = performanceResultsElement.getConfigs(); + String[] configDescriptions = performanceResultsElement.getConfigDescriptions(); + int length = configNames.length; + this.tabs = new ConfigTab[length]; + for (int i=0; i<length; i++) { + this.tabs[i] = new ConfigTab(configNames[i], configDescriptions[i]); + } + for (int i=0; i<this.tabs.length; i++) { + CTabItem item = new CTabItem (this.tabFolder, SWT.NONE); + item.setText (this.tabs[i].getTabText ()); + item.setControl (this.tabs[i].createTabFolderPage(this.componentResultsElement, this.tabFolder, this.fullLineSelection.isChecked())); + item.setData (this.tabs[i]); + } + this.tabFolder.setSelection(0); +} + +/* + * (non-Javadoc) + * @see org.eclipse.ui.part.WorkbenchPart#dispose() + */ +public void dispose() { + this.tabFolder.dispose(); + int length = this.tabs==null ? 0 : this.tabs.length; + for (int i=0; i<length; i++) { + this.tabs[i].dispose(); + } + JFaceResources.getResources().destroyImage(this.fullSelectionImageDescriptor); + super.dispose(); +} + +/* + * Fill the filters drop-down menu with: + * - filter nightly builds + * - filter non-milestone builds + * - filter non-fingerprint scenarios + */ +void fillFiltersDropDown(IMenuManager manager) { + manager.add(this.filterNightlyBuilds); + manager.add(this.filterOldBuilds); + manager.add(new Separator()); + manager.add(this.filterAdvancedScenarios); +} + +/* + * Fill the local pull down menu. + */ +void fillLocalPullDown(IMenuManager manager) { + MenuManager filtersManager= new MenuManager("Filters"); + fillFiltersDropDown(filtersManager); + manager.add(filtersManager); +} + +/* + * Fill the local tool bar with: + * - change line selection display + */ +void fillLocalToolBar(IToolBarManager manager) { + manager.add(this.fullLineSelection); +} + +/* + * (non-Javadoc) + * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento) + */ +public void init(IViewSite site, IMemento memento) throws PartInitException { + super.init(site, memento); + this.viewState = memento; +} + +/* + * Make the actions of the view: + * - change table line selection display + * - filter nightly builds + * - filter non-milestone builds + * - filter non-fingerprint scenarios + */ +void makeActions() { + + // Full line selection action + this.fullLineSelection = new Action("", IAction.AS_CHECK_BOX) { + public void run() { + resetTabFolders(false/*refresh*/); + } + }; + this.fullLineSelection.setImageDescriptor(this.fullSelectionImageDescriptor); + this.fullLineSelection.setToolTipText("Full line selection"); +// this.fullLineSelection.setChecked(true); + + // Filter non-fingerprints action + this.filterAdvancedScenarios = new Action("Advanced &Scenarios", IAction.AS_CHECK_BOX) { + public void run() { + ComponentResultsView.this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, isChecked()); + resetTabFolders(false/*refresh*/); + } + }; + this.filterAdvancedScenarios.setChecked(true); + this.filterAdvancedScenarios.setToolTipText("Filter advanced scenarios (i.e. not fingerprint ones)"); + + // Filter non-important builds action + this.filterOldBuilds = new Action("&Old Builds", IAction.AS_CHECK_BOX) { + public void run() { + ComponentResultsView.this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_OLD_BUILDS, isChecked()); + resetTabFolders(false/*refresh*/); + } + }; + this.filterOldBuilds.setChecked(false); + this.filterOldBuilds.setToolTipText("Filter old builds (i.e. before last milestone) but keep all previous milestones)"); + + // Filter nightly action + this.filterNightlyBuilds = new Action("&Nightly", IAction.AS_CHECK_BOX) { + public void run() { + ComponentResultsView.this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_NIGHTLY_BUILDS, isChecked()); + resetTabFolders(false/*refresh*/); + } + }; + this.filterNightlyBuilds.setToolTipText("Filter nightly builds"); +} + +/* (non-Javadoc) + * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener#preferenceChange(org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent) + */ +public void preferenceChange(PreferenceChangeEvent event) { + String propertyName = event.getKey(); + Object newValue = event.getNewValue(); + + // Filter non-fingerprints change + if (propertyName.equals(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS)) { + boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS : "true".equals(newValue); + this.filterAdvancedScenarios.setChecked(checked); + resetTabFolders(false/*refresh*/); + } + + // Filter non-milestone change + if (propertyName.equals(IPerformancesConstants.PRE_FILTER_OLD_BUILDS)) { + boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_OLD_BUILDS : "true".equals(newValue); + this.filterOldBuilds.setChecked(checked); + resetTabFolders(false/*refresh*/); + } + + // Filter nightly builds change + if (propertyName.equals(IPerformancesConstants.PRE_FILTER_NIGHTLY_BUILDS)) { + boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_NIGHTLY_BUILDS : "true".equals(newValue); + this.filterNightlyBuilds.setChecked(checked); + resetTabFolders(false/*refresh*/); + } +} + +/* + * Reset the table tab folders by re-create all the pages. + * Selections are set onto the first found error if this is the first tab creation (typically on a component change event from the ComponentsView) + * or to the previous one if this is just a refresh. + */ +void resetTabFolders(boolean init) { + + // Store current indexes + int tabIndex = this.tabFolder.getSelectionIndex(); + int lineIndex = tabIndex<0 ? -1 : this.tabs[tabIndex].table.getSelectionIndex(); + + // Create tab folders + CTabItem[] tabItems = this.tabFolder.getItems(); + int length = tabItems.length; + if (length == 0) { + createTabs(); + } else { + for (int i=0; i<length; i++) { + tabItems[i].setControl(this.tabs [i].createTabFolderPage(this.componentResultsElement, this.tabFolder, this.fullLineSelection.isChecked())); + } + } + + // Set the part name when possible + if (this.componentResultsElement != null) { + setPartName(); + } + + // If this is the first display then look for the first error to set the selection on it + if (init) { + if (this.componentResultsElement != null) { + // If the component has + if (this.componentResultsElement.hasError()) { + ResultsElement[] children = this.componentResultsElement.getChildren(); // get scenarios + int childrenLength = children.length; + for (int s=0; s<childrenLength; s++) { + if (children[s].hasError()) { + children = children[s].getChildren(); // get configs + for (int c=0; c<childrenLength; c++) { + if (children[c].hasError()) { + tabIndex = c; + break; + } + } + break; + } + } + } + } + lineIndex = 0; + } + + // Set the selection + if (tabIndex >= 0 && lineIndex >= 0) { + this.tabFolder.setSelection(tabIndex); + Table table = this.tabs[tabIndex].table; + table.setSelection(lineIndex); + } +} + +/* + * Restore the view state from the memento information. + */ +void restoreState() { + + // Filter baselines action state + if (this.viewState != null) { + Boolean state = this.viewState.getBoolean(IPerformancesConstants.PRE_FULL_LINE_SELECTION); + boolean fullLine = state == null ? true : state.booleanValue(); + this.fullLineSelection.setChecked(fullLine); + } + + // Filter non fingerprints action state + boolean checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS); + this.filterAdvancedScenarios.setChecked(checked); + + // Filter nightly builds action + checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_NIGHTLY_BUILDS, IPerformancesConstants.DEFAULT_FILTER_NIGHTLY_BUILDS); + this.filterNightlyBuilds.setChecked(checked); + + // Filter non important builds action state + checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_OLD_BUILDS, IPerformancesConstants.DEFAULT_FILTER_OLD_BUILDS); + this.filterOldBuilds.setChecked(checked); +} + +/* + * (non-Javadoc) + * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento) + */ +public void saveState(IMemento memento) { + super.saveState(memento); + memento.putBoolean(IPerformancesConstants.PRE_FULL_LINE_SELECTION, this.fullLineSelection.isChecked()); +} + +/* + * (non-Javadoc) + * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) + */ +public void selectionChanged(SelectionChangedEvent event) { + ResultsElement selectedElement = (ResultsElement) ((TreeSelection) event.getSelection()).getFirstElement(); + ComponentResultsElement componentElement = null; + ScenarioResultsElement scenarioResultsElement = null; + ConfigResultsElement configResultsElement = null; + BuildResultsElement buildResultsElement = null; + if (selectedElement instanceof ComponentResultsElement) { + componentElement = (ComponentResultsElement) selectedElement; + } else if (selectedElement instanceof ScenarioResultsElement) { + scenarioResultsElement = (ScenarioResultsElement) selectedElement; + componentElement = (ComponentResultsElement) scenarioResultsElement.getParent(null); + } else if (selectedElement instanceof ConfigResultsElement) { + configResultsElement = (ConfigResultsElement) selectedElement; + scenarioResultsElement = (ScenarioResultsElement) configResultsElement.getParent(null); + componentElement = (ComponentResultsElement) scenarioResultsElement.getParent(null); + } else if (selectedElement instanceof BuildResultsElement) { + buildResultsElement = (BuildResultsElement) selectedElement; + configResultsElement = (ConfigResultsElement) buildResultsElement.getParent(null); + scenarioResultsElement = (ScenarioResultsElement) configResultsElement.getParent(null); + componentElement = (ComponentResultsElement) scenarioResultsElement.getParent(null); + } else if (selectedElement instanceof DimResultsElement) { + buildResultsElement = (BuildResultsElement) selectedElement.getParent(null); + configResultsElement = (ConfigResultsElement) buildResultsElement.getParent(null); + scenarioResultsElement = (ScenarioResultsElement) configResultsElement.getParent(null); + componentElement = (ComponentResultsElement) scenarioResultsElement.getParent(null); + } + if (componentElement != this.componentResultsElement) { + this.componentResultsElement = componentElement; + if (componentElement == null || this.componentResultsElement.getChildren(null).length > 0) { + resetTabFolders(true); + } + } + if (configResultsElement != null) { + ConfigTab configTab = this.tabs[this.tabFolder.getSelectionIndex()]; + if (!configResultsElement.getName().equals(configTab.configName)) { + int length = this.tabs.length; + for (int i=0; i<length; i++) { + if (this.tabs[i].configName.equals(configResultsElement.getName())) { + this.tabFolder.setSelection(i); + } + } + } + if (buildResultsElement != null) { + configTab = this.tabs[this.tabFolder.getSelectionIndex()]; + configTab.select(buildResultsElement); + } + } +} + +/* + * (non-Javadoc) + * @see org.eclipse.ui.part.WorkbenchPart#setFocus() + */ +public void setFocus() { + // do nothing +} + +/* + * Set the name of the part. + * This name is built from the name of the component selected in the Components view. + * The rules to build the name are: + * 1. If the component name does not start then the part name is just "'<component name>' results" + * 2. Otherwise, remove "org.eclipse." form the component name and count the tokens separated by a dot ('.') + * a. if there's only one remaining token, then the part name is "Platform/" + * + "<token uppercased>" if token is less than 3 characters,"<token with first char uppercased>" otherwise + * b. otherwise then the part name is "<first token uppercased>" + * + for each followed additional token: + * "<token uppercased>" if token is less than 3 characters,"<token with first char uppercased>" otherwise + * + " results" + * E.g. + * - org.eclipse.ui -> "Platform/UI" + * - org.eclipse.swt -> "Platform/SWT" + * - org.eclipse.team -> "Platform/Team" + * - org.eclipse.jdt.ui -> "JDT/UI" + * - org.eclipse.jdt.core -> "JDT/Core" + * - org.eclipse.pde.api.tools -> "PDE/API Tools" + */ +protected void setPartName() { + String componentName = this.componentResultsElement.getName(); + String partName; + StringBuffer buffer = null; + if (componentName.startsWith(ORG_ECLIPSE)) { + partName = componentName.substring(ORG_ECLIPSE.length()); + StringTokenizer tokenizer = new StringTokenizer(partName, "."); + while (tokenizer.hasMoreTokens()) { + String token = tokenizer.nextToken(); + if (buffer == null) { + if (tokenizer.hasMoreTokens()) { + buffer = new StringBuffer("'"+token.toUpperCase()); + buffer.append('/'); + } else { + buffer = new StringBuffer("'Platform/"); + if (token.length() > 3) { + buffer.append(Character.toUpperCase(token.charAt(0))); + buffer.append(token.substring(1)); + } else { + buffer.append(token.toUpperCase()); + } + } + } else { + if (token.length() > 3) { + buffer.append(Character.toUpperCase(token.charAt(0))); + buffer.append(token.substring(1)); + } else { + buffer.append(token.toUpperCase()); + } + if (tokenizer.hasMoreTokens()) buffer.append(' '); + } + } + } else { + buffer = new StringBuffer("'"); + buffer.append(componentName); + buffer.append("'"); + } + buffer.append("' results"); + setPartName(buffer.toString()); +} + +} |