00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "kexieditor.h"
00023
00024 #include <keximainwindow.h>
00025
00026 #include <qlayout.h>
00027 #include <qframe.h>
00028 #include <klocale.h>
00029 #include <kdebug.h>
00030
00031
00032
00033
00034 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00035 # include <ktextedit.h>
00036 #else
00037 # include <ktexteditor/document.h>
00038 # include <ktexteditor/view.h>
00039 # include <ktexteditor/editorchooser.h>
00040 # include <ktexteditor/editinterface.h>
00041 # include <ktexteditor/viewcursorinterface.h>
00042 # include <ktexteditor/popupmenuinterface.h>
00043 # include <ktexteditor/undointerface.h>
00044 # include <ktexteditor/configinterface.h>
00045 # include <ktexteditor/highlightinginterface.h>
00046 #endif
00047
00050 class KexiEditorSharedActionConnector : public KexiSharedActionConnector
00051 {
00052 public:
00053 KexiEditorSharedActionConnector( KexiActionProxy* proxy, QObject* obj )
00054 : KexiSharedActionConnector( proxy, obj )
00055 {
00056 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00057 plugSharedAction("edit_cut", SLOT(cut()));
00058 plugSharedAction("edit_copy", SLOT(copy()));
00059 plugSharedAction("edit_paste", SLOT(paste()));
00060 plugSharedAction("edit_clear", SLOT(clear()));
00061 plugSharedAction("edit_undo", SLOT(undo()));
00062 plugSharedAction("edit_redo", SLOT(redo()));
00063 plugSharedAction("edit_select_all", SLOT(selectAll()));
00064 #else
00065 QValueList<QCString> actions;
00066 actions << "edit_cut" << "edit_copy" << "edit_paste" << "edit_clear"
00067 << "edit_undo" << "edit_redo" << "edit_select_all";
00068 plugSharedActionsToExternalGUI(actions, dynamic_cast<KXMLGUIClient*>(obj));
00069 #endif
00070 }
00071 };
00072
00074 class KexiEditorPrivate {
00075 public:
00076 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00077 KTextEdit *view;
00078 #else
00079 KTextEditor::Document *doc;
00080 KTextEditor::View *view;
00081 #endif
00082 };
00083
00084 KexiEditor::KexiEditor(KexiMainWindow *mainWin, QWidget *parent, const char *name)
00085 : KexiViewBase(mainWin, parent, name)
00086 , d(new KexiEditorPrivate())
00087 {
00088 QVBoxLayout *layout = new QVBoxLayout(this);
00089 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00090 d->view = new KTextEdit( "", QString::null, this, "kexi_editor" );
00091
00092 connect(d->view, SIGNAL(textChanged()), this, SIGNAL(textChanged()));
00093 QFont f("Courier");
00094 f.setStyleStrategy(QFont::PreferAntialias);
00095 f.setPointSize(d->view->font().pointSize());
00096 d->view->setFont( f );
00097 d->view->setCheckSpellingEnabled(false);
00098 #else
00099 QFrame *fr = new QFrame(this);
00100 fr->setFrameStyle(QFrame::Sunken|QFrame::WinPanel);
00101 layout->addWidget(fr);
00102 layout = new QVBoxLayout(fr);
00103 layout->setMargin( 2 );
00104
00105 d->doc = KTextEditor::EditorChooser::createDocument(fr);
00106 if (!d->doc)
00107 return;
00108 d->view = d->doc->createView(fr, 0L);
00109
00110 KTextEditor::PopupMenuInterface *popupInt = dynamic_cast<KTextEditor::PopupMenuInterface*>( d->view );
00111 if(popupInt) {
00112 QPopupMenu *pop = (QPopupMenu*) mainWin->factory()->container("edit", mainWin);
00113 if(pop) {
00114
00115 popupInt->installPopup(pop);
00116 }
00117 }
00118
00119 connect(d->doc, SIGNAL(textChanged()), this, SIGNAL(textChanged()));
00120 #endif
00121 KexiEditorSharedActionConnector c(this, d->view);
00122 d->view->installEventFilter(this);
00123
00124 layout->addWidget(d->view);
00125 setViewWidget(d->view, true);
00126 d->view->show();
00127 }
00128
00129 KexiEditor::~KexiEditor()
00130 {
00131 }
00132
00133 void KexiEditor::updateActions(bool activated)
00134 {
00135 KexiViewBase::updateActions(activated);
00136 }
00137
00138 bool KexiEditor::isAdvancedEditor()
00139 {
00140 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00141 return false;
00142 #else
00143 return true;
00144 #endif
00145 }
00146
00147 QString KexiEditor::text()
00148 {
00149 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00150 return d->view->text();
00151 #else
00152 if (!d->doc)
00153 return QString::null;
00154 KTextEditor::EditInterface *eIface = KTextEditor::editInterface(d->doc);
00155 return eIface->text();
00156 #endif
00157 }
00158
00159 void KexiEditor::setText(const QString &text)
00160 {
00161 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00162 const bool was_dirty = m_parentView ? m_parentView->dirty() : dirty();
00163 d->view->setText(text);
00164 setDirty(was_dirty);
00165 #else
00166 if (!d->doc)
00167 return;
00168 const bool was_dirty = dirty();
00169 KTextEditor::EditInterface *eIface = KTextEditor::editInterface(d->doc);
00170 eIface->setText(text);
00171 setDirty(was_dirty);
00172 #endif
00173 }
00174
00175 void KexiEditor::setHighlightMode(const QString& highlightmodename)
00176 {
00177 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00178 #else
00179 KTextEditor::HighlightingInterface *hl = KTextEditor::highlightingInterface( d->doc );
00180 for(uint i = 0; i < hl->hlModeCount(); i++) {
00181
00182 if (hl->hlModeName(i).contains(highlightmodename, false)) {
00183 hl->setHlMode(i);
00184 return;
00185 }
00186 }
00187 hl->setHlMode(0);
00188 #endif
00189 }
00190
00191 void KexiEditor::slotConfigureEditor()
00192 {
00193 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00194
00195 #else
00196 KTextEditor::ConfigInterface *config = KTextEditor::configInterface( d->doc );
00197 if (config)
00198 config->configDialog();
00199 #endif
00200 }
00201
00202 void KexiEditor::jump(int character)
00203 {
00204 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00205 const int numRows = d->view->paragraphs();
00206 int row = 0, col = 0;
00207 for (int ch = 0; row < numRows; row++) {
00208 const int rowLen = d->view->paragraphLength(row)+1;
00209 if ((ch + rowLen) > character) {
00210 col = character-ch;
00211 break;
00212 }
00213 ch += rowLen;
00214 }
00215 d->view->setCursorPosition(row, col);
00216 #else
00217 if (!d->doc)
00218 return;
00219 KTextEditor::EditInterface *ei = KTextEditor::editInterface(d->doc);
00220 const int numRows = ei->numLines();
00221 int row = 0, col = 0;
00222 for (int ch = 0; row < numRows; row++) {
00223 const int rowLen = ei->lineLength(row)+1;
00224 if ((ch + rowLen) > character) {
00225 col = character-ch;
00226 break;
00227 }
00228 ch += rowLen;
00229 }
00230 KTextEditor::ViewCursorInterface *ci = KTextEditor::viewCursorInterface(d->view);
00231 ci->setCursorPositionReal(row, col);
00232 #endif
00233 }
00234
00235 void KexiEditor::setCursorPosition(int line, int col)
00236 {
00237 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00238 d->view->setCursorPosition(line, col);
00239 #else
00240 KTextEditor::ViewCursorInterface *ci = KTextEditor::viewCursorInterface( d->view );
00241 ci->setCursorPosition(line, col);
00242 #endif
00243 }
00244
00245 void KexiEditor::clearUndoRedo()
00246 {
00247 #ifdef KTEXTEDIT_BASED_SQL_EDITOR
00248
00249 #else
00250 KTextEditor::UndoInterface* u = KTextEditor::undoInterface( d->doc );
00251 u->clearUndo();
00252 u->clearRedo();
00253 #endif
00254 }
00255
00256 #include "kexieditor.moc"
00257