OSDN Git Service

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