dialog parent fix, etc
[fapman] / mainwindow.cpp
1 /*
2         This file is part of Faster Application Manager.
3
4         Faster Application Manager is free software: you can redistribute it and/or modify
5         it under the terms of the GNU General Public License as published by
6         the Free Software Foundation, either version 3 of the License, or
7         (at your option) any later version.
8
9         Faster Application Manager is distributed in the hope that it will be useful,
10         but WITHOUT ANY WARRANTY; without even the implied warranty of
11         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12         GNU General Public License for more details.
13
14         You should have received a copy of the GNU General Public License
15         along with Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
16
17         (C) Heikki Holstila 2010
18 */
19
20 #ifdef MYDEF_GTK_EXISTS
21 #include <gdk/gdk.h>
22 #include <gtk/gtk.h>
23 #endif
24
25 #include <QtCore>
26 #include <QtGui>
27 #include <QDBusConnection>
28 #include <QDBusInterface>
29 #include <phonon/AudioOutput>
30 #include <phonon/MediaObject>
31
32 #ifdef Q_WS_MAEMO_5
33 #include <QtMaemo5>
34 #endif
35
36 #include "mainwindow.h"
37 #include "version.h"
38 #include "ui_mainwindow.h"
39 #include "aaptinterface.h"
40 #include "packageview.h"
41 #include "confirmdialog.h"
42 #include "dimmer.h"
43 #include "repoview.h"
44 #include "help.h"
45 #include "settings.h"
46 #include "logview.h"
47 #include "rotatingbackground.h"
48 #include "dpkginterface.h"
49
50
51 MainWindow::MainWindow(QWidget *parent) :
52     QMainWindow(parent),
53     ui(new Ui::MainWindow)
54 {
55     ui->setupUi(this);
56
57         iAptInterface = new AAptInterface(this);
58         iWinPackageView = new PackageView(this);
59         iWinPackageView->setAptInterface(iAptInterface);
60         iWinRepoView = new RepoView(this);
61         iWinRepoView->setAptInterface(iAptInterface);
62         iSettings = new Settings(this);
63         iSettings->setAptInterface(iAptInterface);
64         iSettings->setPackageView(iWinPackageView);
65         iWinPackageView->setSettings(iSettings);
66         iAptInterface->setSettings(iSettings);
67         iDpkgInterface = new DpkgInterface(this);
68
69         iWinPackageView->setSortOrder( (PackageView::sortOrder)iSettings->qsettings()->value("default_sort_order",0).toInt() );
70
71         iWinPackageView->setSearchOptions( iSettings->qsettings()->value("search_pkgnames",true).toBool(),
72                                                                            iSettings->qsettings()->value("search_displaynames",true).toBool(),
73                                                                            iSettings->qsettings()->value("search_descshort",true).toBool(),
74                                                                            iSettings->qsettings()->value("search_desclong",false).toBool() );
75
76 #ifdef Q_WS_MAEMO_5
77         this->setAttribute(Qt::WA_Maemo5StackedWindow);
78         if( !iSettings->qsettings()->value("disable_autorotation",false).toBool() ) {
79                 this->setAttribute(Qt::WA_Maemo5AutoOrientation);
80         } else {
81                 this->setAttribute(Qt::WA_Maemo5LandscapeOrientation);
82         }
83 #endif
84
85         iDimmer = new dimmer(this);
86
87         iReposAutoUpdating = false;
88         iUpgradeAutoUpdate = true;
89         iNextOperation = OpNone;
90
91         ui->centralWidget->loadWallpaper();
92
93         QString stylesheet_mainscreen =
94                         "QPushButton {"
95                         "border-radius: 16px;"
96                         "border-width: 1px;"
97                         "border-color: palette(light);"
98                         "border-style: outset;"
99                         "padding-right: 10px;"
100                         "padding-left: 10px;"
101                         "color: palette(buttontext);"
102                         "background: rgba(255,255,255,80);"
103                         "}"
104                         "QPushButton:pressed {"
105                         "border-style: inset;"
106                         "background-color: rgba(255,255,255,150);"
107                         "}";
108
109         if( ((QApplication*)QApplication::instance())->styleSheet().isEmpty() )
110         {
111                 QString stylesheet_file;
112                 QFile f("/root/.fapman/style.css");
113                 if( f.open(QIODevice::ReadOnly | QIODevice::Text ) )
114                 {
115                         while(!f.atEnd()) {
116                                 stylesheet_file += f.readLine().trimmed();
117                         }
118                         f.close();
119                 }
120
121                 if( stylesheet_file.isEmpty() ) {
122                         ui->centralWidget->setStyleSheet(stylesheet_mainscreen);
123                 } else {
124                         ((QApplication*)QApplication::instance())->setStyleSheet(stylesheet_file);
125                 }
126         }
127
128
129         /*
130         // does not work
131
132         QDBusConnection conn = QDBusConnection::connectToBus(QDBusConnection::SystemBus, "faster_application_manager");
133
134         QString service = "com.nokia.icd";
135         QString path = "/com/nokia/icd";
136         QString method = "connect";
137
138         QDBusInterface net(service, path, service, conn, this);
139         net.call(method,"[ANY]",0);
140         */
141
142         iMediaObject = new Phonon::MediaObject(this);
143         Phonon::AudioOutput* aout = new Phonon::AudioOutput(Phonon::NotificationCategory, this);
144         Phonon::createPath(iMediaObject, aout);
145 }
146
147 MainWindow::~MainWindow()
148 {
149         // save "need repo refresh" status
150         iSettings->qsettings()->setValue("need_repo_refresh", iAptInterface->needRepoRefresh());
151
152         delete iWinPackageView;
153         delete iWinRepoView;
154         delete iAptInterface;
155         delete iDpkgInterface;
156         delete iDimmer;
157         delete iSettings;
158     delete ui;
159 }
160
161 void MainWindow::changeEvent(QEvent *e)
162 {
163     QMainWindow::changeEvent(e);
164     switch (e->type()) {
165     case QEvent::LanguageChange:
166         ui->retranslateUi(this);
167         break;
168     default:
169         break;
170     }
171 }
172
173 void MainWindow::on_btnRepos_clicked()
174 {
175         iWinRepoView->openWin();
176 }
177
178 void MainWindow::on_btnUpdate_clicked()
179 {       
180         // update catalogs
181
182         busyDialog(true, tr("Operation in progress"), tr("Updating catalogs"));
183
184         iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate);
185         iAptInterface->run(iDimmer);
186 }
187
188 #ifdef Q_WS_MAEMO_5
189 int MainWindow::top_application()
190 {
191         show();
192         activateWindow();
193         raise();
194         return 0;
195 }
196 #endif
197
198 void MainWindow::dateFetchAsk()
199 {
200         if( !iSettings->qsettings()->value("firstrun_asked_fetch_dates",false).toBool() &&
201                 !iSettings->qsettings()->value("fetch_dates",false).toBool() )
202         {
203                 iSettings->qsettings()->setValue("firstrun_asked_fetch_dates", true);
204                 ConfirmDialog d(true, this);
205                 d.setText("Fetch date information?","Enable date information fetching for packages? You have to enable it in order to be "
206                                   "able to sort packages by date. The first fetch can be slow but the dates are cached for later use. You can later "
207                                   "change this selection from the options menu.");
208                 if( d.exec() )
209                         iSettings->qsettings()->setValue("fetch_dates", true);
210         }
211         if( iSettings->qsettings()->value("fetch_dates",false).toBool() )
212         {
213                 iSettings->qsettings()->setValue("firstrun_asked_fetch_dates", true);   // don't ask if the option has already been enabled
214                 if( !iAptInterface->dateCacheExists() )
215                 {
216                         ConfirmDialog d(false, this);
217                         d.setText("Notice","Date information will be fetched only for packages from maemo.org and only for user categories.");
218                         d.exec();
219                 }
220                 iAptInterface->addQueuedOperation(AAptInterface::ModeFetchDates);
221         }
222 }
223
224 void MainWindow::on_btnListInstallable_clicked()
225 {
226         //install
227
228         int listupd = -1;
229         int dpkgupd = -1;
230         if( iAptInterface->lastListUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) )
231                 listupd = 1;
232         if( iAptInterface->lastDpkgUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) )
233                 dpkgupd = 1;
234         iAptInterface->setNeedRefresh(-1,listupd,dpkgupd,listupd);
235
236         iWinPackageView->setStatFilter( Package::PkgStatNotInstalled );
237
238         if( iAptInterface->needRepoRefresh() && !iSettings->qsettings()->value("no_catalogs_autoupdate",false).toBool() )
239                 iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate);
240
241         busyDialog(true, tr("Operation in progress"), tr("Reading package lists"));
242
243         iNextOperation = OpOpenPkgView;
244         iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages);
245
246         dateFetchAsk();
247
248         iAptInterface->run(iDimmer);
249 }
250
251 void MainWindow::on_btnUpgrade_clicked()
252 {
253         // upgrade
254
255         int listupd = -1;
256         int dpkgupd = -1;
257         if( iAptInterface->lastListUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) )
258                 listupd = 1;
259         if( iAptInterface->lastDpkgUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) )
260                 dpkgupd = 1;
261         iAptInterface->setNeedRefresh(-1,listupd,dpkgupd,listupd);
262
263         iWinPackageView->setStatFilter( Package::PkgStatUpgradeable );
264
265         if( iAptInterface->needRepoRefresh() && !iSettings->qsettings()->value("no_catalogs_autoupdate",false).toBool() )
266                 iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate);
267
268         busyDialog(true, tr("Operation in progress"), tr("Reading package lists"));
269
270         iNextOperation = OpOpenPkgView;
271         iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages);
272
273         dateFetchAsk();
274
275         iAptInterface->run(iDimmer);
276 }
277
278 void MainWindow::on_btnListInstalled_clicked()
279 {
280         //remove
281
282         if( !iSettings->qsettings()->value("remove_readfull",false).toBool() )
283                 iAptInterface->setSkipListAndDates();
284
285         int dpkgupd = -1;
286         if( iAptInterface->lastDpkgUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) )
287                 dpkgupd = 1;
288         iAptInterface->setNeedRefresh(-1,-1,dpkgupd,-1);
289
290         iWinPackageView->setStatFilter( Package::PkgStatInstalled );
291
292         busyDialog(true, tr("Operation in progress"), tr("Reading package lists"));
293
294         iNextOperation = OpOpenPkgView;
295         iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages);
296
297         dateFetchAsk();
298
299         iAptInterface->run(iDimmer);
300 }
301
302 void MainWindow::operationQueueFinished(QList<AAptInterface::interfaceMode> lastModes, bool success, QString title, QStringList msgs)
303 {
304         if( lastModes.contains(AAptInterface::ModeAptGetSimulate) && success ) {
305                 iNextOperation = OpPromptSimulated;
306         }
307         if( lastModes.contains(AAptInterface::ModeAptGetInstall) && success ) {
308                 iWinPackageView->clearSelections();
309                 busyDialog(false);
310                 iWinPackageView->close();
311                 iNextOperation = OpNone;
312
313                 GdkEventIconThemeReload();
314         }
315
316         QWidget* dialogParent = this;
317         if( iWinPackageView->isVisible() )
318                 dialogParent = iWinPackageView;
319
320         if( iNextOperation == OpOpenPkgView && success )
321         {
322                 iWinPackageView->openWin();
323                 busyDialog(false);
324                 iNextOperation = OpNone;
325         } else if( iNextOperation == OpPromptSimulated && success )
326         {
327                 QStringList inst,remv,instver,remvver;
328                 QStringList all = iAptInterface->processPackages();
329                 QStringList vers = iAptInterface->processPackageVersions();
330                 for(int zyx=0; zyx<all.count(); zyx++)
331                 {
332                         if( all.at(zyx).endsWith('-') )
333                         {
334                                 remv.append( all.at(zyx).left( all.at(zyx).size()-1 ) );
335                                 if( vers.count()>zyx )
336                                         remvver.append( vers.at(zyx) );
337                         } else {
338                                 inst.append( all.at(zyx) );
339                                 if( vers.count()>zyx )
340                                         instver.append( vers.at(zyx) );
341                         }
342                 }
343
344                 int total_dl_size = 0;
345                 for( int i=0; i<inst.count(); i++ ) {
346                         Package* pkg = iAptInterface->packagesAvailable()->value(inst.at(i),0);
347                         if( pkg ) {
348                                 total_dl_size += pkg->size()/1024;
349                         }
350                 }
351
352                 QString pkglist;
353                 pkglist = QString("<b>The following operations will be performed:</b><br>"
354                                   "%1 to install/upgrade, %2 to remove<br>").arg(inst.count()).arg(remv.count());
355                 if( inst.count()>0 )
356                         pkglist += QString("Total download size: %L1 kB<br>").arg(total_dl_size);
357                 bool mismatch = false;
358                 bool warn_system_package_remove = false;
359                 bool warn_system_package_install = false;
360
361                 if( remv.count()>0 ) {
362                         pkglist += "<br><b><u>REMOVE:</u></b><br><font size=\"-1\">";
363                         for( int i=0; i<remv.count(); i++ ) {
364                                 pkglist += "<b>" + remv.at(i) + "</b>";
365                                 Package* pkg = iAptInterface->packagesInstalled()->value(remv.at(i),0);
366                                 if( !pkg ) {
367                                         qDebug() << "Warning: unknown package" << remv.at(i);
368                                         pkglist += "<font color=\"red\">***UNKNOWN***</font>";
369                                         mismatch = true;
370                                 }
371 #ifdef Q_WS_MAEMO_5
372                                 if( pkg && pkg->maemoDisplayName()=="Maemo 5" ) {
373                                         warn_system_package_remove = true;
374                                 }
375 #endif
376                                 if( remvver.count()>i ) {
377                                         pkglist += " " + remvver.at(i);
378                                         if( pkg && remvver.at(i) != pkg->version() ) {
379                                                 qDebug() << "Version mismatch, database version is" << pkg->version() << "but removing" << remvver.at(i);
380                                                 mismatch = true;
381                                                 pkglist += " <font color=\"red\">***TRYING TO REMOVE " + pkg->version() + "***</font> ";
382                                         }
383                                 }
384                                 if( pkg && pkg->installedSize()>0 )
385                                         pkglist += QString(" (%L1 kB)").arg(pkg->installedSize());
386                                 pkglist += "<br>";
387                         }
388                 }
389                 pkglist += "</font>";
390
391                 bool installing_blacklisted = false;
392                 if( inst.count()>0 ) {
393                         pkglist += "<br><b><u>INSTALL/UPGRADE:</u></b><br><font size=\"-1\">";
394                         for( int i=0; i<inst.count(); i++ ) {
395                                 pkglist += "<b>" + inst.at(i) + "</b>";
396                                 Package* pkg = iAptInterface->packagesAvailable()->value(inst.at(i),0);
397                                 if( !pkg ) {
398                                         qDebug() << "Warning: unknown package" << inst.at(i);
399                                         pkglist += "<font color=\"red\">***NEW/UNKNOWN***</font>";
400                                         mismatch = true;
401                                 }
402                                 if( pkg && pkg->isBlacklisted() ) {
403                                         qDebug() << "Warning: installing blacklisted package" << inst.at(i);
404                                         pkglist += "<font color=\"red\">***BLACKLISTED***</font>";
405                                         installing_blacklisted = true;
406                                 }
407 #ifdef Q_WS_MAEMO_5
408                                 if( pkg && pkg->maemoDisplayName()=="Maemo 5" ) {
409                                         warn_system_package_install = true;
410                                 }
411 #endif
412                                 if( instver.count()>i ) {
413                                         pkglist += " " + instver.at(i);
414                                         if( pkg && instver.at(i) != pkg->version() ) {
415                                                 qDebug() << "Version mismatch, database version is" << pkg->version() << "but installing" << instver.at(i);
416                                                 mismatch = true;
417                                                 pkglist += " <font color=\"red\">***TRYING TO INSTALL " + pkg->version() + "***</font> ";
418                                         }
419                                 }
420                                 if( pkg && pkg->size()>0 ) {
421                                         pkglist += QString(" (%L1 kB)").arg(pkg->size()/1024);
422                                 }
423                                 pkglist += "<br>";
424                         }
425                 }
426                 pkglist += "</font>";
427
428                 if( mismatch ) {
429                         ConfirmDialog m(false, dialogParent);
430                         m.setText("Warning", "There is a version mismatch between your original package selections and some of the packages being installed " \
431                                           "from the repositories. This could be due to your application catalogs being out of date.");
432                         m.exec();
433                 }
434                 if( installing_blacklisted ) {
435                         ConfirmDialog b(false, dialogParent);
436                         b.setText("Warning","Blacklisted package(s) will be installed");
437                         b.exec();
438                 }
439                 if( warn_system_package_remove ) {
440                         ConfirmDialog s(false, dialogParent);
441                         s.setText("Warning","You are about to remove a critical system package.");
442                         s.exec();
443                 }
444                 if( warn_system_package_install ) {
445                         ConfirmDialog s(false, dialogParent);
446                         s.setText("Warning","You are trying to perform an install/upgrade operation on a critical system package. Doing a system upgrade with " \
447                                           "Faster Application Manager has not been tested and it could result in a horrible failure. You have been warned.");
448                         s.exec();
449                 }
450
451                 busyDialog(false);
452                 ConfirmDialog d(true, dialogParent);
453                 if( inst.count()==0 && remv.count()==0 )
454                 {
455                         pkglist = "None of the packages can be installed";
456                         d.disableButton();
457                 }
458                 d.setText("Confirmation",pkglist);
459                 if( d.exec() ) {
460                         iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetInstall);
461
462                         if( iSettings->qsettings()->value("enable_autoclean",true).toBool() && inst.count()>0 )
463                                 iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetClean);
464
465                         QString busytext;
466                         if( remv.count() > 0 )
467                                 busytext += QString("Remove %1 package(s)<br>").arg(remv.count());
468                         if( inst.count() > 0 )
469                                 busytext += QString("Install %1 package(s)<br>").arg(inst.count());
470                         busytext += "Preparing...";
471                         busyDialog(true, "Operation in progress", busytext);
472
473                         // "run" really does nothing here since the previous item should still be running
474                         if( iWinPackageView->isVisible() ) {
475                                 iAptInterface->run(iWinPackageView->mydimmer());
476                         } else {
477                                 iAptInterface->run(iDimmer);
478                         }
479                 }
480                 iNextOperation = OpNone;
481                 return;
482         } else {
483                 busyDialog(false);
484                 iNextOperation = OpNone;
485
486                 if( iSettings->qsettings()->value("sound_notify",false).toBool() )
487                 {
488                         qDebug() << "playing sound";
489                         iMediaObject->setCurrentSource( Phonon::MediaSource(iSettings->qsettings()->value("sound_file","/usr/share/sounds/ui-operation_ready.wav").toString()) );
490                         iMediaObject->play();
491                 }
492
493                 QString text = "<br><b><u>Faster Application Manager</u></b><br>"
494                                            "<b>"+title+"</b><br>" + msgs.join("<br>") + "<br>";
495
496                 QRect r = QApplication::desktop()->rect();
497                 if(r.width() < r.height()) {
498                         ConfirmDialog d(false, dialogParent);
499                         d.setText(title,msgs.join("<br>"));
500                         d.exec();
501                 } else {
502 #ifdef Q_WS_MAEMO_5
503                         QMaemo5InformationBox::information(0, text, QMaemo5InformationBox::NoTimeout);
504 #else
505                         ConfirmDialog d(false, dialogParent);
506                         d.setText(title,msgs.join("<br>"));
507                         d.exec();
508 #endif
509                 }
510
511         }
512
513 }
514
515 void MainWindow::busyDialog(bool show_, QString title, QString text)
516 {
517         if( show_ ) {
518                 iDimmer->setProgress(-1);
519                 ui->menuMenu->setEnabled(false);
520                 ui->centralWidget->setEnabled(false);
521                 iWinPackageView->disableMenu();
522                 iDimmer->resizeEvent(0);
523                 iDimmer->dim(title, text);
524                 iWinPackageView->mydimmer()->resizeEvent(0);
525                 iWinPackageView->mydimmer()->dim(title, text);
526         } else {
527                 iDimmer->undim();
528                 iWinPackageView->mydimmer()->undim();
529                 ui->menuMenu->setEnabled(true);
530                 ui->centralWidget->setEnabled(true);
531                 iWinPackageView->enableMenu();
532         }
533 }
534
535 void MainWindow::on_actionAbout_triggered()
536 {
537         ConfirmDialog d(false, this);
538         d.setText("About","Faster Application Manager<br>"
539                           "<font size=\"-1\">Version " + PROGRAM_VERSION + "</font><br><br>"
540                           "(C) Heikki Holstila 2010<br>Donate using "
541                           "<a href=\"https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=6ZKRY5QFHL42A&lc=FI&item_name=Faster%20Application%20Manager"
542                           "%20for%20Maemo5&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted\">PayPal</a>");
543         d.exec();
544 }
545
546 void MainWindow::on_actionClean_triggered()
547 {
548         //if( iOperation != OpNone ) return;
549         //iOperation = OpClean;
550         iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetClean);
551         iAptInterface->run(iDimmer);
552 }
553
554 void MainWindow::closeEvent(QCloseEvent *event)
555 {
556         if( iDimmer->busy() ) {
557                 iAptInterface->cancel();
558                 event->ignore();
559         } else {
560                 event->accept();
561         }
562 }
563
564 void MainWindow::on_actionView_log_triggered()
565 {
566         QByteArray log = iAptInterface->readLogFile();
567         LogView l(log, this);
568         l.exec();
569 }
570
571 void MainWindow::on_actionOptions_triggered()
572 {
573         iSettings->openWin();
574 }
575
576 void MainWindow::notifyDialog(QString title, QString msg)
577 {
578         QWidget* dialogParent = this;
579         if( iWinPackageView->isVisible() )
580                 dialogParent = iWinPackageView;
581
582         ConfirmDialog d(false, dialogParent);
583         d.setText(title, msg);
584         d.exec();
585 }
586
587 bool MainWindow::confirmDialog(QString title, QString msg)
588 {
589         QWidget* dialogParent = this;
590         if( iWinPackageView->isVisible() )
591                 dialogParent = iWinPackageView;
592
593         ConfirmDialog d(true, dialogParent);
594         d.setText(title, msg);
595         return d.exec();
596 }
597
598 void MainWindow::GdkEventIconThemeReload()
599 {
600         // DOES NOT EVEN WORK (at least not reliably) - disabled from the project file
601
602 #ifdef MYDEF_GTK_EXISTS
603         qDebug() << "Sending GDK icon theme reload event";
604
605         gdk_init((int*)QApplication::argc(),(gchar***)QApplication::argv());
606
607         // taken from hildon application manager
608         GdkEventClient ev;
609         ev.type = GDK_CLIENT_EVENT;
610         ev.window = NULL;
611         ev.send_event = TRUE;
612         ev.message_type = gdk_atom_intern_static_string("_GTK_LOAD_ICONTHEMES");
613         ev.data_format = 32;
614         gdk_event_send_clientmessage_toall((GdkEvent*)&ev);
615
616         while(gdk_events_pending()) {
617                 g_main_context_iteration(NULL, true);
618         }
619
620 #endif
621 }
622
623 void MainWindow::on_actionLoad_file_triggered()
624 {
625         QStringList files = QFileDialog::getOpenFileNames(this, "Open files", "/", "Files (*.deb *.install)");
626         if( files.count() > 0 ) {
627                 QStringList debs = files.filter(QRegExp(".*\\.deb$"));
628                 QStringList installs = files.filter(QRegExp(".*\\.install$"));
629                 if( debs.count()>0 && installs.count()>0 ) {
630                         ConfirmDialog d(false, this);
631                         d.setText("Error", "You can't mix different file types in your selection");
632                         d.exec();
633                         return;
634                 }
635                 if( debs.count()>0 )
636                         iDpkgInterface->loadDebFiles(debs);
637                 else if( installs.count()>0 )
638                         iAptInterface->loadInstallFiles(installs);
639         }
640 }