OSDN Git Service

NeverNote 0.88.
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / Global.java
1 /*\r
2  * This file is part of NeverNote \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.ByteArrayOutputStream;\r
24 import java.io.File;\r
25 import java.io.PrintStream;\r
26 import java.text.SimpleDateFormat;\r
27 import java.util.ArrayList;\r
28 import java.util.Calendar;\r
29 import java.util.HashMap;\r
30 import java.util.List;\r
31 import java.util.concurrent.ArrayBlockingQueue;\r
32 \r
33 import com.evernote.edam.type.Accounting;\r
34 import com.evernote.edam.type.PrivilegeLevel;\r
35 import com.evernote.edam.type.User;\r
36 import com.evernote.edam.type.UserAttributes;\r
37 import com.trolltech.qt.core.QByteArray;\r
38 import com.trolltech.qt.core.QMutex;\r
39 import com.trolltech.qt.core.QSettings;\r
40 import com.trolltech.qt.gui.QPalette;\r
41 \r
42 import cx.fbn.nevernote.gui.ContainsAttributeFilterTable;\r
43 import cx.fbn.nevernote.gui.DateAttributeFilterTable;\r
44 import cx.fbn.nevernote.gui.ShortcutKeys;\r
45 import cx.fbn.nevernote.signals.DBRunnerSignal;\r
46 import cx.fbn.nevernote.threads.DBRunner;\r
47 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
48 \r
49 public class Global {\r
50         public static String version = "0.88";\r
51     public static String username = ""; \r
52     public static String password = ""; \r
53 \r
54     public static DBRunner                              dbRunner;                       // Database thread\r
55     public static DBRunnerSignal                dbRunnerSignal;         // Signals to the database runner\r
56     public static QMutex                                dbrunnerWorkLock;       // mutex lock for work queue\r
57     \r
58 \r
59     public static int mainThreadId=0;\r
60     private static ArrayBlockingQueue<Boolean> mainThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
61     \r
62     public static int syncThreadId=1;\r
63     private static ArrayBlockingQueue<Boolean> syncThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
64     \r
65     public static int tagCounterThreadId=2;\r
66     private static ArrayBlockingQueue<Boolean> tagCounterThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
67     \r
68     public static int trashCounterThreadId=3;   // This should always be the highest thread ID\r
69     private static ArrayBlockingQueue<Boolean> trashCounterThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
70 \r
71     public static int indexThreadId=4;          // Thread for indexing words\r
72     private static ArrayBlockingQueue<Boolean> indexThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
73 \r
74     public static int saveThreadId=5;           // Thread used for processing data to saving content\r
75     private static ArrayBlockingQueue<Boolean> saveThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
76 \r
77     public static int notebookCounterThreadId=6;   // Notebook Thread\r
78     private static ArrayBlockingQueue<Boolean> notebookCounterThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
79 \r
80     public static int indexThread03Id=7;   // unused\r
81     private static ArrayBlockingQueue<Boolean> indexThread03ThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
82 \r
83     public static int indexThread04Id=8;   // unused\r
84     private static ArrayBlockingQueue<Boolean> indexThread04ThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
85     \r
86     public static int dbThreadId=9;   // This should always be the highest thread ID\r
87     \r
88     \r
89     public static HashMap<String,String> passwordSafe = new HashMap<String, String>();\r
90     public static List<String> passwordRemember = new ArrayList<String>();\r
91     public static String currentNotebookGuid;\r
92     public static User user; \r
93     public static long authTimeRemaining;\r
94     public static long authRefreshTime;\r
95     public static long failedRefreshes = 0;\r
96     public static String currentDir;\r
97     public static boolean keepRunning;\r
98     \r
99     public static String userStoreUrl;\r
100     public static String noteStoreUrl;\r
101     public static String noteStoreUrlBase;\r
102     \r
103     public static int noteTableCreationPosition = 0;\r
104     public static int noteTableTitlePosition = 1;\r
105     public static int noteTableTagPosition = 2;\r
106     public static int noteTableNotebookPosition = 3;\r
107     public static int noteTableChangedPosition = 4;\r
108     public static int noteTableGuidPosition = 5;\r
109     public static int noteTableAuthorPosition = 6;\r
110     public static int noteTableSourceUrlPosition = 7;\r
111     public static int noteTableSubjectDatePosition = 8;\r
112     public static int noteTableSynchronizedPosition = 9;\r
113     public static int noteTableColumnCount = 10;\r
114     public static Integer cryptCounter = 0;\r
115     \r
116     public static int minimumWordCount = 2;\r
117     private static String wordRegex;\r
118     public static boolean enableCarriageReturnFix = false;\r
119     \r
120     public static String name = null;\r
121     public static QSettings     settings;\r
122     public static boolean isConnected;\r
123     public static boolean showDeleted = false;\r
124     public static boolean disableUploads = false;\r
125         public static int messageLevel;\r
126         public static String tagDelimeter = ",";\r
127         public static String attachmentNameDelimeter = "------";\r
128         \r
129         public static String    databaseName = new String("NeverNote");\r
130         public static String    indexDatabaseName = new String("IndexDatabase.db");\r
131         public static DateAttributeFilterTable createdSinceFilter;\r
132         public static DateAttributeFilterTable createdBeforeFilter;\r
133         public static DateAttributeFilterTable changedSinceFilter;\r
134         public static DateAttributeFilterTable changedBeforeFilter;\r
135         public static ContainsAttributeFilterTable containsFilter;\r
136 //      public static DBLock                            dbLock;\r
137 //      public static DBLock                            indexLock;\r
138         public static ApplicationLogger    logger;\r
139         PrintStream stdoutStream;\r
140         public static QPalette                          originalPalette;\r
141         public static ShortcutKeys                      shortcutKeys;\r
142         public static boolean                           disableViewing = false;\r
143         \r
144         public static List<String>                              invalidElements = new ArrayList<String>();\r
145         public static HashMap<String, ArrayList<String>>        invalidAttributes = new HashMap<String, ArrayList<String>>();\r
146         public static boolean mimicEvernoteInterface;\r
147         public static HashMap<String,String> resourceMap;\r
148         public static String cipherPassword = "";\r
149         \r
150         static Calendar startTraceTime;\r
151         static Calendar intervalTraceTime;\r
152         \r
153     // Do initial setup \r
154     public static void setup()  {\r
155                 if (name == null)\r
156                         name = "NeverNote";\r
157                 settings = new QSettings("fbn.cx", name);\r
158                     currentDir = getDirectoryPath();\r
159                         getServer();\r
160                         settings.beginGroup("General");\r
161                         String regex = (String) settings.value("regex", "[,\\s]+");\r
162                         setWordRegex(regex);\r
163                         String wordString = settings.value("wordLength", "4").toString();\r
164                         Integer wordLen = new Integer(wordString);\r
165                         Global.minimumWordCount = wordLen;\r
166                         settings.endGroup();\r
167                         settings.beginGroup("Debug");\r
168                         String msglevel = (String) settings.value("messageLevel", "Low");\r
169                         settings.endGroup();\r
170                         messageLevel = 1;\r
171                         setMessageLevel(msglevel);\r
172                         keepRunning = true;\r
173                         disableUploads = disableUploads();\r
174                         enableCarriageReturnFix = enableCarriageReturnFix();\r
175 //                      dbLock = new DBLock();\r
176 //                      indexLock = new DBLock();\r
177                         logger = new ApplicationLogger("global.log");\r
178                         shortcutKeys = new ShortcutKeys();\r
179                         dbrunnerWorkLock = new QMutex();\r
180                         mimicEvernoteInterface = getMimicEvernoteInterface();\r
181                         resourceMap = new HashMap<String,String>();\r
182                                 \r
183     }\r
184     public static void setName(String n) {\r
185         if (!n.trim().equals("")) {\r
186                 name = "NeverNote-"+n;\r
187         }\r
188     }\r
189     public static String getDirectoryPath() {\r
190                 if (currentDir == null) {\r
191                         currentDir = System.getProperty("user.dir");\r
192                 }\r
193                 if (!currentDir.substring(currentDir.length()-1).equals(File.separator)) {\r
194                         currentDir = currentDir+File.separator;\r
195                 }\r
196                 return currentDir;\r
197     }\r
198     public static void setDirectoryPath(String path) {\r
199         if (path.trim().equals(""))\r
200                 path = System.getProperty("user.dir");\r
201         if (!path.substring(path.length()-1).equals(File.separator)) \r
202                         path = path+File.separator;\r
203         currentDir = path;\r
204     }\r
205     public static String getWordRegex() {\r
206         return wordRegex;\r
207     }\r
208     public static void setWordRegex(String r) {\r
209         wordRegex = r;\r
210     }\r
211     public static void setMessageLevel(String msglevel) {\r
212         if (msglevel.equalsIgnoreCase("low")) \r
213                         messageLevel = 1;\r
214                 if (msglevel.equalsIgnoreCase("medium")) \r
215                         messageLevel = 2;\r
216                 if (msglevel.equalsIgnoreCase("high")) \r
217                                 messageLevel = 3;\r
218                 if (msglevel.equalsIgnoreCase("extreme")) \r
219                                         messageLevel = 4;\r
220                 settings.beginGroup("Debug");\r
221                 settings.setValue("messageLevel", msglevel);\r
222                 settings.endGroup();            \r
223     }\r
224 \r
225     public static void saveUserInformation(User user) {\r
226         settings.beginGroup("User");\r
227                 settings.setValue("id", user.getId());\r
228                 settings.setValue("username", user.getUsername());\r
229                 settings.setValue("email", user.getEmail());\r
230                 settings.setValue("name", user.getName());\r
231                 settings.setValue("timezone", user.getTimezone());\r
232                 settings.setValue("privilege", user.getPrivilege().getValue());\r
233                 settings.setValue("created", user.getCreated());\r
234                 settings.setValue("updated", user.getUpdated());\r
235                 settings.setValue("deleted", user.getDeleted());\r
236                 settings.endGroup();\r
237                 isPremium();\r
238                 if (user.getAttributes()!=null)\r
239                         saveUserAttributes(user.getAttributes());\r
240                 if (user.getAccounting()!=null)\r
241                         saveUserAccounting(user.getAccounting());\r
242 \r
243     }\r
244     public static void saveUserAttributes(UserAttributes attrib) {\r
245         settings.beginGroup("UserAttributes");\r
246                 settings.setValue("defaultLocationName", attrib.getDefaultLocationName());\r
247                 settings.setValue("defaultLatitude", attrib.getDefaultLocationName());\r
248                 settings.setValue("defaultLongitude", attrib.getDefaultLocationName());\r
249                 settings.setValue("incomingEmailAddress", attrib.getIncomingEmailAddress());\r
250                 settings.endGroup();\r
251     }\r
252     public static UserAttributes getUserAttributes() {\r
253         settings.beginGroup("UserAttributes");\r
254         UserAttributes attrib = new UserAttributes();\r
255                 attrib.setDefaultLocationName((String)settings.value("defaultLocationName",""));\r
256                 attrib.setDefaultLatitudeIsSet(false);\r
257                 attrib.setDefaultLongitudeIsSet(false);\r
258                 attrib.setIncomingEmailAddress((String)settings.value("incomingEmailAddress", ""));\r
259                 settings.endGroup();\r
260                 return attrib;\r
261     }\r
262     public static void saveUserAccounting(Accounting acc) {\r
263         settings.beginGroup("UserAccounting");\r
264                 settings.setValue("uploadLimit", acc.getUploadLimit());\r
265                 settings.setValue("uploadLimitEnd", acc.getUploadLimitEnd());\r
266                 settings.setValue("uploadLimitNextMonth", acc.getUploadLimitNextMonth());\r
267                 settings.setValue("premiumServiceStart", acc.getPremiumServiceStart());\r
268                 settings.setValue("nextPaymentDue", acc.getNextPaymentDue());\r
269                 settings.setValue("uploadAmount", acc.getUpdated());\r
270                 settings.endGroup();\r
271     }\r
272     public static long getUploadLimitEnd() {\r
273         Long limit;\r
274         settings.beginGroup("UserAccounting");\r
275         \r
276         // Upload limit\r
277                 try {\r
278                         String val  = (String)settings.value("uploadLimitEnd", "0");\r
279                         limit = new Long(val.trim());\r
280                 } catch (Exception e) {\r
281                         try {\r
282                                 limit = (Long)settings.value("uploadLimitEnd", 0);\r
283                         } catch (Exception e1) {\r
284                                 limit = new Long(0);\r
285                         }\r
286                 }\r
287         \r
288                 // return value\r
289         settings.endGroup();\r
290         return limit;\r
291     }\r
292     public static void saveUploadAmount(long amount) {\r
293         settings.beginGroup("UserAccounting");\r
294                 settings.setValue("uploadAmount", amount);\r
295                 settings.endGroup();\r
296    }\r
297     public static long getUploadAmount() {\r
298                 long amt=0;\r
299                 settings.beginGroup("UserAccounting");\r
300                 try {\r
301                         String num = (String)settings.value("uploadAmount", "0");\r
302                         amt = new Long(num.trim());\r
303                 } catch (Exception e) {\r
304                         try {\r
305                                 amt = (Integer)settings.value("uploadAmount", 0);\r
306                         } catch (Exception e1) {\r
307                                 amt = 0;\r
308                         }\r
309                 }\r
310                 settings.endGroup();\r
311                 return amt;\r
312     }\r
313     public static void saveEvernoteUpdateCount(long amount) {\r
314         settings.beginGroup("UserAccounting");\r
315                 settings.setValue("updateCount", amount);\r
316                 settings.endGroup();\r
317     }\r
318     public static long getEvernoteUpdateCount() {\r
319                 long amt;\r
320                 settings.beginGroup("UserAccounting");\r
321                 try {\r
322                         String num = (String)settings.value("updateCount", new Long(0).toString());\r
323                         amt = new Long(num.trim());\r
324                 } catch (java.lang.ClassCastException e) {\r
325                         amt = 0;\r
326                 }\r
327                 settings.endGroup();\r
328                 return amt;\r
329     }\r
330     public static boolean isPremium() {\r
331                 int level;\r
332                 settings.beginGroup("User");\r
333                 try {\r
334                         String num = (String)settings.value("privilege", "1");\r
335                         level = new Integer(num.trim());\r
336                 } catch (java.lang.ClassCastException e) {\r
337                         try {\r
338                                 level = (Integer)settings.value("privilege", 1);\r
339                         } catch (Exception e1) {\r
340                                 level = 1;\r
341                         }\r
342                 }\r
343                 settings.endGroup();\r
344                 PrivilegeLevel userLevel = PrivilegeLevel.findByValue(level);\r
345                 if (userLevel == PrivilegeLevel.NORMAL)\r
346                         return false;\r
347                 return true;\r
348                 \r
349    }\r
350     public static long getUploadLimit() {\r
351                 settings.beginGroup("UserAccounting");\r
352                 long limit;\r
353                 try {\r
354                         String num = (String)settings.value("uploadLimit", new Long(0).toString());\r
355                         limit = new Long(num.trim());\r
356                 } catch (java.lang.ClassCastException e) {\r
357                         limit = 0;\r
358                 }\r
359                 settings.endGroup();\r
360                 return limit;\r
361     }\r
362     public static boolean showTrayIcon() {\r
363                 settings.beginGroup("General");\r
364                 String max = (String) settings.value("showTrayIcon", "true");\r
365                 settings.endGroup();\r
366                 if (!max.equalsIgnoreCase("true"))\r
367                         return false;\r
368                 return true;    \r
369     }\r
370     public static void setShowTrayIcon(boolean val) {\r
371                 settings.beginGroup("General");\r
372                 if (val)\r
373                         settings.setValue("showTrayIcon", "true");\r
374                 else\r
375                         settings.setValue("showTrayIcon", "false");\r
376                 settings.endGroup();\r
377     }\r
378     public static boolean wasWindowMaximized() {\r
379                 settings.beginGroup("General");\r
380                 String max = (String) settings.value("isMaximized", "true");\r
381                 settings.endGroup();\r
382                 if (!max.equalsIgnoreCase("true"))\r
383                         return false;\r
384                 return true;    \r
385     }\r
386     public static void saveWindowMaximized(boolean isMax) {\r
387                 settings.beginGroup("General");\r
388                 if (isMax)\r
389                         settings.setValue("isMaximized", "true");\r
390                 else\r
391                         settings.setValue("isMaximized", "false");\r
392                 settings.endGroup();\r
393     }\r
394     public static String getLastViewedNoteGuid() {\r
395                 settings.beginGroup("General");\r
396                 String guid = (String) settings.value("lastViewedNote", "");\r
397                 settings.endGroup();\r
398                 return guid;    \r
399     }\r
400     public static void saveCurrentNoteGuid(String guid) {\r
401                 settings.beginGroup("General");\r
402                 if (guid != null)\r
403                         settings.setValue("lastViewedNote", guid);\r
404                 else\r
405                         settings.setValue("lastViewedNote", "");\r
406                 settings.endGroup();\r
407     }\r
408     public static void setSortColumn(int i) {\r
409                 settings.beginGroup("General");\r
410                 settings.setValue("sortColumn", i);\r
411                 settings.endGroup();\r
412     }\r
413     public static int getSortColumn() {;\r
414         settings.beginGroup("General");\r
415         int order;      \r
416         try {\r
417                 String val  = settings.value("sortColumn", new Integer(0)).toString();\r
418                 order = new Integer(val.trim());\r
419         } catch (Exception e) {\r
420                 try {\r
421                         order = (Integer)settings.value("sortColumn", 0);\r
422                 } catch (Exception e1) {\r
423                     order = 0;\r
424                 }\r
425         }\r
426         \r
427         settings.endGroup();\r
428         return order;\r
429     }\r
430     public static void setSortOrder(int i) {\r
431                 settings.beginGroup("General");\r
432                 settings.setValue("sortOrder", i);\r
433                 settings.endGroup();\r
434     }\r
435     public static int getSortOrder() {\r
436                 settings.beginGroup("General");\r
437                 int order;      \r
438                 try {\r
439                         String val  = settings.value("sortOrder", new Integer(0)).toString();\r
440                         order = new Integer(val.trim());\r
441                 } catch (Exception e) {\r
442                         try {\r
443                                 order = (Integer)settings.value("sortOrder", 0);\r
444                         } catch (Exception e1) {\r
445                             order = 0;\r
446                         }\r
447                 }\r
448                 \r
449                 settings.endGroup();\r
450                 return order;\r
451     }\r
452     public static boolean automaticLogin() {\r
453                 settings.beginGroup("General");\r
454                 String text = (String)settings.value("automaticLogin", "false");\r
455                 settings.endGroup();\r
456                 if (text.equalsIgnoreCase("true"))\r
457                         return true;\r
458                 else\r
459                         return false;           \r
460     }\r
461     public static void setAutomaticLogin(boolean val) {\r
462                 settings.beginGroup("General");\r
463                 if (val)\r
464                         settings.setValue("automaticLogin", "true");\r
465                 else\r
466                         settings.setValue("automaticLogin", "false");\r
467                 settings.endGroup();\r
468     }\r
469     public static boolean rememberPassword() {\r
470                 settings.beginGroup("General");\r
471                 String text = (String)settings.value("rememberPassword", "false");\r
472                 settings.endGroup();\r
473                 if (text.equalsIgnoreCase("true"))\r
474                         return true;\r
475                 else\r
476                         return false;           \r
477     }\r
478     public static void setRememberPassword(boolean val) {\r
479                 settings.beginGroup("General");\r
480                 if (val)\r
481                         settings.setValue("rememberPassword", "true");\r
482                 else\r
483                         settings.setValue("rememberPassword", "false");\r
484                 settings.endGroup();\r
485     }\r
486     public static void setServer(String server) {\r
487                 settings.beginGroup("General");\r
488                 settings.setValue("server", server);\r
489                 settings.endGroup();            \r
490     }\r
491     public static String getServer() {\r
492                 settings.beginGroup("General");\r
493                 String text = (String)settings.value("server", "www.evernote.com");\r
494                 if (text.equals("www.evernote.com")) {\r
495                         userStoreUrl = "https://www.evernote.com/edam/user";\r
496                     noteStoreUrlBase = "www.evernote.com/edam/note/";   \r
497                 } else {\r
498                         userStoreUrl = "https://sandbox.evernote.com/edam/user";\r
499                         noteStoreUrlBase = "sandbox.evernote.com/edam/note/";\r
500                 }\r
501                 settings.endGroup();\r
502                 if (isPremium())\r
503                         noteStoreUrlBase = "https://" + noteStoreUrlBase;\r
504                 else\r
505                         noteStoreUrlBase = "http://" + noteStoreUrlBase;\r
506                 return text;\r
507     }\r
508     public static boolean disableUploads() {\r
509                 settings.beginGroup("General");\r
510                 String text = (String)settings.value("disableUploads", "false");\r
511                 settings.endGroup();\r
512                 if (text.equalsIgnoreCase("true"))\r
513                         return true;\r
514                 else\r
515                         return false;\r
516     }\r
517     public static void setDisableUploads(boolean val) {\r
518                 settings.beginGroup("General");\r
519                 if (val)\r
520                         settings.setValue("disableUploads", "true");\r
521                 else\r
522                         settings.setValue("disableUploads", "false");\r
523                 settings.endGroup();\r
524                 disableUploads = val;\r
525     }\r
526     public static boolean pdfPreview() {\r
527                 settings.beginGroup("General");\r
528                 String text = (String)settings.value("pdfPreview", "true");\r
529                 settings.endGroup();\r
530                 if (text.equalsIgnoreCase("true"))\r
531                         return true;\r
532                 else\r
533                         return false;\r
534     }\r
535     public static void setPdfPreview(boolean val) {\r
536                 settings.beginGroup("General");\r
537                 if (val)\r
538                         settings.setValue("pdfPreview", "true");\r
539                 else\r
540                         settings.setValue("pdfPreview", "false");\r
541                 settings.endGroup();\r
542     }\r
543     public static void setMinimumWordLength(int len) {\r
544                 settings.beginGroup("General");\r
545                 settings.setValue("minimumWordLength", len);\r
546                 settings.endGroup();            \r
547     }\r
548     public static int getMinimumWordLength() {\r
549                 settings.beginGroup("General");\r
550                 Integer len = 4;\r
551                 try {\r
552                         String val  = (String)settings.value("minimumWordLength", "4");\r
553                         len = new Integer(val);\r
554                 } catch (Exception e) {\r
555                         try {\r
556                                 len = (Integer)settings.value("minimumWordLength", 4);\r
557                         } catch (Exception e1) {\r
558                                 len = 4;\r
559                         }\r
560                 }\r
561                 settings.endGroup();\r
562                 return len;\r
563                 \r
564     }\r
565     public static void setRecognitionWeight(int len) {\r
566                 settings.beginGroup("General");\r
567                 settings.setValue("recognitionWeight", len);\r
568                 settings.endGroup();            \r
569     }\r
570     public static int getRecognitionWeight() {\r
571                 settings.beginGroup("General");\r
572                 Integer len;\r
573                 try {\r
574                         len = (Integer)settings.value("recognitionWeight", 80);\r
575                 } catch (Exception e) {\r
576                         len = 80;\r
577                 }\r
578                 settings.endGroup();\r
579                 return len;\r
580     }\r
581     public static String getMessageLevel() {\r
582                 settings.beginGroup("Debug");\r
583                 String text = (String)settings.value("messageLevel", "Low");\r
584                 settings.endGroup();\r
585                 return text;\r
586     }\r
587     public static void setDateFormat(String format) {\r
588                 settings.beginGroup("General");\r
589                 settings.setValue("dateFormat", format);\r
590                 settings.endGroup();            \r
591     }\r
592     public static String getDateFormat() {\r
593                 settings.beginGroup("General");\r
594                 String text = (String)settings.value("dateFormat", "MM/dd/yyyy");\r
595                 settings.endGroup();\r
596                 return text;\r
597     }\r
598     public static void setTimeFormat(String format) {\r
599                 settings.beginGroup("General");\r
600                 settings.setValue("timeFormat", format);\r
601                 settings.endGroup();            \r
602     }\r
603     public static String getTimeFormat() {\r
604                 settings.beginGroup("General");\r
605                 String text = (String)settings.value("timeFormat", "HH:mm:ss");\r
606                 settings.endGroup();\r
607                 return text;\r
608     }\r
609     public static String getSyncInterval() {\r
610                 settings.beginGroup("General");\r
611                 String text = (String)settings.value("syncInterval", "15 minutes");\r
612                 settings.endGroup();\r
613                 return text;            \r
614     }\r
615     public static void setSyncInterval(String format) {\r
616                 settings.beginGroup("General");\r
617                 settings.setValue("syncInterval", format);\r
618                 settings.endGroup();            \r
619     }\r
620     public static void setColumnWidth(String col, int width) {\r
621                 settings.beginGroup("ColumnWidths");\r
622                 settings.setValue(col, width);\r
623                 settings.endGroup();\r
624     }\r
625     public static int getColumnWidth(String col) {\r
626                 settings.beginGroup("ColumnWidths");\r
627                 Integer width;\r
628                 try {\r
629                         String val  = (String)settings.value(col, "0");\r
630                         width = new Integer(val.trim());\r
631                 } catch (Exception e) {\r
632                         try {\r
633                                 width = (Integer)settings.value(col, 0);\r
634                         } catch (Exception e1) {\r
635                                 width = 0;\r
636                         }\r
637                 }\r
638                 settings.endGroup();\r
639                 return width;\r
640     }\r
641     public static void setColumnPosition(String col, int width) {\r
642                 settings.beginGroup("ColumnPosition");\r
643                 settings.setValue(col, width);\r
644                 settings.endGroup();\r
645     }\r
646     public static int getColumnPosition(String col) {\r
647                 settings.beginGroup("ColumnPosition");\r
648                 Integer width;\r
649                 try {\r
650                         String val  = (String)settings.value(col, "-1");\r
651                         width = new Integer(val.trim());\r
652                 } catch (Exception e) {\r
653                         try {\r
654                                 width = (Integer)settings.value(col, 0);\r
655                         } catch (Exception e1) {\r
656                                 width = 0;\r
657                         }\r
658                 }\r
659                 settings.endGroup();\r
660                 return width;\r
661     }\r
662     public static boolean verifyDelete() {\r
663                 settings.beginGroup("General");\r
664                 String text = (String)settings.value("verifyDelete", "true");\r
665                 settings.endGroup();\r
666                 if (text.equalsIgnoreCase("true"))\r
667                         return true;\r
668                 else\r
669                         return false;           \r
670     }\r
671     public static void setVerifyDelete(boolean val) {\r
672                 settings.beginGroup("General");\r
673                 if (val)\r
674                         settings.setValue("verifyDelete", "true");\r
675                 else\r
676                         settings.setValue("verifyDelete", "false");\r
677                 settings.endGroup();\r
678     }\r
679     public static boolean synchronizeDeletedContent() {\r
680                 settings.beginGroup("General");\r
681                 String text = (String)settings.value("syncDeletedContent", "false");\r
682                 settings.endGroup();\r
683                 if (text.equalsIgnoreCase("true"))\r
684                         return true;\r
685                 else\r
686                         return false;           \r
687     }\r
688     public static void setSynchronizeDeletedContent(boolean val) {\r
689                 settings.beginGroup("General");\r
690                 if (val)\r
691                         settings.setValue("syncDeletedContent", "true");\r
692                 else\r
693                         settings.setValue("syncDeletedContent", "false");\r
694                 settings.endGroup();\r
695     }\r
696     public static boolean isWindowVisible(String window) {\r
697                 settings.beginGroup("WindowsVisible");\r
698                 String text = (String)settings.value(window, "true");\r
699                 settings.endGroup();\r
700                 if (text.equalsIgnoreCase("true"))\r
701                         return true;\r
702                 else\r
703                         return false;           \r
704     }\r
705     public static void saveWindowVisible(String window, boolean val) {\r
706                 settings.beginGroup("WindowsVisible");\r
707                 if (val)\r
708                         settings.setValue(window, "true");\r
709                 else\r
710                         settings.setValue(window, "false");\r
711                 settings.endGroup();\r
712     }\r
713     public static boolean isColumnVisible(String window) {\r
714                 settings.beginGroup("ColumnsVisible");\r
715                 String text = (String)settings.value(window, "true");\r
716                 settings.endGroup();\r
717                 if (text.equalsIgnoreCase("true"))\r
718                         return true;\r
719                 else\r
720                         return false;   \r
721     }\r
722     public static void saveColumnVisible(String column, boolean val) {\r
723                 settings.beginGroup("ColumnsVisible");\r
724                 if (val)\r
725                         settings.setValue(column, "true");\r
726                 else\r
727                         settings.setValue(column, "false");\r
728                 settings.endGroup();\r
729     }\r
730     public static boolean isEditorButtonVisible(String window) {\r
731                 settings.beginGroup("EditorButtonsVisible");\r
732                 String text = (String)settings.value(window, "true");\r
733                 settings.endGroup();\r
734                 if (text.equalsIgnoreCase("true"))\r
735                         return true;\r
736                 else\r
737                         return false;   \r
738     }\r
739     public static void saveEditorButtonsVisible(String column, boolean val) {\r
740                 settings.beginGroup("EditorButtonsVisible");\r
741                 if (val)\r
742                         settings.setValue(column, "true");\r
743                 else\r
744                         settings.setValue(column, "false");\r
745                 settings.endGroup();\r
746     }\r
747     public static boolean enableCarriageReturnFix() {\r
748                 settings.beginGroup("Debug");\r
749                 String text = (String)settings.value("enableCarriageReturnFix", "false");\r
750                 settings.endGroup();\r
751                 if (text.equalsIgnoreCase("true"))\r
752                         return true;\r
753                 else\r
754                         return false;   \r
755     }\r
756     public static void saveCarriageReturnFix(boolean val) {\r
757                 settings.beginGroup("Debug");\r
758                 if (val)\r
759                         settings.setValue("enableCarriageReturnFix", "true");\r
760                 else\r
761                         settings.setValue("enableCarriageReturnFix", "false");\r
762                 settings.endGroup();\r
763     }\r
764     public static void setIndexThreads(int val) {\r
765                 settings.beginGroup("General");\r
766                 settings.setValue("indexThreads", val);\r
767                 settings.endGroup();\r
768     }\r
769     public static int getIndexThreads() {\r
770                 settings.beginGroup("General");\r
771                 Integer threads;\r
772                 try {\r
773                         String val  = (String)settings.value("indexThreads", "1");\r
774                         threads = new Integer(val.trim());\r
775                 } catch (Exception e) {\r
776                         try {\r
777                                 threads = (Integer)settings.value("indexThreads", 1);\r
778                         } catch (Exception e1) {\r
779                                 threads = 1;\r
780                         }\r
781                 }\r
782                 settings.endGroup();\r
783                 threads = 1;\r
784                 return threads;\r
785     }\r
786     public static void setZoomFactor(double val) {\r
787                 settings.beginGroup("General");\r
788                 settings.setValue("zoomFactor", val);\r
789                 settings.endGroup();\r
790     }\r
791     public static double getZoomFactor() {\r
792                 settings.beginGroup("General");\r
793                 Double threads;\r
794                 try {\r
795                         String val  = (String)settings.value("zoomFactor", "1.0");\r
796                         threads = new Double(val.trim());\r
797                 } catch (Exception e) {\r
798                         try {\r
799                                 threads = (Double)settings.value("zoomFactor", 1.0);\r
800                         } catch (Exception e1) {\r
801                                 threads = new Double(1);\r
802                         }\r
803                 }\r
804                 settings.endGroup();\r
805                 return threads;\r
806     }\r
807     public static void setTextSizeMultiplier(double val) {\r
808                 settings.beginGroup("General");\r
809                 settings.setValue("textMultiplier", val);\r
810                 settings.endGroup();\r
811     }\r
812     public static double getTextSizeMultiplier() {\r
813                 settings.beginGroup("General");\r
814                 Double threads;\r
815                 try {\r
816                         String val  = (String)settings.value("textMultiplier", "1");\r
817                         threads = new Double(val.trim());\r
818                 } catch (Exception e) {\r
819                         try {\r
820                                 threads = (Double)settings.value("textMultiplier", 1);\r
821                         } catch (Exception e1) {\r
822                                 threads = new Double(1);\r
823                         }\r
824                 }\r
825                 settings.endGroup();\r
826                 return threads;\r
827     }\r
828 \r
829     public static boolean getMimicEvernoteInterface() {\r
830                 settings.beginGroup("General");\r
831                 String text = (String)settings.value("mimicEvernoteInterface", "true");\r
832                 settings.endGroup();\r
833                 if (text.equalsIgnoreCase("true"))\r
834                         return true;\r
835                 else\r
836                         return false;\r
837     }\r
838     public static void setMimicEvernoteInterface(boolean value) {\r
839         settings.beginGroup("General");\r
840         if (value)\r
841                 settings.setValue("mimicEvernoteInterface", "true");\r
842         else\r
843                 settings.setValue("mimicEvernoteInterface", "false"); \r
844         settings.endGroup();\r
845     }\r
846     \r
847     public static boolean synchronizeOnClose() {\r
848                 settings.beginGroup("General");\r
849                 String text = (String)settings.value("synchronizeOnClose", "false");\r
850                 settings.endGroup();\r
851                 if (text.equalsIgnoreCase("true"))\r
852                         return true;\r
853                 else\r
854                         return false;\r
855     }\r
856     public static void setSynchronizeOnClose(boolean val) {\r
857                 settings.beginGroup("General");\r
858                 if (val)\r
859                         settings.setValue("synchronizeOnClose", "true");\r
860                 else\r
861                         settings.setValue("synchronizeOnClose", "false");\r
862                 settings.endGroup();\r
863     }\r
864     public static void setDatabaseVersion(String version) {\r
865                 settings.beginGroup("General");\r
866                 settings.setValue("databaseVersion", version);\r
867                 settings.endGroup();\r
868     }\r
869     public static String getDatabaseVersion() {\r
870                 settings.beginGroup("General");\r
871                 String val  = (String)settings.value("databaseVersion", "0.70");\r
872                 settings.endGroup();\r
873                 return val;\r
874     }\r
875     public static String getDatabaseUrl() {\r
876                 settings.beginGroup("General");\r
877                 String val  = (String)settings.value("DatabaseURL", "");\r
878                 settings.endGroup();\r
879                 if (val.equals(""))\r
880                         val = "jdbc:h2:"+Global.getDirectoryPath() +File.separator +"db" +File.separator +Global.databaseName;\r
881                 return val;\r
882     }\r
883     public static String getDatabaseUserid() {\r
884                 settings.beginGroup("General");\r
885                 String val  = (String)settings.value("databaseUserid", "");\r
886                 settings.endGroup();\r
887                 return val;\r
888     }\r
889     public static String getDatabaseUserPassword() {\r
890                 settings.beginGroup("General");\r
891                 String val  = (String)settings.value("databaseUserPassword", "");\r
892                 settings.endGroup();\r
893                 return val;\r
894     }\r
895     public static void setStyle(String style) {\r
896                 settings.beginGroup("General");\r
897                 settings.setValue("style", style);\r
898                 settings.endGroup();\r
899     }\r
900     public static String getStyle() {\r
901                 settings.beginGroup("General");\r
902                 String val  = (String)settings.value("style", "");\r
903                 settings.endGroup();\r
904                 return val;\r
905     }\r
906     public static boolean useStandardPalette() {\r
907                 settings.beginGroup("General");\r
908                 String text = (String)settings.value("standardPalette", "true");\r
909                 settings.endGroup();\r
910                 if (text.equalsIgnoreCase("true"))\r
911                         return true;\r
912                 else\r
913                         return false;\r
914     }\r
915     public static void setStandardPalette(boolean val) {\r
916                 settings.beginGroup("General");\r
917                 if (val)\r
918                         settings.setValue("standardPalette", "true");\r
919                 else\r
920                         settings.setValue("standardPalette", "false");\r
921                 settings.endGroup();\r
922     }\r
923     \r
924     public static void dbWait() {\r
925  //     Global.dbThreadWait.wait(Global.dbThreadWaitMutex);\r
926     }\r
927     public static void dbContinue() {\r
928 //      Global.dbThreadWait.wakeAll();\r
929     }\r
930     public static synchronized void dbClientWait(int id) {\r
931         if (id == mainThreadId) {\r
932                         try {mainThreadWaiter.take(); } catch (InterruptedException e) {e.printStackTrace();}\r
933         }\r
934         if (id == syncThreadId) {\r
935                         try {syncThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
936         }\r
937         if (id == tagCounterThreadId) {\r
938                 try {tagCounterThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
939         }\r
940         if (id == trashCounterThreadId) {\r
941                 try {trashCounterThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
942         }\r
943         if (id == indexThreadId) {\r
944                 try {indexThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
945         }\r
946         if (id == saveThreadId) {\r
947                 try {saveThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
948         }\r
949         if (id == notebookCounterThreadId) {\r
950                 try {notebookCounterThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
951         }\r
952         if (id == indexThread03Id) {\r
953                 try {indexThread03ThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
954         }\r
955         if (id == indexThread04Id) {\r
956                 try {indexThread04ThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}\r
957         }\r
958     }\r
959     public static void dbClientContinue(int id) {\r
960         if (id == mainThreadId) {\r
961                         try { mainThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
962         }\r
963         if (id == syncThreadId) {\r
964                         try { syncThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
965         }\r
966                 if (id == tagCounterThreadId) { \r
967                         try { tagCounterThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
968                 }\r
969                 if (id == trashCounterThreadId) { \r
970                         try { trashCounterThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
971                 }\r
972                 if (id == indexThreadId) { \r
973                         try { indexThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
974                 }\r
975                 if (id == saveThreadId) { \r
976                         try { saveThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
977                 }\r
978                 if (id == notebookCounterThreadId) { \r
979                         try { notebookCounterThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
980                 }\r
981                 if (id == indexThread03Id) { \r
982                         try { indexThread03ThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
983                 }\r
984                 if (id == indexThread04Id) { \r
985                         try { indexThread04ThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}\r
986                 }\r
987     }\r
988     \r
989     public static void saveState(String name, QByteArray state) {\r
990                 settings.beginGroup("SaveState");\r
991                 settings.setValue(name, state);\r
992                 settings.endGroup();\r
993     }\r
994     \r
995     public static QByteArray restoreState(String name) {\r
996                 settings.beginGroup("SaveState");\r
997                 QByteArray state = (QByteArray)settings.value(name);\r
998                 settings.endGroup();\r
999                 return state;\r
1000     }\r
1001     public static void saveGeometry(String name, QByteArray state) {\r
1002                 settings.beginGroup("SaveGeometry");\r
1003                 settings.setValue(name, state);\r
1004                 settings.endGroup();\r
1005     }\r
1006     \r
1007     public static QByteArray restoreGeometry(String name) {\r
1008                 settings.beginGroup("SaveGeometry");\r
1009                 QByteArray state = (QByteArray)settings.value(name);\r
1010                 settings.endGroup();\r
1011                 return state;\r
1012     }\r
1013     \r
1014     public static void setAutoSaveInterval(int interval) {\r
1015                 settings.beginGroup("General");\r
1016                 settings.setValue("autoSaveInterval", interval);\r
1017                 settings.endGroup();\r
1018     }\r
1019     public static int getAutoSaveInterval() {\r
1020                 settings.beginGroup("General");\r
1021                 Integer value;\r
1022                 try {\r
1023                         String val  = (String)settings.value("autoSaveInterval", "5");\r
1024                         value = new Integer(val.trim());\r
1025                 } catch (Exception e) {\r
1026                         try {\r
1027                                 value = (Integer)settings.value("autoSaveInterval", 5);\r
1028                         } catch (Exception e1) {\r
1029                                 value = 0;\r
1030                         }\r
1031                 }\r
1032                 settings.endGroup();\r
1033                 return value;\r
1034     }\r
1035      \r
1036     // Add invalid attributes\r
1037     public static void addInvalidAttribute(String element, String attribute) {\r
1038         \r
1039                 List<String> attributes = invalidAttributes.get(element);\r
1040                 if (attributes != null) {\r
1041                         for (int i=0; i<attributes.size(); i++)\r
1042                                 if (attribute.equalsIgnoreCase(attributes.get(i))) {\r
1043                                         return;\r
1044                         }\r
1045         }\r
1046         \r
1047         ArrayList<String> attributeList;\r
1048         if (!invalidAttributes.containsKey(element)) {\r
1049                 attributeList = new ArrayList<String>();\r
1050                 attributeList.add(attribute);\r
1051                 invalidAttributes.put(element, attributeList);\r
1052         }\r
1053         else {\r
1054                 attributeList = invalidAttributes.get(element);\r
1055                 attributeList.add(attribute);\r
1056                 invalidAttributes.put(element,attributeList);\r
1057         }\r
1058     }\r
1059 \r
1060     \r
1061     // Add invalid attributes\r
1062     public static void addInvalidElement(String element) {\r
1063                 for (int i=0; i<invalidElements.size(); i++) {\r
1064                         if (element.equalsIgnoreCase(invalidElements.get(i)))\r
1065                                 return;\r
1066                 }\r
1067         invalidElements.add(element);\r
1068     }\r
1069     \r
1070     // Convert a byte array to a hex string\r
1071         public static String byteArrayToHexString(byte data[]) {\r
1072                 StringBuffer buf = new StringBuffer();\r
1073             for (byte element : data) {\r
1074                 int halfbyte = (element >>> 4) & 0x0F;\r
1075                 int two_halfs = 0;\r
1076                 do {\r
1077                         if ((0 <= halfbyte) && (halfbyte <= 9))\r
1078                                buf.append((char) ('0' + halfbyte));\r
1079                            else\r
1080                                 buf.append((char) ('a' + (halfbyte - 10)));\r
1081                         halfbyte = element & 0x0F;\r
1082                 } while(two_halfs++ < 1);\r
1083             }\r
1084             return buf.toString();              \r
1085         }\r
1086 \r
1087         \r
1088         // What to do with inactive tags?\r
1089         public static String tagBehavior() {\r
1090                 settings.beginGroup("General");\r
1091                 String text = (String)settings.value("tagBehavior", "DoNothing");\r
1092                 settings.endGroup();\r
1093                 return text;\r
1094         }\r
1095         // What to do with inactive tags?\r
1096         public static void setTagBehavior(String value) {\r
1097                 settings.beginGroup("General");\r
1098                 settings.setValue("tagBehavior", value);\r
1099                 settings.endGroup();\r
1100         }\r
1101 \r
1102         \r
1103         // Print date/time.  Used mainly for performance tracing\r
1104         public static void trace(boolean resetInterval) {\r
1105                 String fmt = "MM/dd/yy HH:mm:ss.SSSSSS";\r
1106                 String dateTimeFormat = new String(fmt);\r
1107                 SimpleDateFormat simple = new SimpleDateFormat(dateTimeFormat);\r
1108                 Calendar cal = Calendar.getInstance();\r
1109                 if (intervalTraceTime == null) \r
1110                         intervalTraceTime = Calendar.getInstance();\r
1111                 if (startTraceTime == null)\r
1112                         startTraceTime = Calendar.getInstance();\r
1113                 \r
1114                 float interval = (cal.getTimeInMillis() - intervalTraceTime.getTimeInMillis());\r
1115                 float total = (cal.getTimeInMillis() - startTraceTime.getTimeInMillis());\r
1116                 \r
1117 //              if (interval > 00.0) {\r
1118                         StackTraceElement[] exceptions = Thread.currentThread().getStackTrace();\r
1119                         System.out.println("------------------------------------------");\r
1120 \r
1121                         System.out.println("Date/Time " +simple.format(cal.getTime()));\r
1122                         System.out.format("Interval Time: %-10.6f%n", interval);\r
1123                         System.out.format("Total Time: %-10.6f%n", total);\r
1124                         for (int i=2; i<5 && i<exceptions.length; i++) {\r
1125                                 System.out.println(exceptions[i]);\r
1126                         }\r
1127 //              }\r
1128                 if (resetInterval)\r
1129                         intervalTraceTime = cal;\r
1130         }\r
1131         public static void traceReset() {\r
1132                 intervalTraceTime = null;\r
1133                 startTraceTime = null;\r
1134         }\r
1135 \r
1136 }\r
1137 \r