com.aptana.terminal.views.TerminalView.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.terminal.views.TerminalView.java

Source

/**
 * Aptana Studio
 * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
 * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
 * Please see the license.html included with this distribution for details.
 * Any modifications to this file must keep this entire header intact.
 */
// $codepro.audit.disable closeInFinally

package com.aptana.terminal.views;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.Action;
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.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.tm.internal.terminal.control.ITerminalListener;
import org.eclipse.tm.internal.terminal.control.actions.TerminalActionClearAll;
import org.eclipse.tm.internal.terminal.control.actions.TerminalActionCopy;
import org.eclipse.tm.internal.terminal.control.actions.TerminalActionCut;
import org.eclipse.tm.internal.terminal.control.actions.TerminalActionPaste;
import org.eclipse.tm.internal.terminal.control.actions.TerminalActionSelectAll;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.ISaveablePart2;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.ViewPart;

import com.aptana.ui.keybinding.KeyBindingHelper;
import com.aptana.terminal.TerminalPlugin;
import com.aptana.terminal.Utils;
import com.aptana.terminal.editor.TerminalEditor;
import com.aptana.terminal.internal.IProcessListener;
import com.aptana.terminal.preferences.IPreferenceConstants;
import com.aptana.terminal.widget.TerminalComposite;

/**
 * @author Max Stepanov
 */
public class TerminalView extends ViewPart implements ISaveablePart2, IProcessListener {

    public static final String ID = "com.aptana.terminal.views.terminal"; //$NON-NLS-1$

    private static final String PROP_TITLE = "title"; //$NON-NLS-1$
    private static final String PROP_WORKING_DIRECTORY = "workingDirectory"; //$NON-NLS-1$

    private TerminalComposite terminalComposite;
    private IMemento savedState = null;

    private Action fOpenEditorAction;
    private Action fOpenViewAction;
    private TerminalActionCopy fActionEditCopy;
    private TerminalActionCut fActionEditCut;
    private TerminalActionPaste fActionEditPaste;
    private TerminalActionClearAll fActionEditClearAll;
    private TerminalActionSelectAll fActionEditSelectAll;

    private boolean checkCanClose = false;

    /**
     * @param id
     *            The secondary id of the view. Used to uniquely identify and address a specific instance of this view.
     * @param title
     *            the title used in the UI tab for the instance of the view.
     * @param workingDirectory
     *            The directory in which to set the view initially.
     * @return
     */
    public static TerminalView openView(String secondaryId, String title, IPath workingDirectory) {
        TerminalView view = null;
        secondaryId = (secondaryId != null) ? secondaryId : Long.toHexString(System.currentTimeMillis()); // $codepro.audit.disable questionableAssignment
        try {
            IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
            view = (TerminalView) page.showView(TerminalView.ID, secondaryId, IWorkbenchPage.VIEW_ACTIVATE);
            view.initialize(title, workingDirectory);
        } catch (PartInitException e) {
            TerminalPlugin.log("Terminal view creation failed.", e); //$NON-NLS-1$
        }
        return view;
    }

