2 * This file is part of NixNote
3 * Copyright 2009 Randy Baumgarte
5 * This file may be licensed under the terms of of the
6 * GNU General Public License Version 2 (the ``GPL'').
8 * Software distributed under the License is distributed
9 * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
10 * express or implied. See the GPL for the specific language
11 * governing rights and limitations.
13 * You should have received a copy of the GPL along with this
14 * program. If not, go to http://www.gnu.org/licenses/gpl.html
15 * or write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 package cx.fbn.nevernote;
23 import java.io.ByteArrayInputStream;
24 import java.io.ByteArrayOutputStream;
25 import java.io.IOException;
26 import java.io.ObjectInputStream;
27 import java.io.ObjectOutputStream;
28 import java.text.SimpleDateFormat;
29 import java.util.ArrayList;
30 import java.util.Calendar;
31 import java.util.HashMap;
32 import java.util.List;
34 import org.apache.commons.lang3.StringEscapeUtils;
36 import com.evernote.edam.type.Accounting;
37 import com.evernote.edam.type.PrivilegeLevel;
38 import com.evernote.edam.type.User;
39 import com.evernote.edam.type.UserAttributes;
40 import com.swabunga.spell.engine.Configuration;
41 import com.trolltech.qt.core.QByteArray;
42 import com.trolltech.qt.core.QSettings;
43 import com.trolltech.qt.core.QSize;
44 import com.trolltech.qt.gui.QPalette;
45 import com.trolltech.qt.gui.QSystemTrayIcon;
47 import cx.fbn.nevernote.config.FileManager;
48 import cx.fbn.nevernote.config.InitializationException;
49 import cx.fbn.nevernote.config.StartupConfig;
50 import cx.fbn.nevernote.gui.ContainsAttributeFilterTable;
51 import cx.fbn.nevernote.gui.DateAttributeFilterTable;
52 import cx.fbn.nevernote.gui.ShortcutKeys;
53 import cx.fbn.nevernote.utilities.ApplicationLogger;
54 import cx.fbn.nevernote.utilities.Pair;
57 //*****************************************************
58 //*****************************************************
59 //* Global constants & static functions used by
61 //*****************************************************
62 //*****************************************************
65 // Set current version and the known versions.
67 public static String version = "0.1";
68 public static String[] validVersions = {"0.1"};
70 public static String username = "";
71 //public static String password = "";
74 // Each thread has an ID. This is used primarily to check the status
75 // of running threads.
76 public static final int mainThreadId=0;
77 public static final int syncThreadId=1;
78 public static final int tagCounterThreadId=2;
79 public static final int trashCounterThreadId=3; // This should always be the highest thread ID
80 public static final int indexThreadId=4; // Thread for indexing words
81 public static final int saveThreadId=5; // Thread used for processing data to saving content
82 public static final int notebookCounterThreadId=6; // Notebook Thread
83 public static final int indexThread03Id=7; // unused
84 public static final int indexThread04Id=8; // unused
85 public static final int dbThreadId=9; // This should always be the highest thread ID
86 public static final int threadCount = 10;
89 // These variables deal with where the list of notes appears
90 // They will either be vertical (View_List_Narrow) or will be
91 // on top of the note (View_List_Wide). It also has the size of
92 // thumbnails displayed in each view
93 public static int View_List_Wide = 1;
94 public static int View_List_Narrow = 2;
95 public static QSize smallThumbnailSize = new QSize(100,75);
96 public static QSize largeThumbnailSize = new QSize(300,225);
98 // This is used to keep a running list of passwords that the user
99 // wants us to remember.
100 public static HashMap<String,Pair<String,String>> passwordSafe = new HashMap<String, Pair<String,String>>();
101 public static List<Pair<String,String>> passwordRemember = new ArrayList<Pair<String,String>>();
104 //public static String currentNotebookGuid;
106 // These deal with Evernote user settings
107 public static User user;
108 public static long authTimeRemaining;
109 public static long authRefreshTime;
110 public static long failedRefreshes = 0;
111 public static String userStoreUrl;
112 public static String noteStoreUrl;
113 public static String noteStoreUrlBase;
115 // When we want to shut down we set this to true to short
116 // circut other threads
117 public static boolean keepRunning;
119 // In the note list, these are the column numbers
120 // so I don't need to hard code numbers.
121 public static int noteTableCreationPosition = 0;
122 public static int noteTableTitlePosition = 1;
123 public static int noteTableTagPosition = 2;
124 public static int noteTableNotebookPosition = 3;
125 public static int noteTableChangedPosition = 4;
126 public static int noteTableGuidPosition = 5;
127 public static int noteTableAuthorPosition = 6;
128 public static int noteTableSourceUrlPosition = 7;
129 public static int noteTableSubjectDatePosition = 8;
130 public static int noteTableSynchronizedPosition = 9;
131 public static int noteTableThumbnailPosition = 10;
132 public static int noteTablePinnedPosition = 11;
133 public static int noteTableColumnCount = 12;
134 public static Integer cryptCounter = 0;
136 //public static int minimumWordCount = 2;
138 // Regular expression to parse text with when indexing
139 private static String wordRegex;
141 // Experimental fixes. Set via Edit/Preferences/Debugging
142 public static boolean enableCarriageReturnFix = false;
143 public static boolean enableHTMLEntitiesFix = false;
145 // Used to set & retrieve ini & Windows registry settings
146 public static QSettings settings; // Set & get ini settings
147 public static boolean isConnected; // Are we connected to Evernote
148 public static boolean showDeleted = false; // Show deleted notes?
149 public static boolean disableUploads = false; // Should we disable uploads (used in testing features)
150 public static int messageLevel; // The level of messages to write to the log files
151 public static String tagDelimeter = ","; // This is used to separate out tag names when entering above note
152 public static String attachmentNameDelimeter = "------"; // Used to separate out attachment names in the res directory
156 public static String databaseName = new String("NeverNote"); // database name. used for multiple databases to separate settings.
157 public static String indexDatabaseName = new String("Index"); // searchable words database
158 public static String resourceDatabaseName = new String("Resources"); // attachments database
161 public static String behaviorDatabaseName = new String("Behavior"); // 操作履歴データベース
163 public static DateAttributeFilterTable createdSinceFilter;
164 public static DateAttributeFilterTable createdBeforeFilter;
165 public static DateAttributeFilterTable changedSinceFilter;
166 public static DateAttributeFilterTable changedBeforeFilter;
167 public static ContainsAttributeFilterTable containsFilter;
169 // Log file used for debugging
170 public static ApplicationLogger logger;
171 //PrintStream stdoutStream;
173 // Application key shortcuts & appearance
174 public static QPalette originalPalette;
175 public static ShortcutKeys shortcutKeys;
177 public static boolean disableViewing; // used to disable the editor
179 // When saving a note, this is a list of things we strip out because Evernote hates them
180 public static List<String> invalidElements = new ArrayList<String>();
181 public static HashMap<String, ArrayList<String>> invalidAttributes = new HashMap<String, ArrayList<String>>();
183 public static boolean mimicEvernoteInterface; // Try to mimic Evernote or allow multiple notebook selection
184 public static HashMap<String,String> resourceMap; // List of attachments for a note.
185 public static String cipherPassword = ""; // If the database is encrypted, this stores the password
186 public static String databaseCache = "16384"; // Default DB cache size
188 // These are used for performance testing
189 static Calendar startTraceTime;
190 static Calendar intervalTraceTime;
192 static boolean syncOnly;
194 private static FileManager fileManager; // Used to access files & directories
197 public static void setup(StartupConfig startupConfig) throws InitializationException {
198 // ICHANGED 設定値の保存先を変更
199 settings = new QSettings("NeighborNote.ini", QSettings.Format.IniFormat);
201 disableViewing = startupConfig.getDisableViewing();
202 syncOnly = startupConfig.isSyncOnly();
204 fileManager = new FileManager(startupConfig.getHomeDirPath(), startupConfig.getProgramDirPath());
207 getServer(); // Setup URL to connect to
209 // Get regular expressions used to parse out words
210 settings.beginGroup("General");
211 String regex = (String) settings.value("regex", "[,\\s]+");
215 //Setup debugging information
216 settings.beginGroup("Debug");
217 String msglevel = (String) settings.value("messageLevel", "Low");
222 setMessageLevel(msglevel);
223 keepRunning = true; // Make sure child threads stay running
224 disableUploads = disableUploads(); // Should we upload anything? Normally false.
\r
225 //disableUploads = true; //***** DELETE THIS LINE *******
\r
226 enableCarriageReturnFix = enableCarriageReturnFix(); // Enable test fix?
227 enableHTMLEntitiesFix = enableHtmlEntitiesFix(); // Enable test fix?
229 logger = new ApplicationLogger("global.log"); // Setup log for this class
230 shortcutKeys = new ShortcutKeys(); // Setup keyboard shortcuts.
231 mimicEvernoteInterface = getMimicEvernoteInterface(); // Should we mimic Evernote's notebook behavior
232 resourceMap = new HashMap<String,String>(); // Setup resource map used to store attachments when editing
234 databaseCache = getDatabaseCacheSize(); // Set database cache size
236 Global.username = getUserInformation().getUsername();
239 // Get/Set word parsing regular expression
240 public static String getWordRegex() {
243 public static void setWordRegex(String r) {
247 // Set the debug message level
248 public static void setMessageLevel(String msglevel) {
249 if (msglevel.equalsIgnoreCase("low"))
251 if (msglevel.equalsIgnoreCase("medium"))
253 if (msglevel.equalsIgnoreCase("high"))
255 if (msglevel.equalsIgnoreCase("extreme"))
257 settings.beginGroup("Debug");
258 settings.setValue("messageLevel", msglevel);
262 //****************************************************
263 //****************************************************
264 //** Save user account information from Evernote
265 //****************************************************
266 //****************************************************
267 public static void saveUserInformation(User user) {
268 settings.beginGroup("User");
269 settings.setValue("id", user.getId());
270 settings.setValue("username", user.getUsername());
271 settings.setValue("email", user.getEmail());
272 settings.setValue("name", user.getName());
273 settings.setValue("timezone", user.getTimezone());
274 settings.setValue("privilege", user.getPrivilege().getValue());
275 settings.setValue("created", user.getCreated());
276 settings.setValue("updated", user.getUpdated());
277 settings.setValue("deleted", user.getDeleted());
278 settings.setValue("shard", user.getShardId());
281 if (user.getAttributes()!=null)
282 saveUserAttributes(user.getAttributes());
283 if (user.getAccounting()!=null)
284 saveUserAccounting(user.getAccounting());
287 public static User getUserInformation() {
288 User user = new User();
289 settings.beginGroup("User");
291 user.setId((Integer)settings.value("id", 0));
292 } catch (java.lang.ClassCastException e) {
293 user.setId(new Integer((String)settings.value("id", "0")));
295 String username = (String)settings.value("username", "");
296 String email = (String)settings.value("email", "");
297 String name = (String)settings.value("name", "");
298 String timezone = (String)settings.value("timezone", "");
299 Integer privilege = 0;
301 privilege = new Integer((String)settings.value("privilege", "0"));
302 } catch (java.lang.ClassCastException e) {
303 privilege = (Integer)settings.value("privilege", 0);
307 String date = (String)settings.value("created", "0");
308 user.setCreated(new Long(date));
309 date = (String)settings.value("updated", "0");
310 user.setUpdated(new Long(date));
311 date = (String)settings.value("deleted", "0");
312 user.setDeleted(new Long(date));
313 } catch (java.lang.ClassCastException e) {
314 Long date = (Long)settings.value("created", 0);
315 user.setCreated(date);
316 date = (Long)settings.value("updated", 0);
317 user.setUpdated(date);
318 date = (Long)settings.value("deleted", 0);
319 user.setDeleted(date);
322 String shard = (String)settings.value("shard", "");
325 user.setUsername(username);
326 user.setEmail(email);
328 user.setTimezone(timezone);
329 PrivilegeLevel userLevel = PrivilegeLevel.findByValue(privilege);
330 user.setPrivilege(userLevel);
331 user.setShardId(shard);
335 public static void saveUserAttributes(UserAttributes attrib) {
336 settings.beginGroup("UserAttributes");
337 settings.setValue("defaultLocationName", attrib.getDefaultLocationName());
338 settings.setValue("defaultLatitude", attrib.getDefaultLocationName());
339 settings.setValue("defaultLongitude", attrib.getDefaultLocationName());
340 settings.setValue("incomingEmailAddress", attrib.getIncomingEmailAddress());
343 public static UserAttributes getUserAttributes() {
344 settings.beginGroup("UserAttributes");
345 UserAttributes attrib = new UserAttributes();
346 attrib.setDefaultLocationName((String)settings.value("defaultLocationName",""));
347 attrib.setDefaultLatitudeIsSet(false);
348 attrib.setDefaultLongitudeIsSet(false);
349 attrib.setIncomingEmailAddress((String)settings.value("incomingEmailAddress", ""));
353 public static void saveUserAccounting(Accounting acc) {
354 settings.beginGroup("UserAccounting");
355 settings.setValue("uploadLimit", acc.getUploadLimit());
356 settings.setValue("uploadLimitEnd", acc.getUploadLimitEnd());
357 settings.setValue("uploadLimitNextMonth", acc.getUploadLimitNextMonth());
358 settings.setValue("premiumServiceStart", acc.getPremiumServiceStart());
359 settings.setValue("nextPaymentDue", acc.getNextPaymentDue());
360 settings.setValue("uploadAmount", acc.getUpdated());
363 public static long getUploadLimitEnd() {
365 settings.beginGroup("UserAccounting");
369 String val = (String)settings.value("uploadLimitEnd", "0");
370 limit = new Long(val.trim());
371 } catch (Exception e) {
373 limit = (Long)settings.value("uploadLimitEnd", 0);
374 } catch (Exception e1) {
383 public static void saveUploadAmount(long amount) {
384 settings.beginGroup("UserAccounting");
385 settings.setValue("uploadAmount", amount);
388 public static long getUploadAmount() {
390 settings.beginGroup("UserAccounting");
392 String num = (String)settings.value("uploadAmount", "0");
393 amt = new Long(num.trim());
394 } catch (Exception e) {
396 amt = (Integer)settings.value("uploadAmount", 0);
397 } catch (Exception e1) {
404 public static void saveEvernoteUpdateCount(long amount) {
405 settings.beginGroup("UserAccounting");
406 settings.setValue("updateCount", amount);
409 public static long getEvernoteUpdateCount() {
411 settings.beginGroup("UserAccounting");
413 String num = (String)settings.value("updateCount", new Long(0).toString());
414 amt = new Long(num.trim());
415 } catch (java.lang.ClassCastException e) {
421 public static boolean isPremium() {
423 settings.beginGroup("User");
425 String num = (String)settings.value("privilege", "1");
426 level = new Integer(num.trim());
427 } catch (java.lang.ClassCastException e) {
429 level = (Integer)settings.value("privilege", 1);
430 } catch (Exception e1) {
435 PrivilegeLevel userLevel = PrivilegeLevel.findByValue(level);
436 if (userLevel == PrivilegeLevel.NORMAL)
441 public static long getUploadLimit() {
442 settings.beginGroup("UserAccounting");
445 String num = (String)settings.value("uploadLimit", new Long(0).toString());
446 limit = new Long(num.trim());
447 } catch (java.lang.ClassCastException e) {
456 //****************************************************
457 //****************************************************
458 //** View settings. Used to restore settings
459 //** when starting and to control how the program
461 //****************************************************
462 //****************************************************
464 //* Get/Set if we should show a tray icon
465 public static boolean showTrayIcon() {
466 settings.beginGroup("General");
468 String max = (String) settings.value("showTrayIcon", "false");
470 if (!max.equalsIgnoreCase("true") || !QSystemTrayIcon.isSystemTrayAvailable())
474 } catch (java.lang.ClassCastException e) {
475 Boolean value = (Boolean) settings.value("showTrayIcon", false);
480 public static void setShowTrayIcon(boolean val) {
481 settings.beginGroup("General");
483 settings.setValue("showTrayIcon", "true");
485 settings.setValue("showTrayIcon", "false");
489 // Get/Set window maximized when closed last
490 public static boolean wasWindowMaximized() {
492 settings.beginGroup("General");
493 String max = (String) settings.value("isMaximized", "true");
495 if (!max.equalsIgnoreCase("true"))
498 } catch (java.lang.ClassCastException e) {
499 Boolean value = (Boolean) settings.value("isMaximized", true);
504 public static void saveWindowMaximized(boolean isMax) {
505 settings.beginGroup("General");
507 settings.setValue("isMaximized", "true");
509 settings.setValue("isMaximized", "false");
513 // Get/set currently viewed note Guid
514 public static String getLastViewedNoteGuid() {
515 settings.beginGroup("General");
516 String guid = (String) settings.value("lastViewedNote", "");
520 public static void saveCurrentNoteGuid(String guid) {
521 settings.beginGroup("General");
523 settings.setValue("lastViewedNote", guid);
525 settings.setValue("lastViewedNote", "");
529 // Get/Set the note column we are sorted on and the order
530 public static void setSortColumn(int i) {
531 int view = Global.getListView();
532 settings.beginGroup("General");
533 if (view == Global.View_List_Wide)
534 settings.setValue("sortColumn", i);
536 settings.setValue("sortColumn-Narrow", i);
539 public static int getSortColumn() {;
541 if (Global.getListView() == Global.View_List_Wide)
544 key = "sortColumn-Narrow";
546 settings.beginGroup("General");
549 String val = settings.value(key, new Integer(0)).toString();
550 order = new Integer(val.trim());
551 } catch (Exception e) {
553 order = (Integer)settings.value(key, 0);
554 } catch (Exception e1) {
562 public static void setSortOrder(int i) {
563 int view = Global.getListView();
564 settings.beginGroup("General");
565 if (view == Global.View_List_Wide)
566 settings.setValue("sortOrder", i);
568 settings.setValue("sortOrder-Narrow", i);
571 public static int getSortOrder() {
572 int view = Global.getListView();
573 settings.beginGroup("General");
575 if (view == Global.View_List_Wide)
578 key = "sortOrder-Narrow";
582 String val = settings.value(key, new Integer(0)).toString();
583 order = new Integer(val.trim());
584 } catch (Exception e) {
586 order = (Integer)settings.value(key, 0);
587 } catch (Exception e1) {
596 // Should we automatically log in to Evernote when starting?
597 public static boolean automaticLogin() {
599 settings.beginGroup("General");
600 String text = (String)settings.value("automaticLogin", "false");
602 if (text.equalsIgnoreCase("true"))
606 } catch (java.lang.ClassCastException e) {
607 Boolean value = (Boolean) settings.value("automaticLogin", false);
612 public static void setAutomaticLogin(boolean val) {
613 settings.beginGroup("General");
615 settings.setValue("automaticLogin", "true");
617 settings.setValue("automaticLogin", "false");
621 // Get/set the Evernote server Url.
622 public static void setServer(String server) {
623 settings.beginGroup("General");
624 settings.setValue("server", server);
627 public static String getServer() {
628 settings.beginGroup("General");
629 String text = (String)settings.value("server", "www.evernote.com");
630 if (text.equals("www.evernote.com")) {
631 userStoreUrl = "https://www.evernote.com/edam/user";
632 noteStoreUrlBase = "www.evernote.com/edam/note/";
634 userStoreUrl = "https://sandbox.evernote.com/edam/user";
635 noteStoreUrlBase = "sandbox.evernote.com/edam/note/";
639 noteStoreUrlBase = "https://" + noteStoreUrlBase;
641 // noteStoreUrlBase = "http://" + noteStoreUrlBase;
645 // Get/Set if we should disable uploads to Evernote
646 public static boolean disableUploads() {
647 settings.beginGroup("General");
649 String text = (String)settings.value("disableUploads", "false");
651 if (text.equalsIgnoreCase("true"))
655 } catch (java.lang.ClassCastException e) {
656 Boolean value = (Boolean) settings.value("disableUploads", false);
661 public static void setDisableUploads(boolean val) {
662 settings.beginGroup("General");
664 settings.setValue("disableUploads", "true");
666 settings.setValue("disableUploads", "false");
668 disableUploads = val;
671 // Should we view PDF documents inline?
672 public static boolean pdfPreview() {
673 settings.beginGroup("General");
675 String text = (String)settings.value("pdfPreview", "true");
677 if (text.equalsIgnoreCase("true"))
681 } catch (java.lang.ClassCastException e) {
682 Boolean value = (Boolean) settings.value("pdfPreview", true);
687 public static void setPdfPreview(boolean val) {
688 settings.beginGroup("General");
690 settings.setValue("pdfPreview", "true");
692 settings.setValue("pdfPreview", "false");
696 // When creating a new note, should it inherit tags that are currently selected?
697 public static boolean newNoteWithSelectedTags() {
698 settings.beginGroup("General");
700 String text = (String)settings.value("newNoteWithSelectedTags", "false");
702 if (text.equalsIgnoreCase("true"))
706 } catch (java.lang.ClassCastException e) {
707 Boolean value = (Boolean) settings.value("newNoteWithSelectedTags", false);
712 public static void setNewNoteWithSelectedTags(boolean val) {
713 settings.beginGroup("General");
715 settings.setValue("newNoteWithSelectedTags", "true");
717 settings.setValue("newNoteWithSelectedTags", "false");
721 // Minimum weight for text OCRed from Evernote. Anything below this
722 // Won't be shown to the user when they search
723 public static void setRecognitionWeight(int len) {
724 settings.beginGroup("General");
725 settings.setValue("recognitionWeight", len);
728 public static int getRecognitionWeight() {
729 settings.beginGroup("General");
732 len = (Integer)settings.value("recognitionWeight", 30);
\r
733 } catch (Exception e) {
740 // get/set current debug message level
741 public static String getMessageLevel() {
742 settings.beginGroup("Debug");
743 String text = (String)settings.value("messageLevel", "Low");
745 setMessageLevel(text);
748 public static void setDateFormat(String format) {
749 settings.beginGroup("General");
750 settings.setValue("dateFormat", format);
754 // Get/Set user date/time formats
755 public static String getDateFormat() {
756 settings.beginGroup("General");
757 String text = (String)settings.value("dateFormat", "MM/dd/yyyy");
761 public static void setTimeFormat(String format) {
762 settings.beginGroup("General");
763 settings.setValue("timeFormat", format);
766 public static String getTimeFormat() {
767 settings.beginGroup("General");
768 String text = (String)settings.value("timeFormat", "HH:mm:ss");
773 // How often should we sync with Evernote?
774 public static String getSyncInterval() {
775 settings.beginGroup("General");
776 String text = (String)settings.value("syncInterval", "15 minutes");
780 public static void setSyncInterval(String format) {
781 settings.beginGroup("General");
782 settings.setValue("syncInterval", format);
786 // Get/Set the width of columns and their position for the
788 public static void setColumnWidth(String col, int width) {
789 if (Global.getListView() == Global.View_List_Wide)
790 settings.beginGroup("ColumnWidths");
792 settings.beginGroup("ColumnWidths-Narrow");
793 settings.setValue(col, width);
796 public static int getColumnWidth(String col) {
797 int view = Global.getListView();
798 if (view == Global.View_List_Wide)
799 settings.beginGroup("ColumnWidths");
801 settings.beginGroup("ColumnWidths-Narrow");
804 String val = (String)settings.value(col, "0");
805 width = new Integer(val.trim());
806 } catch (Exception e) {
808 width = (Integer)settings.value(col, 0);
809 } catch (Exception e1) {
816 public static void setColumnPosition(String col, int width) {
817 if (Global.getListView() == Global.View_List_Wide)
818 settings.beginGroup("ColumnPosition");
820 settings.beginGroup("ColumnPosition-Narrow");
821 settings.setValue(col, width);
824 public static int getColumnPosition(String col) {
825 if (Global.getListView() == Global.View_List_Wide)
826 settings.beginGroup("ColumnPosition");
828 settings.beginGroup("ColumnPosition-Narrow");
831 String val = (String)settings.value(col, "-1");
832 width = new Integer(val.trim());
833 } catch (Exception e) {
835 width = (Integer)settings.value(col, 0);
836 } catch (Exception e1) {
844 // Ping the user when they try to delete or just do it.
845 public static boolean verifyDelete() {
846 settings.beginGroup("General");
848 String text = (String)settings.value("verifyDelete", "true");
850 if (text.equalsIgnoreCase("true"))
854 } catch (java.lang.ClassCastException e) {
855 Boolean value = (Boolean) settings.value("verifyDelete", true);
860 public static void setVerifyDelete(boolean val) {
861 settings.beginGroup("General");
863 settings.setValue("verifyDelete", "true");
865 settings.setValue("verifyDelete", "false");
869 // Should it start minimized?
870 public static boolean startMinimized() {
871 settings.beginGroup("General");
873 String text = (String)settings.value("startMinimized", "false");
875 if (text.equalsIgnoreCase("true"))
879 } catch (java.lang.ClassCastException e) {
880 Boolean value = (Boolean) settings.value("startMinimized", false);
885 public static void setStartMinimized(boolean val) {
886 settings.beginGroup("General");
888 settings.setValue("startMinimized", "true");
890 settings.setValue("startMinimized", "false");
894 // Should we upload the content of any deleted notes
895 public static boolean synchronizeDeletedContent() {
896 settings.beginGroup("General");
898 String text = (String)settings.value("syncDeletedContent", "false");
900 if (text.equalsIgnoreCase("true"))
904 } catch (java.lang.ClassCastException e) {
905 Boolean value = (Boolean) settings.value("syncDeletedContent", false);
910 public static void setSynchronizeDeletedContent(boolean val) {
911 settings.beginGroup("General");
913 settings.setValue("syncDeletedContent", "true");
915 settings.setValue("syncDeletedContent", "false");
919 // Is a section of the window visible? Used to hide things people don't
921 public static boolean isWindowVisible(String window) {
922 settings.beginGroup("WindowsVisible");
924 String defaultValue = "true";
925 if (window.equalsIgnoreCase("noteInformation"))
926 defaultValue = "false";
927 String text = (String)settings.value(window, defaultValue);
929 if (text.equalsIgnoreCase("true"))
933 } catch (java.lang.ClassCastException e) {
934 boolean defaultValue = true;
935 if (window.equalsIgnoreCase("noteInformation"))
936 defaultValue = false;
937 Boolean value = (Boolean) settings.value("showTrayIcon", defaultValue);
942 public static void saveWindowVisible(String window, boolean val) {
943 settings.beginGroup("WindowsVisible");
945 settings.setValue(window, "true");
947 settings.setValue(window, "false");
951 // Is a list in the column in the note list visible?
952 public static boolean isColumnVisible(String window) {
953 String defaultValue = "true";
954 int view = Global.getListView();
955 if (Global.getListView() == Global.View_List_Wide)
956 settings.beginGroup("ColumnsVisible");
958 settings.beginGroup("ColumnsVisible-Narrow");
959 if (window.equalsIgnoreCase("thumbnail") && view == Global.View_List_Wide)
960 defaultValue = "false";
961 if (window.equalsIgnoreCase("thumbnail"))
962 defaultValue = "false";
963 if (window.equalsIgnoreCase("Guid"))
964 defaultValue = "false";
966 String text = (String)settings.value(window, defaultValue);
968 if (text.equalsIgnoreCase("true"))
972 } catch (java.lang.ClassCastException e) {
973 boolean defBool = false;
974 if (window.equalsIgnoreCase("true"))
978 Boolean value = (Boolean) settings.value(window, defBool);
983 public static void saveColumnVisible(String column, boolean val) {
984 if (Global.getListView() == Global.View_List_Wide)
985 settings.beginGroup("ColumnsVisible");
987 settings.beginGroup("ColumnsVisible-Narrow");
989 settings.setValue(column, "true");
991 settings.setValue(column, "false");
995 // Is a particular editor button visible?
996 public static boolean isEditorButtonVisible(String window) {
997 settings.beginGroup("EditorButtonsVisible");
999 String text = (String)settings.value(window, "true");
1000 settings.endGroup();
1001 if (text.equalsIgnoreCase("true"))
1005 } catch (java.lang.ClassCastException e) {
1006 Boolean value = (Boolean) settings.value(window, true);
1007 settings.endGroup();
1011 public static void saveEditorButtonsVisible(String column, boolean val) {
1012 settings.beginGroup("EditorButtonsVisible");
1014 settings.setValue(column, "true");
1016 settings.setValue(column, "false");
1017 settings.endGroup();
1020 // Should the test fixes be enabled
1021 public static boolean enableCarriageReturnFix() {
1023 settings.beginGroup("Debug");
1024 String text = (String)settings.value("enableCarriageReturnFix", "false");
1025 settings.endGroup();
1026 if (text.equalsIgnoreCase("true"))
1030 } catch (java.lang.ClassCastException e) {
1031 Boolean value = (Boolean) settings.value("enableCarriageReturnFix", false);
1032 settings.endGroup();
1036 public static void saveCarriageReturnFix(boolean val) {
1037 settings.beginGroup("Debug");
1039 settings.setValue("enableCarriageReturnFix", "true");
1041 settings.setValue("enableCarriageReturnFix", "false");
1042 settings.endGroup();
1044 public static boolean enableHtmlEntitiesFix() {
1046 settings.beginGroup("Debug");
1047 String text = (String)settings.value("enableHtmlEntitiesFix", "false");
1048 settings.endGroup();
1049 if (text.equalsIgnoreCase("true"))
1053 } catch (java.lang.ClassCastException e) {
1054 Boolean value = (Boolean) settings.value("enableHtmlEntitiesFix", false);
1055 settings.endGroup();
1059 public static void saveHtmlEntitiesFix(boolean val) {
1060 settings.beginGroup("Debug");
1062 settings.setValue("enableHtmlEntitiesFix", "true");
1064 settings.setValue("enableHtmlEntitiesFix", "false");
1065 settings.endGroup();
1068 // public static void setIndexThreads(int val) {
1069 // settings.beginGroup("General");
1070 // settings.setValue("indexThreads", val);
1071 // settings.endGroup();
1073 // public static int getIndexThreads() {
1074 // settings.beginGroup("General");
1077 // String val = (String)settings.value("indexThreads", "1");
1078 // threads = new Integer(val.trim());
1079 // } catch (Exception e) {
1081 // threads = (Integer)settings.value("indexThreads", 1);
1082 // } catch (Exception e1) {
1086 // settings.endGroup();
1090 // Get/Set text zoom factor
1092 public static void setZoomFactor(double val) {
1093 settings.beginGroup("General");
1094 settings.setValue("zoomFactor", val);
1095 settings.endGroup();
1097 public static double getZoomFactor() {
1098 settings.beginGroup("General");
1101 String val = (String)settings.value("zoomFactor", "1.0");
1102 threads = new Double(val.trim());
1103 } catch (Exception e) {
1105 threads = (Double)settings.value("zoomFactor", 1.0);
1106 } catch (Exception e1) {
1107 threads = new Double(1);
1110 settings.endGroup();
1113 public static void setTextSizeMultiplier(double val) {
1114 settings.beginGroup("General");
1115 settings.setValue("textMultiplier", val);
1116 settings.endGroup();
1118 public static double getTextSizeMultiplier() {
1119 settings.beginGroup("General");
1122 String val = (String)settings.value("textMultiplier", "1");
1123 threads = new Double(val.trim());
1124 } catch (Exception e) {
1126 threads = (Double)settings.value("textMultiplier", 1);
1127 } catch (Exception e1) {
1128 threads = new Double(1);
1131 settings.endGroup();
1136 // Should we mimic Evernote and restrict the notebooks selected?
1137 public static boolean getMimicEvernoteInterface() {
1138 settings.beginGroup("General");
1140 String text = (String)settings.value("mimicEvernoteInterface", "true");
1141 settings.endGroup();
1142 if (text.equalsIgnoreCase("true"))
1146 } catch (java.lang.ClassCastException e) {
1147 Boolean value = (Boolean) settings.value("mimicEvernoteInterface", true);
1148 settings.endGroup();
1152 public static void setMimicEvernoteInterface(boolean value) {
1153 settings.beginGroup("General");
1155 settings.setValue("mimicEvernoteInterface", "true");
1157 settings.setValue("mimicEvernoteInterface", "false");
1158 settings.endGroup();
1162 // Synchronize with Evernote when closing?
1163 public static boolean synchronizeOnClose() {
1164 settings.beginGroup("General");
1166 String text = (String)settings.value("synchronizeOnClose", "false");
1167 settings.endGroup();
1168 if (text.equalsIgnoreCase("true"))
1172 } catch (java.lang.ClassCastException e) {
1173 Boolean value = (Boolean) settings.value("synchronizeOnClose", false);
1174 settings.endGroup();
1178 public static void setSynchronizeOnClose(boolean val) {
1179 settings.beginGroup("General");
1181 settings.setValue("synchronizeOnClose", "true");
1183 settings.setValue("synchronizeOnClose", "false");
1184 settings.endGroup();
1187 // Get/set the database version. Not really used any more, but kept
1188 // for compatibility.
1189 public static void setDatabaseVersion(String version) {
1190 settings.beginGroup("General");
1191 settings.setValue("databaseVersion", version);
1192 settings.endGroup();
1194 public static String getDatabaseVersion() {
1195 settings.beginGroup("General");
1196 String val = (String)settings.value("databaseVersion", "0.70");
1197 settings.endGroup();
1201 // Get the URL (full path) of the main database
1202 public static String getDatabaseUrl() {
1203 settings.beginGroup("General");
1204 String val = (String)settings.value("DatabaseURL", "");
1205 settings.endGroup();
1207 val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.databaseName);
1211 // get the url (full path) of the searchable word database
1212 public static String getIndexDatabaseUrl() {
1213 settings.beginGroup("General");
1214 String val = (String)settings.value("IndexDatabaseURL", "");
1215 settings.endGroup();
1217 val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.indexDatabaseName);
1221 // Get the url (full path) of the attachment database
1222 public static String getResourceDatabaseUrl() {
1223 settings.beginGroup("General");
1224 String val = (String)settings.value("ResourceDatabaseURL", "");
1225 settings.endGroup();
1227 val = "jdbc:h2:"+Global.getFileManager().getDbDirPath(Global.resourceDatabaseName);
1232 // 操作履歴データベースのURL(フルパス)をゲット
1233 public static String getBehaviorDatabaseUrl() {
1234 settings.beginGroup("General");
1235 String val = (String) settings.value("BehaviorDatabaseURL", "");
1236 settings.endGroup();
1239 + Global.getFileManager().getDbDirPath(
1240 Global.behaviorDatabaseName);
1244 public static void setDatabaseUrl(String value) {
1245 settings.beginGroup("General");
1246 settings.setValue("DatabaseURL", value);
1247 settings.endGroup();
1249 public static void setIndexDatabaseUrl(String value) {
1250 settings.beginGroup("General");
1251 settings.setValue("IndexDatabaseURL", value);
1252 settings.endGroup();
1254 public static void setResourceDatabaseUrl(String value) {
1255 settings.beginGroup("General");
1256 settings.setValue("ResourceDatabaseURL", value);
1257 settings.endGroup();
1261 public static void setBehaviorDatabaseUrl(String value) {
1262 settings.beginGroup("General");
1263 settings.setValue("BehaviorDatabaseURL", value);
1264 settings.endGroup();
1267 public static String getDatabaseUserid() {
1268 settings.beginGroup("General");
1269 String val = (String)settings.value("databaseUserid", "");
1270 settings.endGroup();
1273 public static String getDatabaseUserPassword() {
1274 settings.beginGroup("General");
1275 String val = (String)settings.value("databaseUserPassword", "");
1276 settings.endGroup();
1280 // get/Set the style sheet and the palette to control the look & feel
1281 public static void setStyle(String style) {
1282 settings.beginGroup("General");
1283 settings.setValue("style", style);
1284 settings.endGroup();
1286 public static String getStyle() {
1287 settings.beginGroup("General");
1288 String val = (String)settings.value("style", "Cleanlooks");
1289 settings.endGroup();
1292 public static boolean useStandardPalette() {
1293 settings.beginGroup("General");
1295 String text = (String)settings.value("standardPalette", "true");
1296 settings.endGroup();
1297 if (text.equalsIgnoreCase("true"))
1301 } catch (java.lang.ClassCastException e) {
1302 Boolean value = (Boolean) settings.value("standardPalette", true);
1303 settings.endGroup();
1307 public static void setStandardPalette(boolean val) {
1308 settings.beginGroup("General");
1310 settings.setValue("standardPalette", "true");
1312 settings.setValue("standardPalette", "false");
1313 settings.endGroup();
1316 // Set the amount of time to wait between indexing
1317 // Get/Set interval when the index thread wakes up.
1318 public static void setIndexThreadSleepInterval(int sleep) {
1319 settings.beginGroup("General");
1320 settings.setValue("IndexThreadSleepInterval", sleep);
1321 settings.endGroup();
1323 public static int getIndexThreadSleepInterval() {
1324 settings.beginGroup("General");
1327 String val = (String)settings.value("IndexThreadSleepInterval", "300");
1328 sleep = new Integer(val.trim());
1329 } catch (Exception e) {
1331 sleep = (Integer)settings.value("IndexThreadSleepInterval", 0);
1332 } catch (Exception e1) {
1336 settings.endGroup();
1341 // Get/Set a window state for later restoring
1342 public static void saveState(String name, QByteArray state) {
1343 int view = Global.getListView();
1344 if (view == Global.View_List_Narrow)
1345 name = name +"Narrow";
1346 settings.beginGroup("SaveState");
1347 settings.setValue(name, state);
1348 settings.endGroup();
1351 public static QByteArray restoreState(String name) {
1352 int view = Global.getListView();
1353 if (view == Global.View_List_Narrow)
1354 name = name +"Narrow";
1355 settings.beginGroup("SaveState");
1356 QByteArray state = (QByteArray)settings.value(name);
1357 settings.endGroup();
1360 public static void saveGeometry(String name, QByteArray state) {
1361 int view = Global.getListView();
1362 if (view == Global.View_List_Narrow)
1363 settings.beginGroup("SaveGeometryNarrow");
1365 settings.beginGroup("SaveGeometry");
1366 settings.setValue(name, state);
1367 settings.endGroup();
1370 public static QByteArray restoreGeometry(String name) {
1371 int view = Global.getListView();
1372 if (view == Global.View_List_Narrow)
1373 settings.beginGroup("SaveGeometryNarrow");
1375 settings.beginGroup("SaveGeometry");
1376 QByteArray state = (QByteArray)settings.value(name);
1377 settings.endGroup();
1382 // Set how often to do an automatic save
1383 public static void setAutoSaveInterval(int interval) {
1384 settings.beginGroup("General");
1385 settings.setValue("autoSaveInterval", interval);
1386 settings.endGroup();
1388 public static int getAutoSaveInterval() {
1389 settings.beginGroup("General");
1392 String val = (String)settings.value("autoSaveInterval", "5");
1393 value = new Integer(val.trim());
1394 } catch (Exception e) {
1396 value = (Integer)settings.value("autoSaveInterval", 5);
1397 } catch (Exception e1) {
1401 settings.endGroup();
1405 // Add an invalid attribute & element to the database so we don't bother parsing it in the future
1406 // These values we automatically remove from any note.
1407 // Add invalid attributes
1408 public static void addInvalidAttribute(String element, String attribute) {
1410 List<String> attributes = invalidAttributes.get(element);
1411 if (attributes != null) {
1412 for (int i=0; i<attributes.size(); i++)
1413 if (attribute.equalsIgnoreCase(attributes.get(i))) {
1418 ArrayList<String> attributeList;
1419 if (!invalidAttributes.containsKey(element)) {
1420 attributeList = new ArrayList<String>();
1421 attributeList.add(attribute);
1422 invalidAttributes.put(element, attributeList);
1425 attributeList = invalidAttributes.get(element);
1426 attributeList.add(attribute);
1427 invalidAttributes.put(element,attributeList);
1431 // Add invalid attributes
1432 public static void addInvalidElement(String element) {
1433 for (int i=0; i<invalidElements.size(); i++) {
1434 if (element.equalsIgnoreCase(invalidElements.get(i)))
1437 invalidElements.add(element);
1440 // Get/Set proxy information
1442 public static String getProxyValue(String key) {
1443 settings.beginGroup("Proxy");
1444 String val = (String)settings.value(key, "");
1445 settings.endGroup();
1448 public static void setProxyValue(String key, String value) {
1449 settings.beginGroup("Proxy");
1450 settings.setValue(key, value);
1451 settings.endGroup();
1454 // Change a byte array to a hex string
1455 // Convert a byte array to a hex string
1456 public static String byteArrayToHexString(byte data[]) {
1457 StringBuffer buf = new StringBuffer();
1458 for (byte element : data) {
1459 int halfbyte = (element >>> 4) & 0x0F;
1462 if ((0 <= halfbyte) && (halfbyte <= 9))
1463 buf.append((char) ('0' + halfbyte));
1465 buf.append((char) ('a' + (halfbyte - 10)));
1466 halfbyte = element & 0x0F;
1467 } while(two_halfs++ < 1);
1469 return buf.toString();
1473 // Get/Set spelling settings
1474 public static boolean getSpellSetting(String value) {
1475 settings.beginGroup("Spell");
1476 String text = (String)settings.value(value, "");
1477 settings.endGroup();
1478 if (text.equalsIgnoreCase("true"))
1480 if (text.equalsIgnoreCase("false"))
1482 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREDIGITWORDS))
1484 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREINTERNETADDRESSES))
1486 if (value.equalsIgnoreCase(Configuration.SPELL_IGNOREUPPERCASE))
1488 if (value.equalsIgnoreCase(Configuration.SPELL_IGNORESENTENCECAPITALIZATION))
1492 public static void setSpellSetting(String setting, boolean val) {
1493 settings.beginGroup("Spell");
1495 settings.setValue(setting, "true");
1497 settings.setValue(setting, "false");
1498 settings.endGroup();
1501 // Get/Set how we should display tags (color them, hide unused, or do nothing)
1502 // What to do with inactive tags?
1503 public static String tagBehavior() {
1504 settings.beginGroup("General");
1505 String text = (String)settings.value("tagBehavior", "DoNothing");
1506 settings.endGroup();
1509 // What to do with inactive tags?
1510 public static void setTagBehavior(String value) {
1511 settings.beginGroup("General");
1512 settings.setValue("tagBehavior", value);
1513 settings.endGroup();
1517 // Should the toolbar be visible?
1518 public static boolean isToolbarButtonVisible(String window) {
1519 settings.beginGroup("ToolbarButtonsVisible");
1521 String text = (String)settings.value(window, "true");
1522 settings.endGroup();
1523 if (text.equalsIgnoreCase("true"))
1527 } catch (java.lang.ClassCastException e) {
1528 Boolean value = (Boolean) settings.value(window, true);
1529 settings.endGroup();
1533 public static void saveToolbarButtonsVisible(String column, boolean val) {
1534 settings.beginGroup("ToolbarButtonsVisible");
1536 settings.setValue(column, "true");
1538 settings.setValue(column, "false");
1539 settings.endGroup();
1542 // Are thumbnails enabled?
1544 public static boolean enableThumbnails() {
1545 settings.beginGroup("Debug");
1547 String text = (String)settings.value("thumbnails", "true");
1548 settings.endGroup();
1549 if (text.equalsIgnoreCase("true"))
1553 } catch (java.lang.ClassCastException e) {
1554 Boolean value = (Boolean) settings.value("thumbnails", true);
1555 settings.endGroup();
1559 public static void setEnableThumbnails(boolean val) {
1560 settings.beginGroup("Debug");
1562 settings.setValue("thumbnails", "true");
1564 settings.setValue("thumbnails", "false");
1565 settings.endGroup();
1568 // Trace used for performance tuning. Not normally used in production.
1569 // Print date/time. Used mainly for performance tracing
1570 public static void trace(boolean resetInterval) {
1571 String fmt = "MM/dd/yy HH:mm:ss.SSSSSS";
1572 String dateTimeFormat = new String(fmt);
1573 SimpleDateFormat simple = new SimpleDateFormat(dateTimeFormat);
1574 Calendar cal = Calendar.getInstance();
1575 if (intervalTraceTime == null)
1576 intervalTraceTime = Calendar.getInstance();
1577 if (startTraceTime == null)
1578 startTraceTime = Calendar.getInstance();
1580 float interval = (cal.getTimeInMillis() - intervalTraceTime.getTimeInMillis());
1581 float total = (cal.getTimeInMillis() - startTraceTime.getTimeInMillis());
1583 // if (interval > 00.0) {
1584 StackTraceElement[] exceptions = Thread.currentThread().getStackTrace();
1585 System.out.println("------------------------------------------");
1587 System.out.println("Date/Time " +simple.format(cal.getTime()));
1588 System.out.format("Interval Time: %-10.6f%n", interval);
1589 System.out.format("Total Time: %-10.6f%n", total);
1590 for (int i=2; i<5 && i<exceptions.length; i++) {
1591 System.out.println(exceptions[i]);
1595 intervalTraceTime = cal;
1597 public static void traceReset() {
1598 intervalTraceTime = null;
1599 startTraceTime = null;
1603 // Get the FileManager class to manage local files & directories
1604 public static FileManager getFileManager() {
1608 // Should the note editor be disabled?
1609 public static boolean getDisableViewing() {
1610 return disableViewing;
1613 //**********************
1614 //* Thumbnail zoom level
1615 //**********************
1616 public static int calculateThumbnailZoom(String content) {
1618 if (content.indexOf("application/pdf") == -1) {
1619 if (content.indexOf("image/") == -1) {
1620 String text = StringEscapeUtils.unescapeHtml4(content.replaceAll("\\<.*?\\>", ""));
1622 if (text.length() < 500)
1624 if (text.length() < 250)
1626 if (text.length() < 100)
1628 if (text.length() < 50)
1630 if (text.length() < 10)
1637 //**********************
1638 //* List View settings
1639 //**********************
1640 public static void setListView(int view) {
1641 settings.beginGroup("General");
1642 settings.setValue("listView", view);
1643 settings.endGroup();
1645 public static int getListView() {
1646 settings.beginGroup("General");
1649 String val = (String)settings.value("listView", View_List_Wide);
1650 value = new Integer(val.trim());
1651 } catch (Exception e) {
1653 value = (Integer)settings.value("listView", View_List_Wide);
1654 } catch (Exception e1) {
1655 value = View_List_Wide;
1658 settings.endGroup();
1664 //*******************
1666 //*******************
1667 public static boolean overrideDefaultFont() {
1668 settings.beginGroup("Font");
1670 String text = (String)settings.value("overrideFont", "false");
1671 settings.endGroup();
1672 if (text.equalsIgnoreCase("true"))
1676 } catch (java.lang.ClassCastException e) {
1677 Boolean value = (Boolean) settings.value("overrideFont", false);
1678 settings.endGroup();
1684 //****************************************************
1685 // Get/Set the default font settings for a new note
1686 //****************************************************
1687 public static void setOverrideDefaultFont(boolean value) {
1688 settings.beginGroup("Font");
1689 settings.setValue("overrideFont", value);
1690 settings.endGroup();
1692 public static String getDefaultFont() {
1693 settings.beginGroup("Font");
1694 String val = (String)settings.value("font", "");
1695 settings.endGroup();
1698 public static void setDefaultFont(String value) {
1699 settings.beginGroup("Font");
1700 settings.setValue("font", value);
1701 settings.endGroup();
1703 public static String getDefaultFontSize() {
1704 settings.beginGroup("Font");
1705 String val = (String)settings.value("fontSize", "");
1706 settings.endGroup();
1709 public static void setDefaultFontSize(String value) {
1710 settings.beginGroup("Font");
1711 settings.setValue("fontSize", value);
1712 settings.endGroup();
1716 //*******************************************
1717 // Override the close & minimize instead.
1718 //*******************************************
1719 public static boolean minimizeOnClose() {
1720 settings.beginGroup("General");
1722 String text = (String)settings.value("minimizeOnClose", "false");
1723 settings.endGroup();
1724 if (text.equalsIgnoreCase("true") && QSystemTrayIcon.isSystemTrayAvailable())
1728 } catch (java.lang.ClassCastException e) {
1729 Boolean value = (Boolean) settings.value("minimizeOnClose", false);
1730 settings.endGroup();
1734 public static void setMinimizeOnClose(boolean value) {
1735 settings.beginGroup("General");
1736 settings.setValue("minimizeOnClose", value);
1737 settings.endGroup();
1740 //*********************************
1741 // Check version information
1742 //*********************************
1743 public static boolean checkVersionUpgrade() {
1744 settings.beginGroup("Upgrade");
1746 String text = (String)settings.value("checkForUpdates", "true");
1747 settings.endGroup();
1748 if (text.equalsIgnoreCase("true"))
1752 } catch (java.lang.ClassCastException e) {
1753 Boolean value = (Boolean) settings.value("checkForUpdates", true);
1754 settings.endGroup();
1758 public static void setCheckVersionUpgrade(boolean value) {
1759 settings.beginGroup("Upgrade");
1760 settings.setValue("checkForUpdates", value);
1761 settings.endGroup();
1763 public static String getUpdatesAvailableUrl() {
1764 settings.beginGroup("Upgrade");
1765 String text = (String)settings.value("avialableUrl", "http://nevernote.sourceforge.net/versions.txt");
1766 settings.endGroup();
1769 public static String getUpdateAnnounceUrl() {
1770 settings.beginGroup("Upgrade");
1771 String text = (String)settings.value("announceUrl", "http://nevernote.sourceforge.net/upgrade.html");
1772 settings.endGroup();
1776 //*******************
1778 //*******************
1779 // Set/Get if we should index the text of a note
1780 public static boolean indexNoteBody() {
1781 settings.beginGroup("Index");
1783 String value = (String)settings.value("indexNoteBody", "true");
1784 settings.endGroup();
1785 if (value.equals("true"))
1789 } catch (java.lang.ClassCastException e) {
1790 Boolean value = (Boolean) settings.value("indexNoteBody", true);
1791 settings.endGroup();
1795 public static void setIndexNoteTitle(boolean value) {
1796 settings.beginGroup("Index");
1797 settings.setValue("indexNoteTitle", value);
1798 settings.endGroup();
1800 // Set/Get if we should index the title of a note
1801 public static boolean indexNoteTitle() {
1802 settings.beginGroup("Index");
1804 String value = (String)settings.value("indexNoteTitle", "true");
1805 settings.endGroup();
1806 if (value.equals("true"))
1810 } catch (java.lang.ClassCastException e) {
1811 Boolean value = (Boolean) settings.value("indexNoteTitle", true);
1812 settings.endGroup();
1816 public static void setIndexNoteBody(boolean value) {
1817 settings.beginGroup("Index");
1818 settings.setValue("indexNoteBody", value);
1819 settings.endGroup();
1821 // Set/Get if we should index any attachments
1822 public static boolean indexAttachmentsLocally() {
1823 settings.beginGroup("Index");
1825 String value = (String)settings.value("indexAttachmentsLocally", "true");
1826 settings.endGroup();
1827 if (value.equals("true"))
1831 } catch (java.lang.ClassCastException e) {
1832 Boolean value = (Boolean) settings.value("indexAttachmentsLocally", true);
1833 settings.endGroup();
1837 public static void setIndexImageRecognition(boolean value) {
1838 settings.beginGroup("Index");
1839 settings.setValue("indexImageRecognition", value);
1840 settings.endGroup();
1842 public static boolean indexImageRecognition() {
1843 settings.beginGroup("Index");
1845 String value = (String)settings.value("indexImageRecognition", "true");
1846 settings.endGroup();
1847 if (value.equals("true"))
1851 } catch (java.lang.ClassCastException e) {
1852 Boolean value = (Boolean) settings.value("indexImageRecognition", true);
1853 settings.endGroup();
1857 public static void setIndexAttachmentsLocally(boolean value) {
1858 settings.beginGroup("Index");
1859 settings.setValue("indexAttachmentsLocally", value);
1860 settings.endGroup();
1862 // Get/Set characters that shouldn't be removed from a word
1863 public static String getSpecialIndexCharacters() {
1864 settings.beginGroup("Index");
1865 String text = (String)settings.value("specialCharacters", "");
1866 settings.endGroup();
1869 public static void setSpecialIndexCharacters(String value) {
1870 settings.beginGroup("Index");
1871 settings.setValue("specialCharacters", value);
1872 settings.endGroup();
1873 databaseCache = value;
1876 //*****************************************************************************
1877 // Control how tag selection behaves (should they be "and" or "or" selections
1878 //*****************************************************************************
1879 public static boolean anyTagSelectionMatch() {
1880 settings.beginGroup("General");
1882 String value = (String)settings.value("anyTagSelectionMatch", "false");
1883 settings.endGroup();
1884 if (value.equals("true"))
1888 } catch (java.lang.ClassCastException e) {
1889 Boolean value = (Boolean) settings.value("anyTagSelectionMatch", false);
1890 settings.endGroup();
1894 public static void setAnyTagSelectionMatch(boolean value) {
1895 settings.beginGroup("General");
1896 settings.setValue("anyTagSelectionMatch", value);
1897 settings.endGroup();
1900 //*****************************************************************************
1901 // Control if a user receives a warning when trying to create a note-to-note link
1902 // when the DB is not synchronized.
1903 //*****************************************************************************
1904 public static boolean bypassSynchronizationWarning() {
1905 settings.beginGroup("User");
1907 String value = (String)settings.value("bypassSynchronizationWarning", "false");
1908 settings.endGroup();
1909 if (value.equals("true"))
1913 } catch (java.lang.ClassCastException e) {
1914 Boolean value = (Boolean) settings.value("bypassSynchronizationWarning", false);
1915 settings.endGroup();
1919 public static void setBypassSynchronizationWarning(boolean value) {
1920 settings.beginGroup("User");
1921 settings.setValue("bypassSynchronizationWarning", value);
1922 settings.endGroup();
1926 //***********************
1927 //* Database cache size
1928 //***********************
1929 public static String getDatabaseCacheSize() {
1930 settings.beginGroup("Debug");
1931 String text = (String)settings.value("databaseCache", "16384");
1932 settings.endGroup();
1935 public static void setDatabaseCache(String value) {
1936 settings.beginGroup("Debug");
1937 settings.setValue("databaseCache", value);
1938 settings.endGroup();
1939 databaseCache = value;
1943 // This is used to copy a class since Java's normal deep copy is wacked
1944 public static Object deepCopy(Object oldObj)
1946 ObjectOutputStream oos = null;
1947 ObjectInputStream ois = null;
1950 ByteArrayOutputStream bos =
1951 new ByteArrayOutputStream(); // A
1952 oos = new ObjectOutputStream(bos); // B
1953 // serialize and pass the object
1954 oos.writeObject(oldObj); // C
1956 ByteArrayInputStream bin =
1957 new ByteArrayInputStream(bos.toByteArray()); // E
1958 ois = new ObjectInputStream(bin); // F
1959 // return the new object
1960 return ois.readObject(); // G
1964 Global.logger.log(logger.LOW, "Exception in ObjectCloner = " + e);
1969 } catch (IOException e) {
1970 Global.logger.log(logger.LOW, "Exception in ObjectCloner = " + e);
1971 e.printStackTrace();
1977 // If we should automatically select the children of any tag
1978 public static boolean includeTagChildren() {
1979 settings.beginGroup("General");
1981 String value = (String)settings.value("includeTagChildren", "false");
1982 settings.endGroup();
1983 if (value.equals("true"))
1987 } catch (java.lang.ClassCastException e) {
1988 Boolean value = (Boolean) settings.value("includeTagChildren", false);
1989 settings.endGroup();
1994 public static void setIncludeTagChildren(boolean value) {
1995 settings.beginGroup("General");
1996 settings.setValue("includeTagChildren", value);
1997 settings.endGroup();
2000 // If we should automatically wildcard searches
2001 public static boolean automaticWildcardSearches() {
2002 settings.beginGroup("General");
2004 String value = (String)settings.value("automaticWildcard", "false");
2005 settings.endGroup();
2006 if (value.equals("true"))
2010 } catch (java.lang.ClassCastException e) {
2011 Boolean value = (Boolean) settings.value("automaticWildcard", false);
2012 settings.endGroup();
2017 public static void setAutomaticWildcardSearches(boolean value) {
2018 settings.beginGroup("General");
2019 settings.setValue("automaticWildcard", value);
2020 settings.endGroup();
2023 // If we should automatically select the children of any tag
2024 public static boolean displayRightToLeft() {
2025 settings.beginGroup("General");
2027 String value = (String)settings.value("displayRightToLeft", "false");
2028 settings.endGroup();
2029 if (value.equals("true"))
2033 } catch (java.lang.ClassCastException e) {
2034 Boolean value = (Boolean) settings.value("displayRightToLeft", false);
2035 settings.endGroup();
2040 public static void setDisplayRightToLeft(boolean value) {
2041 settings.beginGroup("General");
2042 settings.setValue("displayRightToLeft", value);
2043 settings.endGroup();
2047 //***********************
2048 //* Startup Notebook
2049 //***********************
2050 public static String getStartupNotebook() {
2051 settings.beginGroup("General");
2052 String text = (String)settings.value("startupNotebook", "");
2053 settings.endGroup();
2056 public static void setStartupNotebook(String value) {
2057 settings.beginGroup("General");
2058 settings.setValue("startupNotebook", value);
2059 settings.endGroup();
2060 databaseCache = value;
2064 // 複数ノート同時閲覧操作に対する重み付け
2065 public static void setBrowseWeight(int weight) {
2066 settings.beginGroup("RensoNoteList");
2067 settings.setValue("browseWeight", weight);
2068 settings.endGroup();
2070 public static int getBrowseWeight() {
2071 settings.beginGroup("RensoNoteList");
2074 String val = (String)settings.value("browseWeight", 1);
2075 value = new Integer(val.trim());
2076 } catch (Exception e) {
2078 value = (Integer)settings.value("browseWeight", 1);
2079 } catch (Exception e1) {
2083 settings.endGroup();
2088 // ノート内容のコピー&ペースト操作に対する重み付け
2089 public static void setCopyPasteWeight(int weight) {
2090 settings.beginGroup("RensoNoteList");
2091 settings.setValue("copyPasteWeight", weight);
2092 settings.endGroup();
2094 public static int getCopyPasteWeight() {
2095 settings.beginGroup("RensoNoteList");
2098 String val = (String)settings.value("copyPasteWeight", 3);
2099 value = new Integer(val.trim());
2100 } catch (Exception e) {
2102 value = (Integer)settings.value("copyPasteWeight", 3);
2103 } catch (Exception e1) {
2107 settings.endGroup();
2112 // 新規ノート追加操作に対する重み付け
2113 public static void setAddNewNoteWeight(int weight) {
2114 settings.beginGroup("RensoNoteList");
2115 settings.setValue("addNewNoteWeight", weight);
2116 settings.endGroup();
2118 public static int getAddNewNoteWeight() {
2119 settings.beginGroup("RensoNoteList");
2122 String val = (String)settings.value("addNewNoteWeight", 1);
2123 value = new Integer(val.trim());
2124 } catch (Exception e) {
2126 value = (Integer)settings.value("addNewNoteWeight", 1);
2127 } catch (Exception e1) {
2131 settings.endGroup();
2136 // 連想ノートクリック操作に対する重み付け
2137 public static void setRensoItemClickWeight(int weight) {
2138 settings.beginGroup("RensoNoteList");
2139 settings.setValue("rensoItemClickWeight", weight);
2140 settings.endGroup();
2142 public static int getRensoItemClickWeight() {
2143 settings.beginGroup("RensoNoteList");
2146 String val = (String)settings.value("rensoItemClickWeight", 10);
2147 value = new Integer(val.trim());
2148 } catch (Exception e) {
2150 value = (Integer)settings.value("rensoItemClickWeight", 10);
2151 } catch (Exception e1) {
2155 settings.endGroup();
2161 public static void setSameTagWeight(int weight) {
2162 settings.beginGroup("RensoNoteList");
2163 settings.setValue("sameTagWeight", weight);
2164 settings.endGroup();
2166 public static int getSameTagWeight() {
2167 settings.beginGroup("RensoNoteList");
2170 String val = (String)settings.value("sameTagWeight", 2);
2171 value = new Integer(val.trim());
2172 } catch (Exception e) {
2174 value = (Integer)settings.value("sameTagWeight", 2);
2175 } catch (Exception e1) {
2179 settings.endGroup();
2184 // ノートブック変更操作に対する重み付け
2185 public static void setSameNotebookWeight(int weight) {
2186 settings.beginGroup("RensoNoteList");
2187 settings.setValue("sameNotebookWeight", weight);
2188 settings.endGroup();
2190 public static int getSameNotebookWeight() {
2191 settings.beginGroup("RensoNoteList");
2194 String val = (String)settings.value("sameNotebookWeight", 2);
2195 value = new Integer(val.trim());
2196 } catch (Exception e) {
2198 value = (Integer)settings.value("sameNotebookWeight", 2);
2199 } catch (Exception e1) {
2203 settings.endGroup();
2207 //*******************
2208 // ノートのマージ・複製の関連ノートリストへの適用
2209 //*******************
2211 public static void setMergeRensoNote(boolean value) {
2212 settings.beginGroup("RensoNoteList");
2213 settings.setValue("mergeRensoNoteList", value);
2214 settings.endGroup();
2217 public static boolean getMergeRensoNote() {
2218 settings.beginGroup("RensoNoteList");
2220 String value = (String)settings.value("mergeRensoNoteList", "true");
2221 settings.endGroup();
2222 if (value.equals("true"))
2226 } catch (java.lang.ClassCastException e) {
2227 Boolean value = (Boolean) settings.value("mergeRensoNoteList", true);
2228 settings.endGroup();
2233 public static void setDuplicateRensoNote(boolean value) {
2234 settings.beginGroup("RensoNoteList");
2235 settings.setValue("duplicateRensoNoteList", value);
2236 settings.endGroup();
2239 public static boolean getDuplicateRensoNote() {
2240 settings.beginGroup("RensoNoteList");
2242 String value = (String)settings.value("duplicateRensoNoteList", "true");
2243 settings.endGroup();
2244 if (value.equals("true"))
2248 } catch (java.lang.ClassCastException e) {
2249 Boolean value = (Boolean) settings.value("duplicateRensoNoteList", true);
2250 settings.endGroup();
2256 // 連想ノートリストからノートを除外するときに確認メッセージを表示するかどうか
2257 public static boolean verifyExclude() {
2258 settings.beginGroup("RensoNoteList");
2260 String text = (String)settings.value("verifyExclude", "true");
2261 settings.endGroup();
2262 if (text.equalsIgnoreCase("true"))
2266 } catch (java.lang.ClassCastException e) {
2267 Boolean value = (Boolean) settings.value("verifyExclude", true);
2268 settings.endGroup();
2273 public static void setVerifyExclude(boolean val) {
2274 settings.beginGroup("RensoNoteList");
2276 settings.setValue("verifyExclude", "true");
2278 settings.setValue("verifyExclude", "false");
2279 settings.endGroup();
2283 // 連想ノートリスト最大表示アイテム数
2284 public static void setRensoListItemMaximum(int maximum) {
2285 settings.beginGroup("RensoNoteList");
2286 settings.setValue("rensoListMaximum", maximum);
2287 settings.endGroup();
2289 public static int getRensoListItemMaximum() {
2290 settings.beginGroup("RensoNoteList");
2293 String val = (String)settings.value("rensoListMaximum", 20);
2294 value = new Integer(val.trim());
2295 } catch (Exception e) {
2297 value = (Integer)settings.value("rensoListMaximum", 20);
2298 } catch (Exception e1) {
2302 settings.endGroup();