trace/traceanalyser/com.nokia.s60tools.traceanalyser/src/com/nokia/s60tools/traceanalyser/ui/views/MainView.java
author Matti Laitinen <matti.t.laitinen@nokia.com>
Wed, 23 Jun 2010 13:57:56 +0300
changeset 9 14dc2103a631
permissions -rw-r--r--
TraceAnalyser 1.0.5

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "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.s60tools.traceanalyser.ui.views;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.Timer;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.part.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.*;
import org.eclipse.swt.widgets.Menu;

import com.nokia.s60tools.traceanalyser.containers.RuleInformation;
import com.nokia.s60tools.traceanalyser.export.ITraceAnalyserRuleType;
import com.nokia.s60tools.traceanalyser.export.RuleEvent;
import com.nokia.s60tools.traceanalyser.export.TraceAnalyserRule;
import com.nokia.s60tools.traceanalyser.interfaces.ITraceAnalyserFileObserver;
import com.nokia.s60tools.traceanalyser.model.Engine;
import com.nokia.s60tools.traceanalyser.plugin.TraceAnalyserPlugin;
import com.nokia.s60tools.traceanalyser.resources.ImageKeys;
import com.nokia.s60tools.traceanalyser.resources.ImageResourceManager;
import com.nokia.s60tools.traceanalyser.ui.dialogs.EditRuleDialog;
import com.nokia.s60tools.traceanalyser.ui.editors.HistoryEditor;
import com.nokia.s60tools.traceanalyser.ui.editors.HistoryEditorInput;
import com.nokia.s60tools.ui.S60ToolsTable;
import com.nokia.s60tools.ui.S60ToolsTableColumnData;
import com.nokia.s60tools.ui.S60ToolsTableFactory;
import com.nokia.traceviewer.api.TraceViewerAPI;
import com.nokia.traceviewer.api.TraceViewerAPI.TVAPIError;


/**
 * <p>
 * MainView.
 * The main view of Trace Analyser Carbide extension. 
 * <p>
 */

public class MainView extends ViewPart implements ITraceAnalyserFileObserver, SelectionListener, ActionListener, KeyListener {

	
	/* TraceViewers ID */
	public static final String TRACE_VIEWER_VIEW_ID = "com.nokia.traceviewer.view.TraceViewerView";
	
	/* Main view's ID */
	public static final String ID = "com.nokia.s60tools.traceanalyser.ui.views.MainView";
	private static final int TAB_INDEX_RULE_LIST = 0;
	private static final int TAB_INDEX_FAIL_LOG =1;
	
	/* Table Viewers for both main view's tables. */
	private CheckboxTableViewer viewerRuleTable;
	private TableViewer viewerFailLogTable;

	/* content providers for both main view's tables */
	private RuleTableContentProvider contentProviderRuleTable;
	private FailLogTableContentProvider contentProviderFailLogTable;
	
	/* actions */
	
	private Action doubleClickAction;
	private Action actionCopyRule;
	
	/* rule view actions */
	private Action actionDeleteRule;
	private Action actionClearOneRuleCounters;
	private Action actionClearAllCounters;
	private Action actionCreateNewRule;
	private Action actionEditRule;
	private Action actionShowHistory;

	/* fail log actions */
	private Action actionClearFailLog;
	private Action actionShowInTraceViewer;
	
	/* list of rule types */
	ArrayList<ITraceAnalyserRuleType> ruleTypes;

	/* composites for both tabs */
	private Composite compositeRules;
	private Composite compositeFailLog;

	
	/* Tab Folder for main view */
	TabFolder tabFolder;
	
	/* Trace Analyser engine */
	Engine engine;
	
	/* Timer that is used when blinking icon */
	Timer timer;
	
	/* count of how many times icon is blinked */
	int blinkCount;
	
	/* Arraylist containing all open editor views */
	ArrayList<HistoryEditor> openEditors;
	
	
	/**
	 * The constructor.
	 */
	public MainView() {
		ruleTypes = new ArrayList<ITraceAnalyserRuleType>();
		engine = TraceAnalyserPlugin.getEngine();
		TraceAnalyserPlugin.setMainView(this);
		ruleTypes = engine.getRuleTypes();
		blinkCount = 0;
		openEditors = new ArrayList<HistoryEditor>();
	}