    /*
     * (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);
        savedState = memento;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createPartControl(Composite parent) {
        terminalComposite = new TerminalComposite(parent, SWT.NONE);
        terminalComposite.setTerminalListener(new ITerminalListener() {
            public void setTerminalTitle(final String title) {
                Utils.runInDisplayThread(new Runnable() {
                    public void run() {
                        setPartName(title);
                    }
                });
            }

            public void setState(TerminalState state) {
            }
        });
        terminalComposite.setProcessListener(this);
        if (getViewSite().getSecondaryId() == null || savedState != null) {
            if (savedState != null) {
                loadState(savedState);
            }
            terminalComposite.connect();
        }
        makeActions();
        hookContextMenu();
        contributeToActionBars();

        terminalComposite.getTerminalControl().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseUp(MouseEvent e) {
                updateActions();
            }
        });
        terminalComposite.getTerminalControl().addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.doit) {
                    Event event = new Event();
                    event.character = e.character;
                    event.keyCode = e.keyCode;
                    event.stateMask = e.stateMask;
                    event.doit = e.doit;
                    event.display = e.display;
                    event.widget = e.widget;
                    event.time = e.time;
                    event.data = e.data;
                    KeyBindingHelper.handleEvent(event);
                }
            }
        });

        // Add drag and drop support for file paths
        DropTarget dt = new DropTarget(terminalComposite.getRootControl(), DND.DROP_DEFAULT | DND.DROP_MOVE);
        dt.setTransfer(new Transfer[] { FileTransfer.getInstance() });
        dt.addDropListener(new DropTargetAdapter() {
            public void drop(DropTargetEvent event) {
                FileTransfer ft = FileTransfer.getInstance();
                if (ft.isSupportedType(event.currentDataType)) {
                    String[] fileList = (String[]) event.data;
                    if (fileList != null && fileList.length > 0) {
                        StringBuilder builder = new StringBuilder();
                        for (String file : fileList) {
                            builder.append(file).append(' ');
                        }
                        terminalComposite.sendInput(builder.toString());
                    }
                }
            }
        });
    }

    protected void close() {
        if (terminalComposite != null && !terminalComposite.isDisposed()) {
            terminalComposite.getTerminalControl().getDisplay().asyncExec(new Runnable() {
                public void run() {
                    getSite().getPage().hideView((IViewPart) getSite().getPart());
                }
            });
        }
    }

    /*
     * (non-Javadoc)
     * @see com.aptana.terminal.internal.IProcessListener#processCompleted()
     */
    public void processCompleted() {
        IPreferenceStore prefs = TerminalPlugin.getDefault().getPreferenceStore();
        boolean closeViewOnExit = prefs.getBoolean(IPreferenceConstants.CLOSE_VIEW_ON_EXIT);
        if (closeViewOnExit) {
            close();
        }
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.ISaveablePart2#promptToSaveOnClose()
     */
    public int promptToSaveOnClose() {
        return terminalComposite.canCloseTerminal() ? ISaveablePart2.YES : ISaveablePart2.CANCEL;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
     */
    public void doSave(IProgressMonitor monitor) {
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.ISaveablePart#doSaveAs()
     */
    public void doSaveAs() {
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.ISaveablePart#isDirty()
     */
    public boolean isDirty() {
        try {
            return checkCanClose;
        } finally {
            checkCanClose = false;
        }
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
     */
    public boolean isSaveAsAllowed() {
        return false;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.ISaveablePart#isSaveOnCloseNeeded()
     */
    public boolean isSaveOnCloseNeeded() {
        checkCanClose = true;
        return true;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
     */
    @Override
    public void saveState(IMemento memento) {
        IMemento child = memento.createChild(PROP_TITLE);
        child.putTextData(getPartName());
        child = memento.createChild(PROP_WORKING_DIRECTORY);
        IPath workingDirectory = terminalComposite.getWorkingDirectory();
        if (workingDirectory != null) {
            child.putTextData(workingDirectory.toOSString());
        }
    }

    private void loadState(IMemento memento) {
        IMemento child = memento.getChild(PROP_TITLE);
        if (child != null) {
            setPartName(child.getTextData());
        }
        child = memento.getChild(PROP_WORKING_DIRECTORY);
        if (child != null) {
            String value = child.getTextData();
            if (value != null) {
                terminalComposite.setWorkingDirectory(Path.fromOSString(value));
            }
        }
    }

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

    protected void initialize(String title, IPath workingDirectory) {
        if (terminalComposite.isConnected()) {
            return;
        }
        setPartName(title);
        terminalComposite.setWorkingDirectory(workingDirectory);
        terminalComposite.connect();
    }

    /**
     * @param text
     * @see com.aptana.terminal.widget.TerminalComposite#sendInput(java.lang.String)
     */
    public void sendInput(String text) {
        terminalComposite.sendInput(text);
    }

    public void clear() {
        terminalComposite.clear();
    }

    /**
     * hookContextMenu
     */
    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                fillContextMenu(manager);
            }
        });

        Control control = terminalComposite.getTerminalControl();
        Menu menu = menuMgr.createContextMenu(control);
        control.setMenu(menu);
    }

    private void fillContextMenu(IMenuManager menuMgr) {
        menuMgr.add(fActionEditCopy);
        menuMgr.add(fActionEditPaste);
        menuMgr.add(new Separator());
        menuMgr.add(fActionEditClearAll);
        menuMgr.add(fActionEditSelectAll);
        menuMgr.add(new Separator());
        menuMgr.add(fOpenViewAction);
        menuMgr.add(fOpenEditorAction);

        menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    /**
     * contributeToActionBars
     */
    private void contributeToActionBars() {
        IActionBars actionBars = getViewSite().getActionBars();
        fillLocalPullDown(actionBars.getMenuManager());
        fillLocalToolBar(actionBars.getToolBarManager());

        actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), fActionEditCopy);
        actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), fActionEditPaste);
        actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), fActionEditSelectAll);

    }

    private void fillLocalPullDown(IMenuManager manager) {
        manager.add(fOpenViewAction);
        manager.add(fOpenEditorAction);
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(fOpenViewAction);
        manager.add(fOpenEditorAction);
        manager.add(new Separator());
        manager.add(fActionEditClearAll);
    }

    private void updateActions() {
        boolean aboutToShow = true;
        fActionEditCut.updateAction(aboutToShow);
        fActionEditCopy.updateAction(aboutToShow);
        fActionEditPaste.updateAction(aboutToShow);
        fActionEditSelectAll.updateAction(aboutToShow);
        fActionEditClearAll.updateAction(aboutToShow);
    }

    /**
     * makeActions
     */
    private void makeActions() {
        fActionEditCopy = new TerminalActionCopy(terminalComposite.getTerminalViewControl());
        fActionEditCut = new TerminalActionCut(terminalComposite.getTerminalViewControl());
        fActionEditPaste = new TerminalActionPaste(terminalComposite.getTerminalViewControl());
        fActionEditClearAll = new TerminalActionClearAll(terminalComposite.getTerminalViewControl()) {
            @Override
            public void run() {
                super.run();
                updateActions();
            }
        };
        fActionEditSelectAll = new TerminalActionSelectAll(terminalComposite.getTerminalViewControl()) {
            @Override
            public void run() {
                super.run();
                updateActions();
            }
        };

        // open view action
        fOpenViewAction = new Action(Messages.TerminalView_Open_Terminal_View,
                TerminalPlugin.getImageDescriptor("/icons/terminal_small_add.png")) { //$NON-NLS-1$
            @Override
            public void run() {
                openView(null, getPartName(), getWorkingDirectory());
            }
        };
        fOpenViewAction.setToolTipText(Messages.TerminalView_Create_Terminal_View_Tooltip);

        // open editor action
        fOpenEditorAction = new Action(Messages.TerminalView_Open_Terminal_Editor,
                TerminalPlugin.getImageDescriptor("/icons/terminal_add.png")) { //$NON-NLS-1$
            @Override
            public void run() {
                Utils.openTerminalEditor(TerminalEditor.ID, true);
            }
        };
        fOpenEditorAction.setToolTipText(Messages.TerminalView_Create_Terminal_Editor_Tooltip);
    }

    public IPath getWorkingDirectory() {
        return terminalComposite.getWorkingDirectory();
    }

}