2 * This file is part of NeverNote
\r
3 * Copyright 2009 Randy Baumgarte
\r
5 * This file may be licensed under the terms of of the
\r
6 * GNU General Public License Version 2 (the ``GPL'').
\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
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
20 package cx.fbn.nevernote;
\r
23 //import java.io.ByteArrayOutputStream;
\r
24 import java.io.File;
\r
25 import java.io.PrintStream;
\r
26 import java.text.SimpleDateFormat;
\r
27 import java.util.ArrayList;
\r
28 import java.util.Calendar;
\r
29 import java.util.HashMap;
\r
30 import java.util.List;
\r
31 import java.util.concurrent.ArrayBlockingQueue;
\r
33 import com.evernote.edam.type.Accounting;
\r
34 import com.evernote.edam.type.PrivilegeLevel;
\r
35 import com.evernote.edam.type.User;
\r
36 import com.evernote.edam.type.UserAttributes;
\r
37 import com.trolltech.qt.core.QByteArray;
\r
38 import com.trolltech.qt.core.QMutex;
\r
39 import com.trolltech.qt.core.QSettings;
\r
40 import com.trolltech.qt.gui.QPalette;
\r
42 import cx.fbn.nevernote.gui.ContainsAttributeFilterTable;
\r
43 import cx.fbn.nevernote.gui.DateAttributeFilterTable;
\r
44 import cx.fbn.nevernote.gui.ShortcutKeys;
\r
45 import cx.fbn.nevernote.signals.DBRunnerSignal;
\r
46 import cx.fbn.nevernote.threads.DBRunner;
\r
47 import cx.fbn.nevernote.utilities.ApplicationLogger;
\r
49 public class Global {
\r
50 public static String version = "0.88";
\r
51 public static String username = "";
\r
52 public static String password = "";
\r
54 public static DBRunner dbRunner; // Database thread
\r
55 public static DBRunnerSignal dbRunnerSignal; // Signals to the database runner
\r
56 public static QMutex dbrunnerWorkLock; // mutex lock for work queue
\r
59 public static int mainThreadId=0;
\r
60 private static ArrayBlockingQueue<Boolean> mainThreadWaiter = new ArrayBlockingQueue<Boolean>(1);
\r
62 public static int syncThreadId=1;
\r
63 private static ArrayBlockingQueue<Boolean> syncThreadWaiter = new ArrayBlockingQueue<Boolean>(1);
\r
65 public static int tagCounterThreadId=2;
\r
66 private static ArrayBlockingQueue<Boolean> tagCounterThreadWaiter = new ArrayBlockingQueue<Boolean>(1);
\r
68 public static int trashCounterThreadId=3; // This should always be the highest thread ID
\r
69 private static ArrayBlockingQueue<Boolean> trashCounterThreadWaiter = new ArrayBlockingQueue<Boolean>(1);
\r
71 public static int indexThreadId=4; // Thread for indexing words
\r
72 private static ArrayBlockingQueue<Boolean> indexThreadWaiter = new ArrayBlockingQueue<Boolean>(1);
\r
74 public static int saveThreadId=5; // Thread used for processing data to saving content
\r
75 private static ArrayBlockingQueue<Boolean> saveThreadWaiter = new ArrayBlockingQueue<Boolean>(1);
\r
77 public static int notebookCounterThreadId=6; // Notebook Thread
\r
78 private static ArrayBlockingQueue<Boolean> notebookCounterThreadWaiter = new ArrayBlockingQueue<Boolean>(1);
\r
80 public static int indexThread03Id=7; // unused
\r
81 private static ArrayBlockingQueue<Boolean> indexThread03ThreadWaiter = new ArrayBlockingQueue<Boolean>(1);
\r
83 public static int indexThread04Id=8; // unused
\r
84 private static ArrayBlockingQueue<Boolean> indexThread04ThreadWaiter = new ArrayBlockingQueue<Boolean>(1);
\r
86 public static int dbThreadId=9; // This should always be the highest thread ID
\r
89 public static HashMap<String,String> passwordSafe = new HashMap<String, String>();
\r
90 public static List<String> passwordRemember = new ArrayList<String>();
\r
91 public static String currentNotebookGuid;
\r
92 public static User user;
\r
93 public static long authTimeRemaining;
\r
94 public static long authRefreshTime;
\r
95 public static long failedRefreshes = 0;
\r
96 public static String currentDir;
\r
97 public static boolean keepRunning;
\r
99 public static String userStoreUrl;
\r
100 public static String noteStoreUrl;
\r
101 public static String noteStoreUrlBase;
\r
103 public static int noteTableCreationPosition = 0;
\r
104 public static int noteTableTitlePosition = 1;
\r
105 public static int noteTableTagPosition = 2;
\r
106 public static int noteTableNotebookPosition = 3;
\r
107 public static int noteTableChangedPosition = 4;
\r
108 public static int noteTableGuidPosition = 5;
\r
109 public static int noteTableAuthorPosition = 6;
\r
110 public static int noteTableSourceUrlPosition = 7;
\r
111 public static int noteTableSubjectDatePosition = 8;
\r
112 public static int noteTableSynchronizedPosition = 9;
\r
113 public static int noteTableColumnCount = 10;
\r
114 public static Integer cryptCounter = 0;
\r
116 public static int minimumWordCount = 2;
\r
117 private static String wordRegex;
\r
118 public static boolean enableCarriageReturnFix = false;
\r
120 public static String name = null;
\r
121 public static QSettings settings;
\r
122 public static boolean isConnected;
\r
123 public static boolean showDeleted = false;
\r
124 public static boolean disableUploads = false;
\r
125 public static int messageLevel;
\r
126 public static String tagDelimeter = ",";
\r
127 public static String attachmentNameDelimeter = "------";
\r
129 public static String databaseName = new String("NeverNote");
\r
130 public static String indexDatabaseName = new String("IndexDatabase.db");
\r
131 public static DateAttributeFilterTable createdSinceFilter;
\r
132 public static DateAttributeFilterTable createdBeforeFilter;
\r
133 public static DateAttributeFilterTable changedSinceFilter;
\r
134 public static DateAttributeFilterTable changedBeforeFilter;
\r
135 public static ContainsAttributeFilterTable containsFilter;
\r
136 // public static DBLock dbLock;
\r
137 // public static DBLock indexLock;
\r
138 public static ApplicationLogger logger;
\r
139 PrintStream stdoutStream;
\r
140 public static QPalette originalPalette;
\r
141 public static ShortcutKeys shortcutKeys;
\r
142 public static boolean disableViewing = false;
\r
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
150 static Calendar startTraceTime;
\r
151 static Calendar intervalTraceTime;
\r
153 // Do initial setup
\r
154 public static void setup() {
\r
156 name = "NeverNote";
\r
157 settings = new QSettings("fbn.cx", name);
\r
158 currentDir = getDirectoryPath();
\r
160 settings.beginGroup("General");
\r
161 String regex = (String) settings.value("regex", "[,\\s]+");
\r
162 setWordRegex(regex);
\r
163 String wordString = settings.value("wordLength", "4").toString();
\r
164 Integer wordLen = new Integer(wordString);
\r
165 Global.minimumWordCount = wordLen;
\r
166 settings.endGroup();
\r
167 settings.beginGroup("Debug");
\r
168 String msglevel = (String) settings.value("messageLevel", "Low");
\r
169 settings.endGroup();
\r
171 setMessageLevel(msglevel);
\r
172 keepRunning = true;
\r
173 disableUploads = disableUploads();
\r
174 enableCarriageReturnFix = enableCarriageReturnFix();
\r
175 // dbLock = new DBLock();
\r
176 // indexLock = new DBLock();
\r
177 logger = new ApplicationLogger("global.log");
\r
178 shortcutKeys = new ShortcutKeys();
\r
179 dbrunnerWorkLock = new QMutex();
\r
180 mimicEvernoteInterface = getMimicEvernoteInterface();
\r
181 resourceMap = new HashMap<String,String>();
\r
184 public static void setName(String n) {
\r
185 if (!n.trim().equals("")) {
\r
186 name = "NeverNote-"+n;
\r
189 public static String getDirectoryPath() {
\r
190 if (currentDir == null) {
\r
191 currentDir = System.getProperty("user.dir");
\r
193 if (!currentDir.substring(currentDir.length()-1).equals(File.separator)) {
\r
194 currentDir = currentDir+File.separator;
\r
198 public static void setDirectoryPath(String path) {
\r
199 if (path.trim().equals(""))
\r
200 path = System.getProperty("user.dir");
\r
201 if (!path.substring(path.length()-1).equals(File.separator))
\r
202 path = path+File.separator;
\r
205 public static String getWordRegex() {
\r
208 public static void setWordRegex(String r) {
\r
211 public static void setMessageLevel(String msglevel) {
\r
212 if (msglevel.equalsIgnoreCase("low"))
\r
214 if (msglevel.equalsIgnoreCase("medium"))
\r
216 if (msglevel.equalsIgnoreCase("high"))
\r
218 if (msglevel.equalsIgnoreCase("extreme"))
\r
220 settings.beginGroup("Debug");
\r
221 settings.setValue("messageLevel", msglevel);
\r
222 settings.endGroup();
\r
225 public static void saveUserInformation(User user) {
\r
226 settings.beginGroup("User");
\r
227 settings.setValue("id", user.getId());
\r
228 settings.setValue("username", user.getUsername());
\r
229 settings.setValue("email", user.getEmail());
\r
230 settings.setValue("name", user.getName());
\r
231 settings.setValue("timezone", user.getTimezone());
\r
232 settings.setValue("privilege", user.getPrivilege().getValue());
\r
233 settings.setValue("created", user.getCreated());
\r
234 settings.setValue("updated", user.getUpdated());
\r
235 settings.setValue("deleted", user.getDeleted());
\r
236 settings.endGroup();
\r
238 if (user.getAttributes()!=null)
\r
239 saveUserAttributes(user.getAttributes());
\r
240 if (user.getAccounting()!=null)
\r
241 saveUserAccounting(user.getAccounting());
\r
244 public static void saveUserAttributes(UserAttributes attrib) {
\r
245 settings.beginGroup("UserAttributes");
\r
246 settings.setValue("defaultLocationName", attrib.getDefaultLocationName());
\r
247 settings.setValue("defaultLatitude", attrib.getDefaultLocationName());
\r
248 settings.setValue("defaultLongitude", attrib.getDefaultLocationName());
\r
249 settings.setValue("incomingEmailAddress", attrib.getIncomingEmailAddress());
\r
250 settings.endGroup();
\r
252 public static UserAttributes getUserAttributes() {
\r
253 settings.beginGroup("UserAttributes");
\r
254 UserAttributes attrib = new UserAttributes();
\r
255 attrib.setDefaultLocationName((String)settings.value("defaultLocationName",""));
\r
256 attrib.setDefaultLatitudeIsSet(false);
\r
257 attrib.setDefaultLongitudeIsSet(false);
\r
258 attrib.setIncomingEmailAddress((String)settings.value("incomingEmailAddress", ""));
\r
259 settings.endGroup();
\r
262 public static void saveUserAccounting(Accounting acc) {
\r
263 settings.beginGroup("UserAccounting");
\r
264 settings.setValue("uploadLimit", acc.getUploadLimit());
\r
265 settings.setValue("uploadLimitEnd", acc.getUploadLimitEnd());
\r
266 settings.setValue("uploadLimitNextMonth", acc.getUploadLimitNextMonth());
\r
267 settings.setValue("premiumServiceStart", acc.getPremiumServiceStart());
\r
268 settings.setValue("nextPaymentDue", acc.getNextPaymentDue());
\r
269 settings.setValue("uploadAmount", acc.getUpdated());
\r
270 settings.endGroup();
\r
272 public static long getUploadLimitEnd() {
\r
274 settings.beginGroup("UserAccounting");
\r
278 String val = (String)settings.value("uploadLimitEnd", "0");
\r
279 limit = new Long(val.trim());
\r
280 } catch (Exception e) {
\r
282 limit = (Long)settings.value("uploadLimitEnd", 0);
\r
283 } catch (Exception e1) {
\r
284 limit = new Long(0);
\r
289 settings.endGroup();
\r
292 public static void saveUploadAmount(long amount) {
\r
293 settings.beginGroup("UserAccounting");
\r
294 settings.setValue("uploadAmount", amount);
\r
295 settings.endGroup();
\r
297 public static long getUploadAmount() {
\r
299 settings.beginGroup("UserAccounting");
\r
301 String num = (String)settings.value("uploadAmount", "0");
\r
302 amt = new Long(num.trim());
\r
303 } catch (Exception e) {
\r
305 amt = (Integer)settings.value("uploadAmount", 0);
\r
306 } catch (Exception e1) {
\r
310 settings.endGroup();
\r
313 public static void saveEvernoteUpdateCount(long amount) {
\r
314 settings.beginGroup("UserAccounting");
\r
315 settings.setValue("updateCount", amount);
\r
316 settings.endGroup();
\r
318 public static long getEvernoteUpdateCount() {
\r
320 settings.beginGroup("UserAccounting");
\r
322 String num = (String)settings.value("updateCount", new Long(0).toString());
\r
323 amt = new Long(num.trim());
\r
324 } catch (java.lang.ClassCastException e) {
\r
327 settings.endGroup();
\r
330 public static boolean isPremium() {
\r
332 settings.beginGroup("User");
\r
334 String num = (String)settings.value("privilege", "1");
\r
335 level = new Integer(num.trim());
\r
336 } catch (java.lang.ClassCastException e) {
\r
338 level = (Integer)settings.value("privilege", 1);
\r
339 } catch (Exception e1) {
\r
343 settings.endGroup();
\r
344 PrivilegeLevel userLevel = PrivilegeLevel.findByValue(level);
\r
345 if (userLevel == PrivilegeLevel.NORMAL)
\r
350 public static long getUploadLimit() {
\r
351 settings.beginGroup("UserAccounting");
\r
354 String num = (String)settings.value("uploadLimit", new Long(0).toString());
\r
355 limit = new Long(num.trim());
\r
356 } catch (java.lang.ClassCastException e) {
\r
359 settings.endGroup();
\r
362 public static boolean showTrayIcon() {
\r
363 settings.beginGroup("General");
\r
364 String max = (String) settings.value("showTrayIcon", "true");
\r
365 settings.endGroup();
\r
366 if (!max.equalsIgnoreCase("true"))
\r
370 public static void setShowTrayIcon(boolean val) {
\r
371 settings.beginGroup("General");
\r
373 settings.setValue("showTrayIcon", "true");
\r
375 settings.setValue("showTrayIcon", "false");
\r
376 settings.endGroup();
\r
378 public static boolean wasWindowMaximized() {
\r
379 settings.beginGroup("General");
\r
380 String max = (String) settings.value("isMaximized", "true");
\r
381 settings.endGroup();
\r
382 if (!max.equalsIgnoreCase("true"))
\r
386 public static void saveWindowMaximized(boolean isMax) {
\r
387 settings.beginGroup("General");
\r
389 settings.setValue("isMaximized", "true");
\r
391 settings.setValue("isMaximized", "false");
\r
392 settings.endGroup();
\r
394 public static String getLastViewedNoteGuid() {
\r
395 settings.beginGroup("General");
\r
396 String guid = (String) settings.value("lastViewedNote", "");
\r
397 settings.endGroup();
\r
400 public static void saveCurrentNoteGuid(String guid) {
\r
401 settings.beginGroup("General");
\r
403 settings.setValue("lastViewedNote", guid);
\r
405 settings.setValue("lastViewedNote", "");
\r
406 settings.endGroup();
\r
408 public static void setSortColumn(int i) {
\r
409 settings.beginGroup("General");
\r
410 settings.setValue("sortColumn", i);
\r
411 settings.endGroup();
\r
413 public static int getSortColumn() {;
\r
414 settings.beginGroup("General");
\r
417 String val = settings.value("sortColumn", new Integer(0)).toString();
\r
418 order = new Integer(val.trim());
\r
419 } catch (Exception e) {
\r
421 order = (Integer)settings.value("sortColumn", 0);
\r
422 } catch (Exception e1) {
\r
427 settings.endGroup();
\r
430 public static void setSortOrder(int i) {
\r
431 settings.beginGroup("General");
\r
432 settings.setValue("sortOrder", i);
\r
433 settings.endGroup();
\r
435 public static int getSortOrder() {
\r
436 settings.beginGroup("General");
\r
439 String val = settings.value("sortOrder", new Integer(0)).toString();
\r
440 order = new Integer(val.trim());
\r
441 } catch (Exception e) {
\r
443 order = (Integer)settings.value("sortOrder", 0);
\r
444 } catch (Exception e1) {
\r
449 settings.endGroup();
\r
452 public static boolean automaticLogin() {
\r
453 settings.beginGroup("General");
\r
454 String text = (String)settings.value("automaticLogin", "false");
\r
455 settings.endGroup();
\r
456 if (text.equalsIgnoreCase("true"))
\r
461 public static void setAutomaticLogin(boolean val) {
\r
462 settings.beginGroup("General");
\r
464 settings.setValue("automaticLogin", "true");
\r
466 settings.setValue("automaticLogin", "false");
\r
467 settings.endGroup();
\r
469 public static boolean rememberPassword() {
\r
470 settings.beginGroup("General");
\r
471 String text = (String)settings.value("rememberPassword", "false");
\r
472 settings.endGroup();
\r
473 if (text.equalsIgnoreCase("true"))
\r
478 public static void setRememberPassword(boolean val) {
\r
479 settings.beginGroup("General");
\r
481 settings.setValue("rememberPassword", "true");
\r
483 settings.setValue("rememberPassword", "false");
\r
484 settings.endGroup();
\r
486 public static void setServer(String server) {
\r
487 settings.beginGroup("General");
\r
488 settings.setValue("server", server);
\r
489 settings.endGroup();
\r
491 public static String getServer() {
\r
492 settings.beginGroup("General");
\r
493 String text = (String)settings.value("server", "www.evernote.com");
\r
494 if (text.equals("www.evernote.com")) {
\r
495 userStoreUrl = "https://www.evernote.com/edam/user";
\r
496 noteStoreUrlBase = "www.evernote.com/edam/note/";
\r
498 userStoreUrl = "https://sandbox.evernote.com/edam/user";
\r
499 noteStoreUrlBase = "sandbox.evernote.com/edam/note/";
\r
501 settings.endGroup();
\r
503 noteStoreUrlBase = "https://" + noteStoreUrlBase;
\r
505 noteStoreUrlBase = "http://" + noteStoreUrlBase;
\r
508 public static boolean disableUploads() {
\r
509 settings.beginGroup("General");
\r
510 String text = (String)settings.value("disableUploads", "false");
\r
511 settings.endGroup();
\r
512 if (text.equalsIgnoreCase("true"))
\r
517 public static void setDisableUploads(boolean val) {
\r
518 settings.beginGroup("General");
\r
520 settings.setValue("disableUploads", "true");
\r
522 settings.setValue("disableUploads", "false");
\r
523 settings.endGroup();
\r
524 disableUploads = val;
\r
526 public static boolean pdfPreview() {
\r
527 settings.beginGroup("General");
\r
528 String text = (String)settings.value("pdfPreview", "true");
\r
529 settings.endGroup();
\r
530 if (text.equalsIgnoreCase("true"))
\r
535 public static void setPdfPreview(boolean val) {
\r
536 settings.beginGroup("General");
\r
538 settings.setValue("pdfPreview", "true");
\r
540 settings.setValue("pdfPreview", "false");
\r
541 settings.endGroup();
\r
543 public static void setMinimumWordLength(int len) {
\r
544 settings.beginGroup("General");
\r
545 settings.setValue("minimumWordLength", len);
\r
546 settings.endGroup();
\r
548 public static int getMinimumWordLength() {
\r
549 settings.beginGroup("General");
\r
552 String val = (String)settings.value("minimumWordLength", "4");
\r
553 len = new Integer(val);
\r
554 } catch (Exception e) {
\r
556 len = (Integer)settings.value("minimumWordLength", 4);
\r
557 } catch (Exception e1) {
\r
561 settings.endGroup();
\r
565 public static void setRecognitionWeight(int len) {
\r
566 settings.beginGroup("General");
\r
567 settings.setValue("recognitionWeight", len);
\r
568 settings.endGroup();
\r
570 public static int getRecognitionWeight() {
\r
571 settings.beginGroup("General");
\r
574 len = (Integer)settings.value("recognitionWeight", 80);
\r
575 } catch (Exception e) {
\r
578 settings.endGroup();
\r
581 public static String getMessageLevel() {
\r
582 settings.beginGroup("Debug");
\r
583 String text = (String)settings.value("messageLevel", "Low");
\r
584 settings.endGroup();
\r
587 public static void setDateFormat(String format) {
\r
588 settings.beginGroup("General");
\r
589 settings.setValue("dateFormat", format);
\r
590 settings.endGroup();
\r
592 public static String getDateFormat() {
\r
593 settings.beginGroup("General");
\r
594 String text = (String)settings.value("dateFormat", "MM/dd/yyyy");
\r
595 settings.endGroup();
\r
598 public static void setTimeFormat(String format) {
\r
599 settings.beginGroup("General");
\r
600 settings.setValue("timeFormat", format);
\r
601 settings.endGroup();
\r
603 public static String getTimeFormat() {
\r
604 settings.beginGroup("General");
\r
605 String text = (String)settings.value("timeFormat", "HH:mm:ss");
\r
606 settings.endGroup();
\r
609 public static String getSyncInterval() {
\r
610 settings.beginGroup("General");
\r
611 String text = (String)settings.value("syncInterval", "15 minutes");
\r
612 settings.endGroup();
\r
615 public static void setSyncInterval(String format) {
\r
616 settings.beginGroup("General");
\r
617 settings.setValue("syncInterval", format);
\r
618 settings.endGroup();
\r
620 public static void setColumnWidth(String col, int width) {
\r
621 settings.beginGroup("ColumnWidths");
\r
622 settings.setValue(col, width);
\r
623 settings.endGroup();
\r
625 public static int getColumnWidth(String col) {
\r
626 settings.beginGroup("ColumnWidths");
\r
629 String val = (String)settings.value(col, "0");
\r
630 width = new Integer(val.trim());
\r
631 } catch (Exception e) {
\r
633 width = (Integer)settings.value(col, 0);
\r
634 } catch (Exception e1) {
\r
638 settings.endGroup();
\r
641 public static void setColumnPosition(String col, int width) {
\r
642 settings.beginGroup("ColumnPosition");
\r
643 settings.setValue(col, width);
\r
644 settings.endGroup();
\r
646 public static int getColumnPosition(String col) {
\r
647 settings.beginGroup("ColumnPosition");
\r
650 String val = (String)settings.value(col, "-1");
\r
651 width = new Integer(val.trim());
\r
652 } catch (Exception e) {
\r
654 width = (Integer)settings.value(col, 0);
\r
655 } catch (Exception e1) {
\r
659 settings.endGroup();
\r
662 public static boolean verifyDelete() {
\r
663 settings.beginGroup("General");
\r
664 String text = (String)settings.value("verifyDelete", "true");
\r
665 settings.endGroup();
\r
666 if (text.equalsIgnoreCase("true"))
\r
671 public static void setVerifyDelete(boolean val) {
\r
672 settings.beginGroup("General");
\r
674 settings.setValue("verifyDelete", "true");
\r
676 settings.setValue("verifyDelete", "false");
\r
677 settings.endGroup();
\r
679 public static boolean synchronizeDeletedContent() {
\r
680 settings.beginGroup("General");
\r
681 String text = (String)settings.value("syncDeletedContent", "false");
\r
682 settings.endGroup();
\r
683 if (text.equalsIgnoreCase("true"))
\r
688 public static void setSynchronizeDeletedContent(boolean val) {
\r
689 settings.beginGroup("General");
\r
691 settings.setValue("syncDeletedContent", "true");
\r
693 settings.setValue("syncDeletedContent", "false");
\r
694 settings.endGroup();
\r
696 public static boolean isWindowVisible(String window) {
\r
697 settings.beginGroup("WindowsVisible");
\r
698 String text = (String)settings.value(window, "true");
\r
699 settings.endGroup();
\r
700 if (text.equalsIgnoreCase("true"))
\r
705 public static void saveWindowVisible(String window, boolean val) {
\r
706 settings.beginGroup("WindowsVisible");
\r
708 settings.setValue(window, "true");
\r
710 settings.setValue(window, "false");
\r
711 settings.endGroup();
\r
713 public static boolean isColumnVisible(String window) {
\r
714 settings.beginGroup("ColumnsVisible");
\r
715 String text = (String)settings.value(window, "true");
\r
716 settings.endGroup();
\r
717 if (text.equalsIgnoreCase("true"))
\r
722 public static void saveColumnVisible(String column, boolean val) {
\r
723 settings.beginGroup("ColumnsVisible");
\r
725 settings.setValue(column, "true");
\r
727 settings.setValue(column, "false");
\r
728 settings.endGroup();
\r
730 public static boolean isEditorButtonVisible(String window) {
\r
731 settings.beginGroup("EditorButtonsVisible");
\r
732 String text = (String)settings.value(window, "true");
\r
733 settings.endGroup();
\r
734 if (text.equalsIgnoreCase("true"))
\r
739 public static void saveEditorButtonsVisible(String column, boolean val) {
\r
740 settings.beginGroup("EditorButtonsVisible");
\r
742 settings.setValue(column, "true");
\r
744 settings.setValue(column, "false");
\r
745 settings.endGroup();
\r
747 public static boolean enableCarriageReturnFix() {
\r
748 settings.beginGroup("Debug");
\r
749 String text = (String)settings.value("enableCarriageReturnFix", "false");
\r
750 settings.endGroup();
\r
751 if (text.equalsIgnoreCase("true"))
\r
756 public static void saveCarriageReturnFix(boolean val) {
\r
757 settings.beginGroup("Debug");
\r
759 settings.setValue("enableCarriageReturnFix", "true");
\r
761 settings.setValue("enableCarriageReturnFix", "false");
\r
762 settings.endGroup();
\r
764 public static void setIndexThreads(int val) {
\r
765 settings.beginGroup("General");
\r
766 settings.setValue("indexThreads", val);
\r
767 settings.endGroup();
\r
769 public static int getIndexThreads() {
\r
770 settings.beginGroup("General");
\r
773 String val = (String)settings.value("indexThreads", "1");
\r
774 threads = new Integer(val.trim());
\r
775 } catch (Exception e) {
\r
777 threads = (Integer)settings.value("indexThreads", 1);
\r
778 } catch (Exception e1) {
\r
782 settings.endGroup();
\r
786 public static void setZoomFactor(double val) {
\r
787 settings.beginGroup("General");
\r
788 settings.setValue("zoomFactor", val);
\r
789 settings.endGroup();
\r
791 public static double getZoomFactor() {
\r
792 settings.beginGroup("General");
\r
795 String val = (String)settings.value("zoomFactor", "1.0");
\r
796 threads = new Double(val.trim());
\r
797 } catch (Exception e) {
\r
799 threads = (Double)settings.value("zoomFactor", 1.0);
\r
800 } catch (Exception e1) {
\r
801 threads = new Double(1);
\r
804 settings.endGroup();
\r
807 public static void setTextSizeMultiplier(double val) {
\r
808 settings.beginGroup("General");
\r
809 settings.setValue("textMultiplier", val);
\r
810 settings.endGroup();
\r
812 public static double getTextSizeMultiplier() {
\r
813 settings.beginGroup("General");
\r
816 String val = (String)settings.value("textMultiplier", "1");
\r
817 threads = new Double(val.trim());
\r
818 } catch (Exception e) {
\r
820 threads = (Double)settings.value("textMultiplier", 1);
\r
821 } catch (Exception e1) {
\r
822 threads = new Double(1);
\r
825 settings.endGroup();
\r
829 public static boolean getMimicEvernoteInterface() {
\r
830 settings.beginGroup("General");
\r
831 String text = (String)settings.value("mimicEvernoteInterface", "true");
\r
832 settings.endGroup();
\r
833 if (text.equalsIgnoreCase("true"))
\r
838 public static void setMimicEvernoteInterface(boolean value) {
\r
839 settings.beginGroup("General");
\r
841 settings.setValue("mimicEvernoteInterface", "true");
\r
843 settings.setValue("mimicEvernoteInterface", "false");
\r
844 settings.endGroup();
\r
847 public static boolean synchronizeOnClose() {
\r
848 settings.beginGroup("General");
\r
849 String text = (String)settings.value("synchronizeOnClose", "false");
\r
850 settings.endGroup();
\r
851 if (text.equalsIgnoreCase("true"))
\r
856 public static void setSynchronizeOnClose(boolean val) {
\r
857 settings.beginGroup("General");
\r
859 settings.setValue("synchronizeOnClose", "true");
\r
861 settings.setValue("synchronizeOnClose", "false");
\r
862 settings.endGroup();
\r
864 public static void setDatabaseVersion(String version) {
\r
865 settings.beginGroup("General");
\r
866 settings.setValue("databaseVersion", version);
\r
867 settings.endGroup();
\r
869 public static String getDatabaseVersion() {
\r
870 settings.beginGroup("General");
\r
871 String val = (String)settings.value("databaseVersion", "0.70");
\r
872 settings.endGroup();
\r
875 public static String getDatabaseUrl() {
\r
876 settings.beginGroup("General");
\r
877 String val = (String)settings.value("DatabaseURL", "");
\r
878 settings.endGroup();
\r
879 if (val.equals(""))
\r
880 val = "jdbc:h2:"+Global.getDirectoryPath() +File.separator +"db" +File.separator +Global.databaseName;
\r
883 public static String getDatabaseUserid() {
\r
884 settings.beginGroup("General");
\r
885 String val = (String)settings.value("databaseUserid", "");
\r
886 settings.endGroup();
\r
889 public static String getDatabaseUserPassword() {
\r
890 settings.beginGroup("General");
\r
891 String val = (String)settings.value("databaseUserPassword", "");
\r
892 settings.endGroup();
\r
895 public static void setStyle(String style) {
\r
896 settings.beginGroup("General");
\r
897 settings.setValue("style", style);
\r
898 settings.endGroup();
\r
900 public static String getStyle() {
\r
901 settings.beginGroup("General");
\r
902 String val = (String)settings.value("style", "");
\r
903 settings.endGroup();
\r
906 public static boolean useStandardPalette() {
\r
907 settings.beginGroup("General");
\r
908 String text = (String)settings.value("standardPalette", "true");
\r
909 settings.endGroup();
\r
910 if (text.equalsIgnoreCase("true"))
\r
915 public static void setStandardPalette(boolean val) {
\r
916 settings.beginGroup("General");
\r
918 settings.setValue("standardPalette", "true");
\r
920 settings.setValue("standardPalette", "false");
\r
921 settings.endGroup();
\r
924 public static void dbWait() {
\r
925 // Global.dbThreadWait.wait(Global.dbThreadWaitMutex);
\r
927 public static void dbContinue() {
\r
928 // Global.dbThreadWait.wakeAll();
\r
930 public static synchronized void dbClientWait(int id) {
\r
931 if (id == mainThreadId) {
\r
932 try {mainThreadWaiter.take(); } catch (InterruptedException e) {e.printStackTrace();}
\r
934 if (id == syncThreadId) {
\r
935 try {syncThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}
\r
937 if (id == tagCounterThreadId) {
\r
938 try {tagCounterThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}
\r
940 if (id == trashCounterThreadId) {
\r
941 try {trashCounterThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}
\r
943 if (id == indexThreadId) {
\r
944 try {indexThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}
\r
946 if (id == saveThreadId) {
\r
947 try {saveThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}
\r
949 if (id == notebookCounterThreadId) {
\r
950 try {notebookCounterThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}
\r
952 if (id == indexThread03Id) {
\r
953 try {indexThread03ThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}
\r
955 if (id == indexThread04Id) {
\r
956 try {indexThread04ThreadWaiter.take();} catch (InterruptedException e) {e.printStackTrace();}
\r
959 public static void dbClientContinue(int id) {
\r
960 if (id == mainThreadId) {
\r
961 try { mainThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}
\r
963 if (id == syncThreadId) {
\r
964 try { syncThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}
\r
966 if (id == tagCounterThreadId) {
\r
967 try { tagCounterThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}
\r
969 if (id == trashCounterThreadId) {
\r
970 try { trashCounterThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}
\r
972 if (id == indexThreadId) {
\r
973 try { indexThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}
\r
975 if (id == saveThreadId) {
\r
976 try { saveThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}
\r
978 if (id == notebookCounterThreadId) {
\r
979 try { notebookCounterThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}
\r
981 if (id == indexThread03Id) {
\r
982 try { indexThread03ThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}
\r
984 if (id == indexThread04Id) {
\r
985 try { indexThread04ThreadWaiter.put(true); } catch (InterruptedException e) { e.printStackTrace();}
\r
989 public static void saveState(String name, QByteArray state) {
\r
990 settings.beginGroup("SaveState");
\r
991 settings.setValue(name, state);
\r
992 settings.endGroup();
\r
995 public static QByteArray restoreState(String name) {
\r
996 settings.beginGroup("SaveState");
\r
997 QByteArray state = (QByteArray)settings.value(name);
\r
998 settings.endGroup();
\r
1001 public static void saveGeometry(String name, QByteArray state) {
\r
1002 settings.beginGroup("SaveGeometry");
\r
1003 settings.setValue(name, state);
\r
1004 settings.endGroup();
\r
1007 public static QByteArray restoreGeometry(String name) {
\r
1008 settings.beginGroup("SaveGeometry");
\r
1009 QByteArray state = (QByteArray)settings.value(name);
\r
1010 settings.endGroup();
\r
1014 public static void setAutoSaveInterval(int interval) {
\r
1015 settings.beginGroup("General");
\r
1016 settings.setValue("autoSaveInterval", interval);
\r
1017 settings.endGroup();
\r
1019 public static int getAutoSaveInterval() {
\r
1020 settings.beginGroup("General");
\r
1023 String val = (String)settings.value("autoSaveInterval", "5");
\r
1024 value = new Integer(val.trim());
\r
1025 } catch (Exception e) {
\r
1027 value = (Integer)settings.value("autoSaveInterval", 5);
\r
1028 } catch (Exception e1) {
\r
1032 settings.endGroup();
\r
1036 // Add invalid attributes
\r
1037 public static void addInvalidAttribute(String element, String attribute) {
\r
1039 List<String> attributes = invalidAttributes.get(element);
\r
1040 if (attributes != null) {
\r
1041 for (int i=0; i<attributes.size(); i++)
\r
1042 if (attribute.equalsIgnoreCase(attributes.get(i))) {
\r
1047 ArrayList<String> attributeList;
\r
1048 if (!invalidAttributes.containsKey(element)) {
\r
1049 attributeList = new ArrayList<String>();
\r
1050 attributeList.add(attribute);
\r
1051 invalidAttributes.put(element, attributeList);
\r
1054 attributeList = invalidAttributes.get(element);
\r
1055 attributeList.add(attribute);
\r
1056 invalidAttributes.put(element,attributeList);
\r
1061 // Add invalid attributes
\r
1062 public static void addInvalidElement(String element) {
\r
1063 for (int i=0; i<invalidElements.size(); i++) {
\r
1064 if (element.equalsIgnoreCase(invalidElements.get(i)))
\r
1067 invalidElements.add(element);
\r
1070 // Convert a byte array to a hex string
\r
1071 public static String byteArrayToHexString(byte data[]) {
\r
1072 StringBuffer buf = new StringBuffer();
\r
1073 for (byte element : data) {
\r
1074 int halfbyte = (element >>> 4) & 0x0F;
\r
1075 int two_halfs = 0;
\r
1077 if ((0 <= halfbyte) && (halfbyte <= 9))
\r
1078 buf.append((char) ('0' + halfbyte));
\r
1080 buf.append((char) ('a' + (halfbyte - 10)));
\r
1081 halfbyte = element & 0x0F;
\r
1082 } while(two_halfs++ < 1);
\r
1084 return buf.toString();
\r
1088 // What to do with inactive tags?
\r
1089 public static String tagBehavior() {
\r
1090 settings.beginGroup("General");
\r
1091 String text = (String)settings.value("tagBehavior", "DoNothing");
\r
1092 settings.endGroup();
\r
1095 // What to do with inactive tags?
\r
1096 public static void setTagBehavior(String value) {
\r
1097 settings.beginGroup("General");
\r
1098 settings.setValue("tagBehavior", value);
\r
1099 settings.endGroup();
\r
1103 // Print date/time. Used mainly for performance tracing
\r
1104 public static void trace(boolean resetInterval) {
\r
1105 String fmt = "MM/dd/yy HH:mm:ss.SSSSSS";
\r
1106 String dateTimeFormat = new String(fmt);
\r
1107 SimpleDateFormat simple = new SimpleDateFormat(dateTimeFormat);
\r
1108 Calendar cal = Calendar.getInstance();
\r
1109 if (intervalTraceTime == null)
\r
1110 intervalTraceTime = Calendar.getInstance();
\r
1111 if (startTraceTime == null)
\r
1112 startTraceTime = Calendar.getInstance();
\r
1114 float interval = (cal.getTimeInMillis() - intervalTraceTime.getTimeInMillis());
\r
1115 float total = (cal.getTimeInMillis() - startTraceTime.getTimeInMillis());
\r
1117 // if (interval > 00.0) {
\r
1118 StackTraceElement[] exceptions = Thread.currentThread().getStackTrace();
\r
1119 System.out.println("------------------------------------------");
\r
1121 System.out.println("Date/Time " +simple.format(cal.getTime()));
\r
1122 System.out.format("Interval Time: %-10.6f%n", interval);
\r
1123 System.out.format("Total Time: %-10.6f%n", total);
\r
1124 for (int i=2; i<5 && i<exceptions.length; i++) {
\r
1125 System.out.println(exceptions[i]);
\r
1128 if (resetInterval)
\r
1129 intervalTraceTime = cal;
\r
1131 public static void traceReset() {
\r
1132 intervalTraceTime = null;
\r
1133 startTraceTime = null;
\r