	/**
	 * showAndReturnYourself.
     * Makes main view visible and returns an instance of itself. Can be called from
     * an UI thread only.
     * @return instance of main view
     */
    public static MainView showAndReturnYourself() {
    	return showAndReturnYourself(false);
    }
	/**
     * showAndReturnYourself.
     * Makes main view visible and returns an instance of itself. Can be called from
     * an UI thread only.
     * @return instance of main view
     */
	public static MainView showAndReturnYourself(boolean openOnly) {
    	try {
    		
    		IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    		if (ww == null)
    			return null;
    		
    		IWorkbenchPage page = ww.getActivePage();
    		IWorkbenchPart currentPart = page.getActivePart();
    		// Checking if view is already open
    		IViewReference[] viewRefs = page.getViewReferences();
    		for (int i = 0; i < viewRefs.length; i++) {
				IViewReference reference = viewRefs[i];
				String id = reference.getId();
				if(id.equalsIgnoreCase(MainView.ID)){
					// Found, restoring the view
					IViewPart viewPart = reference.getView(true);
					if (!openOnly)
						page.activate(viewPart);
					return (MainView)viewPart;
				}
			}
    		
    		// View was not found, opening it up as a new view.
    		MainView mView = (MainView)page.showView(MainView.ID);
    		if (openOnly)
    			page.bringToTop(currentPart);
    		return mView;
    		
    	} catch (Exception e) {
			e.printStackTrace();
			
			return null;
		}
	}
	
	
	/**
	 * This is a callback that will allow us
	 * to create the viewer and initialize it.
	 */
	public void createPartControl(Composite parent) {
		
		createTabControls(parent);
		createFailLogTable();
		createRuleTable();


		// Create the help context id for the viewer's control
		PlatformUI.getWorkbench().getHelpSystem().setHelp(viewerRuleTable.getControl(), "com.nokia.s60tools.traceanalyser.viewer");
		makeActions();
		hookContextMenu();
		hookDoubleClickAction();
		contributeToActionBars();
		
		refreshRuleContentAndViewAsynch();
		refreshFailLogContentAndViewAsynch();
		readActivationStatus();
		setHelps();
	}

	/**
	 * Creates Tab controls
	 * @param parent composite where tab controls are placed.
	 */
	private void createTabControls(Composite parent){
		// create tab folder.
		tabFolder = new TabFolder (parent, SWT.DOWN);
		tabFolder.addSelectionListener(this);

		// create rule composite
		compositeRules = new Composite(tabFolder, SWT.NONE);
 		GridLayout layoutCompositeRules = new GridLayout();
 		layoutCompositeRules.numColumns = 1;
 		compositeRules.setLayout(layoutCompositeRules);

		// create fail log composite
		compositeFailLog = new Composite(tabFolder, SWT.NONE);
 		GridLayout layoutCompositeFailLog = new GridLayout();
 		layoutCompositeFailLog.numColumns = 1;
 		compositeFailLog.setLayout(layoutCompositeFailLog);
		
 		// create tab items
 		TabItem item = new TabItem (tabFolder, SWT.NONE);
		item.setText ("Trace Analyser rules");
		item.setControl(compositeRules);
		tabFolder.pack();
 		
		TabItem item2 = new TabItem (tabFolder, SWT.NONE);
		item2.setText ("Fail Log");
		item2.setControl(compositeFailLog);
		tabFolder.pack();
	}
	
	/**
	 * Creates fail log table
	 */
	private void createFailLogTable(){
		// Create fail log table
		ArrayList<S60ToolsTableColumnData> failLogColumnArrayList = new ArrayList<S60ToolsTableColumnData>();
		
		failLogColumnArrayList.add(new S60ToolsTableColumnData("Time", 150, 0, FailLogTableDataSorter.TIME)); 
		failLogColumnArrayList.add(new S60ToolsTableColumnData("Rule", 175, 1, FailLogTableDataSorter.RULE));
		failLogColumnArrayList.add(new S60ToolsTableColumnData("Violation", 75, 2, FailLogTableDataSorter.VIOLATION));
		failLogColumnArrayList.add(new S60ToolsTableColumnData("Limit", 75, 3, FailLogTableDataSorter.LIMIT));
		 
		S60ToolsTableColumnData[] columnDataTableFailLog = failLogColumnArrayList.toArray(new S60ToolsTableColumnData[0]);
		S60ToolsTable tableFailLog = S60ToolsTableFactory.create(compositeFailLog, columnDataTableFailLog);
		
		viewerFailLogTable = new TableViewer(tableFailLog.getTableInstance());
		contentProviderFailLogTable = new FailLogTableContentProvider(engine);
		viewerFailLogTable.setContentProvider(contentProviderFailLogTable);
		viewerFailLogTable.setLabelProvider(new FailLogTableLabelProvider());
		viewerFailLogTable.setComparator(new FailLogTableDataSorter());
		viewerFailLogTable.setSorter(new FailLogTableDataSorter());
		viewerFailLogTable.setInput(getViewSite());
		tableFailLog.setHostingViewer(viewerFailLogTable);
	}
	

