OSDN Git Service

コピーライトの表示を修正。
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / gui / TableView.java
index b30237b..4851317 100644 (file)
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-package cx.fbn.nevernote.gui;\r
-\r
-import java.text.SimpleDateFormat;\r
-import java.util.List;\r
-import java.util.SortedMap;\r
-\r
-import com.evernote.edam.type.Note;\r
-import com.trolltech.qt.core.QByteArray;\r
-import com.trolltech.qt.core.QDateTime;\r
-import com.trolltech.qt.core.QModelIndex;\r
-import com.trolltech.qt.core.Qt;\r
-import com.trolltech.qt.core.Qt.SortOrder;\r
-import com.trolltech.qt.gui.QAbstractItemView;\r
-import com.trolltech.qt.gui.QAction;\r
-import com.trolltech.qt.gui.QApplication;\r
-import com.trolltech.qt.gui.QColor;\r
-import com.trolltech.qt.gui.QContextMenuEvent;\r
-import com.trolltech.qt.gui.QDragEnterEvent;\r
-import com.trolltech.qt.gui.QDropEvent;\r
-import com.trolltech.qt.gui.QFontMetrics;\r
-import com.trolltech.qt.gui.QHeaderView;\r
-import com.trolltech.qt.gui.QKeyEvent;\r
-import com.trolltech.qt.gui.QMenu;\r
-import com.trolltech.qt.gui.QStandardItemModel;\r
-import com.trolltech.qt.gui.QTableView;\r
-import com.trolltech.qt.gui.QKeySequence.StandardKey;\r
-\r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.filters.NoteSortFilterProxyModel;\r
-import cx.fbn.nevernote.signals.NoteSignal;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-import cx.fbn.nevernote.utilities.ListManager;\r
-\r
-public class TableView extends QTableView {\r
-//     private final ListManager                               runner;\r
-       private final ApplicationLogger         logger;\r
-    public QStandardItemModel                  model;                                  // Standard item model\r
-    public NoteSortFilterProxyModel    proxyModel;                             // note sort model\r
-    private QAction deleteAction;\r
-    private QAction addAction;\r
-    private QAction restoreAction;\r
-    private QAction noteHistoryAction;\r
-    private QAction duplicateAction;\r
-    private QAction    mergeNotesAction;\r
-    \r
-    // Note title colors\r
-    private QAction    noteTitleColorWhite;\r
-    private QAction    noteTitleColorRed;\r
-    private QAction    noteTitleColorBlue;\r
-    private QAction    noteTitleColorGreen;\r
-    private QAction    noteTitleColorYellow;\r
-    private QAction    noteTitleColorBlack;\r
-    private QAction    noteTitleColorGray;\r
-    private QAction    noteTitleColorCyan;\r
-    private QAction    noteTitleColorMagenta;\r
-\r
-\r
-    \r
-    public QHeaderView header;\r
-    int fontHeight;\r
-    public Signal1<String> rowChanged;\r
-    public Signal0     resetViewport;\r
-    public NoteSignal noteSignal;\r
-       \r
-       public TableView(ApplicationLogger l) {\r
-               logger = l;\r
-               header = horizontalHeader();\r
-               header.setMovable(true);\r
-               \r
-               noteSignal = new NoteSignal();\r
-               setAcceptDrops(true);\r
-               setDragEnabled(true);\r
-               setDragDropMode(QAbstractItemView.DragDropMode.DragDrop);\r
-               setDropIndicatorShown(false);\r
-               \r
-               model = new QStandardItemModel(0,Global.noteTableColumnCount, this);\r
-               \r
-        model.setHeaderData(Global.noteTableCreationPosition, Qt.Orientation.Horizontal, "Date Created");\r
-        model.setHeaderData(Global.noteTableTagPosition, Qt.Orientation.Horizontal, "Tags");\r
-        model.setHeaderData(Global.noteTableGuidPosition, Qt.Orientation.Horizontal, "Guid");\r
-        model.setHeaderData(Global.noteTableNotebookPosition, Qt.Orientation.Horizontal, "Notebook");\r
-        model.setHeaderData(Global.noteTableTitlePosition, Qt.Orientation.Horizontal, "Title");\r
-        model.setHeaderData(Global.noteTableChangedPosition, Qt.Orientation.Horizontal, "Date Changed");\r
-        model.setHeaderData(Global.noteTableAuthorPosition, Qt.Orientation.Horizontal, "Author");\r
-        model.setHeaderData(Global.noteTableSourceUrlPosition, Qt.Orientation.Horizontal, "Source Url");\r
-        model.setHeaderData(Global.noteTableSubjectDatePosition, Qt.Orientation.Horizontal, "Subject Date");\r
-        model.setHeaderData(Global.noteTableSynchronizedPosition, Qt.Orientation.Horizontal, "Synchronized");\r
-        header.sortIndicatorChanged.connect(this, "resetViewport()");\r
-       \r
-        proxyModel = new NoteSortFilterProxyModel(this);\r
-        proxyModel.setSourceModel(model);\r
-        \r
-        setAlternatingRowColors(false);\r
-        setModel(proxyModel);\r
-        \r
-        setSortingEnabled(true);\r
-        int sortCol = proxyModel.sortColumn();\r
-               SortOrder sortOrder = proxyModel.sortOrder();\r
-               sortByColumn(sortCol, sortOrder);\r
-\r
-               setSelectionBehavior(SelectionBehavior.SelectRows);\r
-               setSelectionMode(SelectionMode.SingleSelection);\r
-               verticalHeader().setVisible(false);\r
-               hideColumn(Global.noteTableGuidPosition);  // Hide the guid column\r
-               setShowGrid(false);\r
-               setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers);\r
-               \r
-               QFontMetrics f = QApplication.fontMetrics();\r
-               fontHeight = f.height();\r
-               rowChanged = new Signal1<String>();\r
-               resetViewport = new Signal0();\r
-       }\r
-       \r
-       // This should rescroll to the current item in the list when a column is \r
-       // sorted.  Somehow I can't get this to work, but this part is correct.\r
-       @SuppressWarnings("unused")\r
-       private void resetViewport() {\r
-//             if (currentIndex() == null) \r
-//                     return;\r
-               \r
-//             resetViewport.emit();\r
-       }\r
-       \r
-               \r
-       public void load(ListManager runner, boolean reload) {\r
-\r
-               proxyModel.clear();\r
-               setSortingEnabled(true);\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
-               }\r
-               if (!reload) {\r
-                       logger.log(logger.EXTREME, "TableView.load() reload starting.");\r
-                       proxyModel.filter();\r
-                       logger.log(logger.EXTREME, "TableView.load() leaving reload.");\r
-                       QFontMetrics f = QApplication.fontMetrics();\r
-                       fontHeight = f.height();\r
-                       for (int i=0; i<model.rowCount(); i++)\r
-                               setRowHeight(i, fontHeight);\r
-                       resetViewport.emit();\r
-                       return;\r
-               }\r
-               logger.log(logger.EXTREME, "TableView.load() Filling table data from scratch");\r
-               model.setRowCount(runner.getMasterNoteIndex().size());\r
-               \r
-               for (int i=0; i<runner.getMasterNoteIndex().size(); i++) {\r
-                       if (runner.getMasterNoteIndex().get(i) != null) {       \r
-                               insertRow(runner, runner.getMasterNoteIndex().get(i), false, i);                                                        \r
-                       }\r
-               }\r
-               \r
-\r
-               \r
-               int width;\r
-               width = Global.getColumnWidth("noteTableCreationPosition");\r
-               if (width>0) setColumnWidth(Global.noteTableCreationPosition, width);\r
-               width = Global.getColumnWidth("noteTableChangedPosition");\r
-               if (width>0) setColumnWidth(Global.noteTableChangedPosition, width);\r
-               width = Global.getColumnWidth("noteTableTitlePosition");\r
-               if (width>0) setColumnWidth(Global.noteTableTitlePosition, width);\r
-               width = Global.getColumnWidth("noteTableTagPosition");\r
-               if (width>0) setColumnWidth(Global.noteTableTagPosition, width);\r
-               width = Global.getColumnWidth("noteTableGuidPosition");\r
-               if (width>0) setColumnWidth(Global.noteTableGuidPosition, width);\r
-               width = Global.getColumnWidth("noteTableNotebookPosition");\r
-               if (width>0) setColumnWidth(Global.noteTableNotebookPosition, width);\r
-               width = Global.getColumnWidth("noteTableSourceUrlPosition");\r
-               if (width>0) setColumnWidth(Global.noteTableSourceUrlPosition, width);\r
-               width = Global.getColumnWidth("noteTableAuthorPosition");\r
-               if (width>0) setColumnWidth(Global.noteTableAuthorPosition, width);\r
-               width = Global.getColumnWidth("noteTableSubjectDatePosition");\r
-               if (width>0) setColumnWidth(Global.noteTableSubjectDatePosition, width);\r
-               width = Global.getColumnWidth("noteTableSynchronizedPosition");\r
-               if (width>0) setColumnWidth(Global.noteTableSynchronizedPosition, width);\r
-               \r
-               int from = header.visualIndex(Global.noteTableCreationPosition);\r
-               int to = Global.getColumnPosition("noteTableCreationPosition");\r
-               if (to>=0) header.moveSection(from, to);\r
-\r
-               from = header.visualIndex(Global.noteTableTitlePosition);\r
-               to = Global.getColumnPosition("noteTableTitlePosition");\r
-               if (to>=0) header.moveSection(from, to);\r
-               \r
-               from = header.visualIndex(Global.noteTableTagPosition);\r
-               to = Global.getColumnPosition("noteTableTagPosition");\r
-               if (to>=0) header.moveSection(from, to);\r
-               \r
-               from = header.visualIndex(Global.noteTableNotebookPosition);\r
-               to = Global.getColumnPosition("noteTableNotebookPosition");\r
-               if (to>=0) header.moveSection(from, to);\r
-               \r
-               from = header.visualIndex(Global.noteTableChangedPosition);\r
-               to = Global.getColumnPosition("noteTableChangedPosition");\r
-               if (to>=0) header.moveSection(from, to);\r
-               \r
-               from = header.visualIndex(Global.noteTableSourceUrlPosition);\r
-               to = Global.getColumnPosition("noteTableSourceUrlPosition");\r
-               if (to>=0) header.moveSection(from, to);\r
-               \r
-               from = header.visualIndex(Global.noteTableAuthorPosition);\r
-               to = Global.getColumnPosition("noteTableAuthorPosition");\r
-               if (to>=0) header.moveSection(from, to);\r
-               \r
-               from = header.visualIndex(Global.noteTableSubjectDatePosition);\r
-               to = Global.getColumnPosition("noteTableSubjectDatePosition");\r
-               if (to>=0) header.moveSection(from, to);\r
-               \r
-               from = header.visualIndex(Global.noteTableSynchronizedPosition);\r
-               to = Global.getColumnPosition("noteTableSynchronizedPosition");\r
-               if (to>=0) header.moveSection(from, to);\r
-\r
-               proxyModel.filter();\r
-               \r
-               QFontMetrics f = QApplication.fontMetrics();\r
-               fontHeight = f.height();\r
-               for (int i=0; i<model.rowCount(); i++)\r
-                       setRowHeight(i, fontHeight);\r
-               \r
-               resetViewport.emit();\r
-       }\r
-\r
-       public void insertRow(ListManager runner, Note tempNote, boolean newNote, int row) {\r
-               if (newNote)\r
-                       proxyModel.addGuid(tempNote.getGuid());\r
-               String fmt = Global.getDateFormat() + " " + Global.getTimeFormat();\r
-               String dateTimeFormat = new String(fmt);\r
-               SimpleDateFormat simple = new SimpleDateFormat(dateTimeFormat);\r
-\r
-               \r
-               String tagNames = runner.getTagNamesForNote(tempNote);\r
-               StringBuilder creationDate = new StringBuilder(simple.format(tempNote.getCreated()));   \r
-               StringBuilder changedDate = new StringBuilder(simple.format(tempNote.getUpdated()));\r
-               StringBuilder subjectDate;\r
-               if (tempNote.getAttributes().getSubjectDate() == 0) \r
-                       subjectDate = creationDate;\r
-               else\r
-                       subjectDate = new StringBuilder(simple.format(tempNote.getAttributes().getSubjectDate()));\r
-\r
-               String sync = "true";\r
-               for (int i=0; i<runner.getUnsynchronizedNotes().size(); i++) {\r
-                       if (runner.getUnsynchronizedNotes().get(i).equalsIgnoreCase(tempNote.getGuid())) {\r
-                               sync = "false";\r
-                               i = runner.getUnsynchronizedNotes().size();\r
-                       }\r
-               }       \r
-                               \r
-               if (row > model.rowCount())\r
-                       model.insertRow(0);\r
-               \r
-               if (row < 0) {\r
-                       row  = model.rowCount();\r
-                       model.insertRow(row);\r
-//                     row = model.rowCount()-1;\r
-               }\r
-\r
-               QColor backgroundColor = new QColor(QColor.white);\r
-               QColor foregroundColor = new QColor(QColor.black);\r
-               \r
-               if (runner.titleColors != null && runner.titleColors.containsKey(tempNote.getGuid())) {\r
-                       int color = runner.titleColors.get(tempNote.getGuid());\r
-                       backgroundColor.setRgb(color);\r
-               }\r
-               if (backgroundColor.rgb() == QColor.black.rgb() || backgroundColor.rgb() == QColor.blue.rgb()) \r
-                       foregroundColor.setRgb(QColor.white.rgb());\r
-                       \r
-               \r
-               QDateTime created = QDateTime.fromString(creationDate.toString(), fmt);\r
-               QDateTime changed = QDateTime.fromString(changedDate.toString(), fmt);\r
-               QDateTime subjectDateFormat = QDateTime.fromString(subjectDate.toString(), fmt);\r
-               model.setData(model.index(row, Global.noteTableCreationPosition), created.toString(fmt));\r
-               model.setData(model.index(row, Global.noteTableChangedPosition), changed.toString(fmt));\r
-               model.setData(model.index(row, Global.noteTableTitlePosition), tempNote.getTitle());\r
-               model.setData(model.index(row, Global.noteTableTagPosition), tagNames);\r
-               model.setData(model.index(row, Global.noteTableGuidPosition), tempNote.getGuid());\r
-               model.setData(model.index(row, Global.noteTableSubjectDatePosition), subjectDateFormat.toString(fmt));\r
-               model.setData(model.index(row, Global.noteTableAuthorPosition), tempNote.getAttributes().getAuthor());\r
-               model.setData(model.index(row, Global.noteTableSourceUrlPosition), tempNote.getAttributes().getSourceURL());\r
-               model.setData(model.index(row, Global.noteTableNotebookPosition), runner.getNotebookNameByGuid(tempNote.getNotebookGuid()));\r
-               model.setData(model.index(row, Global.noteTableSynchronizedPosition), sync);\r
-               \r
-               for (int i=0; i<Global.noteTableColumnCount; i++) {\r
-                       model.setData(row, i, backgroundColor, Qt.ItemDataRole.BackgroundRole);\r
-                       model.setData(row, i, foregroundColor, Qt.ItemDataRole.ForegroundRole);\r
-               }               \r
-               \r
-               if (newNote) {\r
-                       QFontMetrics f = QApplication.fontMetrics();\r
-                       fontHeight = f.height();\r
-                       for (int i=0; i<model.rowCount(); i++)\r
-                               setRowHeight(i, fontHeight);\r
-               }\r
-       }\r
-       protected boolean filterAcceptsRow(int sourceRow, QModelIndex sourceParent) {\r
-               return true;\r
-       }\r
-\r
-       public void setAddAction(QAction a) {\r
-               addAction = a;\r
-       }\r
-       \r
-       public void setMergeNotesAction(QAction a) {\r
-               mergeNotesAction = a;\r
-       }\r
-       \r
-       public void setNoteHistoryAction(QAction a) {\r
-               noteHistoryAction = a;\r
-       }\r
-       \r
-       public void setDeleteAction(QAction d) {\r
-               deleteAction = d;\r
-       }\r
-        \r
-       public void setRestoreAction(QAction r) {\r
-               restoreAction = r;\r
-       }\r
-       public void setNoteDuplicateAction(QAction d) {\r
-               duplicateAction = d;\r
-       }\r
-       \r
-       @Override\r
-       public void keyPressEvent(QKeyEvent e) {\r
-               if (e.matches(StandardKey.MoveToStartOfDocument)) {\r
-                       if (model.rowCount() > 0) {\r
-                               clearSelection();\r
-                               selectRow(0);\r
-                       }\r
-               }\r
-               if (e.matches(StandardKey.MoveToEndOfDocument)) {\r
-                       if (model.rowCount() > 0) {\r
-                               clearSelection();\r
-                               selectRow(model().rowCount()-1);\r
-                       }\r
-               }\r
-               super.keyPressEvent(e);\r
-       }\r
-       \r
-       @Override\r
-       public void contextMenuEvent(QContextMenuEvent event) {\r
-               QMenu menu = new QMenu(this);\r
-               if (Global.showDeleted) {\r
-                       menu.addAction(restoreAction);\r
-               } else {\r
-                       menu.addAction(addAction);\r
-               }\r
-               menu.addAction(deleteAction);\r
-               menu.addSeparator();\r
-               menu.addAction(duplicateAction);\r
-               menu.addAction(noteHistoryAction);\r
-               menu.addAction(mergeNotesAction);\r
-               \r
-               QMenu titleColorMenu = new QMenu();\r
-               titleColorMenu.setTitle("Title Color");\r
-               menu.addMenu(titleColorMenu);\r
-               noteTitleColorWhite = new QAction(titleColorMenu);\r
-           noteTitleColorRed = new QAction(titleColorMenu);\r
-           noteTitleColorBlue = new QAction(titleColorMenu);\r
-           noteTitleColorGreen = new QAction(titleColorMenu);\r
-           noteTitleColorYellow = new QAction(titleColorMenu);\r
-           noteTitleColorBlack = new QAction(titleColorMenu);\r
-           noteTitleColorGray = new QAction(titleColorMenu);\r
-           noteTitleColorCyan = new QAction(titleColorMenu);\r
-           noteTitleColorMagenta = new QAction(titleColorMenu);\r
-    \r
-           noteTitleColorWhite.setText("White");\r
-           noteTitleColorRed.setText("Red");\r
-           noteTitleColorBlue.setText("Blue");\r
-           noteTitleColorGreen.setText("Green");\r
-           noteTitleColorYellow.setText("Yellow");\r
-           noteTitleColorBlack.setText("Black");\r
-           noteTitleColorGray.setText("Gray");\r
-           noteTitleColorCyan.setText("Cyan");\r
-           noteTitleColorMagenta.setText("Magenta");\r
-           \r
-           titleColorMenu.addAction(noteTitleColorWhite);\r
-           titleColorMenu.addAction(noteTitleColorRed);\r
-           titleColorMenu.addAction(noteTitleColorBlue);\r
-           titleColorMenu.addAction(noteTitleColorGreen);\r
-           titleColorMenu.addAction(noteTitleColorYellow);\r
-           titleColorMenu.addAction(noteTitleColorBlack);\r
-           titleColorMenu.addAction(noteTitleColorGray);\r
-           titleColorMenu.addAction(noteTitleColorCyan);\r
-           titleColorMenu.addAction(noteTitleColorMagenta);\r
-           \r
-           noteTitleColorWhite.triggered.connect(this, "titleColorWhite()");\r
-           \r
-           noteTitleColorWhite.triggered.connect(this, "titleColorWhite()");\r
-           noteTitleColorRed.triggered.connect(this, "titleColorRed()");\r
-           noteTitleColorBlue.triggered.connect(this, "titleColorBlue()");\r
-           noteTitleColorGreen.triggered.connect(this, "titleColorGreen()");\r
-           noteTitleColorYellow.triggered.connect(this, "titleColorYellow()");\r
-           noteTitleColorBlack.triggered.connect(this, "titleColorBlack()");\r
-           noteTitleColorGray.triggered.connect(this, "titleColorGray()");\r
-           noteTitleColorCyan.triggered.connect(this, "titleColorCyan()");\r
-           noteTitleColorMagenta.triggered.connect(this, "titleColorMagenta()");\r
-           \r
-               menu.exec(event.globalPos());\r
-       }\r
-       \r
-       \r
-    @SuppressWarnings("unused")\r
-       private void titleColorWhite() {noteSignal.titleColorChanged.emit(QColor.white.rgb());}\r
-    @SuppressWarnings("unused")\r
-       private void titleColorRed() {noteSignal.titleColorChanged.emit(QColor.red.rgb());}\r
-    @SuppressWarnings("unused")\r
-       private void titleColorBlue() {noteSignal.titleColorChanged.emit(QColor.blue.rgb());}\r
-    @SuppressWarnings("unused")\r
-       private void titleColorGreen() {noteSignal.titleColorChanged.emit(QColor.green.rgb());}\r
-    @SuppressWarnings("unused")\r
-       private void titleColorYellow(){noteSignal.titleColorChanged.emit(QColor.yellow.rgb());}\r
-    @SuppressWarnings("unused")\r
-       private void titleColorBlack() {noteSignal.titleColorChanged.emit(QColor.black.rgb());}\r
-    @SuppressWarnings("unused")\r
-       private void titleColorGray() {noteSignal.titleColorChanged.emit(QColor.gray.rgb());}\r
-    @SuppressWarnings("unused")\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
-       \r
-\r
-       @Override\r
-       public void dragEnterEvent(QDragEnterEvent event) {\r
-               StringBuffer guid = new StringBuffer(1000);\r
-               \r
-               showColumn(Global.noteTableGuidPosition);\r
-               List<QModelIndex> selections = selectionModel().selectedRows();\r
-               hideColumn(Global.noteTableGuidPosition);\r
-               \r
-       if (selections.size() > 0) {\r
-               QModelIndex index;\r
-               for (int i=0; i<selections.size(); i++) {\r
-                       int row = selections.get(i).row();\r
-                       index = proxyModel.index(row, Global.noteTableGuidPosition);\r
-                       SortedMap<Integer, Object> ix = proxyModel.itemData(index);\r
-                       guid.append((String)ix.values().toArray()[0]);\r
-                       guid.append(" ");\r
-               }\r
-       }\r
-               event.mimeData().setData("application/x-nevernote-note", new QByteArray(guid.toString()));\r
-               event.accept();\r
-                               \r
-       }\r
-       \r
-       @Override\r
-       public void dropEvent(QDropEvent event) {\r
-               if (event.source() == this)\r
-                       event.ignore();\r
-       }\r
-       \r
-       // Return a column width\r
-       public int getColumnWidth(int col) {\r
-               return columnWidth(col);\r
-       }\r
-\r
-/*\r
-    @Override\r
-       public void scrollTo(final QModelIndex index, ScrollHint hint) {\r
-        QRect area = viewport().rect();\r
-        QRect rect = visualRect(index);\r
-\r
-        if (rect.top() < area.top())\r
-            verticalScrollBar().setValue(\r
-                verticalScrollBar().value() + rect.top() - area.top());\r
-        else if (rect.bottom() > area.bottom())\r
-            verticalScrollBar().setValue(\r
-                verticalScrollBar().value() + Math.min(\r
-                    rect.bottom() - area.bottom(), rect.top() - area.top()));\r
-        update();\r
-    }\r
-    \r
-    @Override\r
-       protected void updateGeometries() {\r
-        verticalScrollBar().setPageStep(viewport().height());\r
-        verticalScrollBar().setRange(0, Math.max(0, viewport().height()));\r
-    }\r
-    @Override\r
-    protected int verticalOffset() {\r
-        return verticalScrollBar().value();\r
-    }\r
-*/\r
-       \r
-}\r
+/*
+ * This file is part of NixNote/NeighborNote 
+ * Copyright 2009 Randy Baumgarte
+ * Copyright 2013 Yuki Takahashi
+ * 
+ * This file may be licensed under the terms of of the
+ * GNU General Public License Version 2 (the ``GPL'').
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the GPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the GPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/gpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+package cx.fbn.nevernote.gui;
+
+import java.util.List;
+import java.util.SortedMap;
+
+import com.evernote.edam.type.Note;
+import com.trolltech.qt.core.QByteArray;
+import com.trolltech.qt.core.QModelIndex;
+import com.trolltech.qt.core.Qt;
+import com.trolltech.qt.core.Qt.Orientation;
+import com.trolltech.qt.core.Qt.SortOrder;
+import com.trolltech.qt.gui.QAbstractItemView;
+import com.trolltech.qt.gui.QAction;
+import com.trolltech.qt.gui.QApplication;
+import com.trolltech.qt.gui.QColor;
+import com.trolltech.qt.gui.QContextMenuEvent;
+import com.trolltech.qt.gui.QDragEnterEvent;
+import com.trolltech.qt.gui.QDropEvent;
+import com.trolltech.qt.gui.QFontMetrics;
+import com.trolltech.qt.gui.QKeyEvent;
+import com.trolltech.qt.gui.QKeySequence.StandardKey;
+import com.trolltech.qt.gui.QMenu;
+import com.trolltech.qt.gui.QTableView;
+
+import cx.fbn.nevernote.Global;
+import cx.fbn.nevernote.NeverNote;
+import cx.fbn.nevernote.evernote.NoteMetadata;
+import cx.fbn.nevernote.filters.NoteSortFilterProxyModel;
+import cx.fbn.nevernote.signals.NoteSignal;
+import cx.fbn.nevernote.utilities.ApplicationLogger;
+import cx.fbn.nevernote.utilities.ListManager;
+
+public class TableView extends QTableView {
+       private final ListManager                               runner;
+       private final ApplicationLogger         logger;
+    public NoteSortFilterProxyModel    proxyModel;             // note sort model
+    private QAction deleteAction;
+    private QAction addAction;
+    private QAction restoreAction;
+    private QAction noteHistoryAction;
+    private QAction duplicateAction;
+    private QAction    mergeNotesAction;
+       // ICHANGED
+       private QAction openNewTabAction;
+       private QAction addNoteNewTabAction;
+    
+    // Note title colors
+    private QAction    noteTitleColorWhite;
+    private QAction    noteTitleColorRed;
+    private QAction    noteTitleColorBlue;
+    private QAction    noteTitleColorGreen;
+    private QAction    noteTitleColorYellow;
+    private QAction    noteTitleColorBlack;
+    private QAction    noteTitleColorGray;
+    private QAction    noteTitleColorCyan;
+    private QAction    noteTitleColorMagenta;
+    private QAction notePinned;
+    private QAction copyAsUrlAction;
+
+
+    
+    public TableViewHeader header;
+    int fontHeight;
+    public Signal1<String> rowChanged;
+    public Signal0     resetViewport;
+    public NoteSignal noteSignal;
+       
+       // ICHANGED
+       private final NeverNote parent;
+       
+       // ICHANGED parent引数を追加
+       public TableView(ApplicationLogger l, ListManager m, NeverNote parent) {
+               // ICHANGED
+               this.parent = parent;
+               
+               logger = l;
+               header = new TableViewHeader(Orientation.Horizontal,this);
+               setHorizontalHeader(header);
+               header.setMovable(true);
+               header.subjectDateAction.toggled.connect(this, "toggleSubjectDate(Boolean)");
+               header.createdDateAction.toggled.connect(this, "toggleCreationDate(Boolean)");
+               header.changedDateAction.toggled.connect(this, "toggleChangedDate(Boolean)");
+               header.authorAction.toggled.connect(this, "toggleAuthor(Boolean)");
+               header.urlAction.toggled.connect(this, "toggleSourceUrl(Boolean)");
+               header.pinnedAction.toggled.connect(this, "togglePinned(Boolean)");
+               header.tagsAction.toggled.connect(this, "toggleTags(Boolean)");
+               header.notebookAction.toggled.connect(this, "toggleNotebook(Boolean)");
+               header.synchronizedAction.toggled.connect(this, "toggleSynchronized(Boolean)");
+               header.guidAction.toggled.connect(this, "toggleGuid(Boolean)");
+               header.thumbnailAction.toggled.connect(this, "toggleThumbnail(Boolean)");
+               header.titleAction.toggled.connect(this, "toggleTitle(Boolean)");
+               
+               noteSignal = new NoteSignal();
+               setAcceptDrops(true);
+               setDragEnabled(true);
+               setDragDropMode(QAbstractItemView.DragDropMode.DragDrop);
+               setDropIndicatorShown(false);
+               
+               runner = m;     
+               
+        runner.getNoteTableModel().setHeaderData(Global.noteTableCreationPosition, Qt.Orientation.Horizontal, tr("Date Created"), Qt.ItemDataRole.DisplayRole);
+        runner.getNoteTableModel().setHeaderData(Global.noteTableTagPosition, Qt.Orientation.Horizontal, tr("Tags"), Qt.ItemDataRole.DisplayRole);
+        runner.getNoteTableModel().setHeaderData(Global.noteTableGuidPosition, Qt.Orientation.Horizontal, tr("Guid"), Qt.ItemDataRole.DisplayRole);
+        runner.getNoteTableModel().setHeaderData(Global.noteTableNotebookPosition, Qt.Orientation.Horizontal, tr("Notebook"), Qt.ItemDataRole.DisplayRole);
+        runner.getNoteTableModel().setHeaderData(Global.noteTableTitlePosition, Qt.Orientation.Horizontal, tr("Title"), Qt.ItemDataRole.DisplayRole);
+        runner.getNoteTableModel().setHeaderData(Global.noteTableChangedPosition, Qt.Orientation.Horizontal, tr("Date Changed"), Qt.ItemDataRole.DisplayRole);
+        runner.getNoteTableModel().setHeaderData(Global.noteTableAuthorPosition, Qt.Orientation.Horizontal, tr("Author"), Qt.ItemDataRole.DisplayRole);
+        runner.getNoteTableModel().setHeaderData(Global.noteTableSourceUrlPosition, Qt.Orientation.Horizontal, tr("Source Url"), Qt.ItemDataRole.DisplayRole);
+        runner.getNoteTableModel().setHeaderData(Global.noteTableSubjectDatePosition, Qt.Orientation.Horizontal, tr("Subject Date"), Qt.ItemDataRole.DisplayRole);
+        runner.getNoteTableModel().setHeaderData(Global.noteTableSynchronizedPosition, Qt.Orientation.Horizontal, tr("Sync"), Qt.ItemDataRole.DisplayRole);
+        runner.getNoteTableModel().setHeaderData(Global.noteTablePinnedPosition, Qt.Orientation.Horizontal, tr("Pinned"), Qt.ItemDataRole.DisplayRole);
+        runner.getNoteTableModel().setHeaderData(Global.noteTableThumbnailPosition, Qt.Orientation.Horizontal, tr("Thumbnail"), Qt.ItemDataRole.DisplayRole);
+        header.sortIndicatorChanged.connect(this, "resetViewport()");
+       
+        proxyModel = new NoteSortFilterProxyModel(this);
+        proxyModel.setSourceModel(runner.getNoteTableModel());
+        setAlternatingRowColors(false);
+        setModel(proxyModel);
+        runner.getNoteTableModel().setSortProxyModel(proxyModel);
+               
+        setSortingEnabled(true);
+        int sortCol = proxyModel.sortColumn();
+               SortOrder sortOrder = proxyModel.sortOrder();
+               sortByColumn(sortCol, sortOrder);
+
+               setSelectionBehavior(SelectionBehavior.SelectRows);
+               setSelectionMode(SelectionMode.SingleSelection);
+               verticalHeader().setVisible(false);
+               hideColumn(Global.noteTableGuidPosition);  // Hide the guid column
+               setShowGrid(false);
+               setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers);
+               
+               QFontMetrics f = QApplication.fontMetrics();
+               fontHeight = f.height();
+               rowChanged = new Signal1<String>();
+               resetViewport = new Signal0();
+               
+               NoteTableDateDelegate dateDelegate = new NoteTableDateDelegate();
+               setItemDelegateForColumn(Global.noteTableCreationPosition, dateDelegate);
+               setItemDelegateForColumn(Global.noteTableChangedPosition, dateDelegate);
+               setItemDelegateForColumn(Global.noteTableSubjectDatePosition, dateDelegate);
+               
+       }
+       
+       // This should rescroll to the current item in the list when a column is 
+       // sorted.  Somehow I can't get this to work, but this part is correct.
+       @SuppressWarnings("unused")
+       private void resetViewport() {
+//             if (currentIndex() == null) 
+//                     return;
+               
+//             resetViewport.emit();
+       }
+       
+               
+       public void load(boolean reload) {
+               proxyModel.clear();
+               setSortingEnabled(false);
+               QFontMetrics f = QApplication.fontMetrics();
+               if (!Global.isColumnVisible("thumbnail"))
+                               verticalHeader().setDefaultSectionSize(f.height());
+               else {
+                       if (Global.getListView() == Global.View_List_Wide)
+                               verticalHeader().setDefaultSectionSize(Global.smallThumbnailSize.height());
+                       else
+                               verticalHeader().setDefaultSectionSize(Global.largeThumbnailSize.height());
+               }
+               for (int i=0; i<runner.getNoteIndex().size(); i++) {
+                       String guid = runner.getNoteIndex().get(i).getGuid();
+                       NoteMetadata metaInfo = runner.getNoteMetadata().get(guid);
+                       if (Global.showDeleted == true && !runner.getNoteIndex().get(i).isActive()) {
+                               proxyModel.addGuid(guid, null);
+                       }
+                       if (!Global.showDeleted == true && 
+                                       (runner.getNoteIndex().get(i).isActive() || 
+                                                       metaInfo.isPinned())) {         
+                               proxyModel.addGuid(guid, metaInfo);
+                       }
+               }
+
+               if (!reload) {
+                       logger.log(logger.EXTREME, "TableView.load() reload starting.");
+                       proxyModel.filter();
+                       setSortingEnabled(true);
+                       logger.log(logger.EXTREME, "TableView.load() leaving reload.");
+                       return;
+               }
+               logger.log(logger.EXTREME, "TableView.load() Filling table data from scratch");
+       
+               for (int i=0; i<runner.getMasterNoteIndex().size(); i++) {
+                       if (runner.getMasterNoteIndex().get(i) != null) {       
+                               Note note = runner.getMasterNoteIndex().get(i);
+                               NoteMetadata meta = runner.getNoteMetadata().get(note.getGuid());
+                               insertRow(runner.getMasterNoteIndex().get(i), meta, false, i);                                                  
+                       }
+               } 
+               proxyModel.invalidate();
+               
+               resizeColumnWidths();
+               repositionColumns();
+               
+               proxyModel.filter();
+               
+               setSortingEnabled(true);
+               resetViewport.emit();
+       }
+       
+       public void repositionColumns() {
+               int from = header.visualIndex(Global.noteTableCreationPosition);
+               int to = Global.getColumnPosition("noteTableCreationPosition");
+               if (to>=0) header.moveSection(from, to);
+
+               from = header.visualIndex(Global.noteTableTitlePosition);
+               to = Global.getColumnPosition("noteTableTitlePosition");
+               if (to>=0) header.moveSection(from, to);
+               
+               from = header.visualIndex(Global.noteTableTagPosition);
+               to = Global.getColumnPosition("noteTableTagPosition");
+               if (to>=0) header.moveSection(from, to);
+               
+               from = header.visualIndex(Global.noteTableNotebookPosition);
+               to = Global.getColumnPosition("noteTableNotebookPosition");
+               if (to>=0) header.moveSection(from, to);
+               
+               from = header.visualIndex(Global.noteTableChangedPosition);
+               to = Global.getColumnPosition("noteTableChangedPosition");
+               if (to>=0) header.moveSection(from, to);
+               
+               from = header.visualIndex(Global.noteTableSourceUrlPosition);
+               to = Global.getColumnPosition("noteTableSourceUrlPosition");
+               if (to>=0) header.moveSection(from, to);
+               
+               from = header.visualIndex(Global.noteTableAuthorPosition);
+               to = Global.getColumnPosition("noteTableAuthorPosition");
+               if (to>=0) header.moveSection(from, to);
+               
+               from = header.visualIndex(Global.noteTableSubjectDatePosition);
+               to = Global.getColumnPosition("noteTableSubjectDatePosition");
+               if (to>=0) header.moveSection(from, to);
+               
+               from = header.visualIndex(Global.noteTableSynchronizedPosition);
+               to = Global.getColumnPosition("noteTableSynchronizedPosition");
+               if (to>=0) header.moveSection(from, to);
+
+               from = header.visualIndex(Global.noteTablePinnedPosition);
+               to = Global.getColumnPosition("noteTablePinnedPosition");
+               if (to>=0) header.moveSection(from, to);
+
+               
+               from = header.visualIndex(Global.noteTableGuidPosition);
+               to = Global.getColumnPosition("noteTableGuidPosition");
+               if (to>=0) header.moveSection(from, to);
+               
+               
+               from = header.visualIndex(Global.noteTableThumbnailPosition);
+               to = Global.getColumnPosition("noteTableThumbnailPosition");
+               if (to>=0) header.moveSection(from, to);
+
+       }
+       
+       public void resizeColumnWidths() {
+               int width;
+               width = Global.getColumnWidth("noteTableCreationPosition");
+               if (width>0) setColumnWidth(Global.noteTableCreationPosition, width);
+               width = Global.getColumnWidth("noteTableChangedPosition");
+               if (width>0) setColumnWidth(Global.noteTableChangedPosition, width);
+               width = Global.getColumnWidth("noteTableTitlePosition");
+               if (width>0) setColumnWidth(Global.noteTableTitlePosition, width);
+               width = Global.getColumnWidth("noteTableTagPosition");
+               if (width>0) setColumnWidth(Global.noteTableTagPosition, width);
+               width = Global.getColumnWidth("noteTableGuidPosition");
+               if (width>0) setColumnWidth(Global.noteTableGuidPosition, width);
+               width = Global.getColumnWidth("noteTableNotebookPosition");
+               if (width>0) setColumnWidth(Global.noteTableNotebookPosition, width);
+               width = Global.getColumnWidth("noteTableSourceUrlPosition");
+               if (width>0) setColumnWidth(Global.noteTableSourceUrlPosition, width);
+               width = Global.getColumnWidth("noteTableAuthorPosition");
+               if (width>0) setColumnWidth(Global.noteTableAuthorPosition, width);
+               width = Global.getColumnWidth("noteTableSubjectDatePosition");
+               if (width>0) setColumnWidth(Global.noteTableSubjectDatePosition, width);
+               width = Global.getColumnWidth("noteTableSynchronizedPosition");
+               if (width>0) setColumnWidth(Global.noteTableSynchronizedPosition, width);
+               width = Global.getColumnWidth("noteTableThumbnailPosition");
+               if (width>0) setColumnWidth(Global.noteTablePinnedPosition, width);
+               width = Global.getColumnWidth("noteTablePinnedPosition");
+               if (width>0) setColumnWidth(Global.noteTableThumbnailPosition, width);
+               width = Global.getColumnWidth("noteTableGuidPosition");
+               if (width>0) setColumnWidth(Global.noteTableGuidPosition, width);
+
+       }
+       
+       public void resizeRowHeights() {
+               int height;
+               if (!Global.isColumnVisible("thumbnail") || !Global.enableThumbnails()) {
+                       QFontMetrics f = QApplication.fontMetrics();
+                       verticalHeader().setDefaultSectionSize(f.height());
+                       height = fontHeight;
+               } else {
+                       if (Global.getListView() == Global.View_List_Wide) {
+                               verticalHeader().setDefaultSectionSize(Global.smallThumbnailSize.height());
+                               height = Global.smallThumbnailSize.height();
+                       } else {
+                               verticalHeader().setDefaultSectionSize(Global.largeThumbnailSize.height());
+                               height = Global.largeThumbnailSize.height();
+                       }
+               }
+               for (int i=0; i<runner.getNoteTableModel().rowCount(); i++) {
+                       setRowHeight(i, height);
+               }
+       }
+       
+       public void insertRow(Note tempNote, NoteMetadata meta, boolean newNote, int row) {
+               if (newNote)
+                       proxyModel.addGuid(tempNote.getGuid(), meta);
+               if (row > runner.getNoteTableModel().rowCount())
+                       runner.getNoteTableModel().insertRow(0);
+               
+               if (row < 0) {
+                       row  = runner.getNoteTableModel().rowCount();
+                       runner.getNoteTableModel().insertRow(row);
+               }
+               if (newNote) {
+                       resizeRowHeights();
+               }
+       }
+       protected boolean filterAcceptsRow(int sourceRow, QModelIndex sourceParent) {
+               return true;
+       }
+
+       public void setAddAction(QAction a) {
+               addAction = a;
+       }
+       
+       public void setMergeNotesAction(QAction a) {
+               mergeNotesAction = a;
+       }
+       
+       public void setCopyAsUrlAction(QAction a) {
+               copyAsUrlAction = a;
+       }
+       
+       public void setNoteHistoryAction(QAction a) {
+               noteHistoryAction = a;
+       }
+       
+       public void setDeleteAction(QAction d) {
+               deleteAction = d;
+       }
+        
+       public void setRestoreAction(QAction r) {
+               restoreAction = r;
+       }
+       public void setNoteDuplicateAction(QAction d) {
+               duplicateAction = d;
+       }
+       
+       // ICHANGED
+       public void setOpenNewTabAction(QAction t) {
+               openNewTabAction = t;
+       }
+       
+       // ICHANGED
+       public void setAddNoteNewTabAction(QAction t) {
+               addNoteNewTabAction = t;
+       }
+       
+       @Override
+       public void keyPressEvent(QKeyEvent e) {
+               if (e.matches(StandardKey.MoveToStartOfDocument)) {
+                       if (runner.getNoteTableModel().rowCount() > 0) {
+                               clearSelection();
+                               selectRow(0);
+                       }
+               }
+               if (e.matches(StandardKey.MoveToEndOfDocument)) {
+                       if (runner.getNoteTableModel().rowCount() > 0) {
+                               clearSelection();
+                               selectRow(model().rowCount()-1);
+                       }
+               }
+               super.keyPressEvent(e);
+       }
+       
+       @Override
+       public void contextMenuEvent(QContextMenuEvent event) {
+               // ICHANGED QMenu から NoteTableContextMenu へ
+               QMenu menu = new QMenu(this);
+               
+               // ICHANGED
+               menu.addAction(openNewTabAction);
+               
+               // ICHANGED
+               menu.addSeparator();
+               if (Global.showDeleted) {
+                       menu.addAction(restoreAction);
+               } else {
+                       menu.addAction(addAction);
+                       menu.addAction(addNoteNewTabAction);
+               }
+               menu.addSeparator();
+               
+               menu.addAction(deleteAction);
+               menu.addSeparator();
+               menu.addAction(duplicateAction);
+               menu.addAction(copyAsUrlAction);
+               menu.addSeparator();
+               menu.addAction(noteHistoryAction);
+               menu.addAction(mergeNotesAction);
+               
+               // ICHANGED QMenu から NoteTableContextMenu へ
+               QMenu titleColorMenu = new QMenu(this);
+               
+               titleColorMenu.setTitle(tr("Title Color"));
+               menu.addMenu(titleColorMenu);
+               noteTitleColorWhite = new QAction(titleColorMenu);
+           noteTitleColorRed = new QAction(titleColorMenu);
+           noteTitleColorBlue = new QAction(titleColorMenu);
+           noteTitleColorGreen = new QAction(titleColorMenu);
+           noteTitleColorYellow = new QAction(titleColorMenu);
+           noteTitleColorBlack = new QAction(titleColorMenu);
+           noteTitleColorGray = new QAction(titleColorMenu);
+           noteTitleColorCyan = new QAction(titleColorMenu);
+           noteTitleColorMagenta = new QAction(titleColorMenu);
+           
+           notePinned = new QAction(titleColorMenu);
+           menu.addAction(notePinned);
+    
+           noteTitleColorWhite.setText(tr("White"));
+           noteTitleColorRed.setText(tr("Red"));
+           noteTitleColorBlue.setText(tr("Blue"));
+           noteTitleColorGreen.setText(tr("Green"));
+           noteTitleColorYellow.setText(tr("Yellow"));
+           noteTitleColorBlack.setText(tr("Black"));
+           noteTitleColorGray.setText(tr("Gray"));
+           noteTitleColorCyan.setText(tr("Cyan"));
+           noteTitleColorMagenta.setText(tr("Magenta"));
+           notePinned.setText(tr("Pin/Unpin"));
+           
+           titleColorMenu.addAction(noteTitleColorWhite);
+           titleColorMenu.addAction(noteTitleColorRed);
+           titleColorMenu.addAction(noteTitleColorBlue);
+           titleColorMenu.addAction(noteTitleColorGreen);
+           titleColorMenu.addAction(noteTitleColorYellow);
+           titleColorMenu.addAction(noteTitleColorBlack);
+           titleColorMenu.addAction(noteTitleColorGray);
+           titleColorMenu.addAction(noteTitleColorCyan);
+           titleColorMenu.addAction(noteTitleColorMagenta);
+           
+           noteTitleColorWhite.triggered.connect(this, "titleColorWhite()");
+           
+           noteTitleColorWhite.triggered.connect(this, "titleColorWhite()");
+           noteTitleColorRed.triggered.connect(this, "titleColorRed()");
+           noteTitleColorBlue.triggered.connect(this, "titleColorBlue()");
+           noteTitleColorGreen.triggered.connect(this, "titleColorGreen()");
+           noteTitleColorYellow.triggered.connect(this, "titleColorYellow()");
+           noteTitleColorBlack.triggered.connect(this, "titleColorBlack()");
+           noteTitleColorGray.triggered.connect(this, "titleColorGray()");
+           noteTitleColorCyan.triggered.connect(this, "titleColorCyan()");
+           noteTitleColorMagenta.triggered.connect(this, "titleColorMagenta()");
+           notePinned.triggered.connect(this, "notePinned()");
+               menu.exec(event.globalPos());
+       }
+       
+       
+    @SuppressWarnings("unused")
+       private void titleColorWhite() {noteSignal.titleColorChanged.emit(QColor.white.rgb());}
+    @SuppressWarnings("unused")
+       private void titleColorRed() {noteSignal.titleColorChanged.emit(QColor.red.rgb());}
+    @SuppressWarnings("unused")
+       private void titleColorBlue() {noteSignal.titleColorChanged.emit(QColor.blue.rgb());}
+    @SuppressWarnings("unused")
+       private void titleColorGreen() {noteSignal.titleColorChanged.emit(QColor.green.rgb());}
+    @SuppressWarnings("unused")
+       private void titleColorYellow(){noteSignal.titleColorChanged.emit(QColor.yellow.rgb());}
+    @SuppressWarnings("unused")
+       private void titleColorBlack() {noteSignal.titleColorChanged.emit(QColor.black.rgb());}
+    @SuppressWarnings("unused")
+       private void titleColorGray() {noteSignal.titleColorChanged.emit(QColor.gray.rgb());}
+    @SuppressWarnings("unused")
+       private void titleColorCyan() {noteSignal.titleColorChanged.emit(QColor.cyan.rgb());}
+    @SuppressWarnings("unused")
+       private void titleColorMagenta() {noteSignal.titleColorChanged.emit(QColor.magenta.rgb());}
+       @SuppressWarnings("unused")
+       private void notePinned() {noteSignal.notePinned.emit();}
+       
+
+       @Override
+       public void dragEnterEvent(QDragEnterEvent event) {
+               StringBuffer guid = new StringBuffer(1000);
+               
+               showColumn(Global.noteTableGuidPosition);
+               List<QModelIndex> selections = selectionModel().selectedRows();
+               hideColumn(Global.noteTableGuidPosition);
+               
+       if (selections.size() > 0) {
+               QModelIndex index;
+               for (int i=0; i<selections.size(); i++) {
+                       int row = selections.get(i).row();
+                       index = proxyModel.index(row, Global.noteTableGuidPosition);
+                       SortedMap<Integer, Object> ix = proxyModel.itemData(index);
+                       guid.append((String)ix.values().toArray()[0]);
+                       guid.append(" ");
+               }
+       }
+               event.mimeData().setData("application/x-nevernote-note", new QByteArray(guid.toString()));
+               event.accept();
+                               
+       }
+       
+       @Override
+       public void dropEvent(QDropEvent event) {
+               if (event.source() == this)
+                       event.ignore();
+       }
+       
+       // Return a column width
+       public int getColumnWidth(int col) {
+               return columnWidth(col);
+       }
+       
+       public void toggleSubjectDate(Boolean toggle) {
+               Global.saveColumnVisible("dateSubject", toggle);
+               setColumnHidden(Global.noteTableSubjectDatePosition, !toggle);
+       }
+       
+       public void toggleChangedDate(Boolean toggle) {
+               Global.saveColumnVisible("dateChanged", toggle);
+               setColumnHidden(Global.noteTableChangedPosition, !toggle);
+       }
+       
+       
+       public void toggleCreationDate(Boolean toggle) {
+               Global.saveColumnVisible("dateCreated", toggle);
+               setColumnHidden(Global.noteTableCreationPosition, !toggle);
+       }
+       
+       public void toggleSourceUrl(Boolean toggle) {
+               Global.saveColumnVisible("sourceUrl", toggle);
+               setColumnHidden(Global.noteTableSourceUrlPosition, !toggle);
+       }
+       
+       public void toggleAuthor(Boolean toggle) {
+               Global.saveColumnVisible("author", toggle);
+               setColumnHidden(Global.noteTableAuthorPosition, !toggle);
+       }
+       
+       public void toggleNotebook(Boolean toggle) {
+               Global.saveColumnVisible("notebook", toggle);
+               setColumnHidden(Global.noteTableNotebookPosition, !toggle);
+       }
+
+       public void toggleTitle(Boolean toggle) {
+               Global.saveColumnVisible("title", toggle);
+               setColumnHidden(Global.noteTableTitlePosition, !toggle);
+       }
+
+       public void toggleTags(Boolean toggle) {
+               Global.saveColumnVisible("tags", toggle);
+               setColumnHidden(Global.noteTableTagPosition, !toggle);
+       }
+       
+       public void toggleSynchronized(Boolean toggle) {
+               Global.saveColumnVisible("synchronized", toggle);
+               setColumnHidden(Global.noteTableSynchronizedPosition, !toggle);
+       }
+       public void togglePinned(Boolean toggle) {
+               Global.saveColumnVisible("pinned", toggle);
+               setColumnHidden(Global.noteTablePinnedPosition, !toggle);
+       }
+       public void toggleGuid(Boolean toggle) {
+               Global.saveColumnVisible("guid", toggle);
+               setColumnHidden(Global.noteTableGuidPosition, !toggle);
+       }       
+       public void toggleThumbnail(Boolean toggle) {
+               Global.saveColumnVisible("thumbnail", toggle);
+               int size;
+               if (!toggle) {
+                       QFontMetrics f = QApplication.fontMetrics();
+                       size = f.height();
+                       verticalHeader().setDefaultSectionSize(f.height());
+               } else
+                       size = Global.smallThumbnailSize.height();
+               for (int i=0; i<runner.getNoteTableModel().rowCount(); i++) {
+                       setRowHeight(i, size);
+               }
+                       
+               setColumnHidden(Global.noteTableThumbnailPosition, !toggle);
+       }
+}