com.nokia.traceviewer.dialog.BaseTreeDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.traceviewer.dialog.BaseTreeDialog.java

Source

/*
 * Copyright (c) 2007-2010 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:
 *
 * Base class for tree dialogs
 *
 */
package com.nokia.traceviewer.dialog;

import java.net.URL;

import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;

import com.nokia.traceviewer.TraceViewerPlugin;
import com.nokia.traceviewer.action.PauseAction;
import com.nokia.traceviewer.dialog.treeitem.TreeCheckboxStateListener;
import com.nokia.traceviewer.dialog.treeitem.TreeItem;
import com.nokia.traceviewer.dialog.treeitem.TreeItemContentProvider;
import com.nokia.traceviewer.dialog.treeitem.TreeItemLabelProvider;
import com.nokia.traceviewer.engine.TraceViewerGlobals;

/**
 * Base class for tree dialogs
 * 
 */
public abstract class BaseTreeDialog extends BaseDialog {

    /**
     * Tree viewer object
     */
    protected CheckboxTreeViewer viewer;

    /**
     * Toolbar where actionbuttons are
     */
    protected ToolBar toolBar;

    /**
     * Add group button
     */
    protected ToolItem addGroupItem;

    /**
     * Add item button
     */
    protected ToolItem addItem;

    /**
     * Edit item button
     */
    protected ToolItem editItem;

    /**
     * Remove item button
     */
    protected ToolItem removeItem;

    /**
     * Clear all button
     */
    protected ToolItem clearItem;

    /**
     * ProgressBar Dialog
     */
    protected ProgressBarDialog progressBarDialog;

    /**
     * Content provider
     */
    protected TreeItemContentProvider contentProvider;

    /**
     * Checkbox state listener used to check/uncheck many items at once
     */
    protected TreeCheckboxStateListener checkboxStateListener;

    /**
     * Tree root
     */
    protected TreeItem treeRoot;

    /**
     * Root item in tree
     */
    protected TreeItem root;

    /**
     * Selected object when starting drag and drop
     */
    private TreeItem selectedObject;

    // Images
    /**
     * Group add image
     */
    protected Image groupAddImage;

    /**
     * Item add image
     */
    protected Image itemAddImage;

    /**
     * Item edit image
     */
    protected Image itemEditImage;

    /**
     * Item remove image
     */
    protected Image itemRemoveImage;

    /**
     * Item clear image
     */
    protected Image clearImage;

    /**
     * Create group menu item
     */
    private MenuItem addGroup;

    /**
     * Add new rule menu item
     */
    private MenuItem addRule;

    /**
     * Edit rule menu item
     */
    private MenuItem editRule;

    /**
     * Remove rule menu item
     */
    private MenuItem removeRule;

    /**
     * Rename configuration menu item
     */
    private MenuItem renameRule;

    /**
     * Indicates that something changed while visiting this dialog -> Apply
     * settings
     */
    protected boolean somethingChanged = false;

    /**
     * Checks if DataReader was paused when we entered dialog -> Don't pause
     * again and don't unpause in exit
     */
    protected boolean wasPausedWhenEntered = true;

    /**
     * Tells that we are inserting before item under the mouse cursor when
     * dragging and dropping items
     */
    private boolean dndAddBefore;

    /**
     * Add group image
     */
    private static final String groupAddImageLocation = "/icons/folderadd.gif"; //$NON-NLS-1$

    /**
     * Add item image
     */
    private static final String itemAddImageLocation = "/icons/coloradd.gif"; //$NON-NLS-1$

    /**
     * Edit item image
     */
    private static final String itemEditImageLocation = "/icons/coloredit.gif"; //$NON-NLS-1$

    /**
     * Remove item image
     */
    private static final String itemRemoveImageLocation = "/icons/colorremove.gif"; //$NON-NLS-1$

    /**
     * Clear all image
     */
    private static final String clearImageLocation = "/icons/clear.gif"; //$NON-NLS-1$

    /**
     * Name of the dialog
     */
    private static final String dialogName = Messages.getString("BaseTreeDialog.DialogName"); //$NON-NLS-1$

