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