OSDN Git Service

Add shared notebook editing & syncing logic.
[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 import java.util.StringTokenizer;\r
25 \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
30 \r
31 import cx.fbn.nevernote.Global;\r
32 \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
40         \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
47                 changed = false;\r
48                 currentCompleterSelection = null;\r
49         }\r
50         \r
51 \r
52         public boolean hasChanged() {\r
53                 return changed;\r
54         }\r
55         \r
56         @SuppressWarnings("unused")\r
57         private void textChanged(String t) {\r
58                 text = 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
62                 String prefix = "";\r
63                 if (delimeter > 0)\r
64                    prefix = temp_text.substring(delimeter+1).trim();\r
65                 else\r
66                         prefix = temp_text.trim();\r
67                 \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
73                 }\r
74         \r
75                 text_changed.emit(currentTags, prefix.trim());\r
76 \r
77                 \r
78         }\r
79         \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
85                 if (model == null)\r
86                         return;\r
87                 tagCompleter.setCurrentRow(model.row());\r
88                 currentCompleterSelection = tagCompleter.currentCompletion();\r
89                 tagCompleter.setCurrentRow(model.row());\r
90         }\r
91         \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
99                         before_text = "";\r
100                 } else {\r
101                         before_text = before_text.substring(0, prefix_len);\r
102                 }\r
103 \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
108         }\r
109 \r
110         public void setTagList(List<Tag> t) {\r
111                 tagCompleter.resetList();\r
112                 tagCompleter.setTagList(t);\r
113         }\r
114         \r
115         @Override\r
116         public boolean event(QEvent e) {\r
117                 if (e.type().equals(QEvent.Type.FocusOut)) {\r
118                         \r
119                         focusLost.emit();\r
120                 }\r
121                 return super.event(e);\r
122         }\r
123         \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
131                                 if (!first)\r
132                                         tagBuffer.append(Global.tagDelimeter+ " ");\r
133                                 first = false;\r
134                                 tagBuffer.append(token);\r
135                         }\r
136                 }\r
137                 return tagBuffer.toString();\r
138         }\r
139 }\r