OSDN Git Service

ノートの編集直後にそのタブを閉じると編集内容が保存されない問題を修正。
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / NeverNote.java
index 7728f11..9d78b24 100644 (file)
@@ -42,6 +42,7 @@ import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.SortedMap;
 import java.util.Vector;
 
@@ -103,7 +104,6 @@ import com.trolltech.qt.gui.QApplication;
 import com.trolltech.qt.gui.QClipboard;
 import com.trolltech.qt.gui.QCloseEvent;
 import com.trolltech.qt.gui.QColor;
-import com.trolltech.qt.gui.QComboBox;
 import com.trolltech.qt.gui.QCursor;
 import com.trolltech.qt.gui.QDesktopServices;
 import com.trolltech.qt.gui.QDialog;
@@ -115,7 +115,6 @@ import com.trolltech.qt.gui.QHBoxLayout;
 import com.trolltech.qt.gui.QIcon;
 import com.trolltech.qt.gui.QImage;
 import com.trolltech.qt.gui.QKeySequence;
-import com.trolltech.qt.gui.QLabel;
 import com.trolltech.qt.gui.QListWidgetItem;
 import com.trolltech.qt.gui.QMainWindow;
 import com.trolltech.qt.gui.QMenu;
@@ -128,7 +127,6 @@ import com.trolltech.qt.gui.QPrintDialog;
 import com.trolltech.qt.gui.QPrinter;
 import com.trolltech.qt.gui.QShortcut;
 import com.trolltech.qt.gui.QSizePolicy;
-import com.trolltech.qt.gui.QSizePolicy.Policy;
 import com.trolltech.qt.gui.QSpinBox;
 import com.trolltech.qt.gui.QSplashScreen;
 import com.trolltech.qt.gui.QSplitter;
@@ -138,6 +136,7 @@ import com.trolltech.qt.gui.QTableWidgetItem;
 import com.trolltech.qt.gui.QTextEdit;
 import com.trolltech.qt.gui.QToolBar;
 import com.trolltech.qt.gui.QTreeWidgetItem;
+import com.trolltech.qt.gui.QWidget;
 import com.trolltech.qt.network.QNetworkAccessManager;
 import com.trolltech.qt.network.QNetworkProxy;
 import com.trolltech.qt.network.QNetworkProxy.ProxyType;
@@ -184,13 +183,14 @@ import cx.fbn.nevernote.gui.NotebookTreeWidget;
 import cx.fbn.nevernote.gui.RensoNoteList;
 import cx.fbn.nevernote.gui.RensoNoteListDock;
 import cx.fbn.nevernote.gui.SavedSearchTreeWidget;
-import cx.fbn.nevernote.gui.SearchPanel;
+import cx.fbn.nevernote.gui.SearchEdit;
 import cx.fbn.nevernote.gui.TabBrowse;
 import cx.fbn.nevernote.gui.TabBrowserWidget;
 import cx.fbn.nevernote.gui.TableView;
 import cx.fbn.nevernote.gui.TagTreeWidget;
 import cx.fbn.nevernote.gui.Thumbnailer;
 import cx.fbn.nevernote.gui.TrashTreeWidget;
+import cx.fbn.nevernote.gui.ZoomPanel;
 import cx.fbn.nevernote.gui.controls.QuotaProgressBar;
 import cx.fbn.nevernote.oauth.OAuthTokenizer;
 import cx.fbn.nevernote.oauth.OAuthWindow;
