Bug#228952: kmail: Kmail with Kvim interation
Package: kmail
Version: 4:3.1.5-1
Severity: wishlist
Tags: patch
Hi,
I realy wish to have kvim as my editor in kmail. As far as I know
it's planed vor 3.2 to have the choice to select the "Embedded Vim
Component" inside kmail as your editor. But as I see ther's a little
patch at http://freenux.org/kde/patchs/kmail-ktexteditor-3.1.diff which
applyes this feature to kmail 3.1.
I would realy like to see it in the next Debian Package ... ;-)
Thank you in advance,
Markus Hubig
diff -urN kmail-3.1/Makefile.am kmail+kvim/Makefile.am
--- kmail-3.1/Makefile.am 2002-11-13 09:47:31.000000000 -0500
+++ kmail+kvim/Makefile.am 2003-01-04 18:03:04.000000000 -0500
@@ -2,7 +2,7 @@
SUBDIRS = . about pics profiles
INCLUDES = -I$(top_srcdir)/libkdenetwork -I$(top_srcdir)/mimelib $(all_includes)
-LDADD = $(LIB_KHTML) $(LIB_KSPELL) ../libkdenetwork/libkdenetwork.la ../mimelib/libmimelib.la -lkabc
+LDADD = $(LIB_KHTML) $(LIB_KSPELL) ../libkdenetwork/libkdenetwork.la ../mimelib/libmimelib.la -lkabc -lktexteditor -lkutils
bin_PROGRAMS = kmail
diff -urN kmail-3.1/configuredialog.cpp kmail+kvim/configuredialog.cpp
--- kmail-3.1/configuredialog.cpp 2002-12-07 04:56:17.000000000 -0500
+++ kmail+kvim/configuredialog.cpp 2003-01-04 18:00:08.000000000 -0500
@@ -97,6 +97,7 @@
#include <qlayout.h>
#include <qtextcodec.h>
#include <qheader.h>
+#include <ktexteditor/editorchooser.h>
#include <qlineedit.h>
#include <qpopupmenu.h>
#include <qcheckbox.h>
@@ -2342,7 +2343,7 @@
// tmp. vars:
QVBoxLayout *vlay;
QHBoxLayout *hlay;
- QGroupBox *group;
+ QGroupBox *group, *editor;
QLabel *label;
QHBox *hbox;
@@ -2370,6 +2371,12 @@
connect( mWordWrapCheck, SIGNAL(toggled(bool)),
mWrapColumnSpin, SLOT(setEnabled(bool)) );
+ //ktexteditor stuff
+ editor = new QVGroupBox (i18n("Embedded Editor"), this);
+ editor->layout()->setSpacing( KDialog::spacingHint() );
+ chooser = new KTextEditor::EditorChooser(editor, "Editor chooser");
+ chooser->readAppSetting();
+
// The "exteral editor" group:
group = new QVGroupBox( i18n("External Editor"), this );
group->layout()->setSpacing( KDialog::spacingHint() );
@@ -2399,6 +2406,7 @@
connect( mExternalEditorCheck, SIGNAL(toggled(bool)),
label, SLOT(setEnabled(bool)) );
+ vlay->addWidget( editor );
vlay->addWidget( group );
vlay->addStretch( 100 );
}
@@ -2445,6 +2453,9 @@
KConfigGroup general( kapp->config(), "General" );
KConfigGroup composer( kapp->config(), "Composer" );
+ //ktexteditor
+ chooser->writeAppSetting();
+
general.writeEntry( "use-external-editor", mExternalEditorCheck->isChecked() );
general.writeEntry( "external-editor", mEditorRequester->url() );
diff -urN kmail-3.1/configuredialog_p.h kmail+kvim/configuredialog_p.h
--- kmail-3.1/configuredialog_p.h 2002-09-29 08:27:00.000000000 -0400
+++ kmail+kvim/configuredialog_p.h 2003-01-04 18:00:08.000000000 -0500
@@ -15,6 +15,7 @@
#include <kdialogbase.h>
#include <klistview.h>
+#include <ktexteditor/editorchooser.h>
class QPushButton;
class QLabel;
@@ -557,6 +558,7 @@
void installProfile( KConfig * profile );
protected:
+ KTextEditor::EditorChooser *chooser;
QCheckBox *mAutoAppSignFileCheck;
QCheckBox *mSmartQuoteCheck;
QCheckBox *mWordWrapCheck;
diff -urN kmail-3.1/kmcomposewin.cpp kmail+kvim/kmcomposewin.cpp
--- kmail-3.1/kmcomposewin.cpp 2002-12-14 14:49:22.000000000 -0500
+++ kmail+kvim/kmcomposewin.cpp 2003-01-04 19:26:48.000000000 -0500
@@ -82,9 +82,20 @@
#include "cryptplugwrapperlist.h"
#include "klistboxdialog.h"
-#include "kmcomposewin.moc"
-
+#include <ktexteditor/editor.h>
+#include <ktexteditor/document.h>
+#include <ktexteditor/view.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/editorchooser.h>
+#include <ktexteditor/viewcursorinterface.h>
+#include <ktexteditor/searchinterface.h>
+#include <klibloader.h>
+#include <ktrader.h>
+#include <kservice.h>
+#include <kfinddialog.h>
+#include <qregexp.h>
+#include "kmcomposewin.moc"
//-----------------------------------------------------------------------------
KMComposeWin::KMComposeWin( KMMessage *aMsg, uint id )
@@ -139,7 +150,6 @@
bAutoCharset = TRUE;
fixedFontAction = 0;
mEditor = new KMEdit(mMainWidget, this);
- mEditor->setTextFormat(Qt::PlainText);
disableBreaking = false;
QString tip = i18n("Select email address(es)");
QToolTip::add( mBtnTo, tip );
@@ -221,8 +231,8 @@
connect(kernel->imapFolderMgr(),SIGNAL(removed(KMFolder*)),
SLOT(slotFolderRemoved(KMFolder*)));
- connect (mEditor, SIGNAL (spellcheck_done(int)),
- this, SLOT (slotSpellcheckDone (int)));
+//XXX connect (mEditor, SIGNAL (spellcheck_done(int)),
+//XXX this, SLOT (slotSpellcheckDone (int)));
mMainWidget->resize(480,510);
setCentralWidget(mMainWidget);
@@ -385,7 +395,7 @@
mEdtReplyTo->setPalette(mPalette);
mEdtBcc->setPalette(mPalette);
mTransport->setPalette(mPalette);
- mEditor->setPalette(mPalette);
+//XXX mEditor->setPalette(mPalette);
mFcc->setPalette(mPalette);
}
@@ -1038,7 +1048,7 @@
//-----------------------------------------------------------------------------
void KMComposeWin::updateCursorPosition()
{
- int col,line;
+ int col=0,line=0;
QString temp;
line = mEditor->currentLine();
col = mEditor->currentColumn();
@@ -1055,17 +1065,17 @@
//QPopupMenu* menu;
mEditor->setModified(FALSE);
QFontMetrics fm(mBodyFont);
- mEditor->setTabStopWidth(fm.width(QChar(' ')) * 8);
+//XXX mEditor->setTabStopWidth(fm.width(QChar(' ')) * 8);
//mEditor->setFocusPolicy(QWidget::ClickFocus);
if (mWordWrap)
{
- mEditor->setWordWrap( QMultiLineEdit::FixedColumnWidth );
- mEditor->setWrapColumnOrWidth(mLineBreak);
+//XXX mEditor->setWordWrap( QMultiLineEdit::FixedColumnWidth );
+//XXX mEditor->setWrapColumnOrWidth(mLineBreak);
}
else
{
- mEditor->setWordWrap( QMultiLineEdit::NoWrap );
+//XXX mEditor->setWordWrap( QMultiLineEdit::NoWrap );
}
// Font setup
@@ -1093,7 +1103,7 @@
mEditor->installRBPopup(menu);
*/
updateCursorPosition();
- connect(mEditor,SIGNAL(CursorPositionChanged()),SLOT(updateCursorPosition()));
+//XXX connect(mEditor,SIGNAL(CursorPositionChanged()),SLOT(updateCursorPosition()));
}
@@ -1103,7 +1113,8 @@
int maxLineLength = 0;
int curPos;
int oldPos = 0;
- if (mEditor->QMultiLineEdit::wordWrap() == QMultiLineEdit::FixedColumnWidth) {
+/*XXX function unused, no matter
+ if (mEditor->QMultiLineEdit::wordWrap() == QMultiLineEdit::FixedColumnWidth) {
for (curPos = 0; curPos < (int)body.length(); ++curPos)
if (body[curPos] == '\n') {
if ((curPos - oldPos) > maxLineLength)
@@ -1114,7 +1125,7 @@
maxLineLength = curPos - oldPos;
if (mEditor->wrapColumnOrWidth() < maxLineLength) // column
mEditor->setWrapColumnOrWidth(maxLineLength);
- }
+ }*/
}
//-----------------------------------------------------------------------------
@@ -1268,13 +1279,12 @@
// are opened for editting in the composer (cf. Bug#41102) I comment it
// out. Ingo, 2002-04-21
//verifyWordWrapLengthIsAdequate(bodyDecoded);
-
+
QTextCodec *codec = KMMsgBase::codecForName(mCharset);
if (codec)
- mEditor->setText(codec->toUnicode(bodyDecoded));
+ mEditor->setText(codec->toUnicode(bodyDecoded)+"\n");
else
- mEditor->setText(QString::fromLocal8Bit(bodyDecoded));
- mEditor->insertLine("\n", -1);
+ mEditor->setText(QString::fromLocal8Bit(bodyDecoded)+"\n");
} else mEditor->setText("");
for(i=firstAttachment; i<num; i++)
{
@@ -1299,10 +1309,12 @@
mEditor->setText(QString::fromLocal8Bit(bodyDecoded));
}
+ kdDebug() << "setMsg :setCharset " << endl;
setCharset(mCharset);
if( mAutoSign && mayAutoSign )
{
+ kdDebug() << "setMsg : autoSign " << endl;
//
// Espen 2000-05-16
// Delay the signature appending. It may start a fileseletor.
@@ -1311,6 +1323,7 @@
//
QTimer::singleShot( 0, this, SLOT(slotAppendSignature()) );
}
+ kdDebug() << "setMsg : setModified " << endl;
mEditor->setModified(FALSE);
}
@@ -2065,6 +2078,7 @@
bool KMComposeWin::queryExit ()
{
+ slotClose();
return true;
}
@@ -2731,7 +2745,8 @@
if (disableBreaking)
text = mEditor->text();
else
- text = mEditor->brokenText();
+//XXX text = mEditor->brokenText();
+ text = mEditor->text();
text.truncate(text.length()); // to ensure text.size()==text.length()+1
@@ -3946,7 +3961,7 @@
}
if ((*it).insert)
{
- int col, line;
+ uint col, line;
mEditor->getCursorPosition(&line, &col);
(*it).data.resize((*it).data.size() + 1);
(*it).data[(*it).data.size() - 1] = '\0';
@@ -4374,8 +4389,9 @@
//-----------------------------------------------------------------------------
void KMComposeWin::slotUpdateFont()
{
- mEditor->setFont( fixedFontAction && (fixedFontAction->isChecked())
- ? mFixedFont : mBodyFont );
+ /*XXX Adding a font interface to KTextEditor would be great ;)
+ * mEditor->setFont( fixedFontAction && (fixedFontAction->isChecked())
+ ? mFixedFont : mBodyFont ); */
}
//-----------------------------------------------------------------------------
@@ -4461,6 +4477,8 @@
//-----------------------------------------------------------------------------
void KMComposeWin::slotClose()
{
+ kdDebug(5006) << "KMComposeWin::slotClose(). " << endl;
+ if (mEditor) mEditor->closeURL();
close(FALSE);
}
@@ -4566,7 +4584,7 @@
//-----------------------------------------------------------------------------
void KMComposeWin::slotWordWrapToggled(bool on)
{
- if (on)
+/*XXX if (on)
{
mEditor->setWordWrap( QMultiLineEdit::FixedColumnWidth );
mEditor->setWrapColumnOrWidth(mLineBreak);
@@ -4574,7 +4592,7 @@
else
{
mEditor->setWordWrap( QMultiLineEdit::NoWrap );
- }
+ }*/
}
@@ -4718,7 +4736,8 @@
mAutoDeleteMsg = FALSE;
mFolder = 0;
- close();
+ //close();
+ slotClose();
return true;
}
@@ -4768,6 +4787,7 @@
//----------------------------------------------------------------------------
void KMComposeWin::slotAppendSignature()
{
+ kdDebug() << "setMsg : appendSignature " << endl;
bool mod = mEditor->isModified();
const KMIdentity & ident =
@@ -4812,10 +4832,10 @@
mOldSigText = sigText;
if( !sigText.isEmpty() )
{
- mEditor->sync();
- mEditor->append("\n");
- mEditor->append(sigText);
- mEditor->update();
+/*XXX mEditor->sync();*/
+ mEditor->insertLine("\n",-1);
+ mEditor->insertLine(sigText,-1);
+// mEditor->update();
mEditor->setModified(mod);
mEditor->setContentsPos( 0, 0 );
}
@@ -4831,7 +4851,7 @@
//-----------------------------------------------------------------------------
void KMComposeWin::slotCleanSpace()
{
- mEditor->cleanWhiteSpace();
+ //XXX mEditor->cleanWhiteSpace();
}
@@ -4846,7 +4866,7 @@
this, SLOT (spell_progress (unsigned)));
*/
- mEditor->spellcheck();
+//XXX mEditor->spellcheck();
}
@@ -5066,7 +5086,7 @@
{
mEditor->setFocus();
if ( hasMessage )
- mEditor->setCursorPosition( 1, 0 );
+ mEditor->setContentsPos( 1, 0 );
}
void KMComposeWin::slotCompletionModeChanged( KGlobalSettings::Completion mode)
@@ -5315,7 +5335,6 @@
return TRUE;
}
// ---sven's Return is same Tab and arrow key navigation end ---
-
}
return KMLineEditInherited::eventFilter(o, e);
}
@@ -5592,6 +5611,7 @@
}
+#if 0
//=============================================================================
//
// Class KMEdit
@@ -5757,6 +5777,167 @@
proc = 0;
delete mTempFile;
mTempFile = 0;
+#else
+ //=============================================================================
+ //
+ // Class KMEdit
+ // updated to KTextEditor by Mickael Marchand (Mikmak) <marchand@kde.org>
+ //
+ //=============================================================================
+ KMEdit::KMEdit(QWidget *parent, KMComposeWin* composer,
+ const char *name):
+ QVBox(parent, name)
+ {
+ mComposer = composer;
+ extEditor = false; // the default is to use ourself
+ mKSpell = NULL;
+ mSpellingFilter = 0;
+ mTempFile = NULL;
+ mExtEditorProcess = NULL;
+
+ editor=KTextEditor::EditorChooser::createDocument(this,"KTextEditor::Document");
+ if (editor) editorView = editor->createView(this, "KTextEditor part");
+ }
+
+ //-----------------------------------------------------------------------------
+ KMEdit::~KMEdit()
+ {
+ kdDebug(5006) << "KMEdit::~KMEdit. " << endl;
+ if (mKSpell) delete mKSpell;
+ if (editor) {
+ editor->closeURL();
+ delete editor;
+ }
+ }
+
+ void KMEdit::closeURL() {
+ kdDebug(5006) << "KMEdit::closeURL(). " << endl;
+ editor->closeURL();
+ }
+
+ void KMEdit::setModified(bool rw) {
+ editor->setModified(rw);
+ }
+
+ bool KMEdit::isModified() {
+ return editor->isModified();
+ }
+
+ QString KMEdit::text() {
+ KTextEditor::EditInterface *editiface = dynamic_cast<KTextEditor::EditInterface*>(editor);
+ QString text = editiface->text();
+ kdDebug() << "got text : " << text << endl;
+ return text;
+ }
+
+ void KMEdit::setText(QString text) {
+ kdDebug() << "kmail->setText "<< endl;
+ QString text2(text);
+ text2.setLength(text2.length());
+ KTextEditor::EditInterface *editiface = dynamic_cast<KTextEditor::EditInterface*>(editor);
+ editiface->setText(text2);
+ kdDebug() << "kmail->setText success" << endl;
+ }
+
+ int KMEdit::currentLine() {
+ KTextEditor::ViewCursorInterface *cursoriface = dynamic_cast<KTextEditor::ViewCursorInterface*>(editorView);
+ int line = cursoriface->cursorLine();
+ kdDebug() << "current line : " << line << endl;
+ return line;
+ }
+
+ int KMEdit::currentColumn() {
+ KTextEditor::ViewCursorInterface *cursoriface = dynamic_cast<KTextEditor::ViewCursorInterface*>(editorView);
+ int col = cursoriface->cursorColumn();
+ kdDebug() << "current col : " << col << endl;
+ return col;
+ }
+
+ void KMEdit::insertLine(QString text, int position) {
+ kdDebug(5006) << "KMEdit::insertLine(). " << position << endl;
+ KTextEditor::EditInterface *editiface = dynamic_cast<KTextEditor::EditInterface*>(editor);
+ editiface->insertLine(position,text);
+ }
+
+ void KMEdit::getCursorPosition(uint *line, uint *column) {
+ KTextEditor::ViewCursorInterface *cursoriface = dynamic_cast<KTextEditor::ViewCursorInterface*>(editorView);
+ cursoriface->cursorPosition(line,column);
+ }
+
+ void KMEdit::insertAt(QString text, int line, int column) {
+ kdDebug(5006) << "KMEdit::insertAt(). " << line << " " << column << endl;
+ KTextEditor::EditInterface *editiface = dynamic_cast<KTextEditor::EditInterface*>(editor);
+ editiface->insertText(line,column,text);
+ }
+
+ void KMEdit::search() {
+ KTextEditor::SearchInterface *searchiface = dynamic_cast<KTextEditor::SearchInterface*>(editor);
+ if (searchiface==NULL) return; // no search support for this part
+
+ //create the dialog
+ KFindDialog find (this, 0, KFindDialog::FromCursor | KFindDialog::CaseSensitive | KFindDialog::FindBackwards | KFindDialog::RegularExpression, QStringList(), false);
+ if (find.exec() != QDialog::Accepted)
+ return;
+
+ //do the search
+ unsigned int *line;
+ unsigned int *column;
+ unsigned int *len;
+ unsigned int startLine=0;
+ unsigned int startColumn=0;
+
+ bool stop=false;
+ long options = find.options();
+ bool fromcursor=options & KFindDialog::FromCursor;
+ bool casesensitive=options & KFindDialog::CaseSensitive;
+ bool findbackwards=options & KFindDialog::FindBackwards;
+ bool regexp=options & KFindDialog::RegularExpression;
+
+ if (fromcursor) {
+ unsigned int *l, *c;
+ getCursorPosition(l,c);
+ startLine = *l;
+ startColumn = *c;
+ }
+
+ while (!stop) {
+ if (regexp)
+ stop = ! searchiface->searchText(startLine, startColumn, QRegExp(find.pattern(), casesensitive), line, column, len, findbackwards );
+ else
+ stop = ! searchiface->searchText(startLine, startColumn, find.pattern(), line , column, len, casesensitive, findbackwards);
+
+ startLine = *line;
+ startColumn = *column;
+ }
+ }
+
+ void KMEdit::replace() {
+ //TODO
+ }
+
+ void KMEdit::setContentsPos(int line, int column) {
+ KTextEditor::ViewCursorInterface *cursoriface = dynamic_cast<KTextEditor::ViewCursorInterface*>(editorView);
+ cursoriface->setCursorPosition(line,column);
+ }
+
+ //-----------------------------------------------------------------------------
+ void KMEdit::slotExternalEditorDone(KProcess* proc)
+ {
+ assert(proc == mExtEditorProcess);
+ /*XXX setAutoUpdate(false);*/
+ KTextEditor::EditInterface *editiface = dynamic_cast<KTextEditor::EditInterface*>(editor);
+ editiface->clear();
+
+ // read data back in from file
+ editiface->insertLine(-1, QString::fromLocal8Bit(kFileToString(mTempFile->name(),
+ TRUE, FALSE)));
+
+ /*XXX setAutoUpdate(true);*/
+ /* repaint();*/
+ delete proc;
+ delete mTempFile;
+ mTempFile = NULL;
+#endif
mExtEditorProcess = 0;
}
@@ -5782,7 +5963,7 @@
//-----------------------------------------------------------------------------
void KMEdit::slotSpellcheck2(KSpell*)
{
- spellcheck_start();
+//XXX spellcheck_start();
QString quotePrefix;
if(mComposer && mComposer->msg())
@@ -5799,22 +5980,22 @@
}
kdDebug(5006) << "spelling: new SpellingFilter with prefix=\"" << quotePrefix << "\"" << endl;
- mSpellingFilter = new SpellingFilter(text(), quotePrefix, SpellingFilter::FilterUrls,
+ /*XXX mSpellingFilter = new SpellingFilter(text(), quotePrefix, SpellingFilter::FilterUrls,
SpellingFilter::FilterEmailAddresses);
- mKSpell->check(mSpellingFilter->filteredText());
+ mKSpell->check(mSpellingFilter->filteredText());*/
}
//-----------------------------------------------------------------------------
void KMEdit::slotSpellResult(const QString &)
{
- spellcheck_stop();
+//XXX spellcheck_stop();
int dlgResult = mKSpell->dlgResult();
if ( dlgResult == KS_CANCEL )
{
kdDebug(5006) << "spelling: canceled - restoring text from SpellingFilter" << endl;
- setText(mSpellingFilter->originalText());
+//XXX setText(mSpellingFilter->originalText());
setModified(mWasModifiedBeforeSpellCheck);
}
@@ -5840,8 +6021,8 @@
}
else if (status == KSpell::Crashed)
{
- spellcheck_stop();
+//XXX spellcheck_stop();
KMessageBox::sorry(this, i18n("ISpell/Aspell seems to have crashed."));
- emit spellcheck_done( KS_CANCEL );
+//XXX emit spellcheck_done( KS_CANCEL );
}
}
diff -urN kmail-3.1/kmcomposewin.h kmail+kvim/kmcomposewin.h
--- kmail-3.1/kmcomposewin.h 2002-12-06 16:30:13.000000000 -0500
+++ kmail+kvim/kmcomposewin.h 2003-01-04 18:05:57.000000000 -0500
@@ -29,6 +29,11 @@
#include "cryptplugwrapper.h"
+#include <ktexteditor/document.h>
+#include <ktexteditor/view.h>
+#include <qvbox.h>
+class QVBox;
+
class _StringPair {
public:
QString name;
@@ -65,10 +70,10 @@
typedef QPtrList<KMMessagePart> KMMsgPartList;
-
//-----------------------------------------------------------------------------
#define KMEditInherited KEdit
-class KMEdit: public KEdit
+
+class KMEdit: public QVBox
{
Q_OBJECT
public:
@@ -92,6 +97,29 @@
inline void setExternalEditor(bool extEd) { extEditor=extEd; }
inline void setExternalEditorPath(QString path) { mExtEditor=path; }
+ void setModified(bool);
+ bool isModified();
+
+ void closeURL();
+ QString text();
+
+ void setText(QString text);
+
+ int currentLine();
+
+ int currentColumn();
+
+ void insertLine(QString text, int position);
+
+ void getCursorPosition(uint *line, uint *column);
+
+ void insertAt(QString text, int line, int column);
+
+ void search();
+
+ void replace();
+ void setContentsPos(int,int);
+
signals:
void spellcheck_done(int result);
public slots:
@@ -104,7 +132,7 @@
/**
* Event filter that does Tab-key handling.
*/
- virtual bool eventFilter(QObject*, QEvent*);
+// virtual bool eventFilter(QObject*, QEvent*);
KMComposeWin* mComposer;
private:
@@ -114,6 +142,8 @@
KProcess *mExtEditorProcess;
bool extEditor;
QString mExtEditor;
+ KTextEditor::Document *editor;
+ KTextEditor::View *editorView;
bool mWasModifiedBeforeSpellCheck;
};
Reply to: