summaryrefslogtreecommitdiffstats
path: root/kexi/widget/kexieditor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kexi/widget/kexieditor.cpp')
-rw-r--r--kexi/widget/kexieditor.cpp261
1 files changed, 261 insertions, 0 deletions
diff --git a/kexi/widget/kexieditor.cpp b/kexi/widget/kexieditor.cpp
new file mode 100644
index 00000000..f482584e
--- /dev/null
+++ b/kexi/widget/kexieditor.cpp
@@ -0,0 +1,261 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Lucijan Busch <[email protected]>
+ Copyright (C) 2004-2005 Jaroslaw Staniek <[email protected]>
+ Copyright (C) 2005 Cedric Pasteur <[email protected]>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include "kexieditor.h"
+
+#include <keximainwindow.h>
+
+#include <qlayout.h>
+#include <qframe.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+//uncomment this to enable KTextEdit-based editor
+//#define KTEXTEDIT_BASED_SQL_EDITOR
+
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+# include <ktextedit.h>
+#else
+# include <ktexteditor/document.h>
+# include <ktexteditor/view.h>
+# include <ktexteditor/editorchooser.h>
+# include <ktexteditor/editinterface.h>
+# include <ktexteditor/viewcursorinterface.h>
+# include <ktexteditor/popupmenuinterface.h>
+# include <ktexteditor/undointerface.h>
+# include <ktexteditor/configinterface.h>
+# include <ktexteditor/highlightinginterface.h>
+#endif
+
+/** Used for the shared action framework to redirect shared actions like
+copy and paste to the editor. */
+class KexiEditorSharedActionConnector : public KexiSharedActionConnector
+{
+public:
+ KexiEditorSharedActionConnector( KexiActionProxy* proxy, QObject* obj )
+ : KexiSharedActionConnector( proxy, obj )
+ {
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+ plugSharedAction("edit_cut", SLOT(cut()));
+ plugSharedAction("edit_copy", SLOT(copy()));
+ plugSharedAction("edit_paste", SLOT(paste()));
+ plugSharedAction("edit_clear", SLOT(clear()));
+ plugSharedAction("edit_undo", SLOT(undo()));
+ plugSharedAction("edit_redo", SLOT(redo()));
+ plugSharedAction("edit_select_all", SLOT(selectAll()));
+#else
+ QValueList<QCString> actions;
+ actions << "edit_cut" << "edit_copy" << "edit_paste" << "edit_clear"
+ << "edit_undo" << "edit_redo" << "edit_select_all";
+ plugSharedActionsToExternalGUI(actions, dynamic_cast<KXMLGUIClient*>(obj));
+#endif
+ }
+};
+
+//! @internal
+class KexiEditorPrivate {
+ public:
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+ KTextEdit *view;
+#else
+ KTextEditor::Document *doc;
+ KTextEditor::View *view;
+#endif
+};
+
+KexiEditor::KexiEditor(KexiMainWindow *mainWin, QWidget *parent, const char *name)
+ : KexiViewBase(mainWin, parent, name)
+ , d(new KexiEditorPrivate())
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+ d->view = new KTextEdit( "", QString::null, this, "kexi_editor" );
+ //adjust font
+ connect(d->view, SIGNAL(textChanged()), this, SIGNAL(textChanged()));
+ QFont f("Courier");
+ f.setStyleStrategy(QFont::PreferAntialias);
+ f.setPointSize(d->view->font().pointSize());
+ d->view->setFont( f );
+ d->view->setCheckSpellingEnabled(false);
+#else
+ QFrame *fr = new QFrame(this);
+ fr->setFrameStyle(QFrame::Sunken|QFrame::WinPanel);
+ layout->addWidget(fr);
+ layout = new QVBoxLayout(fr);
+ layout->setMargin( 2 );
+
+ d->doc = KTextEditor::EditorChooser::createDocument(fr);
+ if (!d->doc)
+ return;
+ d->view = d->doc->createView(fr, 0L);
+
+ KTextEditor::PopupMenuInterface *popupInt = dynamic_cast<KTextEditor::PopupMenuInterface*>( d->view );
+ if(popupInt) {
+ QPopupMenu *pop = (QPopupMenu*) mainWin->factory()->container("edit", mainWin);
+ if(pop) {
+ //plugSharedAction("edit_undo", pop);
+ popupInt->installPopup(pop);
+ }
+ }
+
+ connect(d->doc, SIGNAL(textChanged()), this, SIGNAL(textChanged()));
+#endif
+ KexiEditorSharedActionConnector c(this, d->view);
+ d->view->installEventFilter(this);
+
+ layout->addWidget(d->view);
+ setViewWidget(d->view, true/*focus*/);
+ d->view->show();
+}
+
+KexiEditor::~KexiEditor()
+{
+ delete d;
+}
+
+void KexiEditor::updateActions(bool activated)
+{
+ KexiViewBase::updateActions(activated);
+}
+
+bool KexiEditor::isAdvancedEditor()
+{
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+ return false;
+#else
+ return true;
+#endif
+}
+
+QString KexiEditor::text()
+{
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+ return d->view->text();
+#else
+ if (!d->doc)
+ return QString::null;
+ KTextEditor::EditInterface *eIface = KTextEditor::editInterface(d->doc);
+ return eIface->text();
+#endif
+}
+
+void KexiEditor::setText(const QString &text)
+{
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+ const bool was_dirty = m_parentView ? m_parentView->dirty() : dirty();
+ d->view->setText(text);
+ setDirty(was_dirty);
+#else
+ if (!d->doc)
+ return;
+ const bool was_dirty = dirty();
+ KTextEditor::EditInterface *eIface = KTextEditor::editInterface(d->doc);
+ eIface->setText(text);
+ KTextEditor::UndoInterface *undoIface = KTextEditor::undoInterface(d->doc);
+ undoIface->clearUndo();
+ undoIface->clearRedo();
+ setDirty(was_dirty);
+#endif
+}
+
+void KexiEditor::setHighlightMode(const QString& highlightmodename)
+{
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+#else
+ KTextEditor::HighlightingInterface *hl = KTextEditor::highlightingInterface( d->doc );
+ for(uint i = 0; i < hl->hlModeCount(); i++) {
+ //kdDebug() << "hlmode("<<i<<"): " << hl->hlModeName(i) << endl;
+ if (hl->hlModeName(i).contains(highlightmodename, false)) {
+ hl->setHlMode(i);
+ return;
+ }
+ }
+ hl->setHlMode(0); // 0=None, don't highlight anything.
+#endif
+}
+
+void KexiEditor::slotConfigureEditor()
+{
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+ //TODO show errormessage?
+#else
+ KTextEditor::ConfigInterface *config = KTextEditor::configInterface( d->doc );
+ if (config)
+ config->configDialog();
+#endif
+}
+
+void KexiEditor::jump(int character)
+{
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+ const int numRows = d->view->paragraphs();
+ int row = 0, col = 0;
+ for (int ch = 0; row < numRows; row++) {
+ const int rowLen = d->view->paragraphLength(row)+1;
+ if ((ch + rowLen) > character) {
+ col = character-ch;
+ break;
+ }
+ ch += rowLen;
+ }
+ d->view->setCursorPosition(row, col);
+#else
+ if (!d->doc)
+ return;
+ KTextEditor::EditInterface *ei = KTextEditor::editInterface(d->doc);
+ const int numRows = ei->numLines();
+ int row = 0, col = 0;
+ for (int ch = 0; row < numRows; row++) {
+ const int rowLen = ei->lineLength(row)+1;
+ if ((ch + rowLen) > character) {
+ col = character-ch;
+ break;
+ }
+ ch += rowLen;
+ }
+ KTextEditor::ViewCursorInterface *ci = KTextEditor::viewCursorInterface(d->view);
+ ci->setCursorPositionReal(row, col);
+#endif
+}
+
+void KexiEditor::setCursorPosition(int line, int col)
+{
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+ d->view->setCursorPosition(line, col);
+#else
+ KTextEditor::ViewCursorInterface *ci = KTextEditor::viewCursorInterface( d->view );
+ ci->setCursorPosition(line, col);
+#endif
+}
+
+void KexiEditor::clearUndoRedo()
+{
+#ifdef KTEXTEDIT_BASED_SQL_EDITOR
+ //TODO how to remove undo/redo from a KTextEdit?
+#else
+ KTextEditor::UndoInterface* u = KTextEditor::undoInterface( d->doc );
+ u->clearUndo();
+ u->clearRedo();
+#endif
+}
+
+#include "kexieditor.moc"
+