From 3b96bd088513d998b5f671e58848b21fc560fc12 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Thu, 24 Nov 2016 16:53:47 +0100 Subject: [PATCH] Make terminal shell path setting application level again (IDEA-164206) --- .../plugins/terminal/JBTerminalPanel.java | 2 +- .../JBTerminalSystemSettingsProvider.java | 12 +- .../plugins/terminal/JBTerminalWidget.java | 2 +- .../terminal/LocalTerminalDirectRunner.java | 9 +- .../terminal/TerminalOptionsConfigurable.java | 2 +- .../terminal/TerminalOptionsProvider.java | 129 --------------- .../terminal/TerminalOptionsProvider.kt | 155 ++++++++++++++++++ .../TerminalProjectOptionsProvider.kt | 10 +- .../terminal/TerminalSettingsPanel.form | 44 ++--- .../terminal/TerminalSettingsPanel.java | 6 +- 10 files changed, 197 insertions(+), 174 deletions(-) delete mode 100644 plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.java create mode 100644 plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.kt diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalPanel.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalPanel.java index a8ab18b851ee..edceafea1dbe 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalPanel.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalPanel.java @@ -255,7 +255,7 @@ public class JBTerminalPanel extends TerminalPanel implements FocusListener, Ter } private void installKeyDispatcher() { - if (TerminalOptionsProvider.getInstance().overrideIdeShortcuts()) { + if (TerminalOptionsProvider.Companion.getInstance().overrideIdeShortcuts()) { myActionsToSkip = setupActionsToSkip(); IdeEventQueue.getInstance().addDispatcher(this, this); } diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java index c1cb26720339..5f452eb0bdb3 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java @@ -134,13 +134,13 @@ public class JBTerminalSystemSettingsProvider extends DefaultTabbedSettingsProvi @Override public boolean shouldCloseTabOnLogout(TtyConnector ttyConnector) { - return TerminalOptionsProvider.getInstance().closeSessionOnLogout(); + return TerminalOptionsProvider.Companion.getInstance().closeSessionOnLogout(); } @Override public String tabName(TtyConnector ttyConnector, String sessionName) { //for local terminal use name from settings if (ttyConnector instanceof PtyProcessTtyConnector) { - return TerminalOptionsProvider.getInstance().getTabName(); + return TerminalOptionsProvider.Companion.getInstance().getTabName(); } else { return sessionName; @@ -234,22 +234,22 @@ public class JBTerminalSystemSettingsProvider extends DefaultTabbedSettingsProvi @Override public boolean audibleBell() { - return TerminalOptionsProvider.getInstance().audibleBell(); + return TerminalOptionsProvider.Companion.getInstance().audibleBell(); } @Override public boolean enableMouseReporting() { - return TerminalOptionsProvider.getInstance().enableMouseReporting(); + return TerminalOptionsProvider.Companion.getInstance().enableMouseReporting(); } @Override public boolean copyOnSelect() { - return TerminalOptionsProvider.getInstance().copyOnSelection(); + return TerminalOptionsProvider.Companion.getInstance().copyOnSelection(); } @Override public boolean pasteOnMiddleMouseClick() { - return TerminalOptionsProvider.getInstance().pasteOnMiddleMouseButton(); + return TerminalOptionsProvider.Companion.getInstance().pasteOnMiddleMouseButton(); } @NotNull diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalWidget.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalWidget.java index 8a935c8c30e0..d765ab98e57d 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalWidget.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalWidget.java @@ -89,7 +89,7 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable{ @Override public List getActions() { List actions = super.getActions(); - if (!TerminalOptionsProvider.getInstance().overrideIdeShortcuts()) { + if (!TerminalOptionsProvider.Companion.getInstance().overrideIdeShortcuts()) { actions .add(new TerminalAction("EditorEscape", new KeyStroke[]{KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)}, new Predicate() { @Override diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java index 3403ae7efbe3..11bf1ad8ac95 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java @@ -84,7 +84,8 @@ public class LocalTerminalDirectRunner extends AbstractTerminalRunner { - private State myState = new State(); - - public static TerminalOptionsProvider getInstance() { - return ServiceManager.getService(TerminalOptionsProvider.class); - } - - @Override - public State getState() { - return myState; - } - - @Override - public void loadState(State state) { - myState.myCloseSessionOnLogout = state.myCloseSessionOnLogout; - myState.myReportMouse = state.myReportMouse; - myState.mySoundBell = state.mySoundBell; - myState.myTabName = state.myTabName; - myState.myCopyOnSelection = state.myCopyOnSelection; - myState.myPasteOnMiddleMouseButton = state.myPasteOnMiddleMouseButton; - myState.myOverrideIdeShortcuts = state.myOverrideIdeShortcuts; - myState.myShellIntegration = state.myShellIntegration; - } - - public boolean closeSessionOnLogout() { - return myState.myCloseSessionOnLogout; - } - - public boolean enableMouseReporting() { - return myState.myReportMouse; - } - - public boolean audibleBell() { - return myState.mySoundBell; - } - - public String getTabName() { - return myState.myTabName; - } - - public boolean overrideIdeShortcuts() { - return myState.myOverrideIdeShortcuts; - } - - public void setOverrideIdeShortcuts(boolean overrideIdeShortcuts) { - myState.myOverrideIdeShortcuts = overrideIdeShortcuts; - } - - public boolean shellIntegration() { - return myState.myShellIntegration; - } - - public void setShellIntegration(boolean shellIntegration) { - myState.myShellIntegration = shellIntegration; - } - - public static class State { - public String myTabName = "Local"; - public boolean myCloseSessionOnLogout = true; - public boolean myReportMouse = true; - public boolean mySoundBell = true; - public boolean myCopyOnSelection = true; - public boolean myPasteOnMiddleMouseButton = true; - public boolean myOverrideIdeShortcuts = true; - public boolean myShellIntegration = true; - } - - public void setTabName(String tabName) { - myState.myTabName = tabName; - } - - public void setCloseSessionOnLogout(boolean closeSessionOnLogout) { - myState.myCloseSessionOnLogout = closeSessionOnLogout; - } - - public void setReportMouse(boolean reportMouse) { - myState.myReportMouse = reportMouse; - } - - public void setSoundBell(boolean soundBell) { - myState.mySoundBell = soundBell; - } - - public boolean copyOnSelection() { - return myState.myCopyOnSelection; - } - - public void setCopyOnSelection(boolean copyOnSelection) { - myState.myCopyOnSelection = copyOnSelection; - } - - public boolean pasteOnMiddleMouseButton() { - return myState.myPasteOnMiddleMouseButton; - } - - public void setPasteOnMiddleMouseButton(boolean pasteOnMiddleMouseButton) { - myState.myPasteOnMiddleMouseButton = pasteOnMiddleMouseButton; - } -} - diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.kt new file mode 100644 index 000000000000..aaee01441908 --- /dev/null +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.kt @@ -0,0 +1,155 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.terminal + +import com.intellij.openapi.components.PersistentStateComponent +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.components.State +import com.intellij.openapi.components.Storage +import com.intellij.openapi.util.SystemInfo +import java.io.File + +/** + * @author traff + */ + +@State(name = "TerminalOptionsProvider", storages = arrayOf(Storage("terminal.xml"))) +class TerminalOptionsProvider : PersistentStateComponent { + private val myState = State() + + var shellPath: String? by ValueWithDefault(State::myShellPath, myState) { defaultShellPath } + + override fun getState(): State? { + return myState + } + + override fun loadState(state: State) { + myState.myCloseSessionOnLogout = state.myCloseSessionOnLogout + myState.myReportMouse = state.myReportMouse + myState.mySoundBell = state.mySoundBell + myState.myTabName = state.myTabName + myState.myCopyOnSelection = state.myCopyOnSelection + myState.myPasteOnMiddleMouseButton = state.myPasteOnMiddleMouseButton + myState.myOverrideIdeShortcuts = state.myOverrideIdeShortcuts + myState.myShellIntegration = state.myShellIntegration + myState.myShellPath = state.myShellPath + } + + fun closeSessionOnLogout(): Boolean { + return myState.myCloseSessionOnLogout + } + + fun enableMouseReporting(): Boolean { + return myState.myReportMouse + } + + fun audibleBell(): Boolean { + return myState.mySoundBell + } + + var tabName: String + get() = myState.myTabName + set(tabName) { + myState.myTabName = tabName + } + + fun overrideIdeShortcuts(): Boolean { + return myState.myOverrideIdeShortcuts + } + + fun setOverrideIdeShortcuts(overrideIdeShortcuts: Boolean) { + myState.myOverrideIdeShortcuts = overrideIdeShortcuts + } + + fun shellIntegration(): Boolean { + return myState.myShellIntegration + } + + fun setShellIntegration(shellIntegration: Boolean) { + myState.myShellIntegration = shellIntegration + } + + class State { + var myShellPath: String? = null + var myTabName = "Local" + var myCloseSessionOnLogout = true + var myReportMouse = true + var mySoundBell = true + var myCopyOnSelection = true + var myPasteOnMiddleMouseButton = true + var myOverrideIdeShortcuts = true + var myShellIntegration = true + } + + fun setCloseSessionOnLogout(closeSessionOnLogout: Boolean) { + myState.myCloseSessionOnLogout = closeSessionOnLogout + } + + fun setReportMouse(reportMouse: Boolean) { + myState.myReportMouse = reportMouse + } + + fun setSoundBell(soundBell: Boolean) { + myState.mySoundBell = soundBell + } + + fun copyOnSelection(): Boolean { + return myState.myCopyOnSelection + } + + fun setCopyOnSelection(copyOnSelection: Boolean) { + myState.myCopyOnSelection = copyOnSelection + } + + fun pasteOnMiddleMouseButton(): Boolean { + return myState.myPasteOnMiddleMouseButton + } + + fun setPasteOnMiddleMouseButton(pasteOnMiddleMouseButton: Boolean) { + myState.myPasteOnMiddleMouseButton = pasteOnMiddleMouseButton + } + + val defaultShellPath: String + get() { + val shell = System.getenv("SHELL") + + if (shell != null && File(shell).canExecute()) { + return shell + } + + if (SystemInfo.isUnix) { + if (File("/bin/bash").exists()) { + return "/bin/bash" + } + else { + return "/bin/sh" + } + } + else { + return "cmd.exe" + } + } + + companion object { + val instance: TerminalOptionsProvider + get() = ServiceManager.getService(TerminalOptionsProvider::class.java) + } +} + + + + + diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalProjectOptionsProvider.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalProjectOptionsProvider.kt index 4fabaa744dd4..f0d15298033d 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalProjectOptionsProvider.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalProjectOptionsProvider.kt @@ -24,7 +24,8 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.util.SystemInfo import java.io.File -import kotlin.reflect.* +import kotlin.reflect.KMutableProperty1 +import kotlin.reflect.KProperty /** * @author traff @@ -39,18 +40,13 @@ class TerminalProjectOptionsProvider(val project: Project) : PersistentStateComp } override fun loadState(state: State) { - myState.myShellPath = state.myShellPath myState.myStartingDirectory = state.myStartingDirectory } class State { - var myShellPath: String? = null - var myStartingDirectory: String? = null } - var shellPath: String? by ValueWithDefault(State::myShellPath, myState) { defaultShellPath } - var startingDirectory: String? by ValueWithDefault(State::myStartingDirectory, myState) { defaultStartingDirectory } val defaultStartingDirectory: String? @@ -117,7 +113,7 @@ class TerminalProjectOptionsProvider(val project: Project) : PersistentStateComp // TODO: In Kotlin 1.1 it will be possible to pass references to instance properties. Until then we need 'state' argument as a reciever for // to property to apply -class ValueWithDefault(val prop: KMutableProperty1, val state: TerminalProjectOptionsProvider.State, val default: () -> String?) { +class ValueWithDefault(val prop: KMutableProperty1, val state: S, val default: () -> String?) { operator fun getValue(thisRef: Any?, property: KProperty<*>): String? { return if (prop.get(state) !== null) prop.get(state) else default() } diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form index 1a7eae9b845a..f413cd4cb2f3 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form @@ -3,7 +3,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -32,24 +32,9 @@ - - - - - - - - - - - - - - - - + @@ -58,7 +43,7 @@ - + @@ -72,7 +57,7 @@ - + @@ -82,7 +67,7 @@ - + @@ -91,12 +76,27 @@ - + + + + + + + + + + + + + + + + diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java index e2d1fe434410..d75c99ab6d5d 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java @@ -115,7 +115,7 @@ public class TerminalSettingsPanel { } public boolean isModified() { - return !Comparing.equal(myShellPathField.getText(), myProjectOptionsProvider.getShellPath()) + return !Comparing.equal(myShellPathField.getText(), myOptionsProvider.getShellPath()) || !Comparing.equal(myStartDirectoryField.getText(), myProjectOptionsProvider.getStartingDirectory()) || !Comparing.equal(myTabNameTextField.getText(), myOptionsProvider.getTabName()) || (myCloseSessionCheckBox.isSelected() != myOptionsProvider.closeSessionOnLogout()) @@ -129,8 +129,8 @@ public class TerminalSettingsPanel { } public void apply() { - myProjectOptionsProvider.setShellPath(myShellPathField.getText()); myProjectOptionsProvider.setStartingDirectory(myStartDirectoryField.getText()); + myOptionsProvider.setShellPath(myShellPathField.getText()); myOptionsProvider.setTabName(myTabNameTextField.getText()); myOptionsProvider.setCloseSessionOnLogout(myCloseSessionCheckBox.isSelected()); myOptionsProvider.setReportMouse(myMouseReportCheckBox.isSelected()); @@ -150,7 +150,7 @@ public class TerminalSettingsPanel { } public void reset() { - myShellPathField.setText(myProjectOptionsProvider.getShellPath()); + myShellPathField.setText(myOptionsProvider.getShellPath()); myStartDirectoryField.setText(myProjectOptionsProvider.getStartingDirectory()); myTabNameTextField.setText(myOptionsProvider.getTabName()); myCloseSessionCheckBox.setSelected(myOptionsProvider.closeSessionOnLogout());