summaryrefslogtreecommitdiffstats
path: root/parts/filelist/filelist_widget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'parts/filelist/filelist_widget.cpp')
-rw-r--r--parts/filelist/filelist_widget.cpp300
1 files changed, 300 insertions, 0 deletions
diff --git a/parts/filelist/filelist_widget.cpp b/parts/filelist/filelist_widget.cpp
new file mode 100644
index 00000000..2ef03968
--- /dev/null
+++ b/parts/filelist/filelist_widget.cpp
@@ -0,0 +1,300 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Jens Dagerbo *
+ * jens.dagerbo@swipnet.se *
+ * Copyright (C) 2005 by Jens Herden *
+ * jens@kdewebdev.org *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include <qheader.h>
+#include <qpixmap.h>
+
+#include <kparts/part.h>
+#include <klibloader.h>
+#include <kurl.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+
+#include <kdevcore.h>
+#include <kdevpartcontroller.h>
+
+#include "projectviewpart.h"
+#include "filelist_widget.h"
+#include "filelist_item.h"
+
+
+/**
+ *
+ * @param part
+ * @return
+ */
+FileListWidget::FileListWidget(ProjectviewPart *part, QWidget *parent)
+ : KListView(parent), QToolTip( viewport() ), _part( part )
+{
+ addColumn( "" );
+ header()->hide();
+ setRootIsDecorated( false );
+ setResizeMode( QListView::LastColumn );
+ setAllColumnsShowFocus( true );
+
+ setSelectionMode( QListView::Extended );
+
+// connect( _part->partController(), SIGNAL( partAdded(KParts::Part*) ), this, SLOT(partAdded(KParts::Part*)) );
+// connect( _part->partController(), SIGNAL( partRemoved(KParts::Part*) ), this, SLOT(partRemoved()) );
+ connect( _part->partController(), SIGNAL( partAdded(KParts::Part*) ), this, SLOT(startRefreshTimer()) );
+ connect( _part->partController(), SIGNAL( partRemoved(KParts::Part*) ), this, SLOT(startRefreshTimer()) );
+ connect( _part->partController(), SIGNAL( activePartChanged(KParts::Part*) ), this, SLOT( activePartChanged(KParts::Part* )) );
+
+ connect( this, SIGNAL( executed( QListViewItem * ) ), this, SLOT( itemClicked( QListViewItem * ) ) );
+ connect( this, SIGNAL( returnPressed( QListViewItem * ) ), this, SLOT( itemClicked( QListViewItem * ) ) );
+
+ connect( this, SIGNAL( contextMenuRequested ( QListViewItem *, const QPoint & , int ) ),
+ this, SLOT( popupMenu(QListViewItem *, const QPoint & , int ) ) );
+
+ connect( _part->partController(), SIGNAL(documentChangedState(const KURL &, DocumentState)),
+ this, SLOT(documentChangedState(const KURL&, DocumentState )) );
+
+ connect( _part->partController(), SIGNAL(partURLChanged(KParts::ReadOnlyPart * )), this, SLOT(refreshFileList()) );
+
+ setItemMargin(10);
+
+ connect( &m_refreshTimer, SIGNAL(timeout()), this, SLOT(refreshFileList()) );
+
+ startRefreshTimer();
+}
+
+
+FileListWidget::~FileListWidget()
+{}
+
+void FileListWidget::startRefreshTimer( )
+{
+ m_refreshTimer.start( 100, true );
+}
+
+void FileListWidget::maybeTip( QPoint const & p )
+{
+ FileListItem * item = static_cast<FileListItem*>( itemAt( p ) );
+ QRect r = itemRect( item );
+
+ if ( item && r.isValid() )
+ {
+ const QPixmap * pixmap = item->pixmap(0);
+ if ( pixmap && ( p.x() <= pixmap->width() ) )
+ {
+ QString message;
+ switch( item->state() )
+ {
+ case Modified:
+ message = i18n("This file has unsaved changes.");
+ break;
+ case Dirty:
+ message = i18n("This file has changed on disk since it was last saved.");
+ break;
+ case DirtyAndModified:
+ message = i18n("Conflict: this file has changed on disk and has unsaved changes.");
+ break;
+ default:
+ message = item->url().prettyURL();
+ }
+
+ tip( r, message );
+ }
+ else
+ {
+ tip( r, item->url().prettyURL() );
+ }
+ }
+}
+
+FileListItem * FileListWidget::itemForURL( KURL const & url )
+{
+ FileListItem * item = static_cast<FileListItem*>( firstChild() );
+ while ( item )
+ {
+ if ( item->url() == url )
+ {
+ return item;
+ }
+ item = static_cast<FileListItem*>( item->nextSibling() );
+ }
+ return 0L;
+}
+
+void FileListWidget::refreshFileList( )
+{
+ QStringList selections = storeSelections();
+ int scrollbarPos = verticalScrollBar()->value();
+
+ KListView::clear();
+
+ KURL::List list = _part->partController()->openURLs();
+ QValueListIterator<KURL> it = list.begin();
+ while ( it != list.end() )
+ {
+ FileListItem * item = new FileListItem( this, *it );
+ item->setState( _part->partController()->documentState( *it ) );
+ ++it;
+ }
+
+ restoreSelections( selections );
+
+ if ( selections.isEmpty() && firstChild() )
+ {
+ firstChild()->setSelected( true );
+ }
+
+ verticalScrollBar()->setValue( scrollbarPos );
+
+ activePartChanged( _part->partController()->activePart() );
+}
+
+/*
+void FileListWidget::partAdded( KParts::Part * part )
+{
+ KParts::ReadOnlyPart * ro_part = dynamic_cast<KParts::ReadOnlyPart*>( part );
+ if ( ro_part )
+ {
+ new FileListItem( this, ro_part->url() );
+ }
+
+ activePartChanged( _part->partController()->activePart() );
+}
+
+void FileListWidget::partRemoved()
+{
+ FileListItem * item = static_cast<FileListItem*>( firstChild() );
+ while ( item )
+ {
+ if ( ! _part->partController()->partForURL( item->url() ) )
+ {
+ delete item;
+ break;
+ }
+ item = static_cast<FileListItem*>( item->nextSibling() );
+ }
+
+ activePartChanged( _part->partController()->activePart() );
+}
+*/
+
+void FileListWidget::itemClicked( QListViewItem * item )
+{
+ if ( !item ) return;
+
+ FileListItem * listItem = static_cast<FileListItem*>( item );
+ _part->partController()->editDocument( listItem->url() );
+}
+
+void FileListWidget::activePartChanged( KParts::Part * part )
+{
+ KParts::ReadOnlyPart * ro_part = dynamic_cast<KParts::ReadOnlyPart*>( part );
+ if ( ro_part )
+ {
+ FileListItem * item = static_cast<FileListItem*>( firstChild() );
+ while ( item )
+ {
+ if ( item->url() == ro_part->url() )
+ {
+ FileListItem::setActive( item );
+ break;
+ }
+ item = static_cast<FileListItem*>( item->nextSibling() );
+ }
+ }
+ repaintContents();
+}
+
+void FileListWidget::documentChangedState( const KURL & url, DocumentState state )
+{
+ FileListItem * item = itemForURL( url );
+ if ( item )
+ {
+ item->setState( state );
+ }
+}
+
+void FileListWidget::popupMenu( QListViewItem * item, const QPoint & p, int )
+{
+ if ( item )
+ {
+ KPopupMenu popup;
+ popup.insertTitle( i18n("File List") );
+ popup.insertItem( i18n("Close Selected"), this, SLOT(closeSelectedFiles()) );
+ popup.insertItem( i18n("Save Selected"), this, SLOT(saveSelectedFiles()) );
+ popup.insertItem( i18n("Reload Selected"), this, SLOT(reloadSelectedFiles()) );
+
+ FileContext context( getSelectedURLs() );
+ _part->core()->fillContextMenu( &popup, &context );
+
+ popup.exec(p);
+ }
+}
+
+KURL::List FileListWidget::getSelectedURLs( )
+{
+ KURL::List list;
+ FileListItem * item = static_cast<FileListItem*>( firstChild() );
+ while ( item )
+ {
+ if ( item->isSelected() )
+ {
+ list << item->url();
+ }
+ item = static_cast<FileListItem*>( item->nextSibling() );
+ }
+ return list;
+}
+
+void FileListWidget::closeSelectedFiles( )
+{
+ _part->partController()->closeFiles( getSelectedURLs() );
+}
+
+void FileListWidget::saveSelectedFiles( )
+{
+ _part->partController()->saveFiles( getSelectedURLs() );
+}
+
+void FileListWidget::reloadSelectedFiles( )
+{
+ _part->partController()->revertFiles( getSelectedURLs() );
+}
+
+QStringList FileListWidget::storeSelections()
+{
+ QStringList list;
+ QListViewItem * item = firstChild();
+ while ( item )
+ {
+ if ( item->isSelected() )
+ {
+ list << item->text(0);
+ }
+ item = item->nextSibling();
+ }
+ return list;
+}
+
+void FileListWidget::restoreSelections(const QStringList & list)
+{
+ QListViewItem * item = firstChild();
+ while ( item )
+ {
+ if ( list.contains( item->text(0) ) )
+ {
+ item->setSelected( true );
+ }
+ item = item->nextSibling();
+ }
+}
+
+#include "filelist_widget.moc"
+
+// kate: space-indent off; indent-width 4; tab-width 4; show-tabs off;