1
/* This file is part of the KDE project
2
Copyright (C) 2003 Lucijan Busch <lucijan@gmx.at>
3
Copyright (C) 2004-2005 JarosÅaw Staniek <staniek@kde.org>
4
Copyright (C) 2005 Cedric Pasteur <cedric.pasteur@free.fr>
6
This program is free software; you can redistribute it and/or
7
modify it under the terms of the GNU Library General Public
8
License as published by the Free Software Foundation; either
9
version 2 of the License, or (at your option) any later version.
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
Library General Public License for more details.
16
You should have received a copy of the GNU Library General Public License
17
along with this program; see the file COPYING. If not, write to
18
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19
* Boston, MA 02110-1301, USA.
22
#include "kexieditor.h"
24
#include <KexiMainWindowIface.h>
25
#include <kexiutils/utils.h>
29
#include <QVBoxLayout>
31
//uncomment this to enable KTextEdit-based editor
32
//#define KTEXTEDIT_BASED_TEXT_EDITOR
34
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
37
# include <KTextEditor/Document>
38
# include <KTextEditor/Editor>
39
# include <KTextEditor/View>
40
# include <KTextEditor/ConfigInterface>
43
/** Used for the shared action framework to redirect shared actions like
44
copy and paste to the editor. */
45
class KexiEditorSharedActionConnector : public KexiSharedActionConnector
48
KexiEditorSharedActionConnector(KexiActionProxy* proxy, QObject* obj)
49
: KexiSharedActionConnector(proxy, obj) {
50
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
51
plugSharedAction("edit_cut", SLOT(cut()));
52
plugSharedAction("edit_copy", SLOT(copy()));
53
plugSharedAction("edit_paste", SLOT(paste()));
54
plugSharedAction("edit_clear", SLOT(clear()));
55
plugSharedAction("edit_undo", SLOT(undo()));
56
plugSharedAction("edit_redo", SLOT(redo()));
57
plugSharedAction("edit_select_all", SLOT(selectAll()));
59
QList<QByteArray> actions;
60
actions << "edit_cut" << "edit_copy" << "edit_paste" << "edit_clear"
61
<< "edit_undo" << "edit_redo" << "edit_select_all";
62
//! @todo KEXI3 plugSharedActionsToExternalGUI(actions, dynamic_cast<KXMLGUIClient*>(obj));
68
class KexiEditor::Private
72
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
75
KTextEditor::Document *doc;
76
KTextEditor::View *view;
80
KexiEditor::KexiEditor(QWidget *parent)
84
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
85
d->view = new KTextEdit("", QString(), this);
87
connect(d->view, SIGNAL(textChanged()), this, SIGNAL(textChanged()));
89
f.setStyleStrategy(QFont::PreferAntialias);
90
f.setPointSize(d->view->font().pointSize());
92
d->view->setCheckSpellingEnabled(false);
94
QWidget *fr = new QWidget(this);
95
QVBoxLayout *layout = new QVBoxLayout(fr);
96
layout->setContentsMargins(0, 0, 0, 0);
98
KTextEditor::Editor *editor = KTextEditor::Editor::instance();
101
//! @todo error handling!
103
d->doc = editor->createDocument(fr);
106
d->view = d->doc->createView(fr);
107
// suppresing default saving mechanism of KTextEditor
108
d->view->action("file_save")->setEnabled(false);
109
// set word wrap by default
110
KTextEditor::ConfigInterface *configIface
111
= qobject_cast<KTextEditor::ConfigInterface*>(d->view);
112
configIface->setConfigValue("dynamic-word-wrap", true);
114
//! @todo KEXI3 Q3PopupMenu *pop = qobject_cast<Q3PopupMenu*>( mainWin->factory()->container("edit", mainWin) );
115
//! @todo KEXI3 d->view->setContextMenu(pop);
116
d->view->setContextMenu(d->view->defaultContextMenu());
118
connect(d->doc, SIGNAL(textChanged(KTextEditor::Document*)),
119
this, SLOT(slotTextChanged(KTextEditor::Document*)));
121
KexiEditorSharedActionConnector c(this, d->view);
122
d->view->installEventFilter(this);
124
layout->addWidget(d->view);
125
setViewWidget(fr, false/*!focus*/);
126
setFocusProxy(d->view);
129
KexiEditor::~KexiEditor()
134
void KexiEditor::updateActions(bool activated)
136
KexiView::updateActions(activated);
139
bool KexiEditor::isAdvancedEditor()
141
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
148
QString KexiEditor::text()
150
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
151
return d->view->text();
155
return d->doc->text();
159
void KexiEditor::setText(const QString &text)
161
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
162
const bool was_dirty = m_parentView ? m_parentView->idDirty() : idDirty();
163
d->view->setText(text);
168
const bool was_dirty = isDirty();
169
d->doc->setText(text);
174
void KexiEditor::setHighlightMode(const QString& highlightmodename)
176
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
180
QString n = highlightmodename;
181
if (n == "javascript" || n == "qtscript")
183
else if (n.size() > 0)
184
n = n[0].toLower() + n.mid(1);
185
if (!d->doc->setMode(n))
186
d->doc->setMode(QString()); // don't highlight
187
if (!d->doc->setHighlightingMode(n))
188
d->doc->setHighlightingMode(QString()); //hl->setHlMode(0); // 0=None, don't highlight anything.
190
//! @todo Code from 3540345ea16477d05e84, these signals no longer exist
191
// QMetaObject::invokeMethod(d->view, "modeChanged", Q_ARG(KTextEditor::Document*, d->doc));
192
// QMetaObject::invokeMethod(d->view, "highlightingModeChanged", Q_ARG(KTextEditor::Document*, d->doc));
196
void KexiEditor::slotConfigureEditor()
198
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
199
//! @todo show configuration...
203
KTextEditor::Editor *editor = KTextEditor::Editor::instance();
206
editor->configDialog(this);
207
//! @todo use d->doc->editor()->writeConfig() or KTextEditor::ConfigInterface to save changes
211
void KexiEditor::jump(int character)
213
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
214
const int numRows = d->view->paragraphs();
215
int row = 0, col = 0;
216
for (int ch = 0; row < numRows; row++) {
217
const int rowLen = d->view->paragraphLength(row) + 1;
218
if ((ch + rowLen) > character) {
219
col = character - ch;
224
d->view->setCursorPosition(row, col);
228
const int numRows = d->doc->lines();
229
int row = 0, col = 0;
230
for (int ch = 0; row < numRows; row++) {
231
const int rowLen = d->doc->lineLength(row) + 1;
232
if ((ch + rowLen) > character) {
233
col = character - ch;
238
d->view->setCursorPosition(KTextEditor::Cursor(row, col));
242
void KexiEditor::setCursorPosition(int line, int col)
244
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
245
d->view->setCursorPosition(line, col);
247
d->view->setCursorPosition(KTextEditor::Cursor(line, col));
251
void KexiEditor::clearUndoRedo()
253
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
254
//! @todo how to remove undo/redo from a KTextEdit?
256
//! @todo KEXI3 KexiEditor::clearUndoRedo()
260
void KexiEditor::slotTextChanged(KTextEditor::Document *)
265
QMenu* KexiEditor::defaultContextMenu()
267
#ifdef KTEXTEDIT_BASED_TEXT_EDITOR
268
return d->view->createStandardContextMenu();
270
QMenu* menu = d->view->defaultContextMenu();
271
menu->addSeparator();
272
menu->addAction(d->view->action("edit_find"));
273
menu->addAction(d->view->action("edit_find_next"));
274
menu->addAction(d->view->action("edit_find_prev"));
275
menu->addAction(d->view->action("edit_replace"));
276
menu->addAction(d->view->action("go_goto_line"));