sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi.wizards/src/com/nokia/carbide/cpp/internal/pi/wizards/ui/AbstractBaseGroup.java
/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.carbide.cpp.internal.pi.wizards.ui;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace;
import com.nokia.carbide.cpp.internal.pi.utils.PIUtilities;
/**
* Base group for the profiler data importers
*
*/
public abstract class AbstractBaseGroup extends Group {
abstract class AbstractBaseSorter extends ViewerSorter {
Table table;
int column = 0;
boolean sortAscending;
public AbstractBaseSorter(Table table, int defaultColumn) {
this.table = table;
doSort(defaultColumn);
}
public void doSort(int column) {
sortAscending = !sortAscending;
// find the TableColumn corresponding to column, and give it a
// column direction
TableColumn sortByColumn = table.getColumn(column);
if (sortByColumn != null) {
table.setSortColumn(sortByColumn);
table.setSortDirection(sortAscending ? SWT.UP : SWT.DOWN);
}
this.column = column;
}
@Override
abstract public int compare(Viewer viewer, Object e1, Object e2);
}
abstract class AbstractLabelProvider extends LabelProvider implements
ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
}
private List<ProfilerDataPlugins> profilerDataFiles = new ArrayList<ProfilerDataPlugins>();
protected INewPIWizardSettings wizardSettings;
private boolean timeAndSizeEnabled;
/**
* Constructor
*
* @param parent
* instance of parent Composite
* @param wizardSettings
* instance of the INewPIWizardSettings
* @param timeAndSizeEnabled is used to store trace data file during the tracing
*/
public AbstractBaseGroup(Composite parent,
INewPIWizardSettings wizardSettings, boolean timeAndSizeEnabled) {
super(parent, SWT.NONE);
this.wizardSettings = wizardSettings;
this.timeAndSizeEnabled = timeAndSizeEnabled;
// set default layout
this.setLayout(new GridLayout(1, false));
this.setLayoutData(new GridData(GridData.FILL_BOTH));
createContent();
}
// allow subclassing
protected void checkSubclass() {
}
/**
* Implement content for the group
*/
protected abstract void createContent();
public abstract IStatus validateContent(NewPIWizard wizardPage);
protected abstract Table getTable();
/**
* Set this visible and hide given composite
*
* @param hideComposite
* to hide
*/
public void setVisible(Composite hideComposite) {
if (hideComposite.getLayoutData() instanceof GridData) {
((GridData) hideComposite.getLayoutData()).exclude = true;
}
if (this.getLayoutData() instanceof GridData) {
((GridData) this.getLayoutData()).exclude = false;
}
setLocation(hideComposite.getLocation());
setSize(hideComposite.getSize());
setVisible(true);
hideComposite.setVisible(false);
wizardSettings.validatePage();
}
/**
* Add given profile data file into store
*
* @param path
* selected profile data file
* @param time of the used to trace
* @param size of the trace data file
* @throws IllegalArgumentException
* if given file is not valid profile data file
*/
public void addProfilerDataFile(IPath path, long time, long size) throws IllegalArgumentException {
boolean exists = false;
for (ProfilerDataPlugins pdp : profilerDataFiles) {
if (pdp.getProfilerDataPath().equals(path)) {
exists = true;
}
}
if (!exists) {
// check whether selected file a valid profile data file or not
try {
File file = path.toFile();
if (!file.isFile() || file.length() <= 0) {
throw new IllegalArgumentException();
}
ProfilerDataPlugins dataPlugins = new ProfilerDataPlugins(path,
getPluginsForTraceFile(path));
if(timeAndSizeEnabled){
dataPlugins.updateTimeAndSize(time, size);
}
profilerDataFiles.add(dataPlugins);
} catch (Exception e) {
throw new IllegalArgumentException(
MessageFormat
.format(
Messages
.getString("AbstractBaseGroup.isNotValidProfilerFile"), path //$NON-NLS-1$
.lastSegment()));
}
} else {
throw new IllegalArgumentException(
MessageFormat
.format(
Messages
.getString("AbstractBaseGroup.profilerFileIsExisted"), path.lastSegment())); //$NON-NLS-1$
}
}
/**
* Update trace data file during tracing
*
* @param path of the profiler data file
* @param time of the trace run
* @param size of the trace data file
* @throws IllegalArgumentException
*/
public void updateProfilerDataFile(IPath path, long time, long size)
throws IllegalArgumentException {
boolean exists = false;
for (ProfilerDataPlugins pdp : profilerDataFiles) {
if (pdp.getProfilerDataPath().equals(path)) {
pdp.updateTimeAndSize(time, size);
exists = true;
break;
}
}
if (!exists) {
profilerDataFiles.add(new ProfilerDataPlugins(path, null));
} else {
if (!timeAndSizeEnabled) {
throw new IllegalArgumentException(
MessageFormat
.format("Failed to update profiler data file", path.lastSegment())); //$NON-NLS-1$
}
}
}
/**
* Add all valid profile data file from given directory's path
*
* @param path
* directory
* @return
*/
public void addDirectory(IPath path) throws IllegalArgumentException {
if (path != null && path.toFile().isDirectory()) {
boolean addedValidFile = false;
try {
File directory = path.toFile();
if (!directory.isDirectory()) {
throw new IllegalArgumentException();
}
File[] fileArray = directory.listFiles(new FileFilter() {
public boolean accept(File file) {
if (file.isFile()) {
if (file.getPath().endsWith(".dat")) { //$NON-NLS-1$
return true;
}
}
return false;
}
});
for (File file : fileArray) {
try {
addProfilerDataFile(new Path(file.toString()),0,0);
addedValidFile = true;
} catch (Exception e) {
// do nothing
}
}
} catch (Exception e) {
throw new IllegalArgumentException(
MessageFormat
.format(
Messages
.getString("AbstractBaseGroup.failedToImportFromFolder"), path //$NON-NLS-1$
.toOSString()));
}
if (!addedValidFile) {
throw new IllegalArgumentException(
MessageFormat
.format(
Messages
.getString("AbstractBaseGroup.notFoundProfilerDataFiles"), path //$NON-NLS-1$
.toOSString()));
}
}
}
/**
* Remove selected item form given TableViewer
*
* @param tableViewer
* instance of the TableViewer
*/
public void removeSelectedItem(TableViewer tableViewer) {
for (TableItem item : tableViewer.getTable().getSelection()) {
if (item.getData() instanceof IPath) {
IPath path = (IPath) item.getData();
for (ProfilerDataPlugins pdp : profilerDataFiles) {
if (pdp.getProfilerDataPath().equals(path)) {
profilerDataFiles.remove(pdp);
break;
}
}
}
}
}
/**
* Remove ProfilerDataPlugins with given path
*
* @param path
* @return instance of the removed ProfilerDataPlugins
*/
public ProfilerDataPlugins removeWithPath(IPath path) {
for (ProfilerDataPlugins pdp : profilerDataFiles) {
if (pdp.getProfilerDataPath().equals(path)) {
profilerDataFiles.remove(pdp);
return pdp;
}
}
return null;
}
/**
* Remove all item
*/
public void removeAll() {
profilerDataFiles.clear();
}
/**
* Get list of the ProfilerDataPlugins
*
* @return list of the ProfilerDataPlugins
*/
public List<ProfilerDataPlugins> getProfilerDataFiles() {
return profilerDataFiles;
}
/**
* Get selected item from the table
*
* @return instance of the ProfilerDataPlugins if found otherwise null is
* returned
*/
public ProfilerDataPlugins getSelectedItem() {
Table table = getTable();
if (table.getSelectionCount() == 1) {
IPath path = (IPath) table.getSelection()[0].getData();
return getProfilerDataPlugins(path);
}
return null;
}
/**
* Updates given TableViewer so that it contains same data that
* ProfilerDataPlugins list.
*
* @param tableViewer
* instance of the TableViewer
* @param validatePage is need to be validate
*/
public void refreshTable(TableViewer tableViewer, boolean validatePage) {
Table table = tableViewer.getTable();
if (timeAndSizeEnabled) {
tableViewer.setInput(profilerDataFiles);
} else {
List<IPath> pathList = new ArrayList<IPath>();
for (ProfilerDataPlugins pdp : profilerDataFiles) {
pathList.add(pdp.getProfilerDataPath());
}
tableViewer.setInput(pathList);
}
table.setSelection(0);
tableViewer.refresh();
if(validatePage){
wizardSettings.validatePage();
}
}
/**
* Get plugins list from given file
*
* @param profilerPath
* profiler data file
* @return available plugins list from given file
* @throws IOException
*/
private List<ITrace> getPluginsForTraceFile(IPath profilerPath)
throws IOException {
return PIUtilities.getPluginsForTraceFile(profilerPath.toString());
}
/**
* Get ProfilerDataPlugins by given profiler data file
*
* @param path
* @return instance of the ProfilerDataPlugins if found otherwise null is
* returned
*/
private ProfilerDataPlugins getProfilerDataPlugins(IPath path) {
for (ProfilerDataPlugins pdp : profilerDataFiles) {
if (pdp.getProfilerDataPath().equals(path)) {
return pdp;
}
}
return null;
}
}