/*
Copyright (C) 2003 Morten O. Alver
All programs in this directory and
subdirectories are published under the GNU General Public License as
described below.
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
Further information about the GNU GPL is available at:
http://www.gnu.org/copyleft/gpl.ja.html
Note:
Modified for use in JabRef.
*/
package net.sf.jabref;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
/**
* Static variables for graphics files and keyboard shortcuts.
*/
public class GUIGlobals {
// Frame titles.
public static String
frameTitle = "JabRef",
version = Globals.VERSION,
stringsTitle = "Strings for database",
//untitledStringsTitle = stringsTitle + Globals.lang("untitled"),
untitledTitle = "untitled",
helpTitle = "JabRef help",
TYPE_HEADER = "entrytype",
NUMBER_COL = "#",
encPrefix = "Encoding: ", // Part of the signature in written bib files.
linuxDefaultLookAndFeel = "com.jgoodies.looks.plastic.Plastic3DLookAndFeel",
//linuxDefaultLookAndFeel = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel",
//linuxDefaultLookAndFeel = "org.jvnet.substance.skin.SubstanceCremeCoffeeLookAndFeel",
//linuxDefaultLookAndFeel = "org.jvnet.substance.skin.SubstanceNebulaLookAndFeel",
//linuxDefaultLookAndFeel = "org.jvnet.substance.skin.SubstanceBusinessLookAndFeel",
//windowsDefaultLookAndFeel = "com.jgoodies.looks.windows.WindowsLookAndFeel";
windowsDefaultLookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
public static Font CURRENTFONT,
typeNameFont,
jabRefFont,
fieldNameFont;
// Signature written at the top of the .bib file.
public static final String SIGNATURE =
"This file was created with JabRef";
// Size of help window.
static Dimension
helpSize = new Dimension(700, 600),
aboutSize = new Dimension(600, 265),
searchPaneSize = new Dimension(430, 70),
searchFieldSize = new Dimension(215, 25);
// Divider size for BaseFrame split pane. 0 means non-resizable.
public static final int
SPLIT_PANE_DIVIDER_SIZE = 4,
SPLIT_PANE_DIVIDER_LOCATION = 145 + 15, // + 15 for possible scrollbar.
TABLE_ROW_PADDING = 4,
KEYBIND_COL_0 = 200,
KEYBIND_COL_1 = 80, // Added to the font size when determining table
PREVIEW_PANEL_PADDING = 15, // Extra room given to the preview editor, in addition to its own
PREVIEW_PANEL_HEIGHT = 200,
MAX_CONTENT_SELECTOR_WIDTH = 240; // The max width of the combobox for content selectors.
// calculated preferred size
//public static final int[] PREVIEW_HEIGHT = {115, 300};
// row height
public static final double
VERTICAL_DIVIDER_LOCATION = 0.4;
// File names.
public static String //configFile = "preferences.dat",
backupExt = ".bak",
tempExt = ".tmp",
defaultDir = ".";
// Image paths.
public static String
imageSize = "24",
extension = ".gif",
ex = imageSize + extension,
pre = "/images/",
helpPre = "/help/",
fontPath = "/images/font/";
static HashMap<String, JLabel> tableIcons = new HashMap<String, JLabel>(); // Contains table icon mappings. Set up
// further below.
public static Color activeEditor = new Color(230, 230, 255);
static HashMap<String, String> iconMap;
public static JLabel getTableIcon(String fieldType) {
Object o = tableIcons.get(fieldType);
if (o == null) {
Globals.logger("Error: no table icon defined for type '"+fieldType+"'.");
return null;
} else return (JLabel)o;
}
//Help files (in HTML format):
public static String
baseFrameHelp = "BaseFrameHelp.html",
entryEditorHelp = "EntryEditorHelp.html",
stringEditorHelp = "StringEditorHelp.html",
helpContents = "Contents.html",
searchHelp = "SearchHelp.html",
groupsHelp = "GroupsHelp.html",
customEntriesHelp = "CustomEntriesHelp.html",
contentSelectorHelp = "ContentSelectorHelp.html",
labelPatternHelp = "LabelPatterns.html",
ownerHelp = "OwnerHelp.html",
timeStampHelp = "TimeStampHelp.html",
pdfHelp = "ExternalFiles.html",
exportCustomizationHelp = "CustomExports.html",
importCustomizationHelp = "CustomImports.html",
medlineHelp = "MedlineHelp.html",
citeSeerHelp = "CiteSeerHelp.html",
generalFieldsHelp = "GeneralFields.html",
aboutPage = "About.html",
shortPlainImport="ShortPlainImport.html",
importInspectionHelp = "ImportInspectionDialog.html",
shortIntegrityCheck="ShortIntegrityCheck.html",
shortAuxImport="ShortAuxImport.html",
remoteHelp = "RemoteHelp.html",
journalAbbrHelp = "JournalAbbreviations.html",
regularExpressionSearchHelp = "ExternalFiles.html#RegularExpressionSearch",
nameFormatterHelp = "CustomExports.html#NameFormatter",
previewHelp = "PreviewHelp.html",
pluginHelp = "Plugin.html",
autosaveHelp = "Autosave.html";
// Colors.
public static Color
lightGray = new Color(230, 30, 30), // Light gray background
entryEditorLabelColor = new Color(100, 100, 150), // Empty field, blue.
nullFieldColor = new Color(75, 130, 95), // Valid field, green.
gradientGray = new Color(112, 121, 165), // Title bar gradient color, sidepaneheader
gradientBlue = new Color(0, 27, 102), // Title bar gradient color, sidepaneheader
//activeTabbed = Color.black, // active Database (JTabbedPane)
//inActiveTabbed = Color.gray.darker(), // inactive Database
activeTabbed = entryEditorLabelColor.darker(), // active Database (JTabbedPane)
inActiveTabbed = Color.black, // inactive Database
infoField = new Color(254, 255, 225) // color for an info field
;
//DOCEAR - set private
private static Color
editorTextColor = null, validFieldBackgroundColor = null,
activeBackground = null, invalidFieldBackgroundColor = null;
public static String META_FLAG = "jabref-meta: ";
public static String META_FLAG_OLD = "bibkeeper-meta: ";
public static String ENTRYTYPE_FLAG = "jabref-entrytype: ";
// some fieldname constants
public static final double
DEFAULT_FIELD_WEIGHT = 1,
MAX_FIELD_WEIGHT = 2;
// constants for editor types:
public static final int
STANDARD_EDITOR=1,
FILE_LIST_EDITOR=2;
public static final int MAX_BACK_HISTORY_SIZE = 10; // The maximum number of "Back" operations stored.
public static final String FILE_FIELD = "file";
public static final double
SMALL_W = 0.30,
MEDIUM_W = 0.5,
LARGE_W = 1.5 ;
public static final double PE_HEIGHT = 2;
// Size constants for EntryTypeForm; small, medium and large.
public static int[] FORM_WIDTH = new int[] { 500, 650, 820};
public static int[] FORM_HEIGHT = new int[] { 90, 110, 130};
// Constants controlling formatted bibtex output.
public static final int
INDENT = 4,
LINE_LENGTH = 65; // Maximum
public static int DEFAULT_FIELD_LENGTH = 100,
NUMBER_COL_LENGTH = 32,
WIDTH_ICON_COL = 19;
// Column widths for export customization dialog table:
public static final int
EXPORT_DIALOG_COL_0_WIDTH = 50,
EXPORT_DIALOG_COL_1_WIDTH = 200,
EXPORT_DIALOG_COL_2_WIDTH = 30;
// Column widths for import customization dialog table:
public static final int
IMPORT_DIALOG_COL_0_WIDTH = 200,
IMPORT_DIALOG_COL_1_WIDTH = 80,
IMPORT_DIALOG_COL_2_WIDTH = 200,
IMPORT_DIALOG_COL_3_WIDTH = 200;
public static final Map<String, String> LANGUAGES;
static {
LANGUAGES = new TreeMap<String, String>();
// LANGUAGES contains mappings for supported languages.
LANGUAGES.put("English", "en");
LANGUAGES.put("Dansk", "da");
LANGUAGES.put("Deutsch", "de");
LANGUAGES.put("Fran\u00E7ais", "fr");
LANGUAGES.put("Italiano", "it");
LANGUAGES.put("Japanese", "ja");
LANGUAGES.put("Nederlands", "nl");
LANGUAGES.put("Norsk", "no");
//LANGUAGES.put("EspaƱol", "es"); // Not complete
//LANGUAGES.put("Polski", "pl");
LANGUAGES.put("Turkish", "tr");
LANGUAGES.put("Simplified Chinese", "zh");
LANGUAGES.put("Vietnamese", "vi");
LANGUAGES.put("Bahasa Indonesia", "in");
// Set up entry editor colors, first time:
//DOCEAR - causes recursive contructor call on JabRefPreferences
//updateEntryEditorColors();
}
public static void updateEntryEditorColors() {
activeBackground = JabRefPreferences.getInstance().getColor("activeFieldEditorBackgroundColor");
validFieldBackgroundColor = JabRefPreferences.getInstance().getColor("validFieldBackgroundColor");
invalidFieldBackgroundColor = JabRefPreferences.getInstance().getColor("invalidFieldBackgroundColor");
editorTextColor = JabRefPreferences.getInstance().getColor("fieldEditorTextColor");
}
//DOCEAR
public static Color getInvalidFieldBackgroundColor() {
if(invalidFieldBackgroundColor == null) {
updateEntryEditorColors();
}
return invalidFieldBackgroundColor;
}
//DOCEAR
public static Color getActiveBackground() {
if(activeBackground == null) {
updateEntryEditorColors();
}
return activeBackground;
}
//DOCEAR
public static Color getValidFieldBackgroundColor() {
if(validFieldBackgroundColor == null) {
updateEntryEditorColors();
}
return validFieldBackgroundColor;
}
//DOCEAR
public static Color getEditorTextColor() {
if(editorTextColor == null) {
updateEntryEditorColors();
}
return editorTextColor;
}
/**
* Read either the default icon theme, or a custom one. If loading of the custom theme
* fails, try to fall back on the default theme.
*/
public static void setUpIconTheme() {
String defaultPrefix = "/images/crystal_16/", prefix = defaultPrefix;
URL defaultResource = GUIGlobals.class.getResource(prefix+"Icons.properties");
URL resource = defaultResource;
if (Globals.prefs.getBoolean("useCustomIconTheme")) {
String filename = Globals.prefs.get("customIconThemeFile");
if (filename != null)
try {
File file = new File(filename);
String parent = file.getParentFile().getAbsolutePath();
prefix = "file://"+parent+System.getProperty("file.separator");
resource = new URL("file://"+file.getAbsolutePath());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
try {
iconMap = readIconThemeFile(resource, prefix);
} catch (IOException e) {
System.err.println(Globals.lang("Unable to read icon theme file")+" '"+
resource.toString()+"'");
// If we were trying to load a custom theme, try the default one as a fallback:
if (resource != defaultResource)
try {
iconMap = readIconThemeFile(defaultResource, defaultPrefix);
} catch (IOException e2) {
System.err.println(Globals.lang("Unable to read default icon theme."));
}
}
}
/**
* Looks up the URL for the image representing the given function, in the resource
* file listing images.
* @param name The name of the icon, such as "open", "save", "saveAs" etc.
* @return The URL to the actual image to use.
*/
public static URL getIconUrl(String name) {
if (iconMap.containsKey(name)) {
String path = iconMap.get(name);
URL url = GUIGlobals.class.getResource(path);
if (url == null)
// This may be a resource outside of the jar file, so we try a general URL:
try {
url = new URL(path);
} catch (MalformedURLException e) {
}
if (url == null)
System.err.println(Globals.lang("Could not find image file")+" '"+path+"'");
return url;
}
else return null;
}
/**
* Constructs an ImageIcon for the given function, using the image specified in
* the resource files resource/Icons_en.properties.
* @param name The name of the icon, such as "open", "save", "saveAs" etc.
* @return The ImageIcon for the function.
*/
public static ImageIcon getImage(String name) {
URL u = getIconUrl(name);
return u != null ? new ImageIcon(getIconUrl(name)) : null;
}
/**
* Get a Map of all application icons mapped from their keys.
* @return A Map containing all icons used in the application.
*/
public static Map<String, String> getAllIcons() {
return Collections.unmodifiableMap(iconMap);
}
/**
* Read a typical java property file into a HashMap. Currently doesn't support escaping
* of the '=' character - it simply looks for the first '=' to determine where the key ends.
* Both the key and the value is trimmed for whitespace at the ends.
* @param file The URL to read information from.
* @param prefix A String to prefix to all values read. Can represent e.g. the directory
* where icon files are to be found.
* @return A HashMap containing all key-value pairs found.
* @throws IOException
*/
private static HashMap<String, String> readIconThemeFile(URL file, String prefix) throws IOException {
HashMap<String, String> map = new HashMap<String, String>();
InputStream in = null;
try {
in = file.openStream();
StringBuffer buffer = new StringBuffer();
int c;
while ((c = in.read()) != -1)
buffer.append((char)c);
String[] lines = buffer.toString().split("\n");
for (int i=0; i<lines.length; i++) {
String line = lines[i].trim();
int index = line.indexOf("=");
if (index >= 0) {
String key = line.substring(0, index).trim();
String value = prefix+line.substring(index+1).trim();
map.put(key, value);
}
}
} catch (IOException ex) {
throw ex;
} finally {
try {
if (in != null) in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return map;
}
/** returns the path to language independent help files */
public static String getLocaleHelpPath()
{
JabRefPreferences prefs = JabRefPreferences.getInstance() ;
String middle = prefs.get("language")+"/";
if (middle.equals("en/")) middle = ""; // english in base help dir.
return (helpPre + middle );
}
/**
* Perform initializations that are only used in graphical mode. This is to prevent
* the "Xlib: connection to ":0.0" refused by server" error when access to the X server
* on Un*x is unavailable.
*/
public static void init() {
typeNameFont = new Font("arial", Font.ITALIC+Font.BOLD, 24);
fieldNameFont = new Font("arial", Font.ITALIC+Font.BOLD, 14);
JLabel lab;
lab = new JLabel(getImage("pdfSmall"));
lab.setToolTipText(Globals.lang("Open")+" PDF");
tableIcons.put("pdf", lab);
lab = new JLabel(getImage("wwwSmall"));
lab.setToolTipText(Globals.lang("Open")+" URL");
tableIcons.put("url", lab);
lab = new JLabel(getImage("citeseer"));
lab.setToolTipText(Globals.lang("Open")+" CiteSeer URL");
tableIcons.put("citeseerurl", lab);
lab = new JLabel(getImage("arxiv"));
lab.setToolTipText(Globals.lang("Open")+" ArXiv URL");
tableIcons.put("eprint", lab);
lab = new JLabel(getImage("doiSmall"));
lab.setToolTipText(Globals.lang("Open")+" DOI "+Globals.lang("web link"));
tableIcons.put("doi", lab);
lab = new JLabel(getImage("psSmall"));
lab.setToolTipText(Globals.lang("Open")+" PS");
tableIcons.put("ps", lab);
lab = new JLabel(getImage("psSmall"));
lab.setToolTipText(Globals.lang("Open file"));
tableIcons.put(GUIGlobals.FILE_FIELD, lab);
//jabRefFont = new Font("arial", Font.ITALIC/*+Font.BOLD*/, 20);
}
}