OSDN Git Service

Merge branch 'master' of ssh://nevernote.git.sourceforge.net/gitroot/nevernote/nevern...
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / Global.java
1 /*\r
2  * This file is part of NixNote \r
3  * Copyright 2009 Randy Baumgarte\r
4  * \r
5  * This file may be licensed under the terms of of the\r
6  * GNU General Public License Version 2 (the ``GPL'').\r
7  *\r
8  * Software distributed under the License is distributed\r
9  * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
10  * express or implied. See the GPL for the specific language\r
11  * governing rights and limitations.\r
12  *\r
13  * You should have received a copy of the GPL along with this\r
14  * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
15  * or write to the Free Software Foundation, Inc.,\r
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
17  *\r
18 */\r
19 \r
20 package cx.fbn.nevernote;\r
21 \r
22 \r
23 import java.io.ByteArrayInputStream;\r
24 import java.io.ByteArrayOutputStream;\r
25 import java.io.IOException;\r
26 import java.io.ObjectInputStream;\r
27 import java.io.ObjectOutputStream;\r
28 import java.text.SimpleDateFormat;\r
29 import java.util.ArrayList;\r
30 import java.util.Calendar;\r
31 import java.util.HashMap;\r
32 import java.util.List;\r
33 \r
34 import org.apache.commons.lang3.StringEscapeUtils;\r
35 \r
36 import com.evernote.edam.type.Accounting;\r
37 import com.evernote.edam.type.PrivilegeLevel;\r
38 import com.evernote.edam.type.User;\r
39 import com.evernote.edam.type.UserAttributes;\r
40 import com.swabunga.spell.engine.Configuration;\r
41 import com.trolltech.qt.core.QByteArray;\r
42 import com.trolltech.qt.core.QSettings;\r
43 import com.trolltech.qt.core.QSize;\r
44 import com.trolltech.qt.gui.QPalette;\r
45 import com.trolltech.qt.gui.QSystemTrayIcon;\r
46 \r
47 import cx.fbn.nevernote.config.FileManager;\r
48 import cx.fbn.nevernote.config.InitializationException;\r
49 import cx.fbn.nevernote.config.StartupConfig;\r
50 import cx.fbn.nevernote.gui.ContainsAttributeFilterTable;\r
51 import cx.fbn.nevernote.gui.DateAttributeFilterTable;\r
52 import cx.fbn.nevernote.gui.ShortcutKeys;\r
53 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
54 import cx.fbn.nevernote.utilities.Pair;\r
55 \r
56 \r
57 //*****************************************************\r
58 //*****************************************************\r
59 //* Global constants & static functions used by \r
60 //* multiple threads.\r
61 //*****************************************************\r
62 //*****************************************************\r
63 \r
64 public class Global {\r
65         // Set current version and the known versions.\r
66         public static String version = "1.2";\r
67         public static String[] validVersions = {"1.2", "1.1", "1.0", "0.99", "0.98", "0.97", "0.96"};\r
68     public static String username = ""; \r
69     //public static String password = "";     \r
70     \r
71 \r
72     // Each thread has an ID.  This is used primarily to check the status\r
73     // of running threads.\r
74     public static final int mainThreadId=0;\r
75     public static final int syncThreadId=1;\r
76     public static final int tagCounterThreadId=2;\r
77     public static final int trashCounterThreadId=3;   // This should always be the highest thread ID\r
78     public static final int indexThreadId=4;    // Thread for indexing words\r
79     public static final int saveThreadId=5;     // Thread used for processing data to saving content\r
80     public static final int notebookCounterThreadId=6;   // Notebook Thread\r
81     public static final int indexThread03Id=7;   // unused\r
82     public static final int indexThread04Id=8;   // unused\r
83     public static final int dbThreadId=9;   // This should always be the highest thread ID\r
84     public static final int threadCount = 10;\r
85     \r
86     \r
87     // These variables deal with where the list of notes appears\r
88     // They will either be vertical (View_List_Narrow) or will be\r
89     // on top of the note (View_List_Wide).  It also has the size of\r
90     // thumbnails displayed in each view\r
91     public static int View_List_Wide = 1;\r
92     public static int View_List_Narrow = 2;\r
93     public static QSize smallThumbnailSize = new QSize(100,75);\r
94     public static QSize largeThumbnailSize = new QSize(300,225);\r
95 \r
96     // This is used to keep a running list of passwords that the user\r
97     // wants us to remember.\r
98     public static HashMap<String,Pair<String,String>> passwordSafe = new HashMap<String, Pair<String,String>>();\r
99     public static List<Pair<String,String>> passwordRemember = new ArrayList<Pair<String,String>>();\r
100     \r
101     \r
102     //public static String currentNotebookGuid;\r
103     \r
104     // These deal with Evernote user settings\r
105     public static User user; \r
106     public static long authTimeRemaining;\r
107     public static long authRefreshTime;\r
108     public static long failedRefreshes = 0; \r
109     public static String userStoreUrl;\r
110     public static String noteStoreUrl;\r
111     public static String noteStoreUrlBase;\r
112 \r
113     // When we want to shut down we set this to true to short\r
114     // circut other threads\r
115     public static boolean keepRunning;\r
116         \r
117     // In the note list, these are the column numbers\r
118     // so I don't need to hard code numbers.\r
119     public static int noteTableCreationPosition = 0;\r
120     public static int noteTableTitlePosition = 1;\r
121     public static int noteTableTagPosition = 2;\r
122     public static int noteTableNotebookPosition = 3;\r
123     public static int noteTableChangedPosition = 4;\r
124     public static int noteTableGuidPosition = 5;\r
125     public static int noteTableAuthorPosition = 6;\r
126     public static int noteTableSourceUrlPosition = 7;\r
127     public static int noteTableSubjectDatePosition = 8;\r
128     public static int noteTableSynchronizedPosition = 9;\r
129     public static int noteTableThumbnailPosition = 10;\r
130     public static int noteTablePinnedPosition = 11;\r
131     public static int noteTableColumnCount = 12;\r
132     public static Integer cryptCounter = 0;\r
133     \r
134     //public static int minimumWordCount = 2;\r
135     \r
136     // Regular expression to parse text with when indexing\r
137     private static String wordRegex;\r
138     \r
139     // Experimental fixes.  Set via Edit/Preferences/Debugging\r
140     public static boolean enableCarriageReturnFix = false;\r
141     public static boolean enableHTMLEntitiesFix = false;\r
142     \r
143     // Used to set & retrieve ini & Windows registry settings\r
144     public static QSettings     settings;     // Set & get ini settings\r
145     public static boolean isConnected;    // Are we connected to Evernote\r
146     public static boolean showDeleted = false;   // Show deleted notes?\r
147     public static boolean disableUploads = false;  // Should we disable uploads (used in testing features)\r
148         public static int messageLevel;   // The level of messages to write to the log files\r
149         public static String tagDelimeter = ",";   // This is used to separate out tag names when entering above note\r
150         public static String attachmentNameDelimeter = "------";  // Used to separate out attachment names in the res directory\r
151         \r
152         \r
153         //* Database fields\r
154         public static String    databaseName = new String("NeverNote");  // database name.  used for multiple databases to separate settings.\r
155         public static String    indexDatabaseName = new String("Index"); // searchable words database\r
156         public static String    resourceDatabaseName = new String("Resources");  // attachments database\r
157         public static DateAttributeFilterTable createdSinceFilter;\r
158         public static DateAttributeFilterTable createdBeforeFilter;\r
159         public static DateAttributeFilterTable changedSinceFilter;\r
160         public static DateAttributeFilterTable changedBeforeFilter;\r
161         public static ContainsAttributeFilterTable containsFilter;\r
162         \r
163         // Log file used for debugging\r
164         public static ApplicationLogger    logger;\r
165         //PrintStream stdoutStream;\r
166         \r
167         // Application key shortcuts & appearance\r
168         public static QPalette                          originalPalette;\r
169         public static ShortcutKeys                      shortcutKeys;\r
170         \r
171         public static boolean                           disableViewing;  // used to disable the editor\r
172         \r
173         // When saving a note, this is a list of things we strip out because Evernote hates them\r
174         public static List<String>                              invalidElements = new ArrayList<String>();\r
175         public static HashMap<String, ArrayList<String>>        invalidAttributes = new HashMap<String, ArrayList<String>>();\r
176         \r
177         public static boolean mimicEvernoteInterface; // Try to mimic Evernote or allow multiple notebook selection\r
178         public static HashMap<String,String> resourceMap;   // List of attachments for a note.\r
179         public static String cipherPassword = "";    // If the database is encrypted, this stores the password\r
180         public static String databaseCache = "16384";  // Default DB cache size\r
181         \r
182         // These are used for performance testing\r
183         static Calendar startTraceTime;   \r
184         static Calendar intervalTraceTime;\r
185         \r
186         static boolean syncOnly;\r
187         \r
188         private static FileManager fileManager;  // Used to access files & directories\r
189         \r
190     // Do initial setup \r
191     public static void setup(StartupConfig startupConfig) throws InitializationException  {\r
192         settings = new QSettings("fbn.cx", startupConfig.getName());\r
193         disableViewing = startupConfig.getDisableViewing();\r
194         syncOnly = startupConfig.isSyncOnly();\r
195 \r
196         fileManager = new FileManager(startupConfig.getHomeDirPath(), startupConfig.getProgramDirPath());\r
197 \r
198 \r
199                 getServer();  // Setup URL to connect to\r
200                 \r
201                 // Get regular expressions used to parse out words\r
202                 settings.beginGroup("General");\r
203                 String regex = (String) settings.value("regex", "[,\\s]+");\r
204                 setWordRegex(regex);\r
205                 settings.endGroup();\r
206                 \r
207                 //Setup debugging information\r
208                 settings.beginGroup("Debug");\r
209                 String msglevel = (String) settings.value("messageLevel", "Low");\r
210                 settings.endGroup();\r
211                 \r
212                 \r
213                 //messageLevel = 1;\r
214                 setMessageLevel(msglevel);\r
215                 keepRunning = true;  // Make sure child threads stay running\r
216                 disableUploads = disableUploads();  // Should we upload anything?  Normally true.\r
217                 enableCarriageReturnFix = enableCarriageReturnFix();  // Enable test fix?\r
218                 enableHTMLEntitiesFix = enableHtmlEntitiesFix();  // Enable test fix?\r
219                 \r
220                 logger = new ApplicationLogger("global.log");  // Setup log for this class \r
221                 shortcutKeys = new ShortcutKeys();  // Setup keyboard shortcuts.\r
222                 mimicEvernoteInterface = getMimicEvernoteInterface();  // Should we mimic Evernote's notebook behavior\r
223                 resourceMap = new HashMap<String,String>();  // Setup resource map used to store attachments when editing\r
224                         \r
225                 databaseCache = getDatabaseCacheSize();  // Set database cache size     \r
226     }\r
227 \r
228     // Get/Set word parsing regular expression\r
229     public static String getWordRegex() {\r
230         return wordRegex;\r
231     }\r
232     public static void setWordRegex(String r) {\r
233         wordRegex = r;\r
234     }\r
235 \r
236    // Set the debug message level\r
237    public static void setMessageLevel(String msglevel) {\r
238         if (msglevel.equalsIgnoreCase("low")) \r
239                         messageLevel = 1;\r
240                 if (msglevel.equalsIgnoreCase("medium")) \r
241                         messageLevel = 2;\r
242                 if (msglevel.equalsIgnoreCase("high")) \r
243                                 messageLevel = 3;\r
244                 if (msglevel.equalsIgnoreCase("extreme")) \r
245                                         messageLevel = 4;\r
246                 settings.beginGroup("Debug");\r
247                 settings.setValue("messageLevel", msglevel);\r
248                 settings.endGroup();            \r
249     }\r
250 \r
251    //****************************************************\r
252    //****************************************************\r
253    //** Save user account information from Evernote\r
254    //****************************************************\r
255    //****************************************************\r
256     public static void saveUserInformation(User user) {\r
257         settings.beginGroup("User");\r
258                 settings.setValue("id", user.getId());\r
259                 settings.setValue("username", user.getUsername());\r
260                 settings.setValue("email", user.getEmail());\r
261                 settings.setValue("name", user.getName());\r
262                 settings.setValue("timezone", user.getTimezone());\r
263                 settings.setValue("privilege", user.getPrivilege().getValue());\r
264                 settings.setValue("created", user.getCreated());\r
265                 settings.setValue("updated", user.getUpdated());\r
266                 settings.setValue("deleted", user.getDeleted());\r
267                 settings.setValue("shard", user.getShardId());\r
268                 settings.endGroup();\r
269                 isPremium();\r
270                 if (user.getAttributes()!=null)\r
271                         saveUserAttributes(user.getAttributes());\r
272                 if (user.getAccounting()!=null)\r
273                         saveUserAccounting(user.getAccounting());\r
274 \r
275     }\r
276     public static User getUserInformation() {\r
277         User user = new User();\r
278         settings.beginGroup("User");\r
279         try {   \r
280                 user.setId((Integer)settings.value("id", 0));                   \r
281         } catch  (java.lang.ClassCastException e) {\r
282                 user.setId(new Integer((String)settings.value("id", "0")));\r
283         }\r
284                 String username = (String)settings.value("username", "");\r
285                 String email = (String)settings.value("email", "");\r
286                 String name = (String)settings.value("name", "");\r
287                 String timezone = (String)settings.value("timezone", "");\r
288                 Integer privilege = 0;\r
289                 try {   \r
290                         privilege = new Integer((String)settings.value("privilege", "0"));                      \r
291                 } catch (java.lang.ClassCastException e) {\r
292                         privilege = (Integer)settings.value("privilege", 0);\r
293                 }\r
294 \r
295                 try {   \r
296                         String date = (String)settings.value("created", "0");\r
297                         user.setCreated(new Long(date));\r
298                         date = (String)settings.value("updated", "0");\r
299                         user.setUpdated(new Long(date));\r
300                         date = (String)settings.value("deleted", "0");\r
301                         user.setDeleted(new Long(date));\r
302                 } catch (java.lang.ClassCastException e) {\r
303                         Long date = (Long)settings.value("created", 0);\r
304                         user.setCreated(date);\r
305                         date = (Long)settings.value("updated", 0);\r
306                         user.setUpdated(date);\r
307                         date = (Long)settings.value("deleted", 0);\r
308                         user.setDeleted(date);\r
309                 }\r
310 \r
311                 String shard = (String)settings.value("shard", "");\r
312         settings.endGroup();\r
313         \r
314         user.setUsername(username);\r
315         user.setEmail(email);\r
316         user.setName(name);\r
317         user.setTimezone(timezone);\r
318         PrivilegeLevel userLevel = PrivilegeLevel.findByValue(privilege);\r
319         user.setPrivilege(userLevel);\r
320         user.setShardId(shard);\r
321         return user;\r
322     }\r
323     \r
324     public static void saveUserAttributes(UserAttributes attrib) {\r
325         settings.beginGroup("UserAttributes");\r
326                 settings.setValue("defaultLocationName", attrib.getDefaultLocationName());\r
327                 settings.setValue("defaultLatitude", attrib.getDefaultLocationName());\r
328                 settings.setValue("defaultLongitude", attrib.getDefaultLocationName());\r
329                 settings.setValue("incomingEmailAddress", attrib.getIncomingEmailAddress());\r
330                 settings.endGroup();\r
331     }\r
332     public static UserAttributes getUserAttributes() {\r
333         settings.beginGroup("UserAttributes");\r
334         UserAttributes attrib = new UserAttributes();\r
335                 attrib.setDefaultLocationName((String)settings.value("defaultLocationName",""));\r
336                 attrib.setDefaultLatitudeIsSet(false);\r
337                 attrib.setDefaultLongitudeIsSet(false);\r
338                 attrib.setIncomingEmailAddress((String)settings.value("incomingEmailAddress", ""));\r
339                 settings.endGroup();\r
340                 return attrib;\r
341     }\r
342     public static void saveUserAccounting(Accounting acc) {\r
343         settings.beginGroup("UserAccounting");\r
344                 settings.setValue("uploadLimit", acc.getUploadLimit());\r
345                 settings.setValue("uploadLimitEnd", acc.getUploadLimitEnd());\r
346                 settings.setValue("uploadLimitNextMonth", acc.getUploadLimitNextMonth());\r
347                 settings.setValue("premiumServiceStart", acc.getPremiumServiceStart());\r
348                 settings.setValue("nextPaymentDue", acc.getNextPaymentDue());\r
349                 settings.setValue("uploadAmount", acc.getUpdated());\r
350                 settings.endGroup();\r
351     }\r
352     public static long getUploadLimitEnd() {\r
353         Long limit;\r
354         settings.beginGroup("UserAccounting");\r
355         \r
356         // Upload limit\r
357                 try {\r
358                         String val  = (String)settings.value("uploadLimitEnd", "0");\r
359                         limit = new Long(val.trim());\r
360                 } catch (Exception e) {\r
361                         try {\r
362                                 limit = (Long)settings.value("uploadLimitEnd", 0);\r
363                         } catch (Exception e1) {\r
364                                 limit = new Long(0);\r
365                         }\r
366                 }\r
367         \r
368                 // return value\r
369         settings.endGroup();\r
370         return limit;\r
371     }\r
372     public static void saveUploadAmount(long amount) {\r
373         settings.beginGroup("UserAccounting");\r
374                 settings.setValue("uploadAmount", amount);\r
375                 settings.endGroup();\r
376    }\r
377     public static long getUploadAmount() {\r
378                 long amt=0;\r
379                 settings.beginGroup("UserAccounting");\r
380                 try {\r
381                         String num = (String)settings.value("uploadAmount", "0");\r
382                         amt = new Long(num.trim());\r
383                 } catch (Exception e) {\r
384                         try {\r
385                                 amt = (Integer)settings.value("uploadAmount", 0);\r
386                         } catch (Exception e1) {\r
387                                 amt = 0;\r
388                         }\r
389                 }\r
390                 settings.endGroup();\r
391                 return amt;\r
392     }\r
393     public static void saveEvernoteUpdateCount(long amount) {\r
394         settings.beginGroup("UserAccounting");\r
395                 settings.setValue("updateCount", amount);\r
396                 settings.endGroup();\r
397     }\r
398     public static long getEvernoteUpdateCount() {\r
399                 long amt;\r
400                 settings.beginGroup("UserAccounting");\r
401                 try {\r
402                         String num = (String)settings.value("updateCount", new Long(0).toString());\r
403                         amt = new Long(num.trim());\r
404                 } catch (java.lang.ClassCastException e) {\r
405                         amt = 0;\r
406                 }\r
407                 settings.endGroup();\r
408                 return amt;\r
409     }\r
410     public static boolean isPremium() {\r
411                 int level;\r
412                 settings.beginGroup("User");\r
413                 try {\r
414                         String num = (String)settings.value("privilege", "1");\r
415                         level = new Integer(num.trim());\r
416                 } catch (java.lang.ClassCastException e) {\r
417                         try {\r
418                                 level = (Integer)settings.value("privilege", 1);\r
419                         } catch (Exception e1) {\r
420                                 level = 1;\r
421                         }\r
422                 }\r
423                 settings.endGroup();\r
424                 PrivilegeLevel userLevel = PrivilegeLevel.findByValue(level);\r
425                 if (userLevel == PrivilegeLevel.NORMAL)\r
426                         return false;\r
427                 return true;\r
428                 \r
429    }\r
430     public static long getUploadLimit() {\r
431                 settings.beginGroup("UserAccounting");\r
432                 long limit;\r
433                 try {\r
434                         String num = (String)settings.value("uploadLimit", new Long(0).toString());\r
435                         limit = new Long(num.trim());\r
436                 } catch (java.lang.ClassCastException e) {\r
437                         limit = 0;\r
438                 }\r
439                 settings.endGroup();\r
440                 return limit;\r
441     }\r
442 \r
443     \r
444     \r
445     //****************************************************\r
446     //****************************************************\r
447     //** View settings.  Used to restore settings \r
448     //** when starting and to control how the program\r
449     //** behaves.\r
450     //****************************************************\r
451     //****************************************************\r
452     \r
453     //* Get/Set if we should show a tray icon\r
454     public static boolean showTrayIcon() {\r
455                 settings.beginGroup("General");\r
456                 try {\r
457                         String max = (String) settings.value("showTrayIcon", "false");\r
458                         settings.endGroup();\r
459                         if (!max.equalsIgnoreCase("true") || !QSystemTrayIcon.isSystemTrayAvailable())\r
460                                 return false;\r
461                         else\r
462                                 return true;    \r
463                 } catch (java.lang.ClassCastException e) {\r
464                         Boolean value = (Boolean) settings.value("showTrayIcon", false);\r
465                         settings.endGroup();\r
466                         return value;\r
467                 }\r
468     }\r
469     public static void setShowTrayIcon(boolean val) {\r
470                 settings.beginGroup("General");\r
471                 if (val)\r
472                         settings.setValue("showTrayIcon", "true");\r
473                 else\r
474                         settings.setValue("showTrayIcon", "false");\r
475                 settings.endGroup();\r
476     }\r
477     \r
478     // Get/Set window maximized when closed last\r
479     public static boolean wasWindowMaximized() {\r
480         try {\r
481                         settings.beginGroup("General");\r
482                         String max = (String) settings.value("isMaximized", "true");\r
483                         settings.endGroup();\r
484                         if (!max.equalsIgnoreCase("true"))\r
485                                 return false;\r
486                         return true;    \r
487                 } catch (java.lang.ClassCastException e) {\r
488                         Boolean value = (Boolean) settings.value("isMaximized", true);\r
489                         settings.endGroup();\r
490                         return value;\r
491                 }\r
492     }\r
493     public static void saveWindowMaximized(boolean isMax) {\r
494                 settings.beginGroup("General");\r
495                 if (isMax)\r
496                         settings.setValue("isMaximized", "true");\r
497                 else\r
498                         settings.setValue("isMaximized", "false");\r
499                 settings.endGroup();\r
500     }\r
501     \r
502     // Get/set currently viewed note Guid\r
503     public static String getLastViewedNoteGuid() {\r
504                 settings.beginGroup("General");\r
505                 String guid = (String) settings.value("lastViewedNote", "");\r
506                 settings.endGroup();\r
507                 return guid;    \r
508     }\r
509     public static void saveCurrentNoteGuid(String guid) {\r
510                 settings.beginGroup("General");\r
511                 if (guid != null)\r
512                         settings.setValue("lastViewedNote", guid);\r
513                 else\r
514                         settings.setValue("lastViewedNote", "");\r
515                 settings.endGroup();\r
516     }\r
517     \r
518     // Get/Set the note column we are sorted on and the order\r
519     public static void setSortColumn(int i) {\r
520         int view = Global.getListView();\r
521                 settings.beginGroup("General");\r
522         if (view == Global.View_List_Wide)\r
523                 settings.setValue("sortColumn", i);\r
524         else\r
525                 settings.setValue("sortColumn-Narrow", i);\r
526                 settings.endGroup();\r
527     }\r
528     public static int getSortColumn() {;\r
529     String key;\r
530         if (Global.getListView() == Global.View_List_Wide)\r
531                 key = "sortColumn";\r
532         else\r
533                 key = "sortColumn-Narrow";\r
534 \r
535         settings.beginGroup("General");\r
536         int order;      \r
537         try {\r
538                 String val  = settings.value(key, new Integer(0)).toString();\r
539                 order = new Integer(val.trim());\r
540         } catch (Exception e) {\r
541                 try {\r
542                         order = (Integer)settings.value(key, 0);\r
543                 } catch (Exception e1) {\r
544                     order = 0;\r
545                 }\r
546         }\r
547         \r
548         settings.endGroup();\r
549         return order;\r
550     }\r
551     public static void setSortOrder(int i) {\r
552         int view = Global.getListView();\r
553                 settings.beginGroup("General");\r
554         if (view == Global.View_List_Wide)\r
555                 settings.setValue("sortOrder", i);\r
556         else\r
557                 settings.setValue("sortOrder-Narrow", i);\r
558                 settings.endGroup();\r
559     }\r
560     public static int getSortOrder() {\r
561         int view = Global.getListView();\r
562                 settings.beginGroup("General");\r
563                 String key;\r
564         if (view == Global.View_List_Wide)\r
565                 key = "sortOrder";\r
566                 else\r
567                         key = "sortOrder-Narrow";\r
568 \r
569                 int order;      \r
570                 try {\r
571                         String val  = settings.value(key, new Integer(0)).toString();\r
572                         order = new Integer(val.trim());\r
573                 } catch (Exception e) {\r
574                         try {\r
575                                 order = (Integer)settings.value(key, 0);\r
576                         } catch (Exception e1) {\r
577                             order = 0;\r
578                         }\r
579                 }\r
580                 \r
581                 settings.endGroup();\r
582                 return order;\r
583     }\r
584     \r
585     // Should we automatically log in to Evernote when starting?\r
586     public static boolean automaticLogin() {\r
587         try {\r
588                 settings.beginGroup("General");\r
589                 String text = (String)settings.value("automaticLogin", "false");\r
590                 settings.endGroup();\r
591                 if (text.equalsIgnoreCase("true"))\r
592                         return true;\r
593                 else\r
594                         return false;           \r
595         } catch (java.lang.ClassCastException e) {\r
596                 Boolean value = (Boolean) settings.value("automaticLogin", false);\r
597                 settings.endGroup();\r
598                 return value;\r
599         }\r
600     }\r
601     public static void setAutomaticLogin(boolean val) {\r
602                 settings.beginGroup("General");\r
603                 if (val)\r
604                         settings.setValue("automaticLogin", "true");\r
605                 else\r
606                         settings.setValue("automaticLogin", "false");\r
607                 settings.endGroup();\r
608     }\r
609 \r
610     // Get/set the Evernote server Url.  \r
611     public static void setServer(String server) {\r
612                 settings.beginGroup("General");\r
613                 settings.setValue("server", server);\r
614                 settings.endGroup();            \r
615     }\r
616     public static String getServer() {\r
617                 settings.beginGroup("General");\r
618                 String text = (String)settings.value("server", "www.evernote.com");\r
619                 if (text.equals("www.evernote.com")) {\r
620                         userStoreUrl = "https://www.evernote.com/edam/user";\r
621                     noteStoreUrlBase = "www.evernote.com/edam/note/";   \r
622                 } else {\r
623                         userStoreUrl = "https://sandbox.evernote.com/edam/user";\r
624                         noteStoreUrlBase = "sandbox.evernote.com/edam/note/";\r
625                 }\r
626                 settings.endGroup();\r
627 //              if (isPremium())\r
628                         noteStoreUrlBase = "https://" + noteStoreUrlBase;\r
629 //              else\r
630 //                      noteStoreUrlBase = "http://" + noteStoreUrlBase;\r
631                 return text;\r
632     }\r
633 \r
634     // Get/Set if we should disable uploads to Evernote\r
635     public static boolean disableUploads() {\r
636         settings.beginGroup("General");\r
637         try {\r
638                 String text = (String)settings.value("disableUploads", "false");\r
639                 settings.endGroup();\r
640                 if (text.equalsIgnoreCase("true"))\r
641                         return true;\r
642                 else\r
643                         return false;\r
644                 } catch (java.lang.ClassCastException e) {\r
645                         Boolean value = (Boolean) settings.value("disableUploads", false);\r
646                         settings.endGroup();\r
647                         return value;\r
648                 }\r
649     }\r
650     public static void setDisableUploads(boolean val) {\r
651                 settings.beginGroup("General");\r
652                 if (val)\r
653                         settings.setValue("disableUploads", "true");\r
654                 else\r
655                         settings.setValue("disableUploads", "false");\r
656                 settings.endGroup();\r
657                 disableUploads = val;\r
658     }\r
659  \r
660     // Should we view PDF documents inline?\r
661     public static boolean pdfPreview() {\r
662                 settings.beginGroup("General");\r
663                 try {\r
664                         String text = (String)settings.value("pdfPreview", "true");\r
665                         settings.endGroup();\r
666                         if (text.equalsIgnoreCase("true"))\r
667                                 return true;\r
668                         else\r
669                                 return false;\r
670                 } catch (java.lang.ClassCastException e) {\r
671                         Boolean value = (Boolean) settings.value("pdfPreview", true);\r
672                         settings.endGroup();\r
673                         return value;\r
674                 }\r
675     }\r
676     public static void setPdfPreview(boolean val) {\r
677                 settings.beginGroup("General");\r
678                 if (val)\r
679                         settings.setValue("pdfPreview", "true");\r
680                 else\r
681                         settings.setValue("pdfPreview", "false");\r
682                 settings.endGroup();\r
683     }\r
684     \r
685     // When creating a new note, should it inherit tags that are currently selected?\r
686     public static boolean newNoteWithSelectedTags() {\r
687                 settings.beginGroup("General");\r
688                 try {\r
689                         String text = (String)settings.value("newNoteWithSelectedTags", "false");\r
690                         settings.endGroup();\r
691                         if (text.equalsIgnoreCase("true"))\r
692                                 return true;\r
693                         else\r
694                                 return false;\r
695                 } catch (java.lang.ClassCastException e) {\r
696                         Boolean value = (Boolean) settings.value("newNoteWithSelectedTags", false);\r
697                         settings.endGroup();\r
698                         return value;\r
699                 }\r
700     }\r
701     public static void setNewNoteWithSelectedTags(boolean val) {\r
702                 settings.beginGroup("General");\r
703                 if (val)\r
704                         settings.setValue("newNoteWithSelectedTags", "true");\r
705                 else\r
706                         settings.setValue("newNoteWithSelectedTags", "false");\r
707                 settings.endGroup();\r
708     }\r
709     \r
710     // Minimum weight for text OCRed from Evernote. Anything below this\r
711     // Won't be shown to the user when they search\r
712     public static void setRecognitionWeight(int len) {\r
713                 settings.beginGroup("General");\r
714                 settings.setValue("recognitionWeight", len);\r
715                 settings.endGroup();            \r
716     }\r
717     public static int getRecognitionWeight() {\r
718                 settings.beginGroup("General");\r
719                 Integer len;\r
720                 try {\r
721                         len = (Integer)settings.value("recognitionWeight", 30);\r
722                 } catch (Exception e) {\r
723                         len = 80;\r
724                 }\r
725                 settings.endGroup();\r
726                 return len;\r
727     }\r
728     \r
729     // get/set current debug message level\r
730     public static String getMessageLevel() {\r
731                 settings.beginGroup("Debug");\r
732                 String text = (String)settings.value("messageLevel", "Low");\r
733                 settings.endGroup();\r
734                 setMessageLevel(text);\r
735                 return text;\r
736     }\r
737     public static void setDateFormat(String format) {\r
738                 settings.beginGroup("General");\r
739                 settings.setValue("dateFormat", format);\r
740                 settings.endGroup();            \r
741     }\r
742     \r
743     // Get/Set user date/time formats\r
744     public static String getDateFormat() {\r
745                 settings.beginGroup("General");\r
746                 String text = (String)settings.value("dateFormat", "MM/dd/yyyy");\r
747                 settings.endGroup();\r
748                 return text;\r
749     }\r
750     public static void setTimeFormat(String format) {\r
751                 settings.beginGroup("General");\r
752                 settings.setValue("timeFormat", format);\r
753                 settings.endGroup();            \r
754     }\r
755     public static String getTimeFormat() {\r
756                 settings.beginGroup("General");\r
757                 String text = (String)settings.value("timeFormat", "HH:mm:ss");\r
758                 settings.endGroup();\r
759                 return text;\r
760     }\r
761     \r
762     // How often should we sync with Evernote?\r
763     public static String getSyncInterval() {\r
764                 settings.beginGroup("General");\r
765                 String text = (String)settings.value("syncInterval", "15 minutes");\r
766                 settings.endGroup();\r
767                 return text;            \r
768     }\r
769     public static void setSyncInterval(String format) {\r
770                 settings.beginGroup("General");\r
771                 settings.setValue("syncInterval", format);\r
772                 settings.endGroup();            \r
773     }\r
774     \r
775     // Get/Set the width of columns and their position for the \r
776     // next start.\r
777     public static void setColumnWidth(String col, int width) {\r
778         if (Global.getListView() == Global.View_List_Wide)\r
779                 settings.beginGroup("ColumnWidths");\r
780         else \r
781                 settings.beginGroup("ColumnWidths-Narrow");\r
782                 settings.setValue(col, width);\r
783                 settings.endGroup();\r
784         }\r
785     public static int getColumnWidth(String col) {\r
786         int view = Global.getListView();\r
787         if (view == Global.View_List_Wide)\r
788                 settings.beginGroup("ColumnWidths");\r
789         else\r
790                 settings.beginGroup("ColumnWidths-Narrow");\r
791                 Integer width;\r
792                 try {\r
793                         String val  = (String)settings.value(col, "0");\r
794                         width = new Integer(val.trim());\r
795                 } catch (Exception e) {\r
796                         try {\r
797                                 width = (Integer)settings.value(col, 0);\r
798                         } catch (Exception e1) {\r
799                                 width = 0;\r
800                         }\r
801                 }\r
802                 settings.endGroup();\r
803                 return width;\r
804     }\r
805     public static void setColumnPosition(String col, int width) {\r
806         if (Global.getListView() == Global.View_List_Wide)\r
807                 settings.beginGroup("ColumnPosition");\r
808         else\r
809                 settings.beginGroup("ColumnPosition-Narrow");\r
810                 settings.setValue(col, width);\r
811                 settings.endGroup();\r
812     }\r
813     public static int getColumnPosition(String col) {\r
814         if (Global.getListView() == Global.View_List_Wide)\r
815                 settings.beginGroup("ColumnPosition");\r
816         else\r
817                 settings.beginGroup("ColumnPosition-Narrow");\r
818                 Integer width;\r
819                 try {\r
820                         String val  = (String)settings.value(col, "-1");\r
821                         width = new Integer(val.trim());\r
822                 } catch (Exception e) {\r
823                         try {\r
824                                 width = (Integer)settings.value(col, 0);\r
825                         } catch (Exception e1) {\r
826                                 width = 0;\r
827                         }\r
828                 }\r
829                 settings.endGroup();\r
830                 return width;\r
831     }\r
832     \r
833     // Ping the user when they try to delete or just do it.\r
834     public static boolean verifyDelete() {\r
835                 settings.beginGroup("General");\r
836                 try {\r
837                         String text = (String)settings.value("verifyDelete", "true");\r
838                         settings.endGroup();\r
839                         if (text.equalsIgnoreCase("true"))\r
840                                 return true;\r
841                         else\r
842                                 return false;\r
843                 } catch (java.lang.ClassCastException e) {\r
844                         Boolean value = (Boolean) settings.value("verifyDelete", true);\r
845                         settings.endGroup();\r
846                         return value;\r
847                 }\r
848     }\r
849     public static void setVerifyDelete(boolean val) {\r
850                 settings.beginGroup("General");\r
851                 if (val)\r
852                         settings.setValue("verifyDelete", "true");\r
853                 else\r
854                         settings.setValue("verifyDelete", "false");\r
855                 settings.endGroup();\r
856     }\r
857     \r
858     // Should it start minimized?\r
859     public static boolean startMinimized() {\r
860                 settings.beginGroup("General");\r
861                 try {\r
862                         String text = (String)settings.value("startMinimized", "false");\r
863                         settings.endGroup();\r
864                         if (text.equalsIgnoreCase("true"))\r
865                                 return true;\r
866                         else\r
867                                 return false;\r
868                 } catch (java.lang.ClassCastException e) {\r
869                         Boolean value = (Boolean) settings.value("startMinimized", false);\r
870                         settings.endGroup();\r
871                         return value;\r
872                 }\r
873     }\r
874     public static void setStartMinimized(boolean val) {\r
875                 settings.beginGroup("General");\r
876                 if (val)\r
877                         settings.setValue("startMinimized", "true");\r
878                 else\r
879                         settings.setValue("startMinimized", "false");\r
880                 settings.endGroup();\r
881     }\r
882     \r
883     // Should we upload the content of any deleted notes\r
884     public static boolean synchronizeDeletedContent() {\r
885                 settings.beginGroup("General");\r
886                 try {\r
887                         String text = (String)settings.value("syncDeletedContent", "false");\r
888                         settings.endGroup();\r
889                         if (text.equalsIgnoreCase("true"))\r
890                                 return true;\r
891                         else\r
892                                 return false;\r
893                 } catch (java.lang.ClassCastException e) {\r
894                         Boolean value = (Boolean) settings.value("syncDeletedContent", false);\r
895                         settings.endGroup();\r
896                         return value;\r
897                 }\r
898     }   \r
899     public static void setSynchronizeDeletedContent(boolean val) {\r
900                 settings.beginGroup("General");\r
901                 if (val)\r
902                         settings.setValue("syncDeletedContent", "true");\r
903                 else\r
904                         settings.setValue("syncDeletedContent", "false");\r
905                 settings.endGroup();\r
906     }\r
907     \r
908     // Is a section of the window visible?  Used to hide things people don't\r
909     // want to see.\r
910     public static boolean isWindowVisible(String window) {\r
911                 settings.beginGroup("WindowsVisible");\r
912                 try {\r
913                         String defaultValue = "true";\r
914                         if (window.equalsIgnoreCase("noteInformation"))\r
915                                 defaultValue = "false";\r
916                         String text = (String)settings.value(window, defaultValue);\r
917                         settings.endGroup();\r
918                         if (text.equalsIgnoreCase("true"))\r
919                                 return true;\r
920                 else\r
921                         return false;           \r
922                 } catch (java.lang.ClassCastException e) {\r
923                         boolean defaultValue = true;\r
924                         if (window.equalsIgnoreCase("noteInformation"))\r
925                                 defaultValue = false;\r
926                         Boolean value = (Boolean) settings.value("showTrayIcon", defaultValue);\r
927                         settings.endGroup();\r
928                         return value;\r
929                 }\r
930     }\r
931     public static void saveWindowVisible(String window, boolean val) {\r
932                 settings.beginGroup("WindowsVisible");\r
933                 if (val)\r
934                         settings.setValue(window, "true");\r
935                 else\r
936                         settings.setValue(window, "false");\r
937                 settings.endGroup();\r
938     }\r
939     \r
940     // Is a list in the column in the note list visible?  \r
941     public static boolean isColumnVisible(String window) {\r
942         String defaultValue = "true";\r
943         int view = Global.getListView();\r
944         if (Global.getListView() == Global.View_List_Wide)\r
945                 settings.beginGroup("ColumnsVisible");\r
946         else\r
947                 settings.beginGroup("ColumnsVisible-Narrow"); \r
948                 if (window.equalsIgnoreCase("thumbnail") && view == Global.View_List_Wide)\r
949                         defaultValue = "false";\r
950                 if (window.equalsIgnoreCase("thumbnail"))\r
951                         defaultValue = "false";\r
952                 if (window.equalsIgnoreCase("Guid"))\r
953                         defaultValue = "false";\r
954                 try {\r
955                         String text = (String)settings.value(window, defaultValue);\r
956                         settings.endGroup();\r
957                         if (text.equalsIgnoreCase("true"))\r
958                                 return true;\r
959                         else\r
960                                 return false;\r
961                 } catch (java.lang.ClassCastException e) {\r
962                         boolean defBool = false;\r
963                         if (window.equalsIgnoreCase("true"))\r
964                                 defBool = true;\r
965                         else\r
966                                 defBool = false;\r
967                         Boolean value = (Boolean) settings.value(window, defBool);\r
968                         settings.endGroup();\r
969                         return value;\r
970                 }\r
971     }\r
972     public static void saveColumnVisible(String column, boolean val) {\r
973         if (Global.getListView() == Global.View_List_Wide)\r
974                 settings.beginGroup("ColumnsVisible");\r
975         else\r
976                 settings.beginGroup("ColumnsVisible-Narrow");                   \r
977                 if (val)\r
978                         settings.setValue(column, "true");\r
979                 else\r
980                         settings.setValue(column, "false");\r
981                 settings.endGroup();\r
982     }\r
983     \r
984     // Is a particular editor button visible?\r
985     public static boolean isEditorButtonVisible(String window) {\r
986                 settings.beginGroup("EditorButtonsVisible");\r
987                 try {\r
988                         String text = (String)settings.value(window, "true");\r
989                         settings.endGroup();\r
990                         if (text.equalsIgnoreCase("true"))\r
991                                 return true;\r
992                         else\r
993                                 return false;\r
994                 } catch (java.lang.ClassCastException e) {\r
995                         Boolean value = (Boolean) settings.value(window, true);\r
996                         settings.endGroup();\r
997                         return value;\r
998                 }\r
999     }\r
1000     public static void saveEditorButtonsVisible(String column, boolean val) {\r
1001                 settings.beginGroup("EditorButtonsVisible");\r
1002                 if (val)\r
1003                         settings.setValue(column, "true");\r
1004                 else\r
1005                         settings.setValue(column, "false");\r
1006                 settings.endGroup();\r
1007     }\r
1008     \r
1009     // Should the test fixes be enabled\r
1010     public static boolean enableCarriageReturnFix() {\r
1011         try {\r
1012                 settings.beginGroup("Debug");\r
1013                 String text = (String)settings.value("enableCarriageReturnFix", "false");\r
1014                 settings.endGroup();\r
1015                 if (text.equalsIgnoreCase("true"))\r
1016                         return true;\r
1017                 else\r
1018                         return false;\r
1019                 } catch (java.lang.ClassCastException e) {\r
1020                         Boolean value = (Boolean) settings.value("enableCarriageReturnFix", false);\r
1021                         settings.endGroup();\r
1022                         return value;\r
1023                 }\r
1024     }\r
1025     public static void saveCarriageReturnFix(boolean val) {\r
1026                 settings.beginGroup("Debug");\r
1027                 if (val)\r
1028                         settings.setValue("enableCarriageReturnFix", "true");\r
1029                 else\r
1030                         settings.setValue("enableCarriageReturnFix", "false");\r
1031                 settings.endGroup();\r
1032     }\r
1033     public static boolean enableHtmlEntitiesFix() {\r
1034         try {\r
1035                 settings.beginGroup("Debug");\r
1036                 String text = (String)settings.value("enableHtmlEntitiesFix", "false");\r
1037                 settings.endGroup();\r
1038                 if (text.equalsIgnoreCase("true"))\r
1039                         return true;\r
1040                 else\r
1041                         return false;\r
1042                 } catch (java.lang.ClassCastException e) {\r
1043                         Boolean value = (Boolean) settings.value("enableHtmlEntitiesFix", false);\r
1044                         settings.endGroup();\r
1045                         return value;\r
1046                 }\r
1047     }\r
1048     public static void saveHtmlEntitiesFix(boolean val) {\r
1049                 settings.beginGroup("Debug");\r
1050                 if (val)\r
1051                         settings.setValue("enableHtmlEntitiesFix", "true");\r
1052                 else\r
1053                         settings.setValue("enableHtmlEntitiesFix", "false");\r
1054                 settings.endGroup();\r
1055     }\r
1056 \r
1057 //    public static void setIndexThreads(int val) {\r
1058 //              settings.beginGroup("General");\r
1059 //              settings.setValue("indexThreads", val);\r
1060 //              settings.endGroup();\r
1061 //   }\r
1062 //    public static int getIndexThreads() {\r
1063 //              settings.beginGroup("General");\r
1064 //              Integer threads;\r
1065 //              try {\r
1066 //                      String val  = (String)settings.value("indexThreads", "1");\r
1067 //                      threads = new Integer(val.trim());\r
1068 //              } catch (Exception e) {\r
1069 //                      try {\r
1070 //                              threads = (Integer)settings.value("indexThreads", 1);\r
1071 //                      } catch (Exception e1) {\r
1072 //                              threads = 1;\r
1073 //                      }\r
1074 //              }\r
1075 //              settings.endGroup();\r
1076 //              threads = 1;\r
1077 //              return threads;\r
1078     \r
1079     // Get/Set text zoom factor\r
1080 //   }\r
1081     public static void setZoomFactor(double val) {\r
1082                 settings.beginGroup("General");\r
1083                 settings.setValue("zoomFactor", val);\r
1084                 settings.endGroup();\r
1085     }\r
1086     public static double getZoomFactor() {\r
1087                 settings.beginGroup("General");\r
1088                 Double threads;\r
1089                 try {\r
1090                         String val  = (String)settings.value("zoomFactor", "1.0");\r
1091                         threads = new Double(val.trim());\r
1092                 } catch (Exception e) {\r
1093                         try {\r
1094                                 threads = (Double)settings.value("zoomFactor", 1.0);\r
1095                         } catch (Exception e1) {\r
1096                                 threads = new Double(1);\r
1097                         }\r
1098                 }\r
1099                 settings.endGroup();\r
1100                 return threads;\r
1101     }\r
1102     public static void setTextSizeMultiplier(double val) {\r
1103                 settings.beginGroup("General");\r
1104                 settings.setValue("textMultiplier", val);\r
1105                 settings.endGroup();\r
1106     }\r
1107     public static double getTextSizeMultiplier() {\r
1108                 settings.beginGroup("General");\r
1109                 Double threads;\r
1110                 try {\r
1111                         String val  = (String)settings.value("textMultiplier", "1");\r
1112                         threads = new Double(val.trim());\r
1113                 } catch (Exception e) {\r
1114                         try {\r
1115                                 threads = (Double)settings.value("textMultiplier", 1);\r
1116                         } catch (Exception e1) {\r
1117                                 threads = new Double(1);\r
1118                         }\r
1119                 }\r
1120                 settings.endGroup();\r
1121                 return threads;\r
1122     }\r
1123     \r
1124     \r
1125     // Should we mimic Evernote and restrict the notebooks selected?\r
1126     public static boolean getMimicEvernoteInterface() {\r
1127                 settings.beginGroup("General");\r
1128                 try {\r
1129                         String text = (String)settings.value("mimicEvernoteInterface", "true");\r
1130                         settings.endGroup();\r
1131                         if (text.equalsIgnoreCase("true"))\r
1132                                 return true;\r
1133                         else\r
1134                                 return false;\r
1135                 } catch (java.lang.ClassCastException e) {\r
1136                         Boolean value = (Boolean) settings.value("mimicEvernoteInterface", true);\r
1137                         settings.endGroup();\r
1138                         return value;\r
1139                 }\r
1140     }\r
1141     public static void setMimicEvernoteInterface(boolean value) {\r
1142         settings.beginGroup("General");\r
1143         if (value)\r
1144                 settings.setValue("mimicEvernoteInterface", "true");\r
1145         else\r
1146                 settings.setValue("mimicEvernoteInterface", "false"); \r
1147         settings.endGroup();\r
1148     }\r
1149     \r
1150     \r
1151     // Synchronize with Evernote when closing?\r
1152     public static boolean synchronizeOnClose() {\r
1153                 settings.beginGroup("General");\r
1154                 try {\r
1155                         String text = (String)settings.value("synchronizeOnClose", "false");\r
1156                         settings.endGroup();\r
1157                         if (text.equalsIgnoreCase("true"))\r
1158                                 return true;\r
1159                         else\r
1160                                 return false;\r
1161                 } catch (java.lang.ClassCastException e) {\r
1162                         Boolean value = (Boolean) settings.value("synchronizeOnClose", false);\r
1163                         settings.endGroup();\r
1164                         return value;\r
1165                 }\r
1166     }\r
1167     public static void setSynchronizeOnClose(boolean val) {\r
1168                 settings.beginGroup("General");\r
1169                 if (val)\r
1170                         settings.setValue("synchronizeOnClose", "true");\r
1171                 else\r
1172                         settings.setValue("synchronizeOnClose", "false");\r
1173                 settings.endGroup();\r
1174     }\r
1175 \r
1176     // Get/set the database version.  Not really used any more, but kept\r
1177     // for compatibility.\r
1178     public static void setDatabaseVersion(String version) {\r
1179                 settings.beginGroup("General");\r
1180                 settings.setValue("databaseVersion", version);\r
1181                 settings.endGroup();\r
1182     }\r
1183     public static String getDatabaseVersion() {\r
1184                 settings.beginGroup("General");\r
1185                 String val  = (String)settings.value("databaseVersion", "0.70");\r
1186                 settings.endGroup();\r
1187                 return val;\r
1188     }\r
1189 \r
1190     // Get the URL (full path) of the main database\r
1191     public static String getDatabaseUrl() {\r
1192                 settings.beginGroup("General");\r
1193                 String val  = (String)settings.value("DatabaseURL", "");\r
1194                 settings.endGroup();\r
1195                 if (val.equals(""))\r
1196                         val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.databaseName);\r
1197                 return val;\r
1198     }\r
1199     \r
1200     // get the url (full path) of the searchable word database\r
1201     public static String getIndexDatabaseUrl() {\r
1202                 settings.beginGroup("General");\r
1203                 String val  = (String)settings.value("IndexDatabaseURL", "");\r
1204                 settings.endGroup();\r
1205                 if (val.equals(""))\r
1206                         val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.indexDatabaseName);\r
1207                 return val;\r
1208     }\r
1209     \r
1210     // Get the url (full path) of the attachment database\r
1211     public static String getResourceDatabaseUrl() {\r
1212                 settings.beginGroup("General");\r
1213                 String val  = (String)settings.value("ResourceDatabaseURL", "");\r
1214                 settings.endGroup();\r
1215                 if (val.equals(""))\r
1216                         val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.resourceDatabaseName);\r
1217                 return val;\r
1218     }\r
1219     public static void setDatabaseUrl(String value) {\r
1220                 settings.beginGroup("General");\r
1221                 settings.setValue("DatabaseURL", value);\r
1222                 settings.endGroup();\r
1223     }\r
1224     public static void setIndexDatabaseUrl(String value) {\r
1225                 settings.beginGroup("General");\r
1226                 settings.setValue("IndexDatabaseURL", value);\r
1227                 settings.endGroup();\r
1228     }\r
1229     public static void setResourceDatabaseUrl(String value) {\r
1230                 settings.beginGroup("General");\r
1231                 settings.setValue("ResourceDatabaseURL", value);\r
1232                 settings.endGroup();\r
1233     }\r
1234     public static String getDatabaseUserid() {\r
1235                 settings.beginGroup("General");\r
1236                 String val  = (String)settings.value("databaseUserid", "");\r
1237                 settings.endGroup();\r
1238                 return val;\r
1239     }\r
1240     public static String getDatabaseUserPassword() {\r
1241                 settings.beginGroup("General");\r
1242                 String val  = (String)settings.value("databaseUserPassword", "");\r
1243                 settings.endGroup();\r
1244                 return val;\r
1245     }\r
1246     \r
1247     // get/Set the style sheet and the palette to control the look & feel\r
1248     public static void setStyle(String style) {\r
1249                 settings.beginGroup("General");\r
1250                 settings.setValue("style", style);\r
1251                 settings.endGroup();\r
1252     }\r
1253     public static String getStyle() {\r
1254                 settings.beginGroup("General");\r
1255                 String val  = (String)settings.value("style", "Cleanlooks");\r
1256                 settings.endGroup();\r
1257                 return val;\r
1258     }\r
1259     public static boolean useStandardPalette() {\r
1260                 settings.beginGroup("General");\r
1261                 try {\r
1262                         String text = (String)settings.value("standardPalette", "true");\r
1263                         settings.endGroup();\r
1264                         if (text.equalsIgnoreCase("true"))\r
1265                                 return true;\r
1266                         else\r
1267                                 return false;\r
1268                 } catch (java.lang.ClassCastException e) {\r
1269                         Boolean value = (Boolean) settings.value("standardPalette", true);\r
1270                         settings.endGroup();\r
1271                         return value;\r
1272                 }\r
1273     }\r
1274     public static void setStandardPalette(boolean val) {\r
1275                 settings.beginGroup("General");\r
1276                 if (val)\r
1277                         settings.setValue("standardPalette", "true");\r
1278                 else\r
1279                         settings.setValue("standardPalette", "false");\r
1280                 settings.endGroup();\r
1281     }\r
1282     \r
1283     // Set the amount of time to wait between indexing\r
1284     // Get/Set interval when the index thread wakes up.\r
1285     public static void setIndexThreadSleepInterval(int sleep) {\r
1286                 settings.beginGroup("General");\r
1287                 settings.setValue("IndexThreadSleepInterval", sleep);\r
1288                 settings.endGroup();\r
1289     }\r
1290     public static int getIndexThreadSleepInterval() {\r
1291                 settings.beginGroup("General");\r
1292                 Integer sleep;\r
1293                 try {\r
1294                         String val  = (String)settings.value("IndexThreadSleepInterval", "300");\r
1295                         sleep = new Integer(val.trim());\r
1296                 } catch (Exception e) {\r
1297                         try {\r
1298                                 sleep = (Integer)settings.value("IndexThreadSleepInterval", 0);\r
1299                         } catch (Exception e1) {\r
1300                                 sleep = 300;\r
1301                         }\r
1302                 }\r
1303                 settings.endGroup();\r
1304                 return sleep;\r
1305     }\r
1306     \r
1307     \r
1308     // Get/Set a window state for later restoring\r
1309     public static void saveState(String name, QByteArray state) {\r
1310         int view = Global.getListView();\r
1311         if (view == Global.View_List_Narrow)\r
1312                 name = name +"Narrow";\r
1313                 settings.beginGroup("SaveState");\r
1314                 settings.setValue(name, state);\r
1315                 settings.endGroup();\r
1316     }\r
1317     \r
1318     public static QByteArray restoreState(String name) {\r
1319         int view = Global.getListView();\r
1320         if (view == Global.View_List_Narrow)\r
1321                 name = name +"Narrow";\r
1322                 settings.beginGroup("SaveState");\r
1323                 QByteArray state = (QByteArray)settings.value(name);\r
1324                 settings.endGroup();\r
1325                 return state;\r
1326     }\r
1327     public static void saveGeometry(String name, QByteArray state) {\r
1328         int view = Global.getListView();\r
1329         if (view == Global.View_List_Narrow)\r
1330                 settings.beginGroup("SaveGeometryNarrow");\r
1331         else\r
1332                 settings.beginGroup("SaveGeometry");\r
1333                 settings.setValue(name, state);\r
1334                 settings.endGroup();\r
1335     }\r
1336     \r
1337     public static QByteArray restoreGeometry(String name) {\r
1338         int view = Global.getListView();\r
1339         if (view == Global.View_List_Narrow)\r
1340                 settings.beginGroup("SaveGeometryNarrow");\r
1341         else\r
1342                 settings.beginGroup("SaveGeometry");\r
1343                 QByteArray state = (QByteArray)settings.value(name);\r
1344                 settings.endGroup();\r
1345                 return state;\r
1346     }\r
1347     \r
1348     \r
1349     // Set how often to do an automatic save\r
1350     public static void setAutoSaveInterval(int interval) {\r
1351                 settings.beginGroup("General");\r
1352                 settings.setValue("autoSaveInterval", interval);\r
1353                 settings.endGroup();\r
1354     }\r
1355     public static int getAutoSaveInterval() {\r
1356                 settings.beginGroup("General");\r
1357                 Integer value;\r
1358                 try {\r
1359                         String val  = (String)settings.value("autoSaveInterval", "5");\r
1360                         value = new Integer(val.trim());\r
1361                 } catch (Exception e) {\r
1362                         try {\r
1363                                 value = (Integer)settings.value("autoSaveInterval", 5);\r
1364                         } catch (Exception e1) {\r
1365                                 value = 5;\r
1366                         }\r
1367                 }\r
1368                 settings.endGroup();\r
1369                 return value;\r
1370     }\r
1371      \r
1372     // Add an invalid attribute & element to the database so we don't bother parsing it in the future\r
1373     // These values we automatically remove from any note.\r
1374     // Add invalid attributes\r
1375     public static void addInvalidAttribute(String element, String attribute) {\r
1376         \r
1377                 List<String> attributes = invalidAttributes.get(element);\r
1378                 if (attributes != null) {\r
1379                         for (int i=0; i<attributes.size(); i++)\r
1380                                 if (attribute.equalsIgnoreCase(attributes.get(i))) {\r
1381                                         return;\r
1382                         }\r
1383         }\r
1384         \r
1385         ArrayList<String> attributeList;\r
1386         if (!invalidAttributes.containsKey(element)) {\r
1387                 attributeList = new ArrayList<String>();\r
1388                 attributeList.add(attribute);\r
1389                 invalidAttributes.put(element, attributeList);\r
1390         }\r
1391         else {\r
1392                 attributeList = invalidAttributes.get(element);\r
1393                 attributeList.add(attribute);\r
1394                 invalidAttributes.put(element,attributeList);\r
1395         }\r
1396     }\r
1397    \r
1398     // Add invalid attributes\r
1399     public static void addInvalidElement(String element) {\r
1400                 for (int i=0; i<invalidElements.size(); i++) {\r
1401                         if (element.equalsIgnoreCase(invalidElements.get(i)))\r
1402                                 return;\r
1403                 }\r
1404         invalidElements.add(element);\r
1405     }\r
1406     \r
1407     // Get/Set proxy information\r
1408     // Proxy settings\r
1409     public static String getProxyValue(String key) {\r
1410                 settings.beginGroup("Proxy");\r
1411                 String val  = (String)settings.value(key, "");\r
1412                 settings.endGroup();\r
1413                 return val;\r
1414     }\r
1415     public static void setProxyValue(String key, String value) {\r
1416                 settings.beginGroup("Proxy");\r
1417                 settings.setValue(key, value);\r
1418                 settings.endGroup();\r
1419     }\r
1420     \r
1421     // Change a byte array to a hex string\r
1422     // Convert a byte array to a hex string\r
1423         public static String byteArrayToHexString(byte data[]) {\r
1424                 StringBuffer buf = new StringBuffer();\r
1425             for (byte element : data) {\r
1426                 int halfbyte = (element >>> 4) & 0x0F;\r
1427                 int two_halfs = 0;\r
1428                 do {\r
1429                         if ((0 <= halfbyte) && (halfbyte <= 9))\r
1430                                buf.append((char) ('0' + halfbyte));\r
1431                            else\r
1432                                 buf.append((char) ('a' + (halfbyte - 10)));\r
1433                         halfbyte = element & 0x0F;\r
1434                 } while(two_halfs++ < 1);\r
1435             }\r
1436             return buf.toString();              \r
1437         }\r
1438 \r
1439     \r
1440         // Get/Set spelling settings\r
1441         public static boolean getSpellSetting(String value) {\r
1442                 settings.beginGroup("Spell");\r
1443                 String text = (String)settings.value(value, "");\r
1444                 settings.endGroup();\r
1445                 if (text.equalsIgnoreCase("true"))\r
1446                         return true;\r
1447                 if (text.equalsIgnoreCase("false"))\r
1448                         return false;\r
1449                 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREDIGITWORDS))\r
1450                         return true;\r
1451                 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREINTERNETADDRESSES))\r
1452                         return true;\r
1453                 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREUPPERCASE))\r
1454                         return true;\r
1455                 if (value.equalsIgnoreCase(Configuration.SPELL_IGNORESENTENCECAPITALIZATION))\r
1456                         return true;\r
1457                 return false;\r
1458     }\r
1459     public static void setSpellSetting(String setting, boolean val) {\r
1460                 settings.beginGroup("Spell");\r
1461                 if (val)\r
1462                         settings.setValue(setting, "true");\r
1463                 else\r
1464                         settings.setValue(setting, "false");\r
1465                 settings.endGroup();\r
1466     }\r
1467         \r
1468         // Get/Set how we should display tags (color them, hide unused, or do nothing)\r
1469         // What to do with inactive tags?\r
1470         public static String tagBehavior() {\r
1471                 settings.beginGroup("General");\r
1472                 String text = (String)settings.value("tagBehavior", "DoNothing");\r
1473                 settings.endGroup();\r
1474                 return text;\r
1475         }\r
1476         // What to do with inactive tags?\r
1477         public static void setTagBehavior(String value) {\r
1478                 settings.beginGroup("General");\r
1479                 settings.setValue("tagBehavior", value);\r
1480                 settings.endGroup();\r
1481         }\r
1482 \r
1483     \r
1484         // Should the toolbar be visible?\r
1485         public static boolean isToolbarButtonVisible(String window) {\r
1486                 settings.beginGroup("ToolbarButtonsVisible");\r
1487                 try {\r
1488                         String text = (String)settings.value(window, "true");\r
1489                         settings.endGroup();\r
1490                         if (text.equalsIgnoreCase("true"))\r
1491                                 return true;\r
1492                         else\r
1493                                 return false;   \r
1494                 } catch (java.lang.ClassCastException e) {\r
1495                         Boolean value = (Boolean) settings.value(window, true);\r
1496                         settings.endGroup();\r
1497                         return value;\r
1498                 }\r
1499     }\r
1500     public static void saveToolbarButtonsVisible(String column, boolean val) {\r
1501                 settings.beginGroup("ToolbarButtonsVisible");\r
1502                 if (val)\r
1503                         settings.setValue(column, "true");\r
1504                 else\r
1505                         settings.setValue(column, "false");\r
1506                 settings.endGroup();\r
1507     }\r
1508         \r
1509     // Are thumbnails enabled?\r
1510     \r
1511     public static boolean enableThumbnails() {\r
1512                 settings.beginGroup("Debug");\r
1513                 try {\r
1514                         String text = (String)settings.value("thumbnails", "true");\r
1515                         settings.endGroup();\r
1516                         if (text.equalsIgnoreCase("true"))\r
1517                                 return true;\r
1518                         else\r
1519                                 return false;\r
1520                 } catch (java.lang.ClassCastException e) {\r
1521                         Boolean value = (Boolean) settings.value("thumbnails", true);\r
1522                         settings.endGroup();\r
1523                         return value;\r
1524                 }\r
1525     }\r
1526     public static void setEnableThumbnails(boolean val) {\r
1527                 settings.beginGroup("Debug");\r
1528                 if (val)\r
1529                         settings.setValue("thumbnails", "true");\r
1530                 else\r
1531                         settings.setValue("thumbnails", "false");\r
1532                 settings.endGroup();\r
1533     }\r
1534         \r
1535     // Trace used for performance tuning.  Not normally used in production.\r
1536         // Print date/time.  Used mainly for performance tracing\r
1537         public static void trace(boolean resetInterval) {\r
1538                 String fmt = "MM/dd/yy HH:mm:ss.SSSSSS";\r
1539                 String dateTimeFormat = new String(fmt);\r
1540                 SimpleDateFormat simple = new SimpleDateFormat(dateTimeFormat);\r
1541                 Calendar cal = Calendar.getInstance();\r
1542                 if (intervalTraceTime == null) \r
1543                         intervalTraceTime = Calendar.getInstance();\r
1544                 if (startTraceTime == null)\r
1545                         startTraceTime = Calendar.getInstance();\r
1546                 \r
1547                 float interval = (cal.getTimeInMillis() - intervalTraceTime.getTimeInMillis());\r
1548                 float total = (cal.getTimeInMillis() - startTraceTime.getTimeInMillis());\r
1549                 \r
1550 //              if (interval > 00.0) {\r
1551                         StackTraceElement[] exceptions = Thread.currentThread().getStackTrace();\r
1552                         System.out.println("------------------------------------------");\r
1553 \r
1554                         System.out.println("Date/Time " +simple.format(cal.getTime()));\r
1555                         System.out.format("Interval Time: %-10.6f%n", interval);\r
1556                         System.out.format("Total Time: %-10.6f%n", total);\r
1557                         for (int i=2; i<5 && i<exceptions.length; i++) {\r
1558                                 System.out.println(exceptions[i]);\r
1559                         }\r
1560 //              }\r
1561                 if (resetInterval)\r
1562                         intervalTraceTime = cal;\r
1563         }\r
1564         public static void traceReset() {\r
1565                 intervalTraceTime = null;\r
1566                 startTraceTime = null;\r
1567         }\r
1568 \r
1569     \r
1570         // Get the FileManager class to manage local files & directories\r
1571         public static FileManager getFileManager() {\r
1572         return fileManager;\r
1573     }\r
1574         \r
1575         // Should the note editor be disabled?\r
1576     public static boolean getDisableViewing() {\r
1577         return disableViewing;\r
1578     }\r
1579 \r
1580     //**********************\r
1581     //* Thumbnail zoom level\r
1582     //**********************\r
1583     public static int calculateThumbnailZoom(String content) {\r
1584         int zoom = 1;\r
1585                 if (content.indexOf("application/pdf") == -1) {\r
1586                         if (content.indexOf("image/") == -1) {\r
1587                                 String text =  StringEscapeUtils.unescapeHtml4(content.replaceAll("\\<.*?\\>", ""));\r
1588                                 zoom = 2;\r
1589                                 if (text.length() < 500) \r
1590                                         zoom = 2;\r
1591                                 if (text.length() < 250)\r
1592                                         zoom = 3;\r
1593                                 if (text.length() < 100)\r
1594                                         zoom = 4;\r
1595                                 if (text.length() < 50)\r
1596                                         zoom = 5;\r
1597                                 if (text.length() < 10)\r
1598                                         zoom = 6;\r
1599                         }\r
1600                 }\r
1601                 return zoom;\r
1602     }\r
1603     \r
1604     //**********************\r
1605     //* List View settings \r
1606     //**********************\r
1607     public static void setListView(int view) {\r
1608                 settings.beginGroup("General");\r
1609                 settings.setValue("listView", view);\r
1610                 settings.endGroup();\r
1611     }\r
1612     public static int getListView() {\r
1613                 settings.beginGroup("General");\r
1614                 Integer value;\r
1615                 try {\r
1616                         String val  = (String)settings.value("listView", View_List_Wide);\r
1617                         value = new Integer(val.trim());\r
1618                 } catch (Exception e) {\r
1619                         try {\r
1620                                 value = (Integer)settings.value("listView", View_List_Wide);\r
1621                         } catch (Exception e1) {\r
1622                                 value = View_List_Wide;\r
1623                         }\r
1624                 }\r
1625                 settings.endGroup();\r
1626                 return value;\r
1627     }\r
1628 \r
1629     \r
1630     \r
1631     //*******************\r
1632     // Font Settings\r
1633     //*******************\r
1634     public static boolean overrideDefaultFont() {\r
1635                 settings.beginGroup("Font");\r
1636                 try {\r
1637                         String text = (String)settings.value("overrideFont", "false");\r
1638                         settings.endGroup();\r
1639                         if (text.equalsIgnoreCase("true"))\r
1640                                 return true;\r
1641                         else\r
1642                                 return false;   \r
1643                 } catch (java.lang.ClassCastException e) {\r
1644                         Boolean value = (Boolean) settings.value("overrideFont", false);\r
1645                         settings.endGroup();\r
1646                         return value;\r
1647                 }\r
1648 \r
1649     }\r
1650     \r
1651     //****************************************************\r
1652     // Get/Set the default font settings for a new note\r
1653     //****************************************************\r
1654     public static void setOverrideDefaultFont(boolean value) {\r
1655                 settings.beginGroup("Font");\r
1656                 settings.setValue("overrideFont", value);\r
1657                 settings.endGroup();    \r
1658     }\r
1659     public static String getDefaultFont() {\r
1660                 settings.beginGroup("Font");\r
1661                 String val  = (String)settings.value("font", "");\r
1662                 settings.endGroup();\r
1663                 return val;\r
1664     }\r
1665     public static void setDefaultFont(String value) {\r
1666                 settings.beginGroup("Font");\r
1667                 settings.setValue("font", value);\r
1668                 settings.endGroup();\r
1669     }\r
1670     public static String getDefaultFontSize() {\r
1671                 settings.beginGroup("Font");\r
1672                 String val  = (String)settings.value("fontSize", "");\r
1673                 settings.endGroup();\r
1674                 return val;\r
1675     }\r
1676     public static void setDefaultFontSize(String value) {\r
1677                 settings.beginGroup("Font");\r
1678                 settings.setValue("fontSize", value);\r
1679                 settings.endGroup();\r
1680     }\r
1681     \r
1682     \r
1683     //*******************************************\r
1684     // Override the close & minimize instead.\r
1685     //*******************************************\r
1686     public static boolean minimizeOnClose() {\r
1687                 settings.beginGroup("General");\r
1688                 try {\r
1689                         String text = (String)settings.value("minimizeOnClose", "false");\r
1690                         settings.endGroup();\r
1691                         if (text.equalsIgnoreCase("true") && QSystemTrayIcon.isSystemTrayAvailable())\r
1692                                 return true;\r
1693                         else\r
1694                                 return false;\r
1695                 } catch (java.lang.ClassCastException e) {\r
1696                         Boolean value = (Boolean) settings.value("minimizeOnClose", false);\r
1697                         settings.endGroup();\r
1698                         return value;\r
1699                 }\r
1700     }\r
1701     public static void setMinimizeOnClose(boolean value) {\r
1702                 settings.beginGroup("General");\r
1703                 settings.setValue("minimizeOnClose", value);\r
1704                 settings.endGroup();    \r
1705     }\r
1706 \r
1707     //*********************************\r
1708     // Check version information\r
1709     //*********************************\r
1710     public static boolean checkVersionUpgrade() {\r
1711                 settings.beginGroup("Upgrade");\r
1712                 try {\r
1713                         String text = (String)settings.value("checkForUpdates", "true");\r
1714                         settings.endGroup();\r
1715                         if (text.equalsIgnoreCase("true"))\r
1716                                 return true;\r
1717                         else\r
1718                                 return false;\r
1719                 } catch (java.lang.ClassCastException e) {\r
1720                         Boolean value = (Boolean) settings.value("checkForUpdates", true);\r
1721                         settings.endGroup();\r
1722                         return value;\r
1723                 }\r
1724     }\r
1725     public static void setCheckVersionUpgrade(boolean value) {\r
1726                 settings.beginGroup("Upgrade");\r
1727                 settings.setValue("checkForUpdates", value);\r
1728                 settings.endGroup();    \r
1729     }\r
1730     public static String getUpdatesAvailableUrl() {\r
1731                 settings.beginGroup("Upgrade");\r
1732                 String text = (String)settings.value("avialableUrl", "http://nevernote.sourceforge.net/versions.txt");\r
1733                 settings.endGroup();    \r
1734                 return text;\r
1735     }\r
1736     public static String getUpdateAnnounceUrl() {\r
1737                 settings.beginGroup("Upgrade");\r
1738                 String text = (String)settings.value("announceUrl", "http://nevernote.sourceforge.net/upgrade.html");\r
1739                 settings.endGroup();    \r
1740                 return text;\r
1741     }\r
1742     \r
1743     //*******************\r
1744     // Index settings\r
1745     //*******************\r
1746     // Set/Get if we should index the text of a note\r
1747     public static boolean indexNoteBody() {\r
1748                 settings.beginGroup("Index");\r
1749                 try {\r
1750                         String value = (String)settings.value("indexNoteBody", "true");\r
1751                         settings.endGroup();\r
1752                         if (value.equals("true"))\r
1753                                 return true;\r
1754                         else\r
1755                                 return false;\r
1756                 } catch (java.lang.ClassCastException e) {\r
1757                         Boolean value = (Boolean) settings.value("indexNoteBody", true);\r
1758                         settings.endGroup();\r
1759                         return value;\r
1760                 }\r
1761     }\r
1762     public static void setIndexNoteTitle(boolean value) {\r
1763                 settings.beginGroup("Index");\r
1764                 settings.setValue("indexNoteTitle", value);\r
1765                 settings.endGroup();    \r
1766     }\r
1767     // Set/Get if we should index the title of a note\r
1768     public static boolean indexNoteTitle() {\r
1769                 settings.beginGroup("Index");\r
1770                 try {\r
1771                         String value = (String)settings.value("indexNoteTitle", "true");\r
1772                         settings.endGroup();\r
1773                         if (value.equals("true"))\r
1774                                 return true;\r
1775                         else\r
1776                                 return false;\r
1777                 } catch (java.lang.ClassCastException e) {\r
1778                         Boolean value = (Boolean) settings.value("indexNoteTitle", true);\r
1779                         settings.endGroup();\r
1780                         return value;\r
1781                 }\r
1782     }\r
1783     public static void setIndexNoteBody(boolean value) {\r
1784                 settings.beginGroup("Index");\r
1785                 settings.setValue("indexNoteBody", value);\r
1786                 settings.endGroup();    \r
1787     }\r
1788     // Set/Get if we should index any attachments\r
1789     public static boolean indexAttachmentsLocally() {\r
1790                 settings.beginGroup("Index");\r
1791                 try {\r
1792                         String value = (String)settings.value("indexAttachmentsLocally", "true");\r
1793                         settings.endGroup();\r
1794                         if (value.equals("true"))\r
1795                                 return true;\r
1796                         else\r
1797                                 return false;\r
1798                 } catch (java.lang.ClassCastException e) {\r
1799                         Boolean value = (Boolean) settings.value("indexAttachmentsLocally", true);\r
1800                         settings.endGroup();\r
1801                         return value;\r
1802                 }\r
1803     }\r
1804     public static void setIndexImageRecognition(boolean value) {\r
1805                 settings.beginGroup("Index");\r
1806                 settings.setValue("indexImageRecognition", value);\r
1807                 settings.endGroup();    \r
1808     }\r
1809     public static boolean indexImageRecognition() {\r
1810                 settings.beginGroup("Index");\r
1811                 try {\r
1812                         String value = (String)settings.value("indexImageRecognition", "true");\r
1813                         settings.endGroup();\r
1814                         if (value.equals("true"))\r
1815                                 return true;\r
1816                         else\r
1817                                 return false;\r
1818                 } catch (java.lang.ClassCastException e) {\r
1819                         Boolean value = (Boolean) settings.value("indexImageRecognition", true);\r
1820                         settings.endGroup();\r
1821                         return value;\r
1822                 }\r
1823     }\r
1824     public static void setIndexAttachmentsLocally(boolean value) {\r
1825                 settings.beginGroup("Index");\r
1826                 settings.setValue("indexAttachmentsLocally", value);\r
1827                 settings.endGroup();    \r
1828     }\r
1829     // Get/Set characters that shouldn't be removed from a word\r
1830     public static String getSpecialIndexCharacters() {\r
1831                 settings.beginGroup("Index");\r
1832                 String text = (String)settings.value("specialCharacters", "");\r
1833                 settings.endGroup();    \r
1834                 return text;\r
1835     }\r
1836     public static void setSpecialIndexCharacters(String value) {\r
1837                 settings.beginGroup("Index");\r
1838                 settings.setValue("specialCharacters", value);\r
1839                 settings.endGroup();    \r
1840                 databaseCache = value;\r
1841     }\r
1842     \r
1843     //*****************************************************************************\r
1844     // Control how tag selection behaves (should they be "and" or "or" selections\r
1845     //*****************************************************************************\r
1846     public static boolean anyTagSelectionMatch() {\r
1847                 settings.beginGroup("General");\r
1848                 try {\r
1849                         String value = (String)settings.value("anyTagSelectionMatch", "false");\r
1850                         settings.endGroup();\r
1851                         if (value.equals("true"))\r
1852                                 return true;\r
1853                         else\r
1854                                 return false;\r
1855                 } catch (java.lang.ClassCastException e) {\r
1856                         Boolean value = (Boolean) settings.value("anyTagSelectionMatch", false);\r
1857                         settings.endGroup();\r
1858                         return value;\r
1859                 }\r
1860     }\r
1861     public static void setAnyTagSelectionMatch(boolean value) {\r
1862                 settings.beginGroup("General");\r
1863                 settings.setValue("anyTagSelectionMatch", value);\r
1864                 settings.endGroup();    \r
1865     }\r
1866 \r
1867     //*****************************************************************************\r
1868     // Control if a user receives a warning when trying to create a note-to-note link\r
1869     // when the DB is not synchronized.\r
1870     //*****************************************************************************\r
1871     public static boolean bypassSynchronizationWarning() {\r
1872                 settings.beginGroup("User");\r
1873                 try {\r
1874                         String value = (String)settings.value("bypassSynchronizationWarning", "false");\r
1875                         settings.endGroup();\r
1876                         if (value.equals("true"))\r
1877                                 return true;\r
1878                         else\r
1879                                 return false;\r
1880                 } catch (java.lang.ClassCastException e) {\r
1881                         Boolean value = (Boolean) settings.value("bypassSynchronizationWarning", false);\r
1882                         settings.endGroup();\r
1883                         return value;\r
1884                 }\r
1885     }\r
1886     public static void setBypassSynchronizationWarning(boolean value) {\r
1887                 settings.beginGroup("User");\r
1888                 settings.setValue("bypassSynchronizationWarning", value);\r
1889                 settings.endGroup();    \r
1890     }\r
1891 \r
1892     \r
1893     //***********************\r
1894     //* Database cache size\r
1895     //***********************\r
1896     public static String getDatabaseCacheSize() {\r
1897                 settings.beginGroup("Debug");\r
1898                 String text = (String)settings.value("databaseCache", "16384");\r
1899                 settings.endGroup();    \r
1900                 return text;\r
1901     }\r
1902     public static void setDatabaseCache(String value) {\r
1903                 settings.beginGroup("Debug");\r
1904                 settings.setValue("databaseCache", value);\r
1905                 settings.endGroup();    \r
1906                 databaseCache = value;\r
1907     }\r
1908 \r
1909     \r
1910     // This is used to copy a class since Java's normal deep copy is wacked\r
1911     public static Object deepCopy(Object oldObj) \r
1912     {\r
1913        ObjectOutputStream oos = null;\r
1914        ObjectInputStream ois = null;\r
1915        try\r
1916        {\r
1917           ByteArrayOutputStream bos = \r
1918                 new ByteArrayOutputStream(); // A\r
1919           oos = new ObjectOutputStream(bos); // B\r
1920           // serialize and pass the object\r
1921           oos.writeObject(oldObj);   // C\r
1922           oos.flush();               // D\r
1923           ByteArrayInputStream bin = \r
1924                 new ByteArrayInputStream(bos.toByteArray()); // E\r
1925           ois = new ObjectInputStream(bin);                  // F\r
1926           // return the new object\r
1927           return ois.readObject(); // G\r
1928        }\r
1929        catch(Exception e)\r
1930        {\r
1931           Global.logger.log(logger.LOW, "Exception in ObjectCloner = " + e);\r
1932        }\r
1933           try {\r
1934                         oos.close();\r
1935                 ois.close();\r
1936                 } catch (IOException e) {\r
1937                         Global.logger.log(logger.LOW, "Exception in ObjectCloner = " + e);\r
1938                         e.printStackTrace();\r
1939                 }\r
1940 \r
1941                 return null;\r
1942     }\r
1943 \r
1944     // If we should automatically select the children of any tag\r
1945     public static boolean includeTagChildren() {\r
1946                 settings.beginGroup("General");\r
1947                 try {\r
1948                         String value = (String)settings.value("includeTagChildren", "false");\r
1949                         settings.endGroup();\r
1950                         if (value.equals("true"))\r
1951                                 return true;\r
1952                         else\r
1953                                 return false;\r
1954                 } catch (java.lang.ClassCastException e) {\r
1955                         Boolean value = (Boolean) settings.value("includeTagChildren", false);\r
1956                         settings.endGroup();\r
1957                         return value;\r
1958                 }\r
1959 \r
1960     }\r
1961     public static void setIncludeTagChildren(boolean value) {\r
1962                 settings.beginGroup("General");\r
1963                 settings.setValue("includeTagChildren", value);\r
1964                 settings.endGroup();    \r
1965     }\r
1966     \r
1967     // If we should automatically wildcard searches\r
1968     public static boolean automaticWildcardSearches() {\r
1969                 settings.beginGroup("General");\r
1970                 try {\r
1971                         String value = (String)settings.value("automaticWildcard", "false");\r
1972                         settings.endGroup();\r
1973                         if (value.equals("true"))\r
1974                                 return true;\r
1975                         else\r
1976                                 return false;\r
1977                 } catch (java.lang.ClassCastException e) {\r
1978                         Boolean value = (Boolean) settings.value("automaticWildcard", false);\r
1979                         settings.endGroup();\r
1980                         return value;\r
1981                 }\r
1982 \r
1983     }\r
1984     public static void setAutomaticWildcardSearches(boolean value) {\r
1985                 settings.beginGroup("General");\r
1986                 settings.setValue("automaticWildcard", value);\r
1987                 settings.endGroup();    \r
1988     }\r
1989 \r
1990     // If we should automatically select the children of any tag\r
1991     public static boolean displayRightToLeft() {\r
1992                 settings.beginGroup("General");\r
1993                 try {\r
1994                         String value = (String)settings.value("displayRightToLeft", "false");\r
1995                         settings.endGroup();\r
1996                         if (value.equals("true"))\r
1997                                 return true;\r
1998                         else\r
1999                                 return false;\r
2000                 } catch (java.lang.ClassCastException e) {\r
2001                         Boolean value = (Boolean) settings.value("displayRightToLeft", false);\r
2002                         settings.endGroup();\r
2003                         return value;\r
2004                 }\r
2005 \r
2006     }\r
2007     public static void setDisplayRightToLeft(boolean value) {\r
2008                 settings.beginGroup("General");\r
2009                 settings.setValue("displayRightToLeft", value);\r
2010                 settings.endGroup();    \r
2011     }\r
2012 \r
2013 \r
2014     //***********************\r
2015     //* Startup Notebook\r
2016     //***********************\r
2017     public static String getStartupNotebook() {\r
2018                 settings.beginGroup("General");\r
2019                 String text = (String)settings.value("startupNotebook", "");\r
2020                 settings.endGroup();    \r
2021                 return text;\r
2022     }\r
2023     public static void setStartupNotebook(String value) {\r
2024                 settings.beginGroup("General");\r
2025                 settings.setValue("startupNotebook", value);\r
2026                 settings.endGroup();    \r
2027                 databaseCache = value;\r
2028     }\r
2029 }\r
2030 \r