summaryrefslogtreecommitdiffstats
path: root/parts/filelist
diff options
context:
space:
mode:
Diffstat (limited to 'parts/filelist')
-rw-r--r--parts/filelist/Makefile.am20
-rw-r--r--parts/filelist/README.dox13
-rw-r--r--parts/filelist/fileinfo.h37
-rw-r--r--parts/filelist/filelist_item.cpp104
-rw-r--r--parts/filelist/filelist_item.h53
-rw-r--r--parts/filelist/filelist_widget.cpp300
-rw-r--r--parts/filelist/filelist_widget.h72
-rw-r--r--parts/filelist/kdevfilelist.desktop76
-rw-r--r--parts/filelist/kdevfilelist.rc24
-rw-r--r--parts/filelist/projectviewconfig.cpp47
-rw-r--r--parts/filelist/projectviewconfig.h38
-rw-r--r--parts/filelist/projectviewconfigbase.ui93
-rw-r--r--parts/filelist/projectviewpart.cpp585
-rw-r--r--parts/filelist/projectviewpart.h169
-rw-r--r--parts/filelist/projectviewprojectconfig.cpp41
-rw-r--r--parts/filelist/projectviewprojectconfig.h41
-rw-r--r--parts/filelist/projectviewprojectconfigbase.ui94
-rw-r--r--parts/filelist/toolbarguibuilder.cpp59
-rw-r--r--parts/filelist/toolbarguibuilder.h58
19 files changed, 1924 insertions, 0 deletions
diff --git a/parts/filelist/Makefile.am b/parts/filelist/Makefile.am
new file mode 100644
index 00000000..0d75e942
--- /dev/null
+++ b/parts/filelist/Makefile.am
@@ -0,0 +1,20 @@
+INCLUDES = -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/util $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevfilelist.la
+libkdevfilelist_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevfilelist_la_LIBADD = $(top_builddir)/lib/libkdevelop.la
+
+libkdevfilelist_la_SOURCES = filelist_widget.cpp filelist_item.cpp \
+ projectviewprojectconfigbase.ui projectviewprojectconfig.cpp projectviewpart.cpp toolbarguibuilder.cpp \
+ projectviewconfigbase.ui projectviewconfig.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevfilelist.desktop
+
+rcdir = $(kde_datadir)/kdevfilelist
+
+noinst_HEADERS = filelist_item.h filelist_widget.h projectviewprojectconfig.h \
+ projectviewpart.h toolbarguibuilder.h projectviewconfig.h fileinfo.h
+rc_DATA = kdevfilelist.rc
diff --git a/parts/filelist/README.dox b/parts/filelist/README.dox
new file mode 100644
index 00000000..cc2090a0
--- /dev/null
+++ b/parts/filelist/README.dox
@@ -0,0 +1,13 @@
+/** \class filelist
+This plugin provides a filelist selectview of the currently open files. This is quite handy
+when the tabbar isn't wide enough to show all open files.
+
+\feature Provides filestate feedback
+\feature Provides context menu for file operations
+
+\authors <a href="mailto:jens.dagerbo AT swipnet.se">Jens Dagerbo</a>
+
+\maintainer <a href="mailto:jens.dagerbo AT swipnet.se">Jens Dagerbo</a>
+
+
+*/
diff --git a/parts/filelist/fileinfo.h b/parts/filelist/fileinfo.h
new file mode 100644
index 00000000..0d4cb89f
--- /dev/null
+++ b/parts/filelist/fileinfo.h
@@ -0,0 +1,37 @@
+/***************************************************************************
+ * 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. *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include <kurl.h>
+
+struct FileInfo
+{
+ FileInfo() {url = KURL(); line = -1; col = -1; encoding = "";};
+ FileInfo(const KURL & _url, int _line = -1, int _col = -1, QString _encoding = "")
+ {url = _url; line = _line; col = _col; encoding = _encoding;};
+
+ bool operator==(const FileInfo & f) const {return (f.url == url) /*&& (f.line == line) && (f.col ==col)*/;};
+
+ KURL url;
+ int line;
+ int col;
+ QString encoding;
+};
+
+typedef QValueList<FileInfo> FileInfoList;
diff --git a/parts/filelist/filelist_item.cpp b/parts/filelist/filelist_item.cpp
new file mode 100644
index 00000000..d528cc2c
--- /dev/null
+++ b/parts/filelist/filelist_item.cpp
@@ -0,0 +1,104 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Jens Dagerbo *
+ * jens.dagerbo@swipnet.se *
+ * *
+ * 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 <kiconloader.h>
+#include <qfontmetrics.h>
+#include <qfileinfo.h>
+
+#include "filelist_item.h"
+
+#include <kiconloader.h>
+#include <kfileitem.h>
+
+FileListItem * FileListItem::s_activeItem = 0;
+
+FileListItem::FileListItem( QListView * parent, KURL const & url, DocumentState state )
+ : QListViewItem( parent, url.fileName() ),
+ _url( url )
+
+{
+ KFileItem fileItem( KFileItem::Unknown, KFileItem::Unknown, _url );
+ _icon = fileItem.pixmap(KIcon::SizeSmall);
+ setState( state );
+}
+
+KURL FileListItem::url()
+{
+ return _url;
+}
+
+DocumentState FileListItem::state( )
+{
+ return _state;
+}
+
+void FileListItem::setState( DocumentState state )
+{
+ _state = state;
+
+ switch( state )
+ {
+ case Clean:
+ setPixmap( 0, _icon);
+// setPixmap( 0, 0L );
+ break;
+ case Modified:
+ setPixmap( 0, SmallIcon("filesave") );
+ break;
+ case Dirty:
+ setPixmap( 0, SmallIcon("revert") );
+ break;
+ case DirtyAndModified:
+ setPixmap( 0, SmallIcon("stop") );
+ break;
+ }
+}
+
+void FileListItem::setHeight( int )
+{
+ QListViewItem::setHeight( KIcon::SizeSmall > listView()->fontMetrics().height() ? KIcon::SizeSmall : listView()->fontMetrics().height() );
+}
+
+void FileListItem::paintCell( QPainter * p, const QColorGroup & cg, int column, int width, int align )
+{
+ QColorGroup mcg = cg;
+
+ if ( isActive() )
+ {
+ mcg.setColor( QColorGroup::Base, Qt::yellow );
+ }
+
+ QListViewItem::paintCell( p, mcg, column, width, align );
+}
+
+bool FileListItem::isActive( )
+{
+ return ( s_activeItem == this );
+}
+
+//static
+void FileListItem::setActive( FileListItem * item )
+{
+ s_activeItem = item;
+}
+
+int FileListItem::compare( QListViewItem * i, int col, bool ascending ) const
+{
+ QFileInfo info1( key( col, ascending ) ); //this
+ QFileInfo info2( i->key( col, ascending ) ); //that
+ int fileComp = info1.fileName().compare( info2.fileName() );
+ if ( fileComp != 0 )
+ return fileComp;
+ else
+ return info1.extension().compare( info2.extension() );
+}
+
+// kate: space-indent off; indent-width 4; tab-width 4; show-tabs off;
diff --git a/parts/filelist/filelist_item.h b/parts/filelist/filelist_item.h
new file mode 100644
index 00000000..2b4019b8
--- /dev/null
+++ b/parts/filelist/filelist_item.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Jens Dagerbo *
+ * jens.dagerbo@swipnet.se *
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __FILELIST_ITEM_H__
+#define __FILELIST_ITEM_H__
+
+
+#include <qlistview.h>
+#include <qpixmap.h>
+
+#include <kurl.h>
+
+#include <kdevpartcontroller.h>
+
+class FileListItem : public QListViewItem
+{
+public:
+ FileListItem( QListView * parent, KURL const & url, DocumentState = Clean );
+
+ KURL url();
+
+ DocumentState state();
+ void setState( DocumentState );
+
+ bool isActive();
+ static void setActive( FileListItem * item );
+
+ virtual int compare( QListViewItem * i, int col, bool ascending ) const;
+private:
+ virtual void setHeight( int ); // override of QListViewItem::setHeight()
+ virtual void paintCell( QPainter * p, const QColorGroup & cg, int column, int width, int align ); // override of QListViewItem::paintCell()
+
+ KURL _url;
+ DocumentState _state;
+ QPixmap _icon;
+
+ static FileListItem * s_activeItem;
+
+};
+
+
+
+#endif
+
+// kate: space-indent off; indent-width 4; tab-width 4; show-tabs off;
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;
diff --git a/parts/filelist/filelist_widget.h b/parts/filelist/filelist_widget.h
new file mode 100644
index 00000000..5895103b
--- /dev/null
+++ b/parts/filelist/filelist_widget.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef __FILELIST_WIDGET_H__
+#define __FILELIST_WIDGET_H__
+
+
+#include <klistview.h>
+#include <kurl.h>
+#include <kdevpartcontroller.h> // for DocumentState
+
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qtimer.h>
+
+#include "projectviewpart.h"
+
+class KDevProject;
+class FileListItem;
+
+namespace KParts { class Part; }
+
+class FileListWidget : public KListView, public QToolTip
+{
+ Q_OBJECT
+
+public:
+
+ FileListWidget(ProjectviewPart *part, QWidget *parent=0);
+ ~FileListWidget();
+
+protected:
+ void maybeTip( QPoint const & );
+
+private slots:
+// void partAdded(KParts::Part*);
+// void partRemoved();
+ void activePartChanged(KParts::Part*);
+ void itemClicked( QListViewItem * );
+ void popupMenu( QListViewItem * , const QPoint & , int );
+ void closeSelectedFiles();
+ void saveSelectedFiles();
+ void reloadSelectedFiles();
+ void documentChangedState( const KURL &, DocumentState );
+ void refreshFileList();
+ void startRefreshTimer();
+ QStringList storeSelections();
+ void restoreSelections( const QStringList & list );
+
+private:
+ KURL::List getSelectedURLs();
+ FileListItem * itemForURL( KURL const & url );
+
+ QTimer m_refreshTimer;
+ ProjectviewPart * _part;
+
+};
+
+
+#endif
+
+// kate: space-indent off; indent-width 4; tab-width 4; show-tabs off;
diff --git a/parts/filelist/kdevfilelist.desktop b/parts/filelist/kdevfilelist.desktop
new file mode 100644
index 00000000..c3d097e4
--- /dev/null
+++ b/parts/filelist/kdevfilelist.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=Provides a list of all currently open files. (Handy when the tab bar is not quite wide enough.)
+Comment[ca]=Proporciona una llista de tots els fitxers oberts actualment. (Útil quan la barra de pestanyes no és suficientment ample)
+Comment[da]=Sørger for en liste over alle filer der er åbne. (Praktisk når tab-linjen ikke er helt bred nok.)
+Comment[de]=Stellt eine Liste aller offenen Dateien bereit.
+Comment[el]=Προσφέρει μια λίστα των τρέχων ανοιγμένων αρχείων. (Χρήσιμο όταν η γραμμή καρτελών δεν είναι αρκετά πλατιά.)
+Comment[es]=Proporciona una lista de los archivos abiertos actualmente (útil cuando la barra de pestañas no es lo suficientemente ancha).
+Comment[et]=Näitab kõiki parajasti avatud faile (mugav, kui kaardiriba ei ole piisavalt lai).
+Comment[eu]=Uneko irekitako fitxategien zerrenda eskeintzen du. (Erabilgarria fitxa-barra behar den bezain zabala ez bada)
+Comment[fa]=فهرستی از همۀ پرونده‌های باز جاری را فراهم می‌کند. )دستی هنگامی که میله ابزار پهنای کافی نداشته باشد.(
+Comment[fr]=Fournit une liste de tous les fichiers actuellement ouverts. (Pratique lorsque la barre d'onglets n'est plus assez large.)
+Comment[gl]=Proporciona unha lista de tódolos ficheiros abertos actualmente. (Útil cando a barra de pestañas non é suficientemente ancha.)
+Comment[hu]=Kilistázza a nyitott fájlokat. (Jól jöhet, ha a lapozósáv nem elég széles.)
+Comment[it]=Fornisce una lista di tutti i file aperti correntemente. (Utile quando la barra delle schede non è sufficientemente larga.)
+Comment[ja]=現在開かれているファイルのリストを提供します。(タブバーが十分広くない場合に便利です)
+Comment[ms]=Menyediakan senarai semua fail yang sedang dibuka. (Berguna apabila bar tab tidak cukup lebar.)
+Comment[nds]=Stellt en List vun all apen Dateien praat. (Goot, wenn de Paneelbalken nich wiet noog is.)
+Comment[ne]=हालै खुला फाइलको सूची प्रदान गर्दछ (ट्याब बार पर्याप्त चौडा नहुदा सजिलो हुन्छ)
+Comment[nl]=Geeft een lijst van alle open bestanden. (Handig als de tabbalk niet breed genoeg is.)
+Comment[pl]=Pokazuje listę obecnie otwartych plików (przydaje się, gdy pasek kart nie mieści wszystkich)
+Comment[pt]=Fornece uma lista de todos os ficheiros actualmente aberto. (Útil quando a barra de página não é suficientemente larga.)
+Comment[pt_BR]=Fornece uma lista de todos os arquivos atualmente abertos (acessível quando a barra de abas não for larga o suficiente).
+Comment[ru]=Список открытых в данных момент файлов (полезно, когда они не помещаются на панели вкладок).
+Comment[sk]=Poskytne zoznam všetkých aktuálne otvorených súborov. (Užitočné keď panel kariet nie je dostatočne široký.)
+Comment[sr]=Даје листу свих отворених фајлова. (Згодно кад трака са језичцима није довољно дугачка.)
+Comment[sr@Latn]=Daje listu svih otvorenih fajlova. (Zgodno kad traka sa jezičcima nije dovoljno dugačka.)
+Comment[sv]=Tillhandahåller en lista av alla för närvarande öppna filer. (Praktiskt när flikraden inte är riktigt bred nog.)
+Comment[ta]=தற்போது திறக்கப்பட்ட கோப்புகளின் பட்டியலை வழங்குகிறது. (தத்தல் போதுமான வசதியை வழங்க இயலாத பொழுது)
+Comment[tg]=Рӯйхати кушодашудагиҳои ҳозир будаи файлҳо (вақте ки онҳо дар панелмонӣ омехта намешаванд, фоидаовар аст.)
+Comment[tr]=Bütün açık dosyaların bir listesini sunar. (Sekme çubuğu yeteri kadar geniş olmadığında işe yarar)
+Comment[zh_CN]=提供目前已打开全部文件的列表。(当标签栏不够宽时非常实用。)
+Comment[zh_TW]=提供目前開啟檔案的列表。
+Name=KDevfilelist
+Name[da]=KDevelop filliste
+Name[nds]=KDevelop-Dateilist
+Name[pt_BR]=Lista de arq. do KDev
+Name[sk]=KDev zoznam súborov
+Name[sv]=KDevelop fillista
+Name[ta]=KDev கோப்புக்காட்சி
+Name[tg]=Рӯйхати файли KDev
+Name[zh_TW]=KDevelop 檔案列表
+GenericName=FileList
+GenericName[br]=Roll restr
+GenericName[da]=Filliste
+GenericName[de]=Dateiliste
+GenericName[el]=ΛίσταΑρχείων
+GenericName[eu]=Fitxategi zerrenda
+GenericName[fa]=فهرست پرونده
+GenericName[hu]=Fájllista
+GenericName[it]=ListaFile
+GenericName[ja]=ファイルリスト
+GenericName[ms]=SenaraiFail
+GenericName[nds]=Dateilist
+GenericName[ne]=फाइल सूची
+GenericName[nl]=Bestandenlijst
+GenericName[pl]=Lista plików
+GenericName[pt]=Lista de Ficheiros
+GenericName[pt_BR]=Lista de Arquivos
+GenericName[ru]=Список файлов
+GenericName[sk]=Zoznam súborov
+GenericName[sl]=Seznam datotek
+GenericName[sr]=Листа фајлова
+GenericName[sr@Latn]=Lista fajlova
+GenericName[sv]=Fillista
+GenericName[ta]=கோப்புப் பட்டியல்
+GenericName[tg]=Рӯйхати файлҳо
+GenericName[zh_CN]=文件列表
+GenericName[zh_TW]=檔案列表
+Icon=kdevelop
+ServiceTypes=KDevelop/Plugin
+X-KDevelop-Scope=Global
+X-KDE-Library=libkdevfilelist
+X-KDevelop-Version=5
+X-KDevelop-Properties=OpenFileNavigation
diff --git a/parts/filelist/kdevfilelist.rc b/parts/filelist/kdevfilelist.rc
new file mode 100644
index 00000000..5ab5de7c
--- /dev/null
+++ b/parts/filelist/kdevfilelist.rc
@@ -0,0 +1,24 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="filelist" version="3">
+<MenuBar>
+ <Menu name="view" >
+ <text>View</text>
+ <Separator/>
+ <Menu name="viewsession" >
+ <text>View Sessions</text>
+ <Action name="viewsession_new" />
+ <Action name="viewsession_open" />
+ <Action name="viewsession_save" />
+ <Action name="viewsession_delete" />
+ </Menu>
+ <Separator/>
+ </Menu>
+</MenuBar>
+<ToolBar name="viewsession_toolbar" >
+ <text>View Sessions Toolbar</text>
+ <Action name="viewsession_new" />
+ <Action name="viewsession_open" />
+ <Action name="viewsession_save" />
+ <Action name="viewsession_deletecurrent" />
+</ToolBar>
+</kpartplugin>
diff --git a/parts/filelist/projectviewconfig.cpp b/parts/filelist/projectviewconfig.cpp
new file mode 100644
index 00000000..fba2c6ca
--- /dev/null
+++ b/parts/filelist/projectviewconfig.cpp
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Jens Herden *
+ * jens.herden@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. *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#include "projectviewconfig.h"
+
+#include <qcheckbox.h>
+
+#include <kconfig.h>
+#include <kapplication.h>
+
+
+ProjectviewConfig::ProjectviewConfig(QWidget *parent, const char *name)
+ : ProjectviewConfigBase(parent, name)
+{
+ KConfig * config = kapp->config();
+ config->setGroup("File List Plugin");
+ inToolview->setChecked(config->readBoolEntry("ToolbarInToolview", true));
+ onlyProject->setChecked(config->readBoolEntry("OnlyProjectFiles", false));
+ closeOpenFiles->setChecked(config->readBoolEntry("CloseOpenFiles", true));
+}
+
+void ProjectviewConfig::accept()
+{
+ KConfig * config = kapp->config();
+ config->setGroup("File List Plugin");
+ config->writeEntry("ToolbarInToolview", inToolview->isChecked());
+ config->writeEntry("OnlyProjectFiles", onlyProject->isChecked());
+ config->writeEntry("CloseOpenFiles", closeOpenFiles->isChecked());
+}
+
+#include "projectviewconfig.moc"
diff --git a/parts/filelist/projectviewconfig.h b/parts/filelist/projectviewconfig.h
new file mode 100644
index 00000000..64cffd10
--- /dev/null
+++ b/parts/filelist/projectviewconfig.h
@@ -0,0 +1,38 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Jens Herden *
+ * jens.herden@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. *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef PROJECTVIEW_CONFIG_H
+#define PROJECTVIEW_CONFIG_H
+
+#include "projectviewconfigbase.h"
+
+
+class ProjectviewConfig: public ProjectviewConfigBase
+{
+ Q_OBJECT
+public:
+ ProjectviewConfig(QWidget *parent = 0, const char *name = 0);
+
+public slots:
+ void accept();
+
+};
+
+#endif
diff --git a/parts/filelist/projectviewconfigbase.ui b/parts/filelist/projectviewconfigbase.ui
new file mode 100644
index 00000000..7a0241db
--- /dev/null
+++ b/parts/filelist/projectviewconfigbase.ui
@@ -0,0 +1,93 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ProjectviewConfigBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ProjectviewConfigBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>File List</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>inToolview</cstring>
+ </property>
+ <property name="text">
+ <string>Display toolbar in toolview (note: change needs a restart)</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Uncheck this if you want the toolbar together with all other toolbars. You can disable it then</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Uncheck this if you want the toolbar together with all other toolbars. You can disable it then</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>onlyProject</cstring>
+ </property>
+ <property name="text">
+ <string>Only save project files in a session</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Check this if you want to ignore files that are not part of the project</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this if you want to ignore files that are not part of the project</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>closeOpenFiles</cstring>
+ </property>
+ <property name="text">
+ <string>Close all open files before opening a session</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Check this if you want the currently open files closed before opening a session</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this if you want the currently open files closed before opening a session</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>61</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/parts/filelist/projectviewpart.cpp b/parts/filelist/projectviewpart.cpp
new file mode 100644
index 00000000..56fc02c3
--- /dev/null
+++ b/parts/filelist/projectviewpart.cpp
@@ -0,0 +1,585 @@
+/***************************************************************************
+ * 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. *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "projectviewprojectconfig.h"
+#include "projectviewconfig.h"
+#include "projectviewpart.h"
+#include "filelist_widget.h"
+#include "toolbarguibuilder.h"
+
+#include <qtimer.h>
+#include <qpopupmenu.h>
+#include <qwhatsthis.h>
+#include <qvaluelist.h>
+#include <qmap.h>
+#include <qdir.h>
+#include <qdom.h>
+#include <qvbox.h>
+#include <qhbox.h>
+#include <qpoint.h>
+#include <qlayout.h>
+
+#include <kmainwindow.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+#include <kaction.h>
+#include <kdialogbase.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <ktexteditor/viewcursorinterface.h>
+#include <ktexteditor/encodinginterface.h>
+#include <kparts/part.h>
+#include <kxmlguibuilder.h>
+#include <kdebug.h>
+#include <kconfig.h>
+#include <kapplication.h>
+
+#include <kdevplugininfo.h>
+#include <kdevgenericfactory.h>
+#include <kdevpartcontroller.h>
+#include <kdevproject.h>
+#include <kdevcore.h>
+#include <kdevmainwindow.h>
+#include <configwidgetproxy.h>
+
+
+
+typedef KDevGenericFactory<ProjectviewPart> projectviewFactory;
+KDevPluginInfo data("kdevfilelist");
+K_EXPORT_COMPONENT_FACTORY(libkdevfilelist, projectviewFactory(data))
+
+#define GLOBALDOC_OPTIONS 1
+#define PROJECTDOC_OPTIONS 2
+
+ProjectviewPart::ProjectviewPart(QObject *parent, const char *name, const QStringList &/*args*/)
+ : KDevPlugin(&data, parent, name ? name : "FileListPart")
+{
+ setInstance(projectviewFactory::instance());
+ setXMLFile("kdevfilelist.rc");
+ setupActions();
+
+ m_configProxy = new ConfigWidgetProxy(core());
+ m_configProxy->createGlobalConfigPage(i18n("File List"), GLOBALDOC_OPTIONS, info()->icon());
+ m_configProxy->createProjectConfigPage(i18n("File List"), PROJECTDOC_OPTIONS, info()->icon());
+
+ connect(m_configProxy, SIGNAL(insertConfigWidget(const KDialogBase*, QWidget*, unsigned int)),
+ this, SLOT(insertConfigWidget(const KDialogBase*, QWidget*, unsigned int)));
+
+ connect(core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)));
+
+ connect(core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()));
+ connect(core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()));
+
+ KConfig * config = kapp->config();
+ config->setGroup("File List Plugin");
+ if (config->readBoolEntry("ToolbarInToolview", true))
+ {
+ m_toolbarWidget = new QVBox(0, "toolbarContainer");
+ m_toolbarWidget->setHidden(true);
+ m_guibuilder = new ToolbarGUIBuilder(m_toolbarWidget, mainWindow()->main());
+ setClientBuilder(m_guibuilder);
+ }
+ m_restored = false;
+ QTimer::singleShot(0, this, SLOT(init()));
+}
+
+ProjectviewPart::~ProjectviewPart()
+{
+ delete m_configProxy;
+ delete m_guibuilder;
+ if ( m_widget ) {
+ mainWindow()->removeView( m_widget );
+ delete m_widget; // deletes the children as well
+ }
+}
+
+void ProjectviewPart::restorePartialProjectSession(const QDomElement * el)
+{
+ m_projectViews.clear(); // remove the global views
+ m_restored = true;
+ if (!el)
+ {
+ return;
+ }
+ // get the base of the project
+ QString urlStr = project()->projectDirectory();
+ if (KURL::isRelativeURL(urlStr))
+ {
+ m_projectBase.setProtocol("file");
+ m_projectBase.setPath(urlStr);
+ } else
+ {
+ m_projectBase = KURL::fromPathOrURL(urlStr);
+ }
+ m_projectBase.adjustPath(+1); // just in case
+
+ // read all the views
+ QDomNodeList domList = el->elementsByTagName("projectview");
+
+ uint len = domList.length();
+ for (uint i = 0; i < len; ++i)
+ {
+ const QDomElement viewEl = domList.item(i).toElement();
+ if (viewEl.isNull())
+ {
+ continue;
+ }
+ FileInfoList urlList;
+ QDomNodeList fileList = viewEl.elementsByTagName("file");
+
+ uint len2 = fileList.length();
+ for (uint i2 = 0; i2 < len2; ++i2)
+ {
+ const QDomElement fileEl = fileList.item(i2).toElement();
+ if (!fileEl.isNull())
+ {
+ bool ok;
+ int line = -1;
+ QString attr = fileEl.attribute("line");
+ if (! attr.isNull())
+ {
+ line = attr.toInt(&ok);
+ if (!ok)
+ line = -1;
+ }
+ int col = -1;
+ attr = fileEl.attribute("col");
+ if (! attr.isNull())
+ {
+ col = attr.toInt(&ok);
+ if (!ok)
+ col = -1;
+ }
+ QString encoding = "";
+ attr = fileEl.attribute("encoding");
+ if (! attr.isNull())
+ {
+ encoding = attr;
+ }
+ QString urlStr = fileEl.attribute("url");
+ if (KURL::isRelativeURL(urlStr))
+ {
+ KURL url = m_projectBase;
+ url.addPath(urlStr);
+ urlList.append(FileInfo(url, line, col, encoding));
+ } else
+ urlList.append(FileInfo(KURL::fromPathOrURL(urlStr), line, col, encoding));
+ }
+ }
+ m_projectViews.insert(viewEl.attribute("name"), urlList);
+ }
+ // read default view
+ domList = el->elementsByTagName("defaultview");
+ if (domList.length() > 0)
+ {
+ m_defaultProjectView = domList.item(0).toElement().attribute("name");
+ if (!m_defaultProjectView.isEmpty())
+ {
+ slotOpenProjectView(m_defaultProjectView);
+ }
+ } else
+ {
+ m_defaultProjectView = "";
+ }
+}
+
+void ProjectviewPart::savePartialProjectSession(QDomElement * el)
+{
+ if (!el || m_projectViews.empty())
+ {
+ return;
+ }
+ QDomDocument domDoc = el->ownerDocument();
+ if (domDoc.isNull())
+ {
+ return;
+ }
+ // write all views
+ ViewMap::ConstIterator it;
+ for (it = m_projectViews.constBegin(); it != m_projectViews.constEnd(); ++it)
+ {
+ // we create the view even if there is no file inside, might be wanted by the user
+ QDomElement viewEl = domDoc.createElement("projectview");
+ viewEl.setAttribute("name", it.key());
+ el->appendChild(viewEl);
+ for (FileInfoList::ConstIterator it2 = it.data().constBegin(); it2 != it.data().constEnd(); ++it2)
+ {
+ QDomElement urlEl = domDoc.createElement("file");
+
+ if (m_projectBase.isParentOf((*it2).url))
+ urlEl.setAttribute("url", KURL::relativeURL(m_projectBase, (*it2).url));
+ else
+ urlEl.setAttribute("url", (*it2).url.url());
+ urlEl.setAttribute("line", (*it2).line);
+ urlEl.setAttribute("col", (*it2).col);
+ urlEl.setAttribute("encoding", (*it2).encoding);
+ viewEl.appendChild(urlEl);
+ }
+ }
+ // write the default view
+ QDomElement defaultEl = domDoc.createElement("defaultview");
+ defaultEl.setAttribute("name", m_defaultProjectView);
+ el->appendChild(defaultEl);
+}
+
+
+void ProjectviewPart::init()
+{
+ // delayed initialization stuff goes here
+
+ // create the toolview
+ m_widget = new QWidget(0, "filelist widget");
+ m_widget->setIcon( SmallIcon(info()->icon()) );
+ m_widget->setCaption(i18n("File List"));
+
+ QBoxLayout * l = new QVBoxLayout(m_widget);
+
+ // create the toolbar if needed
+ if (m_guibuilder)
+ {
+ m_toolbarWidget->reparent(m_widget, QPoint(0, 0), true);
+ l->addWidget(m_toolbarWidget);
+ QWhatsThis::add(m_toolbarWidget, i18n("<b>View Session Toolbar</b><p>This allows to create and work with view sessions. A view session is a set of open documents.</p>"));
+ }
+
+ // create the listview
+ QWidget * fileListWidget = new FileListWidget(this, m_widget);
+ fileListWidget->setCaption(i18n("File List"));
+ QWhatsThis::add(fileListWidget, i18n("<b>File List</b><p>This is the list of opened files.</p>"));
+ l->addWidget(fileListWidget);
+ m_widget->setFocusProxy(fileListWidget);
+
+ mainWindow()->embedSelectView(m_widget, i18n("File List"), i18n("Open files"));
+
+ if (!project())
+ readConfig();
+}
+
+void ProjectviewPart::setupActions()
+{
+ m_openPrjViewAction = new KSelectAction(i18n("Open Session..."), 0, actionCollection(), "viewsession_open");
+
+ connect(m_openPrjViewAction, SIGNAL(activated(const QString &)), this, SLOT(slotOpenProjectView(const QString &)));
+
+ m_openPrjViewAction->setToolTip(i18n("Open Session"));
+
+ m_savePrjViewAction = new KAction(i18n("Save Session"), "filesave", 0, this, SLOT(slotSaveProjectView()), actionCollection(), "viewsession_save");
+
+ m_newPrjViewAction = new KAction(i18n("New Session..."), "filenew", 0, this, SLOT(slotSaveAsProjectView()), actionCollection(), "viewsession_new");
+
+ m_deletePrjViewAction = new KSelectAction(i18n("Delete Session"), "editdelete", 0, actionCollection(), "viewsession_delete");
+
+ connect(m_deletePrjViewAction, SIGNAL(activated(const QString &)), this, SLOT(slotDeleteProjectView(const QString &)));
+
+ m_deletePrjViewAction->setToolTip(i18n("Delete Session"));
+
+ m_deleteCurrentPrjViewAction = new KAction(i18n("Delete Session"), "editdelete", 0, this, SLOT(slotDeleteProjectViewCurent()), actionCollection(), "viewsession_deletecurrent");
+
+ m_deleteCurrentPrjViewAction->setToolTip(i18n("Delete Session"));
+
+ adjustViewActions();
+}
+
+void ProjectviewPart::insertConfigWidget(const KDialogBase *dlg, QWidget *page, unsigned int pageNo)
+{
+// create configuraton dialogs here
+ switch (pageNo)
+ {
+ case PROJECTDOC_OPTIONS:
+ {
+ ProjectviewProjectConfig *w = new ProjectviewProjectConfig(this, page, "project config");
+ connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
+ break;
+ }
+ case GLOBALDOC_OPTIONS:
+ {
+ ProjectviewConfig *w = new ProjectviewConfig(page, "global config");
+ connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
+ break;
+ }
+ }
+}
+
+void ProjectviewPart::contextMenu(QPopupMenu */*popup*/, const Context */*context*/)
+{
+// put actions into the context menu here
+// if (context->hasType(Context::EditorContext))
+// {
+// // editor context menu
+// const EditorContext *econtext = static_cast<const EditorContext*>(context);
+//
+// // use context and plug actions here
+// // action->plug(popup);
+//
+// // or create menu items on the fly
+// // int id = -1;
+// // id = popup->insertItem(i18n("Do Something Here"),
+// // this, SLOT(doSomething()));
+// // popup->setWhatsThis(id, i18n("<b>Do something here</b><p>Describe here what does this action do."
+// }
+// else if (context->hasType(Context::FileContext))
+// {
+// // file context menu
+// const FileContext *fcontext = static_cast<const FileContext*>(context);
+//
+// //use context and plug actions here
+// }
+// else if (context->hasType(Context::ProjectModelItemContext))
+// {
+// // project tree context menu
+// const ProjectModelItemContext *pcontext = static_cast<const ProjectModelItemContext*>(context);
+//
+// // use context and plug actions here
+// }
+// else if (context->hasType(Context::CodeModelItemContext))
+// {
+// // class tree context menu
+// const CodeModelItemContext *mcontext = static_cast<const CodeModelItemContext*>(context);
+//
+// // use context and plug actions here
+// }
+// else if (context->hasType(Context::DocumentationContext))
+// {
+// // documentation viewer context menu
+// const DocumentationContext *dcontext = static_cast<const DocumentationContext*>(context);
+//
+// // use context and plug actions here
+// }
+}
+
+void ProjectviewPart::projectOpened()
+{
+ if ( !m_restored )
+ m_projectViews.clear(); // remove the global views
+ adjustViewActions();
+ m_restored = false;
+}
+
+void ProjectviewPart::projectClosed()
+{
+ m_projectBase = KURL();
+ m_defaultProjectView = "";
+ readConfig(); // read the global project views
+}
+
+void ProjectviewPart::slotOpenProjectView(const QString &view)
+{
+ KConfig * config = kapp->config();
+ config->setGroup("File List Plugin");
+ bool onlyProject = config->readBoolEntry("OnlyProjectFiles", false);
+ bool closeOpenFiles = config->readBoolEntry("CloseOpenFiles", true);
+
+ m_currentProjectView = view;
+
+ if (m_projectViews.contains(view) > 0)
+ {
+ FileInfoList viewUrls = m_projectViews[view];
+
+ if (closeOpenFiles)
+ {
+ // we close everything that is not part of the project view
+ KURL::List urlsToClose = partController()->openURLs();
+ for (KURL::List::Iterator it = urlsToClose.begin(); it != urlsToClose.end(); ++it)
+ {
+ // it is in the list of wanted files and do we want it at all
+ if ((viewUrls.contains(*it) > 0) && (!onlyProject || !project() || project()->isProjectFile((*it).path()) ))
+ {
+ viewUrls.remove(*it); // don't open if it is open already
+ it = urlsToClose.remove(it);
+ --it; // do not skip one
+ }
+ }
+ if (!urlsToClose.empty())
+ {
+ partController()->closeFiles(urlsToClose);
+ }
+ }
+ // we open what still needs to get opened
+ FileInfoList::const_iterator viewIt;
+ for (viewIt = viewUrls.begin(); viewIt != viewUrls.end(); ++viewIt)
+ {
+ if (!onlyProject || !project() || project()->isProjectFile((*viewIt).url.path()))
+ {
+ partController()->setEncoding( (*viewIt).encoding );
+ partController()->editDocument((*viewIt).url, (*viewIt).line, (*viewIt).col);
+ }
+ }
+ }
+ adjustViewActions();
+}
+
+
+void ProjectviewPart::slotSaveProjectView()
+{
+ slotSaveAsProjectView(m_currentProjectView.isEmpty());
+}
+
+
+void ProjectviewPart::adjustViewActions()
+{
+ QStringList viewList = getViewList();
+
+ m_openPrjViewAction->clear();
+ m_openPrjViewAction->setItems(viewList);
+ int i = viewList.findIndex(m_currentProjectView);
+ if (i > -1)
+ {
+ m_openPrjViewAction->setCurrentItem(i);
+ }
+ m_deletePrjViewAction->clear();
+ m_deletePrjViewAction->setItems(viewList);
+ m_currentProjectView = m_openPrjViewAction->currentText();
+ if (m_currentProjectView.isEmpty() && !viewList.empty())
+ {
+ m_currentProjectView = viewList.front();
+ }
+ bool haveView = !m_currentProjectView.isEmpty();
+ m_savePrjViewAction->setEnabled(haveView);
+ m_deleteCurrentPrjViewAction->setEnabled(haveView);
+}
+
+
+void ProjectviewPart::slotDeleteProjectViewCurent()
+{
+ slotDeleteProjectView(m_currentProjectView);
+}
+
+void ProjectviewPart::slotDeleteProjectView(const QString& view)
+{
+ m_projectViews.remove(view);
+
+ if (m_currentProjectView == view)
+ m_currentProjectView = "";
+
+ if (m_defaultProjectView == view)
+ m_defaultProjectView = "";
+
+ if (! project())
+ writeConfig();
+
+ adjustViewActions();
+}
+
+
+void ProjectviewPart::slotSaveAsProjectView(bool askForName)
+{
+ if (askForName)
+ {
+ bool ok;
+ QString newProjectView = KInputDialog::getText(i18n("Save View Session As"), i18n("Enter the name of the session:"), "", &ok, mainWindow()->main());
+ if (!ok)
+ {
+ return;
+ }
+ newProjectView = newProjectView.remove("="); // we use this string in config files and = would confuse it
+ if (m_projectViews.contains(newProjectView) > 0 &&
+ KMessageBox::warningContinueCancel(mainWindow()->main(), i18n("<qt>A view session named <b>%1</b> already exists.<br>Do you want to overwrite it?</qt>").arg(newProjectView), QString::null, i18n("Overwrite")) != KMessageBox::Continue)
+ {
+ return;
+ }
+ m_currentProjectView = newProjectView;
+ }
+
+ FileInfoList viewUrls;
+ KURL::List openURLs = partController()->openURLs();
+
+ for (KURL::List::Iterator it = openURLs.begin(); it != openURLs.end(); ++it)
+ {
+ // test if we have an editor
+ // FIXME this can fail if there are two parts with the same URL
+ KParts::ReadOnlyPart *ro_part = partController()->partForURL(*it);
+ KTextEditor::ViewCursorInterface* cursorIf = dynamic_cast<KTextEditor::ViewCursorInterface*>(ro_part->widget());
+ if (cursorIf)
+ {
+ QString encoding;
+ if ( KTextEditor::EncodingInterface * ei = dynamic_cast<KTextEditor::EncodingInterface*>( ro_part ) )
+ {
+ QString temp = ei->encoding();
+ if ( !temp.isNull() )
+ {
+ encoding = temp;
+ }
+ }
+
+ unsigned int line, col;
+ cursorIf->cursorPositionReal(&line, &col);
+ viewUrls.append(FileInfo(*it, line, col, encoding));
+ }
+ }
+ // add or overwrite the values
+ m_projectViews.insert(m_currentProjectView, viewUrls, true);
+ if (! project())
+ writeConfig();
+
+ adjustViewActions();
+}
+
+
+void ProjectviewPart::writeConfig()
+{
+ KConfig * config = kapp->config();
+ config->deleteGroup("ProjectViews", true);
+ config->setGroup("ProjectViews");
+
+ // write all views
+ ViewMap::ConstIterator it;
+ for (it = m_projectViews.constBegin(); it != m_projectViews.constEnd(); ++it)
+ {
+ // we create the view even if there is no file inside, might be wanted by the user
+ QStringList urls;
+ for (FileInfoList::ConstIterator it2 = it.data().constBegin(); it2 != it.data().constEnd(); ++it2)
+ {
+ if ((*it2).encoding.isEmpty())
+ urls.append((*it2).url.url());
+ else
+ urls.append((*it2).url.url() + ";" + (*it2).encoding);
+ }
+ config->writeEntry(it.key(), urls);
+ }
+}
+
+
+void ProjectviewPart::readConfig()
+{
+ KConfig * config = kapp->config();
+ QMap<QString, QString> entries = config->entryMap("ProjectViews");
+
+ m_projectViews.clear();
+ QMap<QString, QString>::ConstIterator it;
+ for (it = entries.constBegin(); it != entries.constEnd(); ++it)
+ {
+ FileInfoList urlList;
+ QStringList urls = QStringList::split(",", it.data());
+ for (QStringList::Iterator it2 = urls.begin(); it2 != urls.end(); ++it2 )
+ {
+ // search the encoding. The entry can be like: fileURL;encoding
+ QStringList file = QStringList::split(";", *it2);
+ if (file.count() == 1)
+ urlList.append(FileInfo(KURL::fromPathOrURL(*it2)));
+ else
+ urlList.append(FileInfo(KURL::fromPathOrURL(file.first()), -1, -1, file.last()));
+ }
+ m_projectViews.insert(it.key(), urlList);
+ }
+ adjustViewActions();
+}
+
+#include "projectviewpart.moc"
diff --git a/parts/filelist/projectviewpart.h b/parts/filelist/projectviewpart.h
new file mode 100644
index 00000000..50cd5391
--- /dev/null
+++ b/parts/filelist/projectviewpart.h
@@ -0,0 +1,169 @@
+/***************************************************************************
+ * 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. *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef KDEVPROJECTVIEW_H
+#define KDEVPROJECTVIEW_H
+
+#include "fileinfo.h"
+
+#include <qvaluelist.h>
+#include <qmap.h>
+#include <qguardedptr.h>
+
+#include <kdevplugin.h>
+#include <kurl.h>
+
+
+class QPopupMenu;
+class KAction;
+class KSelectAction;
+class KDialogBase;
+class Context;
+class ConfigWidgetProxy;
+class FileListWidget;
+class KToolBar;
+class QVBox;
+class ToolbarGUIBuilder;
+
+
+
+/**
+Please read the README.dox file for more info about this part
+
+this is a reimplementation of the project views in Quanta
+
+@TODO find a way to control the toolbar again
+@TODO save html parts too
+FIXME at project open I get the default view and the open files at last close
+*/
+class ProjectviewPart: public KDevPlugin
+{
+ Q_OBJECT
+public:
+
+ typedef QMap<QString, FileInfoList> ViewMap;
+// typedef QMap<KURL, FileInfo> FileInfoMap;
+
+
+ ProjectviewPart(QObject *parent, const char *name, const QStringList &args);
+ ~ProjectviewPart();
+
+ // reimplemented from KDevPlugin
+ void restorePartialProjectSession(const QDomElement * el);
+ void savePartialProjectSession(QDomElement * el);
+
+ /**
+ *
+ * @return the current defaut view
+ */
+ inline QString getDefaultView() const {return m_defaultProjectView;};
+
+ /**
+ *
+ * @param view new default view
+ */
+ inline void setDefaultView(const QString& view) {m_defaultProjectView = view;};
+
+ /**
+ * get all current views
+ * @return QStringList of defined views
+ */
+ inline QStringList getViewList() const {return m_projectViews.keys();};
+
+private slots:
+ void init();
+
+ void insertConfigWidget(const KDialogBase *dlg, QWidget *page, unsigned int pageNo);
+ void contextMenu(QPopupMenu *popup, const Context *context);
+ void projectOpened();
+ void projectClosed();
+
+ /** Deletes a project view
+ *
+ * @param view name of the project view
+ */
+ void slotDeleteProjectView(const QString &view);
+
+ /**
+ * Deletes the current project view
+ */
+ void slotDeleteProjectViewCurent();
+
+ /**
+ * Saves a project view
+ *
+ * @param askForName true = show a dialog for the name
+ */
+ void slotSaveAsProjectView(bool askForName = true);
+
+ /** Saves the current project view
+ */
+ void slotSaveProjectView();
+
+ /** Opens a project view
+ *
+ * @param view name of the project view
+ */
+ void slotOpenProjectView(const QString &view);
+
+private:
+ /**
+ * create and initialize the actions
+ */
+ void setupActions();
+
+ /**
+ * Change the actions according to the current available views
+ */
+ void adjustViewActions();
+
+ /**
+ * write the views to the plugin config file
+ */
+ void writeConfig();
+
+ /**
+ * read the views from the plugin config file
+ */
+ void readConfig();
+
+ ViewMap m_projectViews; //container for the views
+
+ KAction *m_savePrjViewAction;
+ KAction *m_newPrjViewAction;
+ KAction *m_deleteCurrentPrjViewAction;
+ KSelectAction *m_openPrjViewAction;
+ KSelectAction *m_deletePrjViewAction;
+
+ QString m_currentProjectView;
+ QString m_defaultProjectView; // load this after project loaded
+
+ KURL m_projectBase; // project base folder
+ ConfigWidgetProxy *m_configProxy;
+
+ QGuardedPtr<QWidget> m_widget;
+ QGuardedPtr<ToolbarGUIBuilder> m_guibuilder;
+ QWidget * m_toolbarWidget;
+
+ bool m_restored;
+};
+
+
+#endif
diff --git a/parts/filelist/projectviewprojectconfig.cpp b/parts/filelist/projectviewprojectconfig.cpp
new file mode 100644
index 00000000..eb2d1b49
--- /dev/null
+++ b/parts/filelist/projectviewprojectconfig.cpp
@@ -0,0 +1,41 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Jens Herden *
+ * jens.herden@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. *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include <kcombobox.h>
+
+#include "projectviewprojectconfig.h"
+
+#include "projectviewpart.h"
+
+ProjectviewProjectConfig::ProjectviewProjectConfig(ProjectviewPart *part, QWidget *parent, const char *name)
+ : ProjectviewProjectConfigBase(parent, name), m_part(part)
+{
+ kComboDefault->clear();
+ kComboDefault->insertItem("");
+ kComboDefault->insertStringList( m_part->getViewList() );
+ kComboDefault->setCurrentItem( m_part->getDefaultView() );
+}
+
+void ProjectviewProjectConfig::accept()
+{
+ m_part->setDefaultView( kComboDefault->currentText() );
+}
+
+#include "projectviewprojectconfig.moc"
diff --git a/parts/filelist/projectviewprojectconfig.h b/parts/filelist/projectviewprojectconfig.h
new file mode 100644
index 00000000..03928642
--- /dev/null
+++ b/parts/filelist/projectviewprojectconfig.h
@@ -0,0 +1,41 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Jens Herden *
+ * jens.herden@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. *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef PROJECTVIEW_PROJECT_CONFIG_H
+#define PROJECTVIEW_PROJECT_CONFIG_H
+
+#include "projectviewprojectconfigbase.h"
+
+class ProjectviewPart;
+
+class ProjectviewProjectConfig: public ProjectviewProjectConfigBase
+{
+ Q_OBJECT
+public:
+ ProjectviewProjectConfig(ProjectviewPart *part, QWidget *parent = 0, const char *name = 0);
+
+public slots:
+ void accept();
+
+private:
+ ProjectviewPart *m_part;
+};
+
+#endif
diff --git a/parts/filelist/projectviewprojectconfigbase.ui b/parts/filelist/projectviewprojectconfigbase.ui
new file mode 100644
index 00000000..7ff9a0b0
--- /dev/null
+++ b/parts/filelist/projectviewprojectconfigbase.ui
@@ -0,0 +1,94 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ProjectviewProjectConfigBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ProjectviewProjectConfigBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Projectviews</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Open this session after project load:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>kComboDefault</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>select a session</string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>265</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>71</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+</includehints>
+</UI>
diff --git a/parts/filelist/toolbarguibuilder.cpp b/parts/filelist/toolbarguibuilder.cpp
new file mode 100644
index 00000000..2e82691b
--- /dev/null
+++ b/parts/filelist/toolbarguibuilder.cpp
@@ -0,0 +1,59 @@
+/***************************************************************************
+ * 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. *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "toolbarguibuilder.h"
+
+#include <ktoolbar.h>
+
+ToolbarGUIBuilder::ToolbarGUIBuilder(QWidget *parent, QWidget *widget)
+ : KXMLGUIBuilder(widget), KToolBar(parent, "ToolbarGUIbuilder"), m_parent(parent)
+{
+// setHidden(true);
+ setFrameStyle(0);
+}
+
+
+ToolbarGUIBuilder::~ToolbarGUIBuilder()
+{
+}
+
+QWidget * ToolbarGUIBuilder::createContainer(QWidget *parent, int index, const QDomElement &element, int &id)
+{
+ if (element.tagName().lower() == "toolbar")
+ {
+ reparent(m_parent, QPoint(0, 0), true);
+ return this;
+ } else
+ {
+ return KXMLGUIBuilder::createContainer(parent, index, element, id);
+ }
+}
+
+void ToolbarGUIBuilder::removeContainer(QWidget *container, QWidget *parent, QDomElement &element, int id)
+{
+ if (container == this)
+ {
+ // i need to reparent to prevent a crash
+ reparent(0, QPoint(0, 0));
+ }
+ else
+ KXMLGUIBuilder::removeContainer(container, parent, element, id);
+}
+
diff --git a/parts/filelist/toolbarguibuilder.h b/parts/filelist/toolbarguibuilder.h
new file mode 100644
index 00000000..1f92b922
--- /dev/null
+++ b/parts/filelist/toolbarguibuilder.h
@@ -0,0 +1,58 @@
+/***************************************************************************
+ * 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. *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef TOOLBARGUIBUILDER_H
+#define TOOLBARGUIBUILDER_H
+
+#include <kxmlguibuilder.h>
+#include <kdebug.h>
+#include <ktoolbar.h>
+
+
+/**
+* Reimplemented the KXMLGUIBuilder in order use our toolbar in the
+* toolview
+* @author Jens Herden
+*/
+class ToolbarGUIBuilder : public KXMLGUIBuilder, public KToolBar
+{
+public:
+ ToolbarGUIBuilder(QWidget *parent, QWidget *widget);
+
+ virtual ~ToolbarGUIBuilder();
+
+ /**
+ * Called when a new XML gui client is added to the gui factory.
+ */
+ virtual QWidget *createContainer(QWidget *parent, int index, const QDomElement &element, int &id);
+
+ /**
+ * Called when a XML gui client is removed the gui factory.
+ * Reimplemented from KXMLGUIBuilder in order to remove our custom toolbar.
+ */
+ virtual void removeContainer(QWidget *container, QWidget *parent, QDomElement &element, int id);
+
+private:
+ QWidget * m_parent;
+};
+
+
+
+#endif