OSDN Git Service

f35cc92a2729f006630c7e163848816b99aac073
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / gui / TagLineEdit.java
1 /*\r
2  * This file is part of NeverNote \r
3  * Copyright 2009 Randy Baumgarte\r
4  * \r
5  * This file may be licensed under the terms of of the\r
6  * GNU General Public License Version 2 (the ``GPL'').\r
7  *\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
12  *\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
17  *\r
18 */\r
19 \r
20 package cx.fbn.nevernote.gui;\r
21 \r
22 import java.util.ArrayList;\r
23 import java.util.List;\r
24 \r
25 import com.evernote.edam.type.Tag;\r
26 import com.trolltech.qt.core.QEvent;\r
27 import com.trolltech.qt.gui.QLineEdit;\r
28 \r
29 import cx.fbn.nevernote.Global;\r
30 \r
31 public class TagLineEdit extends QLineEdit {\r
32         private String text;\r
33         private final boolean changed;\r
34         public Signal2<List<String>, String> text_changed = new Signal2<List<String>, String>();\r
35         public TagLineCompleter tagCompleter;\r
36         public Signal0 focusLost = new Signal0();\r
37         \r
38         public TagLineEdit(List<Tag> allTags) {\r
39                 textChanged.connect(this, "textChanged(String)");\r
40                 tagCompleter = new TagLineCompleter(this);\r
41                 text_changed.connect(tagCompleter, "update(List, String)");\r
42                 tagCompleter.activated.connect(this, "completeText(String)");\r
43                 changed = false;\r
44         }\r
45         \r
46         public boolean hasChanged() {\r
47                 return changed;\r
48         }\r
49         \r
50         @SuppressWarnings("unused")\r
51         private void textChanged(String t) {\r
52                 text = t;\r
53                 int cursor_pos = cursorPosition();\r
54                 String temp_text = text.substring(0,cursor_pos);\r
55                 int delimeter = temp_text.trim().lastIndexOf(Global.tagDelimeter);\r
56                 String prefix = "";\r
57                 if (delimeter > 0)\r
58                    prefix = temp_text.substring(delimeter+1).trim();\r
59                 else\r
60                         prefix = temp_text.trim();\r
61                 \r
62                 List<String> newTags = new ArrayList<String>();\r
63                 List<String> currentTags = new ArrayList<String>();\r
64                 String list[] = text.split(Global.tagDelimeter);\r
65                 for (String element : list) {\r
66                         currentTags.add(element.trim());\r
67                 }\r
68         \r
69                 text_changed.emit(currentTags, prefix.trim());\r
70                 \r
71         }\r
72         \r
73         @SuppressWarnings("unused")\r
74         private void  completeText(String text){\r
75                 int cursor_pos = cursorPosition();\r
76                 String before_text = text().substring(0,cursor_pos);\r
77                 String after_text = text().substring(cursor_pos);\r
78                 int prefix_len = before_text.lastIndexOf(Global.tagDelimeter);\r
79                 if (prefix_len == -1) {\r
80                         prefix_len = cursor_pos;\r
81                         before_text = "";\r
82                 } else {\r
83                         before_text = before_text.substring(0,cursor_pos-1);\r
84                 }\r
85                 int nextTagPos = after_text.indexOf(Global.tagDelimeter);\r
86                 if (nextTagPos == -1) {\r
87                         nextTagPos = 0;\r
88                         after_text = "";\r
89                 }\r
90                 setText(before_text +text +Global.tagDelimeter +" " +after_text);\r
91                 setCursorPosition(cursor_pos - prefix_len + text().length() +2);\r
92         }\r
93 \r
94         public void setTagList(List<Tag> t) {\r
95                 tagCompleter.resetList();\r
96                 tagCompleter.setTagList(t);\r
97         }\r
98         \r
99         @Override\r
100         public boolean event(QEvent e) {\r
101                 if (e.type().equals(QEvent.Type.FocusOut)) {\r
102                         focusLost.emit();\r
103                 }\r
104                 return super.event(e);\r
105         }\r
106 }\r