package rtt.ui.views;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
import rtt.core.exceptions.RTTException;
import rtt.core.loader.ArchiveLoader;
import rtt.core.manager.Manager;
import rtt.core.manager.data.history.InputManager;
import rtt.core.manager.data.history.OutputDataManager;
import rtt.core.manager.data.history.OutputDataManager.OutputDataType;
import rtt.ui.RttPluginUI;
import rtt.ui.content.IContent;
import rtt.ui.content.history.HistoryContent;
import rtt.ui.content.history.HistoryContent.VersionType;
import rtt.ui.content.main.ProjectContent;
import rtt.ui.content.main.TestsuiteDirectory;
import rtt.ui.content.testsuite.TestcaseContent;
import rtt.ui.content.testsuite.TestsuiteContent;
import rtt.ui.model.RttProject;
import rtt.ui.utils.RttLog;
import rtt.ui.viewer.RttColumnLabelProvider;
import rtt.ui.viewer.RttDoubleClickListener;
import rtt.ui.viewer.RttSimpleLabelProvider;
import rtt.ui.viewer.RttStructuredContentProvider;
import rtt.ui.viewer.RttTreeContentProvider;
import rtt.ui.viewer.ViewerUtils;
import rtt.ui.views.utils.AbstractProjectListener;
import rtt.ui.views.utils.AbstractTestsuiteListener;
public class VersionView extends ViewPart implements ISelectionListener {
protected static final Object[] EMPTY_ARRAY = new Object[0];
private class ProjectListener extends AbstractProjectListener {
@Override
public void refresh() {
suiteComboViewer.refresh();
// treeViewer.refresh(true);
super.refresh();
}
@Override
public void update(ProjectContent content) {
boolean hasContent = false;
TestsuiteDirectory suiteDirectory = null;
if (content != null) {
suiteDirectory = content.getTestsuiteDirectory();
if (suiteDirectory != null) {
hasContent = !suiteDirectory.isEmpty();
}
}
if (hasContent) {
suiteComboViewer.setInput(suiteDirectory);
} else {
suiteComboViewer.setInput(EMPTY_ARRAY);
caseComboViewer.setInput(EMPTY_ARRAY);
}
suiteComboViewer.getControl().setEnabled(hasContent);
caseComboViewer.getControl().setEnabled(hasContent);
treeViewer.setInput(EMPTY_ARRAY);
treeViewer.getControl().setEnabled(false);
}
}
private class TestsuiteListener extends AbstractTestsuiteListener {
private void setFirstTestcase(TestsuiteContent content) {
IContent[] childs = content.getChildren();
boolean hasCases = false;
if (childs != null && childs.length > 0) {
caseComboViewer.setSelection(new StructuredSelection(childs[0]));
hasCases = true;
}
caseComboViewer.getControl().setEnabled(hasCases);
historyLoadButton.setEnabled(hasCases);
treeViewer.setInput(EMPTY_ARRAY);
treeViewer.getControl().setEnabled(false);
}
@Override
public void refresh() {
suiteComboViewer.refresh(true);
caseComboViewer.refresh(true);
Object input = caseComboViewer.getInput();
if (input instanceof TestsuiteContent) {
TestsuiteContent content = (TestsuiteContent) input;
setFirstTestcase(content);
}
}
@Override
public void update(TestsuiteContent content) {
if (content != null) {
suiteComboViewer.setSelection(new StructuredSelection(content));
caseComboViewer.setInput(content);
setFirstTestcase(content);
}
}
}
public static final String ID = "rtt.ui.views.VersionView";
public VersionView() { }
private ProjectListener projectListener;
private TestsuiteListener suiteListener;
private TreeViewer treeViewer;
private ComboViewer suiteComboViewer;
private ComboViewer caseComboViewer;
private Button historyLoadButton;
@Override
public void createPartControl(Composite parent) {
parent.setLayout(new GridLayout(1, true));
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(3, false));
composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
1, 1));
Label suiteLabel = new Label(composite, SWT.NONE);
suiteLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false,
false, 1, 1));
suiteLabel.setText("Test suite:");
suiteComboViewer = new ComboViewer(composite, SWT.READ_ONLY);
Combo combo = suiteComboViewer.getCombo();
combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1,
1));
suiteComboViewer.setLabelProvider(new RttSimpleLabelProvider());
suiteComboViewer.setContentProvider(new RttStructuredContentProvider());
historyLoadButton = new Button(composite, SWT.PUSH);
historyLoadButton.setText("Load History ...");
GridData gd_historyLoadButton = new GridData(SWT.RIGHT, SWT.FILL, false, false, 1, 2);
gd_historyLoadButton.widthHint = 200;
gd_historyLoadButton.minimumWidth = 200;
historyLoadButton.setLayoutData(gd_historyLoadButton);
historyLoadButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
TestcaseContent selectedTestcase = ViewerUtils.getSelection(
caseComboViewer.getSelection(), TestcaseContent.class);
if (selectedTestcase != null) {
loadTestcase(selectedTestcase);
}
}
});
Label caseLabel = new Label(composite, SWT.NONE);
caseLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false,
false, 1, 1));
caseLabel.setText("Test case:");
caseComboViewer = new ComboViewer(composite, SWT.READ_ONLY);
combo = caseComboViewer.getCombo();
combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
caseComboViewer.setLabelProvider(new RttSimpleLabelProvider());
caseComboViewer.setContentProvider(new RttStructuredContentProvider());
Composite treeComposite = new Composite(parent, SWT.NONE);
treeComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
TreeColumnLayout treeLayout = new TreeColumnLayout();
treeComposite.setLayout(treeLayout);
treeViewer = new TreeViewer(treeComposite,
SWT.BORDER | SWT.H_SCROLL |
SWT.V_SCROLL | SWT.SINGLE |
SWT.FULL_SELECTION);
treeViewer.setContentProvider(new RttTreeContentProvider());
treeViewer.addDoubleClickListener(new RttDoubleClickListener(getSite().getPage()));
treeViewer.getTree().setHeaderVisible(true);
treeViewer.getTree().setLinesVisible(true);
treeViewer.getTree().setEnabled(false);
TreeViewerColumn nameViewerColumn = new TreeViewerColumn(treeViewer, SWT.NONE);
nameViewerColumn.getColumn().setText("History");
nameViewerColumn.setLabelProvider(new RttColumnLabelProvider());
treeLayout.setColumnData(nameViewerColumn.getColumn(), new ColumnWeightData(30, 250, true));
TreeViewerColumn inputBaseViewerColumn = new TreeViewerColumn(treeViewer, SWT.NONE);
inputBaseViewerColumn.getColumn().setText("Input Data Base");
inputBaseViewerColumn.setLabelProvider(new RttColumnLabelProvider());
treeLayout.setColumnData(inputBaseViewerColumn.getColumn(), new ColumnWeightData(30, 250, true));
TreeViewerColumn dateViewerColumn = new TreeViewerColumn(treeViewer, SWT.NONE);
dateViewerColumn.getColumn().setText("Creation Date");
dateViewerColumn.setLabelProvider(new RttColumnLabelProvider());
treeLayout.setColumnData(dateViewerColumn.getColumn(), new ColumnWeightData(30, 250, true));
ColumnViewerToolTipSupport.enableFor(treeViewer, ToolTip.NO_RECREATE);
// Tree tree = treeViewer.getTree();
// tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
getSite().setSelectionProvider(suiteComboViewer);
getSite().getPage().addSelectionListener(ID, this);
projectListener = new ProjectListener();
suiteListener = new TestsuiteListener();
}
@Override
public void dispose() {
getSite().getPage().removeSelectionListener(ID, this);
projectListener.removeListener();
projectListener = null;
suiteListener.removeListener();
projectListener = null;
super.dispose();
}
protected void loadTestcase(final TestcaseContent item) {
if (item != null) {
final String caseName = item.getCaseName();
final String suiteName = item.getSuiteName();
final RttProject project = item.getProject();
final List<IContent> childs = new ArrayList<IContent>();
ProgressMonitorDialog dialog = new ProgressMonitorDialog(getSite().getShell());
try {
dialog.run(true, false, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
monitor.beginTask("Loading history ...", IProgressMonitor.UNKNOWN);
try {
Manager manager = project.getManager();
if (manager != null) {
ArchiveLoader loader = manager.getArchive().getLoader();
ProjectContent currentProject = item.getContent(ProjectContent.class);
InputManager inputManager = new InputManager(loader, suiteName, caseName);
childs.add(new HistoryContent(currentProject, inputManager, VersionType.INPUT));
OutputDataManager refManager = new OutputDataManager(loader, suiteName, caseName, project.getActiveConfiguration(), OutputDataType.REFERENCE);
childs.add(new HistoryContent(currentProject, refManager, VersionType.REFERENCE));
OutputDataManager testManager = new OutputDataManager(loader, suiteName, caseName, project.getActiveConfiguration(), OutputDataType.TEST);
childs.add(new HistoryContent(currentProject, testManager, VersionType.TEST));
manager.close();
}
} catch (RTTException e) {
new InvocationTargetException(e);
}
monitor.done();
}
});
} catch (InterruptedException e) {
RttLog.log(e);
} catch (InvocationTargetException e) {
RttLog.log(e);
}
treeViewer.setInput(childs.toArray());
treeViewer.getTree().setEnabled(true);
} else {
treeViewer.setInput(EMPTY_ARRAY);
treeViewer.getTree().setEnabled(false);
}
}
@Override
public void setFocus() {
if (RttPluginUI.getProjectDirectory().hasChanged()) {
RttPluginUI.refreshManager();
}
treeViewer.getControl().setFocus();
}
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
IStructuredSelection sSelection = (IStructuredSelection) selection;
if (sSelection.getFirstElement() instanceof TestsuiteContent) {
TestsuiteContent content = (TestsuiteContent) sSelection.getFirstElement();
RttPluginUI.getSuiteManager().setCurrentContent(content);
}
}
}