package cx.fbn.nevernote.gui; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import com.evernote.edam.type.Note; import com.trolltech.qt.core.QDateTime; import com.trolltech.qt.core.QModelIndex; import com.trolltech.qt.core.Qt; import com.trolltech.qt.core.Qt.AspectRatioMode; import com.trolltech.qt.core.Qt.TransformationMode; import com.trolltech.qt.gui.QAbstractTableModel; import com.trolltech.qt.gui.QColor; import com.trolltech.qt.gui.QIcon; import com.trolltech.qt.gui.QImage; import com.trolltech.qt.gui.QPixmap; import cx.fbn.nevernote.Global; import cx.fbn.nevernote.evernote.NoteMetadata; import cx.fbn.nevernote.filters.NoteSortFilterProxyModel; import cx.fbn.nevernote.utilities.ListManager; public class NoteTableModel extends QAbstractTableModel { private final ListManager listManager; private final Object[] headers; private List<Note> noteIndex; private List<Note> masterNoteIndex; public HashMap<String,NoteMetadata> metaData; public NoteSortFilterProxyModel proxyModel; // note sort model public NoteTableModel(ListManager m) { headers = new Object[Global.noteTableColumnCount]; listManager = m; masterNoteIndex = null; metaData = new HashMap<String,NoteMetadata>(); } public List<Note> getNoteIndex() { return noteIndex; } public void setNoteIndex(List<Note> list) { noteIndex = list; } public List<Note> getMasterNoteIndex() { return masterNoteIndex; } public void setMasterNoteIndex(List<Note> list) { masterNoteIndex = list; } public void setSortProxyModel(NoteSortFilterProxyModel m) { proxyModel = m; } public void setNoteMetadata(HashMap<String, NoteMetadata> list) { metaData = list; } @Override public int columnCount(QModelIndex arg0) { return Global.noteTableColumnCount; } @Override public Object data(QModelIndex index, int role) { if (index == null) return null; switch (role) { case Qt.ItemDataRole.DisplayRole: { return valueAt(index.row(), index.column()); } case Qt.ItemDataRole.DecorationRole: { if (index.column() == Global.noteTableThumbnailPosition || index.column() == Global.noteTableSynchronizedPosition || index.column() == Global.noteTablePinnedPosition) return valueAt(index.row(), index.column()); else return null; } case Qt.ItemDataRole.BackgroundRole: { String guid = (String)valueAt(index.row(), Global.noteTableGuidPosition); QColor backgroundColor = new QColor(QColor.white); if (metaData != null && metaData.containsKey(guid)) { int color = metaData.get(guid).getColor(); backgroundColor.setRgb(color); } return backgroundColor; } case Qt.ItemDataRole.ForegroundRole: { String guid = (String)valueAt(index.row(), Global.noteTableGuidPosition); QColor backgroundColor = new QColor(QColor.white); QColor foregroundColor = new QColor(QColor.black); if (metaData != null && metaData.containsKey(guid)) { int color = metaData.get(guid).getColor(); backgroundColor.setRgb(color); if (backgroundColor.rgb() == QColor.black.rgb() || backgroundColor.rgb() == QColor.blue.rgb()) foregroundColor.setRgb(QColor.white.rgb()); } return foregroundColor; } default: break; } return null; } @Override public int rowCount(QModelIndex arg0) { if (listManager != null && listManager.getMasterNoteIndex() != null) return listManager.getMasterNoteIndex().size(); else return 0; } private Object valueAt(int row, int col) { Note note = listManager.getMasterNoteIndex().get(row); if (col == Global.noteTableGuidPosition) return note.getGuid(); if (col == Global.noteTableCreationPosition) return note.getCreated(); if (col == Global.noteTableChangedPosition) return note.getUpdated(); if (col == Global.noteTableSubjectDatePosition) { if (note.getAttributes().getSubjectDate() > 0) return note.getAttributes().getSubjectDate(); else return note.getCreated(); } if (col == Global.noteTableTitlePosition) return note.getTitle(); if (col == Global.noteTableAuthorPosition) return note.getAttributes().getAuthor(); if (col == Global.noteTableSourceUrlPosition) return note.getAttributes().getSourceURL(); if (col == Global.noteTableSynchronizedPosition) { String iconPath = new String("classpath:cx/fbn/nevernote/icons/"); QIcon dotIcon = new QIcon(iconPath+"dot.png"); String guid = note.getGuid(); if (metaData.containsKey(guid) && metaData.get(guid).isDirty()) return dotIcon; return null; } if (col == Global.noteTablePinnedPosition) { String guid = note.getGuid(); if (metaData.containsKey(guid) && metaData.get(guid).isPinned()) { String iconPath = new String("classpath:cx/fbn/nevernote/icons/"); QIcon dotIcon = new QIcon(iconPath+"dot.png"); return dotIcon; } return null; } if (col == Global.noteTableTagPosition) { String tags = new String(); List<String> tagNames = new ArrayList<String>(); for (int i=0; i<note.getTagNamesSize(); i++) { tagNames.add(note.getTagNames().get(i)); } while (tagNames.size() > 0) { int position = 0; for (int i=0; i<tagNames.size()-1; i++) { String name1 = tagNames.get(i); String name2 = tagNames.get(i+1); if (name1.compareTo(name2) > 0) { position = i+1; } } tags = tags + tagNames.get(position); tagNames.remove(position); if (tagNames.size() > 0) tags = tags + ", "; } return tags; } if (col == Global.noteTableNotebookPosition) { for (int i=0; i<listManager.getNotebookIndex().size(); i++) { if (listManager.getNotebookIndex().get(i).getGuid().equals(note.getNotebookGuid())) return listManager.getNotebookIndex().get(i).getName(); } } if (col == Global.noteTableGuidPosition) { return note.getGuid(); } if (col == Global.noteTableThumbnailPosition) { if (!Global.enableThumbnails()) return null; if (Global.getListView() == Global.View_List_Wide) { // QImage img = listManager.getThumbnail(note.getGuid()); QPixmap img = listManager.getThumbnailPixmap(note.getGuid()); if (img != null) return img.scaled(Global.smallThumbnailSize, AspectRatioMode.KeepAspectRatio, TransformationMode.SmoothTransformation); else return null; } else { QImage img = listManager.getThumbnail(note.getGuid()); if (img != null) return img.scaled(Global.largeThumbnailSize, AspectRatioMode.KeepAspectRatio, TransformationMode.SmoothTransformation); else return null; } } return ""; } @Override public java.lang.Object headerData(int section, Qt.Orientation orientation, int role) { if (role != Qt.ItemDataRole.DisplayRole) return null; if (orientation == Qt.Orientation.Horizontal && section < headers.length && section >=0) { return headers[section]; } return null; } @Override public boolean setHeaderData(int section, Qt.Orientation orientation, Object value, int role) { if (orientation == Qt.Orientation.Horizontal && section < headers.length && role == Qt.ItemDataRole.DisplayRole) { headers[section] = value; headerDataChanged.emit(orientation, section, section); return true; } return false; } // Update a note title public void updateNoteTitle(String guid, String title) { for (int i=0; i<getMasterNoteIndex().size(); i++) { if (getMasterNoteIndex().get(i).getGuid().equals(guid)) { getMasterNoteIndex().get(i).setTitle(title); QModelIndex idx = createIndex(i, Global.noteTableTitlePosition, nativePointer()); setData(idx, title, Qt.ItemDataRole.EditRole); i = getMasterNoteIndex().size(); } } // Update the list tables for (int i=0; i<getNoteIndex().size(); i++) { if (getNoteIndex().get(i).getGuid().equals(guid)) { getNoteIndex().get(i).setTitle(title); i = getNoteIndex().size(); } } } // Update a note title public void updateNoteTags(String guid, List<String> tags, List<String> names) { for (int i=0; i<getMasterNoteIndex().size(); i++) { if (getMasterNoteIndex().get(i).getGuid().equals(guid)) { getMasterNoteIndex().get(i).setTagGuids(tags); getMasterNoteIndex().get(i).setTagNames(names); String display = new String(""); Collections.sort(names); for (int j=0; j<names.size(); j++) { display = display+names.get(j); if (j+2<names.size()) { display = display+Global.tagDelimeter+" "; } } QModelIndex idx = createIndex(i, Global.noteTableTagPosition, nativePointer()); setData(idx, display, Qt.ItemDataRole.EditRole); i = getMasterNoteIndex().size(); } } } public void updateNoteCreatedDate(String guid, QDateTime date) { for (int i=0; i<getMasterNoteIndex().size(); i++) { if (getMasterNoteIndex().get(i).getGuid().equals(guid)) { getMasterNoteIndex().get(i).setCreated((long)date.toTime_t()*1000); QModelIndex idx = createIndex(i, Global.noteTableCreationPosition, nativePointer()); setData(idx, new Long(getMasterNoteIndex().get(i).getCreated()), Qt.ItemDataRole.EditRole); i = getMasterNoteIndex().size(); } } // Update the list tables for (int i=0; i<getNoteIndex().size(); i++) { if (getNoteIndex().get(i).getGuid().equals(guid)) { getNoteIndex().get(i).setCreated((long)date.toTime_t()*1000); i = getNoteIndex().size(); } } } public void updateNoteSubjectDate(String guid, QDateTime date) { for (int i=0; i<getMasterNoteIndex().size(); i++) { if (getMasterNoteIndex().get(i).getGuid().equals(guid)) { getMasterNoteIndex().get(i).getAttributes().setSubjectDate((long)date.toTime_t()*1000); QModelIndex idx = createIndex(i, Global.noteTableSubjectDatePosition, nativePointer()); setData(idx, new Long(getMasterNoteIndex().get(i).getAttributes().getSubjectDate()), Qt.ItemDataRole.EditRole); i = getMasterNoteIndex().size(); } } // Update the list tables for (int i=0; i<getNoteIndex().size(); i++) { if (getNoteIndex().get(i).getGuid().equals(guid)) { getNoteIndex().get(i).getAttributes().setSubjectDate((long)date.toTime_t()*1000); i = getNoteIndex().size(); } } } public void updateNoteChangedDate(String guid, QDateTime date) { for (int i=0; i<getMasterNoteIndex().size(); i++) { if (getMasterNoteIndex().get(i).getGuid().equals(guid)) { getMasterNoteIndex().get(i).setUpdated((long)date.toTime_t()*1000); QModelIndex idx = createIndex(i, Global.noteTableChangedPosition, nativePointer()); setData(idx, new Long(getMasterNoteIndex().get(i).getAttributes().getSubjectDate()), Qt.ItemDataRole.EditRole); i = getMasterNoteIndex().size(); } } // Update the list tables for (int i=0; i<getNoteIndex().size(); i++) { if (getNoteIndex().get(i).getGuid().equals(guid)) { getNoteIndex().get(i).setUpdated((long)date.toTime_t()*1000); i = getNoteIndex().size(); } } } public void updateNoteGuid(String oldGuid, String newGuid) { for (int i=0; i<getNoteIndex().size(); i++) { if (getNoteIndex().get(i).getGuid() != null && getNoteIndex().get(i).getGuid().equals(oldGuid)) { getNoteIndex().get(i).setGuid(newGuid);; i=getNoteIndex().size()+1; } } boolean k = true; if (k) return; for (int i=0; i<getMasterNoteIndex().size(); i++) { if (getMasterNoteIndex().get(i).getGuid() != null && getMasterNoteIndex().get(i).getGuid().equals(oldGuid)) { getMasterNoteIndex().get(i).setGuid(newGuid); // QModelIndex idx = createIndex(i, Global.noteTableGuidPosition, nativePointer()); // setData(idx, new String(getMasterNoteIndex().get(i).getGuid()), Qt.ItemDataRole.EditRole); i=getMasterNoteIndex().size()+1; } } } public void updateNoteNotebook(String guid, String notebookGuid) { for (int i=0; i<getMasterNoteIndex().size(); i++) { if (getMasterNoteIndex().get(i).getGuid().equals(guid)) { getMasterNoteIndex().get(i).setNotebookGuid(notebookGuid); for (int j=0; j<listManager.getNotebookIndex().size(); j++) { if (listManager.getNotebookIndex().get(j).getGuid().equals(notebookGuid)) { String name = listManager.getNotebookIndex().get(j).getName(); QModelIndex idx = createIndex(i, Global.noteTableNotebookPosition, nativePointer()); setData(idx, name, Qt.ItemDataRole.EditRole); j=listManager.getNotebookIndex().size(); } } i=getMasterNoteIndex().size(); } } for (int i=0; i<getNoteIndex().size(); i++) { if (getNoteIndex().get(i).getGuid().equals(guid)) { getNoteIndex().get(i).setNotebookGuid(notebookGuid); i=getNoteIndex().size(); } } } public void updateNoteAuthor(String guid, String author) { for (int i=0; i<getMasterNoteIndex().size(); i++) { if (getMasterNoteIndex().get(i).getGuid().equals(guid)) { getMasterNoteIndex().get(i).getAttributes().setAuthor(author); getMasterNoteIndex().get(i).getAttributes().setAltitudeIsSet(true); QModelIndex idx = createIndex(i, Global.noteTableAuthorPosition, nativePointer()); setData(idx, author, Qt.ItemDataRole.EditRole); i = getMasterNoteIndex().size(); } } // Update the list tables for (int i=0; i<getNoteIndex().size(); i++) { if (getNoteIndex().get(i).getGuid().equals(guid)) { getNoteIndex().get(i).getAttributes().setAuthor(author); getNoteIndex().get(i).getAttributes().setAuthorIsSet(true); i = getNoteIndex().size(); } } } public void updateNoteSourceUrl(String guid, String url) { for (int i=0; i<getMasterNoteIndex().size(); i++) { if (getMasterNoteIndex().get(i).getGuid().equals(guid)) { getMasterNoteIndex().get(i).getAttributes().setSourceURL(url); getMasterNoteIndex().get(i).getAttributes().setSourceURLIsSet(true); QModelIndex idx = createIndex(i, Global.noteTableSourceUrlPosition, nativePointer()); setData(idx, url, Qt.ItemDataRole.EditRole); i = getMasterNoteIndex().size(); } } // Update the list tables for (int i=0; i<getNoteIndex().size(); i++) { if (getNoteIndex().get(i).getGuid().equals(guid)) { getNoteIndex().get(i).getAttributes().setSourceURL(url); getNoteIndex().get(i).getAttributes().setSourceURLIsSet(true); i = getNoteIndex().size(); } } } public void updateNoteSyncStatus(String guid, boolean sync) { if (metaData.containsKey(guid)) metaData.get(guid).setDirty(!sync); // Now we need to go through the table & update it for (int i=0; i<getMasterNoteIndex().size(); i++) { if (getMasterNoteIndex().get(i).getGuid().equals(guid)) { QModelIndex idx = createIndex(i, Global.noteTableSynchronizedPosition, nativePointer()); String value; if (!sync) value = tr("false"); else value = tr("true"); setData(idx, value, Qt.ItemDataRole.EditRole); return; } } } public void updateNotePinnedStatus(String guid, boolean pinned) { // Now we need to go through the table & update it for (int i=0; i<getMasterNoteIndex().size(); i++) { if (getMasterNoteIndex().get(i).getGuid().equals(guid)) { QModelIndex idx = createIndex(i, Global.noteTablePinnedPosition, nativePointer()); String value; if (metaData.containsKey(guid)); metaData.get(guid).setPinned(pinned); if (pinned) value = tr("true"); else value = tr("false"); setData(idx, value, Qt.ItemDataRole.EditRole); return; } } } public void addNote(Note n, NoteMetadata meta) { getNoteIndex().add(n); getMasterNoteIndex().add(n); proxyModel.addGuid(n.getGuid(), meta); proxyModel.invalidate(); // proxyModel.filter(); } @Override public boolean setData(QModelIndex index, Object value,int role) { if (role == Qt.ItemDataRole.EditRole) { dataChanged.emit(index, index); return true; } else { return super.setData(index, value, role); } } public void setMetaData(HashMap<String, NoteMetadata> h) { metaData = h; } @Override public Qt.ItemFlags flags(QModelIndex index) { Qt.ItemFlag flags[] = { Qt.ItemFlag.ItemIsEnabled, Qt.ItemFlag.ItemIsDragEnabled, Qt.ItemFlag.ItemIsSelectable }; return new Qt.ItemFlags(flags); } public void updateNoteTitleColor(String guid, int color) { NoteMetadata m = metaData.get(guid); if (m == null) { m = new NoteMetadata(); m.setGuid(guid); metaData.put(guid, m); } if (metaData.containsKey(guid) && metaData.get(guid).getColor() != color) { metaData.get(guid).setColor(color); layoutChanged.emit(); } } }