You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by jw...@apache.org on 2017/05/26 00:49:53 UTC

[2/2] groovy git commit: GROOVY-3270: GroovyConsole: Configurable output area size (closes #548)

GROOVY-3270: GroovyConsole: Configurable output area size (closes #548)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/6cc28e05
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/6cc28e05
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/6cc28e05

Branch: refs/heads/GROOVY_2_5_X
Commit: 6cc28e05a9a161c7d17e596dd5fb96cd33d385c6
Parents: 79a8062
Author: Emilian Bold <em...@apache.org>
Authored: Sun May 21 23:18:39 2017 +0300
Committer: John Wagenleitner <jw...@apache.org>
Committed: Thu May 25 17:48:54 2017 -0700

----------------------------------------------------------------------
 .../src/main/groovy/groovy/ui/Console.groovy    |  17 +++
 .../main/groovy/groovy/ui/ConsoleActions.groovy |   7 +
 .../groovy/groovy/ui/ConsolePreferences.groovy  | 129 +++++++++++++++++++
 .../groovy/groovy/ui/view/BasicMenuBar.groovy   |   2 +
 .../groovy/groovy/ui/view/MacOSXMenuBar.groovy  |  10 +-
 .../main/resources/groovy/ui/Console.properties |   7 +
 6 files changed, 170 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/6cc28e05/subprojects/groovy-console/src/main/groovy/groovy/ui/Console.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-console/src/main/groovy/groovy/ui/Console.groovy b/subprojects/groovy-console/src/main/groovy/groovy/ui/Console.groovy
index 9db505b..4bfb2d4 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/ui/Console.groovy
+++ b/subprojects/groovy-console/src/main/groovy/groovy/ui/Console.groovy
@@ -200,6 +200,8 @@ class Console implements CaretListener, HyperlinkListener, ComponentListener, Fo
     Action selectWordAction
     Action selectPreviousWordAction
 
+    ConsolePreferences consolePreferences;
+
     static void main(args) {
         CliBuilder cli = new CliBuilder(usage: 'groovyConsole [options] [filename]', stopAtNonOption: false)
         MessageSource messages = new MessageSource(Console)
@@ -250,6 +252,20 @@ class Console implements CaretListener, HyperlinkListener, ComponentListener, Fo
 
     }
 
+    int loadMaxOutputChars() {
+        // For backwards compatibility 'maxOutputChars' remains defined in the Console class
+        // and the System Property takes precedence as the default value.
+        int max = prefs.getInt('maxOutputChars', ConsolePreferences.DEFAULT_MAX_OUTPUT_CHARS)
+        return System.getProperty('groovy.console.output.limit', "${max}") as int
+    }
+
+    void preferences(EventObject evt = null) {
+        if (!consolePreferences) {
+            consolePreferences = new ConsolePreferences(this)
+        }
+        consolePreferences.show()
+    }
+
     Console() {
         this(new Binding())
     }
@@ -268,6 +284,7 @@ class Console implements CaretListener, HyperlinkListener, ComponentListener, Fo
 
     Console(ClassLoader parent, Binding binding, CompilerConfiguration baseConfig) {
         this.baseConfig = baseConfig
+        this.maxOutputChars = loadMaxOutputChars()
         indy = indy || isIndyEnabled(baseConfig)
         if (indy) {
             enableIndy(baseConfig)

http://git-wip-us.apache.org/repos/asf/groovy/blob/6cc28e05/subprojects/groovy-console/src/main/groovy/groovy/ui/ConsoleActions.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-console/src/main/groovy/groovy/ui/ConsoleActions.groovy b/subprojects/groovy-console/src/main/groovy/groovy/ui/ConsoleActions.groovy
index ddb2d3d..3382c2b 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/ui/ConsoleActions.groovy
+++ b/subprojects/groovy-console/src/main/groovy/groovy/ui/ConsoleActions.groovy
@@ -407,3 +407,10 @@ indyAction = action(
     mnemonic: 'I',
     shortDescription: 'Enable InvokeDynamic (Indy) compilation for scripts'
 )
+
+preferencesAction = action(
+    name: 'Preferences',
+    closure: controller.&preferences,
+    mnemonic: 'S',
+    shortDescription: 'Preference Settings'
+)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/groovy/blob/6cc28e05/subprojects/groovy-console/src/main/groovy/groovy/ui/ConsolePreferences.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-console/src/main/groovy/groovy/ui/ConsolePreferences.groovy b/subprojects/groovy-console/src/main/groovy/groovy/ui/ConsolePreferences.groovy
new file mode 100644
index 0000000..7296762
--- /dev/null
+++ b/subprojects/groovy-console/src/main/groovy/groovy/ui/ConsolePreferences.groovy
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2003-2017 the original author or authors.
+ *
+ * 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 groovy.ui
+
+import groovy.beans.Bindable
+import groovy.swing.SwingBuilder
+import org.codehaus.groovy.tools.shell.util.MessageSource
+
+import java.awt.Dimension
+import javax.swing.JDialog
+import static java.awt.GridBagConstraints.*
+
+class ConsolePreferences {
+
+    // Default maximum number of characters to show on console at any time
+    static int DEFAULT_MAX_OUTPUT_CHARS = 20000
+
+    @Bindable int maxOutputChars
+
+    private final console
+    private final MessageSource T
+
+    private JDialog dialog
+
+    ConsolePreferences(console) {
+        this.console = console
+        T = new MessageSource(Console)
+
+        maxOutputChars = console.loadMaxOutputChars()
+        console.maxOutputChars = maxOutputChars
+    }
+
+    void show() {
+        console.swing.edt {
+            if (!dialog) {
+                buildDialog()
+            }
+            dialog.setLocationRelativeTo(console.frame)
+            dialog.pack()
+            dialog.getRootPane().setDefaultButton(console.swing.closePrefsButton)
+            console.swing.doLater console.swing.closePrefsButton.&requestFocusInWindow
+            dialog.setVisible(true)
+        }
+    }
+
+    private void buildDialog() {
+        dialog = console.swing.dialog(
+                title: T['prefs.dialog.title'], owner: console.frame, modal: true
+        ) {
+            vbox {
+                hbox(border: titledBorder(T['prefs.output.settings.title'])) {
+                    label "${T['prefs.max.characters.output']}:"
+
+                    formattedTextField value: maxOutputChars, id: 'txtMaxOutputChars',
+                            text:
+                                    bind(target: this, targetProperty: 'maxOutputChars',
+                                            validator: this.&isInteger, converter: Integer.&parseInt),
+                            columns: 6
+                }
+
+                vglue()
+
+                hbox {
+                    button T['prefs.reset.defaults'], id: 'resetPrefsButton', actionPerformed: this.&onReset
+                    hglue()
+                    button T['prefs.close'], id: 'closePrefsButton', actionPerformed: this.&onClose
+                }
+            }
+        }
+
+        console.swing.txtMaxOutputChars.maximumSize=new Dimension(Integer.MAX_VALUE, (int) console.swing.txtMaxOutputChars.preferredSize.height)
+    }
+
+    private boolean isInteger(value) {
+        try {
+            Integer.parseInt(value)
+            return true
+        } catch (NumberFormatException ignore) {
+            return false
+        }
+    }
+
+    private void onReset(EventObject event) {
+        console.swing.txtMaxOutputChars.text = DEFAULT_MAX_OUTPUT_CHARS
+    }
+
+    private void onClose(EventObject event) {
+        console.prefs.putInt('maxOutputChars', maxOutputChars)
+        // For backwards compatibility 'maxOutputChars' remains defined in the Console class
+        // and so we update the value to keep it in sync.
+        if (maxOutputChars != console.maxOutputChars) {
+            console.maxOutputChars = maxOutputChars
+        }
+        dialog.dispose()
+    }
+
+    // Useful for testing gui
+    static void main(args) {
+        javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName())
+        def c = new Expando().with {
+            swing = new SwingBuilder()
+            frame = swing.frame(title: 'foo', size:[800, 800])
+            DEFAULT_MAX_OUTPUT_CHARS = 25000
+            maxOutputChars = 25000
+            loadMaxOutputChars = { 20000 }
+            prefs = [putInt: { s, t -> }, getInt: { s, t -> t }]
+            it
+        }
+        ConsolePreferences cp = new ConsolePreferences(c)
+        cp.show()
+        c.frame.dispose()
+        println "maxOutputChars==${cp.maxOutputChars}"
+        println "console.maxOutputChars==${c.maxOutputChars}"
+        println 'done'
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/groovy/blob/6cc28e05/subprojects/groovy-console/src/main/groovy/groovy/ui/view/BasicMenuBar.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-console/src/main/groovy/groovy/ui/view/BasicMenuBar.groovy b/subprojects/groovy-console/src/main/groovy/groovy/ui/view/BasicMenuBar.groovy
index dc169cf..ea84739 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/ui/view/BasicMenuBar.groovy
+++ b/subprojects/groovy-console/src/main/groovy/groovy/ui/view/BasicMenuBar.groovy
@@ -53,6 +53,8 @@ menuBar {
 	separator()
 	menuItem(commentAction)
         menuItem(selectBlockAction)
+        separator()
+        menuItem(preferencesAction)
     }
 
     menu(text: 'View', mnemonic: 'V') {

http://git-wip-us.apache.org/repos/asf/groovy/blob/6cc28e05/subprojects/groovy-console/src/main/groovy/groovy/ui/view/MacOSXMenuBar.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-console/src/main/groovy/groovy/ui/view/MacOSXMenuBar.groovy b/subprojects/groovy-console/src/main/groovy/groovy/ui/view/MacOSXMenuBar.groovy
index 1461f7b..78e9686 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/ui/view/MacOSXMenuBar.groovy
+++ b/subprojects/groovy-console/src/main/groovy/groovy/ui/view/MacOSXMenuBar.groovy
@@ -26,10 +26,11 @@ package groovy.ui
 
 import com.apple.mrj.*
 
-class ConsoleMacOsSupport implements MRJQuitHandler, MRJAboutHandler {
+class ConsoleMacOsSupport implements MRJQuitHandler, MRJAboutHandler, MRJPrefsHandler {
 
     def quitHandler
     def aboutHandler
+    def prefHandler
 
     public void handleAbout() {
         aboutHandler()
@@ -39,11 +40,16 @@ class ConsoleMacOsSupport implements MRJQuitHandler, MRJAboutHandler {
         quitHandler()
     }
 
+
+    public void handlePrefs() throws IllegalStateException {
+        prefHandler()
+    }
 }
 
-def handler = new ConsoleMacOsSupport(quitHandler:controller.&exit, aboutHandler:controller.&showAbout)
+def handler = new ConsoleMacOsSupport(quitHandler:controller.&exit, aboutHandler:controller.&showAbout, prefHandler:controller.&preferences)
 MRJApplicationUtils.registerAboutHandler(handler)
 MRJApplicationUtils.registerQuitHandler(handler)
+MRJApplicationUtils.registerPrefsHandler(handler)
 
 return handler
 """, new GroovyClassLoader(this.class.classLoader))

http://git-wip-us.apache.org/repos/asf/groovy/blob/6cc28e05/subprojects/groovy-console/src/main/resources/groovy/ui/Console.properties
----------------------------------------------------------------------
diff --git a/subprojects/groovy-console/src/main/resources/groovy/ui/Console.properties b/subprojects/groovy-console/src/main/resources/groovy/ui/Console.properties
index 0793ebc..b04c0ec 100644
--- a/subprojects/groovy-console/src/main/resources/groovy/ui/Console.properties
+++ b/subprojects/groovy-console/src/main/resources/groovy/ui/Console.properties
@@ -29,3 +29,10 @@ cli.option.parameters.description=Generate metadata for reflection on method par
 cli.option.indy.description=Enable InvokeDynamic (Indy) compilation for scripts
 
 cli.info.version=GroovyConsole {0}
+
+# Preferences Dialog
+prefs.dialog.title=Preferences
+prefs.output.settings.title=Output Settings
+prefs.max.characters.output=Maximum Characters to Output
+prefs.reset.defaults=Reset To Defaults
+prefs.close=Close