/* * This file is part of NixNote * Copyright 2009 Randy Baumgarte * * 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.filters; import java.util.HashMap; import com.trolltech.qt.core.QAbstractItemModel; import com.trolltech.qt.core.QModelIndex; import com.trolltech.qt.core.QObject; import com.trolltech.qt.core.Qt; import com.trolltech.qt.gui.QIcon; import com.trolltech.qt.gui.QImage; import com.trolltech.qt.gui.QSortFilterProxyModel; import cx.fbn.nevernote.Global; import cx.fbn.nevernote.evernote.NoteMetadata; public class NoteSortFilterProxyModel extends QSortFilterProxyModel { private final HashMap guids; private final HashMap pinnedGuids; public Signal2 sortChanged; public boolean blocked; public NoteSortFilterProxyModel(QObject parent) { super(parent); guids = new HashMap(); pinnedGuids = new HashMap(); setDynamicSortFilter(true); sortChanged = new Signal2(); } public void clear() { guids.clear(); } public void addGuid(String guid, NoteMetadata meta) { if (!guids.containsKey(guid)) guids.put(guid, meta); if (meta!= null && pinnedGuids != null && meta.isPinned() == true && !pinnedGuids.containsKey(guid)) pinnedGuids.put(guid, meta); } public void filter() { invalidateFilter(); } @Override protected boolean filterAcceptsRow(int sourceRow, QModelIndex sourceParent) { QAbstractItemModel model = sourceModel(); QModelIndex guidIndex = sourceModel().index(sourceRow, Global.noteTableGuidPosition); String guid = (String)model.data(guidIndex); if (guids.containsKey(guid) || pinnedGuids.containsKey(guid)) return true; else return false; } @Override public void sort(int col, Qt.SortOrder order) { if (col != Global.noteTableThumbnailPosition) { if (!blocked) { sortChanged.emit(col, order.value()); // Signal that the sort order has been modified } super.sort(col,order); } } @Override protected boolean lessThan(QModelIndex left, QModelIndex right) { Object leftData = sourceModel().data(left); Object rightData = sourceModel().data(right); if (rightData == null) return true; if (leftData instanceof QIcon) return true; if (leftData instanceof QImage && rightData instanceof QImage) return true; if (leftData instanceof Long && rightData instanceof Long) { Long leftLong = (Long)leftData; Long rightLong = (Long)rightData; return leftLong.compareTo(rightLong) < 0; } if (leftData instanceof String && rightData instanceof String) { String leftString = (String)leftData; String rightString = (String)rightData; return leftString.compareTo(rightString) < 0; } return super.lessThan(left, right); } }