2 * This file is part of NixNote
\r
3 * Copyright 2009 Randy Baumgarte
\r
5 * This file may be licensed under the terms of of the
\r
6 * GNU General Public License Version 2 (the ``GPL'').
\r
8 * Software distributed under the License is distributed
\r
9 * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
\r
10 * express or implied. See the GPL for the specific language
\r
11 * governing rights and limitations.
\r
13 * You should have received a copy of the GPL along with this
\r
14 * program. If not, go to http://www.gnu.org/licenses/gpl.html
\r
15 * or write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
\r
20 package cx.fbn.nevernote.gui;
\r
22 import java.util.ArrayList;
\r
23 import java.util.List;
\r
24 import java.util.StringTokenizer;
\r
26 import com.evernote.edam.type.Tag;
\r
27 import com.trolltech.qt.core.QEvent;
\r
28 import com.trolltech.qt.core.QModelIndex;
\r
29 import com.trolltech.qt.gui.QLineEdit;
\r
31 import cx.fbn.nevernote.Global;
\r
33 public class TagLineEdit extends QLineEdit {
\r
34 private String text;
\r
35 private final boolean changed;
\r
36 public Signal2<List<String>, String> text_changed = new Signal2<List<String>, String>();
\r
37 public TagLineCompleter tagCompleter;
\r
38 public Signal0 focusLost = new Signal0();
\r
39 public String currentCompleterSelection;
\r
41 public TagLineEdit(List<Tag> allTags) {
\r
42 textChanged.connect(this, "textChanged(String)");
\r
43 tagCompleter = new TagLineCompleter(this);
\r
44 text_changed.connect(tagCompleter, "update(List, String)");
\r
45 tagCompleter.activated.connect(this, "completeText(String)");
\r
46 tagCompleter.highlightedIndex.connect(this, "completerSelected(QModelIndex)");
\r
48 currentCompleterSelection = null;
\r
52 public boolean hasChanged() {
\r
56 @SuppressWarnings("unused")
\r
57 private void textChanged(String t) {
\r
59 int cursor_pos = cursorPosition();
\r
60 String temp_text = text.substring(0,cursor_pos);
\r
61 int delimeter = temp_text.trim().lastIndexOf(Global.tagDelimeter);
\r
64 prefix = temp_text.substring(delimeter+1).trim();
\r
66 prefix = temp_text.trim();
\r
68 List<String> newTags = new ArrayList<String>();
\r
69 List<String> currentTags = new ArrayList<String>();
\r
70 String list[] = text.split(Global.tagDelimeter);
\r
71 for (String element : list) {
\r
72 currentTags.add(element.trim());
\r
75 text_changed.emit(currentTags, prefix.trim());
\r
80 // This method is used to store the current selection from the completer. It is
\r
81 // saved until later in case focus is lost while one is selected, but Enter is never pressed.
\r
82 @SuppressWarnings("unused")
\r
83 private void completerSelected(QModelIndex model) {
\r
84 currentCompleterSelection = null;
\r
87 tagCompleter.setCurrentRow(model.row());
\r
88 currentCompleterSelection = tagCompleter.currentCompletion();
\r
89 tagCompleter.setCurrentRow(model.row());
\r
92 public void completeText(String text){
\r
93 int cursor_pos = cursorPosition();
\r
94 String before_text = text().substring(0,cursor_pos);
\r
95 String after_text = text().substring(cursor_pos) +" " +Global.tagDelimeter;
\r
96 int prefix_len = before_text.lastIndexOf(Global.tagDelimeter);
\r
97 if (prefix_len == -1) {
\r
98 prefix_len = cursor_pos;
\r
101 before_text = before_text.substring(0, prefix_len);
\r
104 setText(rebuildTags(before_text+Global.tagDelimeter+text+Global.tagDelimeter+after_text));
\r
105 // setText(before_text +text +Global.tagDelimeter +" " +after_text);
\r
106 // setCursorPosition(cursor_pos - prefix_len + text().length() +2);
\r
107 setCursorPosition(text().length());
\r
110 public void setTagList(List<Tag> t) {
\r
111 tagCompleter.resetList();
\r
112 tagCompleter.setTagList(t);
\r
116 public boolean event(QEvent e) {
\r
117 if (e.type().equals(QEvent.Type.FocusOut)) {
\r
121 return super.event(e);
\r
124 private String rebuildTags(String tags) {
\r
125 StringBuffer tagBuffer = new StringBuffer(tags.length() *2);
\r
126 StringTokenizer tokens = new StringTokenizer (tags, Global.tagDelimeter);
\r
127 boolean first = true;
\r
128 while (tokens.hasMoreElements()) {
\r
129 String token = tokens.nextToken().trim();
\r
130 if (!token.equals("")) {
\r
132 tagBuffer.append(Global.tagDelimeter+ " ");
\r
134 tagBuffer.append(token);
\r
137 return tagBuffer.toString();
\r