crashanalysis/crashanalyser/com.nokia.s60tools.crashanalyser/src/com/nokia/s60tools/crashanalyser/ui/dialogs/ErrorLibraryDialog.java
changeset 0 5ad7ad99af01
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/crashanalysis/crashanalyser/com.nokia.s60tools.crashanalyser/src/com/nokia/s60tools/crashanalyser/ui/dialogs/ErrorLibraryDialog.java	Thu Feb 11 15:06:45 2010 +0200
@@ -0,0 +1,378 @@
+/*
+* Copyright (c) 2008 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.crashanalyser.ui.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import com.nokia.s60tools.crashanalyser.resources.HelpContextIDs;
+import com.nokia.s60tools.crashanalyser.search.TextViewerFilter;
+import com.nokia.s60tools.crashanalyser.containers.ErrorLibraryError;
+import com.nokia.s60tools.crashanalyser.data.*;
+import com.nokia.s60tools.crashanalyser.model.PanicsViewerSorter;
+import com.nokia.s60tools.crashanalyser.model.ErrorsViewerSorter;
+import com.nokia.s60tools.crashanalyser.model.HtmlFormatter;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+
+/**
+ * A dialog which contains all errors, panics and panic categories.
+ * 
+ * Dialog contains three tab pages: Panic search, Category search and Error search.
+ *
+ */
+public class ErrorLibraryDialog extends Dialog implements 	ModifyListener,
+															SelectionListener,
+															ISelectionChangedListener {
+	Text textPanicSearch;
+	Text textCategorySearch;
+	Text textErrorSearch;
+	ListViewer listPanics;
+	ListViewer listCategories;
+	ListViewer listErrors;
+	Browser browserPanicDescription;
+	Browser browserCategoryDescription;
+	Browser browserErrorDescription;
+	ErrorLibraryContentProvider contentPanics;
+	ErrorLibraryContentProvider contentCategories;
+	ErrorLibraryContentProvider contentErrors;
+	ErrorLibrary errorLibrary;
+	Link linkMailTo;
+	
+	/**
+	 * Constructor
+	 * @param parentShell shell
+	 * @param library error library
+	 */
+	public ErrorLibraryDialog(Shell parentShell, ErrorLibrary library) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE | SWT.HELP);
+		errorLibrary = library;
+	}
+	
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);
+		
+		GridLayout gdl = new GridLayout(1, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.widthHint = 600;
+		gd.heightHint = 600;
+		dialogAreaComposite.setLayout(gdl);
+		dialogAreaComposite.setLayoutData(gd);
+
+		// create tab
+		TabFolder tabFolder = new TabFolder(dialogAreaComposite, SWT.NONE);
+		tabFolder.setLayoutData(gd);
+		
+		// create tab pages
+		createPanicsPage(tabFolder);
+		createCategoriesPage(tabFolder);
+		createErrorsPage(tabFolder);
+		
+		// mail to link, which can be used to notify about missing panic descriptions
+		linkMailTo = new Link(dialogAreaComposite, SWT.NONE);
+		linkMailTo.setText("<a href=\"mailto:S60RnDtools@nokia.com?subject=Crash Analyser - Missing Panic\">Report a missing panic or error</a>");
+		linkMailTo.addSelectionListener(this);
+		
+		tabFolder.setSelection(0);
+
+		// load data to tab pages asynchronously
+		loadDataAsync();
+		
+		return dialogAreaComposite;
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, false);
+		setHelps();
+	}
+	
+	@Override
+	protected void configureShell(Shell newShell) {
+		super.configureShell(newShell);
+		newShell.setText("Crash Analyser - Error Library");
+	}
+	
+	/**
+	 * Called when user types something into search boxes
+	 */
+	public void modifyText(ModifyEvent item) {
+		// panic search text was modified, filter list accordingly
+		if (item.widget == textPanicSearch) {
+			listPanics.resetFilters();
+			String text = textPanicSearch.getText();
+			if (text.length() > 0) {
+				listPanics.addFilter(new TextViewerFilter(text));
+			}
+			if (listPanics.getList().getItemCount() > 0) {
+				listPanics.setSelection(new StructuredSelection(listPanics.getElementAt(0)), true);
+			} else {
+				browserPanicDescription.setText("");
+			}
+			
+		// category search text was modified, filter list accordingly
+		} else if (item.widget == textCategorySearch) {
+			listCategories.resetFilters();
+			String text = textCategorySearch.getText();
+			if (text.length() > 0) {
+				listCategories.addFilter(new TextViewerFilter(text));
+			}
+			if (listCategories.getList().getItemCount() > 0) {
+				listCategories.setSelection(new StructuredSelection(listCategories.getElementAt(0)), true);
+			} else {
+				browserCategoryDescription.setText("");
+			}
+
+		// error search text was modified, filter list accordingly
+		} else if (item.widget == textErrorSearch) {
+			listErrors.resetFilters();
+			String text = textErrorSearch.getText();
+			if (text.length() > 0) {
+				listErrors.addFilter(new TextViewerFilter(text));
+			}
+			if (listErrors.getList().getItemCount() > 0) {
+				listErrors.setSelection(new StructuredSelection(listErrors.getElementAt(0)), true);
+			} else {
+				browserErrorDescription.setText("");
+			}
+		}
+	}	
+	
+	/**
+	 * Called when user selects something from list
+	 */
+	public void selectionChanged(SelectionChangedEvent event) {
+		// user selected from panics list
+		if (event.getSource() == listPanics) {
+			int index = listPanics.getList().getSelectionIndex();
+			if (index >= 0) {
+				ErrorLibraryError p = (ErrorLibraryError)listPanics.getElementAt(index);
+				if (p != null)
+					browserPanicDescription.setText(HtmlFormatter.formatHtmlStyle(textPanicSearch.getFont(), 
+													p.getDescription()));
+			}
+			
+		// user selected from categories list
+		} else if (event.getSource() == listCategories) {
+			int index = listCategories.getList().getSelectionIndex();
+			if (index >= 0) {
+				ErrorLibraryError p = (ErrorLibraryError)listCategories.getElementAt(index);
+				if (p != null)
+					browserCategoryDescription.setText(HtmlFormatter.formatHtmlStyle(textPanicSearch.getFont(),
+														p.getDescription()));
+			}
+			
+		// user selected from errors list
+		} else if (event.getSource() == listErrors) {
+			int index = listErrors.getList().getSelectionIndex();
+			if (index >= 0) {
+				ErrorLibraryError p = (ErrorLibraryError)listErrors.getElementAt(index);
+				if (p != null)
+					browserErrorDescription.setText(HtmlFormatter.formatHtmlStyle(textPanicSearch.getFont(),
+													p.getDescription()));
+			}			
+		}
+	}
+	
+	public void widgetDefaultSelected(SelectionEvent arg0) {
+		// no implementation needed
+	}
+
+	public void widgetSelected(SelectionEvent event) {
+		try	{
+			browserCategoryDescription.setUrl(event.text);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Creates panics tab page
+	 * @param tabFolder
+	 */
+	void createPanicsPage(TabFolder tabFolder) {
+		TabItem panicsPage = new TabItem(tabFolder, SWT.NONE);
+		panicsPage.setText("Panic Search");
+		
+		Composite composite = getComposite(tabFolder);
+		
+		textPanicSearch = new Text(composite, SWT.BORDER | SWT.SINGLE);
+		textPanicSearch.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		textPanicSearch.addModifyListener(this);
+		
+		listPanics = new ListViewer(composite, SWT.BORDER | SWT.V_SCROLL);
+		listPanics.getList().setLayoutData(getListGridData());
+		listPanics.addSelectionChangedListener(this);
+		listPanics.setSorter(new PanicsViewerSorter());
+		
+		browserPanicDescription = new Browser(composite, SWT.BORDER);
+		browserPanicDescription.setLayoutData(new GridData(GridData.FILL_BOTH));
+		browserPanicDescription.setText("");
+		
+		panicsPage.setControl(composite);
+	}
+	
+	/**
+	 * Creates categories tab page
+	 * @param tabFolder
+	 */
+	void createCategoriesPage(TabFolder tabFolder) {
+		TabItem categoriesPage = new TabItem(tabFolder, SWT.NONE);
+		categoriesPage.setText("Category Search");
+
+		Composite composite = getComposite(tabFolder);
+		
+		textCategorySearch = new Text(composite, SWT.BORDER | SWT.SINGLE);
+		textCategorySearch.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		textCategorySearch.addModifyListener(this);
+		
+		listCategories = new ListViewer(composite, SWT.BORDER | SWT.V_SCROLL);
+		listCategories.getList().setLayoutData(getListGridData());
+		listCategories.addSelectionChangedListener(this);
+		listCategories.setSorter(new ViewerSorter());
+		
+		browserCategoryDescription = new Browser(composite, SWT.BORDER);
+		browserCategoryDescription.setLayoutData(new GridData(GridData.FILL_BOTH));
+		browserCategoryDescription.setText("");
+		
+		categoriesPage.setControl(composite);
+	}
+
+	/**
+	 * Creates errors tab page
+	 * @param tabFolder
+	 */
+	void createErrorsPage(TabFolder tabFolder) {
+		TabItem errorsPage = new TabItem(tabFolder, SWT.NONE);
+		errorsPage.setText("Error Search");
+
+		Composite composite = getComposite(tabFolder);
+		
+		textErrorSearch = new Text(composite, SWT.BORDER | SWT.SINGLE);
+		textErrorSearch.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		textErrorSearch.addModifyListener(this);
+		
+		listErrors = new ListViewer(composite, SWT.BORDER | SWT.V_SCROLL);
+		listErrors.getList().setLayoutData(getListGridData());
+		listErrors.addSelectionChangedListener(this);
+		listErrors.setSorter(new ErrorsViewerSorter());
+		
+		browserErrorDescription = new Browser(composite, SWT.BORDER);
+		browserErrorDescription.setLayoutData(new GridData(GridData.FILL_BOTH));
+		browserErrorDescription.setText("");
+		
+		errorsPage.setControl(composite);
+	}
+	
+	/**
+	 * Creates a composite which tab pages can utilize.
+	 * @param tabFolder
+	 * @return composite
+	 */
+	Composite getComposite(TabFolder tabFolder) {
+		Composite composite = new Composite(tabFolder, SWT.NONE);
+		composite.setLayout(new RowLayout());
+		GridLayout gdl = new GridLayout(1, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		composite.setLayout(gdl);
+		composite.setLayoutData(gd);
+		return composite;
+	}
+	
+	/**
+	 * Creates a grid data object for lists
+	 * @return
+	 */
+	GridData getListGridData() {
+		GridData listGd = new GridData(GridData.FILL_HORIZONTAL);
+		listGd.heightHint = 100;
+		return listGd;
+	}
+	
+	/**
+	 * Sets context sensitive helps to all UI items.
+	 */
+	void setHelps() {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(textPanicSearch,
+				HelpContextIDs.CRASH_ANALYSER_HELP_ERROR_LIBRARY);	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(textErrorSearch,
+				HelpContextIDs.CRASH_ANALYSER_HELP_ERROR_LIBRARY);	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(textCategorySearch,
+				HelpContextIDs.CRASH_ANALYSER_HELP_ERROR_LIBRARY);	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(listPanics.getControl(),
+				HelpContextIDs.CRASH_ANALYSER_HELP_ERROR_LIBRARY);	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(listCategories.getControl(),
+				HelpContextIDs.CRASH_ANALYSER_HELP_ERROR_LIBRARY);	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(listErrors.getControl(),
+				HelpContextIDs.CRASH_ANALYSER_HELP_ERROR_LIBRARY);	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(browserCategoryDescription,
+				HelpContextIDs.CRASH_ANALYSER_HELP_ERROR_LIBRARY);	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(browserErrorDescription,
+				HelpContextIDs.CRASH_ANALYSER_HELP_ERROR_LIBRARY);	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(browserPanicDescription,
+				HelpContextIDs.CRASH_ANALYSER_HELP_ERROR_LIBRARY);	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(linkMailTo,
+				HelpContextIDs.CRASH_ANALYSER_HELP_ERROR_LIBRARY);	
+	}
+		
+	/**
+	 * Loads panics, categories and errors into lists asynchronously so that
+	 * dialog can be opened fast
+	 */
+	public void loadDataAsync() {
+		Runnable refreshRunnable = new Runnable(){
+			public void run(){
+				// panics
+				contentPanics = new ErrorLibraryContentProvider(ErrorLibraryContentProvider.ContentTypes.PANIC, errorLibrary);
+				listPanics.setContentProvider(contentPanics);
+				listPanics.setInput(contentPanics);
+				
+				// categories
+				contentCategories = new ErrorLibraryContentProvider(ErrorLibraryContentProvider.ContentTypes.CATEGORY, errorLibrary);
+				listCategories.setContentProvider(contentCategories);
+				listCategories.setInput(contentCategories);
+				
+				// errors
+				contentErrors = new ErrorLibraryContentProvider(ErrorLibraryContentProvider.ContentTypes.ERROR, errorLibrary);
+				listErrors.setContentProvider(contentErrors);
+				listErrors.setInput(contentErrors);
+			}
+		};
+		
+		Display.getDefault().asyncExec(refreshRunnable);        		
+	}
+}