Index: src/main/groovy/ui/ConsoleView.groovy =================================================================== --- src/main/groovy/ui/ConsoleView.groovy (revision 15309) +++ src/main/groovy/ui/ConsoleView.groovy (working copy) @@ -105,6 +105,8 @@ controller.showToolbarAction = showToolbarAction // some more UI linkage +controller.outputArea.addComponentListener(controller) +controller.inputArea.addComponentListener(controller) controller.outputArea.addHyperlinkListener(controller) controller.inputArea.addCaretListener(controller) controller.inputArea.document.addDocumentListener({ controller.setDirty(true) } as DocumentListener) Index: src/main/groovy/ui/Console.groovy =================================================================== --- src/main/groovy/ui/Console.groovy (revision 15309) +++ src/main/groovy/ui/Console.groovy (working copy) @@ -27,6 +27,8 @@ import java.awt.Toolkit import java.awt.Window import java.awt.event.ActionEvent +import java.awt.event.ComponentEvent +import java.awt.event.ComponentListener import java.util.prefs.Preferences import javax.swing.* import javax.swing.event.CaretEvent @@ -59,7 +61,7 @@ * @author Alan Green more features: history, System.out capture, bind result to _ * @author Guillaume Laforge, stacktrace hyperlinking to the current script line */ -class Console implements CaretListener, HyperlinkListener { +class Console implements CaretListener, HyperlinkListener, ComponentListener { static final String DEFAULT_SCRIPT_NAME_START = "ConsoleScript" @@ -639,11 +641,7 @@ } void largerFont(EventObject evt = null) { - if (inputArea.font.size > 40) return - // don't worry, the fonts won't be changed to monospaced face, the styles will only derive from this - def newFont = new Font('Monospaced', Font.PLAIN, inputArea.font.size + 2) - inputArea.font = newFont - outputArea.font = newFont + updateFontSize(inputArea.font.size + 2) } static boolean notifySystemOut(String str) { @@ -849,11 +847,8 @@ } void smallerFont(EventObject evt = null){ - if (inputArea.font.size < 5) return - // don't worry, the fonts won't be changed to monospaced face, the styles will only derive from this - def newFont = new Font('Monospaced', Font.PLAIN, inputArea.font.size - 2) - inputArea.font = newFont - outputArea.font = newFont + updateFontSize(inputArea.font.size - 2) + } void updateTitle() { @@ -866,6 +861,21 @@ } } + private updateFontSize(newFontSize) { + if (newFontSize > 40) { + newFontSize = 40 + } else if (newFontSize < 4) { + newFontSize = 4 + } + + prefs.putInt("fontSize", newFontSize) + + // don't worry, the fonts won't be changed to monospaced face, the styles will only derive from this + def newFont = new Font('Monospaced', Font.PLAIN, newFontSize) + inputArea.font = newFont + outputArea.font = newFont + } + void invokeTextAction(evt, closure) { def source = evt.getSource() if (source != null) { @@ -944,4 +954,18 @@ editor.moveCaretPosition(newlineAfter) } } + + + void componentHidden(ComponentEvent e) { } + + void componentMoved(ComponentEvent e) { } + + void componentResized(ComponentEvent e) { + def component = e.getComponent() + prefs.putInt("${component.name}Width", component.width) + prefs.putInt("${component.name}Height", component.height) + } + + public void componentShown(ComponentEvent e) { } + } Index: src/main/groovy/ui/view/BasicContentPane.groovy =================================================================== --- src/main/groovy/ui/view/BasicContentPane.groovy (revision 15309) +++ src/main/groovy/ui/view/BasicContentPane.groovy (working copy) @@ -1,13 +1,19 @@ package groovy.ui.view import groovy.ui.ConsoleTextEditor +import groovy.ui.Console import java.awt.* import java.awt.image.BufferedImage import static javax.swing.JSplitPane.VERTICAL_SPLIT import javax.swing.text.Style import javax.swing.text.StyleContext import javax.swing.text.StyledDocument +import java.util.prefs.Preferences + +def prefs = Preferences.userNodeForPackage(Console) + + splitPane = splitPane(resizeWeight: 0.50F, orientation: VERTICAL_SPLIT) { @@ -15,9 +21,10 @@ scrollPane(border:emptyBorder(0)) { outputArea = textPane( editable: false, + name: "outputArea", contentType: "text/html", background: new Color(255,255,218), - font:new Font("Monospaced", Font.PLAIN, 12), + font:new Font("Monospaced", Font.PLAIN, prefs.getInt("fontSize", 12)), border:emptyBorder(4) ) } @@ -28,7 +35,7 @@ // attach ctrl-enter to input area // need to wrap in actions to keep it from being added as a component actions { - container(inputArea, font:new Font("Monospaced", Font.PLAIN, 12), border:emptyBorder(4)) { + container(inputArea, name: "inputArea", font:new Font("Monospaced", Font.PLAIN, prefs.getInt("fontSize", 12)), border:emptyBorder(4)) { action(runAction) action(runSelectionAction) } @@ -77,10 +84,14 @@ // this is a good enough solution, there are margins and scrollbars and such to worry about for 80x12x2 Graphics g = GraphicsEnvironment.localGraphicsEnvironment.createGraphics (new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB)) FontMetrics fm = g.getFontMetrics(outputArea.font) + outputArea.preferredSize = [ - fm.charWidth(0x77) * 81, - (fm.getHeight() + fm.leading) * 12] as Dimension + prefs.getInt("outputAreaWidth", fm.charWidth(0x77) * 81), + prefs.getInt("outputAreaHeight", (fm.getHeight() + fm.leading) * 12) +] as Dimension //inputArea.setFont(outputArea.font) -inputEditor.preferredSize = outputArea.preferredSize - +inputEditor.preferredSize = [ + prefs.getInt("inputAreaWidth", fm.charWidth(0x77) * 81), + prefs.getInt("inputAreaHeight", (fm.getHeight() + fm.leading) * 12) +] as Dimension