summaryrefslogtreecommitdiffstats
path: root/vcs/subversion/svn_logviewwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vcs/subversion/svn_logviewwidget.cpp')
-rw-r--r--vcs/subversion/svn_logviewwidget.cpp273
1 files changed, 273 insertions, 0 deletions
diff --git a/vcs/subversion/svn_logviewwidget.cpp b/vcs/subversion/svn_logviewwidget.cpp
new file mode 100644
index 00000000..c6aae452
--- /dev/null
+++ b/vcs/subversion/svn_logviewwidget.cpp
@@ -0,0 +1,273 @@
+/*
+ * Copyright (C) 2007 Dukju Ahn (dukjuahn@gmail.com)
+ *
+ * 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "svn_logviewwidget.h"
+#include "svn_blamewidget.h"
+#include "subversion_core.h"
+#include "subversion_global.h"
+#include <kdevproject.h>
+#include <ktextedit.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <qradiobutton.h>
+#include <qcombobox.h>
+#include <knuminput.h>
+#include <qcheckbox.h>
+
+#include <qsplitter.h>
+#include <qheader.h>
+#include <qlistview.h>
+#include <qlayout.h>
+#include <qstringlist.h>
+
+SvnLogViewWidget::SvnLogViewWidget(subversionPart *part, QWidget *parent)
+ :QWidget(parent), m_part(part)
+{
+ m_layout = new QGridLayout( this, 1, 1, 11, 6, "SvnLogViewWidgetBaseLayout");
+
+ splitter1 = new QSplitter( this, "splitter1" );
+ splitter1->setOrientation( QSplitter::Horizontal );
+ splitter1->setMargin(1);
+
+ listView1 = new QListView( splitter1, "listView1" );
+ listView1->addColumn( i18n( "Rev" ) );
+ listView1->addColumn( i18n( "Date" ) );
+ listView1->addColumn( i18n( "Author" ) );
+ listView1->addColumn( i18n( "Comment" ) );
+ listView1->resize( QSize(1, 1).expandedTo(minimumSizeHint()) );
+ QFont listView1_font( listView1->font() );
+ listView1_font.setPointSize( 9 );
+ listView1->setFont( listView1_font );
+ listView1->setAllColumnsShowFocus( TRUE );
+ listView1->setShowSortIndicator( TRUE );
+
+ textEdit1 = new KTextEdit( splitter1, "textEdit1" );
+ textEdit1->resize( QSize(1, 1).expandedTo(minimumSizeHint()) );
+ QFont textEdit1_font( textEdit1->font() );
+ textEdit1_font.setPointSize( 9 );
+ textEdit1->setFont( textEdit1_font );
+ textEdit1->setFocusPolicy( QTextEdit::WheelFocus );
+ textEdit1->setReadOnly( TRUE );
+
+ m_layout->addWidget( splitter1, 0, 0 );
+ m_layout->setMargin(1);
+
+ resize( QSize(692, 343).expandedTo(minimumSizeHint()) );
+ clearWState( WState_Polished );
+
+ connect( listView1, SIGNAL(clicked( QListViewItem *)), this, SLOT(slotClicked(QListViewItem*)) );
+ connect( listView1, SIGNAL(contextMenuRequested( QListViewItem*, const QPoint&, int )),
+ this, SLOT(contextMenuRequested(QListViewItem*, const QPoint&, int)) );
+}
+SvnLogViewWidget::~SvnLogViewWidget()
+{
+}
+
+void SvnLogViewWidget::setLogResult( QValueList<SvnLogHolder> *loglist )
+{
+ this->listView1->clear();
+ this->textEdit1->clear();
+ this->listView1->setSorting( 1, false );
+
+ for( QValueList<SvnLogHolder>::Iterator it=loglist->begin(); it!=loglist->end(); ++it ){
+
+ SvnLogHolder holder = *it;
+ SvnLogViewItem *item = new SvnLogViewItem(this->listView1);
+
+ QString prettyDate = holder.date.left(16).replace(10, 1, ' ');
+
+ item->setText(0, holder.rev );
+ item->setText(1, prettyDate );
+ item->setText(2, holder.author );
+ item->setText(3, holder.logMsg.simplifyWhiteSpace() );
+
+ item->m_pathList = holder.pathList;
+ item->m_message = holder.logMsg;
+ }
+// this->listView1->show();
+}
+
+void SvnLogViewWidget::setRequestedUrl( QString reqUrl )
+{
+ m_reqUrl = reqUrl;
+}
+
+void SvnLogViewWidget::slotClicked( QListViewItem *oneItem )
+{
+ if( !oneItem ) return;
+ SvnLogViewItem *item = dynamic_cast<SvnLogViewItem*>( oneItem );
+ if( !item ) return;
+ textEdit1->clear();
+ textEdit1->append( item->m_pathList );
+ textEdit1->append( "\n\n" );
+ textEdit1->append( item->m_message + "\n" );
+}
+void SvnLogViewWidget::contextMenuRequested( QListViewItem *item, const QPoint & pos, int col )
+{
+ if( !item || col == -1 )
+ return;
+ m_ctxLogItem = dynamic_cast<SvnLogViewItem*>(item);
+ if( !m_ctxLogItem )
+ return;
+ QPopupMenu *menu = new QPopupMenu(this);
+ menu->insertItem( i18n("Blame this revision"), this, SLOT(blameThis()) );
+ menu->insertItem( i18n("Difference to previous revision"), this, SLOT(diffToPrevious()) );
+ menu->exec( pos );
+}
+void SvnLogViewWidget::blameThis()
+{
+ if( !m_ctxLogItem ){
+ KMessageBox::error( this, i18n("No revision was clicked"), i18n("error") );
+ return;
+ }
+ // note that blame is done on single file.
+ QStringList modifies = QStringList::split( "\n", m_ctxLogItem->m_pathList, false );
+ QString selectedPath;
+ if( modifies.count() > 1 ){
+ SvnBlameFileSelectDlg dlg(this);
+ dlg.setCandidate( &modifies );
+ if( dlg.exec() == QDialog::Accepted ){
+ selectedPath = dlg.selected();
+ } else{
+ return;
+ }
+
+ } else if( modifies.count() == 1 ){
+ selectedPath = *( modifies.at(0) );
+ } else {
+ return;
+ }
+
+ QString relPath = selectedPath.section( '/', 1 );
+
+ QValueList< SvnGlobal::SvnInfoHolder > holderList = m_part->m_prjInfoMap.values();
+ SvnGlobal::SvnInfoHolder holder;
+ if( holderList.count() > 0 ){
+ // get full Url
+ holder = holderList.first();
+ QString absPath = holder.reposRootUrl.url(-1) + '/' + relPath;
+ kdDebug(9036) << " Blame requested on path " << absPath << endl;
+ // get revision
+ int revEnd = m_ctxLogItem->text(0).toInt();
+ // final request
+ m_part->svncore()->blame( KURL(absPath), SvnGlobal::dont_touch, 0, "", revEnd, "" );
+ }
+ else{
+ return;
+ }
+}
+
+void SvnLogViewWidget::diffToPrevious()
+{
+ if( !m_ctxLogItem ){
+ KMessageBox::error( this, i18n("No revision was clicked"), i18n("error") );
+ return;
+ }
+ int revThis = m_ctxLogItem->text(0).toInt();
+ int revPrev = revThis - 1;
+ kdDebug(9036) << " Diff to prev requested on " << m_reqUrl << endl;
+ m_part->svncore()->diffAsync( m_reqUrl, m_reqUrl, revPrev, "", revThis, "",
+ true/*recurse*/, true/*peg_diff*/ );
+}
+
+SvnLogViewOptionDlg::SvnLogViewOptionDlg( QWidget *parent, const char* name, bool modal, WFlags f )
+: SvnLogViewOptionDlgBase( parent, name, modal,f )
+{
+// radio1->setChecked(true); //repository log
+ radio4->setChecked(true); //start revistion by revision keyword
+ radio5->setChecked(true); //end revision by revision number
+ reinstallRevisionSpecifiers();
+ connect( intInput1, SIGNAL(valueChanged(int)), this, SLOT(setStartRevnumRadio()) );
+ connect( comboBox1, SIGNAL(activated(const QString&)), this, SLOT(setStartRevkindRadio()) );
+ connect( intInput2, SIGNAL(valueChanged(int)), this, SLOT(setEndRevnumRadio()) );
+ connect( comboBox2, SIGNAL(activated(const QString&)), this, SLOT(setEndRevkindRadio()) );
+}
+SvnLogViewOptionDlg::~SvnLogViewOptionDlg()
+{}
+void SvnLogViewOptionDlg::reinstallRevisionSpecifiers()
+{
+ comboBox1->clear();
+ comboBox2->clear();
+
+ QStringList items;
+ items << "HEAD" << "BASE" << "PREV" << "COMMITTED";
+ comboBox1->insertStringList( items );
+ comboBox2->insertStringList( items );
+}
+int SvnLogViewOptionDlg::revstart()
+{
+ if( !radio3->isChecked() ){
+ return -1;
+ } else{
+ return intInput1->value();
+ }
+}
+QString SvnLogViewOptionDlg::revKindStart()
+{
+ if( !radio4->isChecked() ){
+ return QString("");
+ } else{
+ return comboBox1->currentText();
+ }
+}
+int SvnLogViewOptionDlg::revend()
+{
+ if( !radio5->isChecked() ){
+ return -1;
+ } else{
+ return intInput2->value();
+ }
+}
+QString SvnLogViewOptionDlg::revKindEnd()
+{
+ if( !radio6->isChecked() ){
+ return QString("");
+ } else{
+ return comboBox2->currentText();
+ }
+}
+bool SvnLogViewOptionDlg::strictNode()
+{
+ if( checkBox1->isChecked() ){
+ return true;
+ } else{
+ return false;
+ }
+}
+void SvnLogViewOptionDlg::setStartRevnumRadio()
+{
+ radio3->setChecked(true);
+}
+void SvnLogViewOptionDlg::setStartRevkindRadio()
+{
+ radio4->setChecked(true);
+}
+void SvnLogViewOptionDlg::setEndRevnumRadio()
+{
+ radio5->setChecked(true);
+}
+void SvnLogViewOptionDlg::setEndRevkindRadio()
+{
+ radio6->setChecked(true);
+}
+
+#include "svn_logviewwidget.moc"
+