com.nokia.carbide.cpp.debug.crashdebugger.ui.CrashDebuggerView.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.cpp.debug.crashdebugger.ui.CrashDebuggerView.java

Source

/*
* 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 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.debug.crashdebugger.ui;

import java.math.BigInteger;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextListener;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.text.TextEvent;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.console.IOConsoleViewer;
import org.eclipse.ui.part.ViewPart;

import com.nokia.carbide.cpp.debug.crashdebugger.CrashDebugger;
import com.nokia.carbide.cpp.debug.crashdebugger.CrashDebuggerConsole;
import com.nokia.carbide.cpp.debug.crashdebugger.HelpIds;
import com.nokia.carbide.cpp.debug.crashdebugger.ISessionChangedListener;
import com.nokia.carbide.cpp.debug.crashdebugger.Images;
import com.nokia.carbide.cpp.internal.featureTracker.FeatureUseTrackerConsts;
import com.nokia.carbide.cpp.internal.featureTracker.FeatureUseTrackerPlugin;

public class CrashDebuggerView extends ViewPart {
    // crash debugger commands
    private static final String FAULT_CMD = "f"; //$NON-NLS-1$

    private static final String HELP_CMD = "h"; //$NON-NLS-1$

    private static final String MEMORY_CMD = "m "; //$NON-NLS-1$

    private static final String MEMORY2_CMD = "z "; //$NON-NLS-1$

    private static final String OBJECT_BRIEF_CMD = "o "; //$NON-NLS-1$

    private static final String OBJECT_FULL_CMD = "q "; //$NON-NLS-1$

    private static final String INFO_CMD = "i"; //$NON-NLS-1$

    private static final String THREADS_CMD = "c 0"; //$NON-NLS-1$

    private static final String PROCESSES_CMD = "c 1"; //$NON-NLS-1$

    private static final String CHUNKS_CMD = "c 2"; //$NON-NLS-1$

    private static final String LIBRARIES_CMD = "c 3"; //$NON-NLS-1$

    private static final String SEMAPHORES_CMD = "c 4"; //$NON-NLS-1$

    private static final String MUTEXES_CMD = "c 5"; //$NON-NLS-1$

    private static final String TIMERS_CMD = "c 6"; //$NON-NLS-1$

    private static final String SERVERS_CMD = "c 7"; //$NON-NLS-1$

    private static final String SESSIONS_CMD = "c 8"; //$NON-NLS-1$

    private static final String LOGICAL_DEVICES_CMD = "c 9"; //$NON-NLS-1$

    private static final String PHYSICAL_DEVICES_CMD = "c A"; //$NON-NLS-1$

    private static final String CHANNELS_CMD = "c B"; //$NON-NLS-1$

    private static final String CHANGE_NOTIFIERS_CMD = "c C"; //$NON-NLS-1$

    private static final String UNDERTAKERS_CMD = "c D"; //$NON-NLS-1$

    private static final String MSG_QUEUES_CMD = "c E"; //$NON-NLS-1$

    private static final String PROPERTY_REFS_CMD = "c F"; //$NON-NLS-1$

    private static final String REGISTERS_CMD = "r"; //$NON-NLS-1$

    private IOConsoleViewer viewer;

    private Action terminateSession;

    private Action clearConsole;

    private Action cutAction;

    private Action copyAction;

    private Action pasteAction;

    private Action selectAllAction;

    // debug command actions
    private Action help_cmd;

    private Action fault_cmd;

    private Action memory_cmd;

    private Action memory2_cmd;

    private Action object_brief_cmd;

    private Action object_full_cmd;

    private Action info_cmd;

    private Action threads_cmd;

    private Action processes_cmd;

    private Action chunks_cmd;

    private Action libraries_cmd;

    private Action semaphores_cmd;

    private Action mutexes_cmd;

    private Action timers_cmd;

    private Action servers_cmd;

    private Action sessions_cmd;

    private Action logical_devices_cmd;

    private Action physical_devices_cmd;

    private Action channels_cmd;

    private Action change_notifiers_cmd;

    private Action undertakers_cmd;

    private Action msg_queues_cmd;

    private Action property_refs_cmd;

    private Action registers_cmd;

    // text selection listener, used to update selection dependant actions on
    // selection changes
    private ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() {
        public void selectionChanged(SelectionChangedEvent event) {
            updateSelectionDependentActions();
        }
    };

    // session state listener, used to know when the session begins and ends
    private ISessionChangedListener sessionChangedListener = new ISessionChangedListener() {
        public void sessionStarted() {
            sessionChanged(true);
        }

        public void sessionOutputReceived(String output) {
            StyledText text = viewer.getTextWidget();
            text.append(output);
            text.setCaretOffset(text.getCharCount());
        }

        public void sessionEnded() {
            sessionChanged(false);
        }
    };

    public CrashDebuggerView() {
    }

    public void createPartControl(Composite parent) {
        CrashDebugger.addSessionChangedListener(sessionChangedListener);

        CrashDebuggerConsole console = CrashDebugger.getConsole();

        viewer = new IOConsoleViewer(parent, console);
        viewer.setInput(getViewSite());
        viewer.setDocument(console.getDocument());

        viewer.addTextListener(new ITextListener() {
            public void textChanged(TextEvent event) {
                if (event.getText().compareTo("\r\n") == 0) { //$NON-NLS-1$
                    enterKeyPressed();
                }
            }
        });

        makeActions();
        hookContextMenu();
        contributeToActionBars();
        viewer.getSelectionProvider().addSelectionChangedListener(selectionChangedListener);
        updateSelectionDependentActions();

        // see if the session is already started and update the actions
        // accordingly
        sessionChanged(null != CrashDebugger.getSession());

        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, HelpIds.CRASH_DEBUGGER_VIEW);
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                CrashDebuggerView.this.fillMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, viewer);
    }

    private void contributeToActionBars() {
        IActionBars bars = getViewSite().getActionBars();
        fillLocalToolBar(bars.getToolBarManager());
    }

    private void fillMenu(IMenuManager manager) {
        manager.add(fault_cmd);
        manager.add(info_cmd);
        manager.add(registers_cmd);
        manager.add(memory_cmd);
        manager.add(memory2_cmd);
        manager.add(object_brief_cmd);
        manager.add(object_full_cmd);
        manager.add(new GroupMarker("group")); //$NON-NLS-1$
        MenuManager showInSubMenu = new MenuManager(Messages.getString("CrashDebuggerView.27")); //$NON-NLS-1$
        showInSubMenu.add(threads_cmd);
        showInSubMenu.add(processes_cmd);
        showInSubMenu.add(chunks_cmd);
        showInSubMenu.add(libraries_cmd);
        showInSubMenu.add(semaphores_cmd);
        showInSubMenu.add(mutexes_cmd);
        showInSubMenu.add(timers_cmd);
        showInSubMenu.add(servers_cmd);
        showInSubMenu.add(sessions_cmd);
        showInSubMenu.add(logical_devices_cmd);
        showInSubMenu.add(physical_devices_cmd);
        showInSubMenu.add(channels_cmd);
        showInSubMenu.add(change_notifiers_cmd);
        showInSubMenu.add(undertakers_cmd);
        showInSubMenu.add(msg_queues_cmd);
        showInSubMenu.add(property_refs_cmd);
        manager.appendToGroup("group", showInSubMenu); //$NON-NLS-1$
        manager.add(help_cmd);

        manager.add(new Separator());
        manager.add(terminateSession);
        manager.add(clearConsole);

        manager.add(new Separator(IWorkbenchActionConstants.M_EDIT));
        manager.add(cutAction);
        manager.add(copyAction);
        manager.add(pasteAction);
        manager.add(selectAllAction);

        // Other plug-ins can contribute there actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(terminateSession);
        manager.add(clearConsole);
    }

    private void makeActions() {
        terminateSession = new Action() {
            public void run() {
                CrashDebugger.terminateSession();
                terminateSession.setEnabled(false);
            }
        };
        terminateSession.setText(Messages.getString("CrashDebuggerView.29")); //$NON-NLS-1$
        terminateSession.setImageDescriptor(Images.DESC_TERMINATE_ENABLED);
        terminateSession.setDisabledImageDescriptor(Images.DESC_TERMINATE_DISABLED);
        terminateSession.setToolTipText(Messages.getString("CrashDebuggerView.30")); //$NON-NLS-1$

        clearConsole = new Action() {
            public void run() {
                // there is a bug in IOConsole.clearConsole where after you clear it, it will
                // no longer accept any input.  the code below is a workaround for this.
                // CrashDebugger.getConsole().clearConsole();

                // clear the document, and then add the "." prompt
                viewer.getDocument().set(""); //$NON-NLS-1$
                StyledText text = viewer.getTextWidget();
                text.append("."); //$NON-NLS-1$
                text.setCaretOffset(text.getCharCount());
            }
        };
        clearConsole.setText(Messages.getString("CrashDebuggerView.31")); //$NON-NLS-1$
        clearConsole.setImageDescriptor(Images.DESC_CLEAR_ENABLED);
        clearConsole.setDisabledImageDescriptor(Images.DESC_CLEAR_DISABLED);
        clearConsole.setToolTipText(Messages.getString("CrashDebuggerView.32")); //$NON-NLS-1$

        cutAction = new Action() {
            public void run() {
                viewer.doOperation(ITextOperationTarget.CUT);
            }
        };
        cutAction.setText(Messages.getString("CrashDebuggerView.33")); //$NON-NLS-1$
        cutAction.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
        cutAction.setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
                .getImageDescriptor(ISharedImages.IMG_TOOL_CUT_DISABLED));

        copyAction = new Action() {
            public void run() {
                viewer.doOperation(ITextOperationTarget.COPY);
            }
        };
        copyAction.setText(Messages.getString("CrashDebuggerView.34")); //$NON-NLS-1$
        copyAction.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
        copyAction.setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
                .getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED));

        pasteAction = new Action() {
            public void run() {
                viewer.doOperation(ITextOperationTarget.PASTE);
            }
        };
        pasteAction.setText(Messages.getString("CrashDebuggerView.35")); //$NON-NLS-1$
        pasteAction.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
        pasteAction.setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
                .getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));

        selectAllAction = new Action() {
            public void run() {
                viewer.doOperation(ITextOperationTarget.SELECT_ALL);
            }
        };
        selectAllAction.setText(Messages.getString("CrashDebuggerView.36")); //$NON-NLS-1$

        fault_cmd = new Action() {
            public void run() {
                sendUICommand(FAULT_CMD);
            }
        };
        fault_cmd.setText(Messages.getString("CrashDebuggerView.37")); //$NON-NLS-1$
        fault_cmd.setToolTipText(Messages.getString("CrashDebuggerView.38")); //$NON-NLS-1$

        help_cmd = new Action() {
            public void run() {
                sendUICommand(HELP_CMD);
            }
        };
        help_cmd.setText(Messages.getString("CrashDebuggerView.39")); //$NON-NLS-1$
        help_cmd.setToolTipText(Messages.getString("CrashDebuggerView.40")); //$NON-NLS-1$

        memory_cmd = new Action() {
            public void run() {
                String address = ""; //$NON-NLS-1$
                String length = ""; //$NON-NLS-1$
                ISelection selection = viewer.getSelection();
                if (selection instanceof TextSelection) {
                    String text = ((TextSelection) selection).getText();
                    if (text.length() > 0) {
                        try {
                            if (text.toLowerCase().startsWith("0x")) { //$NON-NLS-1$
                                text = text.substring(2, text.length());
                            }
                            BigInteger integer = new BigInteger(text, 16);
                            address = integer.toString(16);

                            // display 256 bytes by default
                            length = "100"; //$NON-NLS-1$
                        } catch (NumberFormatException e) {
                        }
                    }
                    if (address.length() == 0) {
                        // show the dialog to get the address and length
                        DumpMemoryDialog dlg = new DumpMemoryDialog(getViewSite().getShell());
                        if (dlg.open() == Window.OK) {
                            address = dlg.getAddress();
                            length = dlg.getLength();
                        }
                    }
                }
                if (address.trim().length() > 0 && length.trim().length() > 0) {
                    sendUICommand(MEMORY_CMD + address + "+" + length); //$NON-NLS-1$
                }
            }
        };
        memory_cmd.setText(Messages.getString("CrashDebuggerView.46")); //$NON-NLS-1$
        memory_cmd.setToolTipText(Messages.getString("CrashDebuggerView.47")); //$NON-NLS-1$

        memory2_cmd = new Action() {
            public void run() {
                String address = ""; //$NON-NLS-1$
                String length = ""; //$NON-NLS-1$
                ISelection selection = viewer.getSelection();
                if (selection instanceof TextSelection) {
                    String text = ((TextSelection) selection).getText();
                    if (text.length() > 0) {
                        try {
                            if (text.toLowerCase().startsWith("0x")) { //$NON-NLS-1$
                                text = text.substring(2, text.length());
                            }
                            BigInteger integer = new BigInteger(text, 16);
                            address = integer.toString(16);

                            // display 256 bytes by default
                            length = "100"; //$NON-NLS-1$
                        } catch (NumberFormatException e) {
                        }
                    }
                    if (address.length() == 0) {
                        // show the dialog to get the address and length
                        DumpMemoryDialog dlg = new DumpMemoryDialog(getViewSite().getShell());
                        if (dlg.open() == Window.OK) {
                            address = dlg.getAddress();
                            length = dlg.getLength();
                        }
                    }
                }
                if (address.trim().length() > 0 && length.trim().length() > 0) {
                    sendUICommand(MEMORY2_CMD + address + "+" + length); //$NON-NLS-1$
                }
            }
        };
        memory2_cmd.setText(Messages.getString("CrashDebuggerView.53")); //$NON-NLS-1$
        memory2_cmd.setToolTipText(Messages.getString("CrashDebuggerView.54")); //$NON-NLS-1$

        object_brief_cmd = new Action() {
            public void run() {
                String address = ""; //$NON-NLS-1$
                ISelection selection = viewer.getSelection();
                if (selection instanceof TextSelection) {
                    String text = ((TextSelection) selection).getText();
                    if (text.length() > 0) {
                        try {
                            if (text.toLowerCase().startsWith("0x")) { //$NON-NLS-1$
                                text = text.substring(2, text.length());
                            }
                            BigInteger integer = new BigInteger(text, 16);
                            address = integer.toString(16);
                        } catch (NumberFormatException e) {
                        }
                    }
                    if (address.length() == 0) {
                        // show the dialog to get the address
                        AddressDialog dlg = new AddressDialog(getViewSite().getShell());
                        if (dlg.open() == Window.OK) {
                            address = dlg.getAddress();
                        }
                    }
                }
                if (address.trim().length() > 0) {
                    sendUICommand(OBJECT_BRIEF_CMD + address);
                }
            }
        };
        object_brief_cmd.setText(Messages.getString("CrashDebuggerView.57")); //$NON-NLS-1$
        object_brief_cmd.setToolTipText(Messages.getString("CrashDebuggerView.58")); //$NON-NLS-1$

        object_full_cmd = new Action() {
            public void run() {
                String address = ""; //$NON-NLS-1$
                ISelection selection = viewer.getSelection();
                if (selection instanceof TextSelection) {
                    String text = ((TextSelection) selection).getText();
                    if (text.length() > 0) {
                        try {
                            if (text.toLowerCase().startsWith("0x")) { //$NON-NLS-1$
                                text = text.substring(2, text.length());
                            }
                            BigInteger integer = new BigInteger(text, 16);
                            address = integer.toString(16);
                        } catch (NumberFormatException e) {
                        }
                    }
                    if (address.length() == 0) {
                        // show the dialog to get the address
                        AddressDialog dlg = new AddressDialog(getViewSite().getShell());
                        if (dlg.open() == Window.OK) {
                            address = dlg.getAddress();
                        }
                    }
                }
                if (address.trim().length() > 0) {
                    sendUICommand(OBJECT_FULL_CMD + address);

                }
            }
        };
        object_full_cmd.setText(Messages.getString("CrashDebuggerView.61")); //$NON-NLS-1$
        object_full_cmd.setToolTipText(Messages.getString("CrashDebuggerView.62")); //$NON-NLS-1$

        info_cmd = new Action() {
            public void run() {
                sendUICommand(INFO_CMD);
            }
        };
        info_cmd.setText(Messages.getString("CrashDebuggerView.63")); //$NON-NLS-1$
        info_cmd.setToolTipText(Messages.getString("CrashDebuggerView.64")); //$NON-NLS-1$

        threads_cmd = new Action() {
            public void run() {
                sendUICommand(THREADS_CMD);
            }
        };
        threads_cmd.setText(Messages.getString("CrashDebuggerView.65")); //$NON-NLS-1$
        threads_cmd.setToolTipText(Messages.getString("CrashDebuggerView.66")); //$NON-NLS-1$

        processes_cmd = new Action() {
            public void run() {
                sendUICommand(PROCESSES_CMD);
            }
        };
        processes_cmd.setText(Messages.getString("CrashDebuggerView.67")); //$NON-NLS-1$
        processes_cmd.setToolTipText(Messages.getString("CrashDebuggerView.68")); //$NON-NLS-1$

        chunks_cmd = new Action() {
            public void run() {
                sendUICommand(CHUNKS_CMD);
            }
        };
        chunks_cmd.setText(Messages.getString("CrashDebuggerView.69")); //$NON-NLS-1$
        chunks_cmd.setToolTipText(Messages.getString("CrashDebuggerView.70")); //$NON-NLS-1$

        libraries_cmd = new Action() {
            public void run() {
                sendUICommand(LIBRARIES_CMD);
            }
        };
        libraries_cmd.setText(Messages.getString("CrashDebuggerView.71")); //$NON-NLS-1$
        libraries_cmd.setToolTipText(Messages.getString("CrashDebuggerView.72")); //$NON-NLS-1$

        semaphores_cmd = new Action() {
            public void run() {
                sendUICommand(SEMAPHORES_CMD);
            }
        };
        semaphores_cmd.setText(Messages.getString("CrashDebuggerView.73")); //$NON-NLS-1$
        semaphores_cmd.setToolTipText(Messages.getString("CrashDebuggerView.74")); //$NON-NLS-1$

        mutexes_cmd = new Action() {
            public void run() {
                sendUICommand(MUTEXES_CMD);
            }
        };
        mutexes_cmd.setText(Messages.getString("CrashDebuggerView.75")); //$NON-NLS-1$
        mutexes_cmd.setToolTipText(Messages.getString("CrashDebuggerView.76")); //$NON-NLS-1$

        timers_cmd = new Action() {
            public void run() {
                sendUICommand(TIMERS_CMD);
            }
        };
        timers_cmd.setText(Messages.getString("CrashDebuggerView.77")); //$NON-NLS-1$
        timers_cmd.setToolTipText(Messages.getString("CrashDebuggerView.78")); //$NON-NLS-1$

        servers_cmd = new Action() {
            public void run() {
                sendUICommand(SERVERS_CMD);
            }
        };
        servers_cmd.setText(Messages.getString("CrashDebuggerView.79")); //$NON-NLS-1$
        servers_cmd.setToolTipText(Messages.getString("CrashDebuggerView.80")); //$NON-NLS-1$

        sessions_cmd = new Action() {
            public void run() {
                sendUICommand(SESSIONS_CMD);
            }
        };
        sessions_cmd.setText(Messages.getString("CrashDebuggerView.81")); //$NON-NLS-1$
        sessions_cmd.setToolTipText(Messages.getString("CrashDebuggerView.82")); //$NON-NLS-1$

        logical_devices_cmd = new Action() {
            public void run() {
                sendUICommand(LOGICAL_DEVICES_CMD);
            }
        };
        logical_devices_cmd.setText(Messages.getString("CrashDebuggerView.83")); //$NON-NLS-1$
        logical_devices_cmd.setToolTipText(Messages.getString("CrashDebuggerView.84")); //$NON-NLS-1$

        physical_devices_cmd = new Action() {
            public void run() {
                sendUICommand(PHYSICAL_DEVICES_CMD);
            }
        };
        physical_devices_cmd.setText(Messages.getString("CrashDebuggerView.85")); //$NON-NLS-1$
        physical_devices_cmd.setToolTipText(Messages.getString("CrashDebuggerView.86")); //$NON-NLS-1$

        channels_cmd = new Action() {
            public void run() {
                sendUICommand(CHANNELS_CMD);
            }
        };
        channels_cmd.setText(Messages.getString("CrashDebuggerView.87")); //$NON-NLS-1$
        channels_cmd.setToolTipText(Messages.getString("CrashDebuggerView.88")); //$NON-NLS-1$

        change_notifiers_cmd = new Action() {
            public void run() {
                sendUICommand(CHANGE_NOTIFIERS_CMD);
            }
        };
        change_notifiers_cmd.setText(Messages.getString("CrashDebuggerView.89")); //$NON-NLS-1$
        change_notifiers_cmd.setToolTipText(Messages.getString("CrashDebuggerView.90")); //$NON-NLS-1$

        undertakers_cmd = new Action() {
            public void run() {
                sendUICommand(UNDERTAKERS_CMD);
            }
        };
        undertakers_cmd.setText(Messages.getString("CrashDebuggerView.91")); //$NON-NLS-1$
        undertakers_cmd.setToolTipText(Messages.getString("CrashDebuggerView.92")); //$NON-NLS-1$

        msg_queues_cmd = new Action() {
            public void run() {
                sendUICommand(MSG_QUEUES_CMD);
            }
        };
        msg_queues_cmd.setText(Messages.getString("CrashDebuggerView.93")); //$NON-NLS-1$
        msg_queues_cmd.setToolTipText(Messages.getString("CrashDebuggerView.94")); //$NON-NLS-1$

        property_refs_cmd = new Action() {
            public void run() {
                sendUICommand(PROPERTY_REFS_CMD);
            }
        };
        property_refs_cmd.setText(Messages.getString("CrashDebuggerView.95")); //$NON-NLS-1$
        property_refs_cmd.setToolTipText(Messages.getString("CrashDebuggerView.96")); //$NON-NLS-1$

        registers_cmd = new Action() {
            public void run() {
                sendUICommand(REGISTERS_CMD);
            }
        };
        registers_cmd.setText(Messages.getString("CrashDebuggerView.97")); //$NON-NLS-1$
        registers_cmd.setToolTipText(Messages.getString("CrashDebuggerView.98")); //$NON-NLS-1$
    }

    protected void updateSelectionDependentActions() {
        cutAction.setEnabled(viewer.canDoOperation(ITextOperationTarget.CUT));
        copyAction.setEnabled(viewer.canDoOperation(ITextOperationTarget.COPY));
        pasteAction.setEnabled(viewer.canDoOperation(ITextOperationTarget.PASTE));
    }

    protected void sessionChanged(final boolean started) {
        terminateSession.setEnabled(started);
        fault_cmd.setEnabled(started);
        help_cmd.setEnabled(started);
        memory_cmd.setEnabled(started);
        memory2_cmd.setEnabled(started);
        object_brief_cmd.setEnabled(started);
        object_full_cmd.setEnabled(started);
        info_cmd.setEnabled(started);
        threads_cmd.setEnabled(started);
        processes_cmd.setEnabled(started);
        chunks_cmd.setEnabled(started);
        libraries_cmd.setEnabled(started);
        semaphores_cmd.setEnabled(started);
        mutexes_cmd.setEnabled(started);
        timers_cmd.setEnabled(started);
        servers_cmd.setEnabled(started);
        sessions_cmd.setEnabled(started);
        logical_devices_cmd.setEnabled(started);
        physical_devices_cmd.setEnabled(started);
        channels_cmd.setEnabled(started);
        change_notifiers_cmd.setEnabled(started);
        undertakers_cmd.setEnabled(started);
        msg_queues_cmd.setEnabled(started);
        property_refs_cmd.setEnabled(started);
        registers_cmd.setEnabled(started);

        final StyledText textWidget = viewer.getTextWidget();
        final CrashDebuggerView cdView = this;
        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
            public void run() {
                if (started) {
                    // Make sure the Crash Debugger console is brought to
                    // front on session start.
                    cdView.getViewSite().getPage().activate(cdView);

                    if (textWidget != null) {
                        textWidget.setCaretOffset(textWidget.getCharCount());
                        textWidget.setEditable(true);
                    }
                } else {
                    // Disable editing in the console, fix bug 2901.
                    if (textWidget != null) {
                        textWidget.setCaretOffset(-1);
                        textWidget.setEditable(false);
                    }
                }
            }
        });
    }

    public void setFocus() {
        viewer.getControl().setFocus();
    }

    private void sendUICommand(String cmd) {
        // append newline/carriage return
        String cmd2 = cmd + "\r\n"; //$NON-NLS-1$
        // echo the command to the console and send it to the port
        StyledText text = viewer.getTextWidget();
        text.append(cmd2);

        sendCommand(cmd2);

        // make sure the caret gets updated correctly
        text.setCaretOffset(text.getCharCount());
    }

    private void sendCommand(String cmd) {
        // send the command to the serial port.
        CrashDebugger.sendCommand(cmd);
    }

    private void enterKeyPressed() {
        IDocument doc = viewer.getDocument();
        if (doc != null) {
            int lines = doc.getNumberOfLines();
            try {
                int lo = doc.getLineOffset(lines - 2);
                int ll = doc.getLineLength(lines - 2);
                String line = doc.get(lo, ll);
                sendCommand(line);
            } catch (BadLocationException e) {
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite,
     *      org.eclipse.ui.IMemento)
     */
    @Override
    public void init(IViewSite site, IMemento memento) throws PartInitException {

        super.init(site, memento);
        FeatureUseTrackerPlugin.getFeatureUseProxy()
                .startUsingFeature(FeatureUseTrackerConsts.CARBIDE_CRASH_DEBUGGER);

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
     */
    @Override
    public void dispose() {

        super.dispose();
        FeatureUseTrackerPlugin.getFeatureUseProxy()
                .stopUsingFeature(FeatureUseTrackerConsts.CARBIDE_CRASH_DEBUGGER);

    }
}