From f0ad4f39400d0b40ac2d23c176ba510f67d7d2a5 Mon Sep 17 00:00:00 2001 From: rusefillc Date: Fri, 12 Nov 2021 11:01:29 -0500 Subject: [PATCH] editor size limit --- .../com/rusefi/ui/lua/DocumentSizeFilter.java | 78 +++++++++++++++++++ .../java/com/rusefi/ui/lua/TextEditor.java | 40 +++++++++- 2 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 java_console/ui/src/main/java/com/rusefi/ui/lua/DocumentSizeFilter.java diff --git a/java_console/ui/src/main/java/com/rusefi/ui/lua/DocumentSizeFilter.java b/java_console/ui/src/main/java/com/rusefi/ui/lua/DocumentSizeFilter.java new file mode 100644 index 0000000000..b5ad2bb8c7 --- /dev/null +++ b/java_console/ui/src/main/java/com/rusefi/ui/lua/DocumentSizeFilter.java @@ -0,0 +1,78 @@ +package com.rusefi.ui.lua; + + +/* + * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle or the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/* A 1.4 class used by TextComponentDemo.java. */ + +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.DocumentFilter; +import java.awt.*; + +public class DocumentSizeFilter extends DocumentFilter { + int maxCharacters; + + public DocumentSizeFilter(int maxChars) { + maxCharacters = maxChars; + } + + public void insertString(FilterBypass fb, int offs, + String str, AttributeSet a) + throws BadLocationException { + + //This rejects the entire insertion if it would make + //the contents too long. Another option would be + //to truncate the inserted string so the contents + //would be exactly maxCharacters in length. + if ((fb.getDocument().getLength() + str.length()) <= maxCharacters) + super.insertString(fb, offs, str, a); + else + Toolkit.getDefaultToolkit().beep(); + } + + public void replace(FilterBypass fb, int offs, + int length, + String str, AttributeSet a) + throws BadLocationException { + //This rejects the entire replacement if it would make + //the contents too long. Another option would be + //to truncate the replacement string so the contents + //would be exactly maxCharacters in length. + if ((fb.getDocument().getLength() + str.length() + - length) <= maxCharacters) + super.replace(fb, offs, length, str, a); + else + Toolkit.getDefaultToolkit().beep(); + } +} \ No newline at end of file diff --git a/java_console/ui/src/main/java/com/rusefi/ui/lua/TextEditor.java b/java_console/ui/src/main/java/com/rusefi/ui/lua/TextEditor.java index 72d10170e3..e1a4bc2890 100644 --- a/java_console/ui/src/main/java/com/rusefi/ui/lua/TextEditor.java +++ b/java_console/ui/src/main/java/com/rusefi/ui/lua/TextEditor.java @@ -1,10 +1,16 @@ package com.rusefi.ui.lua; +import com.rusefi.config.generated.Fields; + import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.AbstractDocument; import javax.swing.text.Document; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoManager; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; @@ -15,14 +21,44 @@ import java.awt.event.KeyEvent; * todo: Find text feature? */ public class TextEditor { + private final JPanel area = new JPanel(new BorderLayout()); private final JTextArea textArea = new JTextArea(); + private final JLabel sizeLabel = new JLabel(); public TextEditor() { textArea.setTabSize(2); + AbstractDocument pDoc = (AbstractDocument) textArea.getDocument(); + pDoc.setDocumentFilter(new DocumentSizeFilter(Fields.LUA_SCRIPT_SIZE)); + pDoc.addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + updateSize(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + updateSize(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + updateSize(); + } + }); + + area.add(textArea, BorderLayout.CENTER); + JPanel bottomArea = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + area.add(bottomArea, BorderLayout.SOUTH); + bottomArea.add(sizeLabel); + installUndoRedoKeystrokes(); } + private void updateSize() { + sizeLabel.setText(textArea.getText().length() + "/" + Fields.LUA_SCRIPT_SIZE); + } + private void installUndoRedoKeystrokes() { KeyStroke undoKeyStroke = KeyStroke.getKeyStroke( KeyEvent.VK_Z, InputEvent.CTRL_MASK); @@ -62,8 +98,8 @@ public class TextEditor { }); } - public JTextArea getControl() { - return textArea; + public JComponent getControl() { + return area; } public void setText(String text) {