summaryrefslogtreecommitdiffstats
path: root/src/ksvnwidgets/diffbrowser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ksvnwidgets/diffbrowser.cpp')
-rw-r--r--src/ksvnwidgets/diffbrowser.cpp256
1 files changed, 256 insertions, 0 deletions
diff --git a/src/ksvnwidgets/diffbrowser.cpp b/src/ksvnwidgets/diffbrowser.cpp
new file mode 100644
index 0000000..d1f7b6f
--- /dev/null
+++ b/src/ksvnwidgets/diffbrowser.cpp
@@ -0,0 +1,256 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Rajko Albrecht *
+ * ral@alwins-world.de *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU 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 General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include "diffbrowser.h"
+#include "diffbrowserdata.h"
+#include "src/settings/kdesvnsettings.h"
+
+#include <kglobalsettings.h>
+#include <kglobal.h>
+#include <kdebug.h>
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <kapplication.h>
+#include <klocale.h>
+
+#include <qfont.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qtextcodec.h>
+
+/*!
+ \fn DiffBrowser::DiffBrowser(QWidget*parent=0,const char*name=0)
+ */
+DiffBrowser::DiffBrowser(QWidget*parent,const char*name)
+ : KTextBrowser( parent, name)
+{
+ setTextFormat(Qt::PlainText);
+ setFont(KGlobalSettings::fixedFont());
+ m_Data = new DiffBrowserData;
+
+ setWordWrap(QTextEdit::NoWrap);
+ m_Data->m_Syntax = new DiffSyntax(this);
+ QToolTip::add(this,i18n("Ctrl-F for search, F3 or Shift-F3 for search again."));
+ QWhatsThis::add(this,i18n("<b>Display differences between files</b><p>You may search inside text with Ctrl-F.</p><p>F3 for search forward again, Shift-F3 for search backward again.</p><p>You may save the (original) output with Ctrl-S.</p>"));
+ setFocus();
+}
+
+/*!
+ \fn DiffBrowser::~DiffBrowser()
+ */
+ DiffBrowser::~DiffBrowser()
+{
+ delete m_Data;
+}
+
+void DiffBrowser::setText(const QString&aText)
+{
+ m_Data->m_content.setRawData(aText.local8Bit(),aText.local8Bit().size());
+ KTextBrowser::setText(aText);
+ setCursorPosition(0,0);
+}
+
+void DiffBrowser::setText(const QByteArray&aText)
+{
+ m_Data->m_content=aText;
+ printContent();
+ setCursorPosition(0,0);
+}
+
+void DiffBrowser::printContent()
+{
+ QTextCodec * cc = QTextCodec::codecForName(Kdesvnsettings::locale_for_diff());
+ if (!cc) {
+ KTextBrowser::setText(QString::fromLocal8Bit(m_Data->m_content,m_Data->m_content.size()));
+ } else {
+ KTextBrowser::setText(cc->toUnicode(m_Data->m_content,m_Data->m_content.size()));
+ }
+}
+
+/*!
+ \fn DiffBrowser::saveDiff()
+ */
+void DiffBrowser::saveDiff()
+{
+ QString saveTo = KFileDialog::getSaveFileName(QString::null,"text/x-diff");
+ if (saveTo.isEmpty()) {
+ return;
+ }
+ QFile tfile(saveTo);
+ if (tfile.exists()) {
+ if (KMessageBox::warningYesNo(KApplication::activeModalWidget(),
+ i18n("File %1 exists - overwrite?").arg(saveTo))
+ !=KMessageBox::Yes) {
+ return;
+ }
+ }
+ tfile.open(IO_Truncate|IO_WriteOnly|IO_Raw);
+ QDataStream stream( &tfile );
+ stream.writeRawBytes(m_Data->m_content.data(),m_Data->m_content.size());
+}
+
+void DiffBrowser::keyPressEvent(QKeyEvent*ev)
+{
+ if ( ev->key() == Key_Return) {
+ ev->ignore();
+ return;
+ }
+ if (ev->key() == Key_F3) {
+ if (ev->state() == ShiftButton) {
+ searchagainback_slot();
+ } else {
+ searchagain_slot();
+ }
+ } else if (ev->key()==Key_F && ev->state() == ControlButton) {
+ startSearch();
+ } else if (ev->key()==Key_S && ev->state() == ControlButton) {
+ saveDiff();
+ } else {
+ KTextBrowser::keyPressEvent(ev);
+ }
+}
+
+void DiffBrowser::startSearch()
+{
+ if( !m_Data->srchdialog ) {
+ m_Data->srchdialog = new KEdFind( this, "searchdialog", false);
+ connect(m_Data->srchdialog,SIGNAL(search()),this,SLOT(search_slot()));
+ connect(m_Data->srchdialog,SIGNAL(done()),this,SLOT(searchdone_slot()));
+ }
+ QString _st = m_Data->srchdialog->getText();
+ m_Data->srchdialog->setText(_st.isEmpty() ? m_Data->pattern : _st);
+ m_Data->srchdialog->show();
+ m_Data->srchdialog->result();
+}
+
+/*!
+ \fn DiffBrowser::search_slot()
+ */
+void DiffBrowser::search_slot()
+{
+ if( !m_Data->srchdialog ) {
+ return;
+ }
+ QString to_find_string = m_Data->srchdialog->getText();
+ doSearch(to_find_string,m_Data->srchdialog->case_sensitive(),m_Data->srchdialog->get_direction());
+}
+
+void DiffBrowser::doSearch(const QString&to_find_string,bool case_sensitive,bool back)
+{
+ if( !m_Data->srchdialog ) {
+ return;
+ }
+ int line, col;
+ getCursorPosition(&line,&col);
+ if (m_Data->last_search != DiffBrowserData::NONE && !back) {
+ col = col+1;
+ }
+ while (1) {
+ bool result = find(to_find_string,case_sensitive,false,
+ (!back),&line,&col);
+
+ if (result) {
+ m_Data->last_search = back?DiffBrowserData::BACKWARD:DiffBrowserData::FORWARD;
+ m_Data->pattern=to_find_string;
+ break;
+ }
+ QWidget * _parent = m_Data->srchdialog->isVisible()?m_Data->srchdialog:parentWidget();
+ if (!m_Data->srchdialog->get_direction()) {
+ // forward
+ int query = KMessageBox::questionYesNo(
+ _parent,
+ i18n("End of document reached.\n"\
+ "Continue from the beginning?"),
+ i18n("Find"),KStdGuiItem::cont(),i18n("Stop"));
+ if (query == KMessageBox::Yes){
+ line = 0;
+ col = 0;
+ m_Data->last_search = DiffBrowserData::FORWARD;
+ } else {
+ break;
+ }
+ } else {
+ int query = KMessageBox::questionYesNo(
+ _parent,
+ i18n("Beginning of document reached.\n"\
+ "Continue from the end?"),
+ i18n("Find"),KStdGuiItem::cont(),i18n("Stop"));
+ if (query == KMessageBox::Yes){
+ line = lines()-1;
+ QString string = text(line);
+ col = string.length();
+ if (col>0) {
+ --col;
+ }
+ m_Data->last_search = DiffBrowserData::BACKWARD;
+ } else {
+ break;
+ }
+ }
+ }
+}
+
+/*!
+ \fn DiffBrowser::searchdone_slot()
+ */
+void DiffBrowser::searchdone_slot()
+{
+ if (!m_Data->srchdialog)
+ return;
+
+ m_Data->srchdialog->hide();
+ setFocus();
+ m_Data->last_finished_search = m_Data->last_search;
+ m_Data->last_search = DiffBrowserData::NONE;
+ m_Data->cs = m_Data->srchdialog->case_sensitive();
+}
+
+void DiffBrowser::searchagain_slot()
+{
+ doSearchAgain(false);
+}
+
+void DiffBrowser::searchagainback_slot()
+{
+ doSearchAgain(true);
+}
+
+void DiffBrowser::doSearchAgain(bool back)
+{
+ if (!m_Data->srchdialog || m_Data->pattern.isEmpty()) {
+ startSearch();
+ } else {
+ m_Data->last_search = m_Data->last_finished_search;
+ doSearch(m_Data->pattern,m_Data->cs,back);
+ m_Data->last_finished_search = m_Data->last_search;
+ m_Data->last_search = DiffBrowserData::NONE;
+ }
+}
+
+void DiffBrowser::slotTextCodecChanged(const QString&codec)
+{
+ if (Kdesvnsettings::locale_for_diff()!=codec) {
+ Kdesvnsettings::setLocale_for_diff(codec);
+ printContent();
+ Kdesvnsettings::self()->writeConfig();
+ }
+}
+
+#include "diffbrowser.h.moc"