/*\r
- * This file is part of NeverNote \r
+ * This file is part of NixNote \r
* Copyright 2009 Randy Baumgarte\r
* \r
* This file may be licensed under the terms of of the\r
package cx.fbn.nevernote;\r
\r
\r
-//import java.io.ByteArrayOutputStream;\r
-import java.io.File;\r
-import java.io.PrintStream;\r
+import java.io.ByteArrayInputStream;\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.IOException;\r
+import java.io.ObjectInputStream;\r
+import java.io.ObjectOutputStream;\r
import java.text.SimpleDateFormat;\r
import java.util.ArrayList;\r
import java.util.Calendar;\r
import java.util.HashMap;\r
import java.util.List;\r
-import java.util.concurrent.ArrayBlockingQueue;\r
+\r
+import org.apache.commons.lang3.StringEscapeUtils;\r
\r
import com.evernote.edam.type.Accounting;\r
import com.evernote.edam.type.PrivilegeLevel;\r
import com.evernote.edam.type.User;\r
import com.evernote.edam.type.UserAttributes;\r
+import com.swabunga.spell.engine.Configuration;\r
import com.trolltech.qt.core.QByteArray;\r
-import com.trolltech.qt.core.QMutex;\r
import com.trolltech.qt.core.QSettings;\r
+import com.trolltech.qt.core.QSize;\r
import com.trolltech.qt.gui.QPalette;\r
+import com.trolltech.qt.gui.QSystemTrayIcon;\r
\r
import cx.fbn.nevernote.config.FileManager;\r
import cx.fbn.nevernote.config.InitializationException;\r
import cx.fbn.nevernote.gui.ContainsAttributeFilterTable;\r
import cx.fbn.nevernote.gui.DateAttributeFilterTable;\r
import cx.fbn.nevernote.gui.ShortcutKeys;\r
-import cx.fbn.nevernote.signals.DBRunnerSignal;\r
-import cx.fbn.nevernote.threads.DBRunner;\r
import cx.fbn.nevernote.utilities.ApplicationLogger;\r
+import cx.fbn.nevernote.utilities.Pair;\r
+\r
+\r
+//*****************************************************\r
+//*****************************************************\r
+//* Global constants & static functions used by \r
+//* multiple threads.\r
+//*****************************************************\r
+//*****************************************************\r
\r
public class Global {\r
- public static String version = "0.88";\r
+ // Set current version and the known versions.\r
+ public static String version = "1.3";\r
+ public static String[] validVersions = {"1.2", "1.1", "1.0", "0.99", "0.98", "0.97", "0.96"};\r
public static String username = ""; \r
- public static String password = ""; \r
-\r
- public static DBRunner dbRunner; // Database thread\r
- public static DBRunnerSignal dbRunnerSignal; // Signals to the database runner\r
- public static QMutex dbrunnerWorkLock; // mutex lock for work queue\r
+ //public static String password = ""; \r
\r
\r
- public static int mainThreadId=0;\r
- private static ArrayBlockingQueue<Boolean> mainThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
+ // Each thread has an ID. This is used primarily to check the status\r
+ // of running threads.\r
+ public static final int mainThreadId=0;\r
+ public static final int syncThreadId=1;\r
+ public static final int tagCounterThreadId=2;\r
+ public static final int trashCounterThreadId=3; // This should always be the highest thread ID\r
+ public static final int indexThreadId=4; // Thread for indexing words\r
+ public static final int saveThreadId=5; // Thread used for processing data to saving content\r
+ public static final int notebookCounterThreadId=6; // Notebook Thread\r
+ public static final int indexThread03Id=7; // unused\r
+ public static final int indexThread04Id=8; // unused\r
+ public static final int dbThreadId=9; // This should always be the highest thread ID\r
+ public static final int threadCount = 10;\r
\r
- public static int syncThreadId=1;\r
- private static ArrayBlockingQueue<Boolean> syncThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
\r
- public static int tagCounterThreadId=2;\r
- private static ArrayBlockingQueue<Boolean> tagCounterThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
- \r
- public static int trashCounterThreadId=3; // This should always be the highest thread ID\r
- private static ArrayBlockingQueue<Boolean> trashCounterThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
-\r
- public static int indexThreadId=4; // Thread for indexing words\r
- private static ArrayBlockingQueue<Boolean> indexThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
-\r
- public static int saveThreadId=5; // Thread used for processing data to saving content\r
- private static ArrayBlockingQueue<Boolean> saveThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
-\r
- public static int notebookCounterThreadId=6; // Notebook Thread\r
- private static ArrayBlockingQueue<Boolean> notebookCounterThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
+ // These variables deal with where the list of notes appears\r
+ // They will either be vertical (View_List_Narrow) or will be\r
+ // on top of the note (View_List_Wide). It also has the size of\r
+ // thumbnails displayed in each view\r
+ public static int View_List_Wide = 1;\r
+ public static int View_List_Narrow = 2;\r
+ public static QSize smallThumbnailSize = new QSize(100,75);\r
+ public static QSize largeThumbnailSize = new QSize(300,225);\r
\r
- public static int indexThread03Id=7; // unused\r
- private static ArrayBlockingQueue<Boolean> indexThread03ThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
-\r
- public static int indexThread04Id=8; // unused\r
- private static ArrayBlockingQueue<Boolean> indexThread04ThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
+ // This is used to keep a running list of passwords that the user\r
+ // wants us to remember.\r
+ public static HashMap<String,Pair<String,String>> passwordSafe = new HashMap<String, Pair<String,String>>();\r
+ public static List<Pair<String,String>> passwordRemember = new ArrayList<Pair<String,String>>();\r
\r
- public static int dbThreadId=9; // This should always be the highest thread ID\r
\r
+ //public static String currentNotebookGuid;\r
\r
- public static HashMap<String,String> passwordSafe = new HashMap<String, String>();\r
- public static List<String> passwordRemember = new ArrayList<String>();\r
- public static String currentNotebookGuid;\r
+ // These deal with Evernote user settings\r
public static User user; \r
public static long authTimeRemaining;\r
public static long authRefreshTime;\r
- public static long failedRefreshes = 0;\r
- public static String currentDir;\r
- public static boolean keepRunning;\r
- \r
+ public static long failedRefreshes = 0; \r
public static String userStoreUrl;\r
public static String noteStoreUrl;\r
public static String noteStoreUrlBase;\r
- \r
+\r
+ // When we want to shut down we set this to true to short\r
+ // circut other threads\r
+ public static boolean keepRunning;\r
+ \r
+ // In the note list, these are the column numbers\r
+ // so I don't need to hard code numbers.\r
public static int noteTableCreationPosition = 0;\r
public static int noteTableTitlePosition = 1;\r
public static int noteTableTagPosition = 2;\r
public static int noteTableSourceUrlPosition = 7;\r
public static int noteTableSubjectDatePosition = 8;\r
public static int noteTableSynchronizedPosition = 9;\r
- public static int noteTableColumnCount = 10;\r
+ public static int noteTableThumbnailPosition = 10;\r
+ public static int noteTablePinnedPosition = 11;\r
+ public static int noteTableColumnCount = 12;\r
public static Integer cryptCounter = 0;\r
\r
- public static int minimumWordCount = 2;\r
+ //public static int minimumWordCount = 2;\r
+ \r
+ // Regular expression to parse text with when indexing\r
private static String wordRegex;\r
+ \r
+ // Experimental fixes. Set via Edit/Preferences/Debugging\r
public static boolean enableCarriageReturnFix = false;\r
+ public static boolean enableHTMLEntitiesFix = false;\r
\r
- public static QSettings settings;\r
- public static boolean isConnected;\r
- public static boolean showDeleted = false;\r
- public static boolean disableUploads = false;\r
- public static int messageLevel;\r
- public static String tagDelimeter = ",";\r
- public static String attachmentNameDelimeter = "------";\r
+ // Used to set & retrieve ini & Windows registry settings\r
+ public static QSettings settings; // Set & get ini settings\r
+ public static boolean isConnected; // Are we connected to Evernote\r
+ public static boolean showDeleted = false; // Show deleted notes?\r
+ public static boolean disableUploads = false; // Should we disable uploads (used in testing features)\r
+ public static int messageLevel; // The level of messages to write to the log files\r
+ public static String tagDelimeter = ","; // This is used to separate out tag names when entering above note\r
+ public static String attachmentNameDelimeter = "------"; // Used to separate out attachment names in the res directory\r
\r
- public static String databaseName = new String("NeverNote");\r
- public static String indexDatabaseName = new String("IndexDatabase.db");\r
+ \r
+ //* Database fields\r
+ public static String databaseName = new String("NeverNote"); // database name. used for multiple databases to separate settings.\r
+ public static String indexDatabaseName = new String("Index"); // searchable words database\r
+ public static String resourceDatabaseName = new String("Resources"); // attachments database\r
public static DateAttributeFilterTable createdSinceFilter;\r
public static DateAttributeFilterTable createdBeforeFilter;\r
public static DateAttributeFilterTable changedSinceFilter;\r
public static DateAttributeFilterTable changedBeforeFilter;\r
public static ContainsAttributeFilterTable containsFilter;\r
-// public static DBLock dbLock;\r
-// public static DBLock indexLock;\r
+ \r
+ // Log file used for debugging\r
public static ApplicationLogger logger;\r
- PrintStream stdoutStream;\r
+ //PrintStream stdoutStream;\r
+ \r
+ // Application key shortcuts & appearance\r
public static QPalette originalPalette;\r
public static ShortcutKeys shortcutKeys;\r
- private static boolean disableViewing;\r
\r
+ public static boolean disableViewing; // used to disable the editor\r
+ \r
+ // When saving a note, this is a list of things we strip out because Evernote hates them\r
public static List<String> invalidElements = new ArrayList<String>();\r
public static HashMap<String, ArrayList<String>> invalidAttributes = new HashMap<String, ArrayList<String>>();\r
- public static boolean mimicEvernoteInterface;\r
- public static HashMap<String,String> resourceMap;\r
- public static String cipherPassword = "";\r
\r
- static Calendar startTraceTime;\r
+ public static boolean mimicEvernoteInterface; // Try to mimic Evernote or allow multiple notebook selection\r
+ public static HashMap<String,String> resourceMap; // List of attachments for a note.\r
+ public static String cipherPassword = ""; // If the database is encrypted, this stores the password\r
+ public static String databaseCache = "16384"; // Default DB cache size\r
+ \r
+ // These are used for performance testing\r
+ static Calendar startTraceTime; \r
static Calendar intervalTraceTime;\r
-\r
- private static FileManager fileManager;\r
-\r
+ \r
+ static boolean syncOnly;\r
+ \r
+ private static FileManager fileManager; // Used to access files & directories\r
+ \r
// Do initial setup \r
public static void setup(StartupConfig startupConfig) throws InitializationException {\r
settings = new QSettings("fbn.cx", startupConfig.getName());\r
disableViewing = startupConfig.getDisableViewing();\r
+ syncOnly = startupConfig.isSyncOnly();\r
\r
- fileManager = new FileManager(startupConfig.getHomeDirPath());\r
- currentDir = fileManager.getHomeDirPath();\r
+ fileManager = new FileManager(startupConfig.getHomeDirPath(), startupConfig.getProgramDirPath());\r
\r
- getServer();\r
- settings.beginGroup("General");\r
- String regex = (String) settings.value("regex", "[,\\s]+");\r
- setWordRegex(regex);\r
- String wordString = settings.value("wordLength", "4").toString();\r
- Integer wordLen = new Integer(wordString);\r
- Global.minimumWordCount = wordLen;\r
- settings.endGroup();\r
- settings.beginGroup("Debug");\r
- String msglevel = (String) settings.value("messageLevel", "Low");\r
- settings.endGroup();\r
- messageLevel = 1;\r
- setMessageLevel(msglevel);\r
- keepRunning = true;\r
- disableUploads = disableUploads();\r
- enableCarriageReturnFix = enableCarriageReturnFix();\r
-// dbLock = new DBLock();\r
-// indexLock = new DBLock();\r
- logger = new ApplicationLogger("global.log");\r
- shortcutKeys = new ShortcutKeys();\r
- dbrunnerWorkLock = new QMutex();\r
- mimicEvernoteInterface = getMimicEvernoteInterface();\r
- resourceMap = new HashMap<String,String>();\r
- \r
- }\r
\r
- public static String getDirectoryPath() {\r
- if (currentDir == null) {\r
- currentDir = System.getProperty("user.dir");\r
- }\r
- if (!currentDir.substring(currentDir.length()-1).equals(File.separator)) {\r
- currentDir = currentDir+File.separator;\r
- }\r
- return currentDir;\r
+ getServer(); // Setup URL to connect to\r
+ \r
+ // Get regular expressions used to parse out words\r
+ settings.beginGroup("General");\r
+ String regex = (String) settings.value("regex", "[,\\s]+");\r
+ setWordRegex(regex);\r
+ settings.endGroup();\r
+ \r
+ //Setup debugging information\r
+ settings.beginGroup("Debug");\r
+ String msglevel = (String) settings.value("messageLevel", "Low");\r
+ settings.endGroup();\r
+ \r
+ \r
+ //messageLevel = 1;\r
+ setMessageLevel(msglevel);\r
+ keepRunning = true; // Make sure child threads stay running\r
+ disableUploads = disableUploads(); // Should we upload anything? Normally true.\r
+ enableCarriageReturnFix = enableCarriageReturnFix(); // Enable test fix?\r
+ enableHTMLEntitiesFix = enableHtmlEntitiesFix(); // Enable test fix?\r
+ \r
+ logger = new ApplicationLogger("global.log"); // Setup log for this class \r
+ shortcutKeys = new ShortcutKeys(); // Setup keyboard shortcuts.\r
+ mimicEvernoteInterface = getMimicEvernoteInterface(); // Should we mimic Evernote's notebook behavior\r
+ resourceMap = new HashMap<String,String>(); // Setup resource map used to store attachments when editing\r
+ \r
+ databaseCache = getDatabaseCacheSize(); // Set database cache size \r
+ \r
+ Global.username = getUserInformation().getUsername();\r
}\r
\r
+ // Get/Set word parsing regular expression\r
public static String getWordRegex() {\r
return wordRegex;\r
}\r
public static void setWordRegex(String r) {\r
wordRegex = r;\r
}\r
- public static void setMessageLevel(String msglevel) {\r
+\r
+ // Set the debug message level\r
+ public static void setMessageLevel(String msglevel) {\r
if (msglevel.equalsIgnoreCase("low")) \r
messageLevel = 1;\r
if (msglevel.equalsIgnoreCase("medium")) \r
settings.endGroup(); \r
}\r
\r
+ //****************************************************\r
+ //****************************************************\r
+ //** Save user account information from Evernote\r
+ //****************************************************\r
+ //****************************************************\r
public static void saveUserInformation(User user) {\r
settings.beginGroup("User");\r
settings.setValue("id", user.getId());\r
settings.setValue("created", user.getCreated());\r
settings.setValue("updated", user.getUpdated());\r
settings.setValue("deleted", user.getDeleted());\r
+ settings.setValue("shard", user.getShardId());\r
settings.endGroup();\r
isPremium();\r
if (user.getAttributes()!=null)\r
saveUserAccounting(user.getAccounting());\r
\r
}\r
+ public static User getUserInformation() {\r
+ User user = new User();\r
+ settings.beginGroup("User");\r
+ try { \r
+ user.setId((Integer)settings.value("id", 0)); \r
+ } catch (java.lang.ClassCastException e) {\r
+ user.setId(new Integer((String)settings.value("id", "0")));\r
+ }\r
+ String username = (String)settings.value("username", "");\r
+ String email = (String)settings.value("email", "");\r
+ String name = (String)settings.value("name", "");\r
+ String timezone = (String)settings.value("timezone", "");\r
+ Integer privilege = 0;\r
+ try { \r
+ privilege = new Integer((String)settings.value("privilege", "0")); \r
+ } catch (java.lang.ClassCastException e) {\r
+ privilege = (Integer)settings.value("privilege", 0);\r
+ }\r
+\r
+ try { \r
+ String date = (String)settings.value("created", "0");\r
+ user.setCreated(new Long(date));\r
+ date = (String)settings.value("updated", "0");\r
+ user.setUpdated(new Long(date));\r
+ date = (String)settings.value("deleted", "0");\r
+ user.setDeleted(new Long(date));\r
+ } catch (java.lang.ClassCastException e) {\r
+ Long date = (Long)settings.value("created", 0);\r
+ user.setCreated(date);\r
+ date = (Long)settings.value("updated", 0);\r
+ user.setUpdated(date);\r
+ date = (Long)settings.value("deleted", 0);\r
+ user.setDeleted(date);\r
+ }\r
+\r
+ String shard = (String)settings.value("shard", "");\r
+ settings.endGroup();\r
+ \r
+ user.setUsername(username);\r
+ user.setEmail(email);\r
+ user.setName(name);\r
+ user.setTimezone(timezone);\r
+ PrivilegeLevel userLevel = PrivilegeLevel.findByValue(privilege);\r
+ user.setPrivilege(userLevel);\r
+ user.setShardId(shard);\r
+ return user;\r
+ }\r
+ \r
public static void saveUserAttributes(UserAttributes attrib) {\r
settings.beginGroup("UserAttributes");\r
settings.setValue("defaultLocationName", attrib.getDefaultLocationName());\r
settings.endGroup();\r
return limit;\r
}\r
+\r
+ \r
+ \r
+ //****************************************************\r
+ //****************************************************\r
+ //** View settings. Used to restore settings \r
+ //** when starting and to control how the program\r
+ //** behaves.\r
+ //****************************************************\r
+ //****************************************************\r
+ \r
+ //* Get/Set if we should show a tray icon\r
public static boolean showTrayIcon() {\r
settings.beginGroup("General");\r
- String max = (String) settings.value("showTrayIcon", "true");\r
- settings.endGroup();\r
- if (!max.equalsIgnoreCase("true"))\r
- return false;\r
- return true; \r
+ try {\r
+ String max = (String) settings.value("showTrayIcon", "false");\r
+ settings.endGroup();\r
+ if (!max.equalsIgnoreCase("true") || !QSystemTrayIcon.isSystemTrayAvailable())\r
+ return false;\r
+ else\r
+ return true; \r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("showTrayIcon", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void setShowTrayIcon(boolean val) {\r
settings.beginGroup("General");\r
settings.setValue("showTrayIcon", "false");\r
settings.endGroup();\r
}\r
+ \r
+ // Get/Set window maximized when closed last\r
public static boolean wasWindowMaximized() {\r
- settings.beginGroup("General");\r
- String max = (String) settings.value("isMaximized", "true");\r
- settings.endGroup();\r
- if (!max.equalsIgnoreCase("true"))\r
- return false;\r
- return true; \r
+ try {\r
+ settings.beginGroup("General");\r
+ String max = (String) settings.value("isMaximized", "true");\r
+ settings.endGroup();\r
+ if (!max.equalsIgnoreCase("true"))\r
+ return false;\r
+ return true; \r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("isMaximized", true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void saveWindowMaximized(boolean isMax) {\r
settings.beginGroup("General");\r
settings.setValue("isMaximized", "false");\r
settings.endGroup();\r
}\r
+ \r
+ // Get/set currently viewed note Guid\r
public static String getLastViewedNoteGuid() {\r
settings.beginGroup("General");\r
String guid = (String) settings.value("lastViewedNote", "");\r
settings.setValue("lastViewedNote", "");\r
settings.endGroup();\r
}\r
+ \r
+ // Get/Set the note column we are sorted on and the order\r
public static void setSortColumn(int i) {\r
+ int view = Global.getListView();\r
settings.beginGroup("General");\r
- settings.setValue("sortColumn", i);\r
+ if (view == Global.View_List_Wide)\r
+ settings.setValue("sortColumn", i);\r
+ else\r
+ settings.setValue("sortColumn-Narrow", i);\r
settings.endGroup();\r
}\r
public static int getSortColumn() {;\r
+ String key;\r
+ if (Global.getListView() == Global.View_List_Wide)\r
+ key = "sortColumn";\r
+ else\r
+ key = "sortColumn-Narrow";\r
+\r
settings.beginGroup("General");\r
int order; \r
try {\r
- String val = settings.value("sortColumn", new Integer(0)).toString();\r
+ String val = settings.value(key, new Integer(0)).toString();\r
order = new Integer(val.trim());\r
} catch (Exception e) {\r
try {\r
- order = (Integer)settings.value("sortColumn", 0);\r
+ order = (Integer)settings.value(key, 0);\r
} catch (Exception e1) {\r
order = 0;\r
}\r
return order;\r
}\r
public static void setSortOrder(int i) {\r
+ int view = Global.getListView();\r
settings.beginGroup("General");\r
- settings.setValue("sortOrder", i);\r
+ if (view == Global.View_List_Wide)\r
+ settings.setValue("sortOrder", i);\r
+ else\r
+ settings.setValue("sortOrder-Narrow", i);\r
settings.endGroup();\r
}\r
public static int getSortOrder() {\r
+ int view = Global.getListView();\r
settings.beginGroup("General");\r
+ String key;\r
+ if (view == Global.View_List_Wide)\r
+ key = "sortOrder";\r
+ else\r
+ key = "sortOrder-Narrow";\r
+\r
int order; \r
try {\r
- String val = settings.value("sortOrder", new Integer(0)).toString();\r
+ String val = settings.value(key, new Integer(0)).toString();\r
order = new Integer(val.trim());\r
} catch (Exception e) {\r
try {\r
- order = (Integer)settings.value("sortOrder", 0);\r
+ order = (Integer)settings.value(key, 0);\r
} catch (Exception e1) {\r
order = 0;\r
}\r
settings.endGroup();\r
return order;\r
}\r
+ \r
+ // Should we automatically log in to Evernote when starting?\r
public static boolean automaticLogin() {\r
- settings.beginGroup("General");\r
- String text = (String)settings.value("automaticLogin", "false");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
- else\r
- return false; \r
+ try {\r
+ settings.beginGroup("General");\r
+ String text = (String)settings.value("automaticLogin", "false");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false; \r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("automaticLogin", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void setAutomaticLogin(boolean val) {\r
settings.beginGroup("General");\r
settings.setValue("automaticLogin", "false");\r
settings.endGroup();\r
}\r
- public static boolean rememberPassword() {\r
- settings.beginGroup("General");\r
- String text = (String)settings.value("rememberPassword", "false");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
- else\r
- return false; \r
- }\r
- public static void setRememberPassword(boolean val) {\r
- settings.beginGroup("General");\r
- if (val)\r
- settings.setValue("rememberPassword", "true");\r
- else\r
- settings.setValue("rememberPassword", "false");\r
- settings.endGroup();\r
- }\r
+\r
+ // Get/set the Evernote server Url. \r
public static void setServer(String server) {\r
settings.beginGroup("General");\r
settings.setValue("server", server);\r
noteStoreUrlBase = "sandbox.evernote.com/edam/note/";\r
}\r
settings.endGroup();\r
- if (isPremium())\r
+// if (isPremium())\r
noteStoreUrlBase = "https://" + noteStoreUrlBase;\r
- else\r
- noteStoreUrlBase = "http://" + noteStoreUrlBase;\r
+// else\r
+// noteStoreUrlBase = "http://" + noteStoreUrlBase;\r
return text;\r
}\r
+\r
+ // Get/Set if we should disable uploads to Evernote\r
public static boolean disableUploads() {\r
- settings.beginGroup("General");\r
- String text = (String)settings.value("disableUploads", "false");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
- else\r
- return false;\r
+ settings.beginGroup("General");\r
+ try {\r
+ String text = (String)settings.value("disableUploads", "false");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("disableUploads", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void setDisableUploads(boolean val) {\r
settings.beginGroup("General");\r
settings.endGroup();\r
disableUploads = val;\r
}\r
+ \r
+ // Should we view PDF documents inline?\r
public static boolean pdfPreview() {\r
settings.beginGroup("General");\r
- String text = (String)settings.value("pdfPreview", "true");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
- else\r
- return false;\r
+ try {\r
+ String text = (String)settings.value("pdfPreview", "true");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("pdfPreview", true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void setPdfPreview(boolean val) {\r
settings.beginGroup("General");\r
settings.setValue("pdfPreview", "false");\r
settings.endGroup();\r
}\r
- public static void setMinimumWordLength(int len) {\r
- settings.beginGroup("General");\r
- settings.setValue("minimumWordLength", len);\r
- settings.endGroup(); \r
- }\r
- public static int getMinimumWordLength() {\r
+ \r
+ // When creating a new note, should it inherit tags that are currently selected?\r
+ public static boolean newNoteWithSelectedTags() {\r
settings.beginGroup("General");\r
- Integer len = 4;\r
try {\r
- String val = (String)settings.value("minimumWordLength", "4");\r
- len = new Integer(val);\r
- } catch (Exception e) {\r
- try {\r
- len = (Integer)settings.value("minimumWordLength", 4);\r
- } catch (Exception e1) {\r
- len = 4;\r
- }\r
+ String text = (String)settings.value("newNoteWithSelectedTags", "false");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("newNoteWithSelectedTags", false);\r
+ settings.endGroup();\r
+ return value;\r
}\r
+ }\r
+ public static void setNewNoteWithSelectedTags(boolean val) {\r
+ settings.beginGroup("General");\r
+ if (val)\r
+ settings.setValue("newNoteWithSelectedTags", "true");\r
+ else\r
+ settings.setValue("newNoteWithSelectedTags", "false");\r
settings.endGroup();\r
- return len;\r
- \r
}\r
+ \r
+ // Minimum weight for text OCRed from Evernote. Anything below this\r
+ // Won't be shown to the user when they search\r
public static void setRecognitionWeight(int len) {\r
settings.beginGroup("General");\r
settings.setValue("recognitionWeight", len);\r
settings.beginGroup("General");\r
Integer len;\r
try {\r
- len = (Integer)settings.value("recognitionWeight", 80);\r
+ len = (Integer)settings.value("recognitionWeight", 30);\r
} catch (Exception e) {\r
len = 80;\r
}\r
settings.endGroup();\r
return len;\r
}\r
+ \r
+ // get/set current debug message level\r
public static String getMessageLevel() {\r
settings.beginGroup("Debug");\r
String text = (String)settings.value("messageLevel", "Low");\r
settings.endGroup();\r
+ setMessageLevel(text);\r
return text;\r
}\r
public static void setDateFormat(String format) {\r
settings.setValue("dateFormat", format);\r
settings.endGroup(); \r
}\r
+ \r
+ // Get/Set user date/time formats\r
public static String getDateFormat() {\r
settings.beginGroup("General");\r
String text = (String)settings.value("dateFormat", "MM/dd/yyyy");\r
settings.endGroup();\r
return text;\r
}\r
+ \r
+ // How often should we sync with Evernote?\r
public static String getSyncInterval() {\r
settings.beginGroup("General");\r
String text = (String)settings.value("syncInterval", "15 minutes");\r
settings.setValue("syncInterval", format);\r
settings.endGroup(); \r
}\r
+ \r
+ // Get/Set the width of columns and their position for the \r
+ // next start.\r
public static void setColumnWidth(String col, int width) {\r
- settings.beginGroup("ColumnWidths");\r
- settings.setValue(col, width);\r
- settings.endGroup();\r
- }\r
+ if (Global.getListView() == Global.View_List_Wide)\r
+ settings.beginGroup("ColumnWidths");\r
+ else \r
+ settings.beginGroup("ColumnWidths-Narrow");\r
+ settings.setValue(col, width);\r
+ settings.endGroup();\r
+ }\r
public static int getColumnWidth(String col) {\r
- settings.beginGroup("ColumnWidths");\r
+ int view = Global.getListView();\r
+ if (view == Global.View_List_Wide)\r
+ settings.beginGroup("ColumnWidths");\r
+ else\r
+ settings.beginGroup("ColumnWidths-Narrow");\r
Integer width;\r
try {\r
String val = (String)settings.value(col, "0");\r
return width;\r
}\r
public static void setColumnPosition(String col, int width) {\r
- settings.beginGroup("ColumnPosition");\r
+ if (Global.getListView() == Global.View_List_Wide)\r
+ settings.beginGroup("ColumnPosition");\r
+ else\r
+ settings.beginGroup("ColumnPosition-Narrow");\r
settings.setValue(col, width);\r
settings.endGroup();\r
}\r
public static int getColumnPosition(String col) {\r
- settings.beginGroup("ColumnPosition");\r
+ if (Global.getListView() == Global.View_List_Wide)\r
+ settings.beginGroup("ColumnPosition");\r
+ else\r
+ settings.beginGroup("ColumnPosition-Narrow");\r
Integer width;\r
try {\r
String val = (String)settings.value(col, "-1");\r
settings.endGroup();\r
return width;\r
}\r
+ \r
+ // Ping the user when they try to delete or just do it.\r
public static boolean verifyDelete() {\r
settings.beginGroup("General");\r
- String text = (String)settings.value("verifyDelete", "true");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
- else\r
- return false; \r
+ try {\r
+ String text = (String)settings.value("verifyDelete", "true");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("verifyDelete", true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void setVerifyDelete(boolean val) {\r
settings.beginGroup("General");\r
settings.setValue("verifyDelete", "false");\r
settings.endGroup();\r
}\r
- public static boolean synchronizeDeletedContent() {\r
+ \r
+ // Should it start minimized?\r
+ public static boolean startMinimized() {\r
settings.beginGroup("General");\r
- String text = (String)settings.value("syncDeletedContent", "false");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
+ try {\r
+ String text = (String)settings.value("startMinimized", "false");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("startMinimized", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void setStartMinimized(boolean val) {\r
+ settings.beginGroup("General");\r
+ if (val)\r
+ settings.setValue("startMinimized", "true");\r
else\r
- return false; \r
+ settings.setValue("startMinimized", "false");\r
+ settings.endGroup();\r
}\r
+ \r
+ // Should we upload the content of any deleted notes\r
+ public static boolean synchronizeDeletedContent() {\r
+ settings.beginGroup("General");\r
+ try {\r
+ String text = (String)settings.value("syncDeletedContent", "false");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("syncDeletedContent", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ } \r
public static void setSynchronizeDeletedContent(boolean val) {\r
settings.beginGroup("General");\r
if (val)\r
settings.setValue("syncDeletedContent", "false");\r
settings.endGroup();\r
}\r
+ \r
+ // Is a section of the window visible? Used to hide things people don't\r
+ // want to see.\r
public static boolean isWindowVisible(String window) {\r
settings.beginGroup("WindowsVisible");\r
- String text = (String)settings.value(window, "true");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
+ try {\r
+ String defaultValue = "true";\r
+ if (window.equalsIgnoreCase("noteInformation"))\r
+ defaultValue = "false";\r
+ String text = (String)settings.value(window, defaultValue);\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
else\r
return false; \r
+ } catch (java.lang.ClassCastException e) {\r
+ boolean defaultValue = true;\r
+ if (window.equalsIgnoreCase("noteInformation"))\r
+ defaultValue = false;\r
+ Boolean value = (Boolean) settings.value("showTrayIcon", defaultValue);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void saveWindowVisible(String window, boolean val) {\r
settings.beginGroup("WindowsVisible");\r
settings.setValue(window, "false");\r
settings.endGroup();\r
}\r
+ \r
+ // Is a list in the column in the note list visible? \r
public static boolean isColumnVisible(String window) {\r
- settings.beginGroup("ColumnsVisible");\r
- String text = (String)settings.value(window, "true");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
- else\r
- return false; \r
+ String defaultValue = "true";\r
+ int view = Global.getListView();\r
+ if (Global.getListView() == Global.View_List_Wide)\r
+ settings.beginGroup("ColumnsVisible");\r
+ else\r
+ settings.beginGroup("ColumnsVisible-Narrow"); \r
+ if (window.equalsIgnoreCase("thumbnail") && view == Global.View_List_Wide)\r
+ defaultValue = "false";\r
+ if (window.equalsIgnoreCase("thumbnail"))\r
+ defaultValue = "false";\r
+ if (window.equalsIgnoreCase("Guid"))\r
+ defaultValue = "false";\r
+ try {\r
+ String text = (String)settings.value(window, defaultValue);\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ boolean defBool = false;\r
+ if (window.equalsIgnoreCase("true"))\r
+ defBool = true;\r
+ else\r
+ defBool = false;\r
+ Boolean value = (Boolean) settings.value(window, defBool);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void saveColumnVisible(String column, boolean val) {\r
- settings.beginGroup("ColumnsVisible");\r
+ if (Global.getListView() == Global.View_List_Wide)\r
+ settings.beginGroup("ColumnsVisible");\r
+ else\r
+ settings.beginGroup("ColumnsVisible-Narrow"); \r
if (val)\r
settings.setValue(column, "true");\r
else\r
settings.setValue(column, "false");\r
settings.endGroup();\r
}\r
+ \r
+ // Is a particular editor button visible?\r
public static boolean isEditorButtonVisible(String window) {\r
settings.beginGroup("EditorButtonsVisible");\r
- String text = (String)settings.value(window, "true");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
- else\r
- return false; \r
+ try {\r
+ String text = (String)settings.value(window, "true");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value(window, true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void saveEditorButtonsVisible(String column, boolean val) {\r
settings.beginGroup("EditorButtonsVisible");\r
settings.setValue(column, "false");\r
settings.endGroup();\r
}\r
+ \r
+ // Should the test fixes be enabled\r
public static boolean enableCarriageReturnFix() {\r
- settings.beginGroup("Debug");\r
- String text = (String)settings.value("enableCarriageReturnFix", "false");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
- else\r
- return false; \r
+ try {\r
+ settings.beginGroup("Debug");\r
+ String text = (String)settings.value("enableCarriageReturnFix", "false");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("enableCarriageReturnFix", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void saveCarriageReturnFix(boolean val) {\r
settings.beginGroup("Debug");\r
settings.setValue("enableCarriageReturnFix", "false");\r
settings.endGroup();\r
}\r
- public static void setIndexThreads(int val) {\r
- settings.beginGroup("General");\r
- settings.setValue("indexThreads", val);\r
- settings.endGroup();\r
- }\r
- public static int getIndexThreads() {\r
- settings.beginGroup("General");\r
- Integer threads;\r
- try {\r
- String val = (String)settings.value("indexThreads", "1");\r
- threads = new Integer(val.trim());\r
- } catch (Exception e) {\r
- try {\r
- threads = (Integer)settings.value("indexThreads", 1);\r
- } catch (Exception e1) {\r
- threads = 1;\r
- }\r
+ public static boolean enableHtmlEntitiesFix() {\r
+ try {\r
+ settings.beginGroup("Debug");\r
+ String text = (String)settings.value("enableHtmlEntitiesFix", "false");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("enableHtmlEntitiesFix", false);\r
+ settings.endGroup();\r
+ return value;\r
}\r
+ }\r
+ public static void saveHtmlEntitiesFix(boolean val) {\r
+ settings.beginGroup("Debug");\r
+ if (val)\r
+ settings.setValue("enableHtmlEntitiesFix", "true");\r
+ else\r
+ settings.setValue("enableHtmlEntitiesFix", "false");\r
settings.endGroup();\r
- threads = 1;\r
- return threads;\r
}\r
+\r
+// public static void setIndexThreads(int val) {\r
+// settings.beginGroup("General");\r
+// settings.setValue("indexThreads", val);\r
+// settings.endGroup();\r
+// }\r
+// public static int getIndexThreads() {\r
+// settings.beginGroup("General");\r
+// Integer threads;\r
+// try {\r
+// String val = (String)settings.value("indexThreads", "1");\r
+// threads = new Integer(val.trim());\r
+// } catch (Exception e) {\r
+// try {\r
+// threads = (Integer)settings.value("indexThreads", 1);\r
+// } catch (Exception e1) {\r
+// threads = 1;\r
+// }\r
+// }\r
+// settings.endGroup();\r
+// threads = 1;\r
+// return threads;\r
+ \r
+ // Get/Set text zoom factor\r
+// }\r
public static void setZoomFactor(double val) {\r
settings.beginGroup("General");\r
settings.setValue("zoomFactor", val);\r
settings.endGroup();\r
return threads;\r
}\r
-\r
+ \r
+ \r
+ // Should we mimic Evernote and restrict the notebooks selected?\r
public static boolean getMimicEvernoteInterface() {\r
settings.beginGroup("General");\r
- String text = (String)settings.value("mimicEvernoteInterface", "true");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
- else\r
- return false;\r
- }\r
- public static void setMimicEvernoteInterface(boolean value) {\r
+ try {\r
+ String text = (String)settings.value("mimicEvernoteInterface", "true");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("mimicEvernoteInterface", true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void setMimicEvernoteInterface(boolean value) {\r
settings.beginGroup("General");\r
if (value)\r
settings.setValue("mimicEvernoteInterface", "true");\r
settings.endGroup();\r
}\r
\r
+ \r
+ // Synchronize with Evernote when closing?\r
public static boolean synchronizeOnClose() {\r
settings.beginGroup("General");\r
- String text = (String)settings.value("synchronizeOnClose", "false");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
- else\r
- return false;\r
+ try {\r
+ String text = (String)settings.value("synchronizeOnClose", "false");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("synchronizeOnClose", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void setSynchronizeOnClose(boolean val) {\r
settings.beginGroup("General");\r
settings.setValue("synchronizeOnClose", "false");\r
settings.endGroup();\r
}\r
+\r
+ // Get/set the database version. Not really used any more, but kept\r
+ // for compatibility.\r
public static void setDatabaseVersion(String version) {\r
settings.beginGroup("General");\r
settings.setValue("databaseVersion", version);\r
settings.endGroup();\r
return val;\r
}\r
+\r
+ // Get the URL (full path) of the main database\r
public static String getDatabaseUrl() {\r
settings.beginGroup("General");\r
String val = (String)settings.value("DatabaseURL", "");\r
val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.databaseName);\r
return val;\r
}\r
+ \r
+ // get the url (full path) of the searchable word database\r
+ public static String getIndexDatabaseUrl() {\r
+ settings.beginGroup("General");\r
+ String val = (String)settings.value("IndexDatabaseURL", "");\r
+ settings.endGroup();\r
+ if (val.equals(""))\r
+ val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.indexDatabaseName);\r
+ return val;\r
+ }\r
+ \r
+ // Get the url (full path) of the attachment database\r
+ public static String getResourceDatabaseUrl() {\r
+ settings.beginGroup("General");\r
+ String val = (String)settings.value("ResourceDatabaseURL", "");\r
+ settings.endGroup();\r
+ if (val.equals(""))\r
+ val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.resourceDatabaseName);\r
+ return val;\r
+ }\r
+ public static void setDatabaseUrl(String value) {\r
+ settings.beginGroup("General");\r
+ settings.setValue("DatabaseURL", value);\r
+ settings.endGroup();\r
+ }\r
+ public static void setIndexDatabaseUrl(String value) {\r
+ settings.beginGroup("General");\r
+ settings.setValue("IndexDatabaseURL", value);\r
+ settings.endGroup();\r
+ }\r
+ public static void setResourceDatabaseUrl(String value) {\r
+ settings.beginGroup("General");\r
+ settings.setValue("ResourceDatabaseURL", value);\r
+ settings.endGroup();\r
+ }\r
public static String getDatabaseUserid() {\r
settings.beginGroup("General");\r
String val = (String)settings.value("databaseUserid", "");\r
settings.endGroup();\r
return val;\r
}\r
+ \r
+ // get/Set the style sheet and the palette to control the look & feel\r
public static void setStyle(String style) {\r
settings.beginGroup("General");\r
settings.setValue("style", style);\r
}\r
public static String getStyle() {\r
settings.beginGroup("General");\r
- String val = (String)settings.value("style", "");\r
+ String val = (String)settings.value("style", "Cleanlooks");\r
settings.endGroup();\r
return val;\r
}\r
public static boolean useStandardPalette() {\r
settings.beginGroup("General");\r
- String text = (String)settings.value("standardPalette", "true");\r
- settings.endGroup();\r
- if (text.equalsIgnoreCase("true"))\r
- return true;\r
- else\r
- return false;\r
+ try {\r
+ String text = (String)settings.value("standardPalette", "true");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("standardPalette", true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
}\r
public static void setStandardPalette(boolean val) {\r
settings.beginGroup("General");\r
settings.endGroup();\r
}\r
\r
- public static void dbWait() {\r
- // Global.dbThreadWait.wait(Global.dbThreadWaitMutex);\r
- }\r
- public static void dbContinue() {\r
-// Global.dbThreadWait.wakeAll();\r
- }\r
- public static synchronized void dbClientWait(int id) {\r
- if (id == mainThreadId) {\r
- try {mainThreadWaiter.take(); } catch (InterruptedException e) {e.printStackTrace();}\r
- }\r
- if (id == syncThreadId) {\r
- try {syncThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
- }\r
- if (id == tagCounterThreadId) {\r
- try {tagCounterThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
- }\r
- if (id == trashCounterThreadId) {\r
- try {trashCounterThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
- }\r
- if (id == indexThreadId) {\r
- try {indexThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
- }\r
- if (id == saveThreadId) {\r
- try {saveThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
- }\r
- if (id == notebookCounterThreadId) {\r
- try {notebookCounterThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
- }\r
- if (id == indexThread03Id) {\r
- try {indexThread03ThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
- }\r
- if (id == indexThread04Id) {\r
- try {indexThread04ThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
- }\r
+ // Set the amount of time to wait between indexing\r
+ // Get/Set interval when the index thread wakes up.\r
+ public static void setIndexThreadSleepInterval(int sleep) {\r
+ settings.beginGroup("General");\r
+ settings.setValue("IndexThreadSleepInterval", sleep);\r
+ settings.endGroup();\r
}\r
- public static void dbClientContinue(int id) {\r
- if (id == mainThreadId) {\r
- try { mainThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
- }\r
- if (id == syncThreadId) {\r
- try { syncThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
- }\r
- if (id == tagCounterThreadId) { \r
- try { tagCounterThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
- }\r
- if (id == trashCounterThreadId) { \r
- try { trashCounterThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
- }\r
- if (id == indexThreadId) { \r
- try { indexThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
- }\r
- if (id == saveThreadId) { \r
- try { saveThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
- }\r
- if (id == notebookCounterThreadId) { \r
- try { notebookCounterThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
- }\r
- if (id == indexThread03Id) { \r
- try { indexThread03ThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
- }\r
- if (id == indexThread04Id) { \r
- try { indexThread04ThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
+ public static int getIndexThreadSleepInterval() {\r
+ settings.beginGroup("General");\r
+ Integer sleep;\r
+ try {\r
+ String val = (String)settings.value("IndexThreadSleepInterval", "300");\r
+ sleep = new Integer(val.trim());\r
+ } catch (Exception e) {\r
+ try {\r
+ sleep = (Integer)settings.value("IndexThreadSleepInterval", 0);\r
+ } catch (Exception e1) {\r
+ sleep = 300;\r
+ }\r
}\r
+ settings.endGroup();\r
+ return sleep;\r
}\r
\r
+ \r
+ // Get/Set a window state for later restoring\r
public static void saveState(String name, QByteArray state) {\r
+ int view = Global.getListView();\r
+ if (view == Global.View_List_Narrow)\r
+ name = name +"Narrow";\r
settings.beginGroup("SaveState");\r
settings.setValue(name, state);\r
settings.endGroup();\r
}\r
\r
public static QByteArray restoreState(String name) {\r
+ int view = Global.getListView();\r
+ if (view == Global.View_List_Narrow)\r
+ name = name +"Narrow";\r
settings.beginGroup("SaveState");\r
QByteArray state = (QByteArray)settings.value(name);\r
settings.endGroup();\r
return state;\r
}\r
public static void saveGeometry(String name, QByteArray state) {\r
- settings.beginGroup("SaveGeometry");\r
+ int view = Global.getListView();\r
+ if (view == Global.View_List_Narrow)\r
+ settings.beginGroup("SaveGeometryNarrow");\r
+ else\r
+ settings.beginGroup("SaveGeometry");\r
settings.setValue(name, state);\r
settings.endGroup();\r
}\r
\r
public static QByteArray restoreGeometry(String name) {\r
- settings.beginGroup("SaveGeometry");\r
+ int view = Global.getListView();\r
+ if (view == Global.View_List_Narrow)\r
+ settings.beginGroup("SaveGeometryNarrow");\r
+ else\r
+ settings.beginGroup("SaveGeometry");\r
QByteArray state = (QByteArray)settings.value(name);\r
settings.endGroup();\r
return state;\r
}\r
\r
+ \r
+ // Set how often to do an automatic save\r
public static void setAutoSaveInterval(int interval) {\r
settings.beginGroup("General");\r
settings.setValue("autoSaveInterval", interval);\r
try {\r
value = (Integer)settings.value("autoSaveInterval", 5);\r
} catch (Exception e1) {\r
- value = 0;\r
+ value = 5;\r
}\r
}\r
settings.endGroup();\r
return value;\r
}\r
\r
+ // Add an invalid attribute & element to the database so we don't bother parsing it in the future\r
+ // These values we automatically remove from any note.\r
// Add invalid attributes\r
public static void addInvalidAttribute(String element, String attribute) {\r
\r
invalidAttributes.put(element,attributeList);\r
}\r
}\r
-\r
- \r
+ \r
// Add invalid attributes\r
public static void addInvalidElement(String element) {\r
for (int i=0; i<invalidElements.size(); i++) {\r
invalidElements.add(element);\r
}\r
\r
+ // Get/Set proxy information\r
+ // Proxy settings\r
+ public static String getProxyValue(String key) {\r
+ settings.beginGroup("Proxy");\r
+ String val = (String)settings.value(key, "");\r
+ settings.endGroup();\r
+ return val;\r
+ }\r
+ public static void setProxyValue(String key, String value) {\r
+ settings.beginGroup("Proxy");\r
+ settings.setValue(key, value);\r
+ settings.endGroup();\r
+ }\r
+ \r
+ // Change a byte array to a hex string\r
// Convert a byte array to a hex string\r
public static String byteArrayToHexString(byte data[]) {\r
StringBuffer buf = new StringBuffer();\r
return buf.toString(); \r
}\r
\r
+ \r
+ // Get/Set spelling settings\r
+ public static boolean getSpellSetting(String value) {\r
+ settings.beginGroup("Spell");\r
+ String text = (String)settings.value(value, "");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ if (text.equalsIgnoreCase("false"))\r
+ return false;\r
+ if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREDIGITWORDS))\r
+ return true;\r
+ if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREINTERNETADDRESSES))\r
+ return true;\r
+ if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREUPPERCASE))\r
+ return true;\r
+ if (value.equalsIgnoreCase(Configuration.SPELL_IGNORESENTENCECAPITALIZATION))\r
+ return true;\r
+ return false;\r
+ }\r
+ public static void setSpellSetting(String setting, boolean val) {\r
+ settings.beginGroup("Spell");\r
+ if (val)\r
+ settings.setValue(setting, "true");\r
+ else\r
+ settings.setValue(setting, "false");\r
+ settings.endGroup();\r
+ }\r
\r
+ // Get/Set how we should display tags (color them, hide unused, or do nothing)\r
// What to do with inactive tags?\r
public static String tagBehavior() {\r
settings.beginGroup("General");\r
settings.endGroup();\r
}\r
\r
+ \r
+ // Should the toolbar be visible?\r
+ public static boolean isToolbarButtonVisible(String window) {\r
+ settings.beginGroup("ToolbarButtonsVisible");\r
+ try {\r
+ String text = (String)settings.value(window, "true");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false; \r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value(window, true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void saveToolbarButtonsVisible(String column, boolean val) {\r
+ settings.beginGroup("ToolbarButtonsVisible");\r
+ if (val)\r
+ settings.setValue(column, "true");\r
+ else\r
+ settings.setValue(column, "false");\r
+ settings.endGroup();\r
+ }\r
+ \r
+ // Are thumbnails enabled?\r
+ \r
+ public static boolean enableThumbnails() {\r
+ settings.beginGroup("Debug");\r
+ try {\r
+ String text = (String)settings.value("thumbnails", "true");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("thumbnails", true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void setEnableThumbnails(boolean val) {\r
+ settings.beginGroup("Debug");\r
+ if (val)\r
+ settings.setValue("thumbnails", "true");\r
+ else\r
+ settings.setValue("thumbnails", "false");\r
+ settings.endGroup();\r
+ }\r
\r
+ // Trace used for performance tuning. Not normally used in production.\r
// Print date/time. Used mainly for performance tracing\r
public static void trace(boolean resetInterval) {\r
String fmt = "MM/dd/yy HH:mm:ss.SSSSSS";\r
startTraceTime = null;\r
}\r
\r
- public static FileManager getFileManager() {\r
+ \r
+ // Get the FileManager class to manage local files & directories\r
+ public static FileManager getFileManager() {\r
return fileManager;\r
}\r
-\r
+ \r
+ // Should the note editor be disabled?\r
public static boolean getDisableViewing() {\r
return disableViewing;\r
}\r
+\r
+ //**********************\r
+ //* Thumbnail zoom level\r
+ //**********************\r
+ public static int calculateThumbnailZoom(String content) {\r
+ int zoom = 1;\r
+ if (content.indexOf("application/pdf") == -1) {\r
+ if (content.indexOf("image/") == -1) {\r
+ String text = StringEscapeUtils.unescapeHtml4(content.replaceAll("\\<.*?\\>", ""));\r
+ zoom = 2;\r
+ if (text.length() < 500) \r
+ zoom = 2;\r
+ if (text.length() < 250)\r
+ zoom = 3;\r
+ if (text.length() < 100)\r
+ zoom = 4;\r
+ if (text.length() < 50)\r
+ zoom = 5;\r
+ if (text.length() < 10)\r
+ zoom = 6;\r
+ }\r
+ }\r
+ return zoom;\r
+ }\r
+ \r
+ //**********************\r
+ //* List View settings \r
+ //**********************\r
+ public static void setListView(int view) {\r
+ settings.beginGroup("General");\r
+ settings.setValue("listView", view);\r
+ settings.endGroup();\r
+ }\r
+ public static int getListView() {\r
+ settings.beginGroup("General");\r
+ Integer value;\r
+ try {\r
+ String val = (String)settings.value("listView", View_List_Wide);\r
+ value = new Integer(val.trim());\r
+ } catch (Exception e) {\r
+ try {\r
+ value = (Integer)settings.value("listView", View_List_Wide);\r
+ } catch (Exception e1) {\r
+ value = View_List_Wide;\r
+ }\r
+ }\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+\r
+ \r
+ \r
+ //*******************\r
+ // Font Settings\r
+ //*******************\r
+ public static boolean overrideDefaultFont() {\r
+ settings.beginGroup("Font");\r
+ try {\r
+ String text = (String)settings.value("overrideFont", "false");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false; \r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("overrideFont", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+\r
+ }\r
+ \r
+ //****************************************************\r
+ // Get/Set the default font settings for a new note\r
+ //****************************************************\r
+ public static void setOverrideDefaultFont(boolean value) {\r
+ settings.beginGroup("Font");\r
+ settings.setValue("overrideFont", value);\r
+ settings.endGroup(); \r
+ }\r
+ public static String getDefaultFont() {\r
+ settings.beginGroup("Font");\r
+ String val = (String)settings.value("font", "");\r
+ settings.endGroup();\r
+ return val;\r
+ }\r
+ public static void setDefaultFont(String value) {\r
+ settings.beginGroup("Font");\r
+ settings.setValue("font", value);\r
+ settings.endGroup();\r
+ }\r
+ public static String getDefaultFontSize() {\r
+ settings.beginGroup("Font");\r
+ String val = (String)settings.value("fontSize", "");\r
+ settings.endGroup();\r
+ return val;\r
+ }\r
+ public static void setDefaultFontSize(String value) {\r
+ settings.beginGroup("Font");\r
+ settings.setValue("fontSize", value);\r
+ settings.endGroup();\r
+ }\r
+ \r
+ \r
+ //*******************************************\r
+ // Override the close & minimize instead.\r
+ //*******************************************\r
+ public static boolean minimizeOnClose() {\r
+ settings.beginGroup("General");\r
+ try {\r
+ String text = (String)settings.value("minimizeOnClose", "false");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true") && QSystemTrayIcon.isSystemTrayAvailable())\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("minimizeOnClose", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void setMinimizeOnClose(boolean value) {\r
+ settings.beginGroup("General");\r
+ settings.setValue("minimizeOnClose", value);\r
+ settings.endGroup(); \r
+ }\r
+\r
+ //*********************************\r
+ // Check version information\r
+ //*********************************\r
+ public static boolean checkVersionUpgrade() {\r
+ settings.beginGroup("Upgrade");\r
+ try {\r
+ String text = (String)settings.value("checkForUpdates", "true");\r
+ settings.endGroup();\r
+ if (text.equalsIgnoreCase("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("checkForUpdates", true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void setCheckVersionUpgrade(boolean value) {\r
+ settings.beginGroup("Upgrade");\r
+ settings.setValue("checkForUpdates", value);\r
+ settings.endGroup(); \r
+ }\r
+ public static String getUpdatesAvailableUrl() {\r
+ settings.beginGroup("Upgrade");\r
+ String text = (String)settings.value("avialableUrl", "http://nevernote.sourceforge.net/versions.txt");\r
+ settings.endGroup(); \r
+ return text;\r
+ }\r
+ public static String getUpdateAnnounceUrl() {\r
+ settings.beginGroup("Upgrade");\r
+ String text = (String)settings.value("announceUrl", "http://nevernote.sourceforge.net/upgrade.html");\r
+ settings.endGroup(); \r
+ return text;\r
+ }\r
+ \r
+ //*******************\r
+ // Index settings\r
+ //*******************\r
+ // Set/Get if we should index the text of a note\r
+ public static boolean indexNoteBody() {\r
+ settings.beginGroup("Index");\r
+ try {\r
+ String value = (String)settings.value("indexNoteBody", "true");\r
+ settings.endGroup();\r
+ if (value.equals("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("indexNoteBody", true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void setIndexNoteTitle(boolean value) {\r
+ settings.beginGroup("Index");\r
+ settings.setValue("indexNoteTitle", value);\r
+ settings.endGroup(); \r
+ }\r
+ // Set/Get if we should index the title of a note\r
+ public static boolean indexNoteTitle() {\r
+ settings.beginGroup("Index");\r
+ try {\r
+ String value = (String)settings.value("indexNoteTitle", "true");\r
+ settings.endGroup();\r
+ if (value.equals("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("indexNoteTitle", true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void setIndexNoteBody(boolean value) {\r
+ settings.beginGroup("Index");\r
+ settings.setValue("indexNoteBody", value);\r
+ settings.endGroup(); \r
+ }\r
+ // Set/Get if we should index any attachments\r
+ public static boolean indexAttachmentsLocally() {\r
+ settings.beginGroup("Index");\r
+ try {\r
+ String value = (String)settings.value("indexAttachmentsLocally", "true");\r
+ settings.endGroup();\r
+ if (value.equals("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("indexAttachmentsLocally", true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void setIndexImageRecognition(boolean value) {\r
+ settings.beginGroup("Index");\r
+ settings.setValue("indexImageRecognition", value);\r
+ settings.endGroup(); \r
+ }\r
+ public static boolean indexImageRecognition() {\r
+ settings.beginGroup("Index");\r
+ try {\r
+ String value = (String)settings.value("indexImageRecognition", "true");\r
+ settings.endGroup();\r
+ if (value.equals("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("indexImageRecognition", true);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void setIndexAttachmentsLocally(boolean value) {\r
+ settings.beginGroup("Index");\r
+ settings.setValue("indexAttachmentsLocally", value);\r
+ settings.endGroup(); \r
+ }\r
+ // Get/Set characters that shouldn't be removed from a word\r
+ public static String getSpecialIndexCharacters() {\r
+ settings.beginGroup("Index");\r
+ String text = (String)settings.value("specialCharacters", "");\r
+ settings.endGroup(); \r
+ return text;\r
+ }\r
+ public static void setSpecialIndexCharacters(String value) {\r
+ settings.beginGroup("Index");\r
+ settings.setValue("specialCharacters", value);\r
+ settings.endGroup(); \r
+ databaseCache = value;\r
+ }\r
+ \r
+ //*****************************************************************************\r
+ // Control how tag selection behaves (should they be "and" or "or" selections\r
+ //*****************************************************************************\r
+ public static boolean anyTagSelectionMatch() {\r
+ settings.beginGroup("General");\r
+ try {\r
+ String value = (String)settings.value("anyTagSelectionMatch", "false");\r
+ settings.endGroup();\r
+ if (value.equals("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("anyTagSelectionMatch", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void setAnyTagSelectionMatch(boolean value) {\r
+ settings.beginGroup("General");\r
+ settings.setValue("anyTagSelectionMatch", value);\r
+ settings.endGroup(); \r
+ }\r
+\r
+ //*****************************************************************************\r
+ // Control if a user receives a warning when trying to create a note-to-note link\r
+ // when the DB is not synchronized.\r
+ //*****************************************************************************\r
+ public static boolean bypassSynchronizationWarning() {\r
+ settings.beginGroup("User");\r
+ try {\r
+ String value = (String)settings.value("bypassSynchronizationWarning", "false");\r
+ settings.endGroup();\r
+ if (value.equals("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("bypassSynchronizationWarning", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+ }\r
+ public static void setBypassSynchronizationWarning(boolean value) {\r
+ settings.beginGroup("User");\r
+ settings.setValue("bypassSynchronizationWarning", value);\r
+ settings.endGroup(); \r
+ }\r
+\r
+ \r
+ //***********************\r
+ //* Database cache size\r
+ //***********************\r
+ public static String getDatabaseCacheSize() {\r
+ settings.beginGroup("Debug");\r
+ String text = (String)settings.value("databaseCache", "16384");\r
+ settings.endGroup(); \r
+ return text;\r
+ }\r
+ public static void setDatabaseCache(String value) {\r
+ settings.beginGroup("Debug");\r
+ settings.setValue("databaseCache", value);\r
+ settings.endGroup(); \r
+ databaseCache = value;\r
+ }\r
+\r
+ \r
+ // This is used to copy a class since Java's normal deep copy is wacked\r
+ public static Object deepCopy(Object oldObj) \r
+ {\r
+ ObjectOutputStream oos = null;\r
+ ObjectInputStream ois = null;\r
+ try\r
+ {\r
+ ByteArrayOutputStream bos = \r
+ new ByteArrayOutputStream(); // A\r
+ oos = new ObjectOutputStream(bos); // B\r
+ // serialize and pass the object\r
+ oos.writeObject(oldObj); // C\r
+ oos.flush(); // D\r
+ ByteArrayInputStream bin = \r
+ new ByteArrayInputStream(bos.toByteArray()); // E\r
+ ois = new ObjectInputStream(bin); // F\r
+ // return the new object\r
+ return ois.readObject(); // G\r
+ }\r
+ catch(Exception e)\r
+ {\r
+ Global.logger.log(logger.LOW, "Exception in ObjectCloner = " + e);\r
+ }\r
+ try {\r
+ oos.close();\r
+ ois.close();\r
+ } catch (IOException e) {\r
+ Global.logger.log(logger.LOW, "Exception in ObjectCloner = " + e);\r
+ e.printStackTrace();\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ // If we should automatically select the children of any tag\r
+ public static boolean includeTagChildren() {\r
+ settings.beginGroup("General");\r
+ try {\r
+ String value = (String)settings.value("includeTagChildren", "false");\r
+ settings.endGroup();\r
+ if (value.equals("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("includeTagChildren", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+\r
+ }\r
+ public static void setIncludeTagChildren(boolean value) {\r
+ settings.beginGroup("General");\r
+ settings.setValue("includeTagChildren", value);\r
+ settings.endGroup(); \r
+ }\r
+ \r
+ // If we should automatically wildcard searches\r
+ public static boolean automaticWildcardSearches() {\r
+ settings.beginGroup("General");\r
+ try {\r
+ String value = (String)settings.value("automaticWildcard", "false");\r
+ settings.endGroup();\r
+ if (value.equals("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("automaticWildcard", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+\r
+ }\r
+ public static void setAutomaticWildcardSearches(boolean value) {\r
+ settings.beginGroup("General");\r
+ settings.setValue("automaticWildcard", value);\r
+ settings.endGroup(); \r
+ }\r
+\r
+ // If we should automatically select the children of any tag\r
+ public static boolean displayRightToLeft() {\r
+ settings.beginGroup("General");\r
+ try {\r
+ String value = (String)settings.value("displayRightToLeft", "false");\r
+ settings.endGroup();\r
+ if (value.equals("true"))\r
+ return true;\r
+ else\r
+ return false;\r
+ } catch (java.lang.ClassCastException e) {\r
+ Boolean value = (Boolean) settings.value("displayRightToLeft", false);\r
+ settings.endGroup();\r
+ return value;\r
+ }\r
+\r
+ }\r
+ public static void setDisplayRightToLeft(boolean value) {\r
+ settings.beginGroup("General");\r
+ settings.setValue("displayRightToLeft", value);\r
+ settings.endGroup(); \r
+ }\r
+\r
+\r
+ //***********************\r
+ //* Startup Notebook\r
+ //***********************\r
+ public static String getStartupNotebook() {\r
+ settings.beginGroup("General");\r
+ String text = (String)settings.value("startupNotebook", "");\r
+ settings.endGroup(); \r
+ return text;\r
+ }\r
+ public static void setStartupNotebook(String value) {\r
+ settings.beginGroup("General");\r
+ settings.setValue("startupNotebook", value);\r
+ settings.endGroup(); \r
+ databaseCache = value;\r
+ }\r
}\r
\r