	/**
	 * Creates rule table
	 */
	private void createRuleTable(){
		Table tableRules =  new Table(compositeRules, SWT.CHECK | SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
		
		tableRules.setLayoutData(new GridData(GridData.FILL_BOTH));
		tableRules.setLinesVisible(true);
		tableRules.setHeaderVisible(true);

		// Add selection listeners for each column after creating it
		tableRules.addSelectionListener(this);
		
		int parameter_column_length = 60;
		
		TableColumn tableColumn = new TableColumn(tableRules, SWT.NONE);
		tableColumn.setWidth(20);
		tableColumn.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				checkAllPressed();
			}
	    });
		
		TableColumn tableColumn2 = new TableColumn(tableRules, SWT.NONE);
		tableColumn2.setWidth(150);
		tableColumn2.setText("Rule Name");

		tableColumn2.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				viewerRuleTable.setSorter(new RuleTableDataSorter(
						RuleTableDataSorter.RULE_NAME));
			}
		});
		
		TableColumn tableColumn3 = new TableColumn(tableRules, SWT.NONE);
		tableColumn3.setWidth(parameter_column_length);
		tableColumn3.setText("Pass");

		tableColumn3.addSelectionListener(new SelectionAdapter() {
	          public void widgetSelected(SelectionEvent e) {
	              	viewerRuleTable.setSorter(
	                   new RuleTableDataSorter(RuleTableDataSorter.PASS));
	               }
	          });

		
		TableColumn tableColumn4 = new TableColumn(tableRules, SWT.NONE);
		tableColumn4.setWidth(parameter_column_length);
		tableColumn4.setText("Fail");
		tableColumn4.addSelectionListener(new SelectionAdapter() {
	          public void widgetSelected(SelectionEvent e) {
	              	viewerRuleTable.setSorter(
	                   new RuleTableDataSorter(RuleTableDataSorter.FAIL));
	               }
	          });
		
		TableColumn tableColumn5 = new TableColumn(tableRules, SWT.NONE);
		tableColumn5.setWidth(parameter_column_length);
		tableColumn5.setText("Pass %");
		tableColumn5.addSelectionListener(new SelectionAdapter() {
	          public void widgetSelected(SelectionEvent e) {
	              	viewerRuleTable.setSorter(
	                   new RuleTableDataSorter(RuleTableDataSorter.PASSPERCENT));
	               }
	          });
		
		TableColumn tableColumn6 = new TableColumn(tableRules, SWT.NONE);
		tableColumn6.setWidth(parameter_column_length);
		tableColumn6.setText("Min");
		tableColumn6.addSelectionListener(new SelectionAdapter() {
	          public void widgetSelected(SelectionEvent e) {
	              	viewerRuleTable.setSorter(
	                   new RuleTableDataSorter(RuleTableDataSorter.MIN));
	               }
	          });
		
		TableColumn tableColumn7 = new TableColumn(tableRules, SWT.NONE);
		tableColumn7.setWidth(parameter_column_length);
		tableColumn7.setText("Max");
		tableColumn7.addSelectionListener(new SelectionAdapter() {
	          public void widgetSelected(SelectionEvent e) {
	              	viewerRuleTable.setSorter(
	                   new RuleTableDataSorter(RuleTableDataSorter.MAX));
	               }
	          });
		
		TableColumn tableColumn8 = new TableColumn(tableRules, SWT.NONE);
		tableColumn8.setWidth(parameter_column_length);
		tableColumn8.setText("Avg");
		tableColumn8.addSelectionListener(new SelectionAdapter() {
	          public void widgetSelected(SelectionEvent e) {
	              	viewerRuleTable.setSorter(
	                   new RuleTableDataSorter(RuleTableDataSorter.AVG));
	               }
	          });
		
		TableColumn tableColumn9 = new TableColumn(tableRules, SWT.NONE);
		tableColumn9.setWidth(parameter_column_length);
		tableColumn9.setText("Med");
		tableColumn9.addSelectionListener(new SelectionAdapter() {
	          public void widgetSelected(SelectionEvent e) {
	              	viewerRuleTable.setSorter(
	                   new RuleTableDataSorter(RuleTableDataSorter.MED));
	               }
	          });
		
		viewerRuleTable = new CheckboxTableViewer(tableRules);
		contentProviderRuleTable = new RuleTableContentProvider(engine);
		viewerRuleTable.setContentProvider(contentProviderRuleTable);
		viewerRuleTable.setLabelProvider(new RuleTableLabelProvider());
		/*viewerRuleTable.setComparator(new RuleTableDataSorter());
		viewerRuleTable.setSorter(new RuleTableDataSorter());*/
		viewerRuleTable.setInput(getViewSite());
		tableRules.addKeyListener(this);

	}
	
	
	/**
	 * hookContextMenu.
	 * Creates context menu for main view.
	 */
	private void hookContextMenu() {
		MenuManager menuMgrRuleTable = new MenuManager("#PopupMenu");
		menuMgrRuleTable.setRemoveAllWhenShown(true);
		menuMgrRuleTable.addMenuListener(new IMenuListener() {
			public void menuAboutToShow(IMenuManager manager) {
				MainView.this.fillContextMenuRuleTable(manager);
			}
		});
		Menu menuRuleTable = menuMgrRuleTable.createContextMenu(viewerRuleTable.getControl());
		viewerRuleTable.getControl().setMenu(menuRuleTable);
		getSite().registerContextMenu(menuMgrRuleTable, viewerRuleTable);
	
	
		MenuManager menuMgrFailLog = new MenuManager("#PopupMenu");
		menuMgrFailLog.setRemoveAllWhenShown(true);
		menuMgrFailLog.addMenuListener(new IMenuListener() {
			public void menuAboutToShow(IMenuManager manager) {
				MainView.this.fillContextMenuFailLog(manager);
			}
		});
		Menu menuFailLog = menuMgrFailLog.createContextMenu(viewerFailLogTable.getControl());
		viewerFailLogTable.getControl().setMenu(menuFailLog);
		getSite().registerContextMenu(menuMgrFailLog, viewerFailLogTable);
	}
	
	

	/**
	 * contributeToActionBars
	 */
	private void contributeToActionBars() {
		IActionBars bars = getViewSite().getActionBars();
		fillLocalPullDown(bars.getMenuManager());
		fillLocalToolBar(bars.getToolBarManager());
	}
	
	/**
	 * fillContextMenuRuleTable
	 * fills context menu for rule table.
	 * @param manager menumanager
	 */

	@SuppressWarnings("unchecked")
	private void fillContextMenuRuleTable(IMenuManager manager) {
		ISelection selection = viewerRuleTable.getSelection();
		Object obj = ((IStructuredSelection)selection).toList();
		List<RuleInformation> selectionList = (List<RuleInformation>)obj;
		if(selectionList.size() == 1){		
			manager.add(actionEditRule);
			manager.add(actionClearOneRuleCounters);
			manager.add(actionShowHistory);
			manager.add(actionCopyRule);
			manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
			manager.add(actionDeleteRule);
		}
		else if(selectionList.size() > 1){		
			manager.add(actionClearOneRuleCounters);
			manager.add(actionShowHistory);
			manager.add(actionDeleteRule);
			manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
		}
	}
	
	
	/**
	 * fillContextMenuFailLog.
	 * fills context menu for fail log view.
	 * @param manager menumanager
	 */

	private void fillContextMenuFailLog(IMenuManager manager) {
			manager.add(actionShowInTraceViewer);
	}
	
	/**
	 * fillLocalToolBar.
	 * fills local toolbar.
	 * @param manager menumanager
	 */
	private void fillLocalToolBar(IToolBarManager manager) {
		manager.removeAll();
		if(tabFolder.getSelectionIndex() == TAB_INDEX_RULE_LIST && actionCopyRule != null){
			manager.add(actionCreateNewRule);
			manager.add(actionClearAllCounters);
			manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
			manager.add(actionDeleteRule);
			manager.update(true);
		}
		else if (tabFolder.getSelectionIndex() == TAB_INDEX_FAIL_LOG && actionCopyRule != null){
			manager.add(actionClearFailLog);
			manager.update(true);
		}
	}
	
	/**
	 * fills local menu
	 */
	private void fillLocalPullDown(IMenuManager manager) {
		manager.removeAll();
		if(tabFolder.getSelectionIndex() == TAB_INDEX_RULE_LIST && actionCopyRule != null){
			manager.add(actionCreateNewRule);
			manager.add(actionClearAllCounters);
			manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
			manager.add(actionDeleteRule);
			manager.update(true);
		}
		else if (tabFolder.getSelectionIndex() == TAB_INDEX_FAIL_LOG && actionCopyRule != null){
			manager.add(actionClearFailLog);
			manager.update(true);
		}
	}

	/**
	 * makeActions.
	 * Creates actions for main view.
	 */
	@SuppressWarnings("unchecked")
	private void makeActions() {
		
		actionDeleteRule = new Action() {
			public void run() {
				if(tabFolder.getSelectionIndex() == TAB_INDEX_RULE_LIST){
					ISelection selection = viewerRuleTable.getSelection();
					Object obj = ((IStructuredSelection)selection).toList();
					List<RuleInformation> selectionList = (List<RuleInformation>)obj;
					
					// Confirm deletion
					if(showConfirmation("Trace Analyser - Delete Rule", "Are you sure you want to delete selected files?")){
						boolean error = false;
						
						for(RuleInformation item : selectionList){
							if(!engine.removeRule(item.getRule().getName())){
								error = true;
							}
						}
						if(error){
							showErrorMessage("Trace Analyser - Error", "An error occured when deleting rule(s).");	
						}
						refreshRuleContentAndView();
					}
				}
						
			}
		};
		actionDeleteRule.setText("Delete Selected Rule");
		actionDeleteRule.setToolTipText("Delete Selected Rule");
		actionDeleteRule.setImageDescriptor( PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));	


		
		actionClearOneRuleCounters = new Action() {
			public void run() {
				ISelection selection = viewerRuleTable.getSelection();
				Object obj = ((IStructuredSelection)selection).toList();
				List<RuleInformation> selectionList = (List<RuleInformation>)obj;
				
				if(showConfirmation("Trace Analyser - Clear History", "Are you sure you want to clear selected rule's history information?")){
					for(RuleInformation item : selectionList){
						engine.resetOneRulesHistory(item.getRule().getName());
					}
				}

			}
		};
		actionClearOneRuleCounters.setText("Clear Selected Rule's Counters");
		actionClearOneRuleCounters.setToolTipText("Clear Selected Rule's Counters");


		
		actionClearAllCounters = new Action() {
			public void run() {
				if(showConfirmation("Trace Analyser - Clear History", "Are you sure you want to clear all rule's history information?")){
					engine.resetHistory();
				}
			}
		};
		actionClearAllCounters.setText("Clear All Rule's counters");
		actionClearAllCounters.setToolTipText("Clear All Rule's counters");
		actionClearAllCounters.setImageDescriptor(ImageResourceManager.getImageDescriptor(ImageKeys.IMG_CLEAR_ALL));

		actionCreateNewRule = new Action() {
			public void run() {		
				// create dialog
				EditRuleDialog dialog = new EditRuleDialog(getSite().getShell(), ruleTypes, null, engine, true);

				// open query dialog
				int retVal = dialog.open();

				// if ok pressed
				if( retVal == 0 ){
					refreshRuleContentAndViewAsynch();
				}
		
			}
		};
		actionCreateNewRule.setText("Create New Rule");
		actionCreateNewRule.setToolTipText("Create New Rule");
		actionCreateNewRule.setImageDescriptor(ImageResourceManager.getImageDescriptor(ImageKeys.IMG_CREATE_NEW));

		
		doubleClickAction = new Action() {
			public void run() {
				if(tabFolder.getSelectionIndex() == TAB_INDEX_RULE_LIST){
					actionEditRule.run();
				}
				else if(tabFolder.getSelectionIndex() == TAB_INDEX_FAIL_LOG){
					actionShowInTraceViewer.run();
					
				}
			}
		};
		
		actionEditRule = new Action() {
			public void run() {		
				ISelection selection = viewerRuleTable.getSelection();
				Object obj = ((IStructuredSelection)selection).toList();
				List<RuleInformation> selectionList = (List<RuleInformation>)obj;
				//verify that only one file is selected.
				if( selectionList.size() == 1 ){
					
					TraceAnalyserRule rule = selectionList.get(0).getRule();
					String ruleName = rule.getName();
					EditRuleDialog dialog = new EditRuleDialog(getSite().getShell(), ruleTypes, rule, engine, false);
					int retVal = dialog.open();
					// open query dialog
					if( retVal == 0 ){
						for(HistoryEditor item : openEditors){
							if(item.getRuleName().equals(ruleName)){
								IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
								activePage.closeAllEditors(false);

							}
						}
						refreshRuleContentAndViewAsynch();
					}
					// Cancel pressed
					else if( retVal == 1 ){
						
					}			
				}
						
			}
		};
		actionEditRule.setText("Edit Selected Rule");
		actionEditRule.setToolTipText("Edit Selected Rule");
		
		actionClearFailLog = new Action() {
			public void run() {	
				if(showConfirmation("Trace Analyser - Clear Fail Log", "Are your sure you want to clear Fail Log")){
					engine.clearFailLog();
				}
			}
		};
		actionClearFailLog.setText("Clear Fail Log");
		actionClearFailLog.setToolTipText("Clear Fail Log");
		actionClearFailLog.setImageDescriptor(ImageResourceManager.getImageDescriptor(ImageKeys.IMG_CLEAR_FAIL_LOG));


		
		actionShowInTraceViewer = new Action() {
			public void run() {	
				ISelection selection = viewerFailLogTable.getSelection();
				Object obj = ((IStructuredSelection)selection).toList();
				List<RuleEvent> selectionList = (List<RuleEvent>)obj;
				//verify that only one file is selected.
				if( selectionList.size() == 1 ){
					//sync to trace
					
					TVAPIError error;
					if(selectionList.get(0).getTraceNumbers().length == 1){
						error = TraceViewerAPI.syncToTrace(selectionList.get(0).getTraceNumbers()[0], 0);

					}
					else{
						error = TraceViewerAPI.syncToTrace(selectionList.get(0).getTraceNumbers()[0], selectionList.get(0).getTraceNumbers()[1]);
					}
					
					
					if(error == TVAPIError.NONE){
						showTraceViewer();
					}
					else{
						showErrorMessage("Trace Analyser - Error", 
						"Unable to locate events from TraceViewer's log. Perhaps the log has been cleared.");						
					}

				}
			}
		};
		actionShowInTraceViewer.setText("Show in TraceViewer");
		actionShowInTraceViewer.setToolTipText("Show in TraceViewer");

		actionShowHistory = new Action() {
			public void run() {	
				ISelection selection = viewerRuleTable.getSelection();
				Object obj = ((IStructuredSelection)selection).toList();
				List<RuleInformation> selectionList = (List<RuleInformation>)obj;
				//verify that only one file is selected.
				if( selectionList.size() == 1 ){
					HistoryEditorInput input = new HistoryEditorInput(selectionList.get(0));
					IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
					try {
						openEditors.add((HistoryEditor)activePage.openEditor(input,"com.nokia.s60tools.traceanalyser.ui.editors.HistoryEditor"));
					} catch (PartInitException e) {
						e.printStackTrace();
					}
				}
			}
		};
		actionShowHistory.setText("Show History");
		actionShowHistory.setToolTipText("Show History");
		
		
		actionCopyRule = new Action() {
			public void run() {	
				ISelection selection = viewerRuleTable.getSelection();
				Object obj = ((IStructuredSelection)selection).toList();
				List<RuleInformation> selectionList = (List<RuleInformation>)obj;
				//verify that only one file is selected.
				if( selectionList.size() == 1 ){

					TraceAnalyserRule rule = selectionList.get(0).getRule();
					
					EditRuleDialog dialog = new EditRuleDialog(getSite().getShell(), ruleTypes, rule, engine, true);
					int retVal = dialog.open();
					// open query dialog
					if( retVal == 0 ){
						
						refreshRuleContentAndViewAsynch();
					}
					// Cancel pressed
					else if( retVal == 1 ){
						
					}			

					
					
				}
			}
		};
		actionCopyRule.setText("Copy Selected Rule");
		actionCopyRule.setToolTipText("Copy Selected Rule");
	}

	/**
	 * hookDoubleClickAction.
	 */
	private void hookDoubleClickAction() {
		IDoubleClickListener listener = new IDoubleClickListener() {
			public void doubleClick(DoubleClickEvent event) {
				doubleClickAction.run();
			}
		};
		
		viewerRuleTable.addDoubleClickListener(listener);
		viewerFailLogTable.addDoubleClickListener(listener);
	}
	


	/**
	 * Passing the focus request to the viewer's control.
	 */
	public void setFocus() {
		viewerRuleTable.getControl().setFocus();
	}
	


	
	/*
	 * (non-Javadoc)
	 * @see com.nokia.s60tools.traceanalyser.interfaces.ITraceAnalyserFileObserver#rulesUpdated()
	 */
	public void rulesUpdated() {
		Runnable refreshRunnable = new Runnable(){
			public void run(){

				viewerRuleTable.refresh();
				readActivationStatus();
				for(HistoryEditor item : openEditors){
					item.historyUpdated();
					
				}
			
			}
		};
		
		Display.getDefault().asyncExec(refreshRunnable);       
	}
	
	/*
	 * (non-Javadoc)
	 * @see com.nokia.s60tools.traceanalyser.interfaces.ITraceAnalyserFileObserver#ruleUpdated(java.lang.String)
	 */
	public void ruleUpdated(final String ruleName){
		
		Runnable refreshRunnable = new Runnable(){
			public void run(){

				viewerRuleTable.refresh();
				readActivationStatus();
				
				for(HistoryEditor item : openEditors){
					item.historyUpdated();

				}
			
			}
		};
		
		Display.getDefault().asyncExec(refreshRunnable);    
		
	}
	
	/**
	 * refreshRuleContentAndViewAsynch.
	 * Refreshes content and view asynchronously.
	 */
	private void refreshRuleContentAndViewAsynch(){
		Runnable refreshRunnable = new Runnable(){
			public void run(){
				refreshRuleContentAndView();
			}
		};
		
		Display.getDefault().asyncExec(refreshRunnable);       
		
	}
	/**
	 * refreshRuleContentAndView.
	 * Refreshes content and view asynchronously.
	 */
	private void refreshRuleContentAndView(){
		contentProviderRuleTable.refresh();
		viewerRuleTable.refresh();
		readActivationStatus();
		
		
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
	 */
	public void widgetDefaultSelected(SelectionEvent arg0) {
		// nothing to be done.
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
	 */
	public void widgetSelected(SelectionEvent event) {
		if(event.widget == tabFolder){
			contributeToActionBars();
		}
		if(event.detail == SWT.CHECK){
			RuleInformation info = (RuleInformation)event.item.getData();
			boolean value = viewerRuleTable.getChecked(event.item.getData());
			engine.changeRuleaActivation(info.getRule().getName(), value);
		}
	}

	/*
	 * (non-Javadoc)
	 * @see com.nokia.s60tools.traceanalyser.interfaces.ITraceAnalyserFileObserver#failLogUpdated()
	 */
	public void failLogUpdated() {
		Runnable refreshRunnable = new Runnable(){
			public void run(){

			viewerFailLogTable.refresh();
			}
		};
		
		Display.getDefault().asyncExec(refreshRunnable);  
		
	}
	
	/**
	 * refreshFailLogContentAndViewAsynch.
	 * Refreshes content and view asynchronously.
	 */
	private void refreshFailLogContentAndViewAsynch(){
		Runnable refreshRunnable = new Runnable(){
			public void run(){
				refreshFailLogContentAndView();
			}
		};
		
		Display.getDefault().asyncExec(refreshRunnable);       
		
	}
	/**
	 * refreshFailLogContentAndView.
	 * Refreshes content and view asynchronously.
	 */
	private void refreshFailLogContentAndView(){
		contentProviderFailLogTable.refresh();
		viewerFailLogTable.refresh();
	}

	public void dispose(){
		TraceAnalyserPlugin.setMainView(null);
	}

	
	/**
	 * showTraceViewer
	 * shows trace viewer plugin
	 */
	public static void showTraceViewer() {
    	try {

    		IWorkbenchWindow ww = TraceAnalyserPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
    		if (ww == null)
    			return;
    		IWorkbenchPage page = ww.getActivePage();
    		
    		// Checking if view is already open
    		IViewReference[] viewRefs = page.getViewReferences();
    		for (int i = 0; i < viewRefs.length; i++) {
				IViewReference reference = viewRefs[i];
				String id = reference.getId();
				if(id.equalsIgnoreCase(TRACE_VIEWER_VIEW_ID)){
					// Found, restoring the view
					IViewPart viewPart = reference.getView(true);
					page.activate(viewPart);
					return;
				}
			}
    		
    		// View was not found, opening it up as a new view.
    		page.showView(TRACE_VIEWER_VIEW_ID);
    		
    	} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * blinks icon when fail received.
	 */
	public void blinkIcon(){
		Runnable refreshRunnable = new Runnable(){
			public void run(){
				setTitleImage(ImageResourceManager.getImage(ImageKeys.IMG_FAIL_RECEIVED));
			}
		};
		
		
		if(timer == null || !timer.isRunning()){
			timer = new Timer(500, this);
			timer.start();
			Display.getDefault().asyncExec(refreshRunnable);

		}
		else{
			
		}
	
	}

	/*
	 * (non-Javadoc)
	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
	 */
	public void actionPerformed(ActionEvent arg0) {
		Runnable refreshRunnable = new Runnable(){
			public void run(){

				if(blinkCount % 2 == 1){
					setTitleImage(ImageResourceManager.getImage(ImageKeys.IMG_FAIL_RECEIVED));
				}
				else{
					setTitleImage(ImageResourceManager.getImage(ImageKeys.IMG_APP_ICON));
				}
				blinkCount++;
				
				if( blinkCount == 3){
					blinkCount = 0;
					timer.stop();
				}
			}
		};
		Display.getDefault().asyncExec(refreshRunnable);
		
	}

	/**
	 * Reads activation status and sets table's check/uncheck status correct
	 */
	private void readActivationStatus(){
		int i = 0;
		while(true){
			Object information = viewerRuleTable.getElementAt(i);
			if(information != null){
				if( ((RuleInformation)information).getRule().isActivated()){
					viewerRuleTable.setChecked(information, true);
				}
			}
			else{
				break;
			}
			i++;
			
		}
	}
	
	
	
	/**
	 * showErrorMessage.
	 * shows error message asynchronously
	 * @param header header of message
	 * @param text error text
	 */
	public void showErrorMessage(String header, String text){
		MessageDialog.openError( getSite().getShell(), header, text);
	}
	
	
	
	/**
	 * showConfirmation.
	 * Displays a Confirmation dialog
	 * @param header text for window header
	 * @param text text for window text
	 * @return true, if yes was pressed.
	 */
	public boolean showConfirmation(String header, String text){
		MessageBox messageBox = new MessageBox(this.getSite().getShell(), SWT.ICON_QUESTION | SWT.YES | SWT.NO);
	    messageBox.setText(header);
	    messageBox.setMessage(text);
	    int retval = messageBox.open();
	    if(retval == SWT.YES){
	    	return true;
	    }
	    else{
	    	return false;
	    }

	}
	
	
	/**
	 * editorClosed
	 * removes editor pointer from openEditors-array
	 * @param ruleName name of the rule.
	 */
	public void editorClosed(String ruleName){
		HistoryEditor closeEditor = null;
		for(HistoryEditor item : openEditors){
			if(item.getRuleName().equals(ruleName)){
				closeEditor = item;
			}
		}
		openEditors.remove(closeEditor);
	}
	
	/*
	 * (non-Javadoc)
	 * @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)
	 */
	public void keyPressed(KeyEvent keyEvent) {
		
		// if delete key is pressed run delete -action.
		if( keyEvent.keyCode == java.awt.event.KeyEvent.VK_DELETE){
			actionDeleteRule.run();
		}
	}
	/*
	 * (non-Javadoc)
	 * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
	 */
	public void keyReleased(KeyEvent arg0) {
		// can be left empty.
	}
	
	/**
	 * Activate/deactivate all rules in main view
	 */
	private void checkAllPressed(){
		boolean activationStatus = false;
		
		// compare amount of checked and unchecked rules 
		if( viewerRuleTable.getCheckedElements().length <= (viewerRuleTable.getTable().getItemCount() / 2)){
			activationStatus = true;
		}
		int i = 0;
		while(true){
			RuleInformation information = (RuleInformation)viewerRuleTable.getElementAt(i);
			if(information != null){
				viewerRuleTable.setChecked(information, activationStatus);
				engine.changeRuleaActivation(information.getRule().getName(), activationStatus);
			}
			else{
				break;
			}
			i++;
			
		}
	}
	
	/**
	 * Sets this page's context sensitive helps
	 */
	protected void setHelps() {
		PlatformUI.getWorkbench().getHelpSystem().setHelp( viewerFailLogTable.getControl(), com.nokia.s60tools.traceanalyser.resources.HelpContextIDs.TRACE_ANALYSER_FAIL_LOG);
		PlatformUI.getWorkbench().getHelpSystem().setHelp( tabFolder, com.nokia.s60tools.traceanalyser.resources.HelpContextIDs.TRACE_ANALYSER_MAIN_VIEW);
		PlatformUI.getWorkbench().getHelpSystem().setHelp( viewerRuleTable.getControl(), com.nokia.s60tools.traceanalyser.resources.HelpContextIDs.TRACE_ANALYSER_MAIN_VIEW);
		PlatformUI.getWorkbench().getHelpSystem().setHelp( getSite().getShell(), com.nokia.s60tools.traceanalyser.resources.HelpContextIDs.TRACE_ANALYSER_MAIN_VIEW);
		
	}
	

}