OSDN Git Service

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