summaryrefslogtreecommitdiffstats
path: root/src/ksvnwidgets/logmsg_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ksvnwidgets/logmsg_impl.cpp')
-rw-r--r--src/ksvnwidgets/logmsg_impl.cpp653
1 files changed, 653 insertions, 0 deletions
diff --git a/src/ksvnwidgets/logmsg_impl.cpp b/src/ksvnwidgets/logmsg_impl.cpp
new file mode 100644
index 0000000..f083d4c
--- /dev/null
+++ b/src/ksvnwidgets/logmsg_impl.cpp
@@ -0,0 +1,653 @@
+/***************************************************************************
+ * Copyright (C) 2005-2007 by Rajko Albrecht *
+ * *
+ * 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 "logmsg_impl.h"
+#include "src/settings/kdesvnsettings.h"
+#include "depthselector.h"
+
+#include <ktextedit.h>
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kapp.h>
+#include <kconfigbase.h>
+#include <kconfig.h>
+#include <kurlrequesterdlg.h>
+#include <kio/netaccess.h>
+#include <kmessagebox.h>
+#include <kfile.h>
+#include <kurlrequester.h>
+
+#include <qvbox.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlistview.h>
+#include <qlayout.h>
+#include <qwidget.h>
+#include <qpushbutton.h>
+#include <qfile.h>
+
+#define MAX_MESSAGE_HISTORY 10
+
+QValueList<QString> Logmsg_impl::sLogHistory = QValueList<QString>();
+QString Logmsg_impl::sLastMessage=QString();
+const QString Logmsg_impl::groupName("logmsg_dlg_size");
+
+unsigned int Logmsg_impl::smax_message_history = 0xFFFF;
+
+class SvnCheckListItem:public QCheckListItem
+{
+protected:
+ Logmsg_impl::logActionEntry m_Content;
+public:
+ SvnCheckListItem(QListView*,const Logmsg_impl::logActionEntry&);
+ const Logmsg_impl::logActionEntry&data(){return m_Content;}
+ virtual int rtti()const{return 1000;}
+ virtual int compare( QListViewItem* item, int col, bool ascending ) const;
+};
+
+Logmsg_impl::Logmsg_impl(QWidget *parent, const char *name)
+ :LogmessageData(parent, name)
+{
+ m_LogEdit->setFocus();
+ m_Reviewlabel->hide();
+ m_ReviewList->hide();
+ m_hidden=true;
+ hideButtons(true);
+ m_MainSplitter->moveToFirst(m_EditFrame);
+ delete m_ReviewFrame;
+ m_Reviewlabel=0;
+ m_ReviewList=0;
+ m_MarkUnversioned=0;
+ m_UnmarkUnversioned=0;
+ m_DiffItem=0;
+}
+
+Logmsg_impl::Logmsg_impl(const svn::CommitItemList&_items,QWidget *parent, const char *name)
+ :LogmessageData(parent, name)
+{
+ m_LogEdit->setFocus();
+ m_ReviewList->setColumnText(1,i18n("Items to commit"));
+ m_ReviewList->setColumnText(0,i18n("Action"));
+ m_ReviewList->setSortColumn(1);
+ hideButtons(true);
+ if (_items.count()>0) {
+ for (unsigned i = 0;i<_items.count();++i) {
+ QListViewItem*item = new QListViewItem(m_ReviewList);
+ if (_items[i].path().isEmpty()) {
+ item->setText(1,_items[i].url());
+ } else {
+ item->setText(1,_items[i].path());
+ }
+ item->setText(0,QChar(_items[i].actionType()));
+ }
+ m_hidden=false;
+ } else {
+ m_Reviewlabel->hide();
+ m_ReviewList->hide();
+ m_hidden=true;
+ }
+ checkSplitterSize();
+}
+
+Logmsg_impl::Logmsg_impl(const QMap<QString,QString>&_items,QWidget *parent, const char *name)
+ :LogmessageData(parent, name)
+{
+ m_LogEdit->setFocus();
+ m_ReviewList->setColumnText(1,i18n("Items to commit"));
+ m_ReviewList->setColumnText(0,i18n("Action"));
+ m_ReviewList->setSortColumn(1);
+ hideButtons(true);
+ if (_items.count()>0) {
+ QMap<QString,QString>::ConstIterator it = _items.begin();
+ for (;it!=_items.end();++it) {
+ QListViewItem*item = new QListViewItem(m_ReviewList);
+ item->setText(1,it.key());
+ item->setText(0,it.data());
+ }
+ m_hidden=false;
+ } else {
+ m_Reviewlabel->hide();
+ m_ReviewList->hide();
+ m_hidden=true;
+ }
+ checkSplitterSize();
+}
+
+Logmsg_impl::Logmsg_impl(const logActionEntries&_activatedList,
+ const logActionEntries&_notActivatedList,
+ QWidget *parent, const char *name)
+ :LogmessageData(parent, name)
+{
+ m_LogEdit->setFocus();
+ m_hidden=false;
+ for (unsigned j = 0; j<_activatedList.count();++j) {
+ SvnCheckListItem * item = new SvnCheckListItem(m_ReviewList,_activatedList[j]);
+ item->setState(QCheckListItem::On);
+ }
+ for (unsigned j = 0; j<_notActivatedList.count();++j) {
+ SvnCheckListItem * item = new SvnCheckListItem(m_ReviewList,_notActivatedList[j]);
+ item->setState(QCheckListItem::Off);
+ }
+ m_HideNewItems->setOn(Kdesvnsettings::commit_hide_new());
+ checkSplitterSize();
+}
+
+Logmsg_impl::~Logmsg_impl()
+{
+ QValueList<int> list = m_MainSplitter->sizes();
+ if (!m_hidden && list.count()==2) {
+ Kdesvnsettings::setCommit_splitter_height(list);
+ Kdesvnsettings::writeConfig();
+ }
+ for (unsigned int j=0; j<m_Hidden.size();++j) {
+ delete m_Hidden[j];
+ }
+ Kdesvnsettings::setCommit_hide_new(m_HideNewItems->state()==QButton::On);
+}
+
+void Logmsg_impl::checkSplitterSize()
+{
+ QValueList<int> list = Kdesvnsettings::commit_splitter_height();
+ if (list.count()!=2) {
+ return;
+ }
+ if (m_hidden) {
+ list[1]=list[0]+list[1];
+ list[0]=0;
+ }
+ if (m_hidden || (list[0]>0||list[1]>0)) {
+ m_MainSplitter->setSizes(list);
+ }
+}
+
+void Logmsg_impl::slotHistoryActivated(int number)
+{
+ if (number < 1||(unsigned)number>sLogHistory.size()) {
+ m_LogEdit->setText("");
+ } else {
+ m_LogEdit->setText(sLogHistory[number-1]);
+ }
+}
+
+/*!
+ \fn Logmsg_impl::getMessage()const
+ */
+QString Logmsg_impl::getMessage()const
+{
+ return m_LogEdit->text();
+}
+
+
+/*!
+ \fn Logmsg_impl::isRecursive()const
+ */
+svn::Depth Logmsg_impl::getDepth()const
+{
+ return m_DepthSelector->getDepth();
+}
+
+/*!
+ \fn Logmsg_impl::isRecursive()const
+ */
+bool Logmsg_impl::isKeeplocks()const
+{
+ return m_keepLocksButton->isChecked();
+}
+
+
+/*!
+ \fn Logmsg_impl::initHistory()
+ */
+void Logmsg_impl::initHistory()
+{
+ if (smax_message_history==0xFFFF) {
+ smax_message_history = Kdesvnsettings::max_log_messages();
+ KConfigGroup cs(Kdesvnsettings::self()->config(),"log_messages");
+ QString s = QString::null;
+ unsigned int current = 0;
+ QString key = QString("log_%0").arg(current);
+ s = cs.readEntry(key,QString::null);
+ while (s!=QString::null) {
+ if (current<smax_message_history) {
+ sLogHistory.push_back(s);
+ } else {
+ cs.deleteEntry(key);
+ }
+ ++current;
+ key = QString("log_%0").arg(current);
+ s = cs.readEntry(key,QString::null);
+ }
+ }
+ QValueList<QString>::const_iterator it;
+ for (it=sLogHistory.begin();it!=sLogHistory.end();++it) {
+ if ((*it).length()<=40) {
+ m_LogHistory->insertItem((*it));
+ } else {
+ m_LogHistory->insertItem((*it).left(37)+"...");
+ }
+ }
+ if (sLastMessage.length()>0) {
+ m_LogEdit->setText(sLastMessage);
+ sLastMessage=QString();
+ }
+}
+
+
+/*!
+ \fn Logmsg_impl::saveHistory()
+ */
+void Logmsg_impl::saveHistory(bool canceld)
+{
+ if (m_LogEdit->text().length()==0||m_LogEdit->text().length()>512) return;
+ /// @todo make static threadsafe
+ if (!canceld) {
+ QValueList<QString>::iterator it;
+ if ( (it=sLogHistory.find(m_LogEdit->text()))!=sLogHistory.end()) {
+ sLogHistory.erase(it);
+ }
+ sLogHistory.push_front(m_LogEdit->text());
+ if (sLogHistory.size()>smax_message_history) {
+ sLogHistory.erase(sLogHistory.fromLast());
+ }
+ KConfigGroup cs(Kdesvnsettings::self()->config(),"log_messages");
+ for (unsigned int i = 0; i < sLogHistory.size();++i) {
+ cs.writeEntry(QString("log_%0").arg(i),sLogHistory[i]);
+ }
+ cs.sync();
+ } else {
+ sLastMessage=m_LogEdit->text();
+ }
+}
+
+QString Logmsg_impl::getLogmessage(bool*ok,svn::Depth*rec,bool*keep_locks,QWidget*parent,const char*name)
+{
+ bool _ok,_keep_locks;
+ svn::Depth _depth = svn::DepthUnknown;
+ QString msg("");
+
+ Logmsg_impl*ptr=0;
+ KDialogBase dlg(parent,name,true,i18n("Commit log"),
+ KDialogBase::Ok|KDialogBase::Cancel,
+ KDialogBase::Ok,true);
+ QWidget* Dialog1Layout = dlg.makeVBoxMainWidget();
+
+ ptr = new Logmsg_impl(Dialog1Layout);
+ if (!rec) {
+ ptr->m_DepthSelector->hide();
+ }
+ if (!keep_locks) {
+ ptr->m_keepLocksButton->hide();
+ }
+ ptr->initHistory();
+ dlg.resize(dlg.configDialogSize(*(Kdesvnsettings::self()->config()),groupName));
+ if (dlg.exec()!=QDialog::Accepted) {
+ _ok = false;
+ /* avoid compiler warnings */
+ _keep_locks = false;
+ } else {
+ _ok = true;
+ _depth = ptr->getDepth();
+ _keep_locks = ptr->isKeeplocks();
+ msg=ptr->getMessage();
+ }
+ ptr->saveHistory(!_ok);
+
+ dlg.saveDialogSize(*(Kdesvnsettings::self()->config()),groupName,false);
+ if (ok) *ok = _ok;
+ if (rec) *rec = _depth;
+ return msg;
+}
+
+QString Logmsg_impl::getLogmessage(const svn::CommitItemList&items,bool*ok,svn::Depth*rec,bool*keep_locks,QWidget*parent,const char*name)
+{
+ bool _ok,_keep_locks;
+ svn::Depth _depth = svn::DepthUnknown;
+ QString msg("");
+
+ Logmsg_impl*ptr=0;
+ KDialogBase dlg(parent,name,true,i18n("Commit log"),
+ KDialogBase::Ok|KDialogBase::Cancel,
+ KDialogBase::Ok,true);
+ QWidget* Dialog1Layout = dlg.makeVBoxMainWidget();
+
+ ptr = new Logmsg_impl(items,Dialog1Layout);
+ if (!rec) {
+ ptr->m_DepthSelector->hide();
+ }
+ if (!keep_locks) {
+ ptr->m_keepLocksButton->hide();
+ }
+
+ ptr->initHistory();
+ dlg.resize(dlg.configDialogSize(*(Kdesvnsettings::self()->config()),groupName));
+ if (dlg.exec()!=QDialog::Accepted) {
+ _ok = false;
+ /* avoid compiler warnings */
+ _keep_locks = false;
+ } else {
+ _ok = true;
+ _depth = ptr->getDepth();
+ _keep_locks = ptr->isKeeplocks();
+ msg=ptr->getMessage();
+ }
+ ptr->saveHistory(!_ok);
+
+ dlg.saveDialogSize(*(Kdesvnsettings::self()->config()),groupName,false);
+ if (ok) *ok = _ok;
+ if (rec) *rec = _depth;
+ if (keep_locks) *keep_locks = _keep_locks;
+ return msg;
+}
+
+QString Logmsg_impl::getLogmessage(const QMap<QString,QString>&items,
+ bool*ok,svn::Depth*rec,bool*keep_locks,QWidget*parent,const char*name)
+{
+ bool _ok,_rec,_keep_locks;
+ svn::Depth _depth = svn::DepthUnknown;
+ QString msg("");
+
+ Logmsg_impl*ptr=0;
+ KDialogBase dlg(parent,name,true,i18n("Commit log"),
+ KDialogBase::Ok|KDialogBase::Cancel,
+ KDialogBase::Ok,true);
+ QWidget* Dialog1Layout = dlg.makeVBoxMainWidget();
+
+ ptr = new Logmsg_impl(items,Dialog1Layout);
+ if (!rec) {
+ ptr->m_DepthSelector->hide();
+ }
+ if (!keep_locks) {
+ ptr->m_keepLocksButton->hide();
+ }
+ ptr->initHistory();
+ dlg.resize(dlg.configDialogSize(*(Kdesvnsettings::self()->config()),groupName));
+ if (dlg.exec()!=QDialog::Accepted) {
+ _ok = false;
+ /* avoid compiler warnings */
+ _rec = false;
+ _keep_locks=false;
+ } else {
+ _ok = true;
+ _depth = ptr->getDepth();
+ msg=ptr->getMessage();
+ _keep_locks = ptr->isKeeplocks();
+ }
+ ptr->saveHistory(!_ok);
+
+ dlg.saveDialogSize(*(Kdesvnsettings::self()->config()),groupName,false);
+ if (ok) *ok = _ok;
+ if (rec) *rec = _depth;
+ if (keep_locks) *keep_locks = _keep_locks;
+ return msg;
+}
+
+QString Logmsg_impl::getLogmessage(const logActionEntries&_on,
+ const logActionEntries&_off,
+ QObject*callback,
+ logActionEntries&_result,
+ bool*ok,bool*keep_locks,QWidget*parent,const char*name)
+{
+ bool _ok,_keep_locks;
+ QString msg("");
+
+ Logmsg_impl*ptr=0;
+ KDialogBase dlg(parent,name,true,i18n("Commit log"),
+ KDialogBase::Ok|KDialogBase::Cancel,
+ KDialogBase::Ok,true);
+ QWidget* Dialog1Layout = dlg.makeVBoxMainWidget();
+ ptr = new Logmsg_impl(_on,_off,Dialog1Layout);
+ ptr->m_DepthSelector->hide();
+ if (!keep_locks) {
+ ptr->m_keepLocksButton->hide();
+ }
+ ptr->initHistory();
+ if (callback)
+ {
+ connect(ptr,SIGNAL(makeDiff(const QString&,const svn::Revision&,const QString&,const svn::Revision&,QWidget*)),
+ callback,SLOT(makeDiff(const QString&,const svn::Revision&,const QString&,const svn::Revision&,QWidget*)));
+ }
+ dlg.resize(dlg.configDialogSize(*(Kdesvnsettings::self()->config()),groupName));
+ if (dlg.exec()!=QDialog::Accepted) {
+ _ok = false;
+ /* avoid compiler warnings */
+ _keep_locks=false;
+ } else {
+ _ok = true;
+ msg=ptr->getMessage();
+ _keep_locks = ptr->isKeeplocks();
+ }
+ ptr->saveHistory(!_ok);
+ dlg.saveDialogSize(*(Kdesvnsettings::self()->config()),groupName,false);
+ if (ok) *ok = _ok;
+ _result = ptr->selectedEntries();
+ if (keep_locks) *keep_locks = _keep_locks;
+ return msg;
+}
+
+/*!
+ \fn Logmsg_impl::setRecCheckboxtext(const QString&what)
+ */
+void Logmsg_impl::addItemWidget(QWidget*aWidget)
+{
+ m_DepthSelector->addItemWidget(aWidget);
+/* aWidget->reparent(this,geometry().topLeft());
+ m_ItemsLayout->addWidget(aWidget);
+ kdDebug()<<"SizeHint: "<<aWidget->minimumSizeHint()<< endl;
+ aWidget->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
+ setMinimumHeight(minimumSizeHint().height());*/
+}
+
+Logmsg_impl::logActionEntries Logmsg_impl::selectedEntries()
+{
+ logActionEntries _result;
+ if (m_ReviewList) {
+ QListViewItemIterator it( m_ReviewList );
+ while ( it.current() ) {
+ if (it.current()->rtti()==1000) {
+ SvnCheckListItem *item = static_cast<SvnCheckListItem*>(it.current());
+ if (item->isOn()) {
+ _result.append(item->data());
+ }
+ }
+ ++it;
+ }
+ }
+ return _result;
+}
+
+Logmsg_impl::logActionEntry::logActionEntry(const QString&name,const QString&action,ACTION_TYPE kind)
+ : _name(name),_actionDesc(action),_kind(kind)
+{
+}
+
+Logmsg_impl::logActionEntry::logActionEntry()
+ : _name(""),_actionDesc(""),_kind(COMMIT)
+{
+}
+
+SvnCheckListItem::SvnCheckListItem(QListView*parent,const Logmsg_impl::logActionEntry&content)
+ :QCheckListItem(parent,content._name,QCheckListItem::CheckBox),m_Content(content)
+{
+ setTristate(FALSE);
+ setText(1,m_Content._actionDesc);
+ if (content._name.isEmpty()) {
+ setText(0,"...");
+ }
+}
+
+int SvnCheckListItem::compare( QListViewItem* item, int col, bool ascending ) const
+{
+ if (item->rtti()!=1000 || col>0) {
+ return QCheckListItem::compare(item,col,ascending);
+ }
+ SvnCheckListItem* k = static_cast<SvnCheckListItem*>( item );
+ if (Kdesvnsettings::case_sensitive_sort()) {
+ if (Kdesvnsettings::locale_is_casesensitive()) {
+ return m_Content._name.lower().localeAwareCompare(k->m_Content._name.lower());
+ }
+ return m_Content._name.compare(k->m_Content._name);
+ } else {
+ return m_Content._name.lower().localeAwareCompare(k->m_Content._name.lower());
+ }
+}
+
+void Logmsg_impl::slotUnmarkUnversioned()
+{
+ markUnversioned(false);
+}
+
+void Logmsg_impl::slotMarkUnversioned()
+{
+ markUnversioned(true);
+}
+
+void Logmsg_impl::slotDiffSelected()
+{
+ QListViewItem * it=0;
+ if (!m_ReviewList || !(it=m_ReviewList->selectedItem()))
+ {
+ return;
+ }
+ if (it->rtti()==1000)
+ {
+ SvnCheckListItem *item = static_cast<SvnCheckListItem*>(it);
+ QString what = item->data()._name;
+ emit makeDiff(what,svn::Revision::BASE,what,svn::Revision::WORKING,parentWidget());
+ }
+}
+
+void Logmsg_impl::hideButtons(bool how)
+{
+ if (!m_MarkUnversioned)return;
+ if (how)
+ {
+ m_MarkUnversioned->hide();
+ m_UnmarkUnversioned->hide();
+ m_DiffItem->hide();
+ m_HideNewItems->hide();
+ }
+ else
+ {
+ m_MarkUnversioned->show();
+ m_UnmarkUnversioned->show();
+ m_DiffItem->show();
+ m_HideNewItems->show();
+ }
+}
+
+/*!
+ \fn Logmsg_impl::markUnversioned(bool mark)
+ */
+void Logmsg_impl::markUnversioned(bool mark)
+{
+ if (!m_ReviewList)return;
+ QListViewItemIterator it( m_ReviewList );
+ while ( it.current() ) {
+ if (it.current()->rtti()==1000) {
+ SvnCheckListItem *item = static_cast<SvnCheckListItem*>(it.current());
+ if (item->data()._kind==logActionEntry::ADD_COMMIT) {
+ item->setOn(mark);
+ }
+ }
+ ++it;
+ }
+}
+
+void Logmsg_impl::hideNewItems(bool how)
+{
+ if (!m_ReviewList)return;
+
+ if (how) {
+ QListViewItemIterator it( m_ReviewList );
+ while ( it.current() ) {
+ if (it.current()->rtti()==1000) {
+ SvnCheckListItem *item = static_cast<SvnCheckListItem*>(it.current());
+ if (item->data()._kind==logActionEntry::ADD_COMMIT) {
+ item->setOn(false);
+ m_Hidden.push_back(item);
+ }
+ }
+ ++it;
+ }
+ for (unsigned j=0;j<m_Hidden.size();++j) {
+ m_ReviewList->takeItem(m_Hidden[j]);
+ }
+ } else {
+ for (unsigned j=0;j<m_Hidden.size();++j) {
+ m_ReviewList->insertItem(m_Hidden[j]);
+ }
+ m_Hidden.clear();
+ }
+}
+
+/*!
+ \fn Logmsg_impl::hideDepth(bool hide)
+ */
+void Logmsg_impl::hideDepth(bool ahide)
+{
+ m_DepthSelector->hideDepth(ahide);
+// if (hide) m_DepthSelector->hide();
+// else m_DepthSelector->show();
+}
+
+void Logmsg_impl::insertFile(const QString&fname)
+{
+ QFile ifs(fname);
+ if (ifs.open(IO_ReadOnly)) {
+ QTextStream ts(&ifs);
+ QString _content = ts.read();
+ int para,index;
+ m_LogEdit->getCursorPosition(&para,&index);
+ m_LogEdit->insertAt(_content,para,index);
+ }
+}
+
+void Logmsg_impl::insertFile()
+{
+ QString head = i18n("Select textfile for insert");
+ KURLRequesterDlg dlg(QString::null,this,head);
+ dlg.setCaption(head);
+ KFile::Mode mode = static_cast<KFile::Mode>(KFile::File);
+ dlg.urlRequester()->setMode(mode);
+ dlg.urlRequester()->setCaption(head);
+
+ if (dlg.exec()!=QDialog::Accepted) {
+ return;
+ }
+ KURL _url = dlg.selectedURL();
+ if (_url.isEmpty() || !_url.isValid()) {
+ return;
+ }
+ if (_url.isLocalFile()) {
+ insertFile(_url.path());
+ } else {
+ QString tmpFile;
+ if( KIO::NetAccess::download(_url, tmpFile, this) ) {
+ insertFile( tmpFile );
+ KIO::NetAccess::removeTempFile( tmpFile );
+ } else {
+ KMessageBox::error(this, KIO::NetAccess::lastErrorString() );
+ }
+ }
+}
+
+#include "logmsg_impl.moc"