/*******************************************************************************
* Copyright (c) 2006, 2016 Mountainminds GmbH & Co. KG and Contributors
* 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:
* Brock Janiczak - initial API and implementation
*
******************************************************************************/
package com.mountainminds.eclemma.internal.ui.editors;
import static com.mountainminds.eclemma.internal.ui.UIMessages.ExecutionDataEditorExecutedClassesPageColumnExecutedProbes_label;
import static com.mountainminds.eclemma.internal.ui.UIMessages.ExecutionDataEditorExecutedClassesPageColumnId_label;
import static com.mountainminds.eclemma.internal.ui.UIMessages.ExecutionDataEditorExecutedClassesPageColumnName_label;
import static com.mountainminds.eclemma.internal.ui.UIMessages.ExecutionDataEditorExecutedClassesPageColumnTotalProbes_label;
import static com.mountainminds.eclemma.internal.ui.UIMessages.ExecutionDataEditorExecutedClassesPageFilter_message;
import static com.mountainminds.eclemma.internal.ui.UIMessages.ExecutionDataEditorExecutedClassesPageRefreshing_task;
import static com.mountainminds.eclemma.internal.ui.UIMessages.ExecutionDataEditorExecutedClassesPage_title;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.progress.UIJob;
import org.jacoco.core.data.ExecutionData;
class ExecutedClassesPage extends FormPage {
private final ExecutionDataContent content;
private final Job refreshJob;
private TableViewer dataTableViewer;
private Text filter;
public ExecutedClassesPage(FormEditor parent, ExecutionDataContent content) {
super(parent, "classes", ExecutionDataEditorExecutedClassesPage_title); //$NON-NLS-1$
this.content = content;
this.refreshJob = new RefreshJob();
}
@Override
protected void createFormContent(IManagedForm managedForm) {
final FormToolkit toolkit = managedForm.getToolkit();
final ScrolledForm form = managedForm.getForm();
form.setText(ExecutionDataEditorExecutedClassesPage_title);
toolkit.decorateFormHeading(form.getForm());
final Composite body = form.getBody();
body.setLayout(new org.eclipse.swt.layout.GridLayout(1, true));
filter = toolkit.createText(body, null, SWT.SINGLE | SWT.SEARCH
| SWT.ICON_CANCEL);
filter.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
triggerRefresh();
}
});
filter.setMessage(ExecutionDataEditorExecutedClassesPageFilter_message);
filter.setLayoutData(new GridData(SWT.FILL, 0, true, false));
final Table dataTable = toolkit.createTable(body, SWT.VIRTUAL
| SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.BORDER);
dataTable.setHeaderVisible(true);
dataTable.setLinesVisible(true);
dataTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
dataTableViewer = new TableViewer(dataTable);
final TableViewerColumn classIdColumnViewer = new TableViewerColumn(
dataTableViewer, SWT.NONE);
classIdColumnViewer.setLabelProvider(new ClassIdLabelProvider());
final TableColumn classIdColumn = classIdColumnViewer.getColumn();
classIdColumn.setText(ExecutionDataEditorExecutedClassesPageColumnId_label);
classIdColumn.setWidth(200);
classIdColumn.setResizable(true);
final TableViewerColumn vmNameColumnViewer = new TableViewerColumn(
dataTableViewer, SWT.NONE);
vmNameColumnViewer.setLabelProvider(new VMNameLabelProvider());
final TableColumn vmNameColumn = vmNameColumnViewer.getColumn();
vmNameColumn
.setText(ExecutionDataEditorExecutedClassesPageColumnName_label);
vmNameColumn.setWidth(500);
vmNameColumn.setResizable(true);
final TableViewerColumn totalProbesColumnViewer = new TableViewerColumn(
dataTableViewer, SWT.RIGHT);
totalProbesColumnViewer.setLabelProvider(new TotalProbesLabelProvider());
final TableColumn totalProbesColumn = totalProbesColumnViewer.getColumn();
totalProbesColumn
.setText(ExecutionDataEditorExecutedClassesPageColumnTotalProbes_label);
totalProbesColumn.setWidth(100);
totalProbesColumn.setResizable(true);
final TableViewerColumn executedProbesColumnViewer = new TableViewerColumn(
dataTableViewer, SWT.RIGHT);
executedProbesColumnViewer
.setLabelProvider(new ExecutedProbesLabelProvider());
final TableColumn executedProbesColumn = executedProbesColumnViewer
.getColumn();
executedProbesColumn
.setText(ExecutionDataEditorExecutedClassesPageColumnExecutedProbes_label);
executedProbesColumn.setWidth(100);
executedProbesColumn.setResizable(true);
dataTable.setSortColumn(vmNameColumn);
dataTable.setSortDirection(SWT.UP);
dataTableViewer.setComparator(new ViewerComparator());
dataTableViewer
.setContentProvider(new AbstractExecutionDataContentProvider() {
public Object[] getElements(ExecutionDataContent content) {
return content.getExecutionData();
}
});
dataTableViewer.setInput(content);
}
private abstract static class AbstractExecutionDataColumnLabelProvider extends
ColumnLabelProvider {
public final String getText(Object element) {
return getText((ExecutionData) element);
}
public abstract String getText(ExecutionData element);
}
private static class VMNameLabelProvider extends
AbstractExecutionDataColumnLabelProvider {
@Override
public String getText(ExecutionData element) {
return element.getName();
}
}
private static class ClassIdLabelProvider extends
AbstractExecutionDataColumnLabelProvider {
@Override
public String getText(ExecutionData element) {
return String.format("0x%016x", Long.valueOf(element.getId())); //$NON-NLS-1$
}
@Override
public Font getFont(Object element) {
return JFaceResources.getTextFont();
}
}
private static class TotalProbesLabelProvider extends
AbstractExecutionDataColumnLabelProvider {
@Override
public String getText(ExecutionData element) {
return Integer.toString(element.getProbes().length);
}
}
private static class ExecutedProbesLabelProvider extends
AbstractExecutionDataColumnLabelProvider {
@Override
public String getText(ExecutionData element) {
int executed = 0;
boolean[] data = element.getProbes();
for (int i = 0; i < data.length; i++) {
if (data[i]) {
executed++;
}
}
return Integer.toString(executed);
}
}
private void triggerRefresh() {
refreshJob.cancel();
refreshJob.schedule(250L);
}
private final class RefreshJob extends UIJob {
public RefreshJob() {
super(ExecutionDataEditorExecutedClassesPageRefreshing_task);
setSystem(true);
setPriority(Job.SHORT);
setUser(false);
}
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
dataTableViewer.setFilters(new ViewerFilter[] { ExecutedClassesFilters
.fromPatternString(filter.getText().trim()) });
return Status.OK_STATUS;
}
}
}