From 3f1753319ea85b1d9f171e68c29d1f14377ce441 Mon Sep 17 00:00:00 2001 From: teo_sarca Date: Tue, 6 Nov 2007 07:55:58 +0000 Subject: [PATCH] FR [ 1820783 ] AutoCompletion: posibility to toggle strict mode * fixed javadoc * fixed indentation --- .../org/compiere/grid/ed/AutoCompletion.java | 140 +++++++++++++----- 1 file changed, 104 insertions(+), 36 deletions(-) diff --git a/client/src/org/compiere/grid/ed/AutoCompletion.java b/client/src/org/compiere/grid/ed/AutoCompletion.java index b9c853389a..46e10a189f 100644 --- a/client/src/org/compiere/grid/ed/AutoCompletion.java +++ b/client/src/org/compiere/grid/ed/AutoCompletion.java @@ -1,30 +1,55 @@ -package org.compiere.grid.ed; -import java.awt.event.*; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import javax.swing.*; -import javax.swing.text.*; - -import org.compiere.swing.CComboBox; - - -//phib: this is from http://www.orbital-computer.de/JComboBox -//with some minor revisions for Adempiere - /* This work is hereby released into the Public Domain. * To view a copy of the public domain dedication, visit * http://creativecommons.org/licenses/publicdomain/ */ +package org.compiere.grid.ed; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import javax.swing.ComboBoxEditor; +import javax.swing.ComboBoxModel; +import javax.swing.UIManager; +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.JTextComponent; +import javax.swing.text.PlainDocument; + +import org.compiere.swing.CComboBox; + +/** + * Auto completion behaviour for a combo box + * + * @author phib: this is from http://www.orbital-computer.de/JComboBox + * with some minor revisions for Adempiere + * @author Teo Sarca, SC ARHIPAC SERVICE SRL + *
  • BF [ 1735043 ] AutoCompletion: drop down box is showed even if i press Caps + *
  • FR [ 1820783 ] AutoCompletion: posibility to toggle strict mode + *
  • BF [ 1820778 ] ESC(cancel editing) key not working if you are on VComboBox + */ public class AutoCompletion extends PlainDocument { + private static final long serialVersionUID = 1L; + CComboBox comboBox; ComboBoxModel model; JTextComponent editor; - // flag to indicate if setSelectedItem has been called - // subsequent calls to remove/insertString should be ignored + /** + * Flag to indicate if setSelectedItem has been called + * subsequent calls to remove/insertString should be ignored + */ boolean selecting=false; boolean hidePopupOnFocusLoss; boolean hitBackspace=false; boolean hitBackspaceOnSelection; + /** Strict mode */ + private boolean m_strictMode = true; KeyListener editorKeyListener; FocusListener editorFocusListener; @@ -54,17 +79,22 @@ public class AutoCompletion extends PlainDocument { return; } - if (comboBox.isDisplayable()) comboBox.setPopupVisible(true); + if (comboBox.isDisplayable()) + comboBox.setPopupVisible(true); + if(!m_strictMode) + return; hitBackspace=false; switch (e.getKeyCode()) { - // determine if the pressed key is backspace (needed by the remove method) - case KeyEvent.VK_BACK_SPACE : hitBackspace=true; - hitBackspaceOnSelection=editor.getSelectionStart()!=editor.getSelectionEnd(); - break; - // ignore delete key - case KeyEvent.VK_DELETE : e.consume(); - UIManager.getLookAndFeel().provideErrorFeedback(comboBox); - break; + // determine if the pressed key is backspace (needed by the remove method) + case KeyEvent.VK_BACK_SPACE : + hitBackspace=true; + hitBackspaceOnSelection=editor.getSelectionStart()!=editor.getSelectionEnd(); + break; + // ignore delete key + case KeyEvent.VK_DELETE : + e.consume(); + UIManager.getLookAndFeel().provideErrorFeedback(comboBox); + break; } } }; @@ -87,11 +117,26 @@ public class AutoCompletion extends PlainDocument { highlightCompletedText(0); } + /** + * Enable auto completion for a combo box (strict mode) + * @param comboBox + */ public static void enable(CComboBox comboBox) { + enable(comboBox, true); + } + + /** + * Enable auto completion for a combo box + * @param comboBox + * @param strictMode true if you want to set strict mode + */ + public static void enable(CComboBox comboBox, boolean strictMode) { // has to be editable comboBox.setEditable(true); // change the editor's document - new AutoCompletion(comboBox); + AutoCompletion ac = new AutoCompletion(comboBox); + // set strict mode + ac.setStrictMode(strictMode); } void configureEditor(ComboBoxEditor newEditor) { @@ -140,15 +185,20 @@ public class AutoCompletion extends PlainDocument { if (item != null) { setSelectedItem(item); } else { - if ( offs == 0 ) - setSelectedItem(null); //null is valid for non-mandatory fields - //so if cursor is at start of line allow it - // otherwise keep old item selected if there is no better match - else - item = comboBox.getSelectedItem(); - // undo the insertion as there isn't a valid match - offs = offs-str.length(); - UIManager.getLookAndFeel().provideErrorFeedback(comboBox); + if (m_strictMode) { + if ( offs == 0 ) + setSelectedItem(null); //null is valid for non-mandatory fields + //so if cursor is at start of line allow it + // otherwise keep old item selected if there is no better match + else + item = comboBox.getSelectedItem(); + // undo the insertion as there isn't a valid match + offs = offs-str.length(); + UIManager.getLookAndFeel().provideErrorFeedback(comboBox); + } + else { + return; + } } if (item != null) @@ -158,7 +208,11 @@ public class AutoCompletion extends PlainDocument { highlightCompletedText(offs+str.length()); } - private void setText(String text) { + /** + * Set text + * @param text + */ + public void setText(String text) { try { // remove all text and insert the completed string super.remove(0, getLength()); @@ -198,7 +252,21 @@ public class AutoCompletion extends PlainDocument { return null; } - // checks if str1 starts with str2 - ignores case + /** + * Set strict mode. If the strict mode is enabled, you can't enter any other values than the + * ones from combo box list. + * @param mode true if strict mode + */ + public void setStrictMode (boolean mode) { + m_strictMode = mode; + } + + /** + * Checks if str1 starts with str2 (ignores case) + * @param str1 + * @param str2 + * @return true if str1 starts with str2 + */ private boolean startsWithIgnoreCase(String str1, String str2) { return str1.toUpperCase().startsWith(str2.toUpperCase()); }