2 * This file is part of NixNote
\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.ByteArrayInputStream;
\r
24 import java.io.ByteArrayOutputStream;
\r
25 import java.io.IOException;
\r
26 import java.io.ObjectInputStream;
\r
27 import java.io.ObjectOutputStream;
\r
28 import java.text.SimpleDateFormat;
\r
29 import java.util.ArrayList;
\r
30 import java.util.Calendar;
\r
31 import java.util.HashMap;
\r
32 import java.util.List;
\r
34 import org.apache.commons.lang3.StringEscapeUtils;
\r
36 import com.evernote.edam.type.Accounting;
\r
37 import com.evernote.edam.type.PrivilegeLevel;
\r
38 import com.evernote.edam.type.User;
\r
39 import com.evernote.edam.type.UserAttributes;
\r
40 import com.swabunga.spell.engine.Configuration;
\r
41 import com.trolltech.qt.core.QByteArray;
\r
42 import com.trolltech.qt.core.QSettings;
\r
43 import com.trolltech.qt.core.QSize;
\r
44 import com.trolltech.qt.gui.QPalette;
\r
45 import com.trolltech.qt.gui.QSystemTrayIcon;
\r
47 import cx.fbn.nevernote.config.FileManager;
\r
48 import cx.fbn.nevernote.config.InitializationException;
\r
49 import cx.fbn.nevernote.config.StartupConfig;
\r
50 import cx.fbn.nevernote.gui.ContainsAttributeFilterTable;
\r
51 import cx.fbn.nevernote.gui.DateAttributeFilterTable;
\r
52 import cx.fbn.nevernote.gui.ShortcutKeys;
\r
53 import cx.fbn.nevernote.utilities.ApplicationLogger;
\r
54 import cx.fbn.nevernote.utilities.Pair;
\r
57 //*****************************************************
\r
58 //*****************************************************
\r
59 //* Global constants & static functions used by
\r
60 //* multiple threads.
\r
61 //*****************************************************
\r
62 //*****************************************************
\r
64 public class Global {
\r
65 // Set current version and the known versions.
\r
66 public static String version = "1.2";
\r
67 public static String[] validVersions = {"1.2", "1.1", "1.0", "0.99", "0.98", "0.97", "0.96"};
\r
68 public static String username = "";
\r
69 public static String password = "";
\r
72 // Each thread has an ID. This is used primarily to check the status
\r
73 // of running threads.
\r
74 public static final int mainThreadId=0;
\r
75 public static final int syncThreadId=1;
\r
76 public static final int tagCounterThreadId=2;
\r
77 public static final int trashCounterThreadId=3; // This should always be the highest thread ID
\r
78 public static final int indexThreadId=4; // Thread for indexing words
\r
79 public static final int saveThreadId=5; // Thread used for processing data to saving content
\r
80 public static final int notebookCounterThreadId=6; // Notebook Thread
\r
81 public static final int indexThread03Id=7; // unused
\r
82 public static final int indexThread04Id=8; // unused
\r
83 public static final int dbThreadId=9; // This should always be the highest thread ID
\r
84 public static final int threadCount = 10;
\r
87 // These variables deal with where the list of notes appears
\r
88 // They will either be vertical (View_List_Narrow) or will be
\r
89 // on top of the note (View_List_Wide). It also has the size of
\r
90 // thumbnails displayed in each view
\r
91 public static int View_List_Wide = 1;
\r
92 public static int View_List_Narrow = 2;
\r
93 public static QSize smallThumbnailSize = new QSize(100,75);
\r
94 public static QSize largeThumbnailSize = new QSize(300,225);
\r
96 // This is used to keep a running list of passwords that the user
\r
97 // wants us to remember.
\r
98 public static HashMap<String,Pair<String,String>> passwordSafe = new HashMap<String, Pair<String,String>>();
\r
99 public static List<Pair<String,String>> passwordRemember = new ArrayList<Pair<String,String>>();
\r
102 //public static String currentNotebookGuid;
\r
104 // These deal with Evernote user settings
\r
105 public static User user;
\r
106 public static long authTimeRemaining;
\r
107 public static long authRefreshTime;
\r
108 public static long failedRefreshes = 0;
\r
109 public static String userStoreUrl;
\r
110 public static String noteStoreUrl;
\r
111 public static String noteStoreUrlBase;
\r
113 // When we want to shut down we set this to true to short
\r
114 // circut other threads
\r
115 public static boolean keepRunning;
\r
117 // In the note list, these are the column numbers
\r
118 // so I don't need to hard code numbers.
\r
119 public static int noteTableCreationPosition = 0;
\r
120 public static int noteTableTitlePosition = 1;
\r
121 public static int noteTableTagPosition = 2;
\r
122 public static int noteTableNotebookPosition = 3;
\r
123 public static int noteTableChangedPosition = 4;
\r
124 public static int noteTableGuidPosition = 5;
\r
125 public static int noteTableAuthorPosition = 6;
\r
126 public static int noteTableSourceUrlPosition = 7;
\r
127 public static int noteTableSubjectDatePosition = 8;
\r
128 public static int noteTableSynchronizedPosition = 9;
\r
129 public static int noteTableThumbnailPosition = 10;
\r
130 public static int noteTablePinnedPosition = 11;
\r
131 public static int noteTableColumnCount = 12;
\r
132 public static Integer cryptCounter = 0;
\r
134 //public static int minimumWordCount = 2;
\r
136 // Regular expression to parse text with when indexing
\r
137 private static String wordRegex;
\r
139 // Experimental fixes. Set via Edit/Preferences/Debugging
\r
140 public static boolean enableCarriageReturnFix = false;
\r
141 public static boolean enableHTMLEntitiesFix = false;
\r
143 // Used to set & retrieve ini & Windows registry settings
\r
144 public static QSettings settings; // Set & get ini settings
\r
145 public static boolean isConnected; // Are we connected to Evernote
\r
146 public static boolean showDeleted = false; // Show deleted notes?
\r
147 public static boolean disableUploads = false; // Should we disable uploads (used in testing features)
\r
148 public static int messageLevel; // The level of messages to write to the log files
\r
149 public static String tagDelimeter = ","; // This is used to separate out tag names when entering above note
\r
150 public static String attachmentNameDelimeter = "------"; // Used to separate out attachment names in the res directory
\r
153 //* Database fields
\r
154 public static String databaseName = new String("NeverNote"); // database name. used for multiple databases to separate settings.
\r
155 public static String indexDatabaseName = new String("Index"); // searchable words database
\r
156 public static String resourceDatabaseName = new String("Resources"); // attachments database
\r
157 public static DateAttributeFilterTable createdSinceFilter;
\r
158 public static DateAttributeFilterTable createdBeforeFilter;
\r
159 public static DateAttributeFilterTable changedSinceFilter;
\r
160 public static DateAttributeFilterTable changedBeforeFilter;
\r
161 public static ContainsAttributeFilterTable containsFilter;
\r
163 // Log file used for debugging
\r
164 public static ApplicationLogger logger;
\r
165 //PrintStream stdoutStream;
\r
167 // Application key shortcuts & appearance
\r
168 public static QPalette originalPalette;
\r
169 public static ShortcutKeys shortcutKeys;
\r
171 public static boolean disableViewing; // used to disable the editor
\r
173 // When saving a note, this is a list of things we strip out because Evernote hates them
\r
174 public static List<String> invalidElements = new ArrayList<String>();
\r
175 public static HashMap<String, ArrayList<String>> invalidAttributes = new HashMap<String, ArrayList<String>>();
\r
177 public static boolean mimicEvernoteInterface; // Try to mimic Evernote or allow multiple notebook selection
\r
178 public static HashMap<String,String> resourceMap; // List of attachments for a note.
\r
179 public static String cipherPassword = ""; // If the database is encrypted, this stores the password
\r
180 public static String databaseCache = "16384"; // Default DB cache size
\r
182 // These are used for performance testing
\r
183 static Calendar startTraceTime;
\r
184 static Calendar intervalTraceTime;
\r
186 static boolean syncOnly;
\r
188 private static FileManager fileManager; // Used to access files & directories
\r
190 // Do initial setup
\r
191 public static void setup(StartupConfig startupConfig) throws InitializationException {
\r
192 settings = new QSettings("fbn.cx", startupConfig.getName());
\r
193 disableViewing = startupConfig.getDisableViewing();
\r
194 syncOnly = startupConfig.isSyncOnly();
\r
196 fileManager = new FileManager(startupConfig.getHomeDirPath(), startupConfig.getProgramDirPath());
\r
199 getServer(); // Setup URL to connect to
\r
201 // Get regular expressions used to parse out words
\r
202 settings.beginGroup("General");
\r
203 String regex = (String) settings.value("regex", "[,\\s]+");
\r
204 setWordRegex(regex);
\r
205 settings.endGroup();
\r
207 //Setup debugging information
\r
208 settings.beginGroup("Debug");
\r
209 String msglevel = (String) settings.value("messageLevel", "Low");
\r
210 settings.endGroup();
\r
213 //messageLevel = 1;
\r
214 setMessageLevel(msglevel);
\r
215 keepRunning = true; // Make sure child threads stay running
\r
216 disableUploads = disableUploads(); // Should we upload anything? Normally true.
\r
217 enableCarriageReturnFix = enableCarriageReturnFix(); // Enable test fix?
\r
218 enableHTMLEntitiesFix = enableHtmlEntitiesFix(); // Enable test fix?
\r
220 logger = new ApplicationLogger("global.log"); // Setup log for this class
\r
221 shortcutKeys = new ShortcutKeys(); // Setup keyboard shortcuts.
\r
222 mimicEvernoteInterface = getMimicEvernoteInterface(); // Should we mimic Evernote's notebook behavior
\r
223 resourceMap = new HashMap<String,String>(); // Setup resource map used to store attachments when editing
\r
225 databaseCache = getDatabaseCacheSize(); // Set database cache size
\r
228 // Get/Set word parsing regular expression
\r
229 public static String getWordRegex() {
\r
232 public static void setWordRegex(String r) {
\r
236 // Set the debug message level
\r
237 public static void setMessageLevel(String msglevel) {
\r
238 if (msglevel.equalsIgnoreCase("low"))
\r
240 if (msglevel.equalsIgnoreCase("medium"))
\r
242 if (msglevel.equalsIgnoreCase("high"))
\r
244 if (msglevel.equalsIgnoreCase("extreme"))
\r
246 settings.beginGroup("Debug");
\r
247 settings.setValue("messageLevel", msglevel);
\r
248 settings.endGroup();
\r
251 //****************************************************
\r
252 //****************************************************
\r
253 //** Save user account information from Evernote
\r
254 //****************************************************
\r
255 //****************************************************
\r
256 public static void saveUserInformation(User user) {
\r
257 settings.beginGroup("User");
\r
258 settings.setValue("id", user.getId());
\r
259 settings.setValue("username", user.getUsername());
\r
260 settings.setValue("email", user.getEmail());
\r
261 settings.setValue("name", user.getName());
\r
262 settings.setValue("timezone", user.getTimezone());
\r
263 settings.setValue("privilege", user.getPrivilege().getValue());
\r
264 settings.setValue("created", user.getCreated());
\r
265 settings.setValue("updated", user.getUpdated());
\r
266 settings.setValue("deleted", user.getDeleted());
\r
267 settings.setValue("shard", user.getShardId());
\r
268 settings.endGroup();
\r
270 if (user.getAttributes()!=null)
\r
271 saveUserAttributes(user.getAttributes());
\r
272 if (user.getAccounting()!=null)
\r
273 saveUserAccounting(user.getAccounting());
\r
276 public static User getUserInformation() {
\r
277 User user = new User();
\r
278 settings.beginGroup("User");
\r
280 user.setId((Integer)settings.value("id", 0));
\r
281 } catch (java.lang.ClassCastException e) {
\r
282 user.setId(new Integer((String)settings.value("id", "0")));
\r
284 String username = (String)settings.value("username", "");
\r
285 String email = (String)settings.value("email", "");
\r
286 String name = (String)settings.value("name", "");
\r
287 String timezone = (String)settings.value("timezone", "");
\r
288 Integer privilege = 0;
\r
290 privilege = new Integer((String)settings.value("privilege", "0"));
\r
291 } catch (java.lang.ClassCastException e) {
\r
292 privilege = (Integer)settings.value("privilege", 0);
\r
296 String date = (String)settings.value("created", "0");
\r
297 user.setCreated(new Long(date));
\r
298 date = (String)settings.value("updated", "0");
\r
299 user.setUpdated(new Long(date));
\r
300 date = (String)settings.value("deleted", "0");
\r
301 user.setDeleted(new Long(date));
\r
302 } catch (java.lang.ClassCastException e) {
\r
303 Long date = (Long)settings.value("created", 0);
\r
304 user.setCreated(date);
\r
305 date = (Long)settings.value("updated", 0);
\r
306 user.setUpdated(date);
\r
307 date = (Long)settings.value("deleted", 0);
\r
308 user.setDeleted(date);
\r
311 String shard = (String)settings.value("shard", "");
\r
312 settings.endGroup();
\r
314 user.setUsername(username);
\r
315 user.setEmail(email);
\r
316 user.setName(name);
\r
317 user.setTimezone(timezone);
\r
318 PrivilegeLevel userLevel = PrivilegeLevel.findByValue(privilege);
\r
319 user.setPrivilege(userLevel);
\r
320 user.setShardId(shard);
\r
324 public static void saveUserAttributes(UserAttributes attrib) {
\r
325 settings.beginGroup("UserAttributes");
\r
326 settings.setValue("defaultLocationName", attrib.getDefaultLocationName());
\r
327 settings.setValue("defaultLatitude", attrib.getDefaultLocationName());
\r
328 settings.setValue("defaultLongitude", attrib.getDefaultLocationName());
\r
329 settings.setValue("incomingEmailAddress", attrib.getIncomingEmailAddress());
\r
330 settings.endGroup();
\r
332 public static UserAttributes getUserAttributes() {
\r
333 settings.beginGroup("UserAttributes");
\r
334 UserAttributes attrib = new UserAttributes();
\r
335 attrib.setDefaultLocationName((String)settings.value("defaultLocationName",""));
\r
336 attrib.setDefaultLatitudeIsSet(false);
\r
337 attrib.setDefaultLongitudeIsSet(false);
\r
338 attrib.setIncomingEmailAddress((String)settings.value("incomingEmailAddress", ""));
\r
339 settings.endGroup();
\r
342 public static void saveUserAccounting(Accounting acc) {
\r
343 settings.beginGroup("UserAccounting");
\r
344 settings.setValue("uploadLimit", acc.getUploadLimit());
\r
345 settings.setValue("uploadLimitEnd", acc.getUploadLimitEnd());
\r
346 settings.setValue("uploadLimitNextMonth", acc.getUploadLimitNextMonth());
\r
347 settings.setValue("premiumServiceStart", acc.getPremiumServiceStart());
\r
348 settings.setValue("nextPaymentDue", acc.getNextPaymentDue());
\r
349 settings.setValue("uploadAmount", acc.getUpdated());
\r
350 settings.endGroup();
\r
352 public static long getUploadLimitEnd() {
\r
354 settings.beginGroup("UserAccounting");
\r
358 String val = (String)settings.value("uploadLimitEnd", "0");
\r
359 limit = new Long(val.trim());
\r
360 } catch (Exception e) {
\r
362 limit = (Long)settings.value("uploadLimitEnd", 0);
\r
363 } catch (Exception e1) {
\r
364 limit = new Long(0);
\r
369 settings.endGroup();
\r
372 public static void saveUploadAmount(long amount) {
\r
373 settings.beginGroup("UserAccounting");
\r
374 settings.setValue("uploadAmount", amount);
\r
375 settings.endGroup();
\r
377 public static long getUploadAmount() {
\r
379 settings.beginGroup("UserAccounting");
\r
381 String num = (String)settings.value("uploadAmount", "0");
\r
382 amt = new Long(num.trim());
\r
383 } catch (Exception e) {
\r
385 amt = (Integer)settings.value("uploadAmount", 0);
\r
386 } catch (Exception e1) {
\r
390 settings.endGroup();
\r
393 public static void saveEvernoteUpdateCount(long amount) {
\r
394 settings.beginGroup("UserAccounting");
\r
395 settings.setValue("updateCount", amount);
\r
396 settings.endGroup();
\r
398 public static long getEvernoteUpdateCount() {
\r
400 settings.beginGroup("UserAccounting");
\r
402 String num = (String)settings.value("updateCount", new Long(0).toString());
\r
403 amt = new Long(num.trim());
\r
404 } catch (java.lang.ClassCastException e) {
\r
407 settings.endGroup();
\r
410 public static boolean isPremium() {
\r
412 settings.beginGroup("User");
\r
414 String num = (String)settings.value("privilege", "1");
\r
415 level = new Integer(num.trim());
\r
416 } catch (java.lang.ClassCastException e) {
\r
418 level = (Integer)settings.value("privilege", 1);
\r
419 } catch (Exception e1) {
\r
423 settings.endGroup();
\r
424 PrivilegeLevel userLevel = PrivilegeLevel.findByValue(level);
\r
425 if (userLevel == PrivilegeLevel.NORMAL)
\r
430 public static long getUploadLimit() {
\r
431 settings.beginGroup("UserAccounting");
\r
434 String num = (String)settings.value("uploadLimit", new Long(0).toString());
\r
435 limit = new Long(num.trim());
\r
436 } catch (java.lang.ClassCastException e) {
\r
439 settings.endGroup();
\r
445 //****************************************************
\r
446 //****************************************************
\r
447 //** View settings. Used to restore settings
\r
448 //** when starting and to control how the program
\r
450 //****************************************************
\r
451 //****************************************************
\r
453 //* Get/Set if we should show a tray icon
\r
454 public static boolean showTrayIcon() {
\r
455 settings.beginGroup("General");
\r
457 String max = (String) settings.value("showTrayIcon", "false");
\r
458 settings.endGroup();
\r
459 if (!max.equalsIgnoreCase("true") || !QSystemTrayIcon.isSystemTrayAvailable())
\r
463 } catch (java.lang.ClassCastException e) {
\r
464 Boolean value = (Boolean) settings.value("showTrayIcon", false);
\r
465 settings.endGroup();
\r
469 public static void setShowTrayIcon(boolean val) {
\r
470 settings.beginGroup("General");
\r
472 settings.setValue("showTrayIcon", "true");
\r
474 settings.setValue("showTrayIcon", "false");
\r
475 settings.endGroup();
\r
478 // Get/Set window maximized when closed last
\r
479 public static boolean wasWindowMaximized() {
\r
481 settings.beginGroup("General");
\r
482 String max = (String) settings.value("isMaximized", "true");
\r
483 settings.endGroup();
\r
484 if (!max.equalsIgnoreCase("true"))
\r
487 } catch (java.lang.ClassCastException e) {
\r
488 Boolean value = (Boolean) settings.value("isMaximized", true);
\r
489 settings.endGroup();
\r
493 public static void saveWindowMaximized(boolean isMax) {
\r
494 settings.beginGroup("General");
\r
496 settings.setValue("isMaximized", "true");
\r
498 settings.setValue("isMaximized", "false");
\r
499 settings.endGroup();
\r
502 // Get/set currently viewed note Guid
\r
503 public static String getLastViewedNoteGuid() {
\r
504 settings.beginGroup("General");
\r
505 String guid = (String) settings.value("lastViewedNote", "");
\r
506 settings.endGroup();
\r
509 public static void saveCurrentNoteGuid(String guid) {
\r
510 settings.beginGroup("General");
\r
512 settings.setValue("lastViewedNote", guid);
\r
514 settings.setValue("lastViewedNote", "");
\r
515 settings.endGroup();
\r
518 // Get/Set the note column we are sorted on and the order
\r
519 public static void setSortColumn(int i) {
\r
520 int view = Global.getListView();
\r
521 settings.beginGroup("General");
\r
522 if (view == Global.View_List_Wide)
\r
523 settings.setValue("sortColumn", i);
\r
525 settings.setValue("sortColumn-Narrow", i);
\r
526 settings.endGroup();
\r
528 public static int getSortColumn() {;
\r
530 if (Global.getListView() == Global.View_List_Wide)
\r
531 key = "sortColumn";
\r
533 key = "sortColumn-Narrow";
\r
535 settings.beginGroup("General");
\r
538 String val = settings.value(key, new Integer(0)).toString();
\r
539 order = new Integer(val.trim());
\r
540 } catch (Exception e) {
\r
542 order = (Integer)settings.value(key, 0);
\r
543 } catch (Exception e1) {
\r
548 settings.endGroup();
\r
551 public static void setSortOrder(int i) {
\r
552 int view = Global.getListView();
\r
553 settings.beginGroup("General");
\r
554 if (view == Global.View_List_Wide)
\r
555 settings.setValue("sortOrder", i);
\r
557 settings.setValue("sortOrder-Narrow", i);
\r
558 settings.endGroup();
\r
560 public static int getSortOrder() {
\r
561 int view = Global.getListView();
\r
562 settings.beginGroup("General");
\r
564 if (view == Global.View_List_Wide)
\r
567 key = "sortOrder-Narrow";
\r
571 String val = settings.value(key, new Integer(0)).toString();
\r
572 order = new Integer(val.trim());
\r
573 } catch (Exception e) {
\r
575 order = (Integer)settings.value(key, 0);
\r
576 } catch (Exception e1) {
\r
581 settings.endGroup();
\r
585 // Should we automatically log in to Evernote when starting?
\r
586 public static boolean automaticLogin() {
\r
588 settings.beginGroup("General");
\r
589 String text = (String)settings.value("automaticLogin", "false");
\r
590 settings.endGroup();
\r
591 if (text.equalsIgnoreCase("true"))
\r
595 } catch (java.lang.ClassCastException e) {
\r
596 Boolean value = (Boolean) settings.value("automaticLogin", false);
\r
597 settings.endGroup();
\r
601 public static void setAutomaticLogin(boolean val) {
\r
602 settings.beginGroup("General");
\r
604 settings.setValue("automaticLogin", "true");
\r
606 settings.setValue("automaticLogin", "false");
\r
607 settings.endGroup();
\r
610 // Should it save the Evernote password?
\r
611 public static boolean rememberPassword() {
\r
613 settings.beginGroup("General");
\r
614 String text = (String)settings.value("rememberPassword", "false");
\r
615 settings.endGroup();
\r
616 if (text.equalsIgnoreCase("true"))
\r
620 } catch (java.lang.ClassCastException e) {
\r
621 Boolean value = (Boolean) settings.value("rememberPassword", false);
\r
622 settings.endGroup();
\r
626 public static void setRememberPassword(boolean val) {
\r
627 settings.beginGroup("General");
\r
629 settings.setValue("rememberPassword", "true");
\r
631 settings.setValue("rememberPassword", "false");
\r
632 settings.endGroup();
\r
635 // Get/set the Evernote server Url.
\r
636 public static void setServer(String server) {
\r
637 settings.beginGroup("General");
\r
638 settings.setValue("server", server);
\r
639 settings.endGroup();
\r
641 public static String getServer() {
\r
642 settings.beginGroup("General");
\r
643 String text = (String)settings.value("server", "www.evernote.com");
\r
644 if (text.equals("www.evernote.com")) {
\r
645 userStoreUrl = "https://www.evernote.com/edam/user";
\r
646 noteStoreUrlBase = "www.evernote.com/edam/note/";
\r
648 userStoreUrl = "https://sandbox.evernote.com/edam/user";
\r
649 noteStoreUrlBase = "sandbox.evernote.com/edam/note/";
\r
651 settings.endGroup();
\r
652 // if (isPremium())
\r
653 noteStoreUrlBase = "https://" + noteStoreUrlBase;
\r
655 // noteStoreUrlBase = "http://" + noteStoreUrlBase;
\r
659 // Get/Set if we should disable uploads to Evernote
\r
660 public static boolean disableUploads() {
\r
661 settings.beginGroup("General");
\r
663 String text = (String)settings.value("disableUploads", "false");
\r
664 settings.endGroup();
\r
665 if (text.equalsIgnoreCase("true"))
\r
669 } catch (java.lang.ClassCastException e) {
\r
670 Boolean value = (Boolean) settings.value("disableUploads", false);
\r
671 settings.endGroup();
\r
675 public static void setDisableUploads(boolean val) {
\r
676 settings.beginGroup("General");
\r
678 settings.setValue("disableUploads", "true");
\r
680 settings.setValue("disableUploads", "false");
\r
681 settings.endGroup();
\r
682 disableUploads = val;
\r
685 // Should we view PDF documents inline?
\r
686 public static boolean pdfPreview() {
\r
687 settings.beginGroup("General");
\r
689 String text = (String)settings.value("pdfPreview", "true");
\r
690 settings.endGroup();
\r
691 if (text.equalsIgnoreCase("true"))
\r
695 } catch (java.lang.ClassCastException e) {
\r
696 Boolean value = (Boolean) settings.value("pdfPreview", true);
\r
697 settings.endGroup();
\r
701 public static void setPdfPreview(boolean val) {
\r
702 settings.beginGroup("General");
\r
704 settings.setValue("pdfPreview", "true");
\r
706 settings.setValue("pdfPreview", "false");
\r
707 settings.endGroup();
\r
710 // When creating a new note, should it inherit tags that are currently selected?
\r
711 public static boolean newNoteWithSelectedTags() {
\r
712 settings.beginGroup("General");
\r
714 String text = (String)settings.value("newNoteWithSelectedTags", "false");
\r
715 settings.endGroup();
\r
716 if (text.equalsIgnoreCase("true"))
\r
720 } catch (java.lang.ClassCastException e) {
\r
721 Boolean value = (Boolean) settings.value("newNoteWithSelectedTags", false);
\r
722 settings.endGroup();
\r
726 public static void setNewNoteWithSelectedTags(boolean val) {
\r
727 settings.beginGroup("General");
\r
729 settings.setValue("newNoteWithSelectedTags", "true");
\r
731 settings.setValue("newNoteWithSelectedTags", "false");
\r
732 settings.endGroup();
\r
735 // Minimum weight for text OCRed from Evernote. Anything below this
\r
736 // Won't be shown to the user when they search
\r
737 public static void setRecognitionWeight(int len) {
\r
738 settings.beginGroup("General");
\r
739 settings.setValue("recognitionWeight", len);
\r
740 settings.endGroup();
\r
742 public static int getRecognitionWeight() {
\r
743 settings.beginGroup("General");
\r
746 len = (Integer)settings.value("recognitionWeight", 30);
\r
747 } catch (Exception e) {
\r
750 settings.endGroup();
\r
754 // get/set current debug message level
\r
755 public static String getMessageLevel() {
\r
756 settings.beginGroup("Debug");
\r
757 String text = (String)settings.value("messageLevel", "Low");
\r
758 settings.endGroup();
\r
759 setMessageLevel(text);
\r
762 public static void setDateFormat(String format) {
\r
763 settings.beginGroup("General");
\r
764 settings.setValue("dateFormat", format);
\r
765 settings.endGroup();
\r
768 // Get/Set user date/time formats
\r
769 public static String getDateFormat() {
\r
770 settings.beginGroup("General");
\r
771 String text = (String)settings.value("dateFormat", "MM/dd/yyyy");
\r
772 settings.endGroup();
\r
775 public static void setTimeFormat(String format) {
\r
776 settings.beginGroup("General");
\r
777 settings.setValue("timeFormat", format);
\r
778 settings.endGroup();
\r
780 public static String getTimeFormat() {
\r
781 settings.beginGroup("General");
\r
782 String text = (String)settings.value("timeFormat", "HH:mm:ss");
\r
783 settings.endGroup();
\r
787 // How often should we sync with Evernote?
\r
788 public static String getSyncInterval() {
\r
789 settings.beginGroup("General");
\r
790 String text = (String)settings.value("syncInterval", "15 minutes");
\r
791 settings.endGroup();
\r
794 public static void setSyncInterval(String format) {
\r
795 settings.beginGroup("General");
\r
796 settings.setValue("syncInterval", format);
\r
797 settings.endGroup();
\r
800 // Get/Set the width of columns and their position for the
\r
802 public static void setColumnWidth(String col, int width) {
\r
803 if (Global.getListView() == Global.View_List_Wide)
\r
804 settings.beginGroup("ColumnWidths");
\r
806 settings.beginGroup("ColumnWidths-Narrow");
\r
807 settings.setValue(col, width);
\r
808 settings.endGroup();
\r
810 public static int getColumnWidth(String col) {
\r
811 int view = Global.getListView();
\r
812 if (view == Global.View_List_Wide)
\r
813 settings.beginGroup("ColumnWidths");
\r
815 settings.beginGroup("ColumnWidths-Narrow");
\r
818 String val = (String)settings.value(col, "0");
\r
819 width = new Integer(val.trim());
\r
820 } catch (Exception e) {
\r
822 width = (Integer)settings.value(col, 0);
\r
823 } catch (Exception e1) {
\r
827 settings.endGroup();
\r
830 public static void setColumnPosition(String col, int width) {
\r
831 if (Global.getListView() == Global.View_List_Wide)
\r
832 settings.beginGroup("ColumnPosition");
\r
834 settings.beginGroup("ColumnPosition-Narrow");
\r
835 settings.setValue(col, width);
\r
836 settings.endGroup();
\r
838 public static int getColumnPosition(String col) {
\r
839 if (Global.getListView() == Global.View_List_Wide)
\r
840 settings.beginGroup("ColumnPosition");
\r
842 settings.beginGroup("ColumnPosition-Narrow");
\r
845 String val = (String)settings.value(col, "-1");
\r
846 width = new Integer(val.trim());
\r
847 } catch (Exception e) {
\r
849 width = (Integer)settings.value(col, 0);
\r
850 } catch (Exception e1) {
\r
854 settings.endGroup();
\r
858 // Ping the user when they try to delete or just do it.
\r
859 public static boolean verifyDelete() {
\r
860 settings.beginGroup("General");
\r
862 String text = (String)settings.value("verifyDelete", "true");
\r
863 settings.endGroup();
\r
864 if (text.equalsIgnoreCase("true"))
\r
868 } catch (java.lang.ClassCastException e) {
\r
869 Boolean value = (Boolean) settings.value("verifyDelete", true);
\r
870 settings.endGroup();
\r
874 public static void setVerifyDelete(boolean val) {
\r
875 settings.beginGroup("General");
\r
877 settings.setValue("verifyDelete", "true");
\r
879 settings.setValue("verifyDelete", "false");
\r
880 settings.endGroup();
\r
883 // Should it start minimized?
\r
884 public static boolean startMinimized() {
\r
885 settings.beginGroup("General");
\r
887 String text = (String)settings.value("startMinimized", "false");
\r
888 settings.endGroup();
\r
889 if (text.equalsIgnoreCase("true"))
\r
893 } catch (java.lang.ClassCastException e) {
\r
894 Boolean value = (Boolean) settings.value("startMinimized", false);
\r
895 settings.endGroup();
\r
899 public static void setStartMinimized(boolean val) {
\r
900 settings.beginGroup("General");
\r
902 settings.setValue("startMinimized", "true");
\r
904 settings.setValue("startMinimized", "false");
\r
905 settings.endGroup();
\r
908 // Should we upload the content of any deleted notes
\r
909 public static boolean synchronizeDeletedContent() {
\r
910 settings.beginGroup("General");
\r
912 String text = (String)settings.value("syncDeletedContent", "false");
\r
913 settings.endGroup();
\r
914 if (text.equalsIgnoreCase("true"))
\r
918 } catch (java.lang.ClassCastException e) {
\r
919 Boolean value = (Boolean) settings.value("syncDeletedContent", false);
\r
920 settings.endGroup();
\r
924 public static void setSynchronizeDeletedContent(boolean val) {
\r
925 settings.beginGroup("General");
\r
927 settings.setValue("syncDeletedContent", "true");
\r
929 settings.setValue("syncDeletedContent", "false");
\r
930 settings.endGroup();
\r
933 // Is a section of the window visible? Used to hide things people don't
\r
935 public static boolean isWindowVisible(String window) {
\r
936 settings.beginGroup("WindowsVisible");
\r
938 String defaultValue = "true";
\r
939 if (window.equalsIgnoreCase("noteInformation"))
\r
940 defaultValue = "false";
\r
941 String text = (String)settings.value(window, defaultValue);
\r
942 settings.endGroup();
\r
943 if (text.equalsIgnoreCase("true"))
\r
947 } catch (java.lang.ClassCastException e) {
\r
948 boolean defaultValue = true;
\r
949 if (window.equalsIgnoreCase("noteInformation"))
\r
950 defaultValue = false;
\r
951 Boolean value = (Boolean) settings.value("showTrayIcon", defaultValue);
\r
952 settings.endGroup();
\r
956 public static void saveWindowVisible(String window, boolean val) {
\r
957 settings.beginGroup("WindowsVisible");
\r
959 settings.setValue(window, "true");
\r
961 settings.setValue(window, "false");
\r
962 settings.endGroup();
\r
965 // Is a list in the column in the note list visible?
\r
966 public static boolean isColumnVisible(String window) {
\r
967 String defaultValue = "true";
\r
968 int view = Global.getListView();
\r
969 if (Global.getListView() == Global.View_List_Wide)
\r
970 settings.beginGroup("ColumnsVisible");
\r
972 settings.beginGroup("ColumnsVisible-Narrow");
\r
973 if (window.equalsIgnoreCase("thumbnail") && view == Global.View_List_Wide)
\r
974 defaultValue = "false";
\r
975 if (window.equalsIgnoreCase("thumbnail"))
\r
976 defaultValue = "false";
\r
977 if (window.equalsIgnoreCase("Guid"))
\r
978 defaultValue = "false";
\r
980 String text = (String)settings.value(window, defaultValue);
\r
981 settings.endGroup();
\r
982 if (text.equalsIgnoreCase("true"))
\r
986 } catch (java.lang.ClassCastException e) {
\r
987 boolean defBool = false;
\r
988 if (window.equalsIgnoreCase("true"))
\r
992 Boolean value = (Boolean) settings.value(window, defBool);
\r
993 settings.endGroup();
\r
997 public static void saveColumnVisible(String column, boolean val) {
\r
998 if (Global.getListView() == Global.View_List_Wide)
\r
999 settings.beginGroup("ColumnsVisible");
\r
1001 settings.beginGroup("ColumnsVisible-Narrow");
\r
1003 settings.setValue(column, "true");
\r
1005 settings.setValue(column, "false");
\r
1006 settings.endGroup();
\r
1009 // Is a particular editor button visible?
\r
1010 public static boolean isEditorButtonVisible(String window) {
\r
1011 settings.beginGroup("EditorButtonsVisible");
\r
1013 String text = (String)settings.value(window, "true");
\r
1014 settings.endGroup();
\r
1015 if (text.equalsIgnoreCase("true"))
\r
1019 } catch (java.lang.ClassCastException e) {
\r
1020 Boolean value = (Boolean) settings.value(window, true);
\r
1021 settings.endGroup();
\r
1025 public static void saveEditorButtonsVisible(String column, boolean val) {
\r
1026 settings.beginGroup("EditorButtonsVisible");
\r
1028 settings.setValue(column, "true");
\r
1030 settings.setValue(column, "false");
\r
1031 settings.endGroup();
\r
1034 // Should the test fixes be enabled
\r
1035 public static boolean enableCarriageReturnFix() {
\r
1037 settings.beginGroup("Debug");
\r
1038 String text = (String)settings.value("enableCarriageReturnFix", "false");
\r
1039 settings.endGroup();
\r
1040 if (text.equalsIgnoreCase("true"))
\r
1044 } catch (java.lang.ClassCastException e) {
\r
1045 Boolean value = (Boolean) settings.value("enableCarriageReturnFix", false);
\r
1046 settings.endGroup();
\r
1050 public static void saveCarriageReturnFix(boolean val) {
\r
1051 settings.beginGroup("Debug");
\r
1053 settings.setValue("enableCarriageReturnFix", "true");
\r
1055 settings.setValue("enableCarriageReturnFix", "false");
\r
1056 settings.endGroup();
\r
1058 public static boolean enableHtmlEntitiesFix() {
\r
1060 settings.beginGroup("Debug");
\r
1061 String text = (String)settings.value("enableHtmlEntitiesFix", "false");
\r
1062 settings.endGroup();
\r
1063 if (text.equalsIgnoreCase("true"))
\r
1067 } catch (java.lang.ClassCastException e) {
\r
1068 Boolean value = (Boolean) settings.value("enableHtmlEntitiesFix", false);
\r
1069 settings.endGroup();
\r
1073 public static void saveHtmlEntitiesFix(boolean val) {
\r
1074 settings.beginGroup("Debug");
\r
1076 settings.setValue("enableHtmlEntitiesFix", "true");
\r
1078 settings.setValue("enableHtmlEntitiesFix", "false");
\r
1079 settings.endGroup();
\r
1082 // public static void setIndexThreads(int val) {
\r
1083 // settings.beginGroup("General");
\r
1084 // settings.setValue("indexThreads", val);
\r
1085 // settings.endGroup();
\r
1087 // public static int getIndexThreads() {
\r
1088 // settings.beginGroup("General");
\r
1089 // Integer threads;
\r
1091 // String val = (String)settings.value("indexThreads", "1");
\r
1092 // threads = new Integer(val.trim());
\r
1093 // } catch (Exception e) {
\r
1095 // threads = (Integer)settings.value("indexThreads", 1);
\r
1096 // } catch (Exception e1) {
\r
1100 // settings.endGroup();
\r
1102 // return threads;
\r
1104 // Get/Set text zoom factor
\r
1106 public static void setZoomFactor(double val) {
\r
1107 settings.beginGroup("General");
\r
1108 settings.setValue("zoomFactor", val);
\r
1109 settings.endGroup();
\r
1111 public static double getZoomFactor() {
\r
1112 settings.beginGroup("General");
\r
1115 String val = (String)settings.value("zoomFactor", "1.0");
\r
1116 threads = new Double(val.trim());
\r
1117 } catch (Exception e) {
\r
1119 threads = (Double)settings.value("zoomFactor", 1.0);
\r
1120 } catch (Exception e1) {
\r
1121 threads = new Double(1);
\r
1124 settings.endGroup();
\r
1127 public static void setTextSizeMultiplier(double val) {
\r
1128 settings.beginGroup("General");
\r
1129 settings.setValue("textMultiplier", val);
\r
1130 settings.endGroup();
\r
1132 public static double getTextSizeMultiplier() {
\r
1133 settings.beginGroup("General");
\r
1136 String val = (String)settings.value("textMultiplier", "1");
\r
1137 threads = new Double(val.trim());
\r
1138 } catch (Exception e) {
\r
1140 threads = (Double)settings.value("textMultiplier", 1);
\r
1141 } catch (Exception e1) {
\r
1142 threads = new Double(1);
\r
1145 settings.endGroup();
\r
1150 // Should we mimic Evernote and restrict the notebooks selected?
\r
1151 public static boolean getMimicEvernoteInterface() {
\r
1152 settings.beginGroup("General");
\r
1154 String text = (String)settings.value("mimicEvernoteInterface", "true");
\r
1155 settings.endGroup();
\r
1156 if (text.equalsIgnoreCase("true"))
\r
1160 } catch (java.lang.ClassCastException e) {
\r
1161 Boolean value = (Boolean) settings.value("mimicEvernoteInterface", true);
\r
1162 settings.endGroup();
\r
1166 public static void setMimicEvernoteInterface(boolean value) {
\r
1167 settings.beginGroup("General");
\r
1169 settings.setValue("mimicEvernoteInterface", "true");
\r
1171 settings.setValue("mimicEvernoteInterface", "false");
\r
1172 settings.endGroup();
\r
1176 // Synchronize with Evernote when closing?
\r
1177 public static boolean synchronizeOnClose() {
\r
1178 settings.beginGroup("General");
\r
1180 String text = (String)settings.value("synchronizeOnClose", "false");
\r
1181 settings.endGroup();
\r
1182 if (text.equalsIgnoreCase("true"))
\r
1186 } catch (java.lang.ClassCastException e) {
\r
1187 Boolean value = (Boolean) settings.value("synchronizeOnClose", false);
\r
1188 settings.endGroup();
\r
1192 public static void setSynchronizeOnClose(boolean val) {
\r
1193 settings.beginGroup("General");
\r
1195 settings.setValue("synchronizeOnClose", "true");
\r
1197 settings.setValue("synchronizeOnClose", "false");
\r
1198 settings.endGroup();
\r
1201 // Get/set the database version. Not really used any more, but kept
\r
1202 // for compatibility.
\r
1203 public static void setDatabaseVersion(String version) {
\r
1204 settings.beginGroup("General");
\r
1205 settings.setValue("databaseVersion", version);
\r
1206 settings.endGroup();
\r
1208 public static String getDatabaseVersion() {
\r
1209 settings.beginGroup("General");
\r
1210 String val = (String)settings.value("databaseVersion", "0.70");
\r
1211 settings.endGroup();
\r
1215 // Get the URL (full path) of the main database
\r
1216 public static String getDatabaseUrl() {
\r
1217 settings.beginGroup("General");
\r
1218 String val = (String)settings.value("DatabaseURL", "");
\r
1219 settings.endGroup();
\r
1220 if (val.equals(""))
\r
1221 val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.databaseName);
\r
1225 // get the url (full path) of the searchable word database
\r
1226 public static String getIndexDatabaseUrl() {
\r
1227 settings.beginGroup("General");
\r
1228 String val = (String)settings.value("IndexDatabaseURL", "");
\r
1229 settings.endGroup();
\r
1230 if (val.equals(""))
\r
1231 val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.indexDatabaseName);
\r
1235 // Get the url (full path) of the attachment database
\r
1236 public static String getResourceDatabaseUrl() {
\r
1237 settings.beginGroup("General");
\r
1238 String val = (String)settings.value("ResourceDatabaseURL", "");
\r
1239 settings.endGroup();
\r
1240 if (val.equals(""))
\r
1241 val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.resourceDatabaseName);
\r
1244 public static void setDatabaseUrl(String value) {
\r
1245 settings.beginGroup("General");
\r
1246 settings.setValue("DatabaseURL", value);
\r
1247 settings.endGroup();
\r
1249 public static void setIndexDatabaseUrl(String value) {
\r
1250 settings.beginGroup("General");
\r
1251 settings.setValue("IndexDatabaseURL", value);
\r
1252 settings.endGroup();
\r
1254 public static void setResourceDatabaseUrl(String value) {
\r
1255 settings.beginGroup("General");
\r
1256 settings.setValue("ResourceDatabaseURL", value);
\r
1257 settings.endGroup();
\r
1259 public static String getDatabaseUserid() {
\r
1260 settings.beginGroup("General");
\r
1261 String val = (String)settings.value("databaseUserid", "");
\r
1262 settings.endGroup();
\r
1265 public static String getDatabaseUserPassword() {
\r
1266 settings.beginGroup("General");
\r
1267 String val = (String)settings.value("databaseUserPassword", "");
\r
1268 settings.endGroup();
\r
1272 // get/Set the style sheet and the palette to control the look & feel
\r
1273 public static void setStyle(String style) {
\r
1274 settings.beginGroup("General");
\r
1275 settings.setValue("style", style);
\r
1276 settings.endGroup();
\r
1278 public static String getStyle() {
\r
1279 settings.beginGroup("General");
\r
1280 String val = (String)settings.value("style", "Cleanlooks");
\r
1281 settings.endGroup();
\r
1284 public static boolean useStandardPalette() {
\r
1285 settings.beginGroup("General");
\r
1287 String text = (String)settings.value("standardPalette", "true");
\r
1288 settings.endGroup();
\r
1289 if (text.equalsIgnoreCase("true"))
\r
1293 } catch (java.lang.ClassCastException e) {
\r
1294 Boolean value = (Boolean) settings.value("standardPalette", true);
\r
1295 settings.endGroup();
\r
1299 public static void setStandardPalette(boolean val) {
\r
1300 settings.beginGroup("General");
\r
1302 settings.setValue("standardPalette", "true");
\r
1304 settings.setValue("standardPalette", "false");
\r
1305 settings.endGroup();
\r
1308 // Set the amount of time to wait between indexing
\r
1309 // Get/Set interval when the index thread wakes up.
\r
1310 public static void setIndexThreadSleepInterval(int sleep) {
\r
1311 settings.beginGroup("General");
\r
1312 settings.setValue("IndexThreadSleepInterval", sleep);
\r
1313 settings.endGroup();
\r
1315 public static int getIndexThreadSleepInterval() {
\r
1316 settings.beginGroup("General");
\r
1319 String val = (String)settings.value("IndexThreadSleepInterval", "300");
\r
1320 sleep = new Integer(val.trim());
\r
1321 } catch (Exception e) {
\r
1323 sleep = (Integer)settings.value("IndexThreadSleepInterval", 0);
\r
1324 } catch (Exception e1) {
\r
1328 settings.endGroup();
\r
1333 // Get/Set a window state for later restoring
\r
1334 public static void saveState(String name, QByteArray state) {
\r
1335 int view = Global.getListView();
\r
1336 if (view == Global.View_List_Narrow)
\r
1337 name = name +"Narrow";
\r
1338 settings.beginGroup("SaveState");
\r
1339 settings.setValue(name, state);
\r
1340 settings.endGroup();
\r
1343 public static QByteArray restoreState(String name) {
\r
1344 int view = Global.getListView();
\r
1345 if (view == Global.View_List_Narrow)
\r
1346 name = name +"Narrow";
\r
1347 settings.beginGroup("SaveState");
\r
1348 QByteArray state = (QByteArray)settings.value(name);
\r
1349 settings.endGroup();
\r
1352 public static void saveGeometry(String name, QByteArray state) {
\r
1353 int view = Global.getListView();
\r
1354 if (view == Global.View_List_Narrow)
\r
1355 settings.beginGroup("SaveGeometryNarrow");
\r
1357 settings.beginGroup("SaveGeometry");
\r
1358 settings.setValue(name, state);
\r
1359 settings.endGroup();
\r
1362 public static QByteArray restoreGeometry(String name) {
\r
1363 int view = Global.getListView();
\r
1364 if (view == Global.View_List_Narrow)
\r
1365 settings.beginGroup("SaveGeometryNarrow");
\r
1367 settings.beginGroup("SaveGeometry");
\r
1368 QByteArray state = (QByteArray)settings.value(name);
\r
1369 settings.endGroup();
\r
1374 // Set how often to do an automatic save
\r
1375 public static void setAutoSaveInterval(int interval) {
\r
1376 settings.beginGroup("General");
\r
1377 settings.setValue("autoSaveInterval", interval);
\r
1378 settings.endGroup();
\r
1380 public static int getAutoSaveInterval() {
\r
1381 settings.beginGroup("General");
\r
1384 String val = (String)settings.value("autoSaveInterval", "5");
\r
1385 value = new Integer(val.trim());
\r
1386 } catch (Exception e) {
\r
1388 value = (Integer)settings.value("autoSaveInterval", 5);
\r
1389 } catch (Exception e1) {
\r
1393 settings.endGroup();
\r
1397 // Add an invalid attribute & element to the database so we don't bother parsing it in the future
\r
1398 // These values we automatically remove from any note.
\r
1399 // Add invalid attributes
\r
1400 public static void addInvalidAttribute(String element, String attribute) {
\r
1402 List<String> attributes = invalidAttributes.get(element);
\r
1403 if (attributes != null) {
\r
1404 for (int i=0; i<attributes.size(); i++)
\r
1405 if (attribute.equalsIgnoreCase(attributes.get(i))) {
\r
1410 ArrayList<String> attributeList;
\r
1411 if (!invalidAttributes.containsKey(element)) {
\r
1412 attributeList = new ArrayList<String>();
\r
1413 attributeList.add(attribute);
\r
1414 invalidAttributes.put(element, attributeList);
\r
1417 attributeList = invalidAttributes.get(element);
\r
1418 attributeList.add(attribute);
\r
1419 invalidAttributes.put(element,attributeList);
\r
1423 // Add invalid attributes
\r
1424 public static void addInvalidElement(String element) {
\r
1425 for (int i=0; i<invalidElements.size(); i++) {
\r
1426 if (element.equalsIgnoreCase(invalidElements.get(i)))
\r
1429 invalidElements.add(element);
\r
1432 // Get/Set proxy information
\r
1434 public static String getProxyValue(String key) {
\r
1435 settings.beginGroup("Proxy");
\r
1436 String val = (String)settings.value(key, "");
\r
1437 settings.endGroup();
\r
1440 public static void setProxyValue(String key, String value) {
\r
1441 settings.beginGroup("Proxy");
\r
1442 settings.setValue(key, value);
\r
1443 settings.endGroup();
\r
1446 // Change a byte array to a hex string
\r
1447 // Convert a byte array to a hex string
\r
1448 public static String byteArrayToHexString(byte data[]) {
\r
1449 StringBuffer buf = new StringBuffer();
\r
1450 for (byte element : data) {
\r
1451 int halfbyte = (element >>> 4) & 0x0F;
\r
1452 int two_halfs = 0;
\r
1454 if ((0 <= halfbyte) && (halfbyte <= 9))
\r
1455 buf.append((char) ('0' + halfbyte));
\r
1457 buf.append((char) ('a' + (halfbyte - 10)));
\r
1458 halfbyte = element & 0x0F;
\r
1459 } while(two_halfs++ < 1);
\r
1461 return buf.toString();
\r
1465 // Get/Set spelling settings
\r
1466 public static boolean getSpellSetting(String value) {
\r
1467 settings.beginGroup("Spell");
\r
1468 String text = (String)settings.value(value, "");
\r
1469 settings.endGroup();
\r
1470 if (text.equalsIgnoreCase("true"))
\r
1472 if (text.equalsIgnoreCase("false"))
\r
1474 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREDIGITWORDS))
\r
1476 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREINTERNETADDRESSES))
\r
1478 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREUPPERCASE))
\r
1480 if (value.equalsIgnoreCase(Configuration.SPELL_IGNORESENTENCECAPITALIZATION))
\r
1484 public static void setSpellSetting(String setting, boolean val) {
\r
1485 settings.beginGroup("Spell");
\r
1487 settings.setValue(setting, "true");
\r
1489 settings.setValue(setting, "false");
\r
1490 settings.endGroup();
\r
1493 // Get/Set how we should display tags (color them, hide unused, or do nothing)
\r
1494 // What to do with inactive tags?
\r
1495 public static String tagBehavior() {
\r
1496 settings.beginGroup("General");
\r
1497 String text = (String)settings.value("tagBehavior", "DoNothing");
\r
1498 settings.endGroup();
\r
1501 // What to do with inactive tags?
\r
1502 public static void setTagBehavior(String value) {
\r
1503 settings.beginGroup("General");
\r
1504 settings.setValue("tagBehavior", value);
\r
1505 settings.endGroup();
\r
1509 // Should the toolbar be visible?
\r
1510 public static boolean isToolbarButtonVisible(String window) {
\r
1511 settings.beginGroup("ToolbarButtonsVisible");
\r
1513 String text = (String)settings.value(window, "true");
\r
1514 settings.endGroup();
\r
1515 if (text.equalsIgnoreCase("true"))
\r
1519 } catch (java.lang.ClassCastException e) {
\r
1520 Boolean value = (Boolean) settings.value(window, true);
\r
1521 settings.endGroup();
\r
1525 public static void saveToolbarButtonsVisible(String column, boolean val) {
\r
1526 settings.beginGroup("ToolbarButtonsVisible");
\r
1528 settings.setValue(column, "true");
\r
1530 settings.setValue(column, "false");
\r
1531 settings.endGroup();
\r
1534 // Are thumbnails enabled?
\r
1536 public static boolean enableThumbnails() {
\r
1537 settings.beginGroup("Debug");
\r
1539 String text = (String)settings.value("thumbnails", "true");
\r
1540 settings.endGroup();
\r
1541 if (text.equalsIgnoreCase("true"))
\r
1545 } catch (java.lang.ClassCastException e) {
\r
1546 Boolean value = (Boolean) settings.value("thumbnails", true);
\r
1547 settings.endGroup();
\r
1551 public static void setEnableThumbnails(boolean val) {
\r
1552 settings.beginGroup("Debug");
\r
1554 settings.setValue("thumbnails", "true");
\r
1556 settings.setValue("thumbnails", "false");
\r
1557 settings.endGroup();
\r
1560 // Trace used for performance tuning. Not normally used in production.
\r
1561 // Print date/time. Used mainly for performance tracing
\r
1562 public static void trace(boolean resetInterval) {
\r
1563 String fmt = "MM/dd/yy HH:mm:ss.SSSSSS";
\r
1564 String dateTimeFormat = new String(fmt);
\r
1565 SimpleDateFormat simple = new SimpleDateFormat(dateTimeFormat);
\r
1566 Calendar cal = Calendar.getInstance();
\r
1567 if (intervalTraceTime == null)
\r
1568 intervalTraceTime = Calendar.getInstance();
\r
1569 if (startTraceTime == null)
\r
1570 startTraceTime = Calendar.getInstance();
\r
1572 float interval = (cal.getTimeInMillis() - intervalTraceTime.getTimeInMillis());
\r
1573 float total = (cal.getTimeInMillis() - startTraceTime.getTimeInMillis());
\r
1575 // if (interval > 00.0) {
\r
1576 StackTraceElement[] exceptions = Thread.currentThread().getStackTrace();
\r
1577 System.out.println("------------------------------------------");
\r
1579 System.out.println("Date/Time " +simple.format(cal.getTime()));
\r
1580 System.out.format("Interval Time: %-10.6f%n", interval);
\r
1581 System.out.format("Total Time: %-10.6f%n", total);
\r
1582 for (int i=2; i<5 && i<exceptions.length; i++) {
\r
1583 System.out.println(exceptions[i]);
\r
1586 if (resetInterval)
\r
1587 intervalTraceTime = cal;
\r
1589 public static void traceReset() {
\r
1590 intervalTraceTime = null;
\r
1591 startTraceTime = null;
\r
1595 // Get the FileManager class to manage local files & directories
\r
1596 public static FileManager getFileManager() {
\r
1597 return fileManager;
\r
1600 // Should the note editor be disabled?
\r
1601 public static boolean getDisableViewing() {
\r
1602 return disableViewing;
\r
1605 //**********************
\r
1606 //* Thumbnail zoom level
\r
1607 //**********************
\r
1608 public static int calculateThumbnailZoom(String content) {
\r
1610 if (content.indexOf("application/pdf") == -1) {
\r
1611 if (content.indexOf("image/") == -1) {
\r
1612 String text = StringEscapeUtils.unescapeHtml4(content.replaceAll("\\<.*?\\>", ""));
\r
1614 if (text.length() < 500)
\r
1616 if (text.length() < 250)
\r
1618 if (text.length() < 100)
\r
1620 if (text.length() < 50)
\r
1622 if (text.length() < 10)
\r
1629 //**********************
\r
1630 //* List View settings
\r
1631 //**********************
\r
1632 public static void setListView(int view) {
\r
1633 settings.beginGroup("General");
\r
1634 settings.setValue("listView", view);
\r
1635 settings.endGroup();
\r
1637 public static int getListView() {
\r
1638 settings.beginGroup("General");
\r
1641 String val = (String)settings.value("listView", View_List_Wide);
\r
1642 value = new Integer(val.trim());
\r
1643 } catch (Exception e) {
\r
1645 value = (Integer)settings.value("listView", View_List_Wide);
\r
1646 } catch (Exception e1) {
\r
1647 value = View_List_Wide;
\r
1650 settings.endGroup();
\r
1656 //*******************
\r
1658 //*******************
\r
1659 public static boolean overrideDefaultFont() {
\r
1660 settings.beginGroup("Font");
\r
1662 String text = (String)settings.value("overrideFont", "false");
\r
1663 settings.endGroup();
\r
1664 if (text.equalsIgnoreCase("true"))
\r
1668 } catch (java.lang.ClassCastException e) {
\r
1669 Boolean value = (Boolean) settings.value("overrideFont", false);
\r
1670 settings.endGroup();
\r
1676 //****************************************************
\r
1677 // Get/Set the default font settings for a new note
\r
1678 //****************************************************
\r
1679 public static void setOverrideDefaultFont(boolean value) {
\r
1680 settings.beginGroup("Font");
\r
1681 settings.setValue("overrideFont", value);
\r
1682 settings.endGroup();
\r
1684 public static String getDefaultFont() {
\r
1685 settings.beginGroup("Font");
\r
1686 String val = (String)settings.value("font", "");
\r
1687 settings.endGroup();
\r
1690 public static void setDefaultFont(String value) {
\r
1691 settings.beginGroup("Font");
\r
1692 settings.setValue("font", value);
\r
1693 settings.endGroup();
\r
1695 public static String getDefaultFontSize() {
\r
1696 settings.beginGroup("Font");
\r
1697 String val = (String)settings.value("fontSize", "");
\r
1698 settings.endGroup();
\r
1701 public static void setDefaultFontSize(String value) {
\r
1702 settings.beginGroup("Font");
\r
1703 settings.setValue("fontSize", value);
\r
1704 settings.endGroup();
\r
1708 //*******************************************
\r
1709 // Override the close & minimize instead.
\r
1710 //*******************************************
\r
1711 public static boolean minimizeOnClose() {
\r
1712 settings.beginGroup("General");
\r
1714 String text = (String)settings.value("minimizeOnClose", "false");
\r
1715 settings.endGroup();
\r
1716 if (text.equalsIgnoreCase("true") && QSystemTrayIcon.isSystemTrayAvailable())
\r
1720 } catch (java.lang.ClassCastException e) {
\r
1721 Boolean value = (Boolean) settings.value("minimizeOnClose", false);
\r
1722 settings.endGroup();
\r
1726 public static void setMinimizeOnClose(boolean value) {
\r
1727 settings.beginGroup("General");
\r
1728 settings.setValue("minimizeOnClose", value);
\r
1729 settings.endGroup();
\r
1732 //*********************************
\r
1733 // Check version information
\r
1734 //*********************************
\r
1735 public static boolean checkVersionUpgrade() {
\r
1736 settings.beginGroup("Upgrade");
\r
1738 String text = (String)settings.value("checkForUpdates", "true");
\r
1739 settings.endGroup();
\r
1740 if (text.equalsIgnoreCase("true"))
\r
1744 } catch (java.lang.ClassCastException e) {
\r
1745 Boolean value = (Boolean) settings.value("checkForUpdates", true);
\r
1746 settings.endGroup();
\r
1750 public static void setCheckVersionUpgrade(boolean value) {
\r
1751 settings.beginGroup("Upgrade");
\r
1752 settings.setValue("checkForUpdates", value);
\r
1753 settings.endGroup();
\r
1755 public static String getUpdatesAvailableUrl() {
\r
1756 settings.beginGroup("Upgrade");
\r
1757 String text = (String)settings.value("avialableUrl", "http://nevernote.sourceforge.net/versions.txt");
\r
1758 settings.endGroup();
\r
1761 public static String getUpdateAnnounceUrl() {
\r
1762 settings.beginGroup("Upgrade");
\r
1763 String text = (String)settings.value("announceUrl", "http://nevernote.sourceforge.net/upgrade.html");
\r
1764 settings.endGroup();
\r
1768 //*******************
\r
1770 //*******************
\r
1771 // Set/Get if we should index the text of a note
\r
1772 public static boolean indexNoteBody() {
\r
1773 settings.beginGroup("Index");
\r
1775 String value = (String)settings.value("indexNoteBody", "true");
\r
1776 settings.endGroup();
\r
1777 if (value.equals("true"))
\r
1781 } catch (java.lang.ClassCastException e) {
\r
1782 Boolean value = (Boolean) settings.value("indexNoteBody", true);
\r
1783 settings.endGroup();
\r
1787 public static void setIndexNoteTitle(boolean value) {
\r
1788 settings.beginGroup("Index");
\r
1789 settings.setValue("indexNoteTitle", value);
\r
1790 settings.endGroup();
\r
1792 // Set/Get if we should index the title of a note
\r
1793 public static boolean indexNoteTitle() {
\r
1794 settings.beginGroup("Index");
\r
1796 String value = (String)settings.value("indexNoteTitle", "true");
\r
1797 settings.endGroup();
\r
1798 if (value.equals("true"))
\r
1802 } catch (java.lang.ClassCastException e) {
\r
1803 Boolean value = (Boolean) settings.value("indexNoteTitle", true);
\r
1804 settings.endGroup();
\r
1808 public static void setIndexNoteBody(boolean value) {
\r
1809 settings.beginGroup("Index");
\r
1810 settings.setValue("indexNoteBody", value);
\r
1811 settings.endGroup();
\r
1813 // Set/Get if we should index any attachments
\r
1814 public static boolean indexAttachmentsLocally() {
\r
1815 settings.beginGroup("Index");
\r
1817 String value = (String)settings.value("indexAttachmentsLocally", "true");
\r
1818 settings.endGroup();
\r
1819 if (value.equals("true"))
\r
1823 } catch (java.lang.ClassCastException e) {
\r
1824 Boolean value = (Boolean) settings.value("indexAttachmentsLocally", true);
\r
1825 settings.endGroup();
\r
1829 public static void setIndexImageRecognition(boolean value) {
\r
1830 settings.beginGroup("Index");
\r
1831 settings.setValue("indexImageRecognition", value);
\r
1832 settings.endGroup();
\r
1834 public static boolean indexImageRecognition() {
\r
1835 settings.beginGroup("Index");
\r
1837 String value = (String)settings.value("indexImageRecognition", "true");
\r
1838 settings.endGroup();
\r
1839 if (value.equals("true"))
\r
1843 } catch (java.lang.ClassCastException e) {
\r
1844 Boolean value = (Boolean) settings.value("indexImageRecognition", true);
\r
1845 settings.endGroup();
\r
1849 public static void setIndexAttachmentsLocally(boolean value) {
\r
1850 settings.beginGroup("Index");
\r
1851 settings.setValue("indexAttachmentsLocally", value);
\r
1852 settings.endGroup();
\r
1854 // Get/Set characters that shouldn't be removed from a word
\r
1855 public static String getSpecialIndexCharacters() {
\r
1856 settings.beginGroup("Index");
\r
1857 String text = (String)settings.value("specialCharacters", "");
\r
1858 settings.endGroup();
\r
1861 public static void setSpecialIndexCharacters(String value) {
\r
1862 settings.beginGroup("Index");
\r
1863 settings.setValue("specialCharacters", value);
\r
1864 settings.endGroup();
\r
1865 databaseCache = value;
\r
1868 //*****************************************************************************
\r
1869 // Control how tag selection behaves (should they be "and" or "or" selections
\r
1870 //*****************************************************************************
\r
1871 public static boolean anyTagSelectionMatch() {
\r
1872 settings.beginGroup("General");
\r
1874 String value = (String)settings.value("anyTagSelectionMatch", "false");
\r
1875 settings.endGroup();
\r
1876 if (value.equals("true"))
\r
1880 } catch (java.lang.ClassCastException e) {
\r
1881 Boolean value = (Boolean) settings.value("anyTagSelectionMatch", false);
\r
1882 settings.endGroup();
\r
1886 public static void setAnyTagSelectionMatch(boolean value) {
\r
1887 settings.beginGroup("General");
\r
1888 settings.setValue("anyTagSelectionMatch", value);
\r
1889 settings.endGroup();
\r
1892 //*****************************************************************************
\r
1893 // Control if a user receives a warning when trying to create a note-to-note link
\r
1894 // when the DB is not synchronized.
\r
1895 //*****************************************************************************
\r
1896 public static boolean bypassSynchronizationWarning() {
\r
1897 settings.beginGroup("User");
\r
1899 String value = (String)settings.value("bypassSynchronizationWarning", "false");
\r
1900 settings.endGroup();
\r
1901 if (value.equals("true"))
\r
1905 } catch (java.lang.ClassCastException e) {
\r
1906 Boolean value = (Boolean) settings.value("bypassSynchronizationWarning", false);
\r
1907 settings.endGroup();
\r
1911 public static void setBypassSynchronizationWarning(boolean value) {
\r
1912 settings.beginGroup("User");
\r
1913 settings.setValue("bypassSynchronizationWarning", value);
\r
1914 settings.endGroup();
\r
1918 //***********************
\r
1919 //* Database cache size
\r
1920 //***********************
\r
1921 public static String getDatabaseCacheSize() {
\r
1922 settings.beginGroup("Debug");
\r
1923 String text = (String)settings.value("databaseCache", "16384");
\r
1924 settings.endGroup();
\r
1927 public static void setDatabaseCache(String value) {
\r
1928 settings.beginGroup("Debug");
\r
1929 settings.setValue("databaseCache", value);
\r
1930 settings.endGroup();
\r
1931 databaseCache = value;
\r
1935 // This is used to copy a class since Java's normal deep copy is wacked
\r
1936 public static Object deepCopy(Object oldObj)
\r
1938 ObjectOutputStream oos = null;
\r
1939 ObjectInputStream ois = null;
\r
1942 ByteArrayOutputStream bos =
\r
1943 new ByteArrayOutputStream(); // A
\r
1944 oos = new ObjectOutputStream(bos); // B
\r
1945 // serialize and pass the object
\r
1946 oos.writeObject(oldObj); // C
\r
1948 ByteArrayInputStream bin =
\r
1949 new ByteArrayInputStream(bos.toByteArray()); // E
\r
1950 ois = new ObjectInputStream(bin); // F
\r
1951 // return the new object
\r
1952 return ois.readObject(); // G
\r
1954 catch(Exception e)
\r
1956 Global.logger.log(logger.LOW, "Exception in ObjectCloner = " + e);
\r
1961 } catch (IOException e) {
\r
1962 Global.logger.log(logger.LOW, "Exception in ObjectCloner = " + e);
\r
1963 e.printStackTrace();
\r
1969 // If we should automatically select the children of any tag
\r
1970 public static boolean includeTagChildren() {
\r
1971 settings.beginGroup("General");
\r
1973 String value = (String)settings.value("includeTagChildren", "false");
\r
1974 settings.endGroup();
\r
1975 if (value.equals("true"))
\r
1979 } catch (java.lang.ClassCastException e) {
\r
1980 Boolean value = (Boolean) settings.value("includeTagChildren", false);
\r
1981 settings.endGroup();
\r
1986 public static void setIncludeTagChildren(boolean value) {
\r
1987 settings.beginGroup("General");
\r
1988 settings.setValue("includeTagChildren", value);
\r
1989 settings.endGroup();
\r
1992 // If we should automatically wildcard searches
\r
1993 public static boolean automaticWildcardSearches() {
\r
1994 settings.beginGroup("General");
\r
1996 String value = (String)settings.value("automaticWildcard", "false");
\r
1997 settings.endGroup();
\r
1998 if (value.equals("true"))
\r
2002 } catch (java.lang.ClassCastException e) {
\r
2003 Boolean value = (Boolean) settings.value("automaticWildcard", false);
\r
2004 settings.endGroup();
\r
2009 public static void setAutomaticWildcardSearches(boolean value) {
\r
2010 settings.beginGroup("General");
\r
2011 settings.setValue("automaticWildcard", value);
\r
2012 settings.endGroup();
\r
2015 // If we should automatically select the children of any tag
\r
2016 public static boolean displayRightToLeft() {
\r
2017 settings.beginGroup("General");
\r
2019 String value = (String)settings.value("displayRightToLeft", "false");
\r
2020 settings.endGroup();
\r
2021 if (value.equals("true"))
\r
2025 } catch (java.lang.ClassCastException e) {
\r
2026 Boolean value = (Boolean) settings.value("displayRightToLeft", false);
\r
2027 settings.endGroup();
\r
2032 public static void setDisplayRightToLeft(boolean value) {
\r
2033 settings.beginGroup("General");
\r
2034 settings.setValue("displayRightToLeft", value);
\r
2035 settings.endGroup();
\r
2039 //***********************
\r
2040 //* Startup Notebook
\r
2041 //***********************
\r
2042 public static String getStartupNotebook() {
\r
2043 settings.beginGroup("General");
\r
2044 String text = (String)settings.value("startupNotebook", "");
\r
2045 settings.endGroup();
\r
2048 public static void setStartupNotebook(String value) {
\r
2049 settings.beginGroup("General");
\r
2050 settings.setValue("startupNotebook", value);
\r
2051 settings.endGroup();
\r
2052 databaseCache = value;
\r