kpimtextedit/richtextbuilders
krichtexteditor.cpp
00001
00022 #include "krichtexteditor.h"
00023
00024 #include "kabstractmarkupbuilder.h"
00025 #include "kplaintextmarkupbuilder.h"
00026 #include "ktexthtmlbuilder.h"
00027 #include "bbcodebuilder.h"
00028 #include "mediawikimarkupbuilder.h"
00029
00030
00031 #include "kmarkupdirector.h"
00032
00033 #include <QTextDocument>
00034 #include <QDockWidget>
00035 #include <QLayout>
00036 #include <QPushButton>
00037
00038 #include <QtCore/QTextStream>
00039
00040 #include <kapplication.h>
00041 #include <kactioncollection.h>
00042 #include <kstandardaction.h>
00043 #include <kfiledialog.h>
00044 #include <KRichTextWidget>
00045 #include <kmessagebox.h>
00046 #include <kio/netaccess.h>
00047 #include <ksavefile.h>
00048 #include <kstatusbar.h>
00049 #include <klocale.h>
00050 #include <kdebug.h>
00051
00052
00053 KRichTextEditor::KRichTextEditor() : KXmlGuiWindow()
00054 {
00055 setupActions();
00056
00057 textArea = new KRichTextWidget(this);
00058
00059
00060 QPushButton *b = new QPushButton(i18n("Update!"), this);
00061 connect(b, SIGNAL(pressed()), SLOT(updateDockedWidgets()));
00062
00063 QVBoxLayout *l = new QVBoxLayout();
00064 QWidget *w = new QWidget();
00065 l->addWidget(textArea);
00066 l->addWidget(b);
00067 w->setLayout(l);
00068
00069 setCentralWidget(w);
00070
00071 textArea->createActions(actionCollection());
00072 setupGUI();
00073
00074 statusBar()->insertItem(QString(), 0, 1);
00075 statusBar()->setItemAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
00076
00077 connect(textArea, SIGNAL(cursorPositionChanged()),
00078 SLOT(cursorPositionChanged()));
00079
00080 QDockWidget *dockText = new QDockWidget(QString("HTML"), this);
00081 dockText->setObjectName("HTML");
00082 dockText->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
00083 kte = new KTextEdit(dockText);
00084 dockText->setWidget(kte);
00085 addDockWidget(Qt::RightDockWidgetArea, dockText);
00086
00087 QDockWidget *dockHtml = new QDockWidget(QString("Re-Rendered"), this);
00088 dockHtml->setObjectName("Re-Rendered");
00089 dockHtml->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
00090 krte = new KTextEdit(dockHtml);
00091 krte->document()->setDefaultStyleSheet("p {margin-top:0px;margin-bottom:0px;}ul{margin-top:12px;margin-bottom:12px;} ");
00092 dockHtml->setWidget(krte);
00093 addDockWidget(Qt::RightDockWidgetArea, dockHtml);
00094
00095 QDockWidget *dockPlain = new QDockWidget(QString("Plain"), this);
00096 dockPlain->setObjectName("Plain");
00097 dockPlain->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
00098 kpte = new KTextEdit(dockPlain);
00099 dockPlain->setWidget(kpte);
00100 addDockWidget(Qt::RightDockWidgetArea, dockPlain);
00101
00102 QDockWidget *dockBB = new QDockWidget(QString("BBCode"), this);
00103 dockBB->setObjectName("BBCode");
00104 dockBB->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
00105 kbbte = new KTextEdit(dockBB);
00106 dockBB->setWidget(kbbte);
00107 addDockWidget(Qt::RightDockWidgetArea, dockBB);
00108
00109 QDockWidget *dockMW = new QDockWidget(QString("MediaWiki"), this);
00110 dockMW->setObjectName("MediaWiki");
00111 dockMW->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
00112 kmwte = new KTextEdit(dockMW);
00113 dockMW->setWidget(kmwte);
00114 addDockWidget(Qt::RightDockWidgetArea, dockMW);
00115 }
00116
00117 void KRichTextEditor::updateDockedWidgets()
00118 {
00119 KTextHTMLBuilder *hb = new KTextHTMLBuilder();
00120
00121 KMarkupDirector *hmd = new KMarkupDirector(hb);
00122 hmd->constructContent(textArea->document());
00123
00124 QString t = hb->getResult();
00125
00126 kDebug() << t;
00127
00128 kte->setPlainText(t);
00129 krte->setHtml(t);
00130
00131 KPlainTextMarkupBuilder *pb = new KPlainTextMarkupBuilder();
00132
00133 KMarkupDirector *pmd = new KMarkupDirector(pb);
00134 pmd->constructContent(textArea->document());
00135
00136 kpte->setPlainText(pb->getResult());
00137
00138 BBCodeBuilder *bbb = new BBCodeBuilder();
00139
00140 KMarkupDirector *bbmd = new KMarkupDirector(bbb);
00141 bbmd->constructContent(textArea->document());
00142
00143 kbbte->setPlainText(bbb->getResult());
00144
00145 MediaWikiMarkupBuilder *mwb = new MediaWikiMarkupBuilder();
00146
00147 KMarkupDirector *mwmd = new KMarkupDirector(mwb);
00148 mwmd->constructContent(textArea->document());
00149
00150 kmwte->setPlainText(mwb->getResult());
00151 }
00152
00153 KRichTextEditor::~KRichTextEditor()
00154 {
00155 }
00156
00157 void KRichTextEditor::setupActions()
00158 {
00159 KStandardAction::quit(kapp, SLOT(quit()),
00160 actionCollection());
00161
00162 KStandardAction::open(this, SLOT(openFile()),
00163 actionCollection());
00164
00165 KStandardAction::save(this, SLOT(saveFile()),
00166 actionCollection());
00167
00168 KStandardAction::saveAs(this, SLOT(saveFileAs()),
00169 actionCollection());
00170
00171 KStandardAction::openNew(this, SLOT(newFile()),
00172 actionCollection());
00173 }
00174
00175 void KRichTextEditor::cursorPositionChanged()
00176 {
00177
00178 if (textArea->textCursor().charFormat().isAnchor()) {
00179 QString text = textArea->currentLinkText();
00180 QString url = textArea->currentLinkUrl();
00181 statusBar()->changeItem(text + " -> " + url, 0);
00182 } else {
00183 statusBar()->changeItem(QString(), 0);
00184 }
00185 }
00186
00187 void KRichTextEditor::newFile()
00188 {
00189
00190 fileName.clear();
00191 textArea->clear();
00192 }
00193
00194 void KRichTextEditor::saveFileAs(const QString &outputFileName)
00195 {
00196 KSaveFile file(outputFileName);
00197 file.open();
00198
00199 QByteArray outputByteArray;
00200 outputByteArray.append(textArea->toHtml().toUtf8());
00201 file.write(outputByteArray);
00202 file.finalize();
00203 file.close();
00204
00205 fileName = outputFileName;
00206 }
00207
00208 void KRichTextEditor::saveFileAs()
00209 {
00210 saveFileAs(KFileDialog::getSaveFileName());
00211 }
00212
00213 void KRichTextEditor::saveFile()
00214 {
00215 if (!fileName.isEmpty()) {
00216 saveFileAs(fileName);
00217 } else {
00218 saveFileAs();
00219 }
00220 }
00221
00222 void KRichTextEditor::openFile()
00223 {
00224 QString fileNameFromDialog = KFileDialog::getOpenFileName();
00225 if (fileNameFromDialog.isEmpty()) {
00226 return;
00227 }
00228
00229 QString tmpFile;
00230 if (KIO::NetAccess::download(fileNameFromDialog, tmpFile,
00231 this)) {
00232 QFile file(tmpFile);
00233 file.open(QIODevice::ReadOnly);
00234 textArea->setTextOrHtml(QTextStream(&file).readAll());
00235 fileName = fileNameFromDialog;
00236
00237 KIO::NetAccess::removeTempFile(tmpFile);
00238 } else {
00239 KMessageBox::error(this,
00240 KIO::NetAccess::lastErrorString());
00241 }
00242
00243 }