kio Library API Documentation

kopenwith.cpp

00001 /*  This file is part of the KDE libraries
00002 
00003     Copyright (C) 1997 Torben Weis <weis@stud.uni-frankfurt.de>
00004     Copyright (C) 1999 Dirk A. Mueller <dmuell@gmx.net>
00005     Portions copyright (C) 1999 Preston Brown <pbrown@kde.org>
00006 
00007     This library is free software; you can redistribute it and/or
00008     modify it under the terms of the GNU Library General Public
00009     License as published by the Free Software Foundation; either
00010     version 2 of the License, or (at your option) any later version.
00011 
00012     This library is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015     Library General Public License for more details.
00016 
00017     You should have received a copy of the GNU Library General Public License
00018     along with this library; see the file COPYING.LIB.  If not, write to
00019     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00020     Boston, MA 02111-1307, USA.
00021 */
00022 
00023 // $Id: kopenwith.cpp,v 1.66.2.5 2003/06/29 21:43:01 deller Exp $
00024 
00025 #include <qfile.h>
00026 #include <qdir.h>
00027 #include <qdialog.h>
00028 #include <qimage.h>
00029 #include <qpixmap.h>
00030 #include <qlabel.h>
00031 #include <qlayout.h>
00032 #include <qpushbutton.h>
00033 #include <qtoolbutton.h>
00034 #include <qcheckbox.h>
00035 #include <qtooltip.h>
00036 #include <qstyle.h>
00037 
00038 #include <kapplication.h>
00039 #include <kbuttonbox.h>
00040 #include <kcombobox.h>
00041 #include <kdesktopfile.h>
00042 #include <kdialog.h>
00043 #include <kglobal.h>
00044 #include <klineedit.h>
00045 #include <klocale.h>
00046 #include <kiconloader.h>
00047 #include <kmimemagic.h>
00048 #include <krun.h>
00049 #include <kstandarddirs.h>
00050 #include <kstringhandler.h>
00051 #include <kuserprofile.h>
00052 #include <kurlcompletion.h>
00053 #include <kurlrequester.h>
00054 #include <dcopclient.h>
00055 #include <kmimetype.h>
00056 #include <kservicegroup.h>
00057 #include <klistview.h>
00058 #include <ksycoca.h>
00059 
00060 #include "kopenwith.h"
00061 #include "kopenwith_p.h"
00062 
00063 #include <kdebug.h>
00064 #include <assert.h>
00065 #include <stdlib.h>
00066 
00067 template class QPtrList<QString>;
00068 
00069 #define SORT_SPEC (QDir::DirsFirst | QDir::Name | QDir::IgnoreCase)
00070 
00071 
00072 // ----------------------------------------------------------------------
00073 
00074 KAppTreeListItem::KAppTreeListItem( KListView* parent, const QString & name,
00075                                     const QPixmap& pixmap, bool parse, bool dir, QString p, QString c )
00076     : QListViewItem( parent, name )
00077 {
00078     init(pixmap, parse, dir, p, c);
00079 }
00080 
00081 
00082 // ----------------------------------------------------------------------
00083 
00084 KAppTreeListItem::KAppTreeListItem( QListViewItem* parent, const QString & name,
00085                                     const QPixmap& pixmap, bool parse, bool dir, QString p, QString c )
00086     : QListViewItem( parent, name )
00087 {
00088     init(pixmap, parse, dir, p, c);
00089 }
00090 
00091 
00092 // ----------------------------------------------------------------------
00093 
00094 void KAppTreeListItem::init(const QPixmap& pixmap, bool parse, bool dir, QString _path, QString _exec)
00095 {
00096     setPixmap(0, pixmap);
00097     parsed = parse;
00098     directory = dir;
00099     path = _path; // relative path
00100     exec = _exec;
00101 }
00102 
00103 
00104 // ----------------------------------------------------------------------
00105 // Ensure that dirs are sorted in front of files and case is ignored
00106 
00107 QString KAppTreeListItem::key(int column, bool /*ascending*/) const
00108 {
00109     if (directory)
00110         return QString::fromLatin1(" ") + text(column).upper();
00111     else
00112         return text(column).upper();
00113 }
00114 
00115 void KAppTreeListItem::activate()
00116 {
00117     if ( directory )
00118         setOpen(!isOpen());
00119 }
00120 
00121 void KAppTreeListItem::setOpen( bool o )
00122 {
00123     if( o && !parsed ) { // fill the children before opening
00124         ((KApplicationTree *) parent())->addDesktopGroup( path, this );
00125         parsed = true;
00126     }
00127     QListViewItem::setOpen( o );
00128 }
00129 
00130 bool KAppTreeListItem::isDirectory()
00131 {
00132     return directory;
00133 }
00134 
00135 // ----------------------------------------------------------------------
00136 
00137 KApplicationTree::KApplicationTree( QWidget *parent )
00138     : KListView( parent ), currentitem(0)
00139 {
00140     addColumn( i18n("Known Applications") );
00141     setRootIsDecorated( true );
00142 
00143     addDesktopGroup( QString::null );
00144 
00145     connect( this, SIGNAL( currentChanged(QListViewItem*) ),
00146             SLOT( slotItemHighlighted(QListViewItem*) ) );
00147     connect( this, SIGNAL( selectionChanged(QListViewItem*) ),
00148             SLOT( slotSelectionChanged(QListViewItem*) ) );
00149 }
00150 
00151 // ----------------------------------------------------------------------
00152 
00153 bool KApplicationTree::isDirSel()
00154 {
00155     if (!currentitem) return false; // if currentitem isn't set
00156     return currentitem->isDirectory();
00157 }
00158 
00159 // ----------------------------------------------------------------------
00160 
00161 static QPixmap appIcon(const QString &iconName)
00162 {
00163     QPixmap normal = KGlobal::iconLoader()->loadIcon(iconName, KIcon::Small, 0, KIcon::DefaultState, 0L, true);
00164     // make sure they are not larger than 20x20
00165     if (normal.width() > 20 || normal.height() > 20) 
00166     {
00167        QImage tmp = normal.convertToImage();
00168        tmp = tmp.smoothScale(20, 20);
00169        normal.convertFromImage(tmp);
00170     }
00171     return normal;
00172 }
00173 
00174 void KApplicationTree::addDesktopGroup( QString relPath, KAppTreeListItem *item)
00175 {
00176    KServiceGroup::Ptr root = KServiceGroup::group(relPath);
00177    KServiceGroup::List list = root->entries();
00178 
00179    KAppTreeListItem * newItem;
00180    for( KServiceGroup::List::ConstIterator it = list.begin();
00181        it != list.end(); it++)
00182    {
00183       QString icon;
00184       QString text;
00185       QString relPath;
00186       QString exec;
00187       bool isDir = false;
00188       KSycocaEntry *p = (*it);
00189       if (p->isType(KST_KService))
00190       {
00191          KService *service = static_cast<KService *>(p);
00192 
00193          if (service->noDisplay())
00194             continue;
00195 
00196          icon = service->icon();
00197          text = service->name();
00198          exec = service->exec();
00199       }
00200       else if (p->isType(KST_KServiceGroup))
00201       {
00202          KServiceGroup *serviceGroup = static_cast<KServiceGroup *>(p);
00203 
00204          if (serviceGroup->noDisplay())
00205             continue;
00206 
00207          icon = serviceGroup->icon();
00208          text = serviceGroup->caption();
00209          relPath = serviceGroup->relPath();
00210          isDir = true;
00211          if ( text[0] == '.' ) // skip ".hidden" like kicker does
00212            continue;
00213       }
00214       else
00215       {
00216          kdWarning(250) << "KServiceGroup: Unexpected object in list!" << endl;
00217          continue;
00218       }
00219 
00220       QPixmap pixmap = appIcon( icon );
00221 
00222       if (item)
00223          newItem = new KAppTreeListItem( item, text, pixmap, false, isDir,
00224                                          relPath, exec );
00225       else
00226          newItem = new KAppTreeListItem( this, text, pixmap, false, isDir,
00227                                          relPath, exec );
00228       if (isDir)
00229          newItem->setExpandable( true );
00230    }
00231 }
00232 
00233 
00234 // ----------------------------------------------------------------------
00235 
00236 void KApplicationTree::slotItemHighlighted(QListViewItem* i)
00237 {
00238     // i may be 0 (see documentation)
00239     if(!i)
00240         return;
00241 
00242     KAppTreeListItem *item = (KAppTreeListItem *) i;
00243 
00244     currentitem = item;
00245 
00246     if( (!item->directory ) && (!item->exec.isEmpty()) )
00247         emit highlighted( item->text(0), item->exec );
00248 }
00249 
00250 
00251 // ----------------------------------------------------------------------
00252 
00253 void KApplicationTree::slotSelectionChanged(QListViewItem* i)
00254 {
00255     // i may be 0 (see documentation)
00256     if(!i)
00257         return;
00258 
00259     KAppTreeListItem *item = (KAppTreeListItem *) i;
00260 
00261     currentitem = item;
00262 
00263     if( ( !item->directory ) && (!item->exec.isEmpty() ) )
00264         emit selected( item->text(0), item->exec );
00265 }
00266 
00267 // ----------------------------------------------------------------------
00268 
00269 void KApplicationTree::resizeEvent( QResizeEvent * e)
00270 {
00271     setColumnWidth(0, width()-QApplication::style().pixelMetric(QStyle::PM_ScrollBarExtent)
00272                          -2*QApplication::style().pixelMetric(QStyle::PM_DefaultFrameWidth));
00273     KListView::resizeEvent(e);
00274 }
00275 
00276 
00277 /***************************************************************
00278  *
00279  * KOpenWithDlg
00280  *
00281  ***************************************************************/
00282 
00283 KOpenWithDlg::KOpenWithDlg( const KURL::List& _urls, QWidget* parent )
00284              :QDialog( parent, 0L, true )
00285 {
00286     setCaption( i18n( "Open With" ) );
00287     QString text;
00288     if( _urls.count() == 1 )
00289     {
00290         text = i18n("<qt>Select the program that should be used to open <b>%1</b>. "
00291                      "If the program is not listed, enter the name or click "
00292                      "the browse button.</qt>").arg( _urls.first().fileName() );
00293     }
00294     else
00295         // Should never happen ??
00296         text = i18n( "Choose the name of the program with which to open the selected files." );
00297     setServiceType( _urls );
00298     init( text, QString() );
00299 }
00300 
00301 KOpenWithDlg::KOpenWithDlg( const KURL::List& _urls, const QString&_text,
00302                             const QString& _value, QWidget *parent)
00303              :QDialog( parent, 0L, true )
00304 {
00305   QString caption = KStringHandler::csqueeze( _urls.first().prettyURL() );
00306   if (_urls.count() > 1)
00307       caption += QString::fromLatin1("...");
00308   setCaption(caption);
00309   setServiceType( _urls );
00310   init( _text, _value );
00311 }
00312 
00313 KOpenWithDlg::KOpenWithDlg( const QString &serviceType, const QString& value,
00314                             QWidget *parent)
00315              :QDialog( parent, 0L, true )
00316 {
00317   setCaption(i18n("Choose Application for %1").arg(serviceType));
00318   QString text = i18n("<qt>Select the program for the file type: <b>%1</b>. "
00319                       "If the program is not listed, enter the name or click "
00320                       "the browse button.</qt>").arg(serviceType);
00321   qServiceType = serviceType;
00322   init( text, value );
00323   if (remember)
00324   {
00325       remember->setChecked( true );
00326       remember->hide();
00327   }
00328 }
00329 
00330 KOpenWithDlg::KOpenWithDlg( QWidget *parent)
00331              :QDialog( parent, 0L, true )
00332 {
00333   setCaption(i18n("Choose Application"));
00334   QString text = i18n("<qt>Select a program. "
00335                       "If the program is not listed, enter the name or click "
00336                       "the browse button.</qt>");
00337   qServiceType = QString::null;
00338   init( text, QString::null );
00339 }
00340 
00341 void KOpenWithDlg::setServiceType( const KURL::List& _urls )
00342 {
00343   if ( _urls.count() == 1 )
00344   {
00345     qServiceType = KMimeType::findByURL( _urls.first())->name();
00346     if (qServiceType == QString::fromLatin1("application/octet-stream"))
00347       qServiceType = QString::null;
00348   }
00349   else
00350       qServiceType = QString::null;
00351 }
00352 
00353 void KOpenWithDlg::init( const QString& _text, const QString& _value )
00354 {
00355   bool bReadOnly = kapp && !kapp->authorize("shell_access");
00356   m_terminaldirty = false;
00357   m_pTree = 0L;
00358   m_pService = 0L;
00359 
00360   QBoxLayout *topLayout = new QVBoxLayout( this, KDialog::marginHint(),
00361           KDialog::spacingHint() );
00362   label = new QLabel( _text, this );
00363   topLayout->addWidget(label);
00364 
00365   QHBoxLayout* hbox = new QHBoxLayout(topLayout);
00366 
00367   QToolButton *clearButton = new QToolButton( this );
00368   clearButton->setIconSet( BarIcon( "locationbar_erase" ) );
00369   clearButton->setFixedSize( clearButton->sizeHint() );
00370   connect( clearButton, SIGNAL( pressed() ), SLOT( slotClear() ) );
00371   QToolTip::add( clearButton, i18n( "Clear input field" ) );
00372 
00373   hbox->addWidget( clearButton );
00374 
00375   if (!bReadOnly)
00376   {
00377     // init the history combo and insert it into the URL-Requester
00378     KHistoryCombo *combo = new KHistoryCombo();
00379     combo->setDuplicatesEnabled( false );
00380     KConfig *kc = KGlobal::config();
00381     KConfigGroupSaver ks( kc, QString::fromLatin1("Open-with settings") );
00382     int max = kc->readNumEntry( QString::fromLatin1("Maximum history"), 15 );
00383     combo->setMaxCount( max );
00384     int mode = kc->readNumEntry(QString::fromLatin1("CompletionMode"),
00385                                 KGlobalSettings::completionMode());
00386     combo->setCompletionMode((KGlobalSettings::Completion)mode);
00387     QStringList list = kc->readListEntry( QString::fromLatin1("History") );
00388     combo->setHistoryItems( list, true );
00389     edit = new KURLRequester( combo, this );
00390   }
00391   else
00392   {
00393     clearButton->hide();
00394     edit = new KURLRequester( this );
00395     edit->lineEdit()->setReadOnly(true);
00396     edit->button()->hide();
00397   }
00398 
00399   edit->setURL( _value );
00400 
00401   hbox->addWidget(edit);
00402 
00403   if ( edit->comboBox() ) {
00404     KURLCompletion *comp = new KURLCompletion( KURLCompletion::ExeCompletion );
00405     edit->comboBox()->setCompletionObject( comp );
00406   }
00407 
00408   connect ( edit, SIGNAL(returnPressed()), SLOT(slotOK()) );
00409   connect ( edit, SIGNAL(textChanged(const QString&)), SLOT(slotTextChanged()) );
00410 
00411   m_pTree = new KApplicationTree( this );
00412   topLayout->addWidget(m_pTree);
00413 
00414   connect( m_pTree, SIGNAL( selected( const QString&, const QString& ) ),
00415            SLOT( slotSelected( const QString&, const QString& ) ) );
00416   connect( m_pTree, SIGNAL( highlighted( const QString&, const QString& ) ),
00417            SLOT( slotHighlighted( const QString&, const QString& ) ) );
00418   connect( m_pTree, SIGNAL( doubleClicked(QListViewItem*) ),
00419            SLOT( slotDbClick() ) );
00420 
00421   terminal = new QCheckBox( i18n("Run in &terminal"), this );
00422   if (bReadOnly)
00423      terminal->hide();
00424   connect(terminal, SIGNAL(toggled(bool)), SLOT(slotTerminalToggled(bool)));
00425 
00426   topLayout->addWidget(terminal);
00427 
00428   if (!qServiceType.isNull())
00429   {
00430     remember = new QCheckBox(i18n("&Remember application association for this type of file"), this);
00431     //    remember->setChecked(true);
00432     topLayout->addWidget(remember);
00433   }
00434   else
00435     remember = 0L;
00436 
00437   // Use KButtonBox for the aligning pushbuttons nicely
00438   KButtonBox* b = new KButtonBox( this );
00439   b->addStretch( 2 );
00440 
00441   QPushButton* ok = b->addButton(  i18n ( "&OK" ) );
00442   ok->setDefault( true );
00443   connect( ok, SIGNAL( clicked() ), SLOT( slotOK() ) );
00444 
00445   QPushButton* cancel = b->addButton(  i18n( "&Cancel" ) );
00446   connect( cancel, SIGNAL( clicked() ), SLOT( reject() ) );
00447 
00448   b->layout();
00449   topLayout->addWidget( b );
00450 
00451   //edit->setText( _value );
00452   // This is what caused "can't click on items before clicking on Name header".
00453   // Probably due to the resizeEvent handler using width().
00454   //resize( minimumWidth(), sizeHint().height() );
00455   edit->setFocus();
00456 }
00457 
00458 
00459 // ----------------------------------------------------------------------
00460 
00461 KOpenWithDlg::~KOpenWithDlg()
00462 {
00463 }
00464 
00465 // ----------------------------------------------------------------------
00466 
00467 void KOpenWithDlg::slotClear()
00468 {
00469     edit->setURL(QString::null);
00470     edit->setFocus();
00471 }
00472 
00473 
00474 // ----------------------------------------------------------------------
00475 
00476 void KOpenWithDlg::slotSelected( const QString& /*_name*/, const QString& _exec )
00477 {
00478     kdDebug(250)<<"KOpenWithDlg::slotSelected"<<endl;
00479     KService::Ptr pService = m_pService;
00480     edit->setURL( _exec ); // calls slotTextChanged :(
00481     m_pService = pService;
00482 }
00483 
00484 
00485 // ----------------------------------------------------------------------
00486 
00487 void KOpenWithDlg::slotHighlighted( const QString& _name, const QString& )
00488 {
00489     kdDebug(250)<<"KOpenWithDlg::slotHighlighted"<<endl;
00490     qName = _name;
00491     m_pService = KService::serviceByName( qName );
00492     if (!m_terminaldirty)
00493     {
00494         // ### indicate that default value was restored
00495         terminal->setChecked(m_pService->terminal());
00496         m_terminaldirty = false; // slotTerminalToggled changed it
00497     }
00498 }
00499 
00500 // ----------------------------------------------------------------------
00501 
00502 void KOpenWithDlg::slotTextChanged()
00503 {
00504     kdDebug(250)<<"KOpenWithDlg::slotTextChanged"<<endl;
00505     // Forget about the service
00506     m_pService = 0L;
00507 }
00508 
00509 // ----------------------------------------------------------------------
00510 
00511 void KOpenWithDlg::slotTerminalToggled(bool)
00512 {
00513     // ### indicate that default value was overridden
00514     m_terminaldirty = true;
00515 }
00516 
00517 // ----------------------------------------------------------------------
00518 
00519 void KOpenWithDlg::slotDbClick()
00520 {
00521    if (m_pTree->isDirSel() ) return; // check if a directory is selected
00522    slotOK();
00523 }
00524 
00525 void KOpenWithDlg::slotOK()
00526 {
00527   QString fullExec(edit->url());
00528 
00529   QString serviceName;
00530   QString pathName;
00531   QString initialServiceName;
00532   if (!m_pService) {
00533     // No service selected - check the command line
00534 
00535     // Find out the name of the service from the command line, removing args and paths
00536     serviceName = KRun::binaryName( fullExec, true );
00537     if (serviceName.isEmpty())
00538     {
00539       // TODO add a KMessageBox::error here after the end of the message freeze
00540       return;
00541     }
00542     initialServiceName = serviceName;
00543     int i = 1; // We have app, app-2, app-3... Looks better for the user.
00544     // Check if there's already a service by that name, with the same Exec line
00545     bool ok = false;
00546     do {
00547         KService::Ptr serv = KService::serviceByDesktopName( serviceName );
00548         ok = !serv; // ok if no such service yet
00549         // also ok if we find the exact same service (well, "kwrite" == "kwrite %U"
00550         if ( serv &&
00551              serv->type() == "Application" && ( // only apps
00552                  serv->exec() == fullExec ||
00553                  serv->exec() == fullExec + " %u" ||
00554                  serv->exec() == fullExec + " %U" ||
00555                  serv->exec() == fullExec + " %f" ||
00556                  serv->exec() == fullExec + " %F"
00557                  ) )
00558         {
00559             ok = true;
00560             m_pService = serv;
00561         }
00562         if (!ok) // service was found, but it was different -> keep looking
00563         {
00564             ++i;
00565             serviceName = initialServiceName + "-" + QString::number(i);
00566         }
00567     }
00568     while (!ok);
00569     if ( !m_pService )
00570     {
00571         // Let's hide it to avoid cluttering the K menu.
00572         pathName = ".hidden/";
00573         pathName += serviceName;
00574     }
00575   }
00576   if ( m_pService )
00577   {
00578     // Existing service selected
00579     serviceName = m_pService->name();
00580     initialServiceName = serviceName;
00581     pathName = m_pService->desktopEntryPath();
00582   }
00583 
00584   if (terminal->isChecked()) {
00585     KSimpleConfig conf(QString::fromLatin1("konquerorrc"), true);
00586     conf.setGroup(QString::fromLatin1("Misc Defaults"));
00587     m_command = conf.readPathEntry(QString::fromLatin1("Terminal"), QString::fromLatin1("konsole"));
00588 
00589     m_command += QString::fromLatin1(" -e ");
00590     m_command += edit->url();
00591     kdDebug(250) << "Setting m_command to " << m_command << endl;
00592   }
00593   if ( m_pService && terminal->isChecked() != m_pService->terminal() )
00594       m_pService = 0L; // It's not exactly this service we're running
00595 
00596   if ( m_pService && ( !remember || !remember->isChecked() ) ) {
00597     accept();
00598     return;
00599   }
00600 
00601   // if we got here, we can't seem to find a service for what they
00602   // wanted.  The other possibility is that they have asked for the
00603   // association to be remembered.  Create/update service.
00604 
00605   kdDebug(250) << "service pathName=" << pathName << endl;
00606   if (pathName.right(8) != QString::fromLatin1(".desktop"))
00607     pathName += QString::fromLatin1(".desktop");
00608   QString path(locateLocal("apps", pathName));
00609 
00610   int maxPreference = 1;
00611   if (!qServiceType.isEmpty())
00612   {
00613     KServiceTypeProfile::OfferList offerList = KServiceTypeProfile::offers( qServiceType );
00614     if (!offerList.isEmpty())
00615       maxPreference = offerList.first().preference();
00616   }
00617 
00618   KDesktopFile desktop(path);
00619   desktop.writeEntry(QString::fromLatin1("Type"), QString::fromLatin1("Application"));
00620   desktop.writeEntry(QString::fromLatin1("Name"), initialServiceName);
00621   desktop.writeEntry(QString::fromLatin1("Exec"), fullExec);
00622   desktop.writeEntry(QString::fromLatin1("InitialPreference"), maxPreference + 1);
00623   if (remember)
00624     if (remember->isChecked()) {
00625       QStringList mimeList;
00626       KDesktopFile oldDesktop(locate("apps", pathName), true);
00627       mimeList = oldDesktop.readListEntry(QString::fromLatin1("MimeType"), ';');
00628       if (!qServiceType.isEmpty() && !mimeList.contains(qServiceType))
00629         mimeList.append(qServiceType);
00630       desktop.writeEntry(QString::fromLatin1("MimeType"), mimeList, ';');
00631       if (terminal->isChecked())
00632         desktop.writeEntry(QString::fromLatin1("Terminal"), true);
00633       else
00634         desktop.writeEntry(QString::fromLatin1("Terminal"), false);
00635 
00636       if ( !qServiceType.isEmpty() )
00637       {
00638         // Also make sure the "auto embed" setting for this mimetype is off
00639         KDesktopFile mimeDesktop( locateLocal( "mime", qServiceType + ".desktop" ) );
00640         mimeDesktop.writeEntry( QString::fromLatin1( "X-KDE-AutoEmbed" ), false );
00641         mimeDesktop.sync();
00642       }
00643     }
00644 
00645 
00646   // write it all out to the file
00647   desktop.sync();
00648 
00649   QApplication::setOverrideCursor( waitCursor );
00650 
00651   // rebuild the database
00652   QStringList args;
00653   args.append("--incremental");
00654   KApplication::kdeinitExecWait( "kbuildsycoca", args );
00655 
00656   // get the new service pointer
00657   kdDebug(250) << "kbuildsycoca finished, looking for service " << pathName << endl;
00658   // We need to read in the new database. It seems the databaseChanged()
00659   // signal hasn't been processed in this process yet, since we haven't been
00660   // to the event loop yet.
00661   QStringList lst;
00662   lst << QString::fromLatin1("apps");
00663   KSycoca::self()->notifyDatabaseChanged( lst );
00664 
00665   m_pService = KService::serviceByDesktopPath( pathName );
00666   QApplication::restoreOverrideCursor();
00667 
00668   Q_ASSERT( m_pService );
00669 
00670   accept();
00671 }
00672 
00673 QString KOpenWithDlg::text() const
00674 {
00675     if (!m_command.isEmpty())
00676         return m_command;
00677     else
00678         return edit->url();
00679 }
00680 
00681 void KOpenWithDlg::accept()
00682 {
00683     KHistoryCombo *combo = static_cast<KHistoryCombo*>( edit->comboBox() );
00684     if ( combo ) {
00685         combo->addToHistory( edit->url() );
00686 
00687         KConfig *kc = KGlobal::config();
00688         KConfigGroupSaver ks( kc, QString::fromLatin1("Open-with settings") );
00689         kc->writeEntry( QString::fromLatin1("History"), combo->historyItems() );
00690         kc->writeEntry(QString::fromLatin1("CompletionMode"),
00691                        combo->completionMode());
00692         // don't store the completion-list, as it contains all of KURLCompletion's
00693         // executables
00694         kc->sync();
00695     }
00696 
00697     QDialog::accept();
00698 }
00699 
00700 
00702 
00703 #ifndef KDE_NO_COMPAT
00704 bool KFileOpenWithHandler::displayOpenWithDialog( const KURL::List& urls )
00705 {
00706     KOpenWithDlg l( urls, i18n("Open with:"), QString::null, 0L );
00707     if ( l.exec() )
00708     {
00709       KService::Ptr service = l.service();
00710       if ( !!service )
00711         return KRun::run( *service, urls );
00712 
00713       kdDebug(250) << "No service set, running " << l.text() << endl;
00714       return KRun::run( l.text(), urls );
00715     }
00716     return false;
00717 }
00718 #endif
00719 
00720 #include "kopenwith.moc"
00721 #include "kopenwith_p.moc"
00722 
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.5.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Wed Jan 28 13:13:53 2004 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001