com.aptana.terminal.editor.TerminalEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.terminal.editor.TerminalEditor.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
// $codepro.audit.disable unnecessaryExceptions

package com.aptana.terminal.editor;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
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.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.ISaveablePart2;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.EditorPart;

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

public class TerminalEditor extends EditorPart implements ISaveablePart2, IProcessListener {
    public static final String ID = "com.aptana.terminal.TerminalEditor"; //$NON-NLS-1$

    private TerminalComposite terminalComposite;

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

    private boolean checkCanClose = false;

    /*
     * (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);
        IEditorInput input = getEditorInput();
        if (input instanceof TerminalEditorInput) {
            TerminalEditorInput terminalEditorInput = (TerminalEditorInput) input;
            String title = terminalEditorInput.getTitle();
            if (title != null && title.length() > 0) {
                setPartName(title);
            }
            terminalComposite.setWorkingDirectory(terminalEditorInput.getWorkingDirectory());
        }

        // Create the help context id for the viewer's control
        PlatformUI.getWorkbench().getHelpSystem().setHelp(terminalComposite.getTerminalControl(), ID);

        makeActions();
        hookContextMenu();
        contributeToActionBars();
        saveInputState();

        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());
                    }
                }
            }
        });
        terminalComposite.connect();
    }

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

    private void saveInputState() {
        IEditorInput input = getEditorInput();
        if (input instanceof TerminalEditorInput) {
            TerminalEditorInput terminalEditorInput = (TerminalEditorInput) input;
            terminalEditorInput.setTitle(getPartName());
            terminalEditorInput.setWorkingDirectory(terminalComposite.getWorkingDirectory());
        }
    }

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

    /*
     * (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.part.EditorPart#isDirty()
     */
    @Override
    public boolean isDirty() {
        try {
            return checkCanClose;
        } finally {
            checkCanClose = false;
        }
    }

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

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

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

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#setContentDescription(java.lang.String)
     */
    @Override
    protected void setContentDescription(String description) {
        super.setContentDescription(description);
        checkCanClose = false; // reset state set by testEditor
    }

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

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

    /**
     * fillContextMenu
     * 
     * @param menuMgr
     */
    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(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    /**
     * contributeToActionBars
     */
    private void contributeToActionBars() {
        IActionBars actionBars = getEditorSite().getActionBars();
        actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), fActionEditCopy);
        actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), fActionEditPaste);
        actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), fActionEditSelectAll);

    }

    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();
            }
        };
    }

    /**
     * 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);
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
     */
    @Override
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        setSite(site);
        setInput(input);
        setPartName(Messages.TerminalEditor_Part_Name);
        setTitleToolTip(Messages.TerminalEditor_Title_Tool_Tip);
        setTitleImage(TerminalPlugin.getImage("icons/terminal.png")); //$NON-NLS-1$
    }

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

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