diff options
Diffstat (limited to 'src/svnfrontend/filelistviewitem.cpp')
-rw-r--r-- | src/svnfrontend/filelistviewitem.cpp | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/src/svnfrontend/filelistviewitem.cpp b/src/svnfrontend/filelistviewitem.cpp new file mode 100644 index 0000000..19af4fe --- /dev/null +++ b/src/svnfrontend/filelistviewitem.cpp @@ -0,0 +1,322 @@ +/*************************************************************************** + * Copyright (C) 2005-2007 by Rajko Albrecht * + * [email protected] * + * * + * 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 "filelistviewitem.h" +#include "kdesvnfilelist.h" +#include "src/settings/kdesvnsettings.h" +#include "helpers/sub2qt.h" +#include "src/svnqt/status.hpp" +#include "src/svnqt/revision.hpp" +#include "src/svnqt/exception.hpp" +#include "src/svnqt/url.hpp" +#include "fronthelpers/widgetblockstack.h" + +#include <klocale.h> +#include <kiconloader.h> +#include <kfileitem.h> +#include <kdebug.h> +#include <kconfig.h> + +#include <qfileinfo.h> +#include <qpainter.h> + +const int FileListViewItem::COL_ICON = 0; +const int FileListViewItem::COL_NAME = 0; +const int FileListViewItem::COL_STATUS = 1; +const int FileListViewItem::COL_LAST_REV = 2; +const int FileListViewItem::COL_LAST_AUTHOR = 3; +const int FileListViewItem::COL_LAST_DATE = 4; +const int FileListViewItem::COL_IS_LOCKED = 5; + +//const int FileListViewItem::COL_CURRENT_REV = 5; + +FileListViewItem::FileListViewItem(kdesvnfilelist*_parent,const svn::StatusPtr&_stat) + : KListViewItem(_parent),SvnItem(_stat), + sortChar(0), + m_Ksvnfilelist(_parent) +{ + m_SvnWrapper = _parent->m_SvnWrapper; + init(); +} + +FileListViewItem::FileListViewItem(kdesvnfilelist*_parent,FileListViewItem*_parentItem,const svn::StatusPtr&_stat) + : KListViewItem(_parentItem),SvnItem(_stat), + sortChar(0), + m_Ksvnfilelist(_parent) +{ + m_SvnWrapper = _parent->m_SvnWrapper; + init(); +} + +SvnActions*FileListViewItem::getWrapper()const +{ + return m_SvnWrapper; +} + +void FileListViewItem::init() +{ + setText(COL_NAME,shortName()); + sortChar = isDir()?1:3; + setExpandable(isDir()); + if (shortName()[0]=='.') --sortChar; + update(); +} + +void FileListViewItem::setOpen(bool o) +{ + if (o && childCount()==0) { + { + WidgetBlockStack a(m_Ksvnfilelist); + m_Ksvnfilelist->slotItemRead(this); + } + m_Ksvnfilelist->setFocus(); + } + KListViewItem::setOpen(o); +} + +void FileListViewItem::setOpenNoBlock(bool o) +{ + if (o && childCount()==0) { + { + m_Ksvnfilelist->slotItemRead(this); + } + } + KListViewItem::setOpen(o); +} + +FileListViewItem::~FileListViewItem() +{ + if (isSelected()) { + /* + when item is selected and deleted signal selectionChanged isn't emitted + in QListView anymore and let kdesvn crash. + */ + setSelected(false); + m_Ksvnfilelist->selectionChanged(); + } +} + +void FileListViewItem::setStat(const svn::StatusPtr&stat) +{ + SvnItem::setStat(stat); + init(); +} + +void FileListViewItem::refreshStatus(bool childs,QPtrList<SvnItem>*exclude,bool depsonly) +{ + FileListViewItem*it; + + if (!depsonly) { + if (!m_Ksvnfilelist->refreshItem(this)) { + return; + } + } + if (!isValid()) { + return; + } + it = static_cast<FileListViewItem*>(parent()); + if (!childs) { + if (it && (!exclude || exclude->find(it)==-1)) { + it->refreshStatus(false,exclude); + } + } else if (firstChild()){ + it = static_cast<FileListViewItem*>(firstChild()); + while (it) { + if (!exclude || exclude->find(it)==-1) { + it->refreshStatus(true,exclude); + } + it = static_cast<FileListViewItem*>(it->nextSibling()); + } + } + repaint(); +} + +void FileListViewItem::makePixmap() +{ + int size = Kdesvnsettings::listview_icon_size(); + bool overlay = Kdesvnsettings::display_overlays(); + QPixmap pm; + if (m_Pixmap.isNull()) { + pm = getPixmap(size,overlay); + } else { + pm = getPixmap(m_Pixmap,size,overlay); + } + setPixmap(COL_ICON,pm); +} + +void FileListViewItem::setPreviewPix(const QPixmap& pixmap) +{ + if (pixmap.isNull()) return; + m_Pixmap = pixmap; + int size = Kdesvnsettings::listview_icon_size(); + bool overlay = Kdesvnsettings::display_overlays(); + QPixmap pm = getPixmap(pixmap,size,overlay); + setPixmap(COL_ICON,pm); +} + +bool FileListViewItem::isParent(QListViewItem*which) +{ + if (!which) return false; + QListViewItem*item = this; + while ( (item=item->parent())) { + if (item==which) { + return true; + } + } + return false; +} + +void FileListViewItem::update() +{ + makePixmap(); + if (!isVersioned()) { + setText(COL_STATUS,i18n("Not versioned")); + return; + } + setText(COL_STATUS,infoText()); + setText(COL_LAST_AUTHOR,cmtAuthor()); + setText(COL_LAST_DATE,KGlobal::locale()->formatDateTime(fullDate())); + setText(COL_LAST_REV,QString("%1").arg(cmtRev())); + setText(COL_IS_LOCKED,lockOwner()); +} + +int FileListViewItem::compare( QListViewItem* item, int col, bool ascending ) const +{ + FileListViewItem* k = static_cast<FileListViewItem*>( item ); + if ( sortChar != k->sortChar ) { + // Dirs are always first, even when sorting in descending order + return !ascending ? k->sortChar - sortChar : sortChar - k->sortChar; + } + if (col==COL_LAST_DATE) { + return fullDate().secsTo(k->fullDate()); + } + if (col==COL_LAST_REV) { + return k->cmtRev()-cmtRev(); + } + + if (Kdesvnsettings::case_sensitive_sort()) { + if (Kdesvnsettings::locale_is_casesensitive()) { + return text(col).localeAwareCompare(k->text(col)); + } + return text(col).compare(k->text(col)); + } else { + return text(col).lower().localeAwareCompare(k->text(col).lower()); + } +} + +void FileListViewItem::removeChilds() +{ + QListViewItem*temp; + while ((temp=firstChild())) { + delete temp; + } +} + +void FileListViewItem::updateStatus(const svn::StatusPtr&s) +{ + setStat(s); +} + +SvnItem* FileListViewItem::getParentItem()const +{ + return static_cast<FileListViewItem*>(parent()); +} +/*! + \fn FileListViewItem::getParentDir()const + */ + QString FileListViewItem::getParentDir()const +{ + SvnItem*temp = getParentItem(); + if (!temp) return QString::null; + return temp->fullName(); +} + +void FileListViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment) +{ + bool colors = Kdesvnsettings::colored_state(); + if (!colors||m_bgColor==NONE) { + KListViewItem::paintCell(p,cg,column,width,alignment); + return; + } + QColorGroup _cg = cg; + QColor _bgColor; + switch(m_bgColor) { + case UPDATES: + _bgColor = Kdesvnsettings::color_need_update(); + break; + case LOCKED: + _bgColor = Kdesvnsettings::color_locked_item(); + break; + case ADDED: + _bgColor = Kdesvnsettings::color_item_added(); + break; + case DELETED: + _bgColor = Kdesvnsettings::color_item_deleted(); + break; + case MODIFIED: + _bgColor = Kdesvnsettings::color_changed_item(); + break; + case MISSING: + _bgColor = Kdesvnsettings::color_missed_item(); + break; + case NOTVERSIONED: + _bgColor = Kdesvnsettings::color_notversioned_item(); + break; + case CONFLICT: + _bgColor = Kdesvnsettings::color_conflicted_item(); + break; + case NEEDLOCK: + _bgColor = Kdesvnsettings::color_need_lock(); + break; + default: + KListViewItem::paintCell(p,cg,column,width,alignment); + return; + break; + } + const QPixmap *pm = listView()->viewport()->backgroundPixmap(); + if (pm && !pm->isNull()) { + _cg.setBrush(QColorGroup::Base, QBrush(_bgColor, *pm)); + QPoint o = p->brushOrigin(); + p->setBrushOrigin( o.x()-listView()->contentsX(), o.y()-listView()->contentsY() ); + } else { + if (listView()->viewport()->backgroundMode()==Qt::FixedColor) { + _cg.setColor(QColorGroup::Background,_bgColor); + } else { + _cg.setColor(QColorGroup::Base,_bgColor); + } + } + QListViewItem::paintCell(p, _cg, column, width, alignment); +} + +const svn::Revision&FileListViewItem::correctPeg()const +{ + return m_Ksvnfilelist->remoteRevision(); +} + +FileListViewItem*FileListViewItem::findChild(const QString&aName) +{ + FileListViewItem*_item = (FileListViewItem*)firstChild(); + while (_item) { + if (_item->fullName()==aName) { + return _item; + } + _item = (FileListViewItem*)_item->nextSibling(); + } + return 0L; +} |