/* Copyright (C) 2012 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.specialfields;
import java.util.ArrayList;
import java.util.List;
import net.sf.jabref.Util;
import net.sf.jabref.BibtexEntry;
import net.sf.jabref.Globals;
import net.sf.jabref.undo.NamedCompound;
public class SpecialFieldsUtils {
public final static String FIELDNAME_PRIORITY = "priority";
public final static String FIELDNAME_RANKING = "ranking";
public final static String FIELDNAME_RELEVANCE = "relevance";
public final static String FIELDNAME_QUALITY = "qualityassured";
public final static String PREF_SPECIALFIELDSENABLED = "specialFieldsEnabled";
public final static Boolean PREF_SPECIALFIELDSENABLED_DEFAULT = Boolean.FALSE;
public final static String PREF_SHOWCOLUMN_RANKING = "showRankingColumn";
public final static Boolean PREF_SHOWCOLUMN_RANKING_DEFAULT = Boolean.TRUE;
public final static String PREF_RANKING_COMPACT = "compactRankingColumn";
public final static Boolean PREF_RANKING_COMPACT_DEFAULT = Boolean.TRUE;
public final static String PREF_SHOWCOLUMN_PRIORITY = "showPriorityColumn";
public final static Boolean PREF_SHOWCOLUMN_PRIORITY_DEFAULT = Boolean.FALSE;
public final static String PREF_SHOWCOLUMN_RELEVANCE = "showRelevanceColumn";
public final static Boolean PREF_SHOWCOLUMN_RELEVANCE_DEFAULT = Boolean.FALSE;
public final static String PREF_SHOWCOLUMN_QUALITY = "showQualityColumn";
public final static Boolean PREF_SHOWCOLUMN_QUALITY_DEFAULT = Boolean.FALSE;
public final static String PREF_AUTOSYNCSPECIALFIELDSTOKEYWORDS = "autoSyncSpecialFieldsToKeywords";
public final static Boolean PREF_AUTOSYNCSPECIALFIELDSTOKEYWORDS_DEFAULT = Boolean.FALSE;
public final static String PREF_SERIALIZESPECIALFIELDS = "serializeSpecialFields";
public final static Boolean PREF_SERIALIZESPECIALFIELDS_DEFAULT = Boolean.TRUE;
/****************************************************/
/** generic treatment **/
/** no special treatment any more, thanks to enums **/
/****************************************************/
/**
* @param e - Field to be handled
* @param value - may be null to state that field should be emptied
* @param be - BibTeXEntry to be handled
* @param ce - Filled with undo info (if necessary)
* @param nullFieldIfValueIsTheSame - true: field is nulled if value is the same than the current value in be
*/
public static void updateField(SpecialField e, String value, BibtexEntry be, NamedCompound ce, boolean nullFieldIfValueIsTheSame) {
Util.updateField(be, e.getFieldName(), value, ce, nullFieldIfValueIsTheSame);
// we cannot use "value" here as updateField has side effects: "nullFieldIfValueIsTheSame" nulls the field if value is the same
exportFieldToKeywords(e, be.getField(e.getFieldName()), be, ce);
}
private static void exportFieldToKeywords(SpecialField e, BibtexEntry be, NamedCompound ce) {
exportFieldToKeywords(e, be.getField(e.getFieldName()), be, ce);
}
private static void exportFieldToKeywords(SpecialField e, String newValue, BibtexEntry be, NamedCompound ce) {
if (!SpecialFieldsUtils.keywordSyncEnabled()) return;
ArrayList<String> keywordList = Util.getSeparatedKeywords(be);
List<String> values = e.getKeyWords();
int foundPos = -1;
// cleanup keywords
for (Object value: values) {
int pos = keywordList.indexOf(value);
if (pos >= 0) {
foundPos = pos;
keywordList.remove(pos);
}
}
if (newValue != null) {
if (foundPos == -1) {
keywordList.add(newValue);
} else {
keywordList.add(foundPos, newValue);
}
}
Util.putKeywords(be, keywordList, ce);
}
/**
* Update keywords according to values of special fields
*
* @param nc indicates the undo named compound. May be null
*/
public static void syncKeywordsFromSpecialFields(BibtexEntry be, NamedCompound nc) {
exportFieldToKeywords(Priority.getInstance(), be, nc);
exportFieldToKeywords(Rank.getInstance(), be, nc);
exportFieldToKeywords(Relevance.getInstance(), be, nc);
exportFieldToKeywords(Quality.getInstance(), be, nc);
}
private static void importKeywordsForField(ArrayList<String> keywordList, SpecialField c, BibtexEntry be, NamedCompound nc) {
List<String> values = c.getKeyWords();
String newValue = null;
for (String val: values) {
if (keywordList.contains(val)) {
newValue = val;
break;
}
}
Util.updateField(be, c.getFieldName(), newValue, nc);
}
/**
* updates field values according to keywords
*
* @param nc indicates the undo named compound. May be null
*/
public static void syncSpecialFieldsFromKeywords(BibtexEntry be, NamedCompound ce) {
if (be.getField("keywords") == null)
return;
ArrayList<String> keywordList = Util.getSeparatedKeywords(be.getField("keywords"));
importKeywordsForField(keywordList, Priority.getInstance(), be, ce);
importKeywordsForField(keywordList, Rank.getInstance(), be, ce);
importKeywordsForField(keywordList, Quality.getInstance(), be, ce);
importKeywordsForField(keywordList, Relevance.getInstance(), be, ce);
}
/**
* @param fieldName the fieldName
* @return an instance of that field. The returned object is a singleton. null is returned if fieldName does not indicate a special field
*/
public static SpecialField getSpecialFieldInstanceFromFieldName(String fieldName) {
if (fieldName.equals(FIELDNAME_PRIORITY)) {
return Priority.getInstance();
} else if (fieldName.equals(FIELDNAME_QUALITY)) {
return Quality.getInstance();
} else if (fieldName.equals(FIELDNAME_RANKING)) {
return Rank.getInstance();
} else if (fieldName.equals(FIELDNAME_RELEVANCE)) {
return Relevance.getInstance();
} else {
return null;
}
}
/**
* @param fieldName the name of the field to check
* @return true if given field is a special field, false otherwise
*/
public static boolean isSpecialField(String fieldName) {
return (getSpecialFieldInstanceFromFieldName(fieldName) != null);
}
public static boolean keywordSyncEnabled() {
return Globals.prefs.getBoolean(SpecialFieldsUtils.PREF_SPECIALFIELDSENABLED) &&
Globals.prefs.getBoolean(SpecialFieldsUtils.PREF_AUTOSYNCSPECIALFIELDSTOKEYWORDS);
}
}