FR [ 1820783 ] AutoCompletion: posibility to toggle strict mode
* fixed javadoc * fixed indentation
This commit is contained in:
parent
27efd9b851
commit
3f1753319e
|
@ -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.
|
/* This work is hereby released into the Public Domain.
|
||||||
* To view a copy of the public domain dedication, visit
|
* To view a copy of the public domain dedication, visit
|
||||||
* http://creativecommons.org/licenses/publicdomain/
|
* 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
|
||||||
|
* <li>BF [ 1735043 ] AutoCompletion: drop down box is showed even if i press Caps
|
||||||
|
* <li>FR [ 1820783 ] AutoCompletion: posibility to toggle strict mode
|
||||||
|
* <li>BF [ 1820778 ] ESC(cancel editing) key not working if you are on VComboBox
|
||||||
|
*/
|
||||||
public class AutoCompletion extends PlainDocument {
|
public class AutoCompletion extends PlainDocument {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
CComboBox comboBox;
|
CComboBox comboBox;
|
||||||
ComboBoxModel model;
|
ComboBoxModel model;
|
||||||
JTextComponent editor;
|
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 selecting=false;
|
||||||
boolean hidePopupOnFocusLoss;
|
boolean hidePopupOnFocusLoss;
|
||||||
boolean hitBackspace=false;
|
boolean hitBackspace=false;
|
||||||
boolean hitBackspaceOnSelection;
|
boolean hitBackspaceOnSelection;
|
||||||
|
/** Strict mode */
|
||||||
|
private boolean m_strictMode = true;
|
||||||
|
|
||||||
KeyListener editorKeyListener;
|
KeyListener editorKeyListener;
|
||||||
FocusListener editorFocusListener;
|
FocusListener editorFocusListener;
|
||||||
|
@ -54,17 +79,22 @@ public class AutoCompletion extends PlainDocument {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (comboBox.isDisplayable()) comboBox.setPopupVisible(true);
|
if (comboBox.isDisplayable())
|
||||||
|
comboBox.setPopupVisible(true);
|
||||||
|
if(!m_strictMode)
|
||||||
|
return;
|
||||||
hitBackspace=false;
|
hitBackspace=false;
|
||||||
switch (e.getKeyCode()) {
|
switch (e.getKeyCode()) {
|
||||||
// determine if the pressed key is backspace (needed by the remove method)
|
// determine if the pressed key is backspace (needed by the remove method)
|
||||||
case KeyEvent.VK_BACK_SPACE : hitBackspace=true;
|
case KeyEvent.VK_BACK_SPACE :
|
||||||
hitBackspaceOnSelection=editor.getSelectionStart()!=editor.getSelectionEnd();
|
hitBackspace=true;
|
||||||
break;
|
hitBackspaceOnSelection=editor.getSelectionStart()!=editor.getSelectionEnd();
|
||||||
// ignore delete key
|
break;
|
||||||
case KeyEvent.VK_DELETE : e.consume();
|
// ignore delete key
|
||||||
UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
|
case KeyEvent.VK_DELETE :
|
||||||
break;
|
e.consume();
|
||||||
|
UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -87,11 +117,26 @@ public class AutoCompletion extends PlainDocument {
|
||||||
highlightCompletedText(0);
|
highlightCompletedText(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable auto completion for a combo box (strict mode)
|
||||||
|
* @param comboBox
|
||||||
|
*/
|
||||||
public static void enable(CComboBox 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
|
// has to be editable
|
||||||
comboBox.setEditable(true);
|
comboBox.setEditable(true);
|
||||||
// change the editor's document
|
// change the editor's document
|
||||||
new AutoCompletion(comboBox);
|
AutoCompletion ac = new AutoCompletion(comboBox);
|
||||||
|
// set strict mode
|
||||||
|
ac.setStrictMode(strictMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void configureEditor(ComboBoxEditor newEditor) {
|
void configureEditor(ComboBoxEditor newEditor) {
|
||||||
|
@ -140,15 +185,20 @@ public class AutoCompletion extends PlainDocument {
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
setSelectedItem(item);
|
setSelectedItem(item);
|
||||||
} else {
|
} else {
|
||||||
if ( offs == 0 )
|
if (m_strictMode) {
|
||||||
setSelectedItem(null); //null is valid for non-mandatory fields
|
if ( offs == 0 )
|
||||||
//so if cursor is at start of line allow it
|
setSelectedItem(null); //null is valid for non-mandatory fields
|
||||||
// otherwise keep old item selected if there is no better match
|
//so if cursor is at start of line allow it
|
||||||
else
|
// otherwise keep old item selected if there is no better match
|
||||||
item = comboBox.getSelectedItem();
|
else
|
||||||
// undo the insertion as there isn't a valid match
|
item = comboBox.getSelectedItem();
|
||||||
offs = offs-str.length();
|
// undo the insertion as there isn't a valid match
|
||||||
UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
|
offs = offs-str.length();
|
||||||
|
UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item != null)
|
if (item != null)
|
||||||
|
@ -158,7 +208,11 @@ public class AutoCompletion extends PlainDocument {
|
||||||
highlightCompletedText(offs+str.length());
|
highlightCompletedText(offs+str.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setText(String text) {
|
/**
|
||||||
|
* Set text
|
||||||
|
* @param text
|
||||||
|
*/
|
||||||
|
public void setText(String text) {
|
||||||
try {
|
try {
|
||||||
// remove all text and insert the completed string
|
// remove all text and insert the completed string
|
||||||
super.remove(0, getLength());
|
super.remove(0, getLength());
|
||||||
|
@ -198,7 +252,21 @@ public class AutoCompletion extends PlainDocument {
|
||||||
return null;
|
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) {
|
private boolean startsWithIgnoreCase(String str1, String str2) {
|
||||||
return str1.toUpperCase().startsWith(str2.toUpperCase());
|
return str1.toUpperCase().startsWith(str2.toUpperCase());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue