fakevimplugin.cpp 8.74 KB
Newer Older
hjk's avatar
hjk committed
1 2 3 4
/***************************************************************************
**
** This file is part of Qt Creator
**
5
** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
hjk's avatar
hjk committed
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
**
** Contact:  Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
** Licensees may use this file in accordance with the Qt Beta Version
** License Agreement, Agreement version 2.2 provided with the Software or,
** alternatively, in accordance with the terms contained in a written
** agreement between you and Nokia.
**
** GNU General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the packaging
** of this file.  Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
**
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
** http://www.gnu.org/copyleft/gpl.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt GPL Exception
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
**
***************************************************************************/

#include "fakevimplugin.h"

36 37
#include "fakevimconstants.h"
#include "fakevimhandler.h"
hjk's avatar
hjk committed
38

39
#include <coreplugin/actionmanager/actionmanager.h>
hjk's avatar
hjk committed
40 41 42 43 44 45 46 47 48 49 50 51 52 53
#include <coreplugin/coreconstants.h>
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/icore.h>
#include <coreplugin/messagemanager.h>
#include <coreplugin/modemanager.h>
#include <coreplugin/uniqueidmanager.h>

#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/session.h>

#include <texteditor/basetexteditor.h>
#include <texteditor/basetextmark.h>
#include <texteditor/itexteditor.h>
#include <texteditor/texteditorconstants.h>
54 55
#include <texteditor/tabsettings.h>
#include <texteditor/texteditorsettings.h>
hjk's avatar
hjk committed
56 57 58 59

#include <utils/qtcassert.h>

#include <QtCore/QDebug>
60
#include <QtCore/QtPlugin>
hjk's avatar
hjk committed
61 62 63 64
#include <QtCore/QObject>
#include <QtCore/QPoint>
#include <QtCore/QSettings>

65
#include <QtGui/QMessageBox>
hjk's avatar
hjk committed
66 67 68
#include <QtGui/QPlainTextEdit>
#include <QtGui/QTextBlock>
#include <QtGui/QTextCursor>
69
#include <QtGui/QTextEdit>
hjk's avatar
hjk committed
70 71 72 73 74 75 76 77 78 79 80 81


using namespace FakeVim::Internal;
using namespace TextEditor;
using namespace Core;
using namespace ProjectExplorer;


namespace FakeVim {
namespace Constants {

const char * const INSTALL_HANDLER        = "FakeVim.InstallHandler";
82
const char * const MINI_BUFFER            = "FakeVim.MiniBuffer";
hjk's avatar
hjk committed
83 84 85 86 87 88 89 90
const char * const INSTALL_KEY            = "Alt+V,Alt+V";

} // namespace Constants
} // namespace FakeVim


///////////////////////////////////////////////////////////////////////
//
91
// FakeVimPluginPrivate
hjk's avatar
hjk committed
92 93 94
//
///////////////////////////////////////////////////////////////////////

95 96 97 98
namespace FakeVim {
namespace Internal {

class FakeVimPluginPrivate : public QObject
hjk's avatar
hjk committed
99
{
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    Q_OBJECT

public:
    FakeVimPluginPrivate(FakeVimPlugin *);
    ~FakeVimPluginPrivate();
    friend class FakeVimPlugin;

    bool initialize(const QStringList &arguments, QString *error_message);
    void shutdown();

private slots:
    void installHandler();
    void installHandler(QWidget *widget);
    void removeHandler(QWidget *widget);
    void showCommandBuffer(const QString &contents);
    void showExtraInformation(const QString &msg);
    void editorOpened(Core::IEditor *);
    void editorAboutToClose(Core::IEditor *);
    void changeSelection(QWidget *widget,
        const QList<QTextEdit::ExtraSelection> &selections);

private:
    FakeVimPlugin *q;
    FakeVimHandler *m_handler;
    QAction *m_installHandlerAction; 
    Core::ICore *m_core;
};

} // namespace Internal
} // namespace FakeVim

FakeVimPluginPrivate::FakeVimPluginPrivate(FakeVimPlugin *plugin)
{       
    q = plugin;
hjk's avatar
hjk committed
134
    m_handler = 0;
135 136
    m_installHandlerAction = 0;
    m_core = 0;
hjk's avatar
hjk committed
137 138
}

139 140 141
FakeVimPluginPrivate::~FakeVimPluginPrivate()
{
}
hjk's avatar
hjk committed
142

143
void FakeVimPluginPrivate::shutdown()
hjk's avatar
hjk committed
144 145 146 147 148
{
    delete m_handler;
    m_handler = 0;
}

149
bool FakeVimPluginPrivate::initialize(const QStringList &arguments, QString *error_message)
hjk's avatar
hjk committed
150 151 152 153 154 155
{
    Q_UNUSED(arguments);
    Q_UNUSED(error_message);

    m_handler = new FakeVimHandler;

156 157
    m_core = ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>();
    QTC_ASSERT(m_core, return false);
hjk's avatar
hjk committed
158

159
    Core::ActionManager *actionManager = m_core->actionManager();
hjk's avatar
hjk committed
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
    QTC_ASSERT(actionManager, return false);

    QList<int> globalcontext;
    globalcontext << Core::Constants::C_GLOBAL_ID;

    m_installHandlerAction = new QAction(this);
    m_installHandlerAction->setText(tr("Set vi-Style Keyboard Action Handler"));
    
    Core::ICommand *cmd = 0;
    cmd = actionManager->registerAction(m_installHandlerAction,
        Constants::INSTALL_HANDLER, globalcontext);
    cmd->setDefaultKeySequence(QKeySequence(Constants::INSTALL_KEY));

    IActionContainer *advancedMenu =
        actionManager->actionContainer(Core::Constants::M_EDIT_ADVANCED);
    advancedMenu->addAction(cmd);

    connect(m_installHandlerAction, SIGNAL(triggered()),
        this, SLOT(installHandler()));
179 180 181 182 183 184 185 186

    // EditorManager
    QObject *editorManager = m_core->editorManager();
    connect(editorManager, SIGNAL(editorAboutToClose(Core::IEditor*)),
        this, SLOT(editorAboutToClose(Core::IEditor*)));
    connect(editorManager, SIGNAL(editorOpened(Core::IEditor*)),
        this, SLOT(editorOpened(Core::IEditor*)));

hjk's avatar
hjk committed
187 188 189
    return true;
}

