diff options
Diffstat (limited to 'kio/kfile/kpropertiesdialog.cpp')
-rw-r--r-- | kio/kfile/kpropertiesdialog.cpp | 4170 |
1 files changed, 0 insertions, 4170 deletions
diff --git a/kio/kfile/kpropertiesdialog.cpp b/kio/kfile/kpropertiesdialog.cpp deleted file mode 100644 index 0b1f6c05b..000000000 --- a/kio/kfile/kpropertiesdialog.cpp +++ /dev/null @@ -1,4170 +0,0 @@ -/* This file is part of the KDE project - - Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> - Copyright (c) 1999, 2000 Preston Brown <pbrown@kde.org> - Copyright (c) 2000 Simon Hausmann <hausmann@kde.org> - Copyright (c) 2000 David Faure <faure@kde.org> - Copyright (c) 2003 Waldo Bastian <bastian@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -/* - * kpropertiesdialog.cpp - * View/Edit Properties of files, locally or remotely - * - * some FilePermissionsPropsPlugin-changes by - * Henner Zeller <zeller@think.de> - * some layout management by - * Bertrand Leconte <B.Leconte@mail.dotcom.fr> - * the rest of the layout management, bug fixes, adaptation to libkio, - * template feature by - * David Faure <faure@kde.org> - * More layout, cleanups, and fixes by - * Preston Brown <pbrown@kde.org> - * Plugin capability, cleanups and port to KDialogBase by - * Simon Hausmann <hausmann@kde.org> - * KDesktopPropsPlugin by - * Waldo Bastian <bastian@kde.org> - */ - -#include <config.h> -extern "C" { -#include <pwd.h> -#include <grp.h> -#include <time.h> -#include <sys/types.h> -} -#include <unistd.h> -#include <errno.h> -#include <assert.h> -#include <algorithm> -#include <functional> - -#include <tqfile.h> -#include <tqdir.h> -#include <tqlabel.h> -#include <tqpushbutton.h> -#include <tqcheckbox.h> -#include <tqstrlist.h> -#include <tqstringlist.h> -#include <tqtextstream.h> -#include <tqpainter.h> -#include <tqlayout.h> -#include <tqcombobox.h> -#include <tqgroupbox.h> -#include <tqwhatsthis.h> -#include <tqtooltip.h> -#include <tqstyle.h> -#include <tqprogressbar.h> -#include <tqvbox.h> -#include <tqvaluevector.h> - -#ifdef USE_POSIX_ACL -extern "C" { -#include <sys/param.h> -#ifdef HAVE_SYS_MOUNT_H -#include <sys/mount.h> -#endif -#ifdef HAVE_SYS_XATTR_H -#include <sys/xattr.h> -#endif -} -#endif - -#include <kapplication.h> -#include <kdialog.h> -#include <kdirsize.h> -#include <kdirwatch.h> -#include <kdirnotify_stub.h> -#include <kdiskfreesp.h> -#include <kdebug.h> -#include <kdesktopfile.h> -#include <kicondialog.h> -#include <kurl.h> -#include <kurlrequester.h> -#include <klocale.h> -#include <kglobal.h> -#include <kglobalsettings.h> -#include <kstandarddirs.h> -#include <kio/job.h> -#include <kio/chmodjob.h> -#include <kio/renamedlg.h> -#include <kio/netaccess.h> -#include <kio/kservicetypefactory.h> -#include <kfiledialog.h> -#include <kmimetype.h> -#include <kmountpoint.h> -#include <kiconloader.h> -#include <kmessagebox.h> -#include <kservice.h> -#include <kcompletion.h> -#include <klineedit.h> -#include <kseparator.h> -#include <ksqueezedtextlabel.h> -#include <klibloader.h> -#include <ktrader.h> -#include <tdeparts/componentfactory.h> -#include <kmetaprops.h> -#include <kpreviewprops.h> -#include <kprocess.h> -#include <krun.h> -#include <klistview.h> -#include <kacl.h> -#include "kfilesharedlg.h" - -#include "kpropertiesdesktopbase.h" -#include "kpropertiesdesktopadvbase.h" -#include "kpropertiesmimetypebase.h" -#ifdef USE_POSIX_ACL -#include "kacleditwidget.h" -#endif - -#include "kpropertiesdialog.h" - -#ifdef Q_WS_WIN -# include <win32_utils.h> -#endif - -static TQString nameFromFileName(TQString nameStr) -{ - if ( nameStr.endsWith(".desktop") ) - nameStr.truncate( nameStr.length() - 8 ); - if ( nameStr.endsWith(".kdelnk") ) - nameStr.truncate( nameStr.length() - 7 ); - // Make it human-readable (%2F => '/', ...) - nameStr = TDEIO::decodeFileName( nameStr ); - return nameStr; -} - -mode_t KFilePermissionsPropsPlugin::fperm[3][4] = { - {S_IRUSR, S_IWUSR, S_IXUSR, S_ISUID}, - {S_IRGRP, S_IWGRP, S_IXGRP, S_ISGID}, - {S_IROTH, S_IWOTH, S_IXOTH, S_ISVTX} - }; - -class KPropertiesDialog::KPropertiesDialogPrivate -{ -public: - KPropertiesDialogPrivate() - { - m_aborted = false; - fileSharePage = 0; - } - ~KPropertiesDialogPrivate() - { - } - bool m_aborted:1; - TQWidget* fileSharePage; -}; - -KPropertiesDialog::KPropertiesDialog (KFileItem* item, - TQWidget* parent, const char* name, - bool modal, bool autoShow) - : KDialogBase (KDialogBase::Tabbed, i18n( "Properties for %1" ).arg(TDEIO::decodeFileName(item->url().fileName())), - KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok, - parent, name, modal) -{ - d = new KPropertiesDialogPrivate; - assert( item ); - m_items.append( new KFileItem(*item) ); // deep copy - - m_singleUrl = item->url(); - assert(!m_singleUrl.isEmpty()); - - init (modal, autoShow); -} - -KPropertiesDialog::KPropertiesDialog (const TQString& title, - TQWidget* parent, const char* name, bool modal) - : KDialogBase (KDialogBase::Tabbed, i18n ("Properties for %1").arg(title), - KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok, - parent, name, modal) -{ - d = new KPropertiesDialogPrivate; - - init (modal, false); -} - -KPropertiesDialog::KPropertiesDialog (KFileItemList _items, - TQWidget* parent, const char* name, - bool modal, bool autoShow) - : KDialogBase (KDialogBase::Tabbed, - // TODO: replace <never used> with "Properties for 1 item". It's very confusing how it has to be translated otherwise - // (empty translation before the "\n" is not allowed by msgfmt...) - _items.count()>1 ? i18n( "<never used>","Properties for %n Selected Items",_items.count()) : - i18n( "Properties for %1" ).arg(TDEIO::decodeFileName(_items.first()->url().fileName())), - KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok, - parent, name, modal) -{ - d = new KPropertiesDialogPrivate; - - assert( !_items.isEmpty() ); - m_singleUrl = _items.first()->url(); - assert(!m_singleUrl.isEmpty()); - - KFileItemListIterator it ( _items ); - // Deep copy - for ( ; it.current(); ++it ) - m_items.append( new KFileItem( **it ) ); - - init (modal, autoShow); -} - -#ifndef KDE_NO_COMPAT -KPropertiesDialog::KPropertiesDialog (const KURL& _url, mode_t /* _mode is now unused */, - TQWidget* parent, const char* name, - bool modal, bool autoShow) - : KDialogBase (KDialogBase::Tabbed, - i18n( "Properties for %1" ).arg(TDEIO::decodeFileName(_url.fileName())), - KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok, - parent, name, modal), - m_singleUrl( _url ) -{ - d = new KPropertiesDialogPrivate; - - TDEIO::UDSEntry entry; - - TDEIO::NetAccess::stat(_url, entry, parent); - - m_items.append( new KFileItem( entry, _url ) ); - init (modal, autoShow); -} -#endif - -KPropertiesDialog::KPropertiesDialog (const KURL& _url, - TQWidget* parent, const char* name, - bool modal, bool autoShow) - : KDialogBase (KDialogBase::Tabbed, - i18n( "Properties for %1" ).arg(TDEIO::decodeFileName(_url.fileName())), - KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok, - parent, name, modal), - m_singleUrl( _url ) -{ - d = new KPropertiesDialogPrivate; - - TDEIO::UDSEntry entry; - - TDEIO::NetAccess::stat(_url, entry, parent); - - m_items.append( new KFileItem( entry, _url ) ); - init (modal, autoShow); -} - -KPropertiesDialog::KPropertiesDialog (const KURL& _tempUrl, const KURL& _currentDir, - const TQString& _defaultName, - TQWidget* parent, const char* name, - bool modal, bool autoShow) - : KDialogBase (KDialogBase::Tabbed, - i18n( "Properties for %1" ).arg(TDEIO::decodeFileName(_tempUrl.fileName())), - KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok, - parent, name, modal), - - m_singleUrl( _tempUrl ), - m_defaultName( _defaultName ), - m_currentDir( _currentDir ) -{ - d = new KPropertiesDialogPrivate; - - assert(!m_singleUrl.isEmpty()); - - // Create the KFileItem for the _template_ file, in order to read from it. - m_items.append( new KFileItem( KFileItem::Unknown, KFileItem::Unknown, m_singleUrl ) ); - init (modal, autoShow); -} - -bool KPropertiesDialog::showDialog(KFileItem* item, TQWidget* parent, - const char* name, bool modal) -{ -#ifdef Q_WS_WIN - TQString localPath = item->localPath(); - if (!localPath.isEmpty()) - return showWin32FilePropertyDialog(localPath); -#endif - new KPropertiesDialog(item, parent, name, modal); - return true; -} - -bool KPropertiesDialog::showDialog(const KURL& _url, TQWidget* parent, - const char* name, bool modal) -{ -#ifdef Q_WS_WIN - if (_url.isLocalFile()) - return showWin32FilePropertyDialog( _url.path() ); -#endif - new KPropertiesDialog(_url, parent, name, modal); - return true; -} - -bool KPropertiesDialog::showDialog(const KFileItemList& _items, TQWidget* parent, - const char* name, bool modal) -{ - if (_items.count()==1) - return KPropertiesDialog::showDialog(_items.getFirst(), parent, name, modal); - new KPropertiesDialog(_items, parent, name, modal); - return true; -} - -void KPropertiesDialog::init (bool modal, bool autoShow) -{ - m_pageList.setAutoDelete( true ); - m_items.setAutoDelete( true ); - - insertPages(); - - if (autoShow) - { - if (!modal) - show(); - else - exec(); - } -} - -void KPropertiesDialog::showFileSharingPage() -{ - if (d->fileSharePage) { - showPage( pageIndex( d->fileSharePage)); - } -} - -void KPropertiesDialog::setFileSharingPage(TQWidget* page) { - d->fileSharePage = page; -} - - -void KPropertiesDialog::setFileNameReadOnly( bool ro ) -{ - KPropsDlgPlugin *it; - - for ( it=m_pageList.first(); it != 0L; it=m_pageList.next() ) - { - KFilePropsPlugin* plugin = dynamic_cast<KFilePropsPlugin*>(it); - if ( plugin ) { - plugin->setFileNameReadOnly( ro ); - break; - } - } -} - -void KPropertiesDialog::slotStatResult( TDEIO::Job * ) -{ -} - -KPropertiesDialog::~KPropertiesDialog() -{ - m_pageList.clear(); - delete d; -} - -void KPropertiesDialog::insertPlugin (KPropsDlgPlugin* plugin) -{ - connect (plugin, TQT_SIGNAL (changed ()), - plugin, TQT_SLOT (setDirty ())); - - m_pageList.append (plugin); -} - -bool KPropertiesDialog::canDisplay( KFileItemList _items ) -{ - // TODO: cache the result of those calls. Currently we parse .desktop files far too many times - return KFilePropsPlugin::supports( _items ) || - KFilePermissionsPropsPlugin::supports( _items ) || - KDesktopPropsPlugin::supports( _items ) || - KBindingPropsPlugin::supports( _items ) || - KURLPropsPlugin::supports( _items ) || - KDevicePropsPlugin::supports( _items ) || - KFileMetaPropsPlugin::supports( _items ) || - KPreviewPropsPlugin::supports( _items ); -} - -void KPropertiesDialog::slotOk() -{ - KPropsDlgPlugin *page; - d->m_aborted = false; - - KFilePropsPlugin * filePropsPlugin = 0L; - if ( m_pageList.first()->isA("KFilePropsPlugin") ) - filePropsPlugin = static_cast<KFilePropsPlugin *>(m_pageList.first()); - - // If any page is dirty, then set the main one (KFilePropsPlugin) as - // dirty too. This is what makes it possible to save changes to a global - // desktop file into a local one. In other cases, it doesn't hurt. - for ( page = m_pageList.first(); page != 0L; page = m_pageList.next() ) - if ( page->isDirty() && filePropsPlugin ) - { - filePropsPlugin->setDirty(); - break; - } - - // Apply the changes in the _normal_ order of the tabs now - // This is because in case of renaming a file, KFilePropsPlugin will call - // KPropertiesDialog::rename, so other tab will be ok with whatever order - // BUT for file copied from templates, we need to do the renaming first ! - for ( page = m_pageList.first(); page != 0L && !d->m_aborted; page = m_pageList.next() ) - if ( page->isDirty() ) - { - kdDebug( 250 ) << "applying changes for " << page->className() << endl; - page->applyChanges(); - // applyChanges may change d->m_aborted. - } - else - kdDebug( 250 ) << "skipping page " << page->className() << endl; - - if ( !d->m_aborted && filePropsPlugin ) - filePropsPlugin->postApplyChanges(); - - if ( !d->m_aborted ) - { - emit applied(); - emit propertiesClosed(); - deleteLater(); - accept(); - } // else, keep dialog open for user to fix the problem. -} - -void KPropertiesDialog::slotCancel() -{ - emit canceled(); - emit propertiesClosed(); - - deleteLater(); - done( Rejected ); -} - -void KPropertiesDialog::insertPages() -{ - if (m_items.isEmpty()) - return; - - if ( KFilePropsPlugin::supports( m_items ) ) - { - KPropsDlgPlugin *p = new KFilePropsPlugin( this ); - insertPlugin (p); - } - - if ( KFilePermissionsPropsPlugin::supports( m_items ) ) - { - KPropsDlgPlugin *p = new KFilePermissionsPropsPlugin( this ); - insertPlugin (p); - } - - if ( KDesktopPropsPlugin::supports( m_items ) ) - { - KPropsDlgPlugin *p = new KDesktopPropsPlugin( this ); - insertPlugin (p); - } - - if ( KBindingPropsPlugin::supports( m_items ) ) - { - KPropsDlgPlugin *p = new KBindingPropsPlugin( this ); - insertPlugin (p); - } - - if ( KURLPropsPlugin::supports( m_items ) ) - { - KPropsDlgPlugin *p = new KURLPropsPlugin( this ); - insertPlugin (p); - } - - if ( KDevicePropsPlugin::supports( m_items ) ) - { - KPropsDlgPlugin *p = new KDevicePropsPlugin( this ); - insertPlugin (p); - } - - if ( KFileMetaPropsPlugin::supports( m_items ) ) - { - KPropsDlgPlugin *p = new KFileMetaPropsPlugin( this ); - insertPlugin (p); - } - - if ( KPreviewPropsPlugin::supports( m_items ) ) - { - KPropsDlgPlugin *p = new KPreviewPropsPlugin( this ); - insertPlugin (p); - } - - if ( kapp->authorizeKAction("sharefile") && - KFileSharePropsPlugin::supports( m_items ) ) - { - KPropsDlgPlugin *p = new KFileSharePropsPlugin( this ); - insertPlugin (p); - } - - //plugins - - if ( m_items.count() != 1 ) - return; - - KFileItem *item = m_items.first(); - TQString mimetype = item->mimetype(); - - if ( mimetype.isEmpty() ) - return; - - TQString query = TQString::fromLatin1( - "('KPropsDlg/Plugin' in ServiceTypes) and " - "((not exist [X-TDE-Protocol]) or " - " ([X-TDE-Protocol] == '%1' ) )" ).arg(item->url().protocol()); - - kdDebug( 250 ) << "trader query: " << query << endl; - KTrader::OfferList offers = KTrader::self()->query( mimetype, query ); - KTrader::OfferList::ConstIterator it = offers.begin(); - KTrader::OfferList::ConstIterator end = offers.end(); - for (; it != end; ++it ) - { - KPropsDlgPlugin *plugin = KParts::ComponentFactory - ::createInstanceFromLibrary<KPropsDlgPlugin>( (*it)->library().local8Bit().data(), - TQT_TQOBJECT(this), - (*it)->name().latin1() ); - if ( !plugin ) - continue; - - insertPlugin( plugin ); - } -} - -void KPropertiesDialog::updateUrl( const KURL& _newUrl ) -{ - Q_ASSERT( m_items.count() == 1 ); - kdDebug(250) << "KPropertiesDialog::updateUrl (pre)" << _newUrl.url() << endl; - KURL newUrl = _newUrl; - emit saveAs(m_singleUrl, newUrl); - kdDebug(250) << "KPropertiesDialog::updateUrl (post)" << newUrl.url() << endl; - - m_singleUrl = newUrl; - m_items.first()->setURL( newUrl ); - assert(!m_singleUrl.isEmpty()); - // If we have an Desktop page, set it dirty, so that a full file is saved locally - // Same for a URL page (because of the Name= hack) - for ( TQPtrListIterator<KPropsDlgPlugin> it(m_pageList); it.current(); ++it ) - if ( it.current()->isA("KExecPropsPlugin") || // KDE4 remove me - it.current()->isA("KURLPropsPlugin") || - it.current()->isA("KDesktopPropsPlugin")) - { - //kdDebug(250) << "Setting page dirty" << endl; - it.current()->setDirty(); - break; - } -} - -void KPropertiesDialog::rename( const TQString& _name ) -{ - Q_ASSERT( m_items.count() == 1 ); - kdDebug(250) << "KPropertiesDialog::rename " << _name << endl; - KURL newUrl; - // if we're creating from a template : use currentdir - if ( !m_currentDir.isEmpty() ) - { - newUrl = m_currentDir; - newUrl.addPath( _name ); - } - else - { - TQString tmpurl = m_singleUrl.url(); - if ( tmpurl.at(tmpurl.length() - 1) == '/') - // It's a directory, so strip the trailing slash first - tmpurl.truncate( tmpurl.length() - 1); - newUrl = tmpurl; - newUrl.setFileName( _name ); - } - updateUrl( newUrl ); -} - -void KPropertiesDialog::abortApplying() -{ - d->m_aborted = true; -} - -class KPropsDlgPlugin::KPropsDlgPluginPrivate -{ -public: - KPropsDlgPluginPrivate() - { - } - ~KPropsDlgPluginPrivate() - { - } - - bool m_bDirty; -}; - -KPropsDlgPlugin::KPropsDlgPlugin( KPropertiesDialog *_props ) -: TQObject( _props, 0L ) -{ - d = new KPropsDlgPluginPrivate; - properties = _props; - fontHeight = 2*properties->fontMetrics().height(); - d->m_bDirty = false; -} - -KPropsDlgPlugin::~KPropsDlgPlugin() -{ - delete d; -} - -bool KPropsDlgPlugin::isDesktopFile( KFileItem * _item ) -{ - // only local files - bool isLocal; - KURL url = _item->mostLocalURL( isLocal ); - if ( !isLocal ) - return false; - - // only regular files - if ( !S_ISREG( _item->mode() ) ) - return false; - - TQString t( url.path() ); - - // only if readable - FILE *f = fopen( TQFile::encodeName(t), "r" ); - if ( f == 0L ) - return false; - fclose(f); - - // return true if desktop file - return ( (_item->mimetype() == "application/x-desktop") - || (_item->mimetype() == "media/builtin-mydocuments") - || (_item->mimetype() == "media/builtin-mycomputer") - || (_item->mimetype() == "media/builtin-mynetworkplaces") - || (_item->mimetype() == "media/builtin-printers") - || (_item->mimetype() == "media/builtin-trash") - || (_item->mimetype() == "media/builtin-webbrowser") ); -} - -void KPropsDlgPlugin::setDirty( bool b ) -{ - d->m_bDirty = b; -} - -void KPropsDlgPlugin::setDirty() -{ - d->m_bDirty = true; -} - -bool KPropsDlgPlugin::isDirty() const -{ - return d->m_bDirty; -} - -void KPropsDlgPlugin::applyChanges() -{ - kdWarning(250) << "applyChanges() not implemented in page !" << endl; -} - -/////////////////////////////////////////////////////////////////////////////// - -class KFilePropsPlugin::KFilePropsPluginPrivate -{ -public: - KFilePropsPluginPrivate() - { - dirSizeJob = 0L; - dirSizeUpdateTimer = 0L; - m_lined = 0; - m_freeSpaceLabel = 0; - } - ~KFilePropsPluginPrivate() - { - if ( dirSizeJob ) - dirSizeJob->kill(); - } - - KDirSize * dirSizeJob; - TQTimer *dirSizeUpdateTimer; - TQFrame *m_frame; - bool bMultiple; - bool bIconChanged; - bool bKDesktopMode; - bool bDesktopFile; - TQLabel *m_freeSpaceLabel; - TQString mimeType; - TQString oldFileName; - KLineEdit* m_lined; -}; - -KFilePropsPlugin::KFilePropsPlugin( KPropertiesDialog *_props ) - : KPropsDlgPlugin( _props ) -{ - d = new KFilePropsPluginPrivate; - d->bMultiple = (properties->items().count() > 1); - d->bIconChanged = false; - d->bKDesktopMode = (TQCString(tqApp->name()) == "kdesktop"); // nasty heh? - d->bDesktopFile = KDesktopPropsPlugin::supports(properties->items()); - kdDebug(250) << "KFilePropsPlugin::KFilePropsPlugin bMultiple=" << d->bMultiple << endl; - - // We set this data from the first item, and we'll - // check that the other items match against it, resetting when not. - bool isLocal; - KFileItem * item = properties->item(); - KURL url = item->mostLocalURL( isLocal ); - bool isReallyLocal = item->url().isLocalFile(); - bool bDesktopFile = isDesktopFile(item); - kdDebug() << "url=" << url << " bDesktopFile=" << bDesktopFile << " isLocal=" << isLocal << " isReallyLocal=" << isReallyLocal << endl; - mode_t mode = item->mode(); - bool hasDirs = item->isDir() && !item->isLink(); - bool hasRoot = url.path() == TQString::fromLatin1("/"); - TQString iconStr = KMimeType::iconForURL(url, mode); - TQString directory = properties->kurl().directory(); - TQString protocol = properties->kurl().protocol(); - TQString mimeComment = item->mimeComment(); - d->mimeType = item->mimetype(); - bool hasTotalSize; - TDEIO::filesize_t totalSize = item->size(hasTotalSize); - TQString magicMimeComment; - if ( isLocal ) { - KMimeType::Ptr magicMimeType = KMimeType::findByFileContent( url.path() ); - if ( magicMimeType->name() != KMimeType::defaultMimeType() ) - magicMimeComment = magicMimeType->comment(); - } - - // Those things only apply to 'single file' mode - TQString filename = TQString::null; - bool isTrash = false; - bool isDevice = false; - m_bFromTemplate = false; - - // And those only to 'multiple' mode - uint iDirCount = hasDirs ? 1 : 0; - uint iFileCount = 1-iDirCount; - - d->m_frame = properties->addPage (i18n("&General")); - - TQVBoxLayout *vbl = new TQVBoxLayout( d->m_frame, 0, - KDialog::spacingHint(), "vbl"); - TQGridLayout *grid = new TQGridLayout(0, 3); // unknown rows - grid->setColStretch(0, 0); - grid->setColStretch(1, 0); - grid->setColStretch(2, 1); - grid->addColSpacing(1, KDialog::spacingHint()); - vbl->addLayout(TQT_TQLAYOUT(grid)); - int curRow = 0; - - if ( !d->bMultiple ) - { - TQString path; - if ( !m_bFromTemplate ) { - isTrash = ( properties->kurl().protocol().find( "trash", 0, false)==0 ); - if ( properties->kurl().protocol().find("device", 0, false)==0) - isDevice = true; - // Extract the full name, but without file: for local files - if ( isReallyLocal ) - path = properties->kurl().path(); - else - path = properties->kurl().prettyURL(); - } else { - path = properties->currentDir().path(1) + properties->defaultName(); - directory = properties->currentDir().prettyURL(); - } - - if (KExecPropsPlugin::supports(properties->items()) || // KDE4 remove me - d->bDesktopFile || - KBindingPropsPlugin::supports(properties->items())) { - determineRelativePath( path ); - } - - // Extract the file name only - filename = properties->defaultName(); - if ( filename.isEmpty() ) { // no template - filename = item->name(); // this gives support for UDS_NAME, e.g. for kio_trash or kio_system - } else { - m_bFromTemplate = true; - setDirty(); // to enforce that the copy happens - } - d->oldFileName = filename; - - // Make it human-readable - filename = nameFromFileName( filename ); - - if ( d->bKDesktopMode && d->bDesktopFile ) { - KDesktopFile config( url.path(), true /* readonly */ ); - if ( config.hasKey( "Name" ) ) { - filename = config.readName(); - } - } - - oldName = filename; - } - else - { - // Multiple items: see what they have in common - KFileItemList items = properties->items(); - KFileItemListIterator it( items ); - for ( ++it /*no need to check the first one again*/ ; it.current(); ++it ) - { - KURL url = (*it)->url(); - kdDebug(250) << "KFilePropsPlugin::KFilePropsPlugin " << url.prettyURL() << endl; - // The list of things we check here should match the variables defined - // at the beginning of this method. - if ( url.isLocalFile() != isLocal ) - isLocal = false; // not all local - if ( bDesktopFile && isDesktopFile(*it) != bDesktopFile ) - bDesktopFile = false; // not all desktop files - if ( (*it)->mode() != mode ) - mode = (mode_t)0; - if ( KMimeType::iconForURL(url, mode) != iconStr ) - iconStr = "tdemultiple"; - if ( url.directory() != directory ) - directory = TQString::null; - if ( url.protocol() != protocol ) - protocol = TQString::null; - if ( !mimeComment.isNull() && (*it)->mimeComment() != mimeComment ) - mimeComment = TQString::null; - if ( isLocal && !magicMimeComment.isNull() ) { - KMimeType::Ptr magicMimeType = KMimeType::findByFileContent( url.path() ); - if ( magicMimeType->comment() != magicMimeComment ) - magicMimeComment = TQString::null; - } - - if ( url.path() == TQString::fromLatin1("/") ) - hasRoot = true; - if ( (*it)->isDir() && !(*it)->isLink() ) - { - iDirCount++; - hasDirs = true; - } - else - { - iFileCount++; - bool hasSize; - totalSize += (*it)->size(hasSize); - hasTotalSize = hasTotalSize || hasSize; - } - } - } - - if (!isReallyLocal && !protocol.isEmpty()) - { - directory += ' '; - directory += '('; - directory += protocol; - directory += ')'; - } - - if ( !isDevice && !isTrash && (bDesktopFile || S_ISDIR(mode)) && !d->bMultiple /*not implemented for multiple*/ ) - { - KIconButton *iconButton = new KIconButton( d->m_frame ); - int bsize = 66 + 2 * iconButton->style().pixelMetric(TQStyle::PM_ButtonMargin); - iconButton->setFixedSize(bsize, bsize); - iconButton->setIconSize(48); - iconButton->setStrictIconSize(false); - // This works for everything except Device icons on unmounted devices - // So we have to really open .desktop files - TQString iconStr = KMimeType::findByURL( url, mode )->icon( url, isLocal ); - if ( bDesktopFile && isLocal ) - { - KDesktopFile config( url.path(), true ); - config.setDesktopGroup(); - iconStr = config.readEntry( "Icon" ); - if ( config.hasDeviceType() ) - iconButton->setIconType( KIcon::Desktop, KIcon::Device ); - else - iconButton->setIconType( KIcon::Desktop, KIcon::Application ); - } else - iconButton->setIconType( KIcon::Desktop, KIcon::Place ); - iconButton->setIcon(iconStr); - iconArea = iconButton; - connect( iconButton, TQT_SIGNAL( iconChanged(TQString) ), - this, TQT_SLOT( slotIconChanged() ) ); - } else { - TQLabel *iconLabel = new TQLabel( d->m_frame ); - int bsize = 66 + 2 * iconLabel->style().pixelMetric(TQStyle::PM_ButtonMargin); - iconLabel->setFixedSize(bsize, bsize); - iconLabel->setPixmap( TDEGlobal::iconLoader()->loadIcon( iconStr, KIcon::Desktop, 48) ); - iconArea = iconLabel; - } - grid->addWidget(iconArea, curRow, 0, Qt::AlignLeft); - - if (d->bMultiple || isTrash || isDevice || hasRoot) - { - TQLabel *lab = new TQLabel(d->m_frame ); - if ( d->bMultiple ) - lab->setText( TDEIO::itemsSummaryString( iFileCount + iDirCount, iFileCount, iDirCount, 0, false ) ); - else - lab->setText( filename ); - nameArea = lab; - } else - { - d->m_lined = new KLineEdit( d->m_frame ); - d->m_lined->setText(filename); - nameArea = d->m_lined; - d->m_lined->setFocus(); - - // Enhanced rename: Don't highlight the file extension. - TQString pattern; - KServiceTypeFactory::self()->findFromPattern( filename, &pattern ); - if (!pattern.isEmpty() && pattern.at(0)=='*' && pattern.find('*',1)==-1) - d->m_lined->setSelection(0, filename.length()-pattern.stripWhiteSpace().length()+1); - else - { - int lastDot = filename.findRev('.'); - if (lastDot > 0) - d->m_lined->setSelection(0, lastDot); - } - - connect( d->m_lined, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SLOT( nameFileChanged(const TQString & ) ) ); - } - - grid->addWidget(nameArea, curRow++, 2); - - KSeparator* sep = new KSeparator( KSeparator::HLine, d->m_frame); - grid->addMultiCellWidget(sep, curRow, curRow, 0, 2); - ++curRow; - - TQLabel *l; - if ( !mimeComment.isEmpty() && !isDevice && !isTrash) - { - l = new TQLabel(i18n("Type:"), d->m_frame ); - - grid->addWidget(l, curRow, 0); - - TQHBox *box = new TQHBox(d->m_frame); - box->setSpacing(20); - l = new TQLabel(mimeComment, box ); - -#ifdef Q_WS_X11 - //TODO: wrap for win32 or mac? - TQPushButton *button = new TQPushButton(box); - - TQIconSet iconSet = SmallIconSet(TQString::fromLatin1("configure")); - TQPixmap pixMap = iconSet.pixmap( TQIconSet::Small, TQIconSet::Normal ); - button->setIconSet( iconSet ); - button->setFixedSize( pixMap.width()+8, pixMap.height()+8 ); - if ( d->mimeType == KMimeType::defaultMimeType() ) - TQToolTip::add(button, i18n("Create new file type")); - else - TQToolTip::add(button, i18n("Edit file type")); - - connect( button, TQT_SIGNAL( clicked() ), TQT_SLOT( slotEditFileType() )); - - if (!kapp->authorizeKAction("editfiletype")) - button->hide(); -#endif - - grid->addWidget(box, curRow++, 2); - } - - if ( !magicMimeComment.isEmpty() && magicMimeComment != mimeComment ) - { - l = new TQLabel(i18n("Contents:"), d->m_frame ); - grid->addWidget(l, curRow, 0); - - l = new TQLabel(magicMimeComment, d->m_frame ); - grid->addWidget(l, curRow++, 2); - } - - if ( !directory.isEmpty() ) - { - l = new TQLabel( i18n("Location:"), d->m_frame ); - grid->addWidget(l, curRow, 0); - - l = new KSqueezedTextLabel( d->m_frame ); - l->setText( directory ); - grid->addWidget(l, curRow++, 2); - } - - if( hasDirs || hasTotalSize ) { - l = new TQLabel(i18n("Size:"), d->m_frame ); - grid->addWidget(l, curRow, 0); - - m_sizeLabel = new TQLabel( d->m_frame ); - grid->addWidget( m_sizeLabel, curRow++, 2 ); - } else { - m_sizeLabel = 0; - } - - if ( !hasDirs ) // Only files [and symlinks] - { - if(hasTotalSize) { - m_sizeLabel->setText(TDEIO::convertSizeWithBytes(totalSize)); - } - - m_sizeDetermineButton = 0L; - m_sizeStopButton = 0L; - } - else // Directory - { - TQHBoxLayout * sizelay = new TQHBoxLayout(KDialog::spacingHint()); - grid->addLayout( sizelay, curRow++, 2 ); - - // buttons - m_sizeDetermineButton = new TQPushButton( i18n("Calculate"), d->m_frame ); - m_sizeStopButton = new TQPushButton( i18n("Stop"), d->m_frame ); - connect( m_sizeDetermineButton, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotSizeDetermine() ) ); - connect( m_sizeStopButton, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotSizeStop() ) ); - sizelay->addWidget(m_sizeDetermineButton, 0); - sizelay->addWidget(m_sizeStopButton, 0); - sizelay->addStretch(10); // so that the buttons don't grow horizontally - - // auto-launch for local dirs only, and not for '/' - if ( isLocal && !hasRoot ) - { - m_sizeDetermineButton->setText( i18n("Refresh") ); - slotSizeDetermine(); - } - else - m_sizeStopButton->setEnabled( false ); - } - - if (!d->bMultiple && item->isLink()) { - l = new TQLabel(i18n("Points to:"), d->m_frame ); - grid->addWidget(l, curRow, 0); - - l = new KSqueezedTextLabel(item->linkDest(), d->m_frame ); - grid->addWidget(l, curRow++, 2); - } - - if (!d->bMultiple) // Dates for multiple don't make much sense... - { - TQDateTime dt; - bool hasTime; - time_t tim = item->time(TDEIO::UDS_CREATION_TIME, hasTime); - if ( hasTime ) - { - l = new TQLabel(i18n("Created:"), d->m_frame ); - grid->addWidget(l, curRow, 0); - - dt.setTime_t( tim ); - l = new TQLabel(TDEGlobal::locale()->formatDateTime(dt), d->m_frame ); - grid->addWidget(l, curRow++, 2); - } - - tim = item->time(TDEIO::UDS_MODIFICATION_TIME, hasTime); - if ( hasTime ) - { - l = new TQLabel(i18n("Modified:"), d->m_frame ); - grid->addWidget(l, curRow, 0); - - dt.setTime_t( tim ); - l = new TQLabel(TDEGlobal::locale()->formatDateTime(dt), d->m_frame ); - grid->addWidget(l, curRow++, 2); - } - - tim = item->time(TDEIO::UDS_ACCESS_TIME, hasTime); - if ( hasTime ) - { - l = new TQLabel(i18n("Accessed:"), d->m_frame ); - grid->addWidget(l, curRow, 0); - - dt.setTime_t( tim ); - l = new TQLabel(TDEGlobal::locale()->formatDateTime(dt), d->m_frame ); - grid->addWidget(l, curRow++, 2); - } - } - - if ( isLocal && hasDirs ) // only for directories - { - sep = new KSeparator( KSeparator::HLine, d->m_frame); - grid->addMultiCellWidget(sep, curRow, curRow, 0, 2); - ++curRow; - - TQString mountPoint = TDEIO::findPathMountPoint( url.path() ); - - if (mountPoint != "/") - { - l = new TQLabel(i18n("Mounted on:"), d->m_frame ); - grid->addWidget(l, curRow, 0); - - l = new KSqueezedTextLabel( mountPoint, d->m_frame ); - grid->addWidget( l, curRow++, 2 ); - } - - l = new TQLabel(i18n("Free disk space:"), d->m_frame ); - grid->addWidget(l, curRow, 0); - - d->m_freeSpaceLabel = new TQLabel( d->m_frame ); - grid->addWidget( d->m_freeSpaceLabel, curRow++, 2 ); - - KDiskFreeSp * job = new KDiskFreeSp; - connect( job, TQT_SIGNAL( foundMountPoint( const unsigned long&, const unsigned long&, - const unsigned long&, const TQString& ) ), - this, TQT_SLOT( slotFoundMountPoint( const unsigned long&, const unsigned long&, - const unsigned long&, const TQString& ) ) ); - job->readDF( mountPoint ); - } - - vbl->addStretch(1); -} - -// TQString KFilePropsPlugin::tabName () const -// { -// return i18n ("&General"); -// } - -void KFilePropsPlugin::setFileNameReadOnly( bool ro ) -{ - if ( d->m_lined ) - { - d->m_lined->setReadOnly( ro ); - if (ro) - { - // Don't put the initial focus on the line edit when it is ro - TQPushButton *button = properties->actionButton(KDialogBase::Ok); - if (button) - button->setFocus(); - } - } -} - -void KFilePropsPlugin::slotEditFileType() -{ -#ifdef Q_WS_X11 - TQString mime; - if ( d->mimeType == KMimeType::defaultMimeType() ) { - int pos = d->oldFileName.findRev( '.' ); - if ( pos != -1 ) - mime = "*" + d->oldFileName.mid(pos); - else - mime = "*"; - } - else - mime = d->mimeType; - //TODO: wrap for win32 or mac? - TQString keditfiletype = TQString::fromLatin1("keditfiletype"); - KRun::runCommand( keditfiletype - + " --parent " + TQString::number( (ulong)properties->topLevelWidget()->winId()) - + " " + TDEProcess::quote(mime), - keditfiletype, keditfiletype /*unused*/); -#endif -} - -void KFilePropsPlugin::slotIconChanged() -{ - d->bIconChanged = true; - emit changed(); -} - -void KFilePropsPlugin::nameFileChanged(const TQString &text ) -{ - properties->enableButtonOK(!text.isEmpty()); - emit changed(); -} - -void KFilePropsPlugin::determineRelativePath( const TQString & path ) -{ - // now let's make it relative - TQStringList dirs; - if (KBindingPropsPlugin::supports(properties->items())) - { - m_sRelativePath =TDEGlobal::dirs()->relativeLocation("mime", path); - if (m_sRelativePath.startsWith("/")) - m_sRelativePath = TQString::null; - } - else - { - m_sRelativePath =TDEGlobal::dirs()->relativeLocation("apps", path); - if (m_sRelativePath.startsWith("/")) - { - m_sRelativePath =TDEGlobal::dirs()->relativeLocation("xdgdata-apps", path); - if (m_sRelativePath.startsWith("/")) - m_sRelativePath = TQString::null; - else - m_sRelativePath = path; - } - } - if ( m_sRelativePath.isEmpty() ) - { - if (KBindingPropsPlugin::supports(properties->items())) - kdWarning(250) << "Warning : editing a mimetype file out of the mimetype dirs!" << endl; - } -} - -void KFilePropsPlugin::slotFoundMountPoint( const TQString&, - unsigned long kBSize, - unsigned long /*kBUsed*/, - unsigned long kBAvail ) -{ - d->m_freeSpaceLabel->setText( - // xgettext:no-c-format -- Don't warn about translating the %1 out of %2 part. - i18n("Available space out of total partition size (percent used)", "%1 out of %2 (%3% used)") - .arg(TDEIO::convertSizeFromKB(kBAvail)) - .arg(TDEIO::convertSizeFromKB(kBSize)) - .arg( 100 - (int)(100.0 * kBAvail / kBSize) )); -} - -// attention: copy&paste below, due to compiler bug -// it doesn't like those unsigned long parameters -- unsigned long& are ok :-/ -void KFilePropsPlugin::slotFoundMountPoint( const unsigned long& kBSize, - const unsigned long& /*kBUsed*/, - const unsigned long& kBAvail, - const TQString& ) -{ - d->m_freeSpaceLabel->setText( - // xgettext:no-c-format -- Don't warn about translating the %1 out of %2 part. - i18n("Available space out of total partition size (percent used)", "%1 out of %2 (%3% used)") - .arg(TDEIO::convertSizeFromKB(kBAvail)) - .arg(TDEIO::convertSizeFromKB(kBSize)) - .arg( 100 - (int)(100.0 * kBAvail / kBSize) )); -} - -void KFilePropsPlugin::slotDirSizeUpdate() -{ - TDEIO::filesize_t totalSize = d->dirSizeJob->totalSize(); - TDEIO::filesize_t totalFiles = d->dirSizeJob->totalFiles(); - TDEIO::filesize_t totalSubdirs = d->dirSizeJob->totalSubdirs(); - m_sizeLabel->setText( i18n("Calculating... %1 (%2)\n%3, %4") - .arg(TDEIO::convertSize(totalSize)) - .arg(TDEGlobal::locale()->formatNumber(totalSize, 0)) - .arg(i18n("1 file","%n files",totalFiles)) - .arg(i18n("1 sub-folder","%n sub-folders",totalSubdirs))); -} - -void KFilePropsPlugin::slotDirSizeFinished( TDEIO::Job * job ) -{ - if (job->error()) - m_sizeLabel->setText( job->errorString() ); - else - { - TDEIO::filesize_t totalSize = static_cast<KDirSize*>(job)->totalSize(); - TDEIO::filesize_t totalFiles = static_cast<KDirSize*>(job)->totalFiles(); - TDEIO::filesize_t totalSubdirs = static_cast<KDirSize*>(job)->totalSubdirs(); - m_sizeLabel->setText( TQString::fromLatin1("%1 (%2)\n%3, %4") - .arg(TDEIO::convertSize(totalSize)) - .arg(TDEGlobal::locale()->formatNumber(totalSize, 0)) - .arg(i18n("1 file","%n files",totalFiles)) - .arg(i18n("1 sub-folder","%n sub-folders",totalSubdirs))); - } - m_sizeStopButton->setEnabled(false); - // just in case you change something and try again :) - m_sizeDetermineButton->setText( i18n("Refresh") ); - m_sizeDetermineButton->setEnabled(true); - d->dirSizeJob = 0L; - delete d->dirSizeUpdateTimer; - d->dirSizeUpdateTimer = 0L; -} - -void KFilePropsPlugin::slotSizeDetermine() -{ - m_sizeLabel->setText( i18n("Calculating...") ); - kdDebug(250) << " KFilePropsPlugin::slotSizeDetermine() properties->item()=" << properties->item() << endl; - kdDebug(250) << " URL=" << properties->item()->url().url() << endl; - d->dirSizeJob = KDirSize::dirSizeJob( properties->items() ); - d->dirSizeUpdateTimer = new TQTimer(this); - connect( d->dirSizeUpdateTimer, TQT_SIGNAL( timeout() ), - TQT_SLOT( slotDirSizeUpdate() ) ); - d->dirSizeUpdateTimer->start(500); - connect( d->dirSizeJob, TQT_SIGNAL( result( TDEIO::Job * ) ), - TQT_SLOT( slotDirSizeFinished( TDEIO::Job * ) ) ); - m_sizeStopButton->setEnabled(true); - m_sizeDetermineButton->setEnabled(false); - - // also update the "Free disk space" display - if ( d->m_freeSpaceLabel ) - { - bool isLocal; - KFileItem * item = properties->item(); - KURL url = item->mostLocalURL( isLocal ); - TQString mountPoint = TDEIO::findPathMountPoint( url.path() ); - - KDiskFreeSp * job = new KDiskFreeSp; - connect( job, TQT_SIGNAL( foundMountPoint( const unsigned long&, const unsigned long&, - const unsigned long&, const TQString& ) ), - this, TQT_SLOT( slotFoundMountPoint( const unsigned long&, const unsigned long&, - const unsigned long&, const TQString& ) ) ); - job->readDF( mountPoint ); - } -} - -void KFilePropsPlugin::slotSizeStop() -{ - if ( d->dirSizeJob ) - { - m_sizeLabel->setText( i18n("Stopped") ); - d->dirSizeJob->kill(); - d->dirSizeJob = 0; - } - if ( d->dirSizeUpdateTimer ) - d->dirSizeUpdateTimer->stop(); - - m_sizeStopButton->setEnabled(false); - m_sizeDetermineButton->setEnabled(true); -} - -KFilePropsPlugin::~KFilePropsPlugin() -{ - delete d; -} - -bool KFilePropsPlugin::supports( KFileItemList /*_items*/ ) -{ - return true; -} - -// Don't do this at home -void tqt_enter_modal( TQWidget *widget ); -void tqt_leave_modal( TQWidget *widget ); - -void KFilePropsPlugin::applyChanges() -{ - if ( d->dirSizeJob ) - slotSizeStop(); - - kdDebug(250) << "KFilePropsPlugin::applyChanges" << endl; - - if (nameArea->inherits(TQLINEEDIT_OBJECT_NAME_STRING)) - { - TQString n = ((TQLineEdit *) nameArea)->text(); - // Remove trailing spaces (#4345) - while ( n[n.length()-1].isSpace() ) - n.truncate( n.length() - 1 ); - if ( n.isEmpty() ) - { - KMessageBox::sorry( properties, i18n("The new file name is empty.")); - properties->abortApplying(); - return; - } - - // Do we need to rename the file ? - kdDebug(250) << "oldname = " << oldName << endl; - kdDebug(250) << "newname = " << n << endl; - if ( oldName != n || m_bFromTemplate ) { // true for any from-template file - TDEIO::Job * job = 0L; - KURL oldurl = properties->kurl(); - - TQString newFileName = TDEIO::encodeFileName(n); - if (d->bDesktopFile && !newFileName.endsWith(".desktop") && !newFileName.endsWith(".kdelnk")) - newFileName += ".desktop"; - - // Tell properties. Warning, this changes the result of properties->kurl() ! - properties->rename( newFileName ); - - // Update also relative path (for apps and mimetypes) - if ( !m_sRelativePath.isEmpty() ) - determineRelativePath( properties->kurl().path() ); - - kdDebug(250) << "New URL = " << properties->kurl().url() << endl; - kdDebug(250) << "old = " << oldurl.url() << endl; - - // Don't remove the template !! - if ( !m_bFromTemplate ) // (normal renaming) - job = TDEIO::move( oldurl, properties->kurl() ); - else // Copying a template - job = TDEIO::copy( oldurl, properties->kurl() ); - - connect( job, TQT_SIGNAL( result( TDEIO::Job * ) ), - TQT_SLOT( slotCopyFinished( TDEIO::Job * ) ) ); - connect( job, TQT_SIGNAL( renamed( TDEIO::Job *, const KURL &, const KURL & ) ), - TQT_SLOT( slotFileRenamed( TDEIO::Job *, const KURL &, const KURL & ) ) ); - // wait for job - TQWidget dummy(0,0,(WFlags)(WType_Dialog|WShowModal)); - tqt_enter_modal(&dummy); - tqApp->enter_loop(); - tqt_leave_modal(&dummy); - return; - } - properties->updateUrl(properties->kurl()); - // Update also relative path (for apps and mimetypes) - if ( !m_sRelativePath.isEmpty() ) - determineRelativePath( properties->kurl().path() ); - } - - // No job, keep going - slotCopyFinished( 0L ); -} - -void KFilePropsPlugin::slotCopyFinished( TDEIO::Job * job ) -{ - kdDebug(250) << "KFilePropsPlugin::slotCopyFinished" << endl; - if (job) - { - // allow apply() to return - tqApp->exit_loop(); - if ( job->error() ) - { - job->showErrorDialog( d->m_frame ); - // Didn't work. Revert the URL to the old one - properties->updateUrl( static_cast<TDEIO::CopyJob*>(job)->srcURLs().first() ); - properties->abortApplying(); // Don't apply the changes to the wrong file ! - return; - } - } - - assert( properties->item() ); - assert( !properties->item()->url().isEmpty() ); - - // Save the file where we can -> usually in ~/.trinity/... - if (KBindingPropsPlugin::supports(properties->items()) && !m_sRelativePath.isEmpty()) - { - KURL newURL; - newURL.setPath( locateLocal("mime", m_sRelativePath) ); - properties->updateUrl( newURL ); - } - else if (d->bDesktopFile && !m_sRelativePath.isEmpty()) - { - kdDebug(250) << "KFilePropsPlugin::slotCopyFinished " << m_sRelativePath << endl; - KURL newURL; - newURL.setPath( KDesktopFile::locateLocal(m_sRelativePath) ); - kdDebug(250) << "KFilePropsPlugin::slotCopyFinished path=" << newURL.path() << endl; - properties->updateUrl( newURL ); - } - - if ( d->bKDesktopMode && d->bDesktopFile ) { - // Renamed? Update Name field - if ( d->oldFileName != properties->kurl().fileName() || m_bFromTemplate ) { - KDesktopFile config( properties->kurl().path() ); - TQString nameStr = nameFromFileName(properties->kurl().fileName()); - config.writeEntry( "Name", nameStr ); - config.writeEntry( "Name", nameStr, true, false, true ); - } - } -} - -void KFilePropsPlugin::applyIconChanges() -{ - KIconButton *iconButton = ::tqqt_cast<KIconButton *>( iconArea ); - if ( !iconButton || !d->bIconChanged ) - return; - // handle icon changes - only local files (or pseudo-local) for now - // TODO: Use KTempFile and TDEIO::file_copy with overwrite = true - KURL url = properties->kurl(); - url = TDEIO::NetAccess::mostLocalURL( url, properties ); - if (url.isLocalFile()) { - TQString path; - - if (S_ISDIR(properties->item()->mode())) - { - path = url.path(1) + TQString::fromLatin1(".directory"); - // don't call updateUrl because the other tabs (i.e. permissions) - // apply to the directory, not the .directory file. - } - else - path = url.path(); - - // Get the default image - TQString str = KMimeType::findByURL( url, - properties->item()->mode(), - true )->KServiceType::icon(); - // Is it another one than the default ? - TQString sIcon; - if ( str != iconButton->icon() ) - sIcon = iconButton->icon(); - // (otherwise write empty value) - - kdDebug(250) << "**" << path << "**" << endl; - TQFile f( path ); - - // If default icon and no .directory file -> don't create one - if ( !sIcon.isEmpty() || f.exists() ) - { - if ( !f.open( IO_ReadWrite ) ) { - KMessageBox::sorry( 0, i18n("<qt>Could not save properties. You do not " - "have sufficient access to write to <b>%1</b>.</qt>").arg(path)); - return; - } - f.close(); - - KDesktopFile cfg(path); - kdDebug(250) << "sIcon = " << (sIcon) << endl; - kdDebug(250) << "str = " << (str) << endl; - cfg.writeEntry( "Icon", sIcon ); - cfg.sync(); - } - } -} - -void KFilePropsPlugin::slotFileRenamed( TDEIO::Job *, const KURL &, const KURL & newUrl ) -{ - // This is called in case of an existing local file during the copy/move operation, - // if the user chooses Rename. - properties->updateUrl( newUrl ); -} - -void KFilePropsPlugin::postApplyChanges() -{ - // Save the icon only after applying the permissions changes (#46192) - applyIconChanges(); - - KURL::List lst; - KFileItemList items = properties->items(); - for ( KFileItemListIterator it( items ); it.current(); ++it ) - lst.append((*it)->url()); - KDirNotify_stub allDirNotify("*", "KDirNotify*"); - allDirNotify.FilesChanged( lst ); -} - -class KFilePermissionsPropsPlugin::KFilePermissionsPropsPluginPrivate -{ -public: - KFilePermissionsPropsPluginPrivate() - { - } - ~KFilePermissionsPropsPluginPrivate() - { - } - - TQFrame *m_frame; - TQCheckBox *cbRecursive; - TQLabel *explanationLabel; - TQComboBox *ownerPermCombo, *groupPermCombo, *othersPermCombo; - TQCheckBox *extraCheckbox; - mode_t partialPermissions; - KFilePermissionsPropsPlugin::PermissionsMode pmode; - bool canChangePermissions; - bool isIrregular; - bool hasExtendedACL; - KACL extendedACL; - KACL defaultACL; - bool fileSystemSupportsACLs; -}; - -#define UniOwner (S_IRUSR|S_IWUSR|S_IXUSR) -#define UniGroup (S_IRGRP|S_IWGRP|S_IXGRP) -#define UniOthers (S_IROTH|S_IWOTH|S_IXOTH) -#define UniRead (S_IRUSR|S_IRGRP|S_IROTH) -#define UniWrite (S_IWUSR|S_IWGRP|S_IWOTH) -#define UniExec (S_IXUSR|S_IXGRP|S_IXOTH) -#define UniSpecial (S_ISUID|S_ISGID|S_ISVTX) - -// synced with PermissionsTarget -const mode_t KFilePermissionsPropsPlugin::permissionsMasks[3] = {UniOwner, UniGroup, UniOthers}; -const mode_t KFilePermissionsPropsPlugin::standardPermissions[4] = { 0, UniRead, UniRead|UniWrite, (mode_t)-1 }; - -// synced with PermissionsMode and standardPermissions -const char *KFilePermissionsPropsPlugin::permissionsTexts[4][4] = { - { I18N_NOOP("Forbidden"), - I18N_NOOP("Can Read"), - I18N_NOOP("Can Read & Write"), - 0 }, - { I18N_NOOP("Forbidden"), - I18N_NOOP("Can View Content"), - I18N_NOOP("Can View & Modify Content"), - 0 }, - { 0, 0, 0, 0}, // no texts for links - { I18N_NOOP("Forbidden"), - I18N_NOOP("Can View Content & Read"), - I18N_NOOP("Can View/Read & Modify/Write"), - 0 } -}; - - -KFilePermissionsPropsPlugin::KFilePermissionsPropsPlugin( KPropertiesDialog *_props ) - : KPropsDlgPlugin( _props ) -{ - d = new KFilePermissionsPropsPluginPrivate; - d->cbRecursive = 0L; - grpCombo = 0L; grpEdit = 0; - usrEdit = 0L; - TQString path = properties->kurl().path(-1); - TQString fname = properties->kurl().fileName(); - bool isLocal = properties->kurl().isLocalFile(); - bool isTrash = ( properties->kurl().protocol().find("trash", 0, false)==0 ); - bool IamRoot = (geteuid() == 0); - - KFileItem * item = properties->item(); - bool isLink = item->isLink(); - bool isDir = item->isDir(); // all dirs - bool hasDir = item->isDir(); // at least one dir - permissions = item->permissions(); // common permissions to all files - d->partialPermissions = permissions; // permissions that only some files have (at first we take everything) - d->isIrregular = isIrregular(permissions, isDir, isLink); - strOwner = item->user(); - strGroup = item->group(); - d->hasExtendedACL = item->ACL().isExtended() || item->defaultACL().isValid(); - d->extendedACL = item->ACL(); - d->defaultACL = item->defaultACL(); - d->fileSystemSupportsACLs = false; - - if ( properties->items().count() > 1 ) - { - // Multiple items: see what they have in common - KFileItemList items = properties->items(); - KFileItemListIterator it( items ); - for ( ++it /*no need to check the first one again*/ ; it.current(); ++it ) - { - if (!d->isIrregular) - d->isIrregular |= isIrregular((*it)->permissions(), - (*it)->isDir() == isDir, - (*it)->isLink() == isLink); - d->hasExtendedACL = d->hasExtendedACL || (*it)->hasExtendedACL(); - if ( (*it)->isLink() != isLink ) - isLink = false; - if ( (*it)->isDir() != isDir ) - isDir = false; - hasDir |= (*it)->isDir(); - if ( (*it)->permissions() != permissions ) - { - permissions &= (*it)->permissions(); - d->partialPermissions |= (*it)->permissions(); - } - if ( (*it)->user() != strOwner ) - strOwner = TQString::null; - if ( (*it)->group() != strGroup ) - strGroup = TQString::null; - } - } - - if (isLink) - d->pmode = PermissionsOnlyLinks; - else if (isDir) - d->pmode = PermissionsOnlyDirs; - else if (hasDir) - d->pmode = PermissionsMixed; - else - d->pmode = PermissionsOnlyFiles; - - // keep only what's not in the common permissions - d->partialPermissions = d->partialPermissions & ~permissions; - - bool isMyFile = false; - - if (isLocal && !strOwner.isEmpty()) { // local files, and all owned by the same person - struct passwd *myself = getpwuid( geteuid() ); - if ( myself != 0L ) - { - isMyFile = (strOwner == TQString::fromLocal8Bit(myself->pw_name)); - } else - kdWarning() << "I don't exist ?! geteuid=" << geteuid() << endl; - } else { - //We don't know, for remote files, if they are ours or not. - //So we let the user change permissions, and - //TDEIO::chmod will tell, if he had no right to do it. - isMyFile = true; - } - - d->canChangePermissions = (isMyFile || IamRoot) && (!isLink); - - - // create GUI - - d->m_frame = properties->addPage(i18n("&Permissions")); - - TQBoxLayout *box = new TQVBoxLayout( d->m_frame, 0, KDialog::spacingHint() ); - - TQWidget *l; - TQLabel *lbl; - TQGroupBox *gb; - TQGridLayout *gl; - TQPushButton* pbAdvancedPerm = 0; - - /* Group: Access Permissions */ - gb = new TQGroupBox ( 0, Qt::Vertical, i18n("Access Permissions"), d->m_frame ); - gb->layout()->setSpacing(KDialog::spacingHint()); - gb->layout()->setMargin(KDialog::marginHint()); - box->addWidget (gb); - - gl = new TQGridLayout (gb->layout(), 7, 2); - gl->setColStretch(1, 1); - - l = d->explanationLabel = new TQLabel( "", gb ); - if (isLink) - d->explanationLabel->setText(i18n("This file is a link and does not have permissions.", - "All files are links and do not have permissions.", - properties->items().count())); - else if (!d->canChangePermissions) - d->explanationLabel->setText(i18n("Only the owner can change permissions.")); - gl->addMultiCellWidget(l, 0, 0, 0, 1); - - lbl = new TQLabel( i18n("O&wner:"), gb); - gl->addWidget(lbl, 1, 0); - l = d->ownerPermCombo = new TQComboBox(gb); - lbl->setBuddy(l); - gl->addWidget(l, 1, 1); - connect(l, TQT_SIGNAL( highlighted(int) ), this, TQT_SIGNAL( changed() )); - TQWhatsThis::add(l, i18n("Specifies the actions that the owner is allowed to do.")); - - lbl = new TQLabel( i18n("Gro&up:"), gb); - gl->addWidget(lbl, 2, 0); - l = d->groupPermCombo = new TQComboBox(gb); - lbl->setBuddy(l); - gl->addWidget(l, 2, 1); - connect(l, TQT_SIGNAL( highlighted(int) ), this, TQT_SIGNAL( changed() )); - TQWhatsThis::add(l, i18n("Specifies the actions that the members of the group are allowed to do.")); - - lbl = new TQLabel( i18n("O&thers:"), gb); - gl->addWidget(lbl, 3, 0); - l = d->othersPermCombo = new TQComboBox(gb); - lbl->setBuddy(l); - gl->addWidget(l, 3, 1); - connect(l, TQT_SIGNAL( highlighted(int) ), this, TQT_SIGNAL( changed() )); - TQWhatsThis::add(l, i18n("Specifies the actions that all users, who are neither " - "owner nor in the group, are allowed to do.")); - - if (!isLink) { - l = d->extraCheckbox = new TQCheckBox(hasDir ? - i18n("Only own&er can rename and delete folder content") : - i18n("Is &executable"), - gb ); - connect( d->extraCheckbox, TQT_SIGNAL( clicked() ), this, TQT_SIGNAL( changed() ) ); - gl->addWidget(l, 4, 1); - TQWhatsThis::add(l, hasDir ? i18n("Enable this option to allow only the folder's owner to " - "delete or rename the contained files and folders. Other " - "users can only add new files, which requires the 'Modify " - "Content' permission.") - : i18n("Enable this option to mark the file as executable. This only makes " - "sense for programs and scripts. It is required when you want to " - "execute them.")); - - TQLayoutItem *spacer = TQT_TQLAYOUTITEM(new TQSpacerItem(0, 20, TQSizePolicy::Minimum, TQSizePolicy::Expanding)); - gl->addMultiCell(spacer, 5, 5, 0, 1); - - pbAdvancedPerm = new TQPushButton(i18n("A&dvanced Permissions"), gb); - gl->addMultiCellWidget(pbAdvancedPerm, 6, 6, 0, 1, Qt::AlignRight); - connect(pbAdvancedPerm, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotShowAdvancedPermissions() )); - } - else - d->extraCheckbox = 0; - - - /**** Group: Ownership ****/ - gb = new TQGroupBox ( 0, Qt::Vertical, i18n("Ownership"), d->m_frame ); - gb->layout()->setSpacing(KDialog::spacingHint()); - gb->layout()->setMargin(KDialog::marginHint()); - box->addWidget (gb); - - gl = new TQGridLayout (gb->layout(), 4, 3); - gl->addRowSpacing(0, 10); - - /*** Set Owner ***/ - l = new TQLabel( i18n("User:"), gb ); - gl->addWidget (l, 1, 0); - - /* GJ: Don't autocomplete more than 1000 users. This is a kind of random - * value. Huge sites having 10.000+ user have a fair chance of using NIS, - * (possibly) making this unacceptably slow. - * OTOH, it is nice to offer this functionality for the standard user. - */ - int i, maxEntries = 1000; - struct passwd *user; - struct group *ge; - - /* File owner: For root, offer a KLineEdit with autocompletion. - * For a user, who can never chown() a file, offer a TQLabel. - */ - if (IamRoot && isLocal) - { - usrEdit = new KLineEdit( gb ); - KCompletion *kcom = usrEdit->completionObject(); - kcom->setOrder(KCompletion::Sorted); - setpwent(); - for (i=0; ((user = getpwent()) != 0L) && (i < maxEntries); i++) - kcom->addItem(TQString::fromLatin1(user->pw_name)); - endpwent(); - usrEdit->setCompletionMode((i < maxEntries) ? TDEGlobalSettings::CompletionAuto : - TDEGlobalSettings::CompletionNone); - usrEdit->setText(strOwner); - gl->addWidget(usrEdit, 1, 1); - connect( usrEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - } - else - { - l = new TQLabel(strOwner, gb); - gl->addWidget(l, 1, 1); - } - - /*** Set Group ***/ - - TQStringList groupList; - TQCString strUser; - user = getpwuid(geteuid()); - if (user != 0L) - strUser = user->pw_name; - -#ifdef Q_OS_UNIX - setgrent(); - for (i=0; ((ge = getgrent()) != 0L) && (i < maxEntries); i++) - { - if (IamRoot) - groupList += TQString::fromLatin1(ge->gr_name); - else - { - /* pick the groups to which the user belongs */ - char ** members = ge->gr_mem; - char * member; - while ((member = *members) != 0L) { - if (strUser == member) { - groupList += TQString::fromLocal8Bit(ge->gr_name); - break; - } - ++members; - } - } - } - endgrent(); -#endif //Q_OS_UNIX - - /* add the effective Group to the list .. */ - ge = getgrgid (getegid()); - if (ge) { - TQString name = TQString::fromLatin1(ge->gr_name); - if (name.isEmpty()) - name.setNum(ge->gr_gid); - if (groupList.find(name) == groupList.end()) - groupList += name; - } - - bool isMyGroup = groupList.contains(strGroup); - - /* add the group the file currently belongs to .. - * .. if its not there already - */ - if (!isMyGroup) - groupList += strGroup; - - l = new TQLabel( i18n("Group:"), gb ); - gl->addWidget (l, 2, 0); - - /* Set group: if possible to change: - * - Offer a KLineEdit for root, since he can change to any group. - * - Offer a TQComboBox for a normal user, since he can change to a fixed - * (small) set of groups only. - * If not changeable: offer a TQLabel. - */ - if (IamRoot && isLocal) - { - grpEdit = new KLineEdit(gb); - KCompletion *kcom = new KCompletion; - kcom->setItems(groupList); - grpEdit->setCompletionObject(kcom, true); - grpEdit->setAutoDeleteCompletionObject( true ); - grpEdit->setCompletionMode(TDEGlobalSettings::CompletionAuto); - grpEdit->setText(strGroup); - gl->addWidget(grpEdit, 2, 1); - connect( grpEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - } - else if ((groupList.count() > 1) && isMyFile && isLocal) - { - grpCombo = new TQComboBox(gb, "combogrouplist"); - grpCombo->insertStringList(groupList); - grpCombo->setCurrentItem(groupList.findIndex(strGroup)); - gl->addWidget(grpCombo, 2, 1); - connect( grpCombo, TQT_SIGNAL( activated( int ) ), - this, TQT_SIGNAL( changed() ) ); - } - else - { - l = new TQLabel(strGroup, gb); - gl->addWidget(l, 2, 1); - } - - gl->setColStretch(2, 10); - - // "Apply recursive" checkbox - if ( hasDir && !isLink && !isTrash ) - { - d->cbRecursive = new TQCheckBox( i18n("Apply changes to all subfolders and their contents"), d->m_frame ); - connect( d->cbRecursive, TQT_SIGNAL( clicked() ), this, TQT_SIGNAL( changed() ) ); - box->addWidget( d->cbRecursive ); - } - - updateAccessControls(); - - - if ( isTrash || !d->canChangePermissions ) - { - //don't allow to change properties for file into trash - enableAccessControls(false); - if ( pbAdvancedPerm && !d->hasExtendedACL ) - pbAdvancedPerm->setEnabled(false); - } - - box->addStretch (10); -} - -#ifdef USE_POSIX_ACL -static bool fileSystemSupportsACL( const TQCString& pathCString ) -{ - bool fileSystemSupportsACLs = false; -#ifdef Q_OS_FREEBSD - struct statfs buf; - fileSystemSupportsACLs = ( statfs( pathCString.data(), &buf ) == 0 ) && ( buf.f_flags & MNT_ACLS ); -#else - fileSystemSupportsACLs = - getxattr( pathCString.data(), "system.posix_acl_access", NULL, 0 ) >= 0 -#ifdef ENODATA - || (errno == ENODATA) -#endif -#ifdef ENOATTR - || (errno == ENOATTR) -#endif - ; -#endif - return fileSystemSupportsACLs; -} -#endif - - -void KFilePermissionsPropsPlugin::slotShowAdvancedPermissions() { - - bool isDir = (d->pmode == PermissionsOnlyDirs) || (d->pmode == PermissionsMixed); - KDialogBase dlg(properties, 0, true, i18n("Advanced Permissions"), - KDialogBase::Ok|KDialogBase::Cancel); - - TQLabel *l, *cl[3]; - TQGroupBox *gb; - TQGridLayout *gl; - - TQVBox *mainVBox = dlg.makeVBoxMainWidget(); - - // Group: Access Permissions - gb = new TQGroupBox ( 0, Qt::Vertical, i18n("Access Permissions"), mainVBox ); - gb->layout()->setSpacing(KDialog::spacingHint()); - gb->layout()->setMargin(KDialog::marginHint()); - - gl = new TQGridLayout (gb->layout(), 6, 6); - gl->addRowSpacing(0, 10); - - TQValueVector<TQWidget*> theNotSpecials; - - l = new TQLabel(i18n("Class"), gb ); - gl->addWidget(l, 1, 0); - theNotSpecials.append( l ); - - if (isDir) - l = new TQLabel( i18n("Show\nEntries"), gb ); - else - l = new TQLabel( i18n("Read"), gb ); - gl->addWidget (l, 1, 1); - theNotSpecials.append( l ); - TQString readWhatsThis; - if (isDir) - readWhatsThis = i18n("This flag allows viewing the content of the folder."); - else - readWhatsThis = i18n("The Read flag allows viewing the content of the file."); - TQWhatsThis::add(l, readWhatsThis); - - if (isDir) - l = new TQLabel( i18n("Write\nEntries"), gb ); - else - l = new TQLabel( i18n("Write"), gb ); - gl->addWidget (l, 1, 2); - theNotSpecials.append( l ); - TQString writeWhatsThis; - if (isDir) - writeWhatsThis = i18n("This flag allows adding, renaming and deleting of files. " - "Note that deleting and renaming can be limited using the Sticky flag."); - else - writeWhatsThis = i18n("The Write flag allows modifying the content of the file."); - TQWhatsThis::add(l, writeWhatsThis); - - TQString execWhatsThis; - if (isDir) { - l = new TQLabel( i18n("Enter folder", "Enter"), gb ); - execWhatsThis = i18n("Enable this flag to allow entering the folder."); - } - else { - l = new TQLabel( i18n("Exec"), gb ); - execWhatsThis = i18n("Enable this flag to allow executing the file as a program."); - } - TQWhatsThis::add(l, execWhatsThis); - theNotSpecials.append( l ); - // GJ: Add space between normal and special modes - TQSize size = l->sizeHint(); - size.setWidth(size.width() + 15); - l->setFixedSize(size); - gl->addWidget (l, 1, 3); - - l = new TQLabel( i18n("Special"), gb ); - gl->addMultiCellWidget(l, 1, 1, 4, 5); - TQString specialWhatsThis; - if (isDir) - specialWhatsThis = i18n("Special flag. Valid for the whole folder, the exact " - "meaning of the flag can be seen in the right hand column."); - else - specialWhatsThis = i18n("Special flag. The exact meaning of the flag can be seen " - "in the right hand column."); - TQWhatsThis::add(l, specialWhatsThis); - - cl[0] = new TQLabel( i18n("User"), gb ); - gl->addWidget (cl[0], 2, 0); - theNotSpecials.append( cl[0] ); - - cl[1] = new TQLabel( i18n("Group"), gb ); - gl->addWidget (cl[1], 3, 0); - theNotSpecials.append( cl[1] ); - - cl[2] = new TQLabel( i18n("Others"), gb ); - gl->addWidget (cl[2], 4, 0); - theNotSpecials.append( cl[2] ); - - l = new TQLabel(i18n("Set UID"), gb); - gl->addWidget(l, 2, 5); - TQString setUidWhatsThis; - if (isDir) - setUidWhatsThis = i18n("If this flag is set, the owner of this folder will be " - "the owner of all new files."); - else - setUidWhatsThis = i18n("If this file is an executable and the flag is set, it will " - "be executed with the permissions of the owner."); - TQWhatsThis::add(l, setUidWhatsThis); - - l = new TQLabel(i18n("Set GID"), gb); - gl->addWidget(l, 3, 5); - TQString setGidWhatsThis; - if (isDir) - setGidWhatsThis = i18n("If this flag is set, the group of this folder will be " - "set for all new files."); - else - setGidWhatsThis = i18n("If this file is an executable and the flag is set, it will " - "be executed with the permissions of the group."); - TQWhatsThis::add(l, setGidWhatsThis); - - l = new TQLabel(i18n("File permission", "Sticky"), gb); - gl->addWidget(l, 4, 5); - TQString stickyWhatsThis; - if (isDir) - stickyWhatsThis = i18n("If the Sticky flag is set on a folder, only the owner " - "and root can delete or rename files. Otherwise everybody " - "with write permissions can do this."); - else - stickyWhatsThis = i18n("The Sticky flag on a file is ignored on Linux, but may " - "be used on some systems"); - TQWhatsThis::add(l, stickyWhatsThis); - - mode_t aPermissions, aPartialPermissions; - mode_t dummy1, dummy2; - - if (!d->isIrregular) { - switch (d->pmode) { - case PermissionsOnlyFiles: - getPermissionMasks(aPartialPermissions, - dummy1, - aPermissions, - dummy2); - break; - case PermissionsOnlyDirs: - case PermissionsMixed: - getPermissionMasks(dummy1, - aPartialPermissions, - dummy2, - aPermissions); - break; - case PermissionsOnlyLinks: - aPermissions = UniRead | UniWrite | UniExec | UniSpecial; - aPartialPermissions = 0; - break; - } - } - else { - aPermissions = permissions; - aPartialPermissions = d->partialPermissions; - } - - // Draw Checkboxes - TQCheckBox *cba[3][4]; - for (int row = 0; row < 3 ; ++row) { - for (int col = 0; col < 4; ++col) { - TQCheckBox *cb = new TQCheckBox( gb ); - if ( col != 3 ) theNotSpecials.append( cb ); - cba[row][col] = cb; - cb->setChecked(aPermissions & fperm[row][col]); - if ( aPartialPermissions & fperm[row][col] ) - { - cb->setTristate(); - cb->setNoChange(); - } - else if (d->cbRecursive && d->cbRecursive->isChecked()) - cb->setTristate(); - - cb->setEnabled( d->canChangePermissions ); - gl->addWidget (cb, row+2, col+1); - switch(col) { - case 0: - TQWhatsThis::add(cb, readWhatsThis); - break; - case 1: - TQWhatsThis::add(cb, writeWhatsThis); - break; - case 2: - TQWhatsThis::add(cb, execWhatsThis); - break; - case 3: - switch(row) { - case 0: - TQWhatsThis::add(cb, setUidWhatsThis); - break; - case 1: - TQWhatsThis::add(cb, setGidWhatsThis); - break; - case 2: - TQWhatsThis::add(cb, stickyWhatsThis); - break; - } - break; - } - } - } - gl->setColStretch(6, 10); - -#ifdef USE_POSIX_ACL - KACLEditWidget *extendedACLs = 0; - - // FIXME make it work with partial entries - if ( properties->items().count() == 1 ) { - TQCString pathCString = TQFile::encodeName( properties->item()->url().path() ); - d->fileSystemSupportsACLs = fileSystemSupportsACL( pathCString ); - } - if ( d->fileSystemSupportsACLs ) { - std::for_each( theNotSpecials.begin(), theNotSpecials.end(), std::mem_fun( &TQWidget::hide ) ); - extendedACLs = new KACLEditWidget( mainVBox ); - if ( d->extendedACL.isValid() && d->extendedACL.isExtended() ) - extendedACLs->setACL( d->extendedACL ); - else - extendedACLs->setACL( KACL( aPermissions ) ); - - if ( d->defaultACL.isValid() ) - extendedACLs->setDefaultACL( d->defaultACL ); - - if ( properties->items().first()->isDir() ) - extendedACLs->setAllowDefaults( true ); - if ( !d->canChangePermissions ) - extendedACLs->setReadOnly( true ); - - } -#endif - if (dlg.exec() != KDialogBase::Accepted) - return; - - mode_t andPermissions = mode_t(~0); - mode_t orPermissions = 0; - for (int row = 0; row < 3; ++row) - for (int col = 0; col < 4; ++col) { - switch (cba[row][col]->state()) - { - case TQCheckBox::On: - orPermissions |= fperm[row][col]; - //fall through - case TQCheckBox::Off: - andPermissions &= ~fperm[row][col]; - break; - default: // NoChange - break; - } - } - - d->isIrregular = false; - KFileItemList items = properties->items(); - for (KFileItemListIterator it(items); it.current(); ++it) { - if (isIrregular(((*it)->permissions() & andPermissions) | orPermissions, - (*it)->isDir(), (*it)->isLink())) { - d->isIrregular = true; - break; - } - } - - permissions = orPermissions; - d->partialPermissions = andPermissions; - -#ifdef USE_POSIX_ACL - // override with the acls, if present - if ( extendedACLs ) { - d->extendedACL = extendedACLs->getACL(); - d->defaultACL = extendedACLs->getDefaultACL(); - d->hasExtendedACL = d->extendedACL.isExtended() || d->defaultACL.isValid(); - permissions = d->extendedACL.basePermissions(); - permissions |= ( andPermissions | orPermissions ) & ( S_ISUID|S_ISGID|S_ISVTX ); - } -#endif - - updateAccessControls(); - emit changed(); -} - -// TQString KFilePermissionsPropsPlugin::tabName () const -// { -// return i18n ("&Permissions"); -// } - -KFilePermissionsPropsPlugin::~KFilePermissionsPropsPlugin() -{ - delete d; -} - -bool KFilePermissionsPropsPlugin::supports( KFileItemList _items ) -{ - KFileItemList::const_iterator it = _items.constBegin(); - for ( ; it != _items.constEnd(); ++it ) { - KFileItem *item = *it; - if( !item->user().isEmpty() || !item->group().isEmpty() ) - return true; - } - return false; -} - -// sets a combo box in the Access Control frame -void KFilePermissionsPropsPlugin::setComboContent(TQComboBox *combo, PermissionsTarget target, - mode_t permissions, mode_t partial) { - combo->clear(); - if (d->pmode == PermissionsOnlyLinks) { - combo->insertItem(i18n("Link")); - combo->setCurrentItem(0); - return; - } - - mode_t tMask = permissionsMasks[target]; - int textIndex; - for (textIndex = 0; standardPermissions[textIndex] != (mode_t)-1; textIndex++) - if ((standardPermissions[textIndex]&tMask) == (permissions&tMask&(UniRead|UniWrite))) - break; - Q_ASSERT(standardPermissions[textIndex] != (mode_t)-1); // must not happen, would be irreglar - - for (int i = 0; permissionsTexts[(int)d->pmode][i]; i++) - combo->insertItem(i18n(permissionsTexts[(int)d->pmode][i])); - - if (partial & tMask & ~UniExec) { - combo->insertItem(i18n("Varying (No Change)")); - combo->setCurrentItem(3); - } - else - combo->setCurrentItem(textIndex); -} - -// permissions are irregular if they cant be displayed in a combo box. -bool KFilePermissionsPropsPlugin::isIrregular(mode_t permissions, bool isDir, bool isLink) { - if (isLink) // links are always ok - return false; - - mode_t p = permissions; - if (p & (S_ISUID | S_ISGID)) // setuid/setgid -> irregular - return true; - if (isDir) { - p &= ~S_ISVTX; // ignore sticky on dirs - - // check supported flag combinations - mode_t p0 = p & UniOwner; - if ((p0 != 0) && (p0 != (S_IRUSR | S_IXUSR)) && (p0 != UniOwner)) - return true; - p0 = p & UniGroup; - if ((p0 != 0) && (p0 != (S_IRGRP | S_IXGRP)) && (p0 != UniGroup)) - return true; - p0 = p & UniOthers; - if ((p0 != 0) && (p0 != (S_IROTH | S_IXOTH)) && (p0 != UniOthers)) - return true; - return false; - } - if (p & S_ISVTX) // sticky on file -> irregular - return true; - - // check supported flag combinations - mode_t p0 = p & UniOwner; - bool usrXPossible = !p0; // true if this file could be an executable - if (p0 & S_IXUSR) { - if ((p0 == S_IXUSR) || (p0 == (S_IWUSR | S_IXUSR))) - return true; - usrXPossible = true; - } - else if (p0 == S_IWUSR) - return true; - - p0 = p & UniGroup; - bool grpXPossible = !p0; // true if this file could be an executable - if (p0 & S_IXGRP) { - if ((p0 == S_IXGRP) || (p0 == (S_IWGRP | S_IXGRP))) - return true; - grpXPossible = true; - } - else if (p0 == S_IWGRP) - return true; - if (p0 == 0) - grpXPossible = true; - - p0 = p & UniOthers; - bool othXPossible = !p0; // true if this file could be an executable - if (p0 & S_IXOTH) { - if ((p0 == S_IXOTH) || (p0 == (S_IWOTH | S_IXOTH))) - return true; - othXPossible = true; - } - else if (p0 == S_IWOTH) - return true; - - // check that there either all targets are executable-compatible, or none - return (p & UniExec) && !(usrXPossible && grpXPossible && othXPossible); -} - -// enables/disabled the widgets in the Access Control frame -void KFilePermissionsPropsPlugin::enableAccessControls(bool enable) { - d->ownerPermCombo->setEnabled(enable); - d->groupPermCombo->setEnabled(enable); - d->othersPermCombo->setEnabled(enable); - if (d->extraCheckbox) - d->extraCheckbox->setEnabled(enable); - if ( d->cbRecursive ) - d->cbRecursive->setEnabled(enable); -} - -// updates all widgets in the Access Control frame -void KFilePermissionsPropsPlugin::updateAccessControls() { - setComboContent(d->ownerPermCombo, PermissionsOwner, - permissions, d->partialPermissions); - setComboContent(d->groupPermCombo, PermissionsGroup, - permissions, d->partialPermissions); - setComboContent(d->othersPermCombo, PermissionsOthers, - permissions, d->partialPermissions); - - switch(d->pmode) { - case PermissionsOnlyLinks: - enableAccessControls(false); - break; - case PermissionsOnlyFiles: - enableAccessControls(d->canChangePermissions && !d->isIrregular && !d->hasExtendedACL); - if (d->canChangePermissions) - d->explanationLabel->setText(d->isIrregular || d->hasExtendedACL ? - i18n("This file uses advanced permissions", - "These files use advanced permissions.", - properties->items().count()) : ""); - if (d->partialPermissions & UniExec) { - d->extraCheckbox->setTristate(); - d->extraCheckbox->setNoChange(); - } - else { - d->extraCheckbox->setTristate(false); - d->extraCheckbox->setChecked(permissions & UniExec); - } - break; - case PermissionsOnlyDirs: - enableAccessControls(d->canChangePermissions && !d->isIrregular && !d->hasExtendedACL); - // if this is a dir, and we can change permissions, don't dis-allow - // recursive, we can do that for ACL setting. - if ( d->cbRecursive ) - d->cbRecursive->setEnabled( d->canChangePermissions && !d->isIrregular ); - - if (d->canChangePermissions) - d->explanationLabel->setText(d->isIrregular || d->hasExtendedACL ? - i18n("This folder uses advanced permissions.", - "These folders use advanced permissions.", - properties->items().count()) : ""); - if (d->partialPermissions & S_ISVTX) { - d->extraCheckbox->setTristate(); - d->extraCheckbox->setNoChange(); - } - else { - d->extraCheckbox->setTristate(false); - d->extraCheckbox->setChecked(permissions & S_ISVTX); - } - break; - case PermissionsMixed: - enableAccessControls(d->canChangePermissions && !d->isIrregular && !d->hasExtendedACL); - if (d->canChangePermissions) - d->explanationLabel->setText(d->isIrregular || d->hasExtendedACL ? - i18n("These files use advanced permissions.") : ""); - break; - if (d->partialPermissions & S_ISVTX) { - d->extraCheckbox->setTristate(); - d->extraCheckbox->setNoChange(); - } - else { - d->extraCheckbox->setTristate(false); - d->extraCheckbox->setChecked(permissions & S_ISVTX); - } - break; - } -} - -// gets masks for files and dirs from the Access Control frame widgets -void KFilePermissionsPropsPlugin::getPermissionMasks(mode_t &andFilePermissions, - mode_t &andDirPermissions, - mode_t &orFilePermissions, - mode_t &orDirPermissions) { - andFilePermissions = mode_t(~UniSpecial); - andDirPermissions = mode_t(~(S_ISUID|S_ISGID)); - orFilePermissions = 0; - orDirPermissions = 0; - if (d->isIrregular) - return; - - mode_t m = standardPermissions[d->ownerPermCombo->currentItem()]; - if (m != (mode_t) -1) { - orFilePermissions |= m & UniOwner; - if ((m & UniOwner) && - ((d->pmode == PermissionsMixed) || - ((d->pmode == PermissionsOnlyFiles) && (d->extraCheckbox->state() == TQButton::NoChange)))) - andFilePermissions &= ~(S_IRUSR | S_IWUSR); - else { - andFilePermissions &= ~(S_IRUSR | S_IWUSR | S_IXUSR); - if ((m & S_IRUSR) && (d->extraCheckbox->state() == TQButton::On)) - orFilePermissions |= S_IXUSR; - } - - orDirPermissions |= m & UniOwner; - if (m & S_IRUSR) - orDirPermissions |= S_IXUSR; - andDirPermissions &= ~(S_IRUSR | S_IWUSR | S_IXUSR); - } - - m = standardPermissions[d->groupPermCombo->currentItem()]; - if (m != (mode_t) -1) { - orFilePermissions |= m & UniGroup; - if ((m & UniGroup) && - ((d->pmode == PermissionsMixed) || - ((d->pmode == PermissionsOnlyFiles) && (d->extraCheckbox->state() == TQButton::NoChange)))) - andFilePermissions &= ~(S_IRGRP | S_IWGRP); - else { - andFilePermissions &= ~(S_IRGRP | S_IWGRP | S_IXGRP); - if ((m & S_IRGRP) && (d->extraCheckbox->state() == TQButton::On)) - orFilePermissions |= S_IXGRP; - } - - orDirPermissions |= m & UniGroup; - if (m & S_IRGRP) - orDirPermissions |= S_IXGRP; - andDirPermissions &= ~(S_IRGRP | S_IWGRP | S_IXGRP); - } - - m = standardPermissions[d->othersPermCombo->currentItem()]; - if (m != (mode_t) -1) { - orFilePermissions |= m & UniOthers; - if ((m & UniOthers) && - ((d->pmode == PermissionsMixed) || - ((d->pmode == PermissionsOnlyFiles) && (d->extraCheckbox->state() == TQButton::NoChange)))) - andFilePermissions &= ~(S_IROTH | S_IWOTH); - else { - andFilePermissions &= ~(S_IROTH | S_IWOTH | S_IXOTH); - if ((m & S_IROTH) && (d->extraCheckbox->state() == TQButton::On)) - orFilePermissions |= S_IXOTH; - } - - orDirPermissions |= m & UniOthers; - if (m & S_IROTH) - orDirPermissions |= S_IXOTH; - andDirPermissions &= ~(S_IROTH | S_IWOTH | S_IXOTH); - } - - if (((d->pmode == PermissionsMixed) || (d->pmode == PermissionsOnlyDirs)) && - (d->extraCheckbox->state() != TQButton::NoChange)) { - andDirPermissions &= ~S_ISVTX; - if (d->extraCheckbox->state() == TQButton::On) - orDirPermissions |= S_ISVTX; - } -} - -void KFilePermissionsPropsPlugin::applyChanges() -{ - mode_t orFilePermissions; - mode_t orDirPermissions; - mode_t andFilePermissions; - mode_t andDirPermissions; - - if (!d->canChangePermissions) - return; - - if (!d->isIrregular) - getPermissionMasks(andFilePermissions, - andDirPermissions, - orFilePermissions, - orDirPermissions); - else { - orFilePermissions = permissions; - andFilePermissions = d->partialPermissions; - orDirPermissions = permissions; - andDirPermissions = d->partialPermissions; - } - - TQString owner, group; - if (usrEdit) - owner = usrEdit->text(); - if (grpEdit) - group = grpEdit->text(); - else if (grpCombo) - group = grpCombo->currentText(); - - if (owner == strOwner) - owner = TQString::null; // no change - - if (group == strGroup) - group = TQString::null; - - bool recursive = d->cbRecursive && d->cbRecursive->isChecked(); - bool permissionChange = false; - - KFileItemList files, dirs; - KFileItemList items = properties->items(); - for (KFileItemListIterator it(items); it.current(); ++it) { - if ((*it)->isDir()) { - dirs.append(*it); - if ((*it)->permissions() != (((*it)->permissions() & andDirPermissions) | orDirPermissions)) - permissionChange = true; - } - else if ((*it)->isFile()) { - files.append(*it); - if ((*it)->permissions() != (((*it)->permissions() & andFilePermissions) | orFilePermissions)) - permissionChange = true; - } - } - - const bool ACLChange = ( d->extendedACL != properties->item()->ACL() ); - const bool defaultACLChange = ( d->defaultACL != properties->item()->defaultACL() ); - - if ( owner.isEmpty() && group.isEmpty() && !recursive - && !permissionChange && !ACLChange && !defaultACLChange ) - return; - - TDEIO::Job * job; - if (files.count() > 0) { - job = TDEIO::chmod( files, orFilePermissions, ~andFilePermissions, - owner, group, false ); - if ( ACLChange && d->fileSystemSupportsACLs ) - job->addMetaData( "ACL_STRING", d->extendedACL.isValid()?d->extendedACL.asString():"ACL_DELETE" ); - if ( defaultACLChange && d->fileSystemSupportsACLs ) - job->addMetaData( "DEFAULT_ACL_STRING", d->defaultACL.isValid()?d->defaultACL.asString():"ACL_DELETE" ); - - connect( job, TQT_SIGNAL( result( TDEIO::Job * ) ), - TQT_SLOT( slotChmodResult( TDEIO::Job * ) ) ); - // Wait for job - TQWidget dummy(0,0,(WFlags)(WType_Dialog|WShowModal)); - tqt_enter_modal(&dummy); - tqApp->enter_loop(); - tqt_leave_modal(&dummy); - } - if (dirs.count() > 0) { - job = TDEIO::chmod( dirs, orDirPermissions, ~andDirPermissions, - owner, group, recursive ); - if ( ACLChange && d->fileSystemSupportsACLs ) - job->addMetaData( "ACL_STRING", d->extendedACL.isValid()?d->extendedACL.asString():"ACL_DELETE" ); - if ( defaultACLChange && d->fileSystemSupportsACLs ) - job->addMetaData( "DEFAULT_ACL_STRING", d->defaultACL.isValid()?d->defaultACL.asString():"ACL_DELETE" ); - - connect( job, TQT_SIGNAL( result( TDEIO::Job * ) ), - TQT_SLOT( slotChmodResult( TDEIO::Job * ) ) ); - // Wait for job - TQWidget dummy(0,0,(WFlags)(WType_Dialog|WShowModal)); - tqt_enter_modal(&dummy); - tqApp->enter_loop(); - tqt_leave_modal(&dummy); - } -} - -void KFilePermissionsPropsPlugin::slotChmodResult( TDEIO::Job * job ) -{ - kdDebug(250) << "KFilePermissionsPropsPlugin::slotChmodResult" << endl; - if (job->error()) - job->showErrorDialog( d->m_frame ); - // allow apply() to return - tqApp->exit_loop(); -} - - - - -class KURLPropsPlugin::KURLPropsPluginPrivate -{ -public: - KURLPropsPluginPrivate() - { - } - ~KURLPropsPluginPrivate() - { - } - - TQFrame *m_frame; -}; - -KURLPropsPlugin::KURLPropsPlugin( KPropertiesDialog *_props ) - : KPropsDlgPlugin( _props ) -{ - d = new KURLPropsPluginPrivate; - d->m_frame = properties->addPage(i18n("U&RL")); - TQVBoxLayout *layout = new TQVBoxLayout(d->m_frame, 0, KDialog::spacingHint()); - - TQLabel *l; - l = new TQLabel( d->m_frame, "Label_1" ); - l->setText( i18n("URL:") ); - layout->addWidget(l); - - URLEdit = new KURLRequester( d->m_frame, "URL Requester" ); - layout->addWidget(URLEdit); - - TQString path = properties->kurl().path(); - - TQFile f( path ); - if ( !f.open( IO_ReadOnly ) ) - return; - f.close(); - - KSimpleConfig config( path ); - config.setDesktopGroup(); - URLStr = config.readPathEntry( "URL" ); - - if ( !URLStr.isNull() ) - URLEdit->setURL( URLStr ); - - connect( URLEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - - layout->addStretch (1); -} - -KURLPropsPlugin::~KURLPropsPlugin() -{ - delete d; -} - -// TQString KURLPropsPlugin::tabName () const -// { -// return i18n ("U&RL"); -// } - -bool KURLPropsPlugin::supports( KFileItemList _items ) -{ - if ( _items.count() != 1 ) - return false; - KFileItem * item = _items.first(); - // check if desktop file - if ( !KPropsDlgPlugin::isDesktopFile( item ) ) - return false; - - // open file and check type - KDesktopFile config( item->url().path(), true /* readonly */ ); - return config.hasLinkType(); -} - -void KURLPropsPlugin::applyChanges() -{ - TQString path = properties->kurl().path(); - - TQFile f( path ); - if ( !f.open( IO_ReadWrite ) ) { - KMessageBox::sorry( 0, i18n("<qt>Could not save properties. You do not have " - "sufficient access to write to <b>%1</b>.</qt>").arg(path)); - return; - } - f.close(); - - KSimpleConfig config( path ); - config.setDesktopGroup(); - config.writeEntry( "Type", TQString::fromLatin1("Link")); - config.writePathEntry( "URL", URLEdit->url() ); - // Users can't create a Link .desktop file with a Name field, - // but distributions can. Update the Name field in that case. - if ( config.hasKey("Name") ) - { - TQString nameStr = nameFromFileName(properties->kurl().fileName()); - config.writeEntry( "Name", nameStr ); - config.writeEntry( "Name", nameStr, true, false, true ); - - } -} - - -/* ---------------------------------------------------- - * - * KBindingPropsPlugin - * - * -------------------------------------------------- */ - -class KBindingPropsPlugin::KBindingPropsPluginPrivate -{ -public: - KBindingPropsPluginPrivate() - { - } - ~KBindingPropsPluginPrivate() - { - } - - TQFrame *m_frame; -}; - -KBindingPropsPlugin::KBindingPropsPlugin( KPropertiesDialog *_props ) : KPropsDlgPlugin( _props ) -{ - d = new KBindingPropsPluginPrivate; - d->m_frame = properties->addPage(i18n("A&ssociation")); - patternEdit = new KLineEdit( d->m_frame, "LineEdit_1" ); - commentEdit = new KLineEdit( d->m_frame, "LineEdit_2" ); - mimeEdit = new KLineEdit( d->m_frame, "LineEdit_3" ); - - TQBoxLayout *mainlayout = new TQVBoxLayout(d->m_frame, 0, KDialog::spacingHint()); - TQLabel* tmpQLabel; - - tmpQLabel = new TQLabel( d->m_frame, "Label_1" ); - tmpQLabel->setText( i18n("Pattern ( example: *.html;*.htm )") ); - tmpQLabel->setMinimumSize(tmpQLabel->sizeHint()); - mainlayout->addWidget(tmpQLabel, 1); - - //patternEdit->setGeometry( 10, 40, 210, 30 ); - //patternEdit->setText( "" ); - patternEdit->setMaxLength( 512 ); - patternEdit->setMinimumSize( patternEdit->sizeHint() ); - patternEdit->setFixedHeight( fontHeight ); - mainlayout->addWidget(patternEdit, 1); - - tmpQLabel = new TQLabel( d->m_frame, "Label_2" ); - tmpQLabel->setText( i18n("Mime Type") ); - tmpQLabel->setMinimumSize(tmpQLabel->sizeHint()); - mainlayout->addWidget(tmpQLabel, 1); - - //mimeEdit->setGeometry( 10, 160, 210, 30 ); - mimeEdit->setMaxLength( 256 ); - mimeEdit->setMinimumSize( mimeEdit->sizeHint() ); - mimeEdit->setFixedHeight( fontHeight ); - mainlayout->addWidget(mimeEdit, 1); - - tmpQLabel = new TQLabel( d->m_frame, "Label_3" ); - tmpQLabel->setText( i18n("Comment") ); - tmpQLabel->setMinimumSize(tmpQLabel->sizeHint()); - mainlayout->addWidget(tmpQLabel, 1); - - //commentEdit->setGeometry( 10, 100, 210, 30 ); - commentEdit->setMaxLength( 256 ); - commentEdit->setMinimumSize( commentEdit->sizeHint() ); - commentEdit->setFixedHeight( fontHeight ); - mainlayout->addWidget(commentEdit, 1); - - cbAutoEmbed = new TQCheckBox( i18n("Left click previews"), d->m_frame, "cbAutoEmbed" ); - mainlayout->addWidget(cbAutoEmbed, 1); - - mainlayout->addStretch (10); - mainlayout->activate(); - - TQFile f( _props->kurl().path() ); - if ( !f.open( IO_ReadOnly ) ) - return; - f.close(); - - KSimpleConfig config( _props->kurl().path() ); - config.setDesktopGroup(); - TQString patternStr = config.readEntry( "Patterns" ); - TQString iconStr = config.readEntry( "Icon" ); - TQString commentStr = config.readEntry( "Comment" ); - m_sMimeStr = config.readEntry( "MimeType" ); - - if ( !patternStr.isEmpty() ) - patternEdit->setText( patternStr ); - if ( !commentStr.isEmpty() ) - commentEdit->setText( commentStr ); - if ( !m_sMimeStr.isEmpty() ) - mimeEdit->setText( m_sMimeStr ); - cbAutoEmbed->setTristate(); - if ( config.hasKey( "X-TDE-AutoEmbed" ) ) - cbAutoEmbed->setChecked( config.readBoolEntry( "X-TDE-AutoEmbed" ) ); - else - cbAutoEmbed->setNoChange(); - - connect( patternEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( commentEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( mimeEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( cbAutoEmbed, TQT_SIGNAL( toggled( bool ) ), - this, TQT_SIGNAL( changed() ) ); -} - -KBindingPropsPlugin::~KBindingPropsPlugin() -{ - delete d; -} - -// TQString KBindingPropsPlugin::tabName () const -// { -// return i18n ("A&ssociation"); -// } - -bool KBindingPropsPlugin::supports( KFileItemList _items ) -{ - if ( _items.count() != 1 ) - return false; - KFileItem * item = _items.first(); - // check if desktop file - if ( !KPropsDlgPlugin::isDesktopFile( item ) ) - return false; - - // open file and check type - KDesktopFile config( item->url().path(), true /* readonly */ ); - return config.hasMimeTypeType(); -} - -void KBindingPropsPlugin::applyChanges() -{ - TQString path = properties->kurl().path(); - TQFile f( path ); - - if ( !f.open( IO_ReadWrite ) ) - { - KMessageBox::sorry( 0, i18n("<qt>Could not save properties. You do not have " - "sufficient access to write to <b>%1</b>.</qt>").arg(path)); - return; - } - f.close(); - - KSimpleConfig config( path ); - config.setDesktopGroup(); - config.writeEntry( "Type", TQString::fromLatin1("MimeType") ); - - config.writeEntry( "Patterns", patternEdit->text() ); - config.writeEntry( "Comment", commentEdit->text() ); - config.writeEntry( "Comment", - commentEdit->text(), true, false, true ); // for compat - config.writeEntry( "MimeType", mimeEdit->text() ); - if ( cbAutoEmbed->state() == TQButton::NoChange ) - config.deleteEntry( "X-TDE-AutoEmbed", false ); - else - config.writeEntry( "X-TDE-AutoEmbed", cbAutoEmbed->isChecked() ); - config.sync(); -} - -/* ---------------------------------------------------- - * - * KDevicePropsPlugin - * - * -------------------------------------------------- */ - -class KDevicePropsPlugin::KDevicePropsPluginPrivate -{ -public: - KDevicePropsPluginPrivate() - { - } - ~KDevicePropsPluginPrivate() - { - } - - TQFrame *m_frame; - TQStringList mountpointlist; - TQLabel *m_freeSpaceText; - TQLabel *m_freeSpaceLabel; - TQProgressBar *m_freeSpaceBar; -}; - -KDevicePropsPlugin::KDevicePropsPlugin( KPropertiesDialog *_props ) : KPropsDlgPlugin( _props ) -{ - d = new KDevicePropsPluginPrivate; - d->m_frame = properties->addPage(i18n("De&vice")); - - TQStringList devices; - KMountPoint::List mountPoints = KMountPoint::possibleMountPoints(); - - for(KMountPoint::List::ConstIterator it = mountPoints.begin(); - it != mountPoints.end(); ++it) - { - KMountPoint *mp = *it; - TQString mountPoint = mp->mountPoint(); - TQString device = mp->mountedFrom(); - kdDebug()<<"mountPoint :"<<mountPoint<<" device :"<<device<<" mp->mountType() :"<<mp->mountType()<<endl; - - if ((mountPoint != "-") && (mountPoint != "none") && !mountPoint.isEmpty() - && device != "none") - { - devices.append( device + TQString::fromLatin1(" (") - + mountPoint + TQString::fromLatin1(")") ); - m_devicelist.append(device); - d->mountpointlist.append(mountPoint); - } - } - - TQGridLayout *layout = new TQGridLayout( d->m_frame, 0, 2, 0, - KDialog::spacingHint()); - layout->setColStretch(1, 1); - - TQLabel* label; - label = new TQLabel( d->m_frame ); - label->setText( devices.count() == 0 ? - i18n("Device (/dev/fd0):") : // old style - i18n("Device:") ); // new style (combobox) - layout->addWidget(label, 0, 0); - - device = new TQComboBox( true, d->m_frame, "ComboBox_device" ); - device->insertStringList( devices ); - layout->addWidget(device, 0, 1); - connect( device, TQT_SIGNAL( activated( int ) ), - this, TQT_SLOT( slotActivated( int ) ) ); - - readonly = new TQCheckBox( d->m_frame, "CheckBox_readonly" ); - readonly->setText( i18n("Read only") ); - layout->addWidget(readonly, 1, 1); - - label = new TQLabel( d->m_frame ); - label->setText( i18n("File system:") ); - layout->addWidget(label, 2, 0); - - TQLabel *fileSystem = new TQLabel( d->m_frame ); - layout->addWidget(fileSystem, 2, 1); - - label = new TQLabel( d->m_frame ); - label->setText( devices.count()==0 ? - i18n("Mount point (/mnt/floppy):") : // old style - i18n("Mount point:")); // new style (combobox) - layout->addWidget(label, 3, 0); - - mountpoint = new TQLabel( d->m_frame, "LineEdit_mountpoint" ); - - layout->addWidget(mountpoint, 3, 1); - - // show disk free - d->m_freeSpaceText = new TQLabel(i18n("Free disk space:"), d->m_frame ); - layout->addWidget(d->m_freeSpaceText, 4, 0); - - d->m_freeSpaceLabel = new TQLabel( d->m_frame ); - layout->addWidget( d->m_freeSpaceLabel, 4, 1 ); - - d->m_freeSpaceBar = new TQProgressBar( d->m_frame, "freeSpaceBar" ); - layout->addMultiCellWidget(d->m_freeSpaceBar, 5, 5, 0, 1); - - // we show it in the slot when we know the values - d->m_freeSpaceText->hide(); - d->m_freeSpaceLabel->hide(); - d->m_freeSpaceBar->hide(); - - KSeparator* sep = new KSeparator( KSeparator::HLine, d->m_frame); - layout->addMultiCellWidget(sep, 6, 6, 0, 1); - - unmounted = new KIconButton( d->m_frame ); - int bsize = 66 + 2 * unmounted->style().pixelMetric(TQStyle::PM_ButtonMargin); - unmounted->setFixedSize(bsize, bsize); - unmounted->setIconType(KIcon::Desktop, KIcon::Device); - layout->addWidget(unmounted, 7, 0); - - label = new TQLabel( i18n("Unmounted Icon"), d->m_frame ); - layout->addWidget(label, 7, 1); - - layout->setRowStretch(8, 1); - - TQString path( _props->kurl().path() ); - - TQFile f( path ); - if ( !f.open( IO_ReadOnly ) ) - return; - f.close(); - - KSimpleConfig config( path ); - config.setDesktopGroup(); - TQString deviceStr = config.readEntry( "Dev" ); - TQString mountPointStr = config.readEntry( "MountPoint" ); - bool ro = config.readBoolEntry( "ReadOnly", false ); - TQString unmountedStr = config.readEntry( "UnmountIcon" ); - - fileSystem->setText( i18n(config.readEntry("FSType").local8Bit()) ); - - device->setEditText( deviceStr ); - if ( !deviceStr.isEmpty() ) { - // Set default options for this device (first matching entry) - int index = m_devicelist.findIndex(deviceStr); - if (index != -1) - { - //kdDebug(250) << "found it " << index << endl; - slotActivated( index ); - } - } - - if ( !mountPointStr.isEmpty() ) - { - mountpoint->setText( mountPointStr ); - updateInfo(); - } - - readonly->setChecked( ro ); - - if ( unmountedStr.isEmpty() ) - unmountedStr = KMimeType::defaultMimeTypePtr()->KServiceType::icon(); // default icon - - unmounted->setIcon( unmountedStr ); - - connect( device, TQT_SIGNAL( activated( int ) ), - this, TQT_SIGNAL( changed() ) ); - connect( device, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( readonly, TQT_SIGNAL( toggled( bool ) ), - this, TQT_SIGNAL( changed() ) ); - connect( unmounted, TQT_SIGNAL( iconChanged( TQString ) ), - this, TQT_SIGNAL( changed() ) ); - - connect( device, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SLOT( slotDeviceChanged() ) ); -} - -KDevicePropsPlugin::~KDevicePropsPlugin() -{ - delete d; -} - -// TQString KDevicePropsPlugin::tabName () const -// { -// return i18n ("De&vice"); -// } - -void KDevicePropsPlugin::updateInfo() -{ - // we show it in the slot when we know the values - d->m_freeSpaceText->hide(); - d->m_freeSpaceLabel->hide(); - d->m_freeSpaceBar->hide(); - - if ( !mountpoint->text().isEmpty() ) - { - KDiskFreeSp * job = new KDiskFreeSp; - connect( job, TQT_SIGNAL( foundMountPoint( const unsigned long&, const unsigned long&, - const unsigned long&, const TQString& ) ), - this, TQT_SLOT( slotFoundMountPoint( const unsigned long&, const unsigned long&, - const unsigned long&, const TQString& ) ) ); - - job->readDF( mountpoint->text() ); - } -} - -void KDevicePropsPlugin::slotActivated( int index ) -{ - // Update mountpoint so that it matches the device that was selected in the combo - device->setEditText( m_devicelist[index] ); - mountpoint->setText( d->mountpointlist[index] ); - - updateInfo(); -} - -void KDevicePropsPlugin::slotDeviceChanged() -{ - // Update mountpoint so that it matches the typed device - int index = m_devicelist.findIndex( device->currentText() ); - if ( index != -1 ) - mountpoint->setText( d->mountpointlist[index] ); - else - mountpoint->setText( TQString::null ); - - updateInfo(); -} - -void KDevicePropsPlugin::slotFoundMountPoint( const unsigned long& kBSize, - const unsigned long& /*kBUsed*/, - const unsigned long& kBAvail, - const TQString& ) -{ - d->m_freeSpaceText->show(); - d->m_freeSpaceLabel->show(); - - int percUsed = 100 - (int)(100.0 * kBAvail / kBSize); - - d->m_freeSpaceLabel->setText( - // xgettext:no-c-format -- Don't warn about translating the %1 out of %2 part. - i18n("Available space out of total partition size (percent used)", "%1 out of %2 (%3% used)") - .arg(TDEIO::convertSizeFromKB(kBAvail)) - .arg(TDEIO::convertSizeFromKB(kBSize)) - .arg( 100 - (int)(100.0 * kBAvail / kBSize) )); - - d->m_freeSpaceBar->setProgress(percUsed, 100); - d->m_freeSpaceBar->show(); -} - -bool KDevicePropsPlugin::supports( KFileItemList _items ) -{ - if ( _items.count() != 1 ) - return false; - KFileItem * item = _items.first(); - // check if desktop file - if ( !KPropsDlgPlugin::isDesktopFile( item ) ) - return false; - // open file and check type - KDesktopFile config( item->url().path(), true /* readonly */ ); - return config.hasDeviceType(); -} - -void KDevicePropsPlugin::applyChanges() -{ - TQString path = properties->kurl().path(); - TQFile f( path ); - if ( !f.open( IO_ReadWrite ) ) - { - KMessageBox::sorry( 0, i18n("<qt>Could not save properties. You do not have sufficient " - "access to write to <b>%1</b>.</qt>").arg(path)); - return; - } - f.close(); - - KSimpleConfig config( path ); - config.setDesktopGroup(); - config.writeEntry( "Type", TQString::fromLatin1("FSDevice") ); - - config.writeEntry( "Dev", device->currentText() ); - config.writeEntry( "MountPoint", mountpoint->text() ); - - config.writeEntry( "UnmountIcon", unmounted->icon() ); - kdDebug(250) << "unmounted->icon() = " << unmounted->icon() << endl; - - config.writeEntry( "ReadOnly", readonly->isChecked() ); - - config.sync(); -} - - -/* ---------------------------------------------------- - * - * KDesktopPropsPlugin - * - * -------------------------------------------------- */ - - -KDesktopPropsPlugin::KDesktopPropsPlugin( KPropertiesDialog *_props ) - : KPropsDlgPlugin( _props ) -{ - TQFrame *frame = properties->addPage(i18n("&Application")); - TQVBoxLayout *mainlayout = new TQVBoxLayout( frame, 0, KDialog::spacingHint() ); - - w = new KPropertiesDesktopBase(frame); - mainlayout->addWidget(w); - - bool bKDesktopMode = (TQCString(tqApp->name()) == "kdesktop"); // nasty heh? - - if (bKDesktopMode) - { - // Hide Name entry - w->nameEdit->hide(); - w->nameLabel->hide(); - } - - w->pathEdit->setMode(KFile::Directory | KFile::LocalOnly); - w->pathEdit->lineEdit()->setAcceptDrops(false); - - connect( w->nameEdit, TQT_SIGNAL( textChanged( const TQString & ) ), this, TQT_SIGNAL( changed() ) ); - connect( w->genNameEdit, TQT_SIGNAL( textChanged( const TQString & ) ), this, TQT_SIGNAL( changed() ) ); - connect( w->commentEdit, TQT_SIGNAL( textChanged( const TQString & ) ), this, TQT_SIGNAL( changed() ) ); - connect( w->commandEdit, TQT_SIGNAL( textChanged( const TQString & ) ), this, TQT_SIGNAL( changed() ) ); - connect( w->pathEdit, TQT_SIGNAL( textChanged( const TQString & ) ), this, TQT_SIGNAL( changed() ) ); - - connect( w->browseButton, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotBrowseExec() ) ); - connect( w->addFiletypeButton, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotAddFiletype() ) ); - connect( w->delFiletypeButton, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotDelFiletype() ) ); - connect( w->advancedButton, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotAdvanced() ) ); - - // now populate the page - TQString path = _props->kurl().path(); - TQFile f( path ); - if ( !f.open( IO_ReadOnly ) ) - return; - f.close(); - - KDesktopFile config( path ); - TQString nameStr = config.readName(); - TQString genNameStr = config.readGenericName(); - TQString commentStr = config.readComment(); - TQString commandStr = config.readPathEntry( "Exec" ); - if (commandStr.left(12) == "ksystraycmd ") - { - commandStr.remove(0, 12); - m_systrayBool = true; - } - else - m_systrayBool = false; - - m_origCommandStr = commandStr; - TQString pathStr = config.readPathEntry( "Path" ); - m_terminalBool = config.readBoolEntry( "Terminal" ); - m_terminalOptionStr = config.readEntry( "TerminalOptions" ); - m_suidBool = config.readBoolEntry( "X-TDE-SubstituteUID" ); - m_suidUserStr = config.readEntry( "X-TDE-Username" ); - if( config.hasKey( "StartupNotify" )) - m_startupBool = config.readBoolEntry( "StartupNotify", true ); - else - m_startupBool = config.readBoolEntry( "X-TDE-StartupNotify", true ); - m_dcopServiceType = config.readEntry("X-DCOP-ServiceType").lower(); - - TQStringList mimeTypes = config.readListEntry( "MimeType", ';' ); - - if ( nameStr.isEmpty() || bKDesktopMode ) { - // We'll use the file name if no name is specified - // because we _need_ a Name for a valid file. - // But let's do it in apply, not here, so that we pick up the right name. - setDirty(); - } - if ( !bKDesktopMode ) - w->nameEdit->setText(nameStr); - - w->genNameEdit->setText( genNameStr ); - w->commentEdit->setText( commentStr ); - w->commandEdit->setText( commandStr ); - w->pathEdit->lineEdit()->setText( pathStr ); - w->filetypeList->setAllColumnsShowFocus(true); - - KMimeType::Ptr defaultMimetype = KMimeType::defaultMimeTypePtr(); - for(TQStringList::ConstIterator it = mimeTypes.begin(); - it != mimeTypes.end(); ) - { - KMimeType::Ptr p = KMimeType::mimeType(*it); - ++it; - TQString preference; - if (it != mimeTypes.end()) - { - bool numeric; - (*it).toInt(&numeric); - if (numeric) - { - preference = *it; - ++it; - } - } - if (p && (p != defaultMimetype)) - { - new TQListViewItem(w->filetypeList, p->name(), p->comment(), preference); - } - } - -} - -KDesktopPropsPlugin::~KDesktopPropsPlugin() -{ -} - -void KDesktopPropsPlugin::slotSelectMimetype() -{ - TQListView *w = (TQListView*)sender(); - TQListViewItem *item = w->firstChild(); - while(item) - { - if (item->isSelected()) - w->setSelected(item, false); - item = item->nextSibling(); - } -} - -void KDesktopPropsPlugin::slotAddFiletype() -{ - KDialogBase dlg(w, "KPropertiesMimetypes", true, - i18n("Add File Type for %1").arg(properties->kurl().fileName()), - KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok); - - KGuiItem okItem(i18n("&Add"), TQString::null /* no icon */, - i18n("Add the selected file types to\nthe list of supported file types."), - i18n("Add the selected file types to\nthe list of supported file types.")); - dlg.setButtonOK(okItem); - - KPropertiesMimetypeBase *mw = new KPropertiesMimetypeBase(&dlg); - - dlg.setMainWidget(mw); - - { - mw->listView->setRootIsDecorated(true); - mw->listView->setSelectionMode(TQListView::Extended); - mw->listView->setAllColumnsShowFocus(true); - mw->listView->setFullWidth(true); - mw->listView->setMinimumSize(500,400); - - connect(mw->listView, TQT_SIGNAL(selectionChanged()), - this, TQT_SLOT(slotSelectMimetype())); - connect(mw->listView, TQT_SIGNAL(doubleClicked( TQListViewItem *, const TQPoint &, int )), - &dlg, TQT_SLOT( slotOk())); - - TQMap<TQString,TQListViewItem*> majorMap; - TQListViewItem *majorGroup; - KMimeType::List mimetypes = KMimeType::allMimeTypes(); - TQValueListIterator<KMimeType::Ptr> it(mimetypes.begin()); - for (; it != mimetypes.end(); ++it) { - TQString mimetype = (*it)->name(); - if (mimetype == KMimeType::defaultMimeType()) - continue; - int index = mimetype.find("/"); - TQString maj = mimetype.left(index); - TQString min = mimetype.mid(index+1); - - TQMapIterator<TQString,TQListViewItem*> mit = majorMap.find( maj ); - if ( mit == majorMap.end() ) { - majorGroup = new TQListViewItem( mw->listView, maj ); - majorGroup->setExpandable(true); - mw->listView->setOpen(majorGroup, true); - majorMap.insert( maj, majorGroup ); - } - else - { - majorGroup = mit.data(); - } - - TQListViewItem *item = new TQListViewItem(majorGroup, min, (*it)->comment()); - item->setPixmap(0, (*it)->pixmap(KIcon::Small, IconSize(KIcon::Small))); - } - TQMapIterator<TQString,TQListViewItem*> mit = majorMap.find( "all" ); - if ( mit != majorMap.end()) - { - mw->listView->setCurrentItem(mit.data()); - mw->listView->ensureItemVisible(mit.data()); - } - } - - if (dlg.exec() == KDialogBase::Accepted) - { - KMimeType::Ptr defaultMimetype = KMimeType::defaultMimeTypePtr(); - TQListViewItem *majorItem = mw->listView->firstChild(); - while(majorItem) - { - TQString major = majorItem->text(0); - - TQListViewItem *minorItem = majorItem->firstChild(); - while(minorItem) - { - if (minorItem->isSelected()) - { - TQString mimetype = major + "/" + minorItem->text(0); - KMimeType::Ptr p = KMimeType::mimeType(mimetype); - if (p && (p != defaultMimetype)) - { - mimetype = p->name(); - bool found = false; - TQListViewItem *item = w->filetypeList->firstChild(); - while (item) - { - if (mimetype == item->text(0)) - { - found = true; - break; - } - item = item->nextSibling(); - } - if (!found) { - new TQListViewItem(w->filetypeList, p->name(), p->comment()); - emit changed(); - } - } - } - minorItem = minorItem->nextSibling(); - } - - majorItem = majorItem->nextSibling(); - } - - } -} - -void KDesktopPropsPlugin::slotDelFiletype() -{ - delete w->filetypeList->currentItem(); - emit changed(); -} - -void KDesktopPropsPlugin::checkCommandChanged() -{ - if (KRun::binaryName(w->commandEdit->text(), true) != - KRun::binaryName(m_origCommandStr, true)) - { - TQString m_origCommandStr = w->commandEdit->text(); - m_dcopServiceType= TQString::null; // Reset - } -} - -void KDesktopPropsPlugin::applyChanges() -{ - kdDebug(250) << "KDesktopPropsPlugin::applyChanges" << endl; - TQString path = properties->kurl().path(); - - TQFile f( path ); - - if ( !f.open( IO_ReadWrite ) ) { - KMessageBox::sorry( 0, i18n("<qt>Could not save properties. You do not have " - "sufficient access to write to <b>%1</b>.</qt>").arg(path)); - return; - } - f.close(); - - // If the command is changed we reset certain settings that are strongly - // coupled to the command. - checkCommandChanged(); - - KSimpleConfig config( path ); - config.setDesktopGroup(); - config.writeEntry( "Type", TQString::fromLatin1("Application")); - config.writeEntry( "Comment", w->commentEdit->text() ); - config.writeEntry( "Comment", w->commentEdit->text(), true, false, true ); // for compat - config.writeEntry( "GenericName", w->genNameEdit->text() ); - config.writeEntry( "GenericName", w->genNameEdit->text(), true, false, true ); // for compat - - if (m_systrayBool) - config.writePathEntry( "Exec", w->commandEdit->text().prepend("ksystraycmd ") ); - else - config.writePathEntry( "Exec", w->commandEdit->text() ); - config.writePathEntry( "Path", w->pathEdit->lineEdit()->text() ); - - // Write mimeTypes - TQStringList mimeTypes; - for( TQListViewItem *item = w->filetypeList->firstChild(); - item; item = item->nextSibling() ) - { - TQString preference = item->text(2); - mimeTypes.append(item->text(0)); - if (!preference.isEmpty()) - mimeTypes.append(preference); - } - - config.writeEntry( "MimeType", mimeTypes, ';' ); - - if ( !w->nameEdit->isHidden() ) { - TQString nameStr = w->nameEdit->text(); - config.writeEntry( "Name", nameStr ); - config.writeEntry( "Name", nameStr, true, false, true ); - } - - config.writeEntry("Terminal", m_terminalBool); - config.writeEntry("TerminalOptions", m_terminalOptionStr); - config.writeEntry("X-TDE-SubstituteUID", m_suidBool); - config.writeEntry("X-TDE-Username", m_suidUserStr); - config.writeEntry("StartupNotify", m_startupBool); - config.writeEntry("X-DCOP-ServiceType", m_dcopServiceType); - config.sync(); - - // KSycoca update needed? - TQString sycocaPath = TDEGlobal::dirs()->relativeLocation("apps", path); - bool updateNeeded = !sycocaPath.startsWith("/"); - if (!updateNeeded) - { - sycocaPath = TDEGlobal::dirs()->relativeLocation("xdgdata-apps", path); - updateNeeded = !sycocaPath.startsWith("/"); - } - if (updateNeeded) - KService::rebuildKSycoca(w); -} - - -void KDesktopPropsPlugin::slotBrowseExec() -{ - KURL f = KFileDialog::getOpenURL( TQString::null, - TQString::null, w ); - if ( f.isEmpty() ) - return; - - if ( !f.isLocalFile()) { - KMessageBox::sorry(w, i18n("Only executables on local file systems are supported.")); - return; - } - - TQString path = f.path(); - KRun::shellQuote( path ); - w->commandEdit->setText( path ); -} - -void KDesktopPropsPlugin::slotAdvanced() -{ - KDialogBase dlg(w, "KPropertiesDesktopAdv", true, - i18n("Advanced Options for %1").arg(properties->kurl().fileName()), - KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok); - KPropertiesDesktopAdvBase *w = new KPropertiesDesktopAdvBase(&dlg); - - dlg.setMainWidget(w); - - // If the command is changed we reset certain settings that are strongly - // coupled to the command. - checkCommandChanged(); - - // check to see if we use konsole if not do not add the nocloseonexit - // because we don't know how to do this on other terminal applications - TDEConfigGroup confGroup( TDEGlobal::config(), TQString::fromLatin1("General") ); - TQString preferredTerminal = confGroup.readPathEntry("TerminalApplication", - TQString::fromLatin1("konsole")); - - bool terminalCloseBool = false; - - if (preferredTerminal == "konsole") - { - terminalCloseBool = (m_terminalOptionStr.contains( "--noclose" ) > 0); - w->terminalCloseCheck->setChecked(terminalCloseBool); - m_terminalOptionStr.replace( "--noclose", ""); - } - else - { - w->terminalCloseCheck->hide(); - } - - w->terminalCheck->setChecked(m_terminalBool); - w->terminalEdit->setText(m_terminalOptionStr); - w->terminalCloseCheck->setEnabled(m_terminalBool); - w->terminalEdit->setEnabled(m_terminalBool); - w->terminalEditLabel->setEnabled(m_terminalBool); - - w->suidCheck->setChecked(m_suidBool); - w->suidEdit->setText(m_suidUserStr); - w->suidEdit->setEnabled(m_suidBool); - w->suidEditLabel->setEnabled(m_suidBool); - - w->startupInfoCheck->setChecked(m_startupBool); - w->systrayCheck->setChecked(m_systrayBool); - - if (m_dcopServiceType == "unique") - w->dcopCombo->setCurrentItem(2); - else if (m_dcopServiceType == "multi") - w->dcopCombo->setCurrentItem(1); - else if (m_dcopServiceType == "wait") - w->dcopCombo->setCurrentItem(3); - else - w->dcopCombo->setCurrentItem(0); - - // Provide username completion up to 1000 users. - KCompletion *kcom = new KCompletion; - kcom->setOrder(KCompletion::Sorted); - struct passwd *pw; - int i, maxEntries = 1000; - setpwent(); - for (i=0; ((pw = getpwent()) != 0L) && (i < maxEntries); i++) - kcom->addItem(TQString::fromLatin1(pw->pw_name)); - endpwent(); - if (i < maxEntries) - { - w->suidEdit->setCompletionObject(kcom, true); - w->suidEdit->setAutoDeleteCompletionObject( true ); - w->suidEdit->setCompletionMode(TDEGlobalSettings::CompletionAuto); - } - else - { - delete kcom; - } - - connect( w->terminalEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( w->terminalCloseCheck, TQT_SIGNAL( toggled( bool ) ), - this, TQT_SIGNAL( changed() ) ); - connect( w->terminalCheck, TQT_SIGNAL( toggled( bool ) ), - this, TQT_SIGNAL( changed() ) ); - connect( w->suidCheck, TQT_SIGNAL( toggled( bool ) ), - this, TQT_SIGNAL( changed() ) ); - connect( w->suidEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( w->startupInfoCheck, TQT_SIGNAL( toggled( bool ) ), - this, TQT_SIGNAL( changed() ) ); - connect( w->systrayCheck, TQT_SIGNAL( toggled( bool ) ), - this, TQT_SIGNAL( changed() ) ); - connect( w->dcopCombo, TQT_SIGNAL( highlighted( int ) ), - this, TQT_SIGNAL( changed() ) ); - - if ( dlg.exec() == TQDialog::Accepted ) - { - m_terminalOptionStr = w->terminalEdit->text().stripWhiteSpace(); - m_terminalBool = w->terminalCheck->isChecked(); - m_suidBool = w->suidCheck->isChecked(); - m_suidUserStr = w->suidEdit->text().stripWhiteSpace(); - m_startupBool = w->startupInfoCheck->isChecked(); - m_systrayBool = w->systrayCheck->isChecked(); - - if (w->terminalCloseCheck->isChecked()) - { - m_terminalOptionStr.append(" --noclose"); - } - - switch(w->dcopCombo->currentItem()) - { - case 1: m_dcopServiceType = "multi"; break; - case 2: m_dcopServiceType = "unique"; break; - case 3: m_dcopServiceType = "wait"; break; - default: m_dcopServiceType = "none"; break; - } - } -} - -bool KDesktopPropsPlugin::supports( KFileItemList _items ) -{ - if ( _items.count() != 1 ) - return false; - KFileItem * item = _items.first(); - // check if desktop file - if ( !KPropsDlgPlugin::isDesktopFile( item ) ) - return false; - // open file and check type - KDesktopFile config( item->url().path(), true /* readonly */ ); - return config.hasApplicationType() && kapp->authorize("run_desktop_files") && kapp->authorize("shell_access"); -} - -void KPropertiesDialog::virtual_hook( int id, void* data ) -{ KDialogBase::virtual_hook( id, data ); } - -void KPropsDlgPlugin::virtual_hook( int, void* ) -{ /*BASE::virtual_hook( id, data );*/ } - - - - - -/** - * The following code is obsolete and only kept for binary compatibility - * To be removed in KDE 4 - */ - -class KExecPropsPlugin::KExecPropsPluginPrivate -{ -public: - KExecPropsPluginPrivate() - { - } - ~KExecPropsPluginPrivate() - { - } - - TQFrame *m_frame; - TQCheckBox *nocloseonexitCheck; -}; - -KExecPropsPlugin::KExecPropsPlugin( KPropertiesDialog *_props ) - : KPropsDlgPlugin( _props ) -{ - d = new KExecPropsPluginPrivate; - d->m_frame = properties->addPage(i18n("E&xecute")); - TQVBoxLayout * mainlayout = new TQVBoxLayout( d->m_frame, 0, - KDialog::spacingHint()); - - // Now the widgets in the top layout - - TQLabel* l; - l = new TQLabel( i18n( "Comman&d:" ), d->m_frame ); - mainlayout->addWidget(l); - - TQHBoxLayout * hlayout; - hlayout = new TQHBoxLayout(KDialog::spacingHint()); - mainlayout->addLayout(hlayout); - - execEdit = new KLineEdit( d->m_frame ); - TQWhatsThis::add(execEdit,i18n( - "Following the command, you can have several place holders which will be replaced " - "with the actual values when the actual program is run:\n" - "%f - a single file name\n" - "%F - a list of files; use for applications that can open several local files at once\n" - "%u - a single URL\n" - "%U - a list of URLs\n" - "%d - the folder of the file to open\n" - "%D - a list of folders\n" - "%i - the icon\n" - "%m - the mini-icon\n" - "%c - the caption")); - hlayout->addWidget(execEdit, 1); - - l->setBuddy( execEdit ); - - execBrowse = new TQPushButton( d->m_frame ); - execBrowse->setText( i18n("&Browse...") ); - hlayout->addWidget(execBrowse); - - // The groupbox about swallowing - TQGroupBox* tmpQGroupBox; - tmpQGroupBox = new TQGroupBox( i18n("Panel Embedding"), d->m_frame ); - tmpQGroupBox->setColumnLayout( 0, Qt::Horizontal ); - - mainlayout->addWidget(tmpQGroupBox); - - TQGridLayout *grid = new TQGridLayout(tmpQGroupBox->layout(), 2, 2); - grid->setSpacing( KDialog::spacingHint() ); - grid->setColStretch(1, 1); - - l = new TQLabel( i18n( "&Execute on click:" ), tmpQGroupBox ); - grid->addWidget(l, 0, 0); - - swallowExecEdit = new KLineEdit( tmpQGroupBox ); - grid->addWidget(swallowExecEdit, 0, 1); - - l->setBuddy( swallowExecEdit ); - - l = new TQLabel( i18n( "&Window title:" ), tmpQGroupBox ); - grid->addWidget(l, 1, 0); - - swallowTitleEdit = new KLineEdit( tmpQGroupBox ); - grid->addWidget(swallowTitleEdit, 1, 1); - - l->setBuddy( swallowTitleEdit ); - - // The groupbox about run in terminal - - tmpQGroupBox = new TQGroupBox( d->m_frame ); - tmpQGroupBox->setColumnLayout( 0, Qt::Horizontal ); - - mainlayout->addWidget(tmpQGroupBox); - - grid = new TQGridLayout(tmpQGroupBox->layout(), 3, 2); - grid->setSpacing( KDialog::spacingHint() ); - grid->setColStretch(1, 1); - - terminalCheck = new TQCheckBox( tmpQGroupBox ); - terminalCheck->setText( i18n("&Run in terminal") ); - grid->addMultiCellWidget(terminalCheck, 0, 0, 0, 1); - - // check to see if we use konsole if not do not add the nocloseonexit - // because we don't know how to do this on other terminal applications - TDEConfigGroup confGroup( TDEGlobal::config(), TQString::fromLatin1("General") ); - TQString preferredTerminal = confGroup.readPathEntry("TerminalApplication", - TQString::fromLatin1("konsole")); - - int posOptions = 1; - d->nocloseonexitCheck = 0L; - if (preferredTerminal == "konsole") - { - posOptions = 2; - d->nocloseonexitCheck = new TQCheckBox( tmpQGroupBox ); - d->nocloseonexitCheck->setText( i18n("Do not &close when command exits") ); - grid->addMultiCellWidget(d->nocloseonexitCheck, 1, 1, 0, 1); - } - - terminalLabel = new TQLabel( i18n( "&Terminal options:" ), tmpQGroupBox ); - grid->addWidget(terminalLabel, posOptions, 0); - - terminalEdit = new KLineEdit( tmpQGroupBox ); - grid->addWidget(terminalEdit, posOptions, 1); - - terminalLabel->setBuddy( terminalEdit ); - - // The groupbox about run with substituted uid. - - tmpQGroupBox = new TQGroupBox( d->m_frame ); - tmpQGroupBox->setColumnLayout( 0, Qt::Horizontal ); - - mainlayout->addWidget(tmpQGroupBox); - - grid = new TQGridLayout(tmpQGroupBox->layout(), 2, 2); - grid->setSpacing(KDialog::spacingHint()); - grid->setColStretch(1, 1); - - suidCheck = new TQCheckBox(tmpQGroupBox); - suidCheck->setText(i18n("Ru&n as a different user")); - grid->addMultiCellWidget(suidCheck, 0, 0, 0, 1); - - suidLabel = new TQLabel(i18n( "&Username:" ), tmpQGroupBox); - grid->addWidget(suidLabel, 1, 0); - - suidEdit = new KLineEdit(tmpQGroupBox); - grid->addWidget(suidEdit, 1, 1); - - suidLabel->setBuddy( suidEdit ); - - mainlayout->addStretch(1); - - // now populate the page - TQString path = _props->kurl().path(); - TQFile f( path ); - if ( !f.open( IO_ReadOnly ) ) - return; - f.close(); - - KSimpleConfig config( path ); - config.setDollarExpansion( false ); - config.setDesktopGroup(); - execStr = config.readPathEntry( "Exec" ); - swallowExecStr = config.readPathEntry( "SwallowExec" ); - swallowTitleStr = config.readEntry( "SwallowTitle" ); - termBool = config.readBoolEntry( "Terminal" ); - termOptionsStr = config.readEntry( "TerminalOptions" ); - suidBool = config.readBoolEntry( "X-TDE-SubstituteUID" ); - suidUserStr = config.readEntry( "X-TDE-Username" ); - - if ( !swallowExecStr.isNull() ) - swallowExecEdit->setText( swallowExecStr ); - if ( !swallowTitleStr.isNull() ) - swallowTitleEdit->setText( swallowTitleStr ); - - if ( !execStr.isNull() ) - execEdit->setText( execStr ); - - if ( d->nocloseonexitCheck ) - { - d->nocloseonexitCheck->setChecked( (termOptionsStr.contains( "--noclose" ) > 0) ); - termOptionsStr.replace( "--noclose", ""); - } - if ( !termOptionsStr.isNull() ) - terminalEdit->setText( termOptionsStr ); - - terminalCheck->setChecked( termBool ); - enableCheckedEdit(); - - suidCheck->setChecked( suidBool ); - suidEdit->setText( suidUserStr ); - enableSuidEdit(); - - // Provide username completion up to 1000 users. - KCompletion *kcom = new KCompletion; - kcom->setOrder(KCompletion::Sorted); - struct passwd *pw; - int i, maxEntries = 1000; - setpwent(); - for (i=0; ((pw = getpwent()) != 0L) && (i < maxEntries); i++) - kcom->addItem(TQString::fromLatin1(pw->pw_name)); - endpwent(); - if (i < maxEntries) - { - suidEdit->setCompletionObject(kcom, true); - suidEdit->setAutoDeleteCompletionObject( true ); - suidEdit->setCompletionMode(TDEGlobalSettings::CompletionAuto); - } - else - { - delete kcom; - } - - connect( swallowExecEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( swallowTitleEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( execEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( terminalEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - if (d->nocloseonexitCheck) - connect( d->nocloseonexitCheck, TQT_SIGNAL( toggled( bool ) ), - this, TQT_SIGNAL( changed() ) ); - connect( terminalCheck, TQT_SIGNAL( toggled( bool ) ), - this, TQT_SIGNAL( changed() ) ); - connect( suidCheck, TQT_SIGNAL( toggled( bool ) ), - this, TQT_SIGNAL( changed() ) ); - connect( suidEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - - connect( execBrowse, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotBrowseExec() ) ); - connect( terminalCheck, TQT_SIGNAL( clicked() ), this, TQT_SLOT( enableCheckedEdit() ) ); - connect( suidCheck, TQT_SIGNAL( clicked() ), this, TQT_SLOT( enableSuidEdit() ) ); - -} - -KExecPropsPlugin::~KExecPropsPlugin() -{ - delete d; -} - -void KExecPropsPlugin::enableCheckedEdit() -{ - bool checked = terminalCheck->isChecked(); - terminalLabel->setEnabled( checked ); - if (d->nocloseonexitCheck) - d->nocloseonexitCheck->setEnabled( checked ); - terminalEdit->setEnabled( checked ); -} - -void KExecPropsPlugin::enableSuidEdit() -{ - bool checked = suidCheck->isChecked(); - suidLabel->setEnabled( checked ); - suidEdit->setEnabled( checked ); -} - -bool KExecPropsPlugin::supports( KFileItemList _items ) -{ - if ( _items.count() != 1 ) - return false; - KFileItem * item = _items.first(); - // check if desktop file - if ( !KPropsDlgPlugin::isDesktopFile( item ) ) - return false; - // open file and check type - KDesktopFile config( item->url().path(), true /* readonly */ ); - return config.hasApplicationType() && kapp->authorize("run_desktop_files") && kapp->authorize("shell_access"); -} - -void KExecPropsPlugin::applyChanges() -{ - kdDebug(250) << "KExecPropsPlugin::applyChanges" << endl; - TQString path = properties->kurl().path(); - - TQFile f( path ); - - if ( !f.open( IO_ReadWrite ) ) { - KMessageBox::sorry( 0, i18n("<qt>Could not save properties. You do not have " - "sufficient access to write to <b>%1</b>.</qt>").arg(path)); - return; - } - f.close(); - - KSimpleConfig config( path ); - config.setDesktopGroup(); - config.writeEntry( "Type", TQString::fromLatin1("Application")); - config.writePathEntry( "Exec", execEdit->text() ); - config.writePathEntry( "SwallowExec", swallowExecEdit->text() ); - config.writeEntry( "SwallowTitle", swallowTitleEdit->text() ); - config.writeEntry( "Terminal", terminalCheck->isChecked() ); - TQString temp = terminalEdit->text(); - if (d->nocloseonexitCheck ) - if ( d->nocloseonexitCheck->isChecked() ) - temp += TQString::fromLatin1("--noclose "); - temp = temp.stripWhiteSpace(); - config.writeEntry( "TerminalOptions", temp ); - config.writeEntry( "X-TDE-SubstituteUID", suidCheck->isChecked() ); - config.writeEntry( "X-TDE-Username", suidEdit->text() ); -} - - -void KExecPropsPlugin::slotBrowseExec() -{ - KURL f = KFileDialog::getOpenURL( TQString::null, - TQString::null, d->m_frame ); - if ( f.isEmpty() ) - return; - - if ( !f.isLocalFile()) { - KMessageBox::sorry(d->m_frame, i18n("Only executables on local file systems are supported.")); - return; - } - - TQString path = f.path(); - KRun::shellQuote( path ); - execEdit->setText( path ); -} - -class TDEApplicationPropsPlugin::TDEApplicationPropsPluginPrivate -{ -public: - TDEApplicationPropsPluginPrivate() - { - m_kdesktopMode = TQCString(tqApp->name()) == "kdesktop"; // nasty heh? - } - ~TDEApplicationPropsPluginPrivate() - { - } - - TQFrame *m_frame; - bool m_kdesktopMode; -}; - -TDEApplicationPropsPlugin::TDEApplicationPropsPlugin( KPropertiesDialog *_props ) - : KPropsDlgPlugin( _props ) -{ - d = new TDEApplicationPropsPluginPrivate; - d->m_frame = properties->addPage(i18n("&Application")); - TQVBoxLayout *toplayout = new TQVBoxLayout( d->m_frame, 0, KDialog::spacingHint()); - - TQIconSet iconSet; - TQPixmap pixMap; - - addExtensionButton = new TQPushButton( TQString::null, d->m_frame ); - iconSet = SmallIconSet( "back" ); - addExtensionButton->setIconSet( iconSet ); - pixMap = iconSet.pixmap( TQIconSet::Small, TQIconSet::Normal ); - addExtensionButton->setFixedSize( pixMap.width()+8, pixMap.height()+8 ); - connect( addExtensionButton, TQT_SIGNAL( clicked() ), - TQT_SLOT( slotAddExtension() ) ); - - delExtensionButton = new TQPushButton( TQString::null, d->m_frame ); - iconSet = SmallIconSet( "forward" ); - delExtensionButton->setIconSet( iconSet ); - delExtensionButton->setFixedSize( pixMap.width()+8, pixMap.height()+8 ); - connect( delExtensionButton, TQT_SIGNAL( clicked() ), - TQT_SLOT( slotDelExtension() ) ); - - TQLabel *l; - - TQGridLayout *grid = new TQGridLayout(2, 2); - grid->setColStretch(1, 1); - toplayout->addLayout(TQT_TQLAYOUT(grid)); - - if ( d->m_kdesktopMode ) - { - // in kdesktop the name field comes from the first tab - nameEdit = 0L; - } - else - { - l = new TQLabel(i18n("Name:"), d->m_frame, "Label_4" ); - grid->addWidget(l, 0, 0); - - nameEdit = new KLineEdit( d->m_frame, "LineEdit_3" ); - grid->addWidget(nameEdit, 0, 1); - } - - l = new TQLabel(i18n("Description:"), d->m_frame, "Label_5" ); - grid->addWidget(l, 1, 0); - - genNameEdit = new KLineEdit( d->m_frame, "LineEdit_4" ); - grid->addWidget(genNameEdit, 1, 1); - - l = new TQLabel(i18n("Comment:"), d->m_frame, "Label_3" ); - grid->addWidget(l, 2, 0); - - commentEdit = new KLineEdit( d->m_frame, "LineEdit_2" ); - grid->addWidget(commentEdit, 2, 1); - - l = new TQLabel(i18n("File types:"), d->m_frame); - toplayout->addWidget(l, 0, AlignLeft); - - grid = new TQGridLayout(4, 3); - grid->setColStretch(0, 1); - grid->setColStretch(2, 1); - grid->setRowStretch( 0, 1 ); - grid->setRowStretch( 3, 1 ); - toplayout->addLayout(TQT_TQLAYOUT(grid), 2); - - extensionsList = new TQListBox( d->m_frame ); - extensionsList->setSelectionMode( TQListBox::Extended ); - grid->addMultiCellWidget(extensionsList, 0, 3, 0, 0); - - grid->addWidget(addExtensionButton, 1, 1); - grid->addWidget(delExtensionButton, 2, 1); - - availableExtensionsList = new TQListBox( d->m_frame ); - availableExtensionsList->setSelectionMode( TQListBox::Extended ); - grid->addMultiCellWidget(availableExtensionsList, 0, 3, 2, 2); - - TQString path = properties->kurl().path() ; - TQFile f( path ); - if ( !f.open( IO_ReadOnly ) ) - return; - f.close(); - - KDesktopFile config( path ); - TQString commentStr = config.readComment(); - TQString genNameStr = config.readGenericName(); - - TQStringList selectedTypes = config.readListEntry( "ServiceTypes" ); - // For compatibility with KDE 1.x - selectedTypes += config.readListEntry( "MimeType", ';' ); - - TQString nameStr = config.readName(); - if ( nameStr.isEmpty() || d->m_kdesktopMode ) { - // We'll use the file name if no name is specified - // because we _need_ a Name for a valid file. - // But let's do it in apply, not here, so that we pick up the right name. - setDirty(); - } - - commentEdit->setText( commentStr ); - genNameEdit->setText( genNameStr ); - if ( nameEdit ) - nameEdit->setText( nameStr ); - - selectedTypes.sort(); - TQStringList::Iterator sit = selectedTypes.begin(); - for( ; sit != selectedTypes.end(); ++sit ) { - if ( !((*sit).isEmpty()) ) - extensionsList->insertItem( *sit ); - } - - KMimeType::List mimeTypes = KMimeType::allMimeTypes(); - TQValueListIterator<KMimeType::Ptr> it2 = mimeTypes.begin(); - for ( ; it2 != mimeTypes.end(); ++it2 ) - addMimeType ( (*it2)->name() ); - - updateButton(); - - connect( extensionsList, TQT_SIGNAL( highlighted( int ) ), - this, TQT_SLOT( updateButton() ) ); - connect( availableExtensionsList, TQT_SIGNAL( highlighted( int ) ), - this, TQT_SLOT( updateButton() ) ); - - connect( addExtensionButton, TQT_SIGNAL( clicked() ), - this, TQT_SIGNAL( changed() ) ); - connect( delExtensionButton, TQT_SIGNAL( clicked() ), - this, TQT_SIGNAL( changed() ) ); - if ( nameEdit ) - connect( nameEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( commentEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( genNameEdit, TQT_SIGNAL( textChanged( const TQString & ) ), - this, TQT_SIGNAL( changed() ) ); - connect( availableExtensionsList, TQT_SIGNAL( selected( int ) ), - this, TQT_SIGNAL( changed() ) ); - connect( extensionsList, TQT_SIGNAL( selected( int ) ), - this, TQT_SIGNAL( changed() ) ); -} - -TDEApplicationPropsPlugin::~TDEApplicationPropsPlugin() -{ - delete d; -} - -// TQString TDEApplicationPropsPlugin::tabName () const -// { -// return i18n ("&Application"); -// } - -void TDEApplicationPropsPlugin::updateButton() -{ - addExtensionButton->setEnabled(availableExtensionsList->currentItem()>-1); - delExtensionButton->setEnabled(extensionsList->currentItem()>-1); -} - -void TDEApplicationPropsPlugin::addMimeType( const TQString & name ) -{ - // Add a mimetype to the list of available mime types if not in the extensionsList - - bool insert = true; - - for ( uint i = 0; i < extensionsList->count(); i++ ) - if ( extensionsList->text( i ) == name ) - insert = false; - - if ( insert ) - { - availableExtensionsList->insertItem( name ); - availableExtensionsList->sort(); - } -} - -bool TDEApplicationPropsPlugin::supports( KFileItemList _items ) -{ - // same constraints as KExecPropsPlugin : desktop file with Type = Application - return KExecPropsPlugin::supports( _items ); -} - -void TDEApplicationPropsPlugin::applyChanges() -{ - TQString path = properties->kurl().path(); - - TQFile f( path ); - - if ( !f.open( IO_ReadWrite ) ) { - KMessageBox::sorry( 0, i18n("<qt>Could not save properties. You do not " - "have sufficient access to write to <b>%1</b>.</qt>").arg(path)); - return; - } - f.close(); - - KSimpleConfig config( path ); - config.setDesktopGroup(); - config.writeEntry( "Type", TQString::fromLatin1("Application")); - config.writeEntry( "Comment", commentEdit->text() ); - config.writeEntry( "Comment", commentEdit->text(), true, false, true ); // for compat - config.writeEntry( "GenericName", genNameEdit->text() ); - config.writeEntry( "GenericName", genNameEdit->text(), true, false, true ); // for compat - - TQStringList selectedTypes; - for ( uint i = 0; i < extensionsList->count(); i++ ) - selectedTypes.append( extensionsList->text( i ) ); - - config.writeEntry( "MimeType", selectedTypes, ';' ); - config.writeEntry( "ServiceTypes", "" ); - // hmm, actually it should probably be the contrary (but see also typeslistitem.cpp) - - TQString nameStr = nameEdit ? nameEdit->text() : TQString::null; - if ( nameStr.isEmpty() ) // nothing entered, or widget not existing at all (kdesktop mode) - nameStr = nameFromFileName(properties->kurl().fileName()); - - config.writeEntry( "Name", nameStr ); - config.writeEntry( "Name", nameStr, true, false, true ); - - config.sync(); -} - -void TDEApplicationPropsPlugin::slotAddExtension() -{ - TQListBoxItem *item = availableExtensionsList->firstItem(); - TQListBoxItem *nextItem; - - while ( item ) - { - nextItem = item->next(); - - if ( item->isSelected() ) - { - extensionsList->insertItem( item->text() ); - availableExtensionsList->removeItem( availableExtensionsList->index( item ) ); - } - - item = nextItem; - } - - extensionsList->sort(); - updateButton(); -} - -void TDEApplicationPropsPlugin::slotDelExtension() -{ - TQListBoxItem *item = extensionsList->firstItem(); - TQListBoxItem *nextItem; - - while ( item ) - { - nextItem = item->next(); - - if ( item->isSelected() ) - { - availableExtensionsList->insertItem( item->text() ); - extensionsList->removeItem( extensionsList->index( item ) ); - } - - item = nextItem; - } - - availableExtensionsList->sort(); - updateButton(); -} - - - -#include "kpropertiesdialog.moc" |