annotate src/viewer_swing/java/com/glavsoft/viewer/swing/gui/AutoCompletionComboEditorDocument.java @ 0:daa24f8a557b

TightVNC original
author YU
date Thu, 11 Sep 2014 07:30:03 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
daa24f8a557b TightVNC original
YU
parents:
diff changeset
1 package com.glavsoft.viewer.swing.gui;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
2
daa24f8a557b TightVNC original
YU
parents:
diff changeset
3 import javax.swing.*;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
4 import javax.swing.text.AttributeSet;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
5 import javax.swing.text.BadLocationException;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
6 import javax.swing.text.JTextComponent;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
7 import javax.swing.text.PlainDocument;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
8 import java.awt.event.ActionEvent;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
9 import java.awt.event.ActionListener;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
10 import java.awt.event.FocusAdapter;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
11 import java.awt.event.FocusEvent;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
12
daa24f8a557b TightVNC original
YU
parents:
diff changeset
13 /**
daa24f8a557b TightVNC original
YU
parents:
diff changeset
14 * @author dime at tightvnc.com
daa24f8a557b TightVNC original
YU
parents:
diff changeset
15 *
daa24f8a557b TightVNC original
YU
parents:
diff changeset
16 * Using idea by Thomas Bierhance from http://www.orbital-computer.de/JComboBox/
daa24f8a557b TightVNC original
YU
parents:
diff changeset
17 */
daa24f8a557b TightVNC original
YU
parents:
diff changeset
18 public class AutoCompletionComboEditorDocument extends PlainDocument {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
19
daa24f8a557b TightVNC original
YU
parents:
diff changeset
20 private ComboBoxModel model;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
21 private boolean selecting;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
22 private JComboBox comboBox;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
23 private final boolean hidePopupOnFocusLoss;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
24 private JTextComponent editor;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
25
daa24f8a557b TightVNC original
YU
parents:
diff changeset
26 public AutoCompletionComboEditorDocument(final JComboBox comboBox) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
27 this.comboBox = comboBox;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
28 this.model = comboBox.getModel();
daa24f8a557b TightVNC original
YU
parents:
diff changeset
29 this.editor = (JTextComponent)comboBox.getEditor().getEditorComponent();
daa24f8a557b TightVNC original
YU
parents:
diff changeset
30 editor.setDocument(this);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
31 comboBox.addActionListener(new ActionListener() {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
32 @Override
daa24f8a557b TightVNC original
YU
parents:
diff changeset
33 public void actionPerformed(ActionEvent e) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
34 if (!selecting) highlightCompletedText(0);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
35 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
36 });
daa24f8a557b TightVNC original
YU
parents:
diff changeset
37
daa24f8a557b TightVNC original
YU
parents:
diff changeset
38 Object selectedItem = comboBox.getSelectedItem();
daa24f8a557b TightVNC original
YU
parents:
diff changeset
39 if (selectedItem!=null) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
40 setText(selectedItem.toString());
daa24f8a557b TightVNC original
YU
parents:
diff changeset
41 highlightCompletedText(0);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
42 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
43 hidePopupOnFocusLoss = System.getProperty("java.version").startsWith("1.5");
daa24f8a557b TightVNC original
YU
parents:
diff changeset
44 editor.addFocusListener(new FocusAdapter() {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
45 @Override
daa24f8a557b TightVNC original
YU
parents:
diff changeset
46 public void focusLost(FocusEvent e) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
47 if (hidePopupOnFocusLoss) comboBox.setPopupVisible(false);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
48 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
49 });
daa24f8a557b TightVNC original
YU
parents:
diff changeset
50 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
51
daa24f8a557b TightVNC original
YU
parents:
diff changeset
52 @Override
daa24f8a557b TightVNC original
YU
parents:
diff changeset
53 public void remove(int offs, int len) throws BadLocationException {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
54 if (selecting) return;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
55 super.remove(offs, len);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
56 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
57
daa24f8a557b TightVNC original
YU
parents:
diff changeset
58 @Override
daa24f8a557b TightVNC original
YU
parents:
diff changeset
59 public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
60 if (selecting) return;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
61 super.insertString(offs, str, a);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
62 Object item = lookupItem(getText(0, getLength()));
daa24f8a557b TightVNC original
YU
parents:
diff changeset
63 if (item != null) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
64 setSelectedItem(item);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
65 setText(item.toString());
daa24f8a557b TightVNC original
YU
parents:
diff changeset
66 highlightCompletedText(offs + str.length());
daa24f8a557b TightVNC original
YU
parents:
diff changeset
67 if (comboBox.isDisplayable()) comboBox.setPopupVisible(true);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
68 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
69 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
70
daa24f8a557b TightVNC original
YU
parents:
diff changeset
71 private void setText(String text) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
72 try {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
73 super.remove(0, getLength());
daa24f8a557b TightVNC original
YU
parents:
diff changeset
74 super.insertString(0, text, null);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
75 } catch (BadLocationException e) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
76 throw new RuntimeException(e);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
77 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
78 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
79
daa24f8a557b TightVNC original
YU
parents:
diff changeset
80 private void setSelectedItem(Object item) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
81 selecting = true;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
82 model.setSelectedItem(item);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
83 selecting = false;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
84 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
85
daa24f8a557b TightVNC original
YU
parents:
diff changeset
86 private void highlightCompletedText(int offs) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
87 JTextComponent editor = (JTextComponent) comboBox.getEditor().getEditorComponent();
daa24f8a557b TightVNC original
YU
parents:
diff changeset
88 editor.setSelectionStart(offs);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
89 editor.setSelectionEnd(getLength());
daa24f8a557b TightVNC original
YU
parents:
diff changeset
90 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
91
daa24f8a557b TightVNC original
YU
parents:
diff changeset
92 private Object lookupItem(String pattern) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
93 Object selectedItem = model.getSelectedItem();
daa24f8a557b TightVNC original
YU
parents:
diff changeset
94 if (selectedItem != null && startsWithIgnoreCase(selectedItem, pattern)) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
95 return selectedItem;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
96 } else {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
97 for (int i = 0, n = model.getSize(); i < n; i++) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
98 Object currentItem = model.getElementAt(i);
daa24f8a557b TightVNC original
YU
parents:
diff changeset
99 if (startsWithIgnoreCase(currentItem, pattern)) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
100 return currentItem;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
101 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
102 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
103 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
104 return null;
daa24f8a557b TightVNC original
YU
parents:
diff changeset
105 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
106
daa24f8a557b TightVNC original
YU
parents:
diff changeset
107 private boolean startsWithIgnoreCase(Object currentItem, String pattern) {
daa24f8a557b TightVNC original
YU
parents:
diff changeset
108 return currentItem.toString().toLowerCase().startsWith(pattern.toLowerCase());
daa24f8a557b TightVNC original
YU
parents:
diff changeset
109 }
daa24f8a557b TightVNC original
YU
parents:
diff changeset
110
daa24f8a557b TightVNC original
YU
parents:
diff changeset
111
daa24f8a557b TightVNC original
YU
parents:
diff changeset
112 }