public static int noteTableSubjectDatePosition = 8;\r
public static int noteTableSynchronizedPosition = 9;\r
public static int noteTableThumbnailPosition = 10;\r
- public static int noteTableColumnCount = 11;\r
+ public static int noteTablePinnedPosition = 11;\r
+ public static int noteTableColumnCount = 12;\r
public static Integer cryptCounter = 0;\r
\r
//public static int minimumWordCount = 2;\r
import cx.fbn.nevernote.dialog.ThumbnailViewer;
import cx.fbn.nevernote.dialog.UpgradeAvailableDialog;
import cx.fbn.nevernote.dialog.WatchFolder;
+import cx.fbn.nevernote.evernote.NoteMetadata;
import cx.fbn.nevernote.filters.FilterEditorNotebooks;
import cx.fbn.nevernote.filters.FilterEditorTags;
import cx.fbn.nevernote.gui.AttributeTreeWidget;
noteTableView.setNoteDuplicateAction(menuBar.noteDuplicateAction);
noteTableView.setNoteHistoryAction(menuBar.noteOnlineHistoryAction);
noteTableView.noteSignal.titleColorChanged.connect(this, "titleColorChanged(Integer)");
+ noteTableView.noteSignal.notePinned.connect(this, "notePinned()");
noteTableView.setMergeNotesAction(menuBar.noteMergeAction);
noteTableView.setCopyAsUrlAction(menuBar.noteCopyAsUrlAction);
noteTableView.doubleClicked.connect(this, "listDoubleClick()");
Global.setColumnPosition("noteTableGuidPosition", position);
position = noteTableView.header.visualIndex(Global.noteTableThumbnailPosition);
Global.setColumnPosition("noteTableThumbnailPosition", position);
+ position = noteTableView.header.visualIndex(Global.noteTablePinnedPosition);
+ Global.setColumnPosition("noteTablePinnedPosition", position);
}
// Save column widths for the next time
// Title color has changed
@SuppressWarnings("unused")
private void titleColorChanged(Integer color) {
- logger.log(logger.HIGH, "Entering NeverNote.updateListAuthor");
+ logger.log(logger.HIGH, "Entering NeverNote.titleColorChanged");
QColor backgroundColor = new QColor();
QColor foregroundColor = new QColor(QColor.black);
}
}
}
- logger.log(logger.HIGH, "Leaving NeverNote.updateListAuthor");
+ logger.log(logger.HIGH, "Leaving NeverNote.titleColorChanged");
+ }
+ // A note has been pinned or unpinned
+ private void notePinned() {
+ logger.log(logger.EXTREME, "Entering NeverNote.notePinned()");
+
+ for (int j=0; j<selectedNoteGUIDs.size(); j++) {
+ NoteMetadata meta = listManager.getNoteMetadata().get(selectedNoteGUIDs.get(j));
+ boolean pinned = !meta.isPinned();
+ meta.setPinned(pinned); // Toggle the pinned/unpinned
+
+ // Update the list & table
+ listManager.updateNoteMetadata(meta);
+ noteTableView.proxyModel.addGuid(selectedNoteGUIDs.get(j), meta);
+ }
+
+ logger.log(logger.EXTREME, "Leaving NeverNote.setNoteDirty()");
}
// Wide list was chosen
public void narrowListView() {
// Set the note as dirty and check if its status is synchronized in the display table
noteDirty = true;
- for (int i=0; i<listManager.getUnsynchronizedNotes().size(); i++) {
- if (listManager.getUnsynchronizedNotes().get(i).equals(currentNoteGuid))
+ if (listManager.getNoteMetadata().containsKey(currentNoteGuid) &&
+ listManager.getNoteMetadata().get(currentNoteGuid).isDirty()) {
return;
}
// If this wasn't already marked as unsynchronized, then we need to update the table
listManager.getNoteTableModel().updateNoteSyncStatus(currentNoteGuid, false);
-/* listManager.getUnsynchronizedNotes().add(currentNoteGuid);
+// listManager.getUnsynchronizedNotes().add(currentNoteGuid);
for (int i=0; i<listManager.getNoteTableModel().rowCount(); i++) {
QModelIndex modelIndex = listManager.getNoteTableModel().index(i, Global.noteTableGuidPosition);
if (modelIndex != null) {
SortedMap<Integer, Object> ix = listManager.getNoteTableModel().itemData(modelIndex);
String tableGuid = (String)ix.values().toArray()[0];
if (tableGuid.equals(currentNoteGuid)) {
- listManager.getNoteTableModel().setData(i, Global.noteTableSynchronizedPosition, "false");
+ listManager.getNoteTableModel().proxyModel.setData(i, Global.noteTableSynchronizedPosition, "false");
return;
}
}
}
- */
+
logger.log(logger.EXTREME, "Leaving NeverNote.setNoteDirty()");
}
@SuppressWarnings("unused")
}
conn.getNoteTable().addNote(newNote, true);
- listManager.getUnsynchronizedNotes().add(newNote.getGuid());
- listManager.addNote(newNote);
+ NoteMetadata metadata = new NoteMetadata();
+ metadata.setGuid(newNote.getGuid());
+ metadata.setDirty(true);
+ listManager.addNote(newNote, metadata);
// noteTableView.insertRow(newNote, true, -1);
currentNote = newNote;
for (int i=0; i<listManager.getNoteIndex().size(); i++) {
if (listManager.getNoteIndex().get(i).getGuid().equals(newGuid)) {
- noteTableView.proxyModel.addGuid(newGuid);
+ noteTableView.proxyModel.addGuid(newGuid, listManager.getNoteMetadata().get(newGuid));
i=listManager.getNoteIndex().size();
}
}
- if (listManager.getNoteTableModel().titleColors.containsKey(oldGuid)) {
- int color = listManager.getNoteTableModel().titleColors.get(oldGuid);
- listManager.getNoteTableModel().titleColors.put(newGuid, color);
- listManager.getNoteTableModel().titleColors.remove(oldGuid);
+ if (listManager.getNoteTableModel().metaData.containsKey(oldGuid)) {
+ NoteMetadata meta = listManager.getNoteTableModel().metaData.get(oldGuid);
+ listManager.getNoteTableModel().metaData.put(newGuid, meta);
+ listManager.getNoteTableModel().metaData.remove(oldGuid);
}
}
newNote.setResources(resList);
// Add note to the database
- listManager.addNote(newNote);
conn.getNoteTable().addNote(newNote, true);
- listManager.getUnsynchronizedNotes().add(newNote.getGuid());
- noteTableView.insertRow(newNote, true, -1);
+ NoteMetadata metaData = new NoteMetadata();
+ NoteMetadata oldMeta = listManager.getNoteMetadata().get(oldNote.getGuid());
+ metaData.copy(oldMeta);
+ metaData.setGuid(newNote.getGuid());
+ listManager.addNote(newNote, metaData);
+ noteTableView.insertRow(newNote, metaData, true, -1);
currentNoteGuid = newNote.getGuid();
currentNote = newNote;
refreshEvernoteNote(true);
n.getResources().get(i).setActive(true);
conn.getNoteTable().noteResourceTable.saveNoteResource(n.getResources().get(i), true);
}
- listManager.addNote(n);
+ NoteMetadata metadata = new NoteMetadata();
+ metadata.setGuid(n.getGuid());
+ listManager.addNote(n, metadata);
conn.getNoteTable().addNote(n, true);
refreshEvernoteNote(true);
setMessage(tr("Note has been restored."));
if (currentNote == null) {
currentNote = conn.getNoteTable().getNote(currentNoteGuid, false, false, false, false, true);
}
- listManager.setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());
+ listManager.refreshNoteMetadata();
noteIndexUpdated(false);
noteTableView.selectionModel().blockSignals(true);
scrollToGuid(currentNoteGuid);
Note newNote = importer.getNote();
newNote.setNotebookGuid(notebook);
newNote.setTitle(dir.at(i));
- listManager.addNote(newNote);
+ NoteMetadata metadata = new NoteMetadata();
+ metadata.setDirty(true);
+ metadata.setGuid(newNote.getGuid());
+ listManager.addNote(newNote, metadata);
conn.getNoteTable().addNote(newNote, true);
- listManager.getUnsynchronizedNotes().add(newNote.getGuid());
- noteTableView.insertRow(newNote, true, -1);
+ noteTableView.insertRow(newNote, metadata, true, -1);
listManager.updateNoteContent(newNote.getGuid(), importer.getNoteContent());
listManager.countNotebookResults(listManager.getNoteIndex());
importedFiles.add(list.get(i).absoluteFilePath());
Note newNote = importer.getNote();
newNote.setNotebookGuid(notebook);
newNote.setTitle(dir.at(i));
- listManager.addNote(newNote);
+ NoteMetadata metadata = new NoteMetadata();
+ metadata.setDirty(true);
+ metadata.setGuid(newNote.getGuid());
+ listManager.addNote(newNote, metadata);
conn.getNoteTable().addNote(newNote, true);
- listManager.getUnsynchronizedNotes().add(newNote.getGuid());
- noteTableView.insertRow(newNote, true, -1);
+ noteTableView.insertRow(newNote, metadata, true, -1);
listManager.updateNoteContent(newNote.getGuid(), importer.getNoteContent());
listManager.countNotebookResults(listManager.getNoteIndex());
dir.remove(dir.at(i));
\r
package cx.fbn.nevernote.filters;\r
\r
-import java.util.TreeSet;\r
+import java.util.HashMap;\r
\r
import com.trolltech.qt.core.QAbstractItemModel;\r
import com.trolltech.qt.core.QModelIndex;\r
import com.trolltech.qt.gui.QSortFilterProxyModel;\r
\r
import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
\r
public class NoteSortFilterProxyModel extends QSortFilterProxyModel {\r
- private final TreeSet<String> guids;\r
+ private final HashMap<String, NoteMetadata> guids;\r
+ private final HashMap<String, NoteMetadata> pinnedGuids;\r
public Signal2<Integer,Integer> sortChanged;\r
public boolean blocked;\r
\r
public NoteSortFilterProxyModel(QObject parent) {\r
super(parent);\r
- guids = new TreeSet<String>();\r
+ guids = new HashMap<String, NoteMetadata>();\r
+ pinnedGuids = new HashMap<String, NoteMetadata>();\r
setDynamicSortFilter(true);\r
sortChanged = new Signal2<Integer,Integer>();\r
-// logger = new ApplicationLogger("filter.log");\r
}\r
public void clear() {\r
guids.clear();\r
}\r
- public void addGuid(String guid) {\r
-// if (!guids.containsKey(guid))\r
- guids.add(guid);\r
+ public void addGuid(String guid, NoteMetadata meta) {\r
+ if (!guids.containsKey(guid))\r
+ guids.put(guid, meta);\r
+ if (meta.isPinned() == true && !pinnedGuids.containsKey(guid))\r
+ pinnedGuids.put(guid, meta);\r
}\r
public void filter() {\r
invalidateFilter();\r
}\r
@Override\r
protected boolean filterAcceptsRow(int sourceRow, QModelIndex sourceParent) {\r
- if (guids.size() == 0)\r
- return false;\r
QAbstractItemModel model = sourceModel();\r
QModelIndex guidIndex = sourceModel().index(sourceRow, Global.noteTableGuidPosition);\r
String guid = (String)model.data(guidIndex);\r
\r
- if (guids.contains(guid))\r
+ if (guids.containsKey(guid) || pinnedGuids.containsKey(guid))\r
return true;\r
else\r
return false;\r
// Check the note title\r
private void checkNoteTitle() {\r
String text = browser.page().currentFrame().toPlainText();\r
+ if (saveNoteTitle == null)\r
+ saveNoteTitle = new String();\r
if (saveNoteTitle.trim().equals("") || saveNoteTitle.trim().equals("Untitled Note")) {\r
int newLine = text.indexOf("\n");\r
if (newLine > 0) {\r
package cx.fbn.nevernote.gui;\r
\r
-import java.util.ArrayList;\r
import java.util.Collections;\r
import java.util.HashMap;\r
import java.util.List;\r
import com.trolltech.qt.gui.QPixmap;\r
\r
import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
import cx.fbn.nevernote.filters.NoteSortFilterProxyModel;\r
import cx.fbn.nevernote.utilities.ListManager;\r
\r
private final Object[] headers;\r
private List<Note> noteIndex;\r
private List<Note> masterNoteIndex;\r
- private List<String> unsynchronizedNotes;\r
- public HashMap<String,Integer> titleColors;\r
+ public HashMap<String,NoteMetadata> metaData;\r
public NoteSortFilterProxyModel proxyModel; // note sort model\r
\r
public NoteTableModel(ListManager m) {\r
headers = new Object[Global.noteTableColumnCount];\r
listManager = m;\r
masterNoteIndex = null;\r
- unsynchronizedNotes = new ArrayList<String>();\r
+ metaData = new HashMap<String,NoteMetadata>();\r
}\r
\r
public List<Note> getNoteIndex() {\r
proxyModel = m;\r
}\r
\r
- public List<String> getUnsynchronizedNotes() {\r
- return unsynchronizedNotes;\r
- }\r
- public void setUnsynchronizedNotes(List<String> list) {\r
- unsynchronizedNotes = list;\r
- }\r
- \r
- public HashMap<String, Integer> getTitleColors() {\r
- return titleColors;\r
- }\r
- public void setTitleColors(HashMap<String, Integer> map) {\r
- titleColors = map;\r
+ public void setNoteMetadata(HashMap<String, NoteMetadata> list) {\r
+ metaData = list;\r
}\r
+\r
\r
@Override\r
public int columnCount(QModelIndex arg0) {\r
}\r
case Qt.ItemDataRole.DecorationRole: {\r
if (index.column() == Global.noteTableThumbnailPosition ||\r
- index.column() == Global.noteTableSynchronizedPosition)\r
+ index.column() == Global.noteTableSynchronizedPosition ||\r
+ index.column() == Global.noteTablePinnedPosition)\r
return valueAt(index.row(), index.column());\r
else\r
return null;\r
case Qt.ItemDataRole.BackgroundRole: {\r
String guid = (String)valueAt(index.row(), Global.noteTableGuidPosition);\r
QColor backgroundColor = new QColor(QColor.white);\r
- if (titleColors != null && titleColors.containsKey(guid)) {\r
- int color = titleColors.get(guid);\r
+ if (metaData != null && metaData.containsKey(guid)) {\r
+ int color = metaData.get(guid).getColor();\r
backgroundColor.setRgb(color);\r
}\r
return backgroundColor;\r
String guid = (String)valueAt(index.row(), Global.noteTableGuidPosition);\r
QColor backgroundColor = new QColor(QColor.white);\r
QColor foregroundColor = new QColor(QColor.black);\r
- if (titleColors != null && titleColors.containsKey(guid)) {\r
- int color = titleColors.get(guid);\r
+ if (metaData != null && metaData.containsKey(guid)) {\r
+ int color = metaData.get(guid).getColor();\r
backgroundColor.setRgb(color);\r
if (backgroundColor.rgb() == QColor.black.rgb() || backgroundColor.rgb() == QColor.blue.rgb()) \r
foregroundColor.setRgb(QColor.white.rgb());\r
String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
QIcon dotIcon = new QIcon(iconPath+"dot.png");\r
String guid = note.getGuid();\r
- for (int i=0; i<unsynchronizedNotes.size(); i++) {\r
- if (unsynchronizedNotes.get(i).equalsIgnoreCase(guid)) \r
- return dotIcon;\r
+ if (metaData.containsKey(guid) && metaData.get(guid).isDirty()) \r
+ return dotIcon;\r
+ return null;\r
+ }\r
+ if (col == Global.noteTablePinnedPosition) {\r
+ String guid = note.getGuid();\r
+ if (metaData.containsKey(guid) && metaData.get(guid).isPinned()) {\r
+ String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
+ QIcon dotIcon = new QIcon(iconPath+"dot.png");\r
+ return dotIcon;\r
}\r
return null;\r
}\r
\r
public void updateNoteSyncStatus(String guid, boolean sync) {\r
\r
- boolean found = false;\r
- for (int i=0; i<unsynchronizedNotes.size(); i++) { \r
- // If the note is now synchronized, but it is in the unsynchronized list, remove it\r
- if (unsynchronizedNotes.get(i).equalsIgnoreCase(guid) && sync) {\r
- unsynchronizedNotes.remove(i);\r
- found = true;\r
- i=unsynchronizedNotes.size();\r
- }\r
- \r
- // If the note is not synchronized, but it is already in the unsynchronized list, do nothing\r
- if (unsynchronizedNotes.get(i).equalsIgnoreCase(guid) && sync) {\r
- found = true;\r
- i=unsynchronizedNotes.size();\r
- }\r
- }\r
- \r
- // If we've gotten through the entire list, then we consider it synchronized. If this is \r
- // wrong, add it to the list.\r
- if (!sync && !found) \r
- unsynchronizedNotes.add(guid);\r
+ if (metaData.containsKey(guid)) \r
+ metaData.get(guid).setDirty(!sync);\r
\r
// Now we need to go through the table & update it\r
for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
}\r
}\r
\r
- public void addNote(Note n) {\r
+ public void updateNotePinnedStatus(String guid, boolean pinned) {\r
+ // Now we need to go through the table & update it\r
+ for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
+ if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
+ QModelIndex idx = createIndex(i, Global.noteTablePinnedPosition, nativePointer());\r
+ String value;\r
+ if (metaData.containsKey(guid));\r
+ metaData.get(guid).setPinned(pinned);\r
+ if (pinned)\r
+ value = tr("true");\r
+ else\r
+ value = tr("false");\r
+ setData(idx, value, Qt.ItemDataRole.EditRole); \r
+ return;\r
+ } \r
+ }\r
+ }\r
+\r
+ \r
+ public void addNote(Note n, NoteMetadata meta) {\r
getNoteIndex().add(n);\r
getMasterNoteIndex().add(n);\r
- proxyModel.addGuid(n.getGuid());\r
+ proxyModel.addGuid(n.getGuid(), meta);\r
proxyModel.invalidate();\r
// proxyModel.filter();\r
}\r
}\r
}\r
\r
- public void updateNoteTitleColor(String guid, Integer color) {\r
- getTitleColors().remove(guid);\r
- getTitleColors().put(guid, color);\r
- layoutChanged.emit();\r
+ public void setMetaData(HashMap<String, NoteMetadata> h) {\r
+ metaData = h;\r
}\r
\r
@Override\r
return new Qt.ItemFlags(flags);\r
}\r
\r
+ public void updateNoteTitleColor(String guid, int color) {\r
+ NoteMetadata m = metaData.get(guid);\r
+ if (m == null) {\r
+ m = new NoteMetadata();\r
+ m.setGuid(guid);\r
+ metaData.put(guid, m);\r
+ }\r
+ if (metaData.containsKey(guid) && metaData.get(guid).getColor() != color) {\r
+ metaData.get(guid).setColor(color); \r
+ layoutChanged.emit();\r
+ }\r
+ }\r
}\r
import com.trolltech.qt.gui.QTableView;\r
\r
import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
import cx.fbn.nevernote.filters.NoteSortFilterProxyModel;\r
import cx.fbn.nevernote.signals.NoteSignal;\r
import cx.fbn.nevernote.utilities.ApplicationLogger;\r
private QAction noteTitleColorGray;\r
private QAction noteTitleColorCyan;\r
private QAction noteTitleColorMagenta;\r
+ private QAction notePinned;\r
private QAction copyAsUrlAction;\r
\r
\r
runner.getNoteTableModel().setHeaderData(Global.noteTableSourceUrlPosition, Qt.Orientation.Horizontal, tr("Source Url"), Qt.ItemDataRole.DisplayRole);\r
runner.getNoteTableModel().setHeaderData(Global.noteTableSubjectDatePosition, Qt.Orientation.Horizontal, tr("Subject Date"), Qt.ItemDataRole.DisplayRole);\r
runner.getNoteTableModel().setHeaderData(Global.noteTableSynchronizedPosition, Qt.Orientation.Horizontal, tr("Synchronized"), Qt.ItemDataRole.DisplayRole);\r
+ runner.getNoteTableModel().setHeaderData(Global.noteTablePinnedPosition, Qt.Orientation.Horizontal, tr("Pinned"), Qt.ItemDataRole.DisplayRole);\r
runner.getNoteTableModel().setHeaderData(Global.noteTableThumbnailPosition, Qt.Orientation.Horizontal, tr("Thumbnail"), Qt.ItemDataRole.DisplayRole);\r
header.sortIndicatorChanged.connect(this, "resetViewport()");\r
\r
verticalHeader().setDefaultSectionSize(Global.largeThumbnailSize.height());\r
}\r
for (int i=0; i<runner.getNoteIndex().size(); i++) {\r
- if (Global.showDeleted == true && !runner.getNoteIndex().get(i).isActive())\r
- proxyModel.addGuid(runner.getNoteIndex().get(i).getGuid());\r
- if (!Global.showDeleted == true && runner.getNoteIndex().get(i).isActive()) \r
- proxyModel.addGuid(runner.getNoteIndex().get(i).getGuid());\r
+ String guid = runner.getNoteIndex().get(i).getGuid();\r
+ NoteMetadata metaInfo = runner.getNoteMetadata().get(guid);\r
+ if (Global.showDeleted == true && !runner.getNoteIndex().get(i).isActive()) {\r
+ proxyModel.addGuid(guid, null);\r
+ }\r
+ if (!Global.showDeleted == true && \r
+ (runner.getNoteIndex().get(i).isActive() || \r
+ metaInfo.isPinned())) { \r
+ proxyModel.addGuid(guid, metaInfo);\r
+ }\r
}\r
\r
if (!reload) {\r
\r
for (int i=0; i<runner.getMasterNoteIndex().size(); i++) {\r
if (runner.getMasterNoteIndex().get(i) != null) { \r
- insertRow(runner.getMasterNoteIndex().get(i), false, i); \r
+ Note note = runner.getMasterNoteIndex().get(i);\r
+ NoteMetadata meta = runner.getNoteMetadata().get(note.getGuid());\r
+ insertRow(runner.getMasterNoteIndex().get(i), meta, false, i); \r
}\r
} \r
proxyModel.invalidate();\r
to = Global.getColumnPosition("noteTableSynchronizedPosition");\r
if (to>=0) header.moveSection(from, to);\r
\r
+ from = header.visualIndex(Global.noteTablePinnedPosition);\r
+ to = Global.getColumnPosition("noteTablePinnedPosition");\r
+ if (to>=0) header.moveSection(from, to);\r
+\r
\r
from = header.visualIndex(Global.noteTableGuidPosition);\r
to = Global.getColumnPosition("noteTableGuidPosition");\r
width = Global.getColumnWidth("noteTableSynchronizedPosition");\r
if (width>0) setColumnWidth(Global.noteTableSynchronizedPosition, width);\r
width = Global.getColumnWidth("noteTableThumbnailPosition");\r
+ if (width>0) setColumnWidth(Global.noteTablePinnedPosition, width);\r
+ width = Global.getColumnWidth("noteTablePinnedPosition");\r
if (width>0) setColumnWidth(Global.noteTableThumbnailPosition, width);\r
width = Global.getColumnWidth("noteTableGuidPosition");\r
if (width>0) setColumnWidth(Global.noteTableGuidPosition, width);\r
}\r
}\r
\r
- public void insertRow(Note tempNote, boolean newNote, int row) {\r
+ public void insertRow(Note tempNote, NoteMetadata meta, boolean newNote, int row) {\r
if (newNote)\r
- proxyModel.addGuid(tempNote.getGuid());\r
+ proxyModel.addGuid(tempNote.getGuid(), meta);\r
if (row > runner.getNoteTableModel().rowCount())\r
runner.getNoteTableModel().insertRow(0);\r
\r
noteTitleColorGray = new QAction(titleColorMenu);\r
noteTitleColorCyan = new QAction(titleColorMenu);\r
noteTitleColorMagenta = new QAction(titleColorMenu);\r
+ \r
+ notePinned = new QAction(titleColorMenu);\r
+ menu.addAction(notePinned);\r
\r
noteTitleColorWhite.setText(tr("White"));\r
noteTitleColorRed.setText(tr("Red"));\r
noteTitleColorGray.setText(tr("Gray"));\r
noteTitleColorCyan.setText(tr("Cyan"));\r
noteTitleColorMagenta.setText(tr("Magenta"));\r
+ notePinned.setText(tr("Pin/Unpin"));\r
\r
titleColorMenu.addAction(noteTitleColorWhite);\r
titleColorMenu.addAction(noteTitleColorRed);\r
noteTitleColorGray.triggered.connect(this, "titleColorGray()");\r
noteTitleColorCyan.triggered.connect(this, "titleColorCyan()");\r
noteTitleColorMagenta.triggered.connect(this, "titleColorMagenta()");\r
- \r
+ notePinned.triggered.connect(this, "notePinned()");\r
menu.exec(event.globalPos());\r
}\r
\r
private void titleColorCyan() {noteSignal.titleColorChanged.emit(QColor.cyan.rgb());}\r
@SuppressWarnings("unused")\r
private void titleColorMagenta() {noteSignal.titleColorChanged.emit(QColor.magenta.rgb());}\r
- \r
+ @SuppressWarnings("unused")\r
+ private void notePinned() {noteSignal.notePinned.emit();}\r
\r
\r
@Override\r
Global.saveColumnVisible("synchronized", toggle);\r
setColumnHidden(Global.noteTableSynchronizedPosition, !toggle);\r
}\r
+ public void togglePinned(Boolean toggle) {\r
+ Global.saveColumnVisible("pinned", toggle);\r
+ setColumnHidden(Global.noteTablePinnedPosition, !toggle);\r
+ }\r
public void toggleGuid(Boolean toggle) {\r
Global.saveColumnVisible("guid", toggle);\r
setColumnHidden(Global.noteTableGuidPosition, !toggle);\r
public Signal2<String, String> noteSaveRunnerError = new Signal2<String, String>();\r
public Signal3<String,QByteArray,Integer> thumbnailPageReady = new Signal3<String,QByteArray,Integer>();\r
public Signal3<BrowserWindow,String,String> browserLinkClicked = new Signal3<BrowserWindow,String,String>();\r
+ public Signal0 notePinned = new Signal0();\r
}\r
\r
\r
executeSql("alter table notebook add column NARROW_SORT_COLUMN integer");
executeSql("update notebook set NARROW_SORT_COLUMN = -1");
}
-
-
+ if (!dbTableColumnExists("NOTE", "PINNED")) {
+ executeSql("alter table note add column pinned integer");
+ executeSql("update note set pinned = 0");
+ }
}
public void executeSql(String sql) {
\r
import cx.fbn.nevernote.Global;\r
import cx.fbn.nevernote.evernote.EnmlConverter;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
import cx.fbn.nevernote.utilities.ApplicationLogger;\r
import cx.fbn.nevernote.utilities.Pair;\r
\r
return returnValue; \r
}\r
- // Get a list of notes that need to be updated\r
- public List <String> getUnsynchronizedGUIDs() {\r
- String guid;\r
- List<String> index = new ArrayList<String>();\r
- \r
- boolean check; \r
- NSqlQuery query = new NSqlQuery(db.getConnection());\r
- \r
- check = query.exec("Select guid from Note where isDirty=true");\r
- if (!check) \r
- logger.log(logger.EXTREME, "Note SQL retrieve has failed: " +query.lastError().toString());\r
- \r
- // Get a list of the notes\r
- while (query.next()) {\r
- guid = new String();\r
- guid = query.valueString(0);\r
- index.add(guid); \r
- } \r
- return index; \r
- }\r
+\r
// Reset the dirty bit\r
public void resetDirtyFlag(String guid) {\r
NSqlQuery query = new NSqlQuery(db.getConnection());\r
//* Title color functions\r
//**********************************************************************************\r
// Get the title color of all notes\r
- public List<Pair<String, Integer>> getNoteTitleColors() {\r
+/* public List<Pair<String, Integer>> getNoteTitleColors() {\r
List<Pair<String,Integer>> returnValue = new ArrayList<Pair<String,Integer>>();\r
NSqlQuery query = new NSqlQuery(db.getConnection());\r
\r
\r
return returnValue;\r
}\r
+ */\r
+ \r
+ // Get note meta information\r
+ public void updateNoteMetadata(NoteMetadata meta) {\r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ if (!query.prepare("Update Note set titleColor=:color, pinned=:pinned where guid=:guid"))\r
+ logger.log(logger.EXTREME, "Note SQL prepare has failed on updateNoteMetadata.");\r
+ query.bindValue(":color", meta.getColor());\r
+ query.bindValue(":pinned", meta.isPinned());\r
+ query.bindValue(":guid", meta.getGuid());\r
+ query.exec();\r
+ return;\r
+ }\r
+ \r
+ // Get note meta information\r
+ public HashMap<String, NoteMetadata> getNoteMetaInformation() {\r
+ HashMap<String, NoteMetadata> returnValue = new HashMap<String, NoteMetadata>();\r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ \r
+ if (!query.exec("Select guid,titleColor, isDirty, pinned from Note"))\r
+ logger.log(logger.EXTREME, "Note SQL retrieve has failed on getNoteMetaInformation.");\r
+\r
+ // Get a list of the notes\r
+ while (query.next()) {\r
+ NoteMetadata note = new NoteMetadata();\r
+ note.setGuid(query.valueString(0));\r
+ note.setColor(query.valueInteger(1));\r
+ note.setDirty(query.valueBoolean(2, false));\r
+ int pinned = query.valueInteger(3);\r
+ if (pinned > 0) \r
+ note.setPinned(true);\r
+ returnValue.put(note.getGuid(), note); \r
+ } \r
+\r
+ return returnValue;\r
+ }\r
// Set a title color\r
public void setNoteTitleColor(String guid, int color) {\r
NSqlQuery query = new NSqlQuery(db.getConnection());\r
import com.trolltech.qt.xml.QDomNodeList;\r
\r
import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
import cx.fbn.nevernote.filters.EnSearch;\r
import cx.fbn.nevernote.filters.NotebookCounter;\r
import cx.fbn.nevernote.filters.TagCounter;\r
private List<Notebook> notebookIndex;\r
private List<Notebook> archiveNotebookIndex;\r
private List<String> localNotebookIndex;\r
- \r
private List<LinkedNotebook> linkedNotebookIndex;\r
\r
private List<SavedSearch> searchIndex;\r
}\r
\r
\r
- setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());\r
+ //setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());\r
\r
linkedNotebookIndex = conn.getLinkedNotebookTable().getAll();\r
\r
setTagIndex(conn.getTagTable().getAll()); \r
}\r
public void reloadIndexes() {\r
- setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());\r
+ //setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());\r
\r
List<Notebook> local = conn.getNotebookTable().getAllLocal();\r
localNotebookIndex = new ArrayList<String>();\r
// Save the current note list\r
private void setNoteIndex(List<Note> n) {\r
noteModel.setNoteIndex(n);\r
+ refreshNoteMetadata();\r
+ }\r
+ public void refreshNoteMetadata() {\r
+ noteModel.setNoteMetadata(conn.getNoteTable().getNoteMetaInformation());\r
+ }\r
+ // Update a note's meta data\r
+ public void updateNoteMetadata(NoteMetadata meta) {\r
+ noteModel.metaData.remove(meta);\r
+ noteModel.metaData.put(meta.getGuid(), meta);\r
+ conn.getNoteTable().updateNoteMetadata(meta);\r
}\r
// Get the note index\r
public synchronized List<Note> getNoteIndex() {\r
public List<String> getLocalNotebooks() {\r
return localNotebookIndex;\r
}\r
- // Unsynchronized Note List\r
- public List<String> getUnsynchronizedNotes() {\r
- return noteModel.getUnsynchronizedNotes();\r
- }\r
- public void setUnsynchronizedNotes(List<String> l) {\r
- noteModel.setUnsynchronizedNotes(l);\r
- }\r
+\r
+// public void setUnsynchronizedNotes(List<String> l) {\r
+// noteModel.setUnsynchronizedNotes(l);\r
+// }\r
// Return a count of items in the trash\r
public int getTrashCount() {\r
return trashCount;\r
// public HashMap<String, QImage> getThumbnails() {\r
// return thumbnailList;\r
// }\r
+ public HashMap<String, NoteMetadata> getNoteMetadata() {\r
+ return noteModel.metaData;\r
+ }\r
public QImage getThumbnail(String guid) {\r
// if (getThumbnails().containsKey(guid))\r
// return getThumbnails().get(guid);\r
conn.getNoteTable().updateNote(n, true);\r
}\r
// Add a note. \r
- public void addNote(Note n) {\r
- noteModel.addNote(n);\r
+ public void addNote(Note n, NoteMetadata meta) {\r
+ noteModel.addNote(n, meta);\r
+ noteModel.metaData.put(n.getGuid(), meta);\r
}\r
// Expunge a note\r
public void expungeNote(String guid) {\r
conn.getNoteTable().setNoteTitleColor(guid, color);\r
}\r
public void loadNoteTitleColors() {\r
- List<Pair<String,Integer>> colors = conn.getNoteTable().getNoteTitleColors();\r
- if (noteModel.getTitleColors() == null)\r
- noteModel.setTitleColors(new HashMap<String,Integer>());\r
- else\r
- noteModel.getTitleColors().clear();\r
- for (int i=0; i<colors.size(); i++) {\r
- noteModel.getTitleColors().put(colors.get(i).getFirst(), colors.get(i).getSecond());\r
- }\r
+ noteModel.setMetaData(getNoteMetadata());\r
}\r
\r
//********************************************************************************\r
import com.trolltech.qt.xml.QXmlStreamWriter;\r
\r
import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
import cx.fbn.nevernote.sql.DatabaseConnection;\r
import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-import cx.fbn.nevernote.utilities.Pair;\r
\r
public class ExportData {\r
\r
private final HashMap<String,String> dirtyNotes;\r
private final HashMap<String,String> dirtyLinkedNotebooks;\r
private final HashMap<Long,String> dirtySharedNotebooks;\r
- private HashMap<String,Integer> titleColors;\r
+ private HashMap<String, NoteMetadata> noteMeta;\r
private final boolean fullBackup;\r
private final DatabaseConnection conn;\r
private QXmlStreamWriter writer; \r
dirtyNotes.put(dn.get(i).getGuid(), "");\r
}\r
\r
- List<Pair<String,Integer>> tColors = conn.getNoteTable().getNoteTitleColors();\r
- titleColors = new HashMap<String,Integer>();\r
- for (int i=0; i<tColors.size(); i++) {\r
- titleColors.put(tColors.get(i).getFirst(), tColors.get(i).getSecond());\r
- }\r
+ noteMeta = conn.getNoteTable().getNoteMetaInformation();\r
+\r
\r
searches = conn.getSavedSearchTable().getAll();\r
\r
createTextNode("Dirty", "true");\r
else\r
createTextNode("Dirty", "false");\r
- if (titleColors.containsKey(note.getGuid()))\r
- createTextNode("TitleColor", new String(titleColors.get(note.getGuid()).toString()));\r
+ if (noteMeta.containsKey(note.getGuid())) {\r
+ Integer color = new Integer(noteMeta.get(note.getGuid()).getColor());\r
+ createTextNode("TitleColor", color.toString());\r
+ }\r
exportableNotebooks.put(note.getNotebookGuid(), "");\r
\r
if (note.getTagGuidsSize() > 0) {\r