OSDN Git Service

3961b4b078a5d4800394d6d41f287aba1c18f540
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / gui / NoteTableModel.java
1 package cx.fbn.nevernote.gui;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collections;\r
5 import java.util.HashMap;\r
6 import java.util.List;\r
7 \r
8 import com.evernote.edam.type.Note;\r
9 import com.trolltech.qt.core.QDateTime;\r
10 import com.trolltech.qt.core.QModelIndex;\r
11 import com.trolltech.qt.core.Qt;\r
12 import com.trolltech.qt.core.Qt.AspectRatioMode;\r
13 import com.trolltech.qt.gui.QAbstractTableModel;\r
14 import com.trolltech.qt.gui.QColor;\r
15 import com.trolltech.qt.gui.QPixmap;\r
16 \r
17 import cx.fbn.nevernote.Global;\r
18 import cx.fbn.nevernote.filters.NoteSortFilterProxyModel;\r
19 import cx.fbn.nevernote.utilities.ListManager;\r
20 \r
21 public class NoteTableModel extends QAbstractTableModel {\r
22         private final ListManager               listManager;\r
23         private final Object[]                  headers;\r
24         private List<Note>                              noteIndex;\r
25         private List<Note>                              masterNoteIndex;\r
26         private List<String>                    unsynchronizedNotes;\r
27         public HashMap<String,Integer>  titleColors;\r
28         public NoteSortFilterProxyModel proxyModel;             // note sort model\r
29         \r
30         public NoteTableModel(ListManager m) {\r
31                 headers = new Object[Global.noteTableColumnCount];\r
32                 listManager = m;\r
33                 masterNoteIndex = null;\r
34                 unsynchronizedNotes = new ArrayList<String>();\r
35         }\r
36         \r
37         public List<Note> getNoteIndex() {\r
38                 return noteIndex;\r
39         }\r
40         public void setNoteIndex(List<Note> list) {\r
41                 noteIndex = list;\r
42         }\r
43         public List<Note> getMasterNoteIndex() {\r
44                 return masterNoteIndex;\r
45         }\r
46         public void setMasterNoteIndex(List<Note> list) {\r
47                 masterNoteIndex = list;\r
48         }\r
49         public void setSortProxyModel(NoteSortFilterProxyModel m) {\r
50                 proxyModel = m;\r
51         }\r
52         \r
53         public List<String> getUnsynchronizedNotes() {\r
54                 return unsynchronizedNotes;\r
55         }\r
56         public void setUnsynchronizedNotes(List<String> list) {\r
57                 unsynchronizedNotes = list;\r
58         }\r
59         \r
60         public HashMap<String, Integer> getTitleColors() {\r
61                 return titleColors;\r
62         }\r
63         public void setTitleColors(HashMap<String, Integer> map) {\r
64                 titleColors = map;\r
65         }\r
66         \r
67         @Override\r
68         public int columnCount(QModelIndex arg0) {\r
69                 return Global.noteTableColumnCount;\r
70         }\r
71 \r
72         @Override\r
73         public Object data(QModelIndex index, int role) {\r
74                 if (index == null)\r
75                         return null;\r
76         switch (role) {\r
77         case Qt.ItemDataRole.DisplayRole: {\r
78             return valueAt(index.row(), index.column());\r
79         }\r
80         case Qt.ItemDataRole.DecorationRole: {\r
81                 if (index.column() == Global.noteTableThumbnailPosition)\r
82                         return valueAt(index.row(), index.column());\r
83                 else\r
84                         return null;\r
85         }\r
86         case Qt.ItemDataRole.BackgroundRole: {\r
87                 String guid = (String)valueAt(index.row(), Global.noteTableGuidPosition);\r
88                 QColor backgroundColor = new QColor(QColor.white);\r
89                 if (titleColors != null && titleColors.containsKey(guid)) {\r
90                         int color = titleColors.get(guid);\r
91                         backgroundColor.setRgb(color);\r
92                 }\r
93                 return backgroundColor;\r
94         }\r
95         case Qt.ItemDataRole.ForegroundRole: {\r
96                 String guid = (String)valueAt(index.row(), Global.noteTableGuidPosition);\r
97                 QColor backgroundColor = new QColor(QColor.white);\r
98                 QColor foregroundColor = new QColor(QColor.black);\r
99                 if (titleColors != null && titleColors.containsKey(guid)) {\r
100                         int color = titleColors.get(guid);\r
101                         backgroundColor.setRgb(color);\r
102                         if (backgroundColor.rgb() == QColor.black.rgb() || backgroundColor.rgb() == QColor.blue.rgb()) \r
103                                 foregroundColor.setRgb(QColor.white.rgb());\r
104                 } \r
105                 return foregroundColor;\r
106         }\r
107         default:\r
108             break;\r
109         }\r
110                 return null;\r
111         }\r
112 \r
113         @Override\r
114         public int rowCount(QModelIndex arg0) {\r
115                 if (listManager != null && listManager.getMasterNoteIndex() != null) \r
116                         return listManager.getMasterNoteIndex().size();\r
117                 else\r
118                         return 0;\r
119         }\r
120 \r
121         \r
122         private Object valueAt(int row, int col) {\r
123                 Note note = listManager.getMasterNoteIndex().get(row);\r
124                 \r
125                 if (col == Global.noteTableGuidPosition)\r
126                         return note.getGuid();\r
127                 if (col == Global.noteTableCreationPosition) \r
128                         return note.getCreated();\r
129                 if (col == Global.noteTableChangedPosition) \r
130                         return note.getUpdated();\r
131                 if (col == Global.noteTableSubjectDatePosition) {\r
132                         if (note.getAttributes().getSubjectDate() > 0)\r
133                                 return note.getAttributes().getSubjectDate();\r
134                         else\r
135                                 return note.getCreated();                               \r
136                 }\r
137                 if (col == Global.noteTableTitlePosition)\r
138                         return note.getTitle();\r
139                 if (col == Global.noteTableAuthorPosition)\r
140                         return note.getAttributes().getAuthor();\r
141                 if (col == Global.noteTableSourceUrlPosition)\r
142                         return note.getAttributes().getSourceURL();\r
143                 if (col == Global.noteTableSynchronizedPosition) {\r
144                         String guid = note.getGuid();\r
145                         for (int i=0; i<unsynchronizedNotes.size(); i++) {\r
146                                 if (unsynchronizedNotes.get(i).equalsIgnoreCase(guid)) \r
147                                         return "false";\r
148                         }\r
149                         return "true";\r
150                 }\r
151                 if (col == Global.noteTableTagPosition) {\r
152                         String tags = new String();\r
153                         for (int i=0; i<note.getTagNamesSize(); i++) {\r
154                                 tags = tags + note.getTagNames().get(i);\r
155                                 if (i!=note.getTagNamesSize()-1)\r
156                                         tags = tags + ", ";\r
157                         }\r
158                         return tags;\r
159                 }\r
160                 if (col == Global.noteTableNotebookPosition) {\r
161                         for (int i=0; i<listManager.getNotebookIndex().size(); i++) {\r
162                                 if (listManager.getNotebookIndex().get(i).getGuid().equals(note.getNotebookGuid()))\r
163                                         return listManager.getNotebookIndex().get(i).getName();\r
164                         }\r
165                 }\r
166                 if (col == Global.noteTableGuidPosition) {\r
167                         return note.getGuid();\r
168                 }\r
169                 if (col == Global.noteTableThumbnailPosition) {\r
170                         if (listManager.getThumbnails().get(note.getGuid()) == null)\r
171                                 return null;\r
172                         if (Global.listView)\r
173                                 return QPixmap.fromImage(listManager.getThumbnails().get(note.getGuid())).scaled(Global.smallThumbnailSize, AspectRatioMode.KeepAspectRatio);\r
174                         else\r
175                                 return QPixmap.fromImage(listManager.getThumbnails().get(note.getGuid())).scaled(Global.largeThumbnailSize, AspectRatioMode.KeepAspectRatio);\r
176                                 \r
177                 }\r
178                 return "";\r
179         }\r
180         \r
181         \r
182         @Override\r
183         public java.lang.Object headerData(int section, Qt.Orientation orientation, int role) {\r
184                 if (role != Qt.ItemDataRole.DisplayRole)\r
185                         return null;\r
186                 \r
187                 if (orientation == Qt.Orientation.Horizontal && section < headers.length) { \r
188                         return headers[section];\r
189                 }\r
190                 return null;\r
191                 \r
192         }\r
193         \r
194         \r
195         @Override\r
196         public boolean setHeaderData(int section, Qt.Orientation orientation, Object value, int role) {\r
197                 if (orientation == Qt.Orientation.Horizontal && section < headers.length && role == Qt.ItemDataRole.DisplayRole) {\r
198                         headers[section] = value;\r
199                         headerDataChanged.emit(orientation, section, section);\r
200                         return true;\r
201                 }\r
202                 return false;\r
203         }\r
204 \r
205         \r
206         // Update a note title\r
207         public void updateNoteTitle(String guid, String title) {\r
208                 for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
209                         if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
210                                 getMasterNoteIndex().get(i).setTitle(title);\r
211                                 QModelIndex idx = createIndex(i, Global.noteTableTitlePosition, nativePointer());\r
212                                 setData(idx, title, Qt.ItemDataRole.EditRole); \r
213                                 i = getMasterNoteIndex().size();\r
214                         }       \r
215                 }\r
216                 // Update the list tables \r
217                 for (int i=0; i<getNoteIndex().size(); i++) {\r
218                         if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
219                                 getNoteIndex().get(i).setTitle(title);\r
220                                 i = getNoteIndex().size();\r
221                         }\r
222                 }\r
223         }\r
224         \r
225         // Update a note title\r
226         public void updateNoteTags(String guid, List<String> tags, List<String> names) {\r
227                 for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
228                         if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
229                                 getMasterNoteIndex().get(i).setTagGuids(tags);\r
230                                 getMasterNoteIndex().get(i).setTagNames(names);\r
231                                 String display = new String("");\r
232                                 Collections.sort(names);\r
233                                 for (int j=0; j<names.size(); j++) {\r
234                                         display = display+names.get(j);\r
235                                         if (j+2<names.size()) {\r
236                                                 display = display+Global.tagDelimeter+" ";\r
237                                         }\r
238                                 }\r
239                                 QModelIndex idx = createIndex(i, Global.noteTableTagPosition, nativePointer());\r
240                                 setData(idx, display, Qt.ItemDataRole.EditRole); \r
241                                 i = getMasterNoteIndex().size();\r
242                         }       \r
243                 }\r
244         }\r
245 \r
246         \r
247         public void updateNoteCreatedDate(String guid, QDateTime date) {\r
248                 \r
249                 for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
250                         if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
251                                 getMasterNoteIndex().get(i).setCreated((long)date.toTime_t()*1000);\r
252                                 QModelIndex idx = createIndex(i, Global.noteTableCreationPosition, nativePointer());\r
253                                 setData(idx, new Long(getMasterNoteIndex().get(i).getCreated()), Qt.ItemDataRole.EditRole); \r
254                                 i = getMasterNoteIndex().size();\r
255                         }       \r
256                 }\r
257                 \r
258                 // Update the list tables \r
259                 for (int i=0; i<getNoteIndex().size(); i++) {\r
260                         if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
261                                 getNoteIndex().get(i).setCreated((long)date.toTime_t()*1000);\r
262                                 i = getNoteIndex().size();\r
263                         }\r
264                 }\r
265         }\r
266         \r
267         public void updateNoteSubjectDate(String guid, QDateTime date) {\r
268                 \r
269                 for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
270                         if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
271                                 getMasterNoteIndex().get(i).getAttributes().setSubjectDate((long)date.toTime_t()*1000);\r
272                                 QModelIndex idx = createIndex(i, Global.noteTableSubjectDatePosition, nativePointer());\r
273                                 setData(idx, new Long(getMasterNoteIndex().get(i).getAttributes().getSubjectDate()), Qt.ItemDataRole.EditRole); \r
274                                 i = getMasterNoteIndex().size();\r
275                         }       \r
276                 }\r
277                 \r
278                 // Update the list tables \r
279                 for (int i=0; i<getNoteIndex().size(); i++) {\r
280                         if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
281                                 getNoteIndex().get(i).getAttributes().setSubjectDate((long)date.toTime_t()*1000);\r
282                                 i = getNoteIndex().size();\r
283                         }\r
284                 }\r
285         }\r
286         \r
287         public void updateNoteChangedDate(String guid, QDateTime date) {\r
288                 for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
289                         if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
290                                 getMasterNoteIndex().get(i).setUpdated((long)date.toTime_t()*1000);\r
291                                 QModelIndex idx = createIndex(i, Global.noteTableChangedPosition, nativePointer());\r
292                                 setData(idx, new Long(getMasterNoteIndex().get(i).getAttributes().getSubjectDate()), Qt.ItemDataRole.EditRole); \r
293                                 i = getMasterNoteIndex().size();\r
294                         }       \r
295                 }\r
296                 // Update the list tables \r
297                 for (int i=0; i<getNoteIndex().size(); i++) {\r
298                         if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
299                                 getNoteIndex().get(i).setUpdated((long)date.toTime_t()*1000);\r
300                                 i = getNoteIndex().size();\r
301                         }\r
302                 }\r
303         }\r
304 \r
305         public void updateNoteGuid(String oldGuid, String newGuid) {\r
306                 for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
307                         if (getMasterNoteIndex().get(i).getGuid() != null && getMasterNoteIndex().get(i).getGuid().equals(oldGuid)) {\r
308                                 getMasterNoteIndex().get(i).setGuid(newGuid);\r
309                                 QModelIndex idx = createIndex(i, Global.noteTableGuidPosition, nativePointer());\r
310                                 setData(idx, new String(getMasterNoteIndex().get(i).getGuid()), Qt.ItemDataRole.EditRole); \r
311                                 i=getMasterNoteIndex().size()+1;\r
312                         }\r
313                 }\r
314                 for (int i=0; i<getNoteIndex().size(); i++) {\r
315                         if (getNoteIndex().get(i).getGuid() != null && getNoteIndex().get(i).getGuid().equals(oldGuid)) {\r
316                                 getNoteIndex().get(i).setGuid(newGuid);; \r
317                                 i=getNoteIndex().size()+1;\r
318                         }\r
319                 }\r
320         }\r
321         \r
322         public void updateNoteNotebook(String guid, String notebookGuid) {\r
323                 for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
324                         if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
325                                 getMasterNoteIndex().get(i).setNotebookGuid(notebookGuid);\r
326                                 for (int j=0; j<listManager.getNotebookIndex().size(); j++) {\r
327                                         if (listManager.getNotebookIndex().get(j).getGuid().equals(notebookGuid)) {\r
328                                                 String name = listManager.getNotebookIndex().get(j).getName();\r
329                                                 QModelIndex idx = createIndex(i, Global.noteTableNotebookPosition, nativePointer());\r
330                                                 setData(idx, name, Qt.ItemDataRole.EditRole); \r
331                                                 j=listManager.getNotebookIndex().size();\r
332                                         }\r
333                                 }\r
334                                 i=getMasterNoteIndex().size();\r
335                         }\r
336                 }\r
337                 for (int i=0; i<getNoteIndex().size(); i++) {\r
338                         if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
339                                 getNoteIndex().get(i).setNotebookGuid(notebookGuid);\r
340                                 i=getNoteIndex().size();\r
341                         }\r
342                 }\r
343         }\r
344 \r
345         public void updateNoteAuthor(String guid, String author) {\r
346                 for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
347                         if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
348                                 getMasterNoteIndex().get(i).getAttributes().setAuthor(author);\r
349                                 getMasterNoteIndex().get(i).getAttributes().setAltitudeIsSet(true);\r
350                                 QModelIndex idx = createIndex(i, Global.noteTableAuthorPosition, nativePointer());\r
351                                 setData(idx, author, Qt.ItemDataRole.EditRole); \r
352                                 i = getMasterNoteIndex().size();\r
353                         }       \r
354                 }\r
355                 // Update the list tables \r
356                 for (int i=0; i<getNoteIndex().size(); i++) {\r
357                         if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
358                                 getNoteIndex().get(i).getAttributes().setAuthor(author);\r
359                                 getNoteIndex().get(i).getAttributes().setAuthorIsSet(true);\r
360                                 i = getNoteIndex().size();\r
361                         }\r
362                 }\r
363         }\r
364         \r
365         public void updateNoteSourceUrl(String guid, String url) {\r
366                 for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
367                         if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
368                                 getMasterNoteIndex().get(i).getAttributes().setSourceURL(url);\r
369                                 getMasterNoteIndex().get(i).getAttributes().setSourceURLIsSet(true);\r
370                                 QModelIndex idx = createIndex(i, Global.noteTableSourceUrlPosition, nativePointer());\r
371                                 setData(idx, url, Qt.ItemDataRole.EditRole); \r
372                                 i = getMasterNoteIndex().size();\r
373                         }       \r
374                 }\r
375                 // Update the list tables \r
376                 for (int i=0; i<getNoteIndex().size(); i++) {\r
377                         if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
378                                 getNoteIndex().get(i).getAttributes().setSourceURL(url);\r
379                                 getNoteIndex().get(i).getAttributes().setSourceURLIsSet(true);\r
380                                 i = getNoteIndex().size();\r
381                         }\r
382                 }\r
383         }\r
384 \r
385         public void updateNoteSyncStatus(String guid, boolean sync) {\r
386                 \r
387                 boolean found = false;\r
388                 for (int i=0; i<unsynchronizedNotes.size(); i++) {                      \r
389                         // If the note is now synchronized, but it is in the unsynchronized list, remove it\r
390                         if (unsynchronizedNotes.get(i).equalsIgnoreCase(guid) && sync) {\r
391                                 unsynchronizedNotes.remove(i);\r
392                                 found = true;\r
393                                 i=unsynchronizedNotes.size();\r
394                         }\r
395                         \r
396                         // If the note is not synchronized, but it is already in the unsynchronized list, do nothing\r
397                         if (unsynchronizedNotes.get(i).equalsIgnoreCase(guid) && sync) {\r
398                                 found = true;\r
399                                 i=unsynchronizedNotes.size();\r
400                         }\r
401                 }\r
402                 \r
403                 // If we've gotten through the entire list, then we consider it synchronized.  If this is \r
404                 // wrong, add it to the list.\r
405                 if (!sync && !found) \r
406                         unsynchronizedNotes.add(guid);\r
407                 \r
408                 // Now we need to go through the table & update it\r
409                 for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
410                         if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
411                                 QModelIndex idx = createIndex(i, Global.noteTableSynchronizedPosition, nativePointer());\r
412                                 String value;\r
413                                 if (!sync)\r
414                                         value = tr("false");\r
415                                 else\r
416                                         value = tr("true");\r
417                                 setData(idx, value, Qt.ItemDataRole.EditRole); \r
418                                 return;\r
419                         }       \r
420                 }\r
421         }\r
422         \r
423         public void addNote(Note n) {\r
424                 getNoteIndex().add(n);\r
425                 getMasterNoteIndex().add(n);\r
426                 proxyModel.addGuid(n.getGuid());\r
427                 proxyModel.invalidate();\r
428 //              proxyModel.filter();\r
429         }\r
430         \r
431         \r
432         @Override\r
433         public boolean setData(QModelIndex index, Object value,int role) {\r
434                 if (role == Qt.ItemDataRole.EditRole) {\r
435                         dataChanged.emit(index, index);\r
436                         return true;\r
437                 } else {\r
438                         return super.setData(index, value, role);\r
439                 }\r
440         }\r
441         \r
442         public void updateNoteTitleColor(String guid, Integer color) {\r
443                 getTitleColors().remove(guid);\r
444                 getTitleColors().put(guid, color);\r
445                 layoutChanged.emit();\r
446         }\r
447 \r
448         @Override\r
449         public Qt.ItemFlags flags(QModelIndex index) {\r
450                 Qt.ItemFlag flags[] = { Qt.ItemFlag.ItemIsEnabled, \r
451                                                                 Qt.ItemFlag.ItemIsDragEnabled,\r
452                                                                 Qt.ItemFlag.ItemIsSelectable };\r
453                 \r
454                 return new Qt.ItemFlags(flags);\r
455         }\r
456         \r
457 }\r