OSDN Git Service

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