OSDN Git Service

Add logic to disable tray options if there is no tray available.
[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     // Should it save the Evernote password?\r
611     public static boolean rememberPassword() {\r
612         try {\r
613                         settings.beginGroup("General");\r
614                         String text = (String)settings.value("rememberPassword", "false");\r
615                         settings.endGroup();\r
616                         if (text.equalsIgnoreCase("true"))\r
617                                 return true;\r
618                         else\r
619                                 return false;   \r
620                 } catch (java.lang.ClassCastException e) {\r
621                         Boolean value = (Boolean) settings.value("rememberPassword", false);\r
622                         settings.endGroup();\r
623                         return value;\r
624                 }\r
625     }\r
626     public static void setRememberPassword(boolean val) {\r
627                 settings.beginGroup("General");\r
628                 if (val)\r
629                         settings.setValue("rememberPassword", "true");\r
630                 else\r
631                         settings.setValue("rememberPassword", "false");\r
632                 settings.endGroup();\r
633     }\r
634 \r
635     // Get/set the Evernote server Url.  \r
636     public static void setServer(String server) {\r
637                 settings.beginGroup("General");\r
638                 settings.setValue("server", server);\r
639                 settings.endGroup();            \r
640     }\r
641     public static String getServer() {\r
642                 settings.beginGroup("General");\r
643                 String text = (String)settings.value("server", "www.evernote.com");\r
644                 if (text.equals("www.evernote.com")) {\r
645                         userStoreUrl = "https://www.evernote.com/edam/user";\r
646                     noteStoreUrlBase = "www.evernote.com/edam/note/";   \r
647                 } else {\r
648                         userStoreUrl = "https://sandbox.evernote.com/edam/user";\r
649                         noteStoreUrlBase = "sandbox.evernote.com/edam/note/";\r
650                 }\r
651                 settings.endGroup();\r
652 //              if (isPremium())\r
653                         noteStoreUrlBase = "https://" + noteStoreUrlBase;\r
654 //              else\r
655 //                      noteStoreUrlBase = "http://" + noteStoreUrlBase;\r
656                 return text;\r
657     }\r
658 \r
659     // Get/Set if we should disable uploads to Evernote\r
660     public static boolean disableUploads() {\r
661         settings.beginGroup("General");\r
662         try {\r
663                 String text = (String)settings.value("disableUploads", "false");\r
664                 settings.endGroup();\r
665                 if (text.equalsIgnoreCase("true"))\r
666                         return true;\r
667                 else\r
668                         return false;\r
669                 } catch (java.lang.ClassCastException e) {\r
670                         Boolean value = (Boolean) settings.value("disableUploads", false);\r
671                         settings.endGroup();\r
672                         return value;\r
673                 }\r
674     }\r
675     public static void setDisableUploads(boolean val) {\r
676                 settings.beginGroup("General");\r
677                 if (val)\r
678                         settings.setValue("disableUploads", "true");\r
679                 else\r
680                         settings.setValue("disableUploads", "false");\r
681                 settings.endGroup();\r
682                 disableUploads = val;\r
683     }\r
684  \r
685     // Should we view PDF documents inline?\r
686     public static boolean pdfPreview() {\r
687                 settings.beginGroup("General");\r
688                 try {\r
689                         String text = (String)settings.value("pdfPreview", "true");\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("pdfPreview", true);\r
697                         settings.endGroup();\r
698                         return value;\r
699                 }\r
700     }\r
701     public static void setPdfPreview(boolean val) {\r
702                 settings.beginGroup("General");\r
703                 if (val)\r
704                         settings.setValue("pdfPreview", "true");\r
705                 else\r
706                         settings.setValue("pdfPreview", "false");\r
707                 settings.endGroup();\r
708     }\r
709     \r
710     // When creating a new note, should it inherit tags that are currently selected?\r
711     public static boolean newNoteWithSelectedTags() {\r
712                 settings.beginGroup("General");\r
713                 try {\r
714                         String text = (String)settings.value("newNoteWithSelectedTags", "false");\r
715                         settings.endGroup();\r
716                         if (text.equalsIgnoreCase("true"))\r
717                                 return true;\r
718                         else\r
719                                 return false;\r
720                 } catch (java.lang.ClassCastException e) {\r
721                         Boolean value = (Boolean) settings.value("newNoteWithSelectedTags", false);\r
722                         settings.endGroup();\r
723                         return value;\r
724                 }\r
725     }\r
726     public static void setNewNoteWithSelectedTags(boolean val) {\r
727                 settings.beginGroup("General");\r
728                 if (val)\r
729                         settings.setValue("newNoteWithSelectedTags", "true");\r
730                 else\r
731                         settings.setValue("newNoteWithSelectedTags", "false");\r
732                 settings.endGroup();\r
733     }\r
734     \r
735     // Minimum weight for text OCRed from Evernote. Anything below this\r
736     // Won't be shown to the user when they search\r
737     public static void setRecognitionWeight(int len) {\r
738                 settings.beginGroup("General");\r
739                 settings.setValue("recognitionWeight", len);\r
740                 settings.endGroup();            \r
741     }\r
742     public static int getRecognitionWeight() {\r
743                 settings.beginGroup("General");\r
744                 Integer len;\r
745                 try {\r
746                         len = (Integer)settings.value("recognitionWeight", 30);\r
747                 } catch (Exception e) {\r
748                         len = 80;\r
749                 }\r
750                 settings.endGroup();\r
751                 return len;\r
752     }\r
753     \r
754     // get/set current debug message level\r
755     public static String getMessageLevel() {\r
756                 settings.beginGroup("Debug");\r
757                 String text = (String)settings.value("messageLevel", "Low");\r
758                 settings.endGroup();\r
759                 setMessageLevel(text);\r
760                 return text;\r
761     }\r
762     public static void setDateFormat(String format) {\r
763                 settings.beginGroup("General");\r
764                 settings.setValue("dateFormat", format);\r
765                 settings.endGroup();            \r
766     }\r
767     \r
768     // Get/Set user date/time formats\r
769     public static String getDateFormat() {\r
770                 settings.beginGroup("General");\r
771                 String text = (String)settings.value("dateFormat", "MM/dd/yyyy");\r
772                 settings.endGroup();\r
773                 return text;\r
774     }\r
775     public static void setTimeFormat(String format) {\r
776                 settings.beginGroup("General");\r
777                 settings.setValue("timeFormat", format);\r
778                 settings.endGroup();            \r
779     }\r
780     public static String getTimeFormat() {\r
781                 settings.beginGroup("General");\r
782                 String text = (String)settings.value("timeFormat", "HH:mm:ss");\r
783                 settings.endGroup();\r
784                 return text;\r
785     }\r
786     \r
787     // How often should we sync with Evernote?\r
788     public static String getSyncInterval() {\r
789                 settings.beginGroup("General");\r
790                 String text = (String)settings.value("syncInterval", "15 minutes");\r
791                 settings.endGroup();\r
792                 return text;            \r
793     }\r
794     public static void setSyncInterval(String format) {\r
795                 settings.beginGroup("General");\r
796                 settings.setValue("syncInterval", format);\r
797                 settings.endGroup();            \r
798     }\r
799     \r
800     // Get/Set the width of columns and their position for the \r
801     // next start.\r
802     public static void setColumnWidth(String col, int width) {\r
803         if (Global.getListView() == Global.View_List_Wide)\r
804                 settings.beginGroup("ColumnWidths");\r
805         else \r
806                 settings.beginGroup("ColumnWidths-Narrow");\r
807                 settings.setValue(col, width);\r
808                 settings.endGroup();\r
809         }\r
810     public static int getColumnWidth(String col) {\r
811         int view = Global.getListView();\r
812         if (view == Global.View_List_Wide)\r
813                 settings.beginGroup("ColumnWidths");\r
814         else\r
815                 settings.beginGroup("ColumnWidths-Narrow");\r
816                 Integer width;\r
817                 try {\r
818                         String val  = (String)settings.value(col, "0");\r
819                         width = new Integer(val.trim());\r
820                 } catch (Exception e) {\r
821                         try {\r
822                                 width = (Integer)settings.value(col, 0);\r
823                         } catch (Exception e1) {\r
824                                 width = 0;\r
825                         }\r
826                 }\r
827                 settings.endGroup();\r
828                 return width;\r
829     }\r
830     public static void setColumnPosition(String col, int width) {\r
831         if (Global.getListView() == Global.View_List_Wide)\r
832                 settings.beginGroup("ColumnPosition");\r
833         else\r
834                 settings.beginGroup("ColumnPosition-Narrow");\r
835                 settings.setValue(col, width);\r
836                 settings.endGroup();\r
837     }\r
838     public static int getColumnPosition(String col) {\r
839         if (Global.getListView() == Global.View_List_Wide)\r
840                 settings.beginGroup("ColumnPosition");\r
841         else\r
842                 settings.beginGroup("ColumnPosition-Narrow");\r
843                 Integer width;\r
844                 try {\r
845                         String val  = (String)settings.value(col, "-1");\r
846                         width = new Integer(val.trim());\r
847                 } catch (Exception e) {\r
848                         try {\r
849                                 width = (Integer)settings.value(col, 0);\r
850                         } catch (Exception e1) {\r
851                                 width = 0;\r
852                         }\r
853                 }\r
854                 settings.endGroup();\r
855                 return width;\r
856     }\r
857     \r
858     // Ping the user when they try to delete or just do it.\r
859     public static boolean verifyDelete() {\r
860                 settings.beginGroup("General");\r
861                 try {\r
862                         String text = (String)settings.value("verifyDelete", "true");\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("verifyDelete", true);\r
870                         settings.endGroup();\r
871                         return value;\r
872                 }\r
873     }\r
874     public static void setVerifyDelete(boolean val) {\r
875                 settings.beginGroup("General");\r
876                 if (val)\r
877                         settings.setValue("verifyDelete", "true");\r
878                 else\r
879                         settings.setValue("verifyDelete", "false");\r
880                 settings.endGroup();\r
881     }\r
882     \r
883     // Should it start minimized?\r
884     public static boolean startMinimized() {\r
885                 settings.beginGroup("General");\r
886                 try {\r
887                         String text = (String)settings.value("startMinimized", "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("startMinimized", false);\r
895                         settings.endGroup();\r
896                         return value;\r
897                 }\r
898     }\r
899     public static void setStartMinimized(boolean val) {\r
900                 settings.beginGroup("General");\r
901                 if (val)\r
902                         settings.setValue("startMinimized", "true");\r
903                 else\r
904                         settings.setValue("startMinimized", "false");\r
905                 settings.endGroup();\r
906     }\r
907     \r
908     // Should we upload the content of any deleted notes\r
909     public static boolean synchronizeDeletedContent() {\r
910                 settings.beginGroup("General");\r
911                 try {\r
912                         String text = (String)settings.value("syncDeletedContent", "false");\r
913                         settings.endGroup();\r
914                         if (text.equalsIgnoreCase("true"))\r
915                                 return true;\r
916                         else\r
917                                 return false;\r
918                 } catch (java.lang.ClassCastException e) {\r
919                         Boolean value = (Boolean) settings.value("syncDeletedContent", false);\r
920                         settings.endGroup();\r
921                         return value;\r
922                 }\r
923     }   \r
924     public static void setSynchronizeDeletedContent(boolean val) {\r
925                 settings.beginGroup("General");\r
926                 if (val)\r
927                         settings.setValue("syncDeletedContent", "true");\r
928                 else\r
929                         settings.setValue("syncDeletedContent", "false");\r
930                 settings.endGroup();\r
931     }\r
932     \r
933     // Is a section of the window visible?  Used to hide things people don't\r
934     // want to see.\r
935     public static boolean isWindowVisible(String window) {\r
936                 settings.beginGroup("WindowsVisible");\r
937                 try {\r
938                         String defaultValue = "true";\r
939                         if (window.equalsIgnoreCase("noteInformation"))\r
940                                 defaultValue = "false";\r
941                         String text = (String)settings.value(window, defaultValue);\r
942                         settings.endGroup();\r
943                         if (text.equalsIgnoreCase("true"))\r
944                                 return true;\r
945                 else\r
946                         return false;           \r
947                 } catch (java.lang.ClassCastException e) {\r
948                         boolean defaultValue = true;\r
949                         if (window.equalsIgnoreCase("noteInformation"))\r
950                                 defaultValue = false;\r
951                         Boolean value = (Boolean) settings.value("showTrayIcon", defaultValue);\r
952                         settings.endGroup();\r
953                         return value;\r
954                 }\r
955     }\r
956     public static void saveWindowVisible(String window, boolean val) {\r
957                 settings.beginGroup("WindowsVisible");\r
958                 if (val)\r
959                         settings.setValue(window, "true");\r
960                 else\r
961                         settings.setValue(window, "false");\r
962                 settings.endGroup();\r
963     }\r
964     \r
965     // Is a list in the column in the note list visible?  \r
966     public static boolean isColumnVisible(String window) {\r
967         String defaultValue = "true";\r
968         int view = Global.getListView();\r
969         if (Global.getListView() == Global.View_List_Wide)\r
970                 settings.beginGroup("ColumnsVisible");\r
971         else\r
972                 settings.beginGroup("ColumnsVisible-Narrow"); \r
973                 if (window.equalsIgnoreCase("thumbnail") && view == Global.View_List_Wide)\r
974                         defaultValue = "false";\r
975                 if (window.equalsIgnoreCase("thumbnail"))\r
976                         defaultValue = "false";\r
977                 if (window.equalsIgnoreCase("Guid"))\r
978                         defaultValue = "false";\r
979                 try {\r
980                         String text = (String)settings.value(window, defaultValue);\r
981                         settings.endGroup();\r
982                         if (text.equalsIgnoreCase("true"))\r
983                                 return true;\r
984                         else\r
985                                 return false;\r
986                 } catch (java.lang.ClassCastException e) {\r
987                         boolean defBool = false;\r
988                         if (window.equalsIgnoreCase("true"))\r
989                                 defBool = true;\r
990                         else\r
991                                 defBool = false;\r
992                         Boolean value = (Boolean) settings.value(window, defBool);\r
993                         settings.endGroup();\r
994                         return value;\r
995                 }\r
996     }\r
997     public static void saveColumnVisible(String column, boolean val) {\r
998         if (Global.getListView() == Global.View_List_Wide)\r
999                 settings.beginGroup("ColumnsVisible");\r
1000         else\r
1001                 settings.beginGroup("ColumnsVisible-Narrow");                   \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     // Is a particular editor button visible?\r
1010     public static boolean isEditorButtonVisible(String window) {\r
1011                 settings.beginGroup("EditorButtonsVisible");\r
1012                 try {\r
1013                         String text = (String)settings.value(window, "true");\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(window, true);\r
1021                         settings.endGroup();\r
1022                         return value;\r
1023                 }\r
1024     }\r
1025     public static void saveEditorButtonsVisible(String column, boolean val) {\r
1026                 settings.beginGroup("EditorButtonsVisible");\r
1027                 if (val)\r
1028                         settings.setValue(column, "true");\r
1029                 else\r
1030                         settings.setValue(column, "false");\r
1031                 settings.endGroup();\r
1032     }\r
1033     \r
1034     // Should the test fixes be enabled\r
1035     public static boolean enableCarriageReturnFix() {\r
1036         try {\r
1037                 settings.beginGroup("Debug");\r
1038                 String text = (String)settings.value("enableCarriageReturnFix", "false");\r
1039                 settings.endGroup();\r
1040                 if (text.equalsIgnoreCase("true"))\r
1041                         return true;\r
1042                 else\r
1043                         return false;\r
1044                 } catch (java.lang.ClassCastException e) {\r
1045                         Boolean value = (Boolean) settings.value("enableCarriageReturnFix", false);\r
1046                         settings.endGroup();\r
1047                         return value;\r
1048                 }\r
1049     }\r
1050     public static void saveCarriageReturnFix(boolean val) {\r
1051                 settings.beginGroup("Debug");\r
1052                 if (val)\r
1053                         settings.setValue("enableCarriageReturnFix", "true");\r
1054                 else\r
1055                         settings.setValue("enableCarriageReturnFix", "false");\r
1056                 settings.endGroup();\r
1057     }\r
1058     public static boolean enableHtmlEntitiesFix() {\r
1059         try {\r
1060                 settings.beginGroup("Debug");\r
1061                 String text = (String)settings.value("enableHtmlEntitiesFix", "false");\r
1062                 settings.endGroup();\r
1063                 if (text.equalsIgnoreCase("true"))\r
1064                         return true;\r
1065                 else\r
1066                         return false;\r
1067                 } catch (java.lang.ClassCastException e) {\r
1068                         Boolean value = (Boolean) settings.value("enableHtmlEntitiesFix", false);\r
1069                         settings.endGroup();\r
1070                         return value;\r
1071                 }\r
1072     }\r
1073     public static void saveHtmlEntitiesFix(boolean val) {\r
1074                 settings.beginGroup("Debug");\r
1075                 if (val)\r
1076                         settings.setValue("enableHtmlEntitiesFix", "true");\r
1077                 else\r
1078                         settings.setValue("enableHtmlEntitiesFix", "false");\r
1079                 settings.endGroup();\r
1080     }\r
1081 \r
1082 //    public static void setIndexThreads(int val) {\r
1083 //              settings.beginGroup("General");\r
1084 //              settings.setValue("indexThreads", val);\r
1085 //              settings.endGroup();\r
1086 //   }\r
1087 //    public static int getIndexThreads() {\r
1088 //              settings.beginGroup("General");\r
1089 //              Integer threads;\r
1090 //              try {\r
1091 //                      String val  = (String)settings.value("indexThreads", "1");\r
1092 //                      threads = new Integer(val.trim());\r
1093 //              } catch (Exception e) {\r
1094 //                      try {\r
1095 //                              threads = (Integer)settings.value("indexThreads", 1);\r
1096 //                      } catch (Exception e1) {\r
1097 //                              threads = 1;\r
1098 //                      }\r
1099 //              }\r
1100 //              settings.endGroup();\r
1101 //              threads = 1;\r
1102 //              return threads;\r
1103     \r
1104     // Get/Set text zoom factor\r
1105 //   }\r
1106     public static void setZoomFactor(double val) {\r
1107                 settings.beginGroup("General");\r
1108                 settings.setValue("zoomFactor", val);\r
1109                 settings.endGroup();\r
1110     }\r
1111     public static double getZoomFactor() {\r
1112                 settings.beginGroup("General");\r
1113                 Double threads;\r
1114                 try {\r
1115                         String val  = (String)settings.value("zoomFactor", "1.0");\r
1116                         threads = new Double(val.trim());\r
1117                 } catch (Exception e) {\r
1118                         try {\r
1119                                 threads = (Double)settings.value("zoomFactor", 1.0);\r
1120                         } catch (Exception e1) {\r
1121                                 threads = new Double(1);\r
1122                         }\r
1123                 }\r
1124                 settings.endGroup();\r
1125                 return threads;\r
1126     }\r
1127     public static void setTextSizeMultiplier(double val) {\r
1128                 settings.beginGroup("General");\r
1129                 settings.setValue("textMultiplier", val);\r
1130                 settings.endGroup();\r
1131     }\r
1132     public static double getTextSizeMultiplier() {\r
1133                 settings.beginGroup("General");\r
1134                 Double threads;\r
1135                 try {\r
1136                         String val  = (String)settings.value("textMultiplier", "1");\r
1137                         threads = new Double(val.trim());\r
1138                 } catch (Exception e) {\r
1139                         try {\r
1140                                 threads = (Double)settings.value("textMultiplier", 1);\r
1141                         } catch (Exception e1) {\r
1142                                 threads = new Double(1);\r
1143                         }\r
1144                 }\r
1145                 settings.endGroup();\r
1146                 return threads;\r
1147     }\r
1148     \r
1149     \r
1150     // Should we mimic Evernote and restrict the notebooks selected?\r
1151     public static boolean getMimicEvernoteInterface() {\r
1152                 settings.beginGroup("General");\r
1153                 try {\r
1154                         String text = (String)settings.value("mimicEvernoteInterface", "true");\r
1155                         settings.endGroup();\r
1156                         if (text.equalsIgnoreCase("true"))\r
1157                                 return true;\r
1158                         else\r
1159                                 return false;\r
1160                 } catch (java.lang.ClassCastException e) {\r
1161                         Boolean value = (Boolean) settings.value("mimicEvernoteInterface", true);\r
1162                         settings.endGroup();\r
1163                         return value;\r
1164                 }\r
1165     }\r
1166     public static void setMimicEvernoteInterface(boolean value) {\r
1167         settings.beginGroup("General");\r
1168         if (value)\r
1169                 settings.setValue("mimicEvernoteInterface", "true");\r
1170         else\r
1171                 settings.setValue("mimicEvernoteInterface", "false"); \r
1172         settings.endGroup();\r
1173     }\r
1174     \r
1175     \r
1176     // Synchronize with Evernote when closing?\r
1177     public static boolean synchronizeOnClose() {\r
1178                 settings.beginGroup("General");\r
1179                 try {\r
1180                         String text = (String)settings.value("synchronizeOnClose", "false");\r
1181                         settings.endGroup();\r
1182                         if (text.equalsIgnoreCase("true"))\r
1183                                 return true;\r
1184                         else\r
1185                                 return false;\r
1186                 } catch (java.lang.ClassCastException e) {\r
1187                         Boolean value = (Boolean) settings.value("synchronizeOnClose", false);\r
1188                         settings.endGroup();\r
1189                         return value;\r
1190                 }\r
1191     }\r
1192     public static void setSynchronizeOnClose(boolean val) {\r
1193                 settings.beginGroup("General");\r
1194                 if (val)\r
1195                         settings.setValue("synchronizeOnClose", "true");\r
1196                 else\r
1197                         settings.setValue("synchronizeOnClose", "false");\r
1198                 settings.endGroup();\r
1199     }\r
1200 \r
1201     // Get/set the database version.  Not really used any more, but kept\r
1202     // for compatibility.\r
1203     public static void setDatabaseVersion(String version) {\r
1204                 settings.beginGroup("General");\r
1205                 settings.setValue("databaseVersion", version);\r
1206                 settings.endGroup();\r
1207     }\r
1208     public static String getDatabaseVersion() {\r
1209                 settings.beginGroup("General");\r
1210                 String val  = (String)settings.value("databaseVersion", "0.70");\r
1211                 settings.endGroup();\r
1212                 return val;\r
1213     }\r
1214 \r
1215     // Get the URL (full path) of the main database\r
1216     public static String getDatabaseUrl() {\r
1217                 settings.beginGroup("General");\r
1218                 String val  = (String)settings.value("DatabaseURL", "");\r
1219                 settings.endGroup();\r
1220                 if (val.equals(""))\r
1221                         val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.databaseName);\r
1222                 return val;\r
1223     }\r
1224     \r
1225     // get the url (full path) of the searchable word database\r
1226     public static String getIndexDatabaseUrl() {\r
1227                 settings.beginGroup("General");\r
1228                 String val  = (String)settings.value("IndexDatabaseURL", "");\r
1229                 settings.endGroup();\r
1230                 if (val.equals(""))\r
1231                         val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.indexDatabaseName);\r
1232                 return val;\r
1233     }\r
1234     \r
1235     // Get the url (full path) of the attachment database\r
1236     public static String getResourceDatabaseUrl() {\r
1237                 settings.beginGroup("General");\r
1238                 String val  = (String)settings.value("ResourceDatabaseURL", "");\r
1239                 settings.endGroup();\r
1240                 if (val.equals(""))\r
1241                         val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.resourceDatabaseName);\r
1242                 return val;\r
1243     }\r
1244     public static void setDatabaseUrl(String value) {\r
1245                 settings.beginGroup("General");\r
1246                 settings.setValue("DatabaseURL", value);\r
1247                 settings.endGroup();\r
1248     }\r
1249     public static void setIndexDatabaseUrl(String value) {\r
1250                 settings.beginGroup("General");\r
1251                 settings.setValue("IndexDatabaseURL", value);\r
1252                 settings.endGroup();\r
1253     }\r
1254     public static void setResourceDatabaseUrl(String value) {\r
1255                 settings.beginGroup("General");\r
1256                 settings.setValue("ResourceDatabaseURL", value);\r
1257                 settings.endGroup();\r
1258     }\r
1259     public static String getDatabaseUserid() {\r
1260                 settings.beginGroup("General");\r
1261                 String val  = (String)settings.value("databaseUserid", "");\r
1262                 settings.endGroup();\r
1263                 return val;\r
1264     }\r
1265     public static String getDatabaseUserPassword() {\r
1266                 settings.beginGroup("General");\r
1267                 String val  = (String)settings.value("databaseUserPassword", "");\r
1268                 settings.endGroup();\r
1269                 return val;\r
1270     }\r
1271     \r
1272     // get/Set the style sheet and the palette to control the look & feel\r
1273     public static void setStyle(String style) {\r
1274                 settings.beginGroup("General");\r
1275                 settings.setValue("style", style);\r
1276                 settings.endGroup();\r
1277     }\r
1278     public static String getStyle() {\r
1279                 settings.beginGroup("General");\r
1280                 String val  = (String)settings.value("style", "Cleanlooks");\r
1281                 settings.endGroup();\r
1282                 return val;\r
1283     }\r
1284     public static boolean useStandardPalette() {\r
1285                 settings.beginGroup("General");\r
1286                 try {\r
1287                         String text = (String)settings.value("standardPalette", "true");\r
1288                         settings.endGroup();\r
1289                         if (text.equalsIgnoreCase("true"))\r
1290                                 return true;\r
1291                         else\r
1292                                 return false;\r
1293                 } catch (java.lang.ClassCastException e) {\r
1294                         Boolean value = (Boolean) settings.value("standardPalette", true);\r
1295                         settings.endGroup();\r
1296                         return value;\r
1297                 }\r
1298     }\r
1299     public static void setStandardPalette(boolean val) {\r
1300                 settings.beginGroup("General");\r
1301                 if (val)\r
1302                         settings.setValue("standardPalette", "true");\r
1303                 else\r
1304                         settings.setValue("standardPalette", "false");\r
1305                 settings.endGroup();\r
1306     }\r
1307     \r
1308     // Set the amount of time to wait between indexing\r
1309     // Get/Set interval when the index thread wakes up.\r
1310     public static void setIndexThreadSleepInterval(int sleep) {\r
1311                 settings.beginGroup("General");\r
1312                 settings.setValue("IndexThreadSleepInterval", sleep);\r
1313                 settings.endGroup();\r
1314     }\r
1315     public static int getIndexThreadSleepInterval() {\r
1316                 settings.beginGroup("General");\r
1317                 Integer sleep;\r
1318                 try {\r
1319                         String val  = (String)settings.value("IndexThreadSleepInterval", "300");\r
1320                         sleep = new Integer(val.trim());\r
1321                 } catch (Exception e) {\r
1322                         try {\r
1323                                 sleep = (Integer)settings.value("IndexThreadSleepInterval", 0);\r
1324                         } catch (Exception e1) {\r
1325                                 sleep = 300;\r
1326                         }\r
1327                 }\r
1328                 settings.endGroup();\r
1329                 return sleep;\r
1330     }\r
1331     \r
1332     \r
1333     // Get/Set a window state for later restoring\r
1334     public static void saveState(String name, QByteArray state) {\r
1335         int view = Global.getListView();\r
1336         if (view == Global.View_List_Narrow)\r
1337                 name = name +"Narrow";\r
1338                 settings.beginGroup("SaveState");\r
1339                 settings.setValue(name, state);\r
1340                 settings.endGroup();\r
1341     }\r
1342     \r
1343     public static QByteArray restoreState(String name) {\r
1344         int view = Global.getListView();\r
1345         if (view == Global.View_List_Narrow)\r
1346                 name = name +"Narrow";\r
1347                 settings.beginGroup("SaveState");\r
1348                 QByteArray state = (QByteArray)settings.value(name);\r
1349                 settings.endGroup();\r
1350                 return state;\r
1351     }\r
1352     public static void saveGeometry(String name, QByteArray state) {\r
1353         int view = Global.getListView();\r
1354         if (view == Global.View_List_Narrow)\r
1355                 settings.beginGroup("SaveGeometryNarrow");\r
1356         else\r
1357                 settings.beginGroup("SaveGeometry");\r
1358                 settings.setValue(name, state);\r
1359                 settings.endGroup();\r
1360     }\r
1361     \r
1362     public static QByteArray restoreGeometry(String name) {\r
1363         int view = Global.getListView();\r
1364         if (view == Global.View_List_Narrow)\r
1365                 settings.beginGroup("SaveGeometryNarrow");\r
1366         else\r
1367                 settings.beginGroup("SaveGeometry");\r
1368                 QByteArray state = (QByteArray)settings.value(name);\r
1369                 settings.endGroup();\r
1370                 return state;\r
1371     }\r
1372     \r
1373     \r
1374     // Set how often to do an automatic save\r
1375     public static void setAutoSaveInterval(int interval) {\r
1376                 settings.beginGroup("General");\r
1377                 settings.setValue("autoSaveInterval", interval);\r
1378                 settings.endGroup();\r
1379     }\r
1380     public static int getAutoSaveInterval() {\r
1381                 settings.beginGroup("General");\r
1382                 Integer value;\r
1383                 try {\r
1384                         String val  = (String)settings.value("autoSaveInterval", "5");\r
1385                         value = new Integer(val.trim());\r
1386                 } catch (Exception e) {\r
1387                         try {\r
1388                                 value = (Integer)settings.value("autoSaveInterval", 5);\r
1389                         } catch (Exception e1) {\r
1390                                 value = 5;\r
1391                         }\r
1392                 }\r
1393                 settings.endGroup();\r
1394                 return value;\r
1395     }\r
1396      \r
1397     // Add an invalid attribute & element to the database so we don't bother parsing it in the future\r
1398     // These values we automatically remove from any note.\r
1399     // Add invalid attributes\r
1400     public static void addInvalidAttribute(String element, String attribute) {\r
1401         \r
1402                 List<String> attributes = invalidAttributes.get(element);\r
1403                 if (attributes != null) {\r
1404                         for (int i=0; i<attributes.size(); i++)\r
1405                                 if (attribute.equalsIgnoreCase(attributes.get(i))) {\r
1406                                         return;\r
1407                         }\r
1408         }\r
1409         \r
1410         ArrayList<String> attributeList;\r
1411         if (!invalidAttributes.containsKey(element)) {\r
1412                 attributeList = new ArrayList<String>();\r
1413                 attributeList.add(attribute);\r
1414                 invalidAttributes.put(element, attributeList);\r
1415         }\r
1416         else {\r
1417                 attributeList = invalidAttributes.get(element);\r
1418                 attributeList.add(attribute);\r
1419                 invalidAttributes.put(element,attributeList);\r
1420         }\r
1421     }\r
1422    \r
1423     // Add invalid attributes\r
1424     public static void addInvalidElement(String element) {\r
1425                 for (int i=0; i<invalidElements.size(); i++) {\r
1426                         if (element.equalsIgnoreCase(invalidElements.get(i)))\r
1427                                 return;\r
1428                 }\r
1429         invalidElements.add(element);\r
1430     }\r
1431     \r
1432     // Get/Set proxy information\r
1433     // Proxy settings\r
1434     public static String getProxyValue(String key) {\r
1435                 settings.beginGroup("Proxy");\r
1436                 String val  = (String)settings.value(key, "");\r
1437                 settings.endGroup();\r
1438                 return val;\r
1439     }\r
1440     public static void setProxyValue(String key, String value) {\r
1441                 settings.beginGroup("Proxy");\r
1442                 settings.setValue(key, value);\r
1443                 settings.endGroup();\r
1444     }\r
1445     \r
1446     // Change a byte array to a hex string\r
1447     // Convert a byte array to a hex string\r
1448         public static String byteArrayToHexString(byte data[]) {\r
1449                 StringBuffer buf = new StringBuffer();\r
1450             for (byte element : data) {\r
1451                 int halfbyte = (element >>> 4) & 0x0F;\r
1452                 int two_halfs = 0;\r
1453                 do {\r
1454                         if ((0 <= halfbyte) && (halfbyte <= 9))\r
1455                                buf.append((char) ('0' + halfbyte));\r
1456                            else\r
1457                                 buf.append((char) ('a' + (halfbyte - 10)));\r
1458                         halfbyte = element & 0x0F;\r
1459                 } while(two_halfs++ < 1);\r
1460             }\r
1461             return buf.toString();              \r
1462         }\r
1463 \r
1464     \r
1465         // Get/Set spelling settings\r
1466         public static boolean getSpellSetting(String value) {\r
1467                 settings.beginGroup("Spell");\r
1468                 String text = (String)settings.value(value, "");\r
1469                 settings.endGroup();\r
1470                 if (text.equalsIgnoreCase("true"))\r
1471                         return true;\r
1472                 if (text.equalsIgnoreCase("false"))\r
1473                         return false;\r
1474                 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREDIGITWORDS))\r
1475                         return true;\r
1476                 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREINTERNETADDRESSES))\r
1477                         return true;\r
1478                 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREUPPERCASE))\r
1479                         return true;\r
1480                 if (value.equalsIgnoreCase(Configuration.SPELL_IGNORESENTENCECAPITALIZATION))\r
1481                         return true;\r
1482                 return false;\r
1483     }\r
1484     public static void setSpellSetting(String setting, boolean val) {\r
1485                 settings.beginGroup("Spell");\r
1486                 if (val)\r
1487                         settings.setValue(setting, "true");\r
1488                 else\r
1489                         settings.setValue(setting, "false");\r
1490                 settings.endGroup();\r
1491     }\r
1492         \r
1493         // Get/Set how we should display tags (color them, hide unused, or do nothing)\r
1494         // What to do with inactive tags?\r
1495         public static String tagBehavior() {\r
1496                 settings.beginGroup("General");\r
1497                 String text = (String)settings.value("tagBehavior", "DoNothing");\r
1498                 settings.endGroup();\r
1499                 return text;\r
1500         }\r
1501         // What to do with inactive tags?\r
1502         public static void setTagBehavior(String value) {\r
1503                 settings.beginGroup("General");\r
1504                 settings.setValue("tagBehavior", value);\r
1505                 settings.endGroup();\r
1506         }\r
1507 \r
1508     \r
1509         // Should the toolbar be visible?\r
1510         public static boolean isToolbarButtonVisible(String window) {\r
1511                 settings.beginGroup("ToolbarButtonsVisible");\r
1512                 try {\r
1513                         String text = (String)settings.value(window, "true");\r
1514                         settings.endGroup();\r
1515                         if (text.equalsIgnoreCase("true"))\r
1516                                 return true;\r
1517                         else\r
1518                                 return false;   \r
1519                 } catch (java.lang.ClassCastException e) {\r
1520                         Boolean value = (Boolean) settings.value(window, true);\r
1521                         settings.endGroup();\r
1522                         return value;\r
1523                 }\r
1524     }\r
1525     public static void saveToolbarButtonsVisible(String column, boolean val) {\r
1526                 settings.beginGroup("ToolbarButtonsVisible");\r
1527                 if (val)\r
1528                         settings.setValue(column, "true");\r
1529                 else\r
1530                         settings.setValue(column, "false");\r
1531                 settings.endGroup();\r
1532     }\r
1533         \r
1534     // Are thumbnails enabled?\r
1535     \r
1536     public static boolean enableThumbnails() {\r
1537                 settings.beginGroup("Debug");\r
1538                 try {\r
1539                         String text = (String)settings.value("thumbnails", "true");\r
1540                         settings.endGroup();\r
1541                         if (text.equalsIgnoreCase("true"))\r
1542                                 return true;\r
1543                         else\r
1544                                 return false;\r
1545                 } catch (java.lang.ClassCastException e) {\r
1546                         Boolean value = (Boolean) settings.value("thumbnails", true);\r
1547                         settings.endGroup();\r
1548                         return value;\r
1549                 }\r
1550     }\r
1551     public static void setEnableThumbnails(boolean val) {\r
1552                 settings.beginGroup("Debug");\r
1553                 if (val)\r
1554                         settings.setValue("thumbnails", "true");\r
1555                 else\r
1556                         settings.setValue("thumbnails", "false");\r
1557                 settings.endGroup();\r
1558     }\r
1559         \r
1560     // Trace used for performance tuning.  Not normally used in production.\r
1561         // Print date/time.  Used mainly for performance tracing\r
1562         public static void trace(boolean resetInterval) {\r
1563                 String fmt = "MM/dd/yy HH:mm:ss.SSSSSS";\r
1564                 String dateTimeFormat = new String(fmt);\r
1565                 SimpleDateFormat simple = new SimpleDateFormat(dateTimeFormat);\r
1566                 Calendar cal = Calendar.getInstance();\r
1567                 if (intervalTraceTime == null) \r
1568                         intervalTraceTime = Calendar.getInstance();\r
1569                 if (startTraceTime == null)\r
1570                         startTraceTime = Calendar.getInstance();\r
1571                 \r
1572                 float interval = (cal.getTimeInMillis() - intervalTraceTime.getTimeInMillis());\r
1573                 float total = (cal.getTimeInMillis() - startTraceTime.getTimeInMillis());\r
1574                 \r
1575 //              if (interval > 00.0) {\r
1576                         StackTraceElement[] exceptions = Thread.currentThread().getStackTrace();\r
1577                         System.out.println("------------------------------------------");\r
1578 \r
1579                         System.out.println("Date/Time " +simple.format(cal.getTime()));\r
1580                         System.out.format("Interval Time: %-10.6f%n", interval);\r
1581                         System.out.format("Total Time: %-10.6f%n", total);\r
1582                         for (int i=2; i<5 && i<exceptions.length; i++) {\r
1583                                 System.out.println(exceptions[i]);\r
1584                         }\r
1585 //              }\r
1586                 if (resetInterval)\r
1587                         intervalTraceTime = cal;\r
1588         }\r
1589         public static void traceReset() {\r
1590                 intervalTraceTime = null;\r
1591                 startTraceTime = null;\r
1592         }\r
1593 \r
1594     \r
1595         // Get the FileManager class to manage local files & directories\r
1596         public static FileManager getFileManager() {\r
1597         return fileManager;\r
1598     }\r
1599         \r
1600         // Should the note editor be disabled?\r
1601     public static boolean getDisableViewing() {\r
1602         return disableViewing;\r
1603     }\r
1604 \r
1605     //**********************\r
1606     //* Thumbnail zoom level\r
1607     //**********************\r
1608     public static int calculateThumbnailZoom(String content) {\r
1609         int zoom = 1;\r
1610                 if (content.indexOf("application/pdf") == -1) {\r
1611                         if (content.indexOf("image/") == -1) {\r
1612                                 String text =  StringEscapeUtils.unescapeHtml4(content.replaceAll("\\<.*?\\>", ""));\r
1613                                 zoom = 2;\r
1614                                 if (text.length() < 500) \r
1615                                         zoom = 2;\r
1616                                 if (text.length() < 250)\r
1617                                         zoom = 3;\r
1618                                 if (text.length() < 100)\r
1619                                         zoom = 4;\r
1620                                 if (text.length() < 50)\r
1621                                         zoom = 5;\r
1622                                 if (text.length() < 10)\r
1623                                         zoom = 6;\r
1624                         }\r
1625                 }\r
1626                 return zoom;\r
1627     }\r
1628     \r
1629     //**********************\r
1630     //* List View settings \r
1631     //**********************\r
1632     public static void setListView(int view) {\r
1633                 settings.beginGroup("General");\r
1634                 settings.setValue("listView", view);\r
1635                 settings.endGroup();\r
1636     }\r
1637     public static int getListView() {\r
1638                 settings.beginGroup("General");\r
1639                 Integer value;\r
1640                 try {\r
1641                         String val  = (String)settings.value("listView", View_List_Wide);\r
1642                         value = new Integer(val.trim());\r
1643                 } catch (Exception e) {\r
1644                         try {\r
1645                                 value = (Integer)settings.value("listView", View_List_Wide);\r
1646                         } catch (Exception e1) {\r
1647                                 value = View_List_Wide;\r
1648                         }\r
1649                 }\r
1650                 settings.endGroup();\r
1651                 return value;\r
1652     }\r
1653 \r
1654     \r
1655     \r
1656     //*******************\r
1657     // Font Settings\r
1658     //*******************\r
1659     public static boolean overrideDefaultFont() {\r
1660                 settings.beginGroup("Font");\r
1661                 try {\r
1662                         String text = (String)settings.value("overrideFont", "false");\r
1663                         settings.endGroup();\r
1664                         if (text.equalsIgnoreCase("true"))\r
1665                                 return true;\r
1666                         else\r
1667                                 return false;   \r
1668                 } catch (java.lang.ClassCastException e) {\r
1669                         Boolean value = (Boolean) settings.value("overrideFont", false);\r
1670                         settings.endGroup();\r
1671                         return value;\r
1672                 }\r
1673 \r
1674     }\r
1675     \r
1676     //****************************************************\r
1677     // Get/Set the default font settings for a new note\r
1678     //****************************************************\r
1679     public static void setOverrideDefaultFont(boolean value) {\r
1680                 settings.beginGroup("Font");\r
1681                 settings.setValue("overrideFont", value);\r
1682                 settings.endGroup();    \r
1683     }\r
1684     public static String getDefaultFont() {\r
1685                 settings.beginGroup("Font");\r
1686                 String val  = (String)settings.value("font", "");\r
1687                 settings.endGroup();\r
1688                 return val;\r
1689     }\r
1690     public static void setDefaultFont(String value) {\r
1691                 settings.beginGroup("Font");\r
1692                 settings.setValue("font", value);\r
1693                 settings.endGroup();\r
1694     }\r
1695     public static String getDefaultFontSize() {\r
1696                 settings.beginGroup("Font");\r
1697                 String val  = (String)settings.value("fontSize", "");\r
1698                 settings.endGroup();\r
1699                 return val;\r
1700     }\r
1701     public static void setDefaultFontSize(String value) {\r
1702                 settings.beginGroup("Font");\r
1703                 settings.setValue("fontSize", value);\r
1704                 settings.endGroup();\r
1705     }\r
1706     \r
1707     \r
1708     //*******************************************\r
1709     // Override the close & minimize instead.\r
1710     //*******************************************\r
1711     public static boolean minimizeOnClose() {\r
1712                 settings.beginGroup("General");\r
1713                 try {\r
1714                         String text = (String)settings.value("minimizeOnClose", "false");\r
1715                         settings.endGroup();\r
1716                         if (text.equalsIgnoreCase("true") && QSystemTrayIcon.isSystemTrayAvailable())\r
1717                                 return true;\r
1718                         else\r
1719                                 return false;\r
1720                 } catch (java.lang.ClassCastException e) {\r
1721                         Boolean value = (Boolean) settings.value("minimizeOnClose", false);\r
1722                         settings.endGroup();\r
1723                         return value;\r
1724                 }\r
1725     }\r
1726     public static void setMinimizeOnClose(boolean value) {\r
1727                 settings.beginGroup("General");\r
1728                 settings.setValue("minimizeOnClose", value);\r
1729                 settings.endGroup();    \r
1730     }\r
1731 \r
1732     //*********************************\r
1733     // Check version information\r
1734     //*********************************\r
1735     public static boolean checkVersionUpgrade() {\r
1736                 settings.beginGroup("Upgrade");\r
1737                 try {\r
1738                         String text = (String)settings.value("checkForUpdates", "true");\r
1739                         settings.endGroup();\r
1740                         if (text.equalsIgnoreCase("true"))\r
1741                                 return true;\r
1742                         else\r
1743                                 return false;\r
1744                 } catch (java.lang.ClassCastException e) {\r
1745                         Boolean value = (Boolean) settings.value("checkForUpdates", true);\r
1746                         settings.endGroup();\r
1747                         return value;\r
1748                 }\r
1749     }\r
1750     public static void setCheckVersionUpgrade(boolean value) {\r
1751                 settings.beginGroup("Upgrade");\r
1752                 settings.setValue("checkForUpdates", value);\r
1753                 settings.endGroup();    \r
1754     }\r
1755     public static String getUpdatesAvailableUrl() {\r
1756                 settings.beginGroup("Upgrade");\r
1757                 String text = (String)settings.value("avialableUrl", "http://nevernote.sourceforge.net/versions.txt");\r
1758                 settings.endGroup();    \r
1759                 return text;\r
1760     }\r
1761     public static String getUpdateAnnounceUrl() {\r
1762                 settings.beginGroup("Upgrade");\r
1763                 String text = (String)settings.value("announceUrl", "http://nevernote.sourceforge.net/upgrade.html");\r
1764                 settings.endGroup();    \r
1765                 return text;\r
1766     }\r
1767     \r
1768     //*******************\r
1769     // Index settings\r
1770     //*******************\r
1771     // Set/Get if we should index the text of a note\r
1772     public static boolean indexNoteBody() {\r
1773                 settings.beginGroup("Index");\r
1774                 try {\r
1775                         String value = (String)settings.value("indexNoteBody", "true");\r
1776                         settings.endGroup();\r
1777                         if (value.equals("true"))\r
1778                                 return true;\r
1779                         else\r
1780                                 return false;\r
1781                 } catch (java.lang.ClassCastException e) {\r
1782                         Boolean value = (Boolean) settings.value("indexNoteBody", true);\r
1783                         settings.endGroup();\r
1784                         return value;\r
1785                 }\r
1786     }\r
1787     public static void setIndexNoteTitle(boolean value) {\r
1788                 settings.beginGroup("Index");\r
1789                 settings.setValue("indexNoteTitle", value);\r
1790                 settings.endGroup();    \r
1791     }\r
1792     // Set/Get if we should index the title of a note\r
1793     public static boolean indexNoteTitle() {\r
1794                 settings.beginGroup("Index");\r
1795                 try {\r
1796                         String value = (String)settings.value("indexNoteTitle", "true");\r
1797                         settings.endGroup();\r
1798                         if (value.equals("true"))\r
1799                                 return true;\r
1800                         else\r
1801                                 return false;\r
1802                 } catch (java.lang.ClassCastException e) {\r
1803                         Boolean value = (Boolean) settings.value("indexNoteTitle", true);\r
1804                         settings.endGroup();\r
1805                         return value;\r
1806                 }\r
1807     }\r
1808     public static void setIndexNoteBody(boolean value) {\r
1809                 settings.beginGroup("Index");\r
1810                 settings.setValue("indexNoteBody", value);\r
1811                 settings.endGroup();    \r
1812     }\r
1813     // Set/Get if we should index any attachments\r
1814     public static boolean indexAttachmentsLocally() {\r
1815                 settings.beginGroup("Index");\r
1816                 try {\r
1817                         String value = (String)settings.value("indexAttachmentsLocally", "true");\r
1818                         settings.endGroup();\r
1819                         if (value.equals("true"))\r
1820                                 return true;\r
1821                         else\r
1822                                 return false;\r
1823                 } catch (java.lang.ClassCastException e) {\r
1824                         Boolean value = (Boolean) settings.value("indexAttachmentsLocally", true);\r
1825                         settings.endGroup();\r
1826                         return value;\r
1827                 }\r
1828     }\r
1829     public static void setIndexImageRecognition(boolean value) {\r
1830                 settings.beginGroup("Index");\r
1831                 settings.setValue("indexImageRecognition", value);\r
1832                 settings.endGroup();    \r
1833     }\r
1834     public static boolean indexImageRecognition() {\r
1835                 settings.beginGroup("Index");\r
1836                 try {\r
1837                         String value = (String)settings.value("indexImageRecognition", "true");\r
1838                         settings.endGroup();\r
1839                         if (value.equals("true"))\r
1840                                 return true;\r
1841                         else\r
1842                                 return false;\r
1843                 } catch (java.lang.ClassCastException e) {\r
1844                         Boolean value = (Boolean) settings.value("indexImageRecognition", true);\r
1845                         settings.endGroup();\r
1846                         return value;\r
1847                 }\r
1848     }\r
1849     public static void setIndexAttachmentsLocally(boolean value) {\r
1850                 settings.beginGroup("Index");\r
1851                 settings.setValue("indexAttachmentsLocally", value);\r
1852                 settings.endGroup();    \r
1853     }\r
1854     // Get/Set characters that shouldn't be removed from a word\r
1855     public static String getSpecialIndexCharacters() {\r
1856                 settings.beginGroup("Index");\r
1857                 String text = (String)settings.value("specialCharacters", "");\r
1858                 settings.endGroup();    \r
1859                 return text;\r
1860     }\r
1861     public static void setSpecialIndexCharacters(String value) {\r
1862                 settings.beginGroup("Index");\r
1863                 settings.setValue("specialCharacters", value);\r
1864                 settings.endGroup();    \r
1865                 databaseCache = value;\r
1866     }\r
1867     \r
1868     //*****************************************************************************\r
1869     // Control how tag selection behaves (should they be "and" or "or" selections\r
1870     //*****************************************************************************\r
1871     public static boolean anyTagSelectionMatch() {\r
1872                 settings.beginGroup("General");\r
1873                 try {\r
1874                         String value = (String)settings.value("anyTagSelectionMatch", "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("anyTagSelectionMatch", false);\r
1882                         settings.endGroup();\r
1883                         return value;\r
1884                 }\r
1885     }\r
1886     public static void setAnyTagSelectionMatch(boolean value) {\r
1887                 settings.beginGroup("General");\r
1888                 settings.setValue("anyTagSelectionMatch", value);\r
1889                 settings.endGroup();    \r
1890     }\r
1891 \r
1892     //*****************************************************************************\r
1893     // Control if a user receives a warning when trying to create a note-to-note link\r
1894     // when the DB is not synchronized.\r
1895     //*****************************************************************************\r
1896     public static boolean bypassSynchronizationWarning() {\r
1897                 settings.beginGroup("User");\r
1898                 try {\r
1899                         String value = (String)settings.value("bypassSynchronizationWarning", "false");\r
1900                         settings.endGroup();\r
1901                         if (value.equals("true"))\r
1902                                 return true;\r
1903                         else\r
1904                                 return false;\r
1905                 } catch (java.lang.ClassCastException e) {\r
1906                         Boolean value = (Boolean) settings.value("bypassSynchronizationWarning", false);\r
1907                         settings.endGroup();\r
1908                         return value;\r
1909                 }\r
1910     }\r
1911     public static void setBypassSynchronizationWarning(boolean value) {\r
1912                 settings.beginGroup("User");\r
1913                 settings.setValue("bypassSynchronizationWarning", value);\r
1914                 settings.endGroup();    \r
1915     }\r
1916 \r
1917     \r
1918     //***********************\r
1919     //* Database cache size\r
1920     //***********************\r
1921     public static String getDatabaseCacheSize() {\r
1922                 settings.beginGroup("Debug");\r
1923                 String text = (String)settings.value("databaseCache", "16384");\r
1924                 settings.endGroup();    \r
1925                 return text;\r
1926     }\r
1927     public static void setDatabaseCache(String value) {\r
1928                 settings.beginGroup("Debug");\r
1929                 settings.setValue("databaseCache", value);\r
1930                 settings.endGroup();    \r
1931                 databaseCache = value;\r
1932     }\r
1933 \r
1934     \r
1935     // This is used to copy a class since Java's normal deep copy is wacked\r
1936     public static Object deepCopy(Object oldObj) \r
1937     {\r
1938        ObjectOutputStream oos = null;\r
1939        ObjectInputStream ois = null;\r
1940        try\r
1941        {\r
1942           ByteArrayOutputStream bos = \r
1943                 new ByteArrayOutputStream(); // A\r
1944           oos = new ObjectOutputStream(bos); // B\r
1945           // serialize and pass the object\r
1946           oos.writeObject(oldObj);   // C\r
1947           oos.flush();               // D\r
1948           ByteArrayInputStream bin = \r
1949                 new ByteArrayInputStream(bos.toByteArray()); // E\r
1950           ois = new ObjectInputStream(bin);                  // F\r
1951           // return the new object\r
1952           return ois.readObject(); // G\r
1953        }\r
1954        catch(Exception e)\r
1955        {\r
1956           Global.logger.log(logger.LOW, "Exception in ObjectCloner = " + e);\r
1957        }\r
1958           try {\r
1959                         oos.close();\r
1960                 ois.close();\r
1961                 } catch (IOException e) {\r
1962                         Global.logger.log(logger.LOW, "Exception in ObjectCloner = " + e);\r
1963                         e.printStackTrace();\r
1964                 }\r
1965 \r
1966                 return null;\r
1967     }\r
1968 \r
1969     // If we should automatically select the children of any tag\r
1970     public static boolean includeTagChildren() {\r
1971                 settings.beginGroup("General");\r
1972                 try {\r
1973                         String value = (String)settings.value("includeTagChildren", "false");\r
1974                         settings.endGroup();\r
1975                         if (value.equals("true"))\r
1976                                 return true;\r
1977                         else\r
1978                                 return false;\r
1979                 } catch (java.lang.ClassCastException e) {\r
1980                         Boolean value = (Boolean) settings.value("includeTagChildren", false);\r
1981                         settings.endGroup();\r
1982                         return value;\r
1983                 }\r
1984 \r
1985     }\r
1986     public static void setIncludeTagChildren(boolean value) {\r
1987                 settings.beginGroup("General");\r
1988                 settings.setValue("includeTagChildren", value);\r
1989                 settings.endGroup();    \r
1990     }\r
1991     \r
1992     // If we should automatically wildcard searches\r
1993     public static boolean automaticWildcardSearches() {\r
1994                 settings.beginGroup("General");\r
1995                 try {\r
1996                         String value = (String)settings.value("automaticWildcard", "false");\r
1997                         settings.endGroup();\r
1998                         if (value.equals("true"))\r
1999                                 return true;\r
2000                         else\r
2001                                 return false;\r
2002                 } catch (java.lang.ClassCastException e) {\r
2003                         Boolean value = (Boolean) settings.value("automaticWildcard", false);\r
2004                         settings.endGroup();\r
2005                         return value;\r
2006                 }\r
2007 \r
2008     }\r
2009     public static void setAutomaticWildcardSearches(boolean value) {\r
2010                 settings.beginGroup("General");\r
2011                 settings.setValue("automaticWildcard", value);\r
2012                 settings.endGroup();    \r
2013     }\r
2014 \r
2015     // If we should automatically select the children of any tag\r
2016     public static boolean displayRightToLeft() {\r
2017                 settings.beginGroup("General");\r
2018                 try {\r
2019                         String value = (String)settings.value("displayRightToLeft", "false");\r
2020                         settings.endGroup();\r
2021                         if (value.equals("true"))\r
2022                                 return true;\r
2023                         else\r
2024                                 return false;\r
2025                 } catch (java.lang.ClassCastException e) {\r
2026                         Boolean value = (Boolean) settings.value("displayRightToLeft", false);\r
2027                         settings.endGroup();\r
2028                         return value;\r
2029                 }\r
2030 \r
2031     }\r
2032     public static void setDisplayRightToLeft(boolean value) {\r
2033                 settings.beginGroup("General");\r
2034                 settings.setValue("displayRightToLeft", value);\r
2035                 settings.endGroup();    \r
2036     }\r
2037 \r
2038 \r
2039     //***********************\r
2040     //* Startup Notebook\r
2041     //***********************\r
2042     public static String getStartupNotebook() {\r
2043                 settings.beginGroup("General");\r
2044                 String text = (String)settings.value("startupNotebook", "");\r
2045                 settings.endGroup();    \r
2046                 return text;\r
2047     }\r
2048     public static void setStartupNotebook(String value) {\r
2049                 settings.beginGroup("General");\r
2050                 settings.setValue("startupNotebook", value);\r
2051                 settings.endGroup();    \r
2052                 databaseCache = value;\r
2053     }\r
2054 }\r
2055 \r