190
void FakeVimPluginPrivate::installHandler()
hjk's avatar
hjk committed
191
{
192 193 194
    if (Core::IEditor *editor = m_core->editorManager()->currentEditor())
        installHandler(editor->widget());
}
hjk's avatar
hjk committed
195

196
void FakeVimPluginPrivate::installHandler(QWidget *widget)
197
{
198 199
    connect(m_handler, SIGNAL(extraInformationChanged(QString)),
        this, SLOT(showExtraInformation(QString)));
hjk's avatar
hjk committed
200 201
    connect(m_handler, SIGNAL(commandBufferChanged(QString)),
        this, SLOT(showCommandBuffer(QString)));
202 203
    connect(m_handler, SIGNAL(quitRequested(QWidget *)),
        this, SLOT(removeHandler(QWidget *)));
204 205 206
    connect(m_handler,
        SIGNAL(selectionChanged(QWidget*,QList<QTextEdit::ExtraSelection>)),
        this, SLOT(changeSelection(QWidget*,QList<QTextEdit::ExtraSelection>)));
207

208
    m_handler->addWidget(widget);
209

210 211
    BaseTextEditor *bt = qobject_cast<BaseTextEditor *>(widget);
    if (bt) {
212 213
        using namespace TextEditor;
        using namespace FakeVim::Constants;
214
        TabSettings settings = bt->tabSettings();
215 216 217 218 219 220 221 222
        m_handler->setConfigValue(ConfigTabStop,
            QString::number(settings.m_tabSize));
        m_handler->setConfigValue(ConfigShiftWidth,
            QString::number(settings.m_indentSize));
        m_handler->setConfigValue(ConfigExpandTab,
            settings.m_spacesForTabs ? ConfigOn : ConfigOff);
        m_handler->setConfigValue(ConfigSmartTab,
            settings.m_smartBackspace ? ConfigOn : ConfigOff); 
223 224
        m_handler->setConfigValue(ConfigAutoIndent,
            settings.m_autoIndent ? ConfigOn : ConfigOff); 
225
    }
hjk's avatar
hjk committed
226 227
}

228
void FakeVimPluginPrivate::removeHandler(QWidget *widget)
hjk's avatar
hjk committed
229
{
hjk's avatar
hjk committed
230
    Q_UNUSED(widget);
hjk's avatar
hjk committed
231
    m_handler->removeWidget(widget);
hjk's avatar
hjk committed
232 233
    Core::EditorManager::instance()->hideEditorInfoBar(
        QLatin1String(Constants::MINI_BUFFER));
hjk's avatar
hjk committed
234 235
}

236
void FakeVimPluginPrivate::editorOpened(Core::IEditor *editor)
237
{
hjk's avatar
hjk committed
238
    Q_UNUSED(editor);
239 240 241 242
    //qDebug() << "OPENING: " << editor << editor->widget();
    //installHandler(editor->widget()); 
}

243
void FakeVimPluginPrivate::editorAboutToClose(Core::IEditor *editor)
244 245 246 247 248
{
    //qDebug() << "CLOSING: " << editor << editor->widget();
    removeHandler(editor->widget()); 
}

249
void FakeVimPluginPrivate::showCommandBuffer(const QString &contents)
hjk's avatar
hjk committed
250
{
hjk's avatar
hjk committed
251 252 253
    Core::EditorManager::instance()->showEditorInfoBar( 
        QLatin1String(Constants::MINI_BUFFER), contents,
        tr("Quit FakeVim"), m_handler, SLOT(quit()));
hjk's avatar
hjk committed
254 255
}

256
void FakeVimPluginPrivate::showExtraInformation(const QString &text)
257 258 259 260
{
    QMessageBox::information(0, tr("FakeVim Information"), text);
}

261
void FakeVimPluginPrivate::changeSelection(QWidget *widget,
262 263 264 265 266 267
    const QList<QTextEdit::ExtraSelection> &selection)
{
    if (BaseTextEditor *bt = qobject_cast<BaseTextEditor *>(widget))
        bt->setExtraSelections(BaseTextEditor::FakeVimSelection, selection);
}

268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298

///////////////////////////////////////////////////////////////////////
//
// FakeVimPlugin
//
///////////////////////////////////////////////////////////////////////

FakeVimPlugin::FakeVimPlugin()
    : d(new FakeVimPluginPrivate(this))
{}

FakeVimPlugin::~FakeVimPlugin()
{
    delete d;
}

bool FakeVimPlugin::initialize(const QStringList &arguments, QString *error_message)
{
    return d->initialize(arguments, error_message);
}

void FakeVimPlugin::shutdown()
{
    d->shutdown();
}

void FakeVimPlugin::extensionsInitialized()
{
}

#include "fakevimplugin.moc"
hjk's avatar
hjk committed
299 300

Q_EXPORT_PLUGIN(FakeVimPlugin)