/* Copyright (C) 2003-2011 JabRef contributors. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sf.jabref.gui; import javax.swing.JTable; import javax.swing.table.JTableHeader; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import net.sf.jabref.Globals; import net.sf.jabref.Util; import net.sf.jabref.specialfields.SpecialFieldsUtils; /** * Related to <code>MainTable</code> class. <br/> * Prevents dragging of the first header column ("#"). Prevents dragging of * unnamed (aka special) header columns. This is needed to prevent the user from * putting the gui table in an inconsistent state.<br/> * * This might not be the best way to solve this problem. Overriding * <code>getDraggedColumn</code> produces some ugly gui dragging artifacts if a * user attempts to drag something before the first columns. * * @author Daniel Waeber * @author Fabian Bieker * @since 12/2008 */ public class PreventDraggingJTableHeader extends JTableHeader { public PreventDraggingJTableHeader(TableColumnModel cm) { super(cm); } /** * Overridden to prevent dragging of first column ("#") and special (unnamed) * columns. */ @Override public void setDraggedColumn(TableColumn column) { if (column != null) { // prevent dragging of "#" if (column.getModelIndex() == 0) { return; } // prevent dragging of unnamed (aka special) columns // in the most recent JabRef, the special columns have a one letter heading, // therefore, isUnnamed will always return "false" // to be safe, we keep this call nevertheless // (this is the null check for getHeaderValue()) if (isUnnamed(column)) { return; } // prevent dragging of special field columns String headerValue = column.getHeaderValue().toString(); if (headerValue.equals("P") || headerValue.equals("Q") || headerValue.equals("R")) { // the letters are guessed. Don't know, where they are set in the code. return; } // other icon columns should also not be dragged // note that "P" is used for "PDF" and "Priority" if (headerValue.equals("F") || headerValue.equals("U")) { return; } } super.setDraggedColumn(column); } /** * Overridden to prevent dragging of an other column before the first * columns ("#" and the unnamed ones). * */ @Override public TableColumn getDraggedColumn() { TableColumn column = super.getDraggedColumn(); if (column != null) { preventDragBeforeIndex(this.getTable(), column.getModelIndex(), getSpecialColumnsCount()); } return column; } /** * Note: used to prevent dragging of other columns before the special * columns. * * @return count of special columns */ private int getSpecialColumnsCount() { int count = 0; if (Globals.prefs.getBoolean("fileColumn")) { count++; } if (Globals.prefs.getBoolean("pdfColumn")) { count++; } if (Globals.prefs.getBoolean("urlColumn")) { count++; } if (Globals.prefs.getBoolean("arxivColumn")) { count++; } // special field columns may also not be dragged if (Globals.prefs.getBoolean(SpecialFieldsUtils.PREF_SPECIALFIELDSENABLED)) { if (Globals.prefs.getBoolean(SpecialFieldsUtils.PREF_SHOWCOLUMN_RANKING)) count++; if (Globals.prefs.getBoolean(SpecialFieldsUtils.PREF_SHOWCOLUMN_RELEVANCE)) count++; if (Globals.prefs.getBoolean(SpecialFieldsUtils.PREF_SHOWCOLUMN_QUALITY)) count++; if (Globals.prefs.getBoolean(SpecialFieldsUtils.PREF_SHOWCOLUMN_PRIORITY)) count++; } return count; } private static boolean isUnnamed(TableColumn column) { return column.getHeaderValue() == null || "".equals(column.getHeaderValue().toString()); } /** * Transform model index <code>mColIndex</code> to a view based index and * prevent dragging before model index <code>toIndex</code> (inclusive). */ private static void preventDragBeforeIndex(JTable table, int mColIndex, int toIndex) { for (int c = 0; c < table.getColumnCount(); c++) { TableColumn col = table.getColumnModel().getColumn(c); // found the element in the view ... // ... and check if it should not be dragged if (col.getModelIndex() == mColIndex && c <= toIndex) { // Util.pr("prevented! viewIndex = " + c + " modelIndex = " // + mColIndex + " toIndex = " + toIndex); // prevent dragging (move it back ...) table.getColumnModel().moveColumn(toIndex, toIndex + 1); return; // we are done now } } } }