OSDN Git Service

Merge branch 'master' of scm.dev.nokia.troll.no:creator/mainline
[qt-creator-jp/qt-creator-jp.git] / src / plugins / coreplugin / editortoolbar.cpp
index 332b0a5..3860d41 100644 (file)
 #include <coreplugin/icore.h>
 #include <coreplugin/minisplitter.h>
 #include <coreplugin/sidebar.h>
+#include <coreplugin/uniqueidmanager.h>
+
+#include <coreplugin/editormanager/editorview.h>
 #include <coreplugin/editormanager/editormanager.h>
 #include <coreplugin/editormanager/openeditorsmodel.h>
 #include <coreplugin/editormanager/ieditor.h>
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <coreplugin/actionmanager/command.h>
-#include <coreplugin/modemanager.h>
 
 #include <utils/parameteraction.h>
 #include <utils/qtcassert.h>
@@ -48,7 +50,9 @@
 #include <QtCore/QSettings>
 #include <QtCore/QEvent>
 #include <QtCore/QDir>
+#include <QtCore/QPointer>
 #include <QtGui/QApplication>
+#include <QtGui/QComboBox>
 #include <QtGui/QPlainTextEdit>
 #include <QtGui/QVBoxLayout>
 #include <QtGui/QScrollArea>
@@ -67,83 +71,100 @@ enum {
 
 namespace Core {
 
+struct EditorToolBarPrivate {
+    explicit EditorToolBarPrivate(QWidget *parent, EditorToolBar *q);
+
+    Core::OpenEditorsModel *m_editorsListModel;
+    QComboBox *m_editorList;
+    QToolButton *m_closeButton;
+    QToolButton *m_lockButton;
+    QAction *m_goBackAction;
+    QAction *m_goForwardAction;
+    QToolButton *m_backButton;
+    QToolButton *m_forwardButton;
+
+    QWidget *m_activeToolBar;
+    QWidget *m_toolBarPlaceholder;
+    QWidget *m_defaultToolBar;
+
+    bool m_isStandalone;
+};
+
+EditorToolBarPrivate::EditorToolBarPrivate(QWidget *parent, EditorToolBar *q) :
+    m_editorList(new QComboBox(q)),
+    m_closeButton(new QToolButton),
+    m_lockButton(new QToolButton),
+    m_goBackAction(new QAction(QIcon(QLatin1String(Constants::ICON_PREV)), EditorManager::tr("Go Back"), parent)),
+    m_goForwardAction(new QAction(QIcon(QLatin1String(Constants::ICON_NEXT)), EditorManager::tr("Go Forward"), parent)),
+    m_activeToolBar(0),
+    m_toolBarPlaceholder(new QWidget),
+    m_defaultToolBar(new QWidget(q)),
+    m_isStandalone(false)
+{
+}
+
 /*!
   Mimic the look of the text editor toolbar as defined in e.g. EditorView::EditorView
   */
 EditorToolBar::EditorToolBar(QWidget *parent) :
-        Utils::StyledBar(parent),
-        m_editorList(new QComboBox(this)),
-        m_rightToolBar(new QToolBar(this)),
-        m_closeButton(new QToolButton),
-        m_lockButton(new QToolButton),
-
-        m_goBackAction(new QAction(QIcon(QLatin1String(":/help/images/previous.png")), EditorManager::tr("Go Back"), parent)),
-        m_goForwardAction(new QAction(QIcon(QLatin1String(":/help/images/next.png")), EditorManager::tr("Go Forward"), parent)),
-
-        m_activeToolBar(0),
-        m_toolBarPlaceholder(new QWidget),
-        m_defaultToolBar(new QWidget(this)),
-        m_ignoreEditorToolbar(false)
+        Utils::StyledBar(parent), d(new EditorToolBarPrivate(parent, this))
 {
     QHBoxLayout *toolBarLayout = new QHBoxLayout(this);
     toolBarLayout->setMargin(0);
     toolBarLayout->setSpacing(0);
-    toolBarLayout->addWidget(m_defaultToolBar);
-    m_toolBarPlaceholder->setLayout(toolBarLayout);
-    m_toolBarPlaceholder->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
-
-    m_defaultToolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
-    m_activeToolBar = m_defaultToolBar;
+    toolBarLayout->addWidget(d->m_defaultToolBar);
+    d->m_toolBarPlaceholder->setLayout(toolBarLayout);
+    d->m_toolBarPlaceholder->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
 
-    m_editorsListModel = EditorManager::instance()->openedEditorsModel();
-    connect(m_goBackAction, SIGNAL(triggered()), this, SIGNAL(goBackClicked()));
-    connect(m_goForwardAction, SIGNAL(triggered()), this, SIGNAL(goForwardClicked()));
+    d->m_defaultToolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+    d->m_activeToolBar = d->m_defaultToolBar;
 
-    m_editorList->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
-    m_editorList->setMinimumContentsLength(20);
-    m_editorList->setModel(m_editorsListModel);
-    m_editorList->setMaxVisibleItems(40);
-    m_editorList->setContextMenuPolicy(Qt::CustomContextMenu);
+    d->m_editorsListModel = EditorManager::instance()->openedEditorsModel();
+    connect(d->m_goBackAction, SIGNAL(triggered()), this, SIGNAL(goBackClicked()));
+    connect(d->m_goForwardAction, SIGNAL(triggered()), this, SIGNAL(goForwardClicked()));
 
-    m_lockButton->setAutoRaise(true);
-    m_lockButton->setProperty("type", QLatin1String("dockbutton"));
-    m_lockButton->setVisible(false);
+    d->m_editorList->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    d->m_editorList->setMinimumContentsLength(20);
+    d->m_editorList->setModel(d->m_editorsListModel);
+    d->m_editorList->setMaxVisibleItems(40);
+    d->m_editorList->setContextMenuPolicy(Qt::CustomContextMenu);
 
-    m_closeButton->setAutoRaise(true);
-    m_closeButton->setIcon(QIcon(":/core/images/closebutton.png"));
-    m_closeButton->setProperty("type", QLatin1String("dockbutton"));
-    m_closeButton->setEnabled(false);
+    d->m_lockButton->setAutoRaise(true);
+    d->m_lockButton->setProperty("type", QLatin1String("dockbutton"));
+    d->m_lockButton->setVisible(false);
 
-    m_toolBarPlaceholder->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+    d->m_closeButton->setAutoRaise(true);
+    d->m_closeButton->setIcon(QIcon(QLatin1String(Constants::ICON_CLOSE)));
+    d->m_closeButton->setProperty("type", QLatin1String("dockbutton"));
+    d->m_closeButton->setEnabled(false);
 
-    m_backButton = new QToolButton(this);
-    m_backButton->setDefaultAction(m_goBackAction);
+    d->m_toolBarPlaceholder->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
 
-    m_forwardButton= new QToolButton(this);
-    m_forwardButton->setDefaultAction(m_goForwardAction);
+    d->m_backButton = new QToolButton(this);
+    d->m_backButton->setDefaultAction(d->m_goBackAction);
 
-    m_rightToolBar->setLayoutDirection(Qt::RightToLeft);
-    m_rightToolBar->addWidget(m_closeButton);
-    m_rightToolBar->addWidget(m_lockButton);
+    d->m_forwardButton= new QToolButton(this);
+    d->m_forwardButton->setDefaultAction(d->m_goForwardAction);
 
     QHBoxLayout *toplayout = new QHBoxLayout(this);
     toplayout->setSpacing(0);
     toplayout->setMargin(0);
-    toplayout->addWidget(m_backButton);
-    toplayout->addWidget(m_forwardButton);
-    toplayout->addWidget(m_editorList);
-    toplayout->addWidget(m_toolBarPlaceholder, 1); // Custom toolbar stretches
-    toplayout->addWidget(m_rightToolBar);
+    toplayout->addWidget(d->m_backButton);
+    toplayout->addWidget(d->m_forwardButton);
+    toplayout->addWidget(d->m_editorList);
+    toplayout->addWidget(d->m_toolBarPlaceholder, 1); // Custom toolbar stretches
+    toplayout->addWidget(d->m_lockButton);
+    toplayout->addWidget(d->m_closeButton);
 
     setLayout(toplayout);
 
-    connect(m_editorList, SIGNAL(activated(int)), this, SLOT(listSelectionActivated(int)));
-    connect(m_editorList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(listContextMenu(QPoint)));
-    connect(m_lockButton, SIGNAL(clicked()), this, SLOT(makeEditorWritable()));
-    connect(m_closeButton, SIGNAL(clicked()), this, SLOT(closeView()), Qt::QueuedConnection);
+    // this signal is disconnected for standalone toolbars and replaced with
+    // a private slot connection
+    connect(d->m_editorList, SIGNAL(activated(int)), this, SIGNAL(listSelectionActivated(int)));
 
-    EditorManager *em = EditorManager::instance();
-    connect(em, SIGNAL(currentEditorChanged(Core::IEditor*)), SLOT(updateEditorListSelection(Core::IEditor*)));
+    connect(d->m_editorList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(listContextMenu(QPoint)));
+    connect(d->m_lockButton, SIGNAL(clicked()), this, SLOT(makeEditorWritable()));
+    connect(d->m_closeButton, SIGNAL(clicked()), this, SLOT(closeView()), Qt::QueuedConnection);
 
     ActionManager *am = ICore::instance()->actionManager();
     connect(am->command(Constants::CLOSE), SIGNAL(keySequenceChanged()),
@@ -155,17 +176,22 @@ EditorToolBar::EditorToolBar(QWidget *parent) :
 
 }
 
+EditorToolBar::~EditorToolBar()
+{
+}
+
 void EditorToolBar::removeToolbarForEditor(IEditor *editor)
 {
+    QTC_ASSERT(editor, return)
     disconnect(editor, SIGNAL(changed()), this, SLOT(checkEditorStatus()));
 
     QWidget *toolBar = editor->toolBar();
     if (toolBar != 0) {
-        if (m_activeToolBar == toolBar) {
-            m_activeToolBar = m_defaultToolBar;
-            m_activeToolBar->setVisible(true);
+        if (d->m_activeToolBar == toolBar) {
+            d->m_activeToolBar = d->m_defaultToolBar;
+            d->m_activeToolBar->setVisible(true);
         }
-        m_toolBarPlaceholder->layout()->removeWidget(toolBar);
+        d->m_toolBarPlaceholder->layout()->removeWidget(toolBar);
         toolBar->setVisible(false);
         toolBar->setParent(0);
     }
@@ -176,19 +202,22 @@ void EditorToolBar::closeView()
     if (!currentEditor())
         return;
 
-    EditorManager *em = ICore::instance()->editorManager();
-    if (IEditor *editor = currentEditor()) {
-            em->closeDuplicate(editor);
+    if (d->m_isStandalone) {
+        EditorManager *em = ICore::instance()->editorManager();
+        if (IEditor *editor = currentEditor()) {
+            em->closeEditor(editor);
+        }
     }
     emit closeClicked();
 }
 
 void EditorToolBar::addEditor(IEditor *editor)
 {
+    QTC_ASSERT(editor, return)
     connect(editor, SIGNAL(changed()), this, SLOT(checkEditorStatus()));
     QWidget *toolBar = editor->toolBar();
 
-    if (toolBar && !m_ignoreEditorToolbar)
+    if (toolBar && !d->m_isStandalone)
         addCenterToolBar(toolBar);
 
     updateEditorStatus(editor);
@@ -196,8 +225,9 @@ void EditorToolBar::addEditor(IEditor *editor)
 
 void EditorToolBar::addCenterToolBar(QWidget *toolBar)
 {
+    QTC_ASSERT(toolBar, return)
     toolBar->setVisible(false); // will be made visible in setCurrentEditor
-    m_toolBarPlaceholder->layout()->addWidget(toolBar);
+    d->m_toolBarPlaceholder->layout()->addWidget(toolBar);
 
     updateToolBar(toolBar);
 }
@@ -205,26 +235,34 @@ void EditorToolBar::addCenterToolBar(QWidget *toolBar)
 void EditorToolBar::updateToolBar(QWidget *toolBar)
 {
     if (!toolBar)
-        toolBar = m_defaultToolBar;
-    if (m_activeToolBar == toolBar)
+        toolBar = d->m_defaultToolBar;
+    if (d->m_activeToolBar == toolBar)
         return;
     toolBar->setVisible(true);
-    m_activeToolBar->setVisible(false);
-    m_activeToolBar = toolBar;
+    d->m_activeToolBar->setVisible(false);
+    d->m_activeToolBar = toolBar;
 }
 
 void EditorToolBar::setToolbarCreationFlags(ToolbarCreationFlags flags)
 {
-    m_ignoreEditorToolbar = flags & FlagsIgnoreIEditorToolBar;
+    d->m_isStandalone = flags & FlagsStandalone;
+    if (d->m_isStandalone) {
+        EditorManager *em = EditorManager::instance();
+        connect(em, SIGNAL(currentEditorChanged(Core::IEditor*)), SLOT(updateEditorListSelection(Core::IEditor*)));
+
+        disconnect(d->m_editorList, SIGNAL(activated(int)), this, SIGNAL(listSelectionActivated(int)));
+        connect(d->m_editorList, SIGNAL(activated(int)), this, SLOT(changeActiveEditor(int)));
+    }
 }
 
 void EditorToolBar::setCurrentEditor(IEditor *editor)
 {
-    m_editorList->setCurrentIndex(m_editorsListModel->indexOf(editor).row());
+    QTC_ASSERT(editor, return)
+    d->m_editorList->setCurrentIndex(d->m_editorsListModel->indexOf(editor).row());
 
     // If we never added the toolbar from the editor,  we will never change
     // the editor, so there's no need to update the toolbar either.
-    if (!m_ignoreEditorToolbar)
+    if (!d->m_isStandalone)
         updateToolBar(editor->toolBar());
 
     updateEditorStatus(editor);
@@ -232,41 +270,41 @@ void EditorToolBar::setCurrentEditor(IEditor *editor)
 
 void EditorToolBar::updateEditorListSelection(IEditor *newSelection)
 {
-    if (newSelection) {
-        m_editorList->setCurrentIndex(m_editorsListModel->indexOf(newSelection).row());
-    }
+    if (newSelection)
+        d->m_editorList->setCurrentIndex(d->m_editorsListModel->indexOf(newSelection).row());
 }
 
-void EditorToolBar::listSelectionActivated(int row)
+void EditorToolBar::changeActiveEditor(int row)
 {
     EditorManager *em = ICore::instance()->editorManager();
-    QAbstractItemModel *model = m_editorList->model();
+    QAbstractItemModel *model = d->m_editorList->model();
     const QModelIndex modelIndex = model->index(row, 0);
     IEditor *editor = model->data(modelIndex, Qt::UserRole).value<IEditor*>();
+
     if (editor) {
         if (editor != em->currentEditor())
-            em->activateEditor(editor, EditorManager::NoModeSwitch);
+            em->activateEditor(editor);
     } else {
         //em->activateEditor(model->index(index, 0), this);
         QString fileName = model->data(modelIndex, Qt::UserRole + 1).toString();
         QByteArray kind = model->data(modelIndex, Qt::UserRole + 2).toByteArray();
-        editor = em->openEditor(fileName, kind, EditorManager::NoModeSwitch);
+        editor = em->openEditor(fileName, kind);
     }
     if (editor) {
-        m_editorList->setCurrentIndex(m_editorsListModel->indexOf(editor).row());
+        d->m_editorList->setCurrentIndex(d->m_editorsListModel->indexOf(editor).row());
     }
 }
 
 void EditorToolBar::listContextMenu(QPoint pos)
 {
-    QModelIndex index = m_editorsListModel->index(m_editorList->currentIndex(), 0);
-    QString fileName = m_editorsListModel->data(index, Qt::UserRole + 1).toString();
+    QModelIndex index = d->m_editorsListModel->index(d->m_editorList->currentIndex(), 0);
+    QString fileName = d->m_editorsListModel->data(index, Qt::UserRole + 1).toString();
     if (fileName.isEmpty())
         return;
     QMenu menu;
-    menu.addAction(tr("Copy full path to clipboard"));
-    if (menu.exec(m_editorList->mapToGlobal(pos))) {
-        QApplication::clipboard()->setText(fileName);
+    menu.addAction(tr("Copy Full Path to Clipboard"));
+    if (menu.exec(d->m_editorList->mapToGlobal(pos))) {
+        QApplication::clipboard()->setText(QDir::toNativeSeparators(fileName));
     }
 }
 
@@ -278,20 +316,20 @@ void EditorToolBar::makeEditorWritable()
 
 void EditorToolBar::setCanGoBack(bool canGoBack)
 {
-    m_goBackAction->setEnabled(canGoBack);
+    d->m_goBackAction->setEnabled(canGoBack);
 }
 
 void EditorToolBar::setCanGoForward(bool canGoForward)
 {
-    m_goForwardAction->setEnabled(canGoForward);
+    d->m_goForwardAction->setEnabled(canGoForward);
 }
 
 void EditorToolBar::updateActionShortcuts()
 {
     ActionManager *am = ICore::instance()->actionManager();
-    m_closeButton->setToolTip(am->command(Constants::CLOSE)->stringWithAppendedShortcut(EditorManager::tr("Close")));
-    m_goBackAction->setToolTip(am->command(Constants::GO_BACK)->action()->toolTip());
-    m_goForwardAction->setToolTip(am->command(Constants::GO_FORWARD)->action()->toolTip());
+    d->m_closeButton->setToolTip(am->command(Constants::CLOSE)->stringWithAppendedShortcut(EditorManager::tr("Close")));
+    d->m_goBackAction->setToolTip(am->command(Constants::GO_BACK)->action()->toolTip());
+    d->m_goForwardAction->setToolTip(am->command(Constants::GO_FORWARD)->action()->toolTip());
 }
 
 IEditor *EditorToolBar::currentEditor() const
@@ -310,27 +348,27 @@ void EditorToolBar::checkEditorStatus()
 
 void EditorToolBar::updateEditorStatus(IEditor *editor)
 {
-    m_lockButton->setVisible(editor != 0);
-    m_closeButton->setEnabled(editor != 0);
+    d->m_lockButton->setVisible(editor != 0);
+    d->m_closeButton->setEnabled(editor != 0);
 
     if (!editor || !editor->file()) {
-        m_editorList->setToolTip(QString());
+        d->m_editorList->setToolTip(QString());
         return;
     }
 
-    m_editorList->setCurrentIndex(m_editorsListModel->indexOf(editor).row());
+    d->m_editorList->setCurrentIndex(d->m_editorsListModel->indexOf(editor).row());
 
     if (editor->file()->isReadOnly()) {
-        m_lockButton->setIcon(QIcon(m_editorsListModel->lockedIcon()));
-        m_lockButton->setEnabled(!editor->file()->fileName().isEmpty());
-        m_lockButton->setToolTip(tr("Make writable"));
+        d->m_lockButton->setIcon(QIcon(d->m_editorsListModel->lockedIcon()));
+        d->m_lockButton->setEnabled(!editor->file()->fileName().isEmpty());
+        d->m_lockButton->setToolTip(tr("Make writable"));
     } else {
-        m_lockButton->setIcon(QIcon(m_editorsListModel->unlockedIcon()));
-        m_lockButton->setEnabled(false);
-        m_lockButton->setToolTip(tr("File is writable"));
+        d->m_lockButton->setIcon(QIcon(d->m_editorsListModel->unlockedIcon()));
+        d->m_lockButton->setEnabled(false);
+        d->m_lockButton->setToolTip(tr("File is writable"));
     }
     if (editor == currentEditor())
-        m_editorList->setToolTip(
+        d->m_editorList->setToolTip(
                 currentEditor()->file()->fileName().isEmpty()
                 ? currentEditor()->displayName()
                     : QDir::toNativeSeparators(editor->file()->fileName())
@@ -340,10 +378,10 @@ void EditorToolBar::updateEditorStatus(IEditor *editor)
 
 void EditorToolBar::setNavigationVisible(bool isVisible)
 {
-    m_goBackAction->setVisible(isVisible);
-    m_goForwardAction->setVisible(isVisible);
-    m_backButton->setVisible(isVisible);
-    m_forwardButton->setVisible(isVisible);
+    d->m_goBackAction->setVisible(isVisible);
+    d->m_goForwardAction->setVisible(isVisible);
+    d->m_backButton->setVisible(isVisible);
+    d->m_forwardButton->setVisible(isVisible);
 }
 
 } // Core