fakevimplugin.cpp 9.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
#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 48 49 50 51 52 53 54 55
#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>
56 57
#include <texteditor/tabsettings.h>
#include <texteditor/texteditorsettings.h>
hjk's avatar
hjk committed
58 59 60 61

#include <utils/qtcassert.h>

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

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


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


namespace FakeVim {
namespace Constants {

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

} // namespace Constants
} // namespace FakeVim


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

97 98 99 100
namespace FakeVim {
namespace Internal {

class FakeVimPluginPrivate : public QObject
hjk's avatar
hjk committed
101
{
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
    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);
122
    void writeFile(const QString &fileName, const QString &contents);
123 124 125 126 127 128

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

} // namespace Internal
} // namespace FakeVim

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

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

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

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

    m_handler = new FakeVimHandler;

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

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

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

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

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

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

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

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

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

239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
void FakeVimPluginPrivate::writeFile(const QString &fileName,
    const QString &contents)
{
    if (m_currentFile && fileName == m_currentFile->fileName()) {
        // handle that as a special case for nicer interation with
        // Creator core
        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(const QString &text)
286 287 288 289
{
    QMessageBox::information(0, tr("FakeVim Information"), text);
}

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)