blob: a7b1c55f6ad727c2498591d4a1a77aae665c1f99 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2012 Anton Gorenkov
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Anton Gorenkov - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.testsrunner.internal.ui.view;
import java.util.Iterator;
import org.eclipse.cdt.testsrunner.internal.model.TestingSessionsManager;
import org.eclipse.cdt.testsrunner.internal.ui.view.MessagesViewer.LevelFilter;
import org.eclipse.cdt.testsrunner.internal.ui.view.actions.MessageLevelFilterAction;
import org.eclipse.cdt.testsrunner.internal.ui.view.actions.MessagesOrderingAction;
import org.eclipse.cdt.testsrunner.model.ITestItem;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbench;
/**
* The main widget of testing results view. It compounds tests hierarchy and
* messages viewer. Depending on orientation it may layout them vertically or
* horizontally.
*/
public class ResultsPanel {
/** Parent for the child widgets (messages & tests hierarchy viewer). */
private SashForm sashForm;
/** Child widget: messages viewer. */
private MessagesViewer messagesViewer;
/** Child widget: tests hierarchy viewer. */
private TestsHierarchyViewer testsHierarchyViewer;
// Persistence tags
static final String TAG_WEIGHT0 = "weight0"; //$NON-NLS-1$
static final String TAG_WEIGHT1 = "weight1"; //$NON-NLS-1$
static final String TAG_MESSAGES_ORDERING_ACTION = "messagesOrderingAction"; //$NON-NLS-1$
static final String TAG_ERROR_FILTER_ACTION = "errorFilterAction"; //$NON-NLS-1$
static final String TAG_WARNING_FILTER_ACTION = "warningFilterAction"; //$NON-NLS-1$
static final String TAG_INFO_FILTER_ACTION = "infoFilterAction"; //$NON-NLS-1$
// Messages Viewer actions
Action messagesOrderingAction;
Action errorFilterAction;
Action warningFilterAction;
Action infoFilterAction;
public ResultsPanel(Composite parent, TestingSessionsManager sessionsManager, IWorkbench workbench, IViewSite site,
Clipboard clipboard) {
sashForm = new SashForm(parent, SWT.VERTICAL);
// Configure tests hierarchy viewer
ViewForm top = new ViewForm(sashForm, SWT.NONE);
Composite empty = new Composite(top, SWT.NONE);
empty.setLayout(new Layout() {
@Override
protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
return new Point(1, 1); // (0, 0) does not work with super-intelligent ViewForm
}
@Override
protected void layout(Composite composite, boolean flushCache) {
}
});
top.setTopLeft(empty); // makes ViewForm draw the horizontal separator line ...
testsHierarchyViewer = new TestsHierarchyViewer(top, site, clipboard);
top.setContent(testsHierarchyViewer.getTreeViewer().getControl());
// Configure test messages viewer
ViewForm bottom = new ViewForm(sashForm, SWT.NONE);
messagesViewer = new MessagesViewer(bottom, sessionsManager, workbench, site, clipboard);
Composite topLeftPanel = new Composite(bottom, SWT.NONE);
RowLayout topLeftPanelLayout = new RowLayout(SWT.HORIZONTAL);
topLeftPanelLayout.spacing = 0;
topLeftPanelLayout.center = true;
topLeftPanelLayout.marginBottom = topLeftPanelLayout.marginLeft = topLeftPanelLayout.marginRight = topLeftPanelLayout.marginTop = 0;
topLeftPanel.setLayout(topLeftPanelLayout);
ToolBar leftMessagesToolBar = new ToolBar(topLeftPanel, SWT.FLAT | SWT.WRAP);
ToolBarManager leftMessagesToolBarManager = new ToolBarManager(leftMessagesToolBar);
messagesOrderingAction = new MessagesOrderingAction(messagesViewer);
leftMessagesToolBarManager.add(messagesOrderingAction);
leftMessagesToolBarManager.update(true);
CLabel label = new CLabel(topLeftPanel, SWT.NONE);
label.setText(UIViewMessages.MessagesPanel_label);
bottom.setTopLeft(topLeftPanel);
ToolBar rightMessagesToolBar = new ToolBar(bottom, SWT.FLAT | SWT.WRAP);
ToolBarManager rightMessagesToolBarManager = new ToolBarManager(rightMessagesToolBar);
errorFilterAction = new MessageLevelFilterAction(messagesViewer, LevelFilter.Error, true);
warningFilterAction = new MessageLevelFilterAction(messagesViewer, LevelFilter.Warning, true);
infoFilterAction = new MessageLevelFilterAction(messagesViewer, LevelFilter.Info, false);
rightMessagesToolBarManager.add(errorFilterAction);
rightMessagesToolBarManager.add(warningFilterAction);
rightMessagesToolBarManager.add(infoFilterAction);
rightMessagesToolBarManager.update(true);
bottom.setTopCenter(rightMessagesToolBar);
bottom.setContent(messagesViewer.getTableViewer().getControl());
sashForm.setWeights(new int[] { 50, 50 });
testsHierarchyViewer.getTreeViewer().addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
handleTestItemSelected();
}
});
// Initialize default value
setShowFailedOnly(false);
// Data for parent (view's) layout
sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
}
/**
* Provides access to the tests hierarchy viewer.
*
* @return tests hierarchy viewer
*/
public TestsHierarchyViewer getTestsHierarchyViewer() {
return testsHierarchyViewer;
}
/**
* Provides access to the messages viewer.
*
* @return messages viewer
*/
public MessagesViewer getMessagesViewer() {
return messagesViewer;
}
/**
* Handles selection change in tests hierarchy viewer and updates the
* content of the messages viewer to show the messages for the selected
* items.
*/
private void handleTestItemSelected() {
IStructuredSelection selection = (IStructuredSelection) testsHierarchyViewer.getTreeViewer().getSelection();
ITestItem[] testItems = new ITestItem[selection.size()];
int index = 0;
for (Iterator<?> it = selection.iterator(); it.hasNext();) {
testItems[index] = (ITestItem) it.next();
++index;
}
messagesViewer.showItemsMessages(testItems);
}
/**
* Sets the widget orientation.
*
* @param orientation new widget orientation (vertical or horizontal; auto
* is not supported)
*/
public void setPanelOrientation(ResultsView.Orientation orientation) {
sashForm.setOrientation(orientation == ResultsView.Orientation.Horizontal ? SWT.HORIZONTAL : SWT.VERTICAL);
}
/**
* Returns whether only failed tests (and messages for them) should be
* shown.
*
* @return filter state
*/
public boolean getShowFailedOnly() {
return messagesViewer.getShowFailedOnly();
}
/**
* Sets whether only failed tests (and messages for them) should be shown.
*
* @param showFailedOnly new filter state
*/
public void setShowFailedOnly(boolean showFailedOnly) {
testsHierarchyViewer.setShowFailedOnly(showFailedOnly);
messagesViewer.setShowFailedOnly(showFailedOnly);
}
/**
* Restores the value of the checkable action.
*
* @param memento previously saved state to restore the action value from
* @param key tag name that is used to restore the value
* @param action action to restore
*/
private void restoreActionChecked(IMemento memento, String key, Action action) {
Boolean checked = memento.getBoolean(key);
if (checked != null) {
action.setChecked(checked);
action.run();
}
}
/**
* Restores the state of the widget.
*
* @param memento previously saved state
*/
public void restoreState(IMemento memento) {
Integer weight0 = memento.getInteger(TAG_WEIGHT0);
Integer weight1 = memento.getInteger(TAG_WEIGHT1);
if (weight0 != null && weight1 != null) {
sashForm.setWeights(new int[] { weight0, weight1 });
}
restoreActionChecked(memento, TAG_MESSAGES_ORDERING_ACTION, messagesOrderingAction);
restoreActionChecked(memento, TAG_ERROR_FILTER_ACTION, errorFilterAction);
restoreActionChecked(memento, TAG_WARNING_FILTER_ACTION, warningFilterAction);
restoreActionChecked(memento, TAG_INFO_FILTER_ACTION, infoFilterAction);
}
/**
* Saves the state of the widget.
*
* @param memento where to save the state
*/
public void saveState(IMemento memento) {
int[] weights = sashForm.getWeights();
memento.putInteger(TAG_WEIGHT0, weights[0]);
memento.putInteger(TAG_WEIGHT1, weights[1]);
memento.putBoolean(TAG_MESSAGES_ORDERING_ACTION, messagesOrderingAction.isChecked());
memento.putBoolean(TAG_ERROR_FILTER_ACTION, errorFilterAction.isChecked());
memento.putBoolean(TAG_WARNING_FILTER_ACTION, warningFilterAction.isChecked());
memento.putBoolean(TAG_INFO_FILTER_ACTION, infoFilterAction.isChecked());
}
}