@@ -236,7 +236,7 @@ public class NeverNote extends QMainWindow{
 
     public BrowserWindow       browserWindow;                          // Window containing browser & labels
     public QToolBar            toolBar;                                        // The tool bar under the menu
-    QComboBox                          searchField;                            // search filter bar on the toolbar;
+    SearchEdit                         searchField;                            // search filter bar on the toolbar;
     QShortcut                          searchShortcut;                         // Shortcut to search bar
     boolean                                    searchPerformed = false;        // Search was done?
     QuotaProgressBar           quotaBar;                                       // The current quota usage
@@ -307,7 +307,7 @@ public class NeverNote extends QMainWindow{
     QSpinBox                   zoomSpinner;                            // Zoom zoom
     QAction                            searchClearButton;                      // Clear the search field
     
-    SearchPanel                        searchLayout;                           // Widget to hold search field, zoom, & quota
+    ZoomPanel                  zoomLayout;                                     // Widget to hold search field, zoom, & quota
     
     QSplitter                  mainLeftRightSplitter;          // main splitter for left/right side
     QSplitter                  leftSplitter1;                          // first left hand splitter
@@ -544,17 +544,6 @@ public class NeverNote extends QMainWindow{
         trashTree = new TrashTreeWidget();
                noteTableView = new TableView(logger, listManager, this);     
         
-        searchField = new QComboBox();
-        searchField.setObjectName("searchField");
-        //setStyleSheet("QComboBox#searchField { background-color: yellow }");
-        searchField.setEditable(true);
-       searchField.activatedIndex.connect(this, "searchFieldChanged()");
-       searchField.setDuplicatesEnabled(false);
-       searchField.editTextChanged.connect(this,"searchFieldTextChanged(String)");
-       searchShortcut = new QShortcut(this);
-       setupShortcut(searchShortcut, "Focus_Search");
-       searchShortcut.activated.connect(this, "focusSearch()");
-        
        quotaBar = new QuotaProgressBar();
        // Setup the zoom
        zoomSpinner = new QSpinBox();
@@ -565,13 +554,13 @@ public class NeverNote extends QMainWindow{
        zoomSpinner.setValue(100);
        zoomSpinner.valueChanged.connect(this, "zoomChanged()");
        
-       searchLayout = new SearchPanel(searchField, quotaBar, notebookTree, zoomSpinner);
+       zoomLayout = new ZoomPanel(quotaBar, notebookTree, zoomSpinner);
         
         
         QGridLayout leftGrid = new QGridLayout();
         leftSplitter1.setContentsMargins(5, 0, 0, 7);
         leftSplitter1.setLayout(leftGrid);
-       leftGrid.addWidget(searchLayout,1,1);
+       leftGrid.addWidget(zoomLayout,1,1);
         leftGrid.addWidget(tagTree,2,1);
         leftGrid.addWidget(attributeTree,3,1);
         leftGrid.addWidget(savedSearchTree,4,1);
@@ -599,7 +588,7 @@ public class NeverNote extends QMainWindow{
                int index = tabBrowser.addNewTab(tab, "");
                tabWindows.put(index, tab);
                tabBrowser.currentChanged.connect(this, "tabWindowChanged(int)");
-               tabBrowser.tabCloseRequested.connect(this, "tabWindowClosing(int)");
+               tabBrowser.tabCloseRequested.connect(this, "tabCloseRequested(int)");
                
                noteDirty = new HashMap<Integer, Boolean>();
                noteDirty.put(index, false);
@@ -663,7 +652,7 @@ public class NeverNote extends QMainWindow{
                listManager.tagSignal.listChanged.connect(this, "reloadTagTree()");
                
                if (!Global.isWindowVisible("zoom")) {
-                       searchLayout.hideZoom();
+                       zoomLayout.hideZoom();
                        menuBar.hideZoom.setChecked(false);
                } 
        
@@ -740,14 +729,8 @@ public class NeverNote extends QMainWindow{
                if (!Global.isWindowVisible("quota"))
                        menuBar.hideQuota.setChecked(false);
                
-               searchField.setVisible(Global.isWindowVisible("searchField"));
-               // IFIXED !searchField.isVisible() → !Global.isWindowVisible("searchField")
-               // なぜかsearchField.isVisible()が常にfalseを返すようなので修正
-               if (!Global.isWindowVisible("searchField"))
-                       menuBar.hideSearch.setChecked(false);
-               
-               if (searchField.isHidden() && quotaBar.isHidden() && zoomSpinner.isHidden() && notebookTree.isHidden())
-                       searchLayout.hide();
+               if (quotaBar.isHidden() && zoomSpinner.isHidden() && notebookTree.isHidden())
+                       zoomLayout.hide();
                
                setMenuBar(menuBar);
                setupToolBar();
@@ -1584,15 +1567,22 @@ public class NeverNote extends QMainWindow{
        @SuppressWarnings("unused")
        private void toggleSearchWindow() {
                logger.log(logger.HIGH, "Entering NeverNote.toggleSearchWindow");
-       searchLayout.toggleSearchField();
+               toggleSearchField();
        menuBar.hideSearch.setChecked(searchField.isVisible());
        Global.saveWindowVisible("searchField", searchField.isVisible());
        logger.log(logger.HIGH, "Leaving NeverNote.toggleSearchWindow");
-    }  
+    }
+       private void toggleSearchField() {
+               if (searchField.isVisible())
+                       searchField.hide();
+               else
+                       searchField.show();
+       }
+       
        @SuppressWarnings("unused")
        private void toggleQuotaWindow() {
                logger.log(logger.HIGH, "Entering NeverNote.toggleQuotaWindow");
-       searchLayout.toggleQuotaBar();
+       zoomLayout.toggleQuotaBar();
        menuBar.hideQuota.setChecked(quotaBar.isVisible());
        Global.saveWindowVisible("quota", quotaBar.isVisible());
        logger.log(logger.HIGH, "Leaving NeverNote.toggleQuotaWindow");
@@ -1600,7 +1590,7 @@ public class NeverNote extends QMainWindow{
        @SuppressWarnings("unused")
        private void toggleZoomWindow() {
                logger.log(logger.HIGH, "Entering NeverNote.toggleZoomWindow");
-       searchLayout.toggleZoom();
+       zoomLayout.toggleZoom();
        menuBar.hideZoom.setChecked(zoomSpinner.isVisible());
        Global.saveWindowVisible("zoom", zoomSpinner.isVisible());
        logger.log(logger.HIGH, "Leaving NeverNote.toggleZoomWindow");
@@ -1631,8 +1621,7 @@ public class NeverNote extends QMainWindow{
                clearSavedSearchFilter();
                if (Global.mimicEvernoteInterface) {
                        clearTagFilter();
-                       //searchField.clear();
-                       searchField.clearEditText();
+                       searchField.clear();
                }
                menuBar.noteRestoreAction.setVisible(false);            
        menuBar.notebookEditAction.setEnabled(true);
@@ -1649,6 +1638,8 @@ public class NeverNote extends QMainWindow{
                
        List<QTreeWidgetItem> selections = notebookTree.selectedItems();
        selectedNotebookGUIDs.clear();
+       searchField.setTargetNotebook("");
+       searchField.setTargetStack("");
                String guid = "";
                String stackName = "";
                if (selections.size() > 0) {
@@ -1669,14 +1660,17 @@ public class NeverNote extends QMainWindow{
                        }
                }
        if (!guid.equals("") && !guid.equals("STACK")) {
-               selectedNotebookGUIDs.add(guid);
+               selectedNotebookGUIDs.add(stackName);
+               searchField.setTargetNotebook(guid);
                menuBar.notebookIconAction.setEnabled(true);
-       } else {
+       } else {        // スタック選択
+               searchField.setTargetStack(guid);
                menuBar.notebookIconAction.setEnabled(true);
                        for (int j=0; j<listManager.getNotebookIndex().size(); j++) {
                                Notebook book = listManager.getNotebookIndex().get(j);
-                               if (book.getStack() != null && book.getStack().equalsIgnoreCase(stackName))
+                               if (book.getStack() != null && book.getStack().equalsIgnoreCase(stackName)) {
                                        selectedNotebookGUIDs.add(book.getGuid());
+                               }
                        }
        }
        listManager.setSelectedNotebooks(selectedNotebookGUIDs);
@@ -1707,6 +1701,8 @@ public class NeverNote extends QMainWindow{
        menuBar.notebookEditAction.setEnabled(false);
        menuBar.notebookDeleteAction.setEnabled(false);
        selectedNotebookGUIDs.clear();
+       searchField.setTargetNotebook("");
+       searchField.setTargetStack("");
        listManager.setSelectedNotebooks(selectedNotebookGUIDs);
        notebookTree.blockSignals(false);
     }
@@ -1736,8 +1732,11 @@ public class NeverNote extends QMainWindow{
        notebookTree.load(books, listManager.getLocalNotebooks());
        for (int i=selectedNotebookGUIDs.size()-1; i>=0; i--) {
                boolean found = notebookTree.selectGuid(selectedNotebookGUIDs.get(i));
-               if (!found)
+               if (!found) {
                        selectedNotebookGUIDs.remove(i);
+                       searchField.setTargetNotebook("");
+                       searchField.setTargetStack("");
+               }
        }
        listManager.refreshCounters = true;
        listManager.refreshCounters();
@@ -1749,7 +1748,7 @@ public class NeverNote extends QMainWindow{
        @SuppressWarnings("unused")
        private void toggleNotebookWindow() {
                logger.log(logger.HIGH, "Entering NeverNote.toggleNotebookWindow");
-               searchLayout.toggleNotebook();
+               zoomLayout.toggleNotebook();
        menuBar.hideNotebooks.setChecked(notebookTree.isVisible());
        Global.saveWindowVisible("notebookTree", notebookTree.isVisible());
        logger.log(logger.HIGH, "Leaving NeverNote.toggleNotebookWindow");
@@ -2421,9 +2420,11 @@ public class NeverNote extends QMainWindow{
        List<QTreeWidgetItem> selections = tagTree.selectedItems();
        QTreeWidgetItem currentSelection;
        selectedTagGUIDs.clear();
+       searchField.getTargetTags().clear();
        for (int i=0; i<selections.size(); i++) {
                currentSelection = selections.get(i);
                selectedTagGUIDs.add(currentSelection.text(2));
+               searchField.addTargetTag(currentSelection.text(2));
        }
        if (selections.size() > 0) {
                menuBar.tagEditAction.setEnabled(true);
@@ -2467,8 +2468,10 @@ public class NeverNote extends QMainWindow{
 
        for (int i=selectedTagGUIDs.size()-1; i>=0; i--) {
                boolean found = tagTree.selectGuid(selectedTagGUIDs.get(i));
-               if (!found)
+               if (!found) {
                        selectedTagGUIDs.remove(i);
+                       searchField.getTargetTags().remove(i);
+               }
        }
        tagTree.blockSignals(false);
        
@@ -2596,6 +2599,7 @@ public class NeverNote extends QMainWindow{
                menuBar.tagDeleteAction.setEnabled(false);
                menuBar.tagIconAction.setEnabled(false);
                selectedTagGUIDs.clear();
+               searchField.getTargetTags().clear();
        listManager.setSelectedTags(selectedTagGUIDs);
        tagTree.blockSignals(false);
        }
@@ -2815,7 +2819,7 @@ public class NeverNote extends QMainWindow{
        savedSearchTree.clearSelection();
        savedSearchTree.blockSignals(false);
        selectedSavedSearchGUID = "";
-       searchField.setEditText("");
+       searchField.setText("");
        searchPerformed = false;
        listManager.setSelectedSavedSearch(selectedSavedSearchGUID);
     }
@@ -2845,13 +2849,13 @@ public class NeverNote extends QMainWindow{
                menuBar.savedSearchIconAction.setEnabled(true);
                selectedSavedSearchGUID = selections.get(0).text(1);
                SavedSearch s = conn.getSavedSearchTable().getSavedSearch(selectedSavedSearchGUID);
-               searchField.setEditText(s.getQuery());
+               searchField.setText(s.getQuery());
        } else { 
                menuBar.savedSearchEditAction.setEnabled(false);
                menuBar.savedSearchDeleteAction.setEnabled(false);
                menuBar.savedSearchIconAction.setEnabled(false);
                selectedSavedSearchGUID = "";
-               searchField.setEditText("");
+               searchField.setText("");
        }
        searchFieldChanged();
        
@@ -2999,7 +3003,7 @@ public class NeverNote extends QMainWindow{
                QMessageBox.about(this, 
                                                tr("About NeighborNote"),
                                                tr("<h4><center><b>NeighborNote</b></center></h4><hr><center>Version ")
-                                               +Global.version + "(based on NixNote 1.5)"
+                                               +Global.version + "(based on NixNote 1.6)"
                                                //+"1.2.120724"
                                                +tr("<hr>"
                                                                +"Open Source Evernote Client.<br><br>" 
@@ -3124,7 +3128,7 @@ public class NeverNote extends QMainWindow{
                QWebSettings.setMaximumPagesInCache(0);
                QWebSettings.setObjectCacheCapacities(0, 0, 0);
         
-               searchField.setEditText("");
+               searchField.setDefaultText();
                saveNoteColumnPositions();
                saveNoteIndexWidth();
                noteIndexUpdated(true);
@@ -3143,7 +3147,7 @@ public class NeverNote extends QMainWindow{
                QWebSettings.setMaximumPagesInCache(0);
                QWebSettings.setObjectCacheCapacities(0, 0, 0);
 
-               if (text.trim().equals("")) {
+               if (text.trim().equals("") && !searchField.hasFocus()) {
                        searchFieldCleared();
                        if (searchPerformed) {
 
@@ -3170,8 +3174,8 @@ public class NeverNote extends QMainWindow{
        inkNoteCache.clear();
        saveNoteColumnPositions();
        saveNoteIndexWidth();
-       String text = searchField.currentText();
-       listManager.setEnSearch(text.trim());
+       String query = searchField.getSearchQuery();
+       listManager.setEnSearch(query.trim());
        listManager.loadNotesIndex();
        noteIndexUpdated(false);
 
@@ -3201,14 +3205,14 @@ public class NeverNote extends QMainWindow{
        QIcon prevIcon = new QIcon(iconPath+"back.png");
        prevButton.setIcon(prevIcon);
        prevButton.triggered.connect(this, "previousViewedAction()");   
-       togglePrevArrowButton(Global.isToolbarButtonVisible("prevArrow"));
+       togglePrevArrowButton(Global.isToolbarButtonVisible("prevArrow", true));
        
        nextButton = toolBar.addAction(tr(""));
        nextButton.setToolTip(tr("Next"));
        QIcon nextIcon = new QIcon(iconPath+"forward.png");
        nextButton.setIcon(nextIcon);
        nextButton.triggered.connect(this, "nextViewedAction()");       
-       toggleNextArrowButton(Global.isToolbarButtonVisible("nextArrow"));
+       toggleNextArrowButton(Global.isToolbarButtonVisible("nextArrow", true));
        
        toolBar.addSeparator();
        
@@ -3216,50 +3220,50 @@ public class NeverNote extends QMainWindow{
        QIcon upIcon = new QIcon(iconPath+"up.png");
        upButton.setIcon(upIcon);
        upButton.triggered.connect(this, "upAction()");         
-       toggleUpArrowButton(Global.isToolbarButtonVisible("upArrow"));
+       toggleUpArrowButton(Global.isToolbarButtonVisible("upArrow", false));
 
        
        downButton = toolBar.addAction(tr("Down"));
        QIcon downIcon = new QIcon(iconPath+"down.png");
        downButton.setIcon(downIcon);
        downButton.triggered.connect(this, "downAction()");
-       toggleDownArrowButton(Global.isToolbarButtonVisible("downArrow"));
+       toggleDownArrowButton(Global.isToolbarButtonVisible("downArrow", false));
        
        synchronizeButton = toolBar.addAction(tr("Synchronize"));
        synchronizeButton.setIcon(new QIcon(iconPath+"synchronize.png"));
        synchronizeIconAngle = 0;
        synchronizeButton.triggered.connect(this, "evernoteSync()");
-       toggleSynchronizeButton(Global.isToolbarButtonVisible("synchronize"));
+       toggleSynchronizeButton(Global.isToolbarButtonVisible("synchronize", true));
        
        printButton = toolBar.addAction(tr("Print"));
        QIcon printIcon = new QIcon(iconPath+"print.png");
        printButton.setIcon(printIcon);
        printButton.triggered.connect(this, "printNote()");
-       togglePrintButton(Global.isToolbarButtonVisible("print"));
+       togglePrintButton(Global.isToolbarButtonVisible("print", false));
 
        tagButton = toolBar.addAction(tr("Tag")); 
        QIcon tagIcon = new QIcon(iconPath+"tag.png");
        tagButton.setIcon(tagIcon);
        tagButton.triggered.connect(browserWindow, "modifyTags()");
-       toggleTagButton(Global.isToolbarButtonVisible("tag"));
+       toggleTagButton(Global.isToolbarButtonVisible("tag", false));
 
        attributeButton = toolBar.addAction(tr("Attributes")); 
        QIcon attributeIcon = new QIcon(iconPath+"attribute.png");
        attributeButton.setIcon(attributeIcon);
        attributeButton.triggered.connect(this, "toggleNoteAttributes()");
-       toggleAttributeButton(Global.isToolbarButtonVisible("attribute"));
+       toggleAttributeButton(Global.isToolbarButtonVisible("attribute", true));
                
        emailButton = toolBar.addAction(tr("Email"));
        QIcon emailIcon = new QIcon(iconPath+"email.png");
        emailButton.setIcon(emailIcon);
        emailButton.triggered.connect(this, "emailNote()");
-       toggleEmailButton(Global.isToolbarButtonVisible("email"));
+       toggleEmailButton(Global.isToolbarButtonVisible("email", false));
 
        deleteButton = toolBar.addAction(tr("Delete"));         
        QIcon deleteIcon = new QIcon(iconPath+"delete.png");
        deleteButton.setIcon(deleteIcon);
        deleteButton.triggered.connect(this, "deleteNote()");
-       toggleDeleteButton(Global.isToolbarButtonVisible("delete"));
+       toggleDeleteButton(Global.isToolbarButtonVisible("delete", true));
 
        newButton = toolBar.addAction(tr("New"));
        QIcon newIcon = new QIcon(iconPath+"new.png");
@@ -3270,13 +3274,13 @@ public class NeverNote extends QMainWindow{
        }
 
        newButton.setIcon(newIcon);
-       toggleNewButton(Global.isToolbarButtonVisible("new"));
+       toggleNewButton(Global.isToolbarButtonVisible("new", true));
        
        allNotesButton = toolBar.addAction(tr("All Notes"));
        QIcon allIcon = new QIcon(iconPath+"books.png");
        allNotesButton.triggered.connect(this, "allNotes()");
        allNotesButton.setIcon(allIcon);
-       toggleAllNotesButton(Global.isToolbarButtonVisible("allNotes"));
+       toggleAllNotesButton(Global.isToolbarButtonVisible("allNotes", true));
        
        //toolBar.addSeparator();
        //toolBar.addWidget(new QLabel(tr("Quota:")));
@@ -3290,13 +3294,37 @@ public class NeverNote extends QMainWindow{
        
        //toolBar.addWidget(new QLabel("                    "));
        //toolBar.addSeparator();
-       //toolBar.addWidget(new QLabel(tr("  Search:")));
-       //toolBar.addWidget(searchField);
-       QSizePolicy sizePolicy = new QSizePolicy();
-       sizePolicy.setHorizontalPolicy(Policy.MinimumExpanding);
-       QLabel spacer = new QLabel("");
-       spacer.setSizePolicy(sizePolicy);
-       toolBar.addWidget(spacer);
+       
+       // 検索ボックスを右寄せするためのスペーサ
+       QWidget spacerWidget = new QWidget();
+       spacerWidget.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred);
+       toolBar.addWidget(spacerWidget);
+       spacerWidget.setVisible(true);
+       
+        searchField = new SearchEdit(iconPath, conn);
+        searchField.setObjectName("searchField");
+       searchField.returnPressed.connect(this, "searchFieldChanged()");
+       searchField.textChanged.connect(this,"searchFieldTextChanged(String)");
+       searchField.setMaximumWidth(400);
+       searchField.setMinimumWidth(80);
+       searchField.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed);
+       searchShortcut = new QShortcut(this);
+       setupShortcut(searchShortcut, "Focus_Search");
+       searchShortcut.activated.connect(this, "focusSearch()");
+       toolBar.addWidget(searchField);
+       
+               searchField.setVisible(Global.isWindowVisible("searchField"));
+               // IFIXED !searchField.isVisible() → !Global.isWindowVisible("searchField")
+               // なぜかsearchField.isVisible()が常にfalseを返すようなので修正
+               if (!Global.isWindowVisible("searchField"))
+                       menuBar.hideSearch.setChecked(false);
+               
+//     QSizePolicy sizePolicy = new QSizePolicy();
+//     sizePolicy.setHorizontalPolicy(Policy.MinimumExpanding);
+//     QLabel spacer = new QLabel("");
+//     spacer.setSizePolicy(sizePolicy);
+//     toolBar.addWidget(spacer);
+               
        //searchField.setInsertPolicy(InsertPolicy.InsertAtTop);
 
        //searchClearButton = toolBar.addAction("Search Clear");
@@ -3361,9 +3389,9 @@ public class NeverNote extends QMainWindow{
        contextMenu.addAction(allNotesAction);
        allNotesAction.triggered.connect(this, "toggleAllNotesButton(Boolean)");
        
-       QAction searchClearAction = addContextAction("searchClear", tr("Search Clear"));
-       contextMenu.addAction(searchClearAction);
-       searchClearAction.triggered.connect(this, "toggleSearchClearButton(Boolean)");
+//     QAction searchClearAction = addContextAction("searchClear", tr("Search Clear"));
+//     contextMenu.addAction(searchClearAction);
+//     searchClearAction.triggered.connect(this, "toggleSearchClearButton(Boolean)");
        
        return contextMenu;
        
@@ -3372,7 +3400,7 @@ public class NeverNote extends QMainWindow{
        QAction newAction = new QAction(this);
                newAction.setText(name);
                newAction.setCheckable(true);
-               newAction.setChecked(Global.isToolbarButtonVisible(config));
+               newAction.setChecked(Global.isToolbarButtonVisible(config, true));
                return newAction;
     }
     private void togglePrevArrowButton(Boolean toggle) {
@@ -3423,11 +3451,11 @@ public class NeverNote extends QMainWindow{
                allNotesButton.setVisible(toggle);
                Global.saveToolbarButtonsVisible("allNotes", toggle);
     }
-    @SuppressWarnings("unused")
-       private void toggleSearchClearButton(Boolean toggle) {
-               searchClearButton.setVisible(toggle);
-               Global.saveToolbarButtonsVisible("searchClear", toggle);
-    }
+//    @SuppressWarnings("unused")
+//     private void toggleSearchClearButton(Boolean toggle) {
+//             searchClearButton.setVisible(toggle);
+//             Global.saveToolbarButtonsVisible("searchClear", toggle);
+//    }
 
 
 
@@ -3679,7 +3707,7 @@ public class NeverNote extends QMainWindow{
        OAuthTokenizer tokenizer = new OAuthTokenizer();
        AESEncrypter aes = new AESEncrypter();
        try {
-                       aes.decrypt(new FileInputStream(Global.getFileManager().getHomeDirFile("oauth.txt")));
+                       aes.decrypt(new FileInputStream(Global.getFileManager().getHomeDirFile("oauthkey.txt")));
                } catch (FileNotFoundException e) {
                        // File not found, so we'll just get empty strings anyway. 
                }
@@ -3742,7 +3770,7 @@ public class NeverNote extends QMainWindow{
                }
                aes.setString(window.response);
                try {
-                               aes.encrypt(new FileOutputStream(Global.getFileManager().getHomeDirFile("oauth.txt")));
+                               aes.encrypt(new FileOutputStream(Global.getFileManager().getHomeDirFile("oauthkey.txt")));
                        } catch (FileNotFoundException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
@@ -4807,22 +4835,28 @@ public class NeverNote extends QMainWindow{
                        }
                }
        }
+       
+       // タブが閉じられた
+       @SuppressWarnings("unused")
+       private void tabCloseRequested(int index) {
+               tabWindowClosing((TabBrowse)tabBrowser.widget(index));
+       }
 
        // タブが閉じられた
-       private void tabWindowClosing(int index) {
+       private void tabWindowClosing(TabBrowse tab) {
                // タブが1つしかなかったら閉じない
                if (tabBrowser.count() <= 1) {
                        return;
                }
 
-               TabBrowse t = (TabBrowse) tabBrowser.widget(index);
-               String guid = t.getBrowserWindow().getNote().getGuid();
-               String content = t.getBrowserWindow().getContent();
-               BrowserWindow browser = t.getBrowserWindow();
-               // ノートが変更されていたら保存
-               if (t.getNoteDirty()) {
-                       saveNoteTabBrowser(guid, content, true, browser);
-               }
+               int index = tabBrowser.indexOf(tab);
+//             String guid = tab.getBrowserWindow().getNote().getGuid();
+//             String content = tab.getBrowserWindow().getContent();
+               BrowserWindow browser = tab.getBrowserWindow();
+//             // ノートが変更されていたら保存
+//             if (tab.getNoteDirty()) {
+//                     saveNoteTabBrowser(guid, content, true, browser);
+//             }
 
                // シグナル切断
                browser.noteSignal.tagsChanged.disconnect();
@@ -4833,8 +4867,8 @@ public class NeverNote extends QMainWindow{
                browser.noteSignal.alteredDateChanged.disconnect();
 
                // ノートを削除
-               tabWindows.remove(index);
                tabBrowser.removeTab(index);
+               tabWindows.remove(index);
                noteDirty.remove(index);
                inkNote.remove(index);
                readOnly.remove(index);
@@ -4847,8 +4881,8 @@ public class NeverNote extends QMainWindow{
                // タブのインデックスを更新(削除によって空いた部分を詰める)
                for(int i = index ; tabWindows.containsKey(i + 1) ; i++){
                        // tabWindows
-                       TabBrowse tab = tabWindows.get(i + 1);
-                       tabWindows.put(i, tab);
+                       TabBrowse nextTab = tabWindows.get(i + 1);
+                       tabWindows.put(i, nextTab);
                        tabWindows.remove(i + 1);
                        // noteDirty
                        boolean isNoteDirty = noteDirty.get(i + 1);
@@ -4889,6 +4923,12 @@ public class NeverNote extends QMainWindow{
        private void noteAddNewTab() {
                saveNote();
                
+               // ノートを何も開いていないときは現在のタブにノート追加
+               if (currentNoteGuid == null || currentNoteGuid.equals("")) {
+                       addNote();
+                       return;
+               }
+               
                // ノート追加前に開いていたノートとの関連性を記録するためにguidをとっておく
                TabBrowse prevTab = (TabBrowse)tabBrowser.currentWidget();
                String prevTabGuid = null;
@@ -5040,17 +5080,17 @@ public class NeverNote extends QMainWindow{
        
     }
     
-       private void saveNoteTabBrowser(String guid, String content, Boolean save,
-                       BrowserWindow browser) {
-               QTextCodec codec = QTextCodec.codecForName("UTF-8");
-               QByteArray unicode = codec.fromUnicode(content);
-               noteCache.remove(guid);
-               noteCache.put(guid, unicode.toString());
-               if (save) {
-                       thumbnailRunner.addWork("GENERATE " + guid);
-                       saveNote(guid, browser);
-               }
-       }
+//     private void saveNoteTabBrowser(String guid, String content, Boolean save,
+//                     BrowserWindow browser) {
+//             QTextCodec codec = QTextCodec.codecForName("UTF-8");
+//             QByteArray unicode = codec.fromUnicode(content);
+//             noteCache.remove(guid);
+//             noteCache.put(guid, unicode.toString());
+//             if (save) {
+//                     thumbnailRunner.addWork("GENERATE " + guid);
+//                     saveNote(guid, browser);
+//             }
+//     }
        
     private void saveNote() {
        // すべてのタブに対して、Dirtyを確認し、trueならセーブする
@@ -5391,6 +5431,7 @@ public class NeverNote extends QMainWindow{
                return;
        if (currentNoteGuid.equals(""))
                return;
+       
        String title = null;
        if (selectedNoteGUIDs.size() == 1)
                title = conn.getNoteTable().getNote(selectedNoteGUIDs.get(0),false,false,false,false,false).getTitle();
@@ -5413,12 +5454,17 @@ public class NeverNote extends QMainWindow{
                                        return;
                        }
                }
-               if (selectedNoteGUIDs.size() == 0 && !currentNoteGuid.equals("")) 
+               if (selectedNoteGUIDs.size() == 0 && !currentNoteGuid.equals("")) {
                        selectedNoteGUIDs.add(currentNoteGuid);
+               }
+               
+               List<String> deleteNoteGUIDs = new ArrayList<String>(selectedNoteGUIDs);        // タブを閉じるとselectedNoteGUIDsが変わってしまうのでその前にコピー
                closeTabs(selectedNoteGUIDs);
-               for (int i=0; i<selectedNoteGUIDs.size(); i++) {
-                       listManager.deleteNote(selectedNoteGUIDs.get(i));
+               for (String guid : deleteNoteGUIDs) {
+                       listManager.deleteNote(guid);
                }
+               
+               closeExternalWindows(deleteNoteGUIDs);
        } else { 
                // If we are deleting from the trash.
                if (Global.verifyDelete()) {
@@ -5439,29 +5485,31 @@ public class NeverNote extends QMainWindow{
                }
                if (selectedNoteGUIDs.size() == 0 && !currentNoteGuid.equals("")) 
                        selectedNoteGUIDs.add(currentNoteGuid);
-               for (int i=selectedNoteGUIDs.size()-1; i>=0; i--) {
+               
+               List<String> deleteNoteGUIDs = new ArrayList<String>(selectedNoteGUIDs);        // タブを閉じるとselectedNoteGUIDsが変わってしまうのでその前にコピー
+               for (int i=deleteNoteGUIDs.size()-1; i>=0; i--) {
                        for (int j=listManager.getNoteTableModel().rowCount()-1; j>=0; j--) {
                        QModelIndex modelIndex =  listManager.getNoteTableModel().index(j, Global.noteTableGuidPosition);
                        if (modelIndex != null) {
                                SortedMap<Integer, Object> ix = listManager.getNoteTableModel().itemData(modelIndex);
                                String tableGuid =  (String)ix.values().toArray()[0];
-                               if (tableGuid.equals(selectedNoteGUIDs.get(i))) {
+                               if (tableGuid.equals(deleteNoteGUIDs.get(i))) {
                                        listManager.getNoteTableModel().removeRow(j);
                                        j=-1;
                                }
                        }
                }
-                       closeTabs(selectedNoteGUIDs);
-                       listManager.expungeNote(selectedNoteGUIDs.get(i));
-                       
-                       conn.getHistoryTable().expungeHistory(selectedNoteGUIDs.get(i));
-                       conn.getExcludedTable().expungeExcludedNote(selectedNoteGUIDs.get(i));
-                       conn.getStaredTable().expungeStaredNote(selectedNoteGUIDs.get(i));
+                       closeTab(deleteNoteGUIDs.get(i));
+                       listManager.expungeNote(deleteNoteGUIDs.get(i));
                        
+                       conn.getHistoryTable().expungeHistory(deleteNoteGUIDs.get(i));
+                       conn.getExcludedTable().expungeExcludedNote(deleteNoteGUIDs.get(i));
+                       conn.getStaredTable().expungeStaredNote(deleteNoteGUIDs.get(i));
                }
+               
+               closeExternalWindows(deleteNoteGUIDs);
        }
-       currentNoteGuid = "";
-       closeExternalWindows(selectedNoteGUIDs);
+       
                if (currentNoteGuid == null || currentNoteGuid.equals("")) {
                        menuBar.noteAddNewTab.setEnabled(false);
                }
@@ -5475,50 +5523,42 @@ public class NeverNote extends QMainWindow{
     
     // 対象ノートをタブで開いていたら閉じる
     private void closeTabs(List<String> noteGUIDs) {
-               Collection<TabBrowse> tabBrowsers = tabWindows.values();
-               Iterator<TabBrowse> tabIterator = tabBrowsers.iterator();
-               Collection<Integer> tabIndexes = tabWindows.keySet();
-               Iterator<Integer>       indexIterator = tabIndexes.iterator();
-               List<Integer> closeIndexes = new ArrayList<Integer>();  //イテレータ操作中に中身をいじっちゃダメなので
-
-               while (tabIterator.hasNext()) {
-                       TabBrowse tab = tabIterator.next();
-                       int index = indexIterator.next();
-                       String guid = tab.getBrowserWindow().getNote().getGuid();
-                       
-                       for(int i = 0; i < noteGUIDs.size(); i++){
-                               if(guid.equals(noteGUIDs.get(i))){
-                                       closeIndexes.add(index);
-                               }
-                       }
-               }
-               
-               for(int i = closeIndexes.size() - 1; i >= 0; i--){
-                       tabWindowClosing(closeIndexes.get(i));
-               }
+       for (String guid : noteGUIDs) {
+               closeTab(guid);
+       }
+    }
+    
+    // 対象ノートをタブで開いていたら閉じる
+    private void closeTab(String noteGUID) {
+       List<TabBrowse> closeTabs = new ArrayList<TabBrowse>();
+       
+       for (TabBrowse tab : tabWindows.values()) {
+               String guid = tab.getBrowserWindow().getNote().getGuid();
+               
+               if (guid.equals(noteGUID)) {
+                       closeTabs.add(tab);
+               }
+       }
+       
+       for (TabBrowse tab : closeTabs) {
+               tabWindowClosing(tab);
+       }
     }
     
     // 対象ノートを外部ウィンドウで開いていたら閉じる
     private void closeExternalWindows(List<String> noteGUIDs) {
-               Collection<ExternalBrowse>      windows = externalWindows.values();
-               Iterator<ExternalBrowse>        windowIterator = windows.iterator();
-               Collection<String>                      guids = externalWindows.keySet();
-               Iterator<String>                        guidIterator = guids.iterator();
-               List<ExternalBrowse>            closeWindows = new ArrayList<ExternalBrowse>(); // イテレータ操作中に中身をいじっちゃダメなので
+               List<ExternalBrowse> closeWindows = new ArrayList<ExternalBrowse>();
                
-               while (windowIterator.hasNext()) {
-                       ExternalBrowse browser = windowIterator.next();
-                       String guid = guidIterator.next();
-                       
-                       for (int i = 0; i < noteGUIDs.size(); i++) {
-                               if (guid.equals(noteGUIDs.get(i))) {
-                                       closeWindows.add(browser);
+               for (Map.Entry<String, ExternalBrowse> e : externalWindows.entrySet()) {
+                       for (String guid : noteGUIDs) {
+                               if (guid.equals(e.getKey())) {
+                                       closeWindows.add(e.getValue());
                                }
                        }
                }
                
-               for (int i = closeWindows.size() - 1; i >= 0; i--) {
-                       closeWindows.get(i).close();
+               for (ExternalBrowse externalBrowse : closeWindows) {
+                       externalBrowse.close();
                }
     }
     
@@ -5967,26 +6007,18 @@ public class NeverNote extends QMainWindow{
                }
                
        // マージしたノート(child)をタブで開いていたら、閉じる
-               Collection<TabBrowse> tabBrowsers = tabWindows.values();
-               Iterator<TabBrowse> tabIterator = tabBrowsers.iterator();
-               Collection<Integer> tabIndexes = tabWindows.keySet();
-               Iterator<Integer>       indexIterator = tabIndexes.iterator();
-               List<Integer> closeIndexes = new ArrayList<Integer>();
-
-               while (tabIterator.hasNext()) {
-                       TabBrowse tab = tabIterator.next();
-                       int tabIndex = indexIterator.next();
+               List<TabBrowse> closeTabs = new ArrayList<TabBrowse>();
+               for (TabBrowse tab : tabWindows.values()) {
                        String guid = tab.getBrowserWindow().getNote().getGuid();
                        
-                       for(int i = 0; i < sources.size(); i++){
-                               if(guid.equals(sources.get(i))){
-                                       closeIndexes.add(tabIndex);
+                       for (String source : sources) {
+                               if (guid.equals(source)) {
+                                       closeTabs.add(tab);
                                }
                        }
                }
-               
-               for(int i = closeIndexes.size() - 1; i >= 0; i--){
-                       tabWindowClosing(closeIndexes.get(i));
+               for (TabBrowse tab : closeTabs) {
+                       tabWindowClosing(tab);
                }
                
                noteIndexUpdated(false);
@@ -6159,7 +6191,7 @@ public class NeverNote extends QMainWindow{
                        return;
                } catch (EDAMSystemException e) {
                        if (e.getErrorCode() == EDAMErrorCode.RATE_LIMIT_REACHED) {
-                               QMessageBox.warning(this, tr("Rate limit reached"), tr("Rate limit reached.\nRetry your request in " + e.getRateLimitDuration() + " seconds."));
+                               QMessageBox.warning(this, tr("Rate limit reached"), tr("Evernote usage has been temporarily exceeded. Please try again in ") +  + e.getRateLimitDuration() + tr(" seconds."));
                        }
                        setMessage("EDAMSystemException: " +e.getMessage());
                        return;
@@ -6221,7 +6253,7 @@ public class NeverNote extends QMainWindow{
                                return null;
                        } catch (EDAMSystemException e) {
                                if (e.getErrorCode() == EDAMErrorCode.RATE_LIMIT_REACHED) {
-                                       QMessageBox.warning(this, tr("Rate limit reached"), tr("Rate limit reached.\nRetry your request in " + e.getRateLimitDuration() + " seconds."));
+                                       QMessageBox.warning(this, tr("Rate limit reached"), tr("Evernote usage has been temporarily exceeded. Please try again in ") +  + e.getRateLimitDuration() + tr(" seconds."));
                                }
                                setMessage("EDAMSystemException: " +e.getMessage());
                                waitCursor(false);
@@ -6288,7 +6320,7 @@ public class NeverNote extends QMainWindow{
                        return;
                } catch (EDAMSystemException e) {
                        if (e.getErrorCode() == EDAMErrorCode.RATE_LIMIT_REACHED) {
-                               QMessageBox.warning(this, tr("Rate limit reached"), tr("Rate limit reached.\nRetry your request in " + e.getRateLimitDuration() + " seconds."));
+                               QMessageBox.warning(this, tr("Rate limit reached"), tr("Evernote usage has been temporarily exceeded. Please try again in ") +  + e.getRateLimitDuration() + tr(" seconds."));
                        }
                        setMessage("EDAMSystemException: " +e.getMessage());
                        return;
@@ -7725,7 +7757,7 @@ public class NeverNote extends QMainWindow{
        // 帯域制限の超過をユーザに通知
        @SuppressWarnings("unused")
        private void informRateLimit(Integer rateLimitDuration) {
-               QMessageBox.warning(this, tr("Rate limit reached"), tr("Rate limit reached.\nRetry your request in " + rateLimitDuration + " seconds."));
+               QMessageBox.warning(this, tr("Rate limit reached"), tr("Evernote usage has been temporarily exceeded. Please try again in ") +  + rateLimitDuration + tr(" seconds."));
        }
        
        // ツールバーの「新規」ボタンの接続スロットを設定