fakevimplugin.cpp 9.82 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
#include <coreplugin/coreconstants.h>
#include <coreplugin/editormanager/editormanager.h>
42
#include <coreplugin/filemanager.h>
hjk's avatar
hjk committed
43
#include <coreplugin/icore.h>
44
#include <coreplugin/ifile.h>
hjk's avatar
hjk committed
45 46 47
#include <coreplugin/messagemanager.h>
#include <coreplugin/modemanager.h>
#include <coreplugin/uniqueidmanager.h>
48
#include <extensionsystem/pluginmanager.h>
hjk's avatar
hjk committed
49 50 51 52 53 54 55 56

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

#include <texteditor/basetexteditor.h>
#include <texteditor/basetextmark.h>
#include <texteditor/itexteditor.h>
#include <texteditor/texteditorconstants.h>
57 58
#include <texteditor/tabsettings.h>
#include <texteditor/texteditorsettings.h>
hjk's avatar
hjk committed
59 60 61 62

#include <utils/qtcassert.h>

#include <QtCore/QDebug>
63
#include <QtCore/QtPlugin>
hjk's avatar
hjk committed
64 65 66 67
#include <QtCore/QObject>
#include <QtCore/QPoint>
#include <QtCore/QSettings>

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


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


namespace FakeVim {
namespace Constants {

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

} // namespace Constants
} // namespace FakeVim


///////////////////////////////////////////////////////////////////////
//
94
// FakeVimPluginPrivate
hjk's avatar
hjk committed
95 96 97
//
///////////////////////////////////////////////////////////////////////

98 99 100 101
namespace FakeVim {
namespace Internal {

class FakeVimPluginPrivate : public QObject
hjk's avatar
hjk committed
102
{
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
    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);
118
    void showExtraInformation(QWidget *, const QString &msg);
119 120 121 122
    void editorOpened(Core::IEditor *);
    void editorAboutToClose(Core::IEditor *);
    void changeSelection(QWidget *widget,
        const QList<QTextEdit::ExtraSelection> &selections);
123
    void writeFile(const QString &fileName, const QString &contents);
124 125 126 127 128 129

private:
    FakeVimPlugin *q;
    FakeVimHandler *m_handler;
    QAction *m_installHandlerAction; 
    Core::ICore *m_core;
130
    Core::IFile *m_currentFile;
131 132 133 134 135 136 137 138
};

} // namespace Internal
} // namespace FakeVim

FakeVimPluginPrivate::FakeVimPluginPrivate(FakeVimPlugin *plugin)
{       
    q = plugin;
hjk's avatar
hjk committed
139
    m_handler = 0;
140 141
    m_installHandlerAction = 0;
    m_core = 0;
142
    m_currentFile = 0;
hjk's avatar
hjk committed
143 144
}

145 146 147
FakeVimPluginPrivate::~FakeVimPluginPrivate()
{
}
hjk's avatar
hjk committed
148

149
void FakeVimPluginPrivate::shutdown()
hjk's avatar
hjk committed
150 151 152 153 154
{
    delete m_handler;
    m_handler = 0;
}

155
bool FakeVimPluginPrivate::initialize(const QStringList &arguments, QString *error_message)
hjk's avatar
hjk committed
156 157 158 159 160 161
{
    Q_UNUSED(arguments);
    Q_UNUSED(error_message);

    m_handler = new FakeVimHandler;

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

165
    Core::ActionManager *actionManager = m_core->actionManager();
hjk's avatar
hjk committed
166 167 168 169 170 171 172 173
    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"));
    
con's avatar
con committed
174
    Core::Command *cmd = 0;
hjk's avatar
hjk committed
175 176 177 178
    cmd = actionManager->registerAction(m_installHandlerAction,
        Constants::INSTALL_HANDLER, globalcontext);
    cmd->setDefaultKeySequence(QKeySequence(Constants::INSTALL_KEY));

179
    ActionContainer *advancedMenu =
hjk's avatar
hjk committed
180 181 182 183 184
        actionManager->actionContainer(Core::Constants::M_EDIT_ADVANCED);
    advancedMenu->addAction(cmd);

    connect(m_installHandlerAction, SIGNAL(triggered()),
        this, SLOT(installHandler()));
185 186 187 188 189 190 191 192

    // 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
193 194 195
    return true;
}

196
void FakeVimPluginPrivate::installHandler()
hjk's avatar
hjk committed
197
{
198 199 200
    if (Core::IEditor *editor = m_core->editorManager()->currentEditor())
        installHandler(editor->widget());
}
hjk's avatar
hjk committed
201

