OSDN Git Service

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