You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesvn/src/ksvnwidgets/diffbrowser.cpp

257 lines
8.2 KiB

/***************************************************************************
* 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 <tqfont.h>
#include <tqtooltip.h>
#include <tqwhatsthis.h>
#include <tqtextcodec.h>
/*!
\fn DiffBrowser::DiffBrowser(TQWidget*tqparent=0,const char*name=0)
*/
DiffBrowser::DiffBrowser(TQWidget*tqparent,const char*name)
: KTextBrowser( tqparent, name)
{
setTextFormat(TQt::PlainText);
setFont(KGlobalSettings::fixedFont());
m_Data = new DiffBrowserData;
setWordWrap(TQTextEdit::NoWrap);
m_Data->m_Syntax = new DiffSyntax(this);
TQToolTip::add(this,i18n("Ctrl-F for search, F3 or Shift-F3 for search again."));
TQWhatsThis::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 TQString&aText)
{
m_Data->m_content.setRawData(aText.local8Bit(),aText.local8Bit().size());
KTextBrowser::setText(aText);
setCursorPosition(0,0);
}
void DiffBrowser::setText(const TQByteArray&aText)
{
m_Data->m_content=aText;
printContent();
setCursorPosition(0,0);
}
void DiffBrowser::printContent()
{
TQTextCodec * cc = TQTextCodec::codecForName(Kdesvnsettings::locale_for_diff());
if (!cc) {
KTextBrowser::setText(TQString::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()
{
TQString saveTo = KFileDialog::getSaveFileName(TQString(),"text/x-diff");
if (saveTo.isEmpty()) {
return;
}
TQFile tfile(saveTo);
if (tfile.exists()) {
if (KMessageBox::warningYesNo(TQT_TQWIDGET(KApplication::activeModalWidget()),
i18n("File %1 exists - overwrite?").tqarg(saveTo))
!=KMessageBox::Yes) {
return;
}
}
tfile.open(IO_Truncate|IO_WriteOnly|IO_Raw);
TQDataStream stream( &tfile );
stream.writeRawBytes(m_Data->m_content.data(),m_Data->m_content.size());
}
void DiffBrowser::keyPressEvent(TQKeyEvent*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,TQT_SIGNAL(search()),this,TQT_SLOT(search_slot()));
connect(m_Data->srchdialog,TQT_SIGNAL(done()),this,TQT_SLOT(searchdone_slot()));
}
TQString _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;
}
TQString 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 TQString&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 = tqfind(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;
}
TQWidget * _tqparent = m_Data->srchdialog->isVisible()?m_Data->srchdialog:parentWidget();
if (!m_Data->srchdialog->get_direction()) {
// forward
int query = KMessageBox::questionYesNo(
_tqparent,
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(
_tqparent,
i18n("Beginning of document reached.\n"\
"Continue from the end?"),
i18n("Find"),KStdGuiItem::cont(),i18n("Stop"));
if (query == KMessageBox::Yes){
line = lines()-1;
TQString 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 TQString&codec)
{
if (Kdesvnsettings::locale_for_diff()!=codec) {
Kdesvnsettings::setLocale_for_diff(codec);
printContent();
Kdesvnsettings::self()->writeConfig();
}
}
#include "diffbrowser.h.moc"