202
void FakeVimPluginPrivate::installHandler(QWidget *widget)
203
{
204 205
    connect(m_handler, SIGNAL(extraInformationChanged(QWidget *, QString)),
        this, SLOT(showExtraInformation(QWidget *, QString)));
hjk's avatar
hjk committed
206 207
    connect(m_handler, SIGNAL(commandBufferChanged(QString)),
        this, SLOT(showCommandBuffer(QString)));
208 209
    connect(m_handler, SIGNAL(quitRequested(QWidget *)),
        this, SLOT(removeHandler(QWidget *)));
210 211 212
    connect(m_handler,
        SIGNAL(selectionChanged(QWidget*,QList<QTextEdit::ExtraSelection>)),
        this, SLOT(changeSelection(QWidget*,QList<QTextEdit::ExtraSelection>)));
213

214
    m_handler->addWidget(widget);
215 216 217 218 219 220
    TextEditor::BaseTextEditor* editor =
        qobject_cast<TextEditor::BaseTextEditor*>(widget);
    if (editor) {
        m_currentFile = editor->file();
        m_handler->setCurrentFileName(editor->file()->fileName());
    }
221

222 223
    BaseTextEditor *bt = qobject_cast<BaseTextEditor *>(widget);
    if (bt) {
224 225
        using namespace TextEditor;
        using namespace FakeVim::Constants;
226
        TabSettings settings = bt->tabSettings();
227 228 229 230 231 232 233 234
        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); 
235 236
        m_handler->setConfigValue(ConfigAutoIndent,
            settings.m_autoIndent ? ConfigOn : ConfigOff); 
237
    }
hjk's avatar
hjk committed
238 239
}

240 241 242 243
void FakeVimPluginPrivate::writeFile(const QString &fileName,
    const QString &contents)
{
    if (m_currentFile && fileName == m_currentFile->fileName()) {
hjk's avatar
hjk committed
244
        // Handle that as a special case for nicer interaction with core
245 246 247 248 249 250 251 252 253 254 255
        m_core->fileManager()->blockFileChange(m_currentFile);
        m_currentFile->save(fileName);
        m_core->fileManager()->unblockFileChange(m_currentFile);
    } else {
        QFile file(fileName);
        file.open(QIODevice::ReadWrite);
        { QTextStream ts(&file); ts << contents; }
        file.close();
    }
}

256
void FakeVimPluginPrivate::removeHandler(QWidget *widget)
hjk's avatar
hjk committed
257
{
hjk's avatar
hjk committed
258
    Q_UNUSED(widget);
hjk's avatar
hjk committed
259
    m_handler->removeWidget(widget);
hjk's avatar
hjk committed
260 261
    Core::EditorManager::instance()->hideEditorInfoBar(
        QLatin1String(Constants::MINI_BUFFER));
262
    m_currentFile = 0;
hjk's avatar
hjk committed
263 264
}

265
void FakeVimPluginPrivate::editorOpened(Core::IEditor *editor)
266
{
hjk's avatar
hjk committed
267
    Q_UNUSED(editor);
268 269 270 271
    //qDebug() << "OPENING: " << editor << editor->widget();
    //installHandler(editor->widget()); 
}

272
void FakeVimPluginPrivate::editorAboutToClose(Core::IEditor *editor)
273 274 275 276 277
{
    //qDebug() << "CLOSING: " << editor << editor->widget();
    removeHandler(editor->widget()); 
}

278
void FakeVimPluginPrivate::showCommandBuffer(const QString &contents)
hjk's avatar
hjk committed
279
{
hjk's avatar
hjk committed
280 281 282
    Core::EditorManager::instance()->showEditorInfoBar( 
        QLatin1String(Constants::MINI_BUFFER), contents,
        tr("Quit FakeVim"), m_handler, SLOT(quit()));
hjk's avatar
hjk committed
283 284
}

285
void FakeVimPluginPrivate::showExtraInformation(QWidget *widget, const QString &text)
286
{
287
    QMessageBox::information(widget, tr("FakeVim Information"), text);
288 289
}

290
void FakeVimPluginPrivate::changeSelection(QWidget *widget,
291 292 293 294 295 296
    const QList<QTextEdit::ExtraSelection> &selection)
{
    if (BaseTextEditor *bt = qobject_cast<BaseTextEditor *>(widget))
        bt->setExtraSelections(BaseTextEditor::FakeVimSelection, selection);
}

297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327

///////////////////////////////////////////////////////////////////////
//
// 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
328 329

Q_EXPORT_PLUGIN(FakeVimPlugin)