blob: d47eb28dea4ff91375afd236f64976dd82b65f26 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2017 IBM Corporation and others.
* 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 org.eclipse.dltk.tcl.internal.console.ui;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.core.model.IStreamsProxy;
import org.eclipse.dltk.console.IScriptInterpreter;
import org.eclipse.dltk.console.ScriptConsolePrompt;
import org.eclipse.dltk.console.ui.IScriptConsole;
import org.eclipse.dltk.console.ui.IScriptConsoleFactory;
import org.eclipse.dltk.console.ui.ScriptConsoleFactoryBase;
import org.eclipse.dltk.core.internal.environment.LocalEnvironment;
import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
import org.eclipse.dltk.launching.IInterpreterInstall;
import org.eclipse.dltk.launching.LaunchingMessages;
import org.eclipse.dltk.launching.ScriptRuntime;
import org.eclipse.dltk.tcl.console.TclConsoleConstants;
import org.eclipse.dltk.tcl.console.TclConsoleUtil;
import org.eclipse.dltk.tcl.console.TclInterpreter;
import org.eclipse.dltk.tcl.core.TclNature;
import org.eclipse.dltk.tcl.internal.debug.ui.TclDebugUIPlugin;
import org.eclipse.dltk.ui.DLTKUILanguageManager;
import org.eclipse.dltk.ui.IDLTKUILanguageToolkit;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;
public class TclConsoleFactory extends ScriptConsoleFactoryBase implements IScriptConsoleFactory {
protected IPreferenceStore getPreferenceStore() {
return TclDebugUIPlugin.getDefault().getPreferenceStore();
}
protected ScriptConsolePrompt makeInvitation() {
IPreferenceStore store = getPreferenceStore();
return new ScriptConsolePrompt(store.getString(TclConsoleConstants.PREF_NEW_PROMPT),
store.getString(TclConsoleConstants.PREF_CONTINUE_PROMPT));
}
protected TclConsole makeConsole(TclInterpreter interpreter, String id) {
TclConsole console = new TclConsole(interpreter, id);
console.setPrompt(makeInvitation());
return console;
}
protected void showInterpreterPreferencePage(String natureId) {
String preferencePageId = null;
IDLTKUILanguageToolkit languageToolkit = null;
languageToolkit = DLTKUILanguageManager.getLanguageToolkit(natureId);
if (languageToolkit == null) {
return;
}
preferencePageId = languageToolkit.getInterpreterPreferencePage();
if (preferencePageId != null) {
PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(null, preferencePageId, null, null);
dialog.open();
}
}
private void showQuestion() {
final boolean result[] = new boolean[] { false };
DLTKDebugUIPlugin.getStandardDisplay().syncExec(() -> {
String title = LaunchingMessages.NoDefaultInterpreterStatusHandler_title;
String message = LaunchingMessages.NoDefaultInterpreterStatusHandler_message;
result[0] = (MessageDialog.openQuestion(DLTKDebugUIPlugin.getActiveWorkbenchShell(), title, message));
if (result[0]) {
showInterpreterPreferencePage(TclNature.NATURE_ID);
}
});
}
private TclConsole createConsoleInstance(IScriptInterpreter interpreter, String id) {
ILaunch launch = null;
if (interpreter == null) {
try {
id = "default"; //$NON-NLS-1$
interpreter = new TclInterpreter();
if (ScriptRuntime.getDefaultInterpreterInstall(TclNature.NATURE_ID,
LocalEnvironment.getInstance()) == null) {
showQuestion();
if (ScriptRuntime.getDefaultInterpreterInstall(TclNature.NATURE_ID,
LocalEnvironment.getInstance()) == null) {
return null;
}
}
launch = TclConsoleUtil.runDefaultTclInterpreter((TclInterpreter) interpreter);
} catch (Exception e) {
return null;
}
}
final TclConsole console = makeConsole((TclInterpreter) interpreter, id);
if (launch != null) {
final IProcess[] processes = launch.getProcesses();
for (int i = 0; i < processes.length; ++i) {
final IStreamsProxy proxy = processes[i].getStreamsProxy();
if (proxy != null) {
console.connect(proxy);
}
}
}
return console;
}
@Override
protected IScriptConsole createConsoleInstance() {
return createConsoleInstance(null, null);
}
public TclConsoleFactory() {
}
/**
* @since 2.0
*/
@Override
public IScriptConsole openConsole(IScriptInterpreter interpreter, String id, ILaunch launch) {
TclConsole tclConsole = createConsoleInstance(interpreter, id);
tclConsole.setLaunch(launch);
registerAndOpenConsole(tclConsole);
return tclConsole;
}
/**
* @since 2.0
*/
public void openConsole(IInterpreterInstall install, String consoleName) {
final TclInterpreter interpreter = new TclInterpreter();
final ILaunch launch;
try {
launch = TclConsoleUtil.runTclInterpreter(install, interpreter);
} catch (Exception e) {
ErrorDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
"Error Launching Tcl Console", e.toString(),
new Status(IStatus.ERROR, TclDebugUIPlugin.PLUGIN_ID, e.getMessage(), e));
return;
}
if (launch != null) {
IScriptConsole console = openConsole(interpreter, consoleName, launch);
final IProcess[] processes = launch.getProcesses();
for (IProcess process : processes) {
final IStreamsProxy proxy = process.getStreamsProxy();
if (proxy != null) {
console.connect(proxy);
}
}
}
}
}