1 package cx.fbn.nevernote.gui;
\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
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
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
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
33 public NoteTableModel(ListManager m) {
\r
34 headers = new Object[Global.noteTableColumnCount];
\r
36 masterNoteIndex = null;
\r
37 metaData = new HashMap<String,NoteMetadata>();
\r
40 public List<Note> getNoteIndex() {
\r
43 public void setNoteIndex(List<Note> list) {
\r
46 public List<Note> getMasterNoteIndex() {
\r
47 return masterNoteIndex;
\r
49 public void setMasterNoteIndex(List<Note> list) {
\r
50 masterNoteIndex = list;
\r
52 public void setSortProxyModel(NoteSortFilterProxyModel m) {
\r
56 public void setNoteMetadata(HashMap<String, NoteMetadata> list) {
\r
62 public int columnCount(QModelIndex arg0) {
\r
63 return Global.noteTableColumnCount;
\r
67 public Object data(QModelIndex index, int role) {
\r
71 case Qt.ItemDataRole.DisplayRole: {
\r
72 return valueAt(index.row(), index.column());
\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
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
89 return backgroundColor;
\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
101 return foregroundColor;
\r
110 public int rowCount(QModelIndex arg0) {
\r
111 if (listManager != null && listManager.getMasterNoteIndex() != null)
\r
112 return listManager.getMasterNoteIndex().size();
\r
118 private Object valueAt(int row, int col) {
\r
119 Note note = listManager.getMasterNoteIndex().get(row);
\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
131 return note.getCreated();
\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
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
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
163 while (tagNames.size() > 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
173 tags = tags + tagNames.get(position);
\r
174 tagNames.remove(position);
\r
175 if (tagNames.size() > 0)
\r
176 tags = tags + ", ";
\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
186 if (col == Global.noteTableGuidPosition) {
\r
187 return note.getGuid();
\r
189 if (col == Global.noteTableThumbnailPosition) {
\r
190 if (!Global.enableThumbnails())
\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
196 return img.scaled(Global.smallThumbnailSize,
\r
197 AspectRatioMode.KeepAspectRatio, TransformationMode.SmoothTransformation);
\r
202 QImage img = listManager.getThumbnail(note.getGuid());
\r
204 return img.scaled(Global.largeThumbnailSize,
\r
205 AspectRatioMode.KeepAspectRatio, TransformationMode.SmoothTransformation);
\r
216 public java.lang.Object headerData(int section, Qt.Orientation orientation, int role) {
\r
217 if (role != Qt.ItemDataRole.DisplayRole)
\r
220 if (orientation == Qt.Orientation.Horizontal && section < headers.length) {
\r
221 return headers[section];
\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
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
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
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
272 QModelIndex idx = createIndex(i, Global.noteTableTagPosition, nativePointer());
\r
273 setData(idx, display, Qt.ItemDataRole.EditRole);
\r
274 i = getMasterNoteIndex().size();
\r
280 public void updateNoteCreatedDate(String guid, QDateTime date) {
\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
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
300 public void updateNoteSubjectDate(String guid, QDateTime date) {
\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
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
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
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
338 public void updateNoteGuid(String oldGuid, String newGuid) {
\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
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
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
372 i=getMasterNoteIndex().size();
\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
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
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
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
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
423 public void updateNoteSyncStatus(String guid, boolean sync) {
\r
425 if (metaData.containsKey(guid))
\r
426 metaData.get(guid).setDirty(!sync);
\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
434 value = tr("false");
\r
436 value = tr("true");
\r
437 setData(idx, value, Qt.ItemDataRole.EditRole);
\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
449 if (metaData.containsKey(guid));
\r
450 metaData.get(guid).setPinned(pinned);
\r
452 value = tr("true");
\r
454 value = tr("false");
\r
455 setData(idx, value, Qt.ItemDataRole.EditRole);
\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
472 public boolean setData(QModelIndex index, Object value,int role) {
\r
473 if (role == Qt.ItemDataRole.EditRole) {
\r
474 dataChanged.emit(index, index);
\r
477 return super.setData(index, value, role);
\r
481 public void setMetaData(HashMap<String, NoteMetadata> h) {
\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
491 return new Qt.ItemFlags(flags);
\r
494 public void updateNoteTitleColor(String guid, int color) {
\r
495 NoteMetadata m = metaData.get(guid);
\r
497 m = new NoteMetadata();
\r
499 metaData.put(guid, m);
\r
501 if (metaData.containsKey(guid) && metaData.get(guid).getColor() != color) {
\r
502 metaData.get(guid).setColor(color);
\r
503 layoutChanged.emit();
\r