    /**
     * Constructor
     * 
     * @param parent
     *            parent shell
     * @param contentProvider
     *            content provider
     * @param treeRoot
     *            tree root
     */
    protected BaseTreeDialog(Shell parent, TreeItemContentProvider contentProvider, TreeItem treeRoot) {
        super(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.RESIZE);
        this.contentProvider = contentProvider;
        this.treeRoot = treeRoot;
        root = (TreeItem) treeRoot.getChildren()[0];
    }

    /**
     * Export
     */
    protected abstract void export();

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.TrayDialog#close()
     */
    @Override
    public boolean close() {
        boolean close = super.close();
        if (!wasPausedWhenEntered) {
            // Unpause
            PauseAction action = (PauseAction) TraceViewerGlobals.getTraceViewer().getView().getActionFactory()
                    .getPauseAction();
            action.setPaused(false);
        }
        export();
        return close;
    }

    /**
     * Disposes images when shell is closed
     */
    protected void dispose() {
        // Dispose images
        if (groupAddImage != null) {
            groupAddImage.dispose();
        }
        if (itemAddImage != null) {
            itemAddImage.dispose();
        }
        if (itemEditImage != null) {
            itemEditImage.dispose();
        }
        if (itemRemoveImage != null) {
            itemRemoveImage.dispose();
        }
        if (clearImage != null) {
            clearImage.dispose();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.traceviewer.dialog.BaseDialog#restoreSettings()
     */
    @Override
    protected void restoreSettings() {
        // Restore the location of the dialog
        super.restoreSettings();

        // Set clear button enabled if there's more than root
        if (root.getChildren().length > 0) {
            clearItem.setEnabled(true);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.traceviewer.dialog.BaseDialog#createDialogContents()
     */
    @Override
    protected void createDialogContents() {
        createDialogContents(dialogName);
    }

    /**
     * Creates dialog contents
     * 
     * @param dialogName
     *            dialog name
     */
    protected void createDialogContents(String dialogName) {
        doInitialSetup();

        // Shell
        GridLayout shellGridLayout = new GridLayout();
        shellGridLayout.numColumns = 3;
        GridData compositeGridData = new GridData();
        compositeGridData.horizontalAlignment = SWT.FILL;
        compositeGridData.verticalAlignment = SWT.FILL;
        compositeGridData.grabExcessHorizontalSpace = true;
        compositeGridData.grabExcessVerticalSpace = true;
        getShell().setText(dialogName);
        root.setName(dialogName);
        composite.setLayout(shellGridLayout);
        composite.setLayoutData(compositeGridData);

        createToolBar();
        getShell().setMinimumSize(new Point(280, 380));
        createTree();

        // Spacer label
        Label spacer = new Label(composite, SWT.NONE);
        GridData spacerGridData = new GridData(SWT.FILL, SWT.FILL);
        spacerGridData.grabExcessHorizontalSpace = true;
        spacer.setLayoutData(spacerGridData);
    }

    /**
     * Does initial dialog setup
     */
    protected void doInitialSetup() {
        // Pause the datareader if it's not paused already
        wasPausedWhenEntered = TraceViewerGlobals.getTraceViewer().getDataReaderAccess().getMainDataReader()
                .isPaused();
        if (!wasPausedWhenEntered) {
            TraceViewerGlobals.getTraceViewer().getView().getActionFactory().getPauseAction().run();
        }
        somethingChanged = false;
    }

    /**
     * Creates the tree viewer
     */
    protected void createTree() {
        GridData treeGridData = new GridData();
        treeGridData.horizontalSpan = 3;
        treeGridData.horizontalAlignment = SWT.FILL;
        treeGridData.verticalAlignment = SWT.FILL;
        treeGridData.grabExcessVerticalSpace = true;
        treeGridData.grabExcessHorizontalSpace = true;
        treeGridData.heightHint = 227;
        treeGridData.widthHint = 250;

        // Create Viewer with the checkbox style bit
        viewer = new CheckboxTreeViewer(composite, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);

        viewer.getTree().setLayoutData(treeGridData);
        viewer.setLabelProvider(new TreeItemLabelProvider());
        viewer.setContentProvider(contentProvider);

        // Set root and expand all items
        viewer.setInput(treeRoot);
        viewer.expandAll();

        // Select the root item
        if (viewer.getTree().getItem(0) != null) {
            viewer.getTree().setSelection(viewer.getTree().getItem(0));
        }

        // Create listener for checkboxes
        checkboxStateListener = new TreeCheckboxStateListener(viewer);
        viewer.addCheckStateListener(checkboxStateListener);

        // Drag and Drop support
        createDNDSupport();

        // Context menu
        createContextMenu();

        // Set initial button states
        setButtonStates();
    }

    /**
     * Creates Drag and Drop support
     */
    private void createDNDSupport() {
        Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
        int operations = DND.DROP_MOVE;

        // Drag Source definitions
        final DragSource source = new DragSource(viewer.getTree(), operations);
        source.setTransfer(types);

        // Add drag listener
        source.addDragListener(new DragSourceListener() {

            /*
             * (non-Javadoc)
             * 
             * @see
             * org.eclipse.swt.dnd.DragSourceListener#dragStart(org.eclipse.
             * swt.dnd.DragSourceEvent)
             */
            public void dragStart(DragSourceEvent event) {
                // Get selected object
                selectedObject = ((TreeItem) ((IStructuredSelection) viewer.getSelection()).getFirstElement());
                if (selectedObject != null) {
                    event.doit = true;
                } else {
                    event.doit = false;
                }
            }

            /*
             * (non-Javadoc)
             * 
             * @see
             * org.eclipse.swt.dnd.DragSourceListener#dragSetData(org.eclipse
             * .swt.dnd.DragSourceEvent)
             */
            public void dragSetData(DragSourceEvent event) {
                // Have to put some String here
                event.data = "blaa"; //$NON-NLS-1$
            }

            /*
             * (non-Javadoc)
             * 
             * @see
             * org.eclipse.swt.dnd.DragSourceListener#dragFinished(org.eclipse
             * .swt.dnd.DragSourceEvent)
             */
            public void dragFinished(DragSourceEvent event) {
            }
        });

        // Drop Target definitions
        DropTarget target = new DropTarget(viewer.getTree(), operations);
        target.setTransfer(types);

        // Add drop listener
        target.addDropListener(new DropTargetAdapter() {

            /*
             * (non-Javadoc)
             * 
             * @see
             * org.eclipse.swt.dnd.DropTargetAdapter#dragOver(org.eclipse.swt
             * .dnd.DropTargetEvent)
             */
            @Override
            public void dragOver(DropTargetEvent event) {
                event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
                if (event.item != null) {
                    org.eclipse.swt.widgets.TreeItem item = (org.eclipse.swt.widgets.TreeItem) event.item;
                    Point pt = getShell().getDisplay().map(null, viewer.getTree(), event.x, event.y);
                    Rectangle bounds = item.getBounds();
                    TreeItem it = (TreeItem) item.getData();
                    dndAddBefore = false;
                    if (pt.y < bounds.y + bounds.height / 3) {
                        dndAddBefore = true;
                        event.feedback = DND.FEEDBACK_INSERT_BEFORE;
                    } else if (pt.y > bounds.y + 2 * bounds.height / 3) {
                        event.feedback = DND.FEEDBACK_INSERT_AFTER;
                    } else if (!it.isGroup()) {
                        event.feedback = DND.FEEDBACK_NONE;
                    } else {
                        event.feedback = DND.FEEDBACK_SELECT;
                    }
                }
            }

            /*
             * (non-Javadoc)
             * 
             * @see
             * org.eclipse.swt.dnd.DropTargetAdapter#drop(org.eclipse.swt.dnd
             * .DropTargetEvent)
             */
            @Override
            public void drop(DropTargetEvent event) {

                // Dragging something
                if (selectedObject != null) {

                    TreeItem parent = null;

                    // Something is selected
                    if (event.item != null) {

                        // Get parent node under cursor
                        parent = (TreeItem) ((org.eclipse.swt.widgets.TreeItem) event.item).getData();

                        // if parent is group, add item to end of list
                        if (parent.isGroup()) {

                            boolean addingOk = true;

                            // Moving from the same group
                            if (selectedObject.getParent().equals(parent)) {
                                parent.removeChild(selectedObject);
                                // Moving to another group
                            } else {
                                // Don't allow moving to itself
                                if (!parent.equals(selectedObject)) {

                                    ((TreeItem) selectedObject.getParent()).removeChild(selectedObject);
                                } else {
                                    addingOk = false;
                                }
                            }

                            // Add to new parent
                            if (addingOk) {
                                parent.addChild(selectedObject);
                                selectedObject.setParent(parent);
                                // If group has children, expand it
                                if (selectedObject.isGroup() && selectedObject.getChildren()[0] != null) {
                                    viewer.expandToLevel(selectedObject.getChildren()[0], 0);
                                }
                            }

                            // Parent is not group
                        } else {

                            // Get parent group of the selected item
                            TreeItem realParent = (TreeItem) parent.getParent();

                            // Check that we aren't moving folder to a item
                            // inside the same folder
                            if (!selectedObject.equals(realParent)) {

                                // Remove from old parent
                                ((TreeItem) selectedObject.getParent()).removeChild(selectedObject);

                                // Get position of parent
                                int pos = 0;

                                // Go through children to find this one
                                Object[] children = ((TreeItem) parent.getParent()).getChildren();
                                for (int i = 0; i < children.length; i++) {
                                    if (children[i].equals(parent)) {
                                        pos = i;
                                        break;
                                    }
                                }

                                // Insert after the item under cursor, add
                                // position by one
                                if (!dndAddBefore) {
                                    pos++;
                                }

                                // Add to new parent
                                realParent.addChild(pos, selectedObject);
                                selectedObject.setParent(realParent);

                                // If group has children, expand it
                                if (selectedObject.isGroup() && selectedObject.getChildren()[0] != null) {
                                    viewer.expandToLevel(selectedObject.getChildren()[0], 0);
                                }

                            }
                        }
                    } else {
                        parent = (TreeItem) getParentGroup();

                        // Remove from old parent
                        ((TreeItem) selectedObject.getParent()).removeChild(selectedObject);

                        // Add to new parent
                        parent.addChild(selectedObject);
                        selectedObject.setParent(parent);

                        // If group has children, expand it
                        if (selectedObject.isGroup() && selectedObject.getChildren()[0] != null) {
                            viewer.expandToLevel(selectedObject.getChildren()[0], 0);
                        }

                    }
                }
                // Set button states
                setButtonStates();
            }
        });
    }

    /**
     * Create toolbar with default image locations
     */
    protected void createToolBar() {
        createToolBar(itemAddImageLocation, itemEditImageLocation, itemRemoveImageLocation);
    }

    /**
     * Create toolbar with given image locations
     * 
     * @param itemAddImageLocation
     *            add image location
     * @param itemEditImageLocation
     *            edit image location
     * @param itemRemoveImageLocation
     *            remove image location
     */
    protected void createToolBar(String itemAddImageLocation, String itemEditImageLocation,
            String itemRemoveImageLocation) {
        URL url = null;
        GridData toolBarGridData = new GridData();
        toolBarGridData.horizontalSpan = 3;
        toolBar = new ToolBar(composite, SWT.NONE);
        toolBar.setLayoutData(toolBarGridData);

        addGroupItem = new ToolItem(toolBar, SWT.PUSH);
        addGroupItem.setText(Messages.getString("BaseTreeDialog.GroupItemText")); //$NON-NLS-1$
        addGroupItem.setToolTipText(Messages.getString("BaseTreeDialog.AddGroupToolTip")); //$NON-NLS-1$
        url = TraceViewerPlugin.getDefault().getBundle().getEntry(groupAddImageLocation);
        groupAddImage = ImageDescriptor.createFromURL(url).createImage();
        addGroupItem.setImage(groupAddImage);

        addItem = new ToolItem(toolBar, SWT.PUSH);
        addItem.setText(Messages.getString("BaseTreeDialog.AddItemText")); //$NON-NLS-1$
        addItem.setToolTipText(Messages.getString("BaseTreeDialog.AddItemToolTip")); //$NON-NLS-1$
        url = TraceViewerPlugin.getDefault().getBundle().getEntry(itemAddImageLocation);
        itemAddImage = ImageDescriptor.createFromURL(url).createImage();
        addItem.setImage(itemAddImage);

        editItem = new ToolItem(toolBar, SWT.PUSH);
        editItem.setText(Messages.getString("BaseTreeDialog.EditItemText")); //$NON-NLS-1$
        editItem.setToolTipText(Messages.getString("BaseTreeDialog.EditItemToolTip")); //$NON-NLS-1$
        url = TraceViewerPlugin.getDefault().getBundle().getEntry(itemEditImageLocation);
        itemEditImage = ImageDescriptor.createFromURL(url).createImage();
        editItem.setImage(itemEditImage);
        editItem.setEnabled(false);

        removeItem = new ToolItem(toolBar, SWT.PUSH);
        removeItem.setText(Messages.getString("BaseTreeDialog.RemoveItemText")); //$NON-NLS-1$
        removeItem.setToolTipText(Messages.getString("BaseTreeDialog.RemoveItemToolTip")); //$NON-NLS-1$
        url = TraceViewerPlugin.getDefault().getBundle().getEntry(itemRemoveImageLocation);
        itemRemoveImage = ImageDescriptor.createFromURL(url).createImage();
        removeItem.setImage(itemRemoveImage);
        removeItem.setEnabled(false);

        clearItem = new ToolItem(toolBar, SWT.PUSH);
        clearItem.setText(Messages.getString("BaseTreeDialog.ClearItemText")); //$NON-NLS-1$
        clearItem.setToolTipText(Messages.getString("BaseTreeDialog.ClearItemToolTip")); //$NON-NLS-1$
        url = TraceViewerPlugin.getDefault().getBundle().getEntry(clearImageLocation);
        clearImage = ImageDescriptor.createFromURL(url).createImage();
        clearItem.setImage(clearImage);
        clearItem.setEnabled(false);
    }

    /**
     * Sets button states depending on selected item
     */
    protected void setButtonStates() {
        // Get selection
        Object selection = ((IStructuredSelection) viewer.getSelection()).getFirstElement();

        // If selection is null
        if (selection == null) {
            addItem.setEnabled(false);
            addRule.setEnabled(false);
            editItem.setEnabled(false);
            editRule.setEnabled(false);
            removeItem.setEnabled(false);
            removeRule.setEnabled(false);
            addGroupItem.setEnabled(false);
            addGroup.setEnabled(false);
            renameRule.setEnabled(false);
            // Root node is selected
        } else if (selection.equals(root)) {
            addItem.setEnabled(true);
            addRule.setEnabled(true);
            editItem.setEnabled(false);
            editRule.setEnabled(false);
            removeItem.setEnabled(false);
            removeRule.setEnabled(false);
            addGroupItem.setEnabled(true);
            addGroup.setEnabled(true);
            renameRule.setEnabled(false);
            // Something else than group is selected
        } else if (!((TreeItem) selection).isGroup()) {
            addItem.setEnabled(true);
            addRule.setEnabled(true);
            editItem.setEnabled(true);
            editRule.setEnabled(true);
            removeItem.setEnabled(true);
            removeRule.setEnabled(true);
            addGroupItem.setEnabled(true);
            addGroup.setEnabled(true);
            renameRule.setEnabled(true);
            // Group is selected
        } else if (((TreeItem) selection).isGroup()) {
            addItem.setEnabled(true);
            addRule.setEnabled(true);
            editItem.setEnabled(false);
            editRule.setEnabled(false);
            removeItem.setEnabled(true);
            removeRule.setEnabled(true);
            addGroupItem.setEnabled(true);
            addGroup.setEnabled(true);
            renameRule.setEnabled(true);
        }

        // If root has children, enable clear button
        if (root.getChildren().length > 0) {
            clearItem.setEnabled(true);
        } else {
            clearItem.setEnabled(false);
        }
    }

    /**
     * Gets progressBarDialog
     * 
     * @return progressBarDialog
     */
    public ProgressBarDialog getProgressBar() {
        return progressBarDialog;
    }

    /**
     * Sets something changed in this dialog
     * 
     * @param somethingChanged
     *            the somethingChanged to set
     */
    public void setSomethingChanged(boolean somethingChanged) {
        this.somethingChanged = somethingChanged;
    }

    /**
     * Returns parent group
     * 
     * @return parent group of the selected item
     */
    private Object getParentGroup() {
        // Get selected object
        Object selection = ((IStructuredSelection) viewer.getSelection()).getFirstElement();

        // Get parent of the selected object
        if (selection != null) {
            selection = ((TreeItem) selection).getParent();
        }
        return selection;
    }

    /**
     * Returns selected group
     * 
     * @return selected group
     */
    protected Object getSelectedGroup() {
        // Get selected object
        Object selection = ((IStructuredSelection) viewer.getSelection()).getFirstElement();

        // If selected item is not group, take parent of selected item
        if (selection != null && !((TreeItem) selection).isGroup()) {
            selection = ((TreeItem) selection).getParent();
        }
        return selection;
    }

    /**
     * Creates context menu
     */
    private void createContextMenu() {
        // Main menu
        Menu menu = new Menu(composite);

        // Add group item
        addGroup = new MenuItem(menu, SWT.PUSH);
        addGroup.setImage(groupAddImage);
        addGroup.setText(Messages.getString("BaseTreeDialog.GroupMenuItemText")); //$NON-NLS-1$

        // Add rule item
        addRule = new MenuItem(menu, SWT.PUSH);
        addRule.setImage(itemAddImage);
        addRule.setText(Messages.getString("BaseTreeDialog.AddRuleText")); //$NON-NLS-1$

        // Edit rule item
        editRule = new MenuItem(menu, SWT.PUSH);
        editRule.setImage(itemEditImage);
        editRule.setText(Messages.getString("BaseTreeDialog.EditRuleText")); //$NON-NLS-1$

        // Remove rule item
        removeRule = new MenuItem(menu, SWT.PUSH);
        removeRule.setImage(itemRemoveImage);
        removeRule.setText(Messages.getString("BaseTreeDialog.RemoveRuleText")); //$NON-NLS-1$

        // Rename rule item
        renameRule = new MenuItem(menu, SWT.PUSH);
        renameRule.setText(Messages.getString("BaseTreeDialog.RenameRuleText")); //$NON-NLS-1$

        // Set menu to tree
        viewer.getTree().setMenu(menu);
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.traceviewer.dialog.BaseDialog#createActionListeners()
     */
    @Override
    public void createActionListeners() {

        // Add selection listener to add group button
        addGroupItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                TraceViewerGlobals.postUiEvent("AddGroupButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$
                processAddGroupAction();
                TraceViewerGlobals.postUiEvent("AddGroupButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });

        // Add selection listener to add group menu item
        addGroup.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                TraceViewerGlobals.postUiEvent("AddGroupMenuItem", "1"); //$NON-NLS-1$ //$NON-NLS-2$
                processAddGroupAction();
                TraceViewerGlobals.postUiEvent("AddGroupMenuItem", "0"); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });

        // Add selection listener to Add button
        addItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                TraceViewerGlobals.postUiEvent("AddRuleButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$
                processAddItemAction();
                TraceViewerGlobals.postUiEvent("AddRuleButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });

        // Add selection listener to Add menu item
        addRule.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                TraceViewerGlobals.postUiEvent("AddRuleMenuItem", "1"); //$NON-NLS-1$ //$NON-NLS-2$
                processAddItemAction();
                TraceViewerGlobals.postUiEvent("AddRuleMenuItem", "0"); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });

        // Add selection listener to Edit button
        editItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                TraceViewerGlobals.postUiEvent("EditRuleButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$
                processEditItemAction();
                TraceViewerGlobals.postUiEvent("EditRuleButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });

        // Add selection listener to Edit menu item
        editRule.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                TraceViewerGlobals.postUiEvent("EditRuleMenuItem", "1"); //$NON-NLS-1$ //$NON-NLS-2$
                processEditItemAction();
                TraceViewerGlobals.postUiEvent("EditRuleMenuItem", "0"); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });

        // Add selection listener to Remove button
        removeItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                TraceViewerGlobals.postUiEvent("RemoveRuleButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$
                processRemoveItemAction();
                TraceViewerGlobals.postUiEvent("RemoveRuleButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });

        // Add selection listener to Remove menu item
        removeRule.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                TraceViewerGlobals.postUiEvent("RemoveRuleMenuItem", "1"); //$NON-NLS-1$ //$NON-NLS-2$
                processRemoveItemAction();
                TraceViewerGlobals.postUiEvent("RemoveRuleMenuItem", "0"); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });

        // Add selection listener to Clear button
        clearItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                TraceViewerGlobals.postUiEvent("ClearRulesButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$
                MessageBox messageBox = new MessageBox(getShell(), SWT.ICON_QUESTION | SWT.YES | SWT.NO);
                messageBox.setMessage(Messages.getString("BaseTreeDialog.ClearAllConfirmation")); //$NON-NLS-1$
                messageBox.setText(Messages.getString("BaseTreeDialog.ClearAllDialogTitle")); //$NON-NLS-1$
                int response = messageBox.open();
                if (response == SWT.YES) {
                    // Clear all
                    Object[] children = root.getChildren();

                    for (int i = 0; i < children.length; i++) {
                        root.removeChild((TreeItem) children[i]);
                    }
                    viewer.setGrayChecked(root, false);
                    setButtonStates();
                    somethingChanged = true;
                }
                TraceViewerGlobals.postUiEvent("ClearRulesButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });

        // Add selection listener to Tree
        viewer.getTree().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                TraceViewerGlobals.postUiEvent("TreeSelection", "1"); //$NON-NLS-1$ //$NON-NLS-2$
                setButtonStates();
                TraceViewerGlobals.postUiEvent("TreeSelection", "0"); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });

        // Add selection listener to Rename menu item
        renameRule.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                TraceViewerGlobals.postUiEvent("RenameMenuItem", "1"); //$NON-NLS-1$ //$NON-NLS-2$
                Object selection = ((IStructuredSelection) viewer.getSelection()).getFirstElement();

                // If something is selected, show rename dialog
                if (selection != null) {
                    TreeItem selected = (TreeItem) selection;
                    String dialogTitle = Messages.getString("BaseTreeDialog.RenameDialogTitle"); //$NON-NLS-1$
                    String dialogText = Messages.getString("BaseTreeDialog.RenameDialogText"); //$NON-NLS-1$
                    InputDialog dialog = new InputDialog(getShell(), dialogTitle, dialogText, selected.getName(),
                            null);
                    int ret = dialog.open();
                    if (ret == Window.OK) {
                        selected.setName(dialog.getValue());
                    }
                    viewer.refresh();
                }
                TraceViewerGlobals.postUiEvent("RenameMenuItem", "0"); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });

    }

    /**
     * Removes selected item from the tree
     */
    protected void processRemoveItemAction() {
        Object selection = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
        if (selection != null && !selection.equals(treeRoot) && !selection.equals(root)) {

            // Remove selection
            Object parent = ((TreeItem) selection).getParent();
            ((TreeItem) parent).removeChild((TreeItem) selection);
            checkboxStateListener.checkStateChanged((TreeItem) parent);

            // Select parent from the deleted item
            viewer.setSelection(new StructuredSelection(parent), true);
            viewer.reveal(parent);
        }

        setButtonStates();
        somethingChanged = true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
     */
    @Override
    protected void okPressed() {
        processApplyButtonAction();
        super.okPressed();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
     */
    @Override
    protected void cancelPressed() {
        somethingChanged = false;
        super.cancelPressed();
    }

    /**
     * Process Add action
     * 
     * @return new tree item or null if nothing was created
     */
    protected TreeItem processAddItemAction() {
        Object selection = getSelectedGroup();
        BasePropertyDialog dialog = getPropertyDialog(selection, false);

        // Open dialog
        TreeItem item = dialog.openAndGetItem();
        if (item != null) {
            viewer.expandToLevel(item, 0);
            viewer.setChecked(item, true);
            checkboxStateListener.checkStateChanged(item);

            setButtonStates();
            somethingChanged = true;
        }

        return item;
    }

    /**
     * Process Edit action
     * 
     * @return modified tree item or null if item was not edited
     */
    protected TreeItem processEditItemAction() {
        TreeItem item = null;

        // Get selected object
        Object selection = ((IStructuredSelection) viewer.getSelection()).getFirstElement();

        if (selection != null) {
            boolean wasChecked = viewer.getChecked(selection);
            BasePropertyDialog dialog = getPropertyDialog(selection, true);
            item = dialog.openAndGetItem();

            if (item != null) {

                // If selection was checked, check it again
                if (wasChecked) {
                    viewer.setChecked(item, true);
                    checkboxStateListener.checkStateChanged(item);
                }

                viewer.setSelection(new StructuredSelection(item), true);
                viewer.reveal(item);
                setButtonStates();
                somethingChanged = true;
            }
        }

        return item;
    }

    /**
     * Process Add group action
     */
    protected abstract void processAddGroupAction();

    /**
     * Get property dialog for this dialog
     * 
     * @param selection
     *            selected object from the tree
     * @param editOldItem
     *            if true, edit old item
     * @return property dialog
     */
    protected abstract BasePropertyDialog getPropertyDialog(Object selection, boolean editOldItem);

    /**
     * Process Apply button action
     */
    protected abstract void processApplyButtonAction();

}