You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeadmin/kpackage/packageDisplay.cpp

440 lines
11 KiB

/*
** Copyright (C) 1999,2000 Toivo Pedaste <toivo@ucs.uwa.edu.au>
**
// Author: Damyan Pepper
// Author: Toivo Pedaste
*/
/*
** 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 in a file called COPYING; if not, write to
** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
** MA 02110-1301, USA.
*/
/*
** Bug reports and questions can be sent to kde-devel@kde.org
*/
#include "../config.h"
// Standard headers
#include <stdio.h>
// TQt headers
#include <tqapplication.h>
#include <tqfileinfo.h>
#include <textedit.h>
#include <kdebug.h>
#include <kiconloader.h>
#include <kglobal.h>
#include <krun.h>
#include <kopenwith.h>
// kpackage.headers
#include "kpackage.h"
#include "packageDisplay.h"
#include "packageProperties.h"
#include "pkgInterface.h"
#include "utils.h"
#include "options.h"
#include <klocale.h>
extern Opts *opts;
// constructor
packageDisplayWidget::packageDisplayWidget(TQWidget *parent)
: TQTabWidget(parent)
{
// Initially we're not dealing with any package
package=NULL;
// Set up the widgets
setupWidgets();
// Load the pixmaps
tick = UserIcon("ptick");
cross = UserIcon("cross");
question = UserIcon("question");
blank = new TQPixmap();
}
packageDisplayWidget::~packageDisplayWidget()
{
delete blank;
}
void packageDisplayWidget::setupWidgets()
{
proptab = new TQVBox( this);
curTab = proptab;
fltab = new TQVBox( this);
cltab = new TQVBox( this);
packageProperties = new packagePropertiesWidget(proptab);
fileList = new kpFileList(fltab, this);
connect(fileList, TQT_SIGNAL(executed(TQListViewItem *)),
this, TQT_SLOT( openBinding(TQListViewItem *)) );
connect(fileList, TQT_SIGNAL(returnPressed(TQListViewItem *)),
this, TQT_SLOT( openBinding(TQListViewItem *)) );
changeLog = new TQTextEdit(cltab);
addTab(proptab, i18n("Properties"));
addTab(fltab, i18n("File List"));
addTab(cltab, i18n("Change Log"));
if (isTabEnabled(cltab))
setTabEnabled(cltab,false);
if (isTabEnabled(fltab))
setTabEnabled(fltab,false);
if (isTabEnabled(proptab))
setTabEnabled(proptab,false);
connect(this,TQT_SIGNAL(currentChanged(TQWidget *)), this, TQT_SLOT(tabSelected(TQWidget *)));
}
void packageDisplayWidget::tabSelected(TQWidget *tab)
{
curTab = tab;
tabSet(tab);
}
void packageDisplayWidget::tabSet(TQWidget *tab)
{
disconnect(this,TQT_SIGNAL(currentChanged(TQWidget *)), this, TQT_SLOT(tabSelected(TQWidget *)));
if(tab == proptab) {
packageProperties->show();
fileList->hide();
changeLog->hide();
setCurrentPage(0);
} else if (tab == fltab) {
packageProperties->hide();
changeLog->hide();
if (isTabEnabled(fltab)) {
if (!initList) {
updateFileList();
initList = 1;
}
fileList->show();
} else {
fileList->hide();
}
setCurrentPage(1);
} else {
fileList->hide();
packageProperties->hide();
if (isTabEnabled(cltab)) {
updateChangeLog();
changeLog->show();
} else {
changeLog->hide();
}
setCurrentPage(2);
}
connect(this,TQT_SIGNAL(currentChanged(TQWidget *)), this, TQT_SLOT(tabSelected(TQWidget *)));
}
void packageDisplayWidget::noPackage()
{
disconnect(this,TQT_SIGNAL(currentChanged(TQWidget *)), this, TQT_SLOT(tabSelected(TQWidget *)));
if (isTabEnabled(fltab)) {
fileList->setColumnText(0,"");
setTabEnabled(fltab,false);
}
if (isTabEnabled(proptab))
setTabEnabled(proptab,false);
if (isTabEnabled(cltab))
setTabEnabled(cltab,false);
packageProperties->changePackage(NULL);
packageProperties->setText("");
fileList->clear();
changeLog->setText("");
connect(this,TQT_SIGNAL(currentChanged(TQWidget *)), this, TQT_SLOT(tabSelected(TQWidget *)));
}
// Change packages
void packageDisplayWidget::changePackage(packageInfo *p)
{
// This is to stop selectionChanged firing off here
disconnect(fileList, TQT_SIGNAL(executed(TQListViewItem *)),
this, TQT_SLOT( openBinding(TQListViewItem *)) );
disconnect(fileList, TQT_SIGNAL(returnPressed(TQListViewItem *)),
this, TQT_SLOT( openBinding(TQListViewItem *)) );
disconnect(fileList, TQT_SIGNAL(contextMenu(KListView *, TQListViewItem *, const TQPoint &)),
fileList, TQT_SLOT( openContext(KListView *, TQListViewItem *, const TQPoint &)) );
if (package && package != p) {
if (!package->getItem() && !kpackage->management->allPackages->find(package)) {
delete package;
package = 0;
}
}
package = p;
if (!p) { // change to no package
noPackage();
} else {
TQString u = package->getFilename();
if (!package->updated && !u.isEmpty()) {
packageInfo *np = package->interface->getPackageInfo('u', u, 0);
if (np) {
TQMap<TQString, TQString>::Iterator it; // update info entries in p
for ( it = np->info.begin(); it != np->info.end(); ++it ) {
package->info.replace(it.key(),it.data());
}
package->interface = np->interface;
delete np;
package->updated = TRUE;
}
}
initList = 0;
packageProperties->changePackage(package);
if (package->interface->changeTab(package))
setTabEnabled(cltab,true);
else
setTabEnabled(cltab,false);
if (package->interface->filesTab(package))
setTabEnabled(fltab,true);
else
setTabEnabled(fltab,false);
setTabEnabled(proptab,true);
tabSet(curTab);
}
connect(fileList, TQT_SIGNAL(executed(TQListViewItem *)),
this, TQT_SLOT( openBinding(TQListViewItem *)) );
connect(fileList, TQT_SIGNAL(returnPressed(TQListViewItem *)),
this, TQT_SLOT( openBinding(TQListViewItem *)) );
connect(fileList, TQT_SIGNAL(contextMenu(KListView *, TQListViewItem *, const TQPoint &)),
fileList, TQT_SLOT( openContext(KListView *, TQListViewItem *, const TQPoint &)) );
}
void packageDisplayWidget::updateChangeLog()
{
if (!package)
return;
TQStringList lines;
TQString stmp;
lines = package->interface->getChangeLog(package);
changeLog->setTextFormat(TQt::LogText);
changeLog->hide();
if (lines.count() > 1) {
changeLog->setText("");
for (TQStringList::ConstIterator it = lines.begin();
(it != lines.end());
it++) {
if (! (*it).isEmpty())
changeLog->append(*it);
else
changeLog->append(" ");
}
} else {
changeLog->setText(i18n(" - No change log -"));
}
changeLog->show();
changeLog->setContentsPos(0,0);
}
void packageDisplayWidget::updateFileList()
{
if (!package)
return;
// Get a list of files in the package
TQStringList files;
TQStringList errorfiles;
// set the status
kpackage->setStatus(i18n("Updating File List"));
// clear the file list
fileList->clear();
// Check if the package is installed
int installed;
if(package->getFilename().isEmpty()) {
if(package->packageState == packageInfo::UPDATED) {
fileList->setColumnText(0, "");
return;
} else
installed=1;
} else
installed=0;
files = package->interface->getFileList(package);
if (files.count() == 0)
return;
// Get a list of files that failed verification
if(installed && opts->VerifyFL) {
errorfiles = package->interface->verify(package, files);
}
kpackage->setStatus(i18n("Updating File List"));
uint c=0, p=0;
uint step = (files.count() / 100) + 1;
TQString ftmp;
ftmp.setNum(files.count());
ftmp += i18n(" Files");
fileList->setColumnText(0, ftmp);
fileList->hide();
fileList->setSorting(-1);
TQListViewItem *q;
// Go through all the files
for (TQStringList::ConstIterator it = files.begin(); (it != files.end()); ) {
// Update the status progress
c++;
if(c > step) {
c=0;
p++;
kpackage->setPercent(p);
}
int error=0;
TQString cur = *it;
it++;
TQPixmap pixmap;
if (installed) { // see if file failed verification,
if ( errorfiles.count() > 0) {
for( TQStringList::ConstIterator itError = errorfiles.begin();
(itError != errorfiles.end());
(itError++) ) {
if (cur == *itError) {
error = 1;
}
}
}
if(error) pixmap=cross;
else
pixmap=tick;
} else
pixmap=question;
q = fileList->insert(cur, pixmap);
}
fileList->setSorting(0);
fileList->show();
kpackage->setPercent(100);
}
kpFileList::kpFileList(TQWidget* parent, packageDisplayWidget* parent2) : KListView(parent)
{
hide();
addColumn("name");
setRootIsDecorated(TRUE);
connect(this, TQT_SIGNAL(contextMenu(KListView *, TQListViewItem *, const TQPoint &)),
this, TQT_SLOT( openContext(KListView *, TQListViewItem *, const TQPoint &)) );
FileListMenu = new KPopupMenu();
openwith = FileListMenu->insertItem(i18n("&Open With..."),parent2,TQT_SLOT(__openBindingWith()));
pkDisplay = parent2;
}
void packageDisplayWidget::__openBindingWith()
{
openBindingWith(fileList->selectedItem());
}
void packageDisplayWidget::openBindingWith(TQListViewItem *index)
{
if ( !index ) return;
KURL url;
if (package && package->packageState == packageInfo::INSTALLED) {
url.setPath( fileList->item2Path(index) ); // from local file to URL
KRun::displayOpenWithDialog(KURL::List(url) );
}
}
void kpFileList::openContext(KListView *, TQListViewItem *, const TQPoint &p)
{
FileListMenu->setItemEnabled(openwith,
(selectedItem() && pkDisplay->package && pkDisplay->package->getFilename().isEmpty()) ? TRUE : FALSE);
FileListMenu->exec(p);
}
void kpFileList::clear()
{
KListView::clear();
}
TQString kpFileList::item2Path(TQListViewItem *it)
{
TQString res;
res = it ? it->text(0) : NULL;
return res;
}
TQListViewItem* kpFileList::insert(const TQString &cur, const TQPixmap &pixmap)
{
TQListViewItem* q;
q = new TQListViewItem(this, cur);
if (q)
q->setPixmap(0,pixmap);
return q;
}
void packageDisplayWidget::openBinding(TQListViewItem *index)
{
if ( !index ) return;
KURL url;
if (package && package->packageState == packageInfo::INSTALLED) {
url.setPath( fileList->item2Path(index) ); // from local file to URL
(void) new KRun ( url ); // run the URL
}
}
#include "packageDisplay.moc"