blob: 7631b9fac471f0834280645e1d94c9b24818c603 [file] [log] [blame]
/*
* Copyright (c) 2012 Google Inc.
*
* All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
* Public License v1.0 which accompanies this distribution, and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*/
package com.google.eclipse.terminal.local.ui.view;
import static com.google.eclipse.terminal.local.Activator.*;
import static com.google.eclipse.terminal.local.ui.preferences.ColorPreferences.*;
import static com.google.eclipse.terminal.local.ui.util.Displays.runInDisplayThread;
import static com.google.eclipse.terminal.local.ui.view.Messages.defaultViewTitle;
import static com.google.eclipse.terminal.local.util.Platform.userHomeDirectory;
import static org.eclipse.core.runtime.Path.fromOSString;
import static org.eclipse.ui.IWorkbenchPage.VIEW_ACTIVATE;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.tm.internal.terminal.control.ITerminalListener;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
import org.eclipse.ui.*;
import org.eclipse.ui.part.ViewPart;
import com.google.eclipse.terminal.local.core.connector.LifeCycleListener;
import com.google.eclipse.terminal.local.ui.preferences.AbstractColorPreferencesChangeListener;
/**
* @author alruiz@google.com (Alex Ruiz)
*/
public class TerminalView extends ViewPart implements LifeCycleListener {
private static final String TITLE_STATE_TYPE = "title";
private static final String WORKING_DIRECTORY_STATE_TYPE = "workingDirectory";
private static final String VIEW_ID = "com.google.eclipse.terminal.local.localTerminalView";
private IPropertyChangeListener colorPreferencesChangeListener;
private IMemento savedState;
private TerminalWidget terminalWidget;
private IPath workingDirectory;
public static void openTerminalView(IPath workingDirectory) {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
try {
String directoryName = workingDirectory.lastSegment();
TerminalView view = (TerminalView) page.showView(VIEW_ID, directoryName, VIEW_ACTIVATE);
view.setPartName(directoryName);
view.open(workingDirectory);
} catch (PartInitException e) {
log("Unable to create Terminal View", e);
}
}
@Override public void executionFinished() {
// TODO Close view on exit
}
@Override public void init(IViewSite site, IMemento memento) throws PartInitException {
super.init(site, memento);
savedState = memento;
}
@Override public void saveState(IMemento memento) {
saveState(memento, TITLE_STATE_TYPE, getPartName());
saveState(memento, WORKING_DIRECTORY_STATE_TYPE, workingDirectory.toOSString());
}
private void saveState(IMemento memento, String type, String data) {
IMemento child = memento.createChild(type);
child.putTextData(data);
}
@Override public void createPartControl(Composite parent) {
terminalWidget = new TerminalWidget(parent, SWT.NONE);
terminalWidget.setLifeCycleListener(this);
terminalWidget.setTerminalListener(new ITerminalListener() {
@Override public void setTerminalTitle(final String title) {
runInDisplayThread(new Runnable() {
@Override public void run() {
setPartName(title);
}
});
}
@Override public void setState(TerminalState state) {
}
});
IViewSite viewSite = getViewSite();
terminalWidget.setUpGlobalEditActionHandlers(viewSite.getActionBars());
colorPreferencesChangeListener = new AbstractColorPreferencesChangeListener() {
@Override protected void onColorChanged() {
resetColors();
}
};
preferenceStore().addPropertyChangeListener(colorPreferencesChangeListener);
resetColors();
if (savedState != null) {
connectUsingSavedState();
return;
}
if (viewSite.getSecondaryId() == null) {
setPartName(defaultViewTitle);
open(userHomeDirectory());
}
}
private void resetColors() {
terminalWidget.resetTerminalColors(background(), foreground());
}
private void connectUsingSavedState() {
String title = savedState(TITLE_STATE_TYPE);
setPartName(title);
String savedWorkingDirectory = savedState(WORKING_DIRECTORY_STATE_TYPE);
if (savedWorkingDirectory != null) {
open(fromOSString(savedWorkingDirectory));
}
}
private String savedState(String type) {
IMemento child = savedState.getChild(type);
return (child != null) ? child.getTextData() : null;
}
private void open(IPath workingDirectory) {
if (terminalWidget.isConnected()) {
return;
}
this.workingDirectory = workingDirectory;
terminalWidget.setWorkingDirectory(workingDirectory);
terminalWidget.connect();
}
@Override public void setFocus() {
terminalWidget.setFocus();
}
@Override public void dispose() {
if (colorPreferencesChangeListener != null) {
preferenceStore().removePropertyChangeListener(colorPreferencesChangeListener);
}
super.dispose();
}
}