OSDN Git Service

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