diff options
Diffstat (limited to 'kcontrol/konq/rootopts.cpp')
-rw-r--r-- | kcontrol/konq/rootopts.cpp | 582 |
1 files changed, 582 insertions, 0 deletions
diff --git a/kcontrol/konq/rootopts.cpp b/kcontrol/konq/rootopts.cpp new file mode 100644 index 000000000..6677bc80a --- /dev/null +++ b/kcontrol/konq/rootopts.cpp @@ -0,0 +1,582 @@ +// +// +// "Desktop Options" Tab for KDesktop configuration +// +// (c) Martin R. Jones 1996 +// (c) Bernd Wuebben 1998 +// +// Layouts +// (c) Christian Tibirna 1998 +// Port to KControl, split from Misc Tab, Port to KControl2 +// (c) David Faure 1998 +// Desktop menus, paths +// (c) David Faure 2000 + +#include <config.h> + +#include <tqcheckbox.h> +#include <tqcombobox.h> +#include <tqlabel.h> +#include <tqlayout.h> +#include <tqvgroupbox.h> +#include <tqwhatsthis.h> + +#include <dcopclient.h> + +#include <tdeapplication.h> +#include <kcustommenueditor.h> +#include <kdebug.h> +#include <tdefileitem.h> +#include <tdeglobalsettings.h> +#include <kipc.h> +#include <tdelistview.h> +#include <tdeio/job.h> +#include <tdelocale.h> +#include <tdemessagebox.h> +#include <kmimetype.h> +#include <kstandarddirs.h> +#include <ktrader.h> +#include <konq_defaults.h> // include default values directly from libkonq +#include <kurlrequester.h> + +#include "rootopts.h" + +//----------------------------------------------------------------------------- + +DesktopPathConfig::DesktopPathConfig(TQWidget *parent, const char * ) + : TDECModule( parent, "kcmkonq" ) +{ + TQLabel * tmpLabel; + +#undef RO_LASTROW +#undef RO_LASTCOL +#define RO_LASTROW 10 // 9 paths + last row +#define RO_LASTCOL 2 + + int row = 0; + TQGridLayout *lay = new TQGridLayout(this, RO_LASTROW+1, RO_LASTCOL+1, + 0, KDialog::spacingHint()); + + lay->setRowStretch(RO_LASTROW,10); // last line grows + + lay->setColStretch(0,0); + lay->setColStretch(1,0); + lay->setColStretch(2,10); + + + setQuickHelp( i18n("<h1>Paths</h1>\n" + "This module allows you to choose where in the filesystem the " + "files on your desktop should be stored.\n" + "Use the \"What's This?\" (Shift+F1) to get help on specific options.")); + + // Desktop Paths + row++; + tmpLabel = new TQLabel(i18n("Des&ktop path:"), this); + lay->addWidget(tmpLabel, row, 0); + urDesktop = new KURLRequester(this); + urDesktop->setMode( KFile::Directory ); + tmpLabel->setBuddy( urDesktop ); + lay->addMultiCellWidget(urDesktop, row, row, 1, RO_LASTCOL); + connect(urDesktop, TQT_SIGNAL(textChanged(const TQString &)), this, TQT_SLOT(changed())); + TQString wtstr = i18n("This folder contains all the files" + " which you see on your desktop. You can change the location of this" + " folder if you want to, and the contents will move automatically" + " to the new location as well."); + TQWhatsThis::add( tmpLabel, wtstr ); + TQWhatsThis::add( urDesktop, wtstr ); + + row++; + tmpLabel = new TQLabel(i18n("A&utostart path:"), this); + lay->addWidget(tmpLabel, row, 0); + urAutostart = new KURLRequester(this); + urAutostart->setMode( KFile::Directory ); + tmpLabel->setBuddy( urAutostart ); + lay->addMultiCellWidget(urAutostart, row, row, 1, RO_LASTCOL); + connect(urAutostart, TQT_SIGNAL(textChanged(const TQString &)), this, TQT_SLOT(changed())); + wtstr = i18n("This folder contains applications or" + " links to applications (shortcuts) that you want to have started" + " automatically whenever TDE starts. You can change the location of this" + " folder if you want to, and the contents will move automatically" + " to the new location as well."); + TQWhatsThis::add( tmpLabel, wtstr ); + TQWhatsThis::add( urAutostart, wtstr ); + + row++; + tmpLabel = new TQLabel(i18n("D&ocuments path:"), this); + lay->addWidget(tmpLabel, row, 0); + urDocument = new KURLRequester(this); + urDocument->setMode( KFile::Directory ); + tmpLabel->setBuddy( urDocument ); + lay->addMultiCellWidget(urDocument, row, row, 1, RO_LASTCOL); + connect(urDocument, TQT_SIGNAL(textChanged(const TQString &)), this, TQT_SLOT(changed())); + wtstr = i18n("This folder will be used by default to load or save documents from or to."); + TQWhatsThis::add( tmpLabel, wtstr ); + TQWhatsThis::add( urDocument, wtstr ); + + row++; + tmpLabel = new TQLabel(i18n("Download path:"), this); + lay->addWidget(tmpLabel, row, 0); + urDownload = new KURLRequester(this); + urDownload->setMode( KFile::Directory ); + tmpLabel->setBuddy( urDownload ); + lay->addMultiCellWidget(urDownload, row, row, 1, RO_LASTCOL); + connect(urDownload, TQT_SIGNAL(textChanged(const TQString &)), this, TQT_SLOT(changed())); + wtstr = i18n("This folder will be used by default to load or save downloads from or to."); + TQWhatsThis::add( tmpLabel, wtstr ); + TQWhatsThis::add( urDownload, wtstr ); + + row++; + tmpLabel = new TQLabel(i18n("Music path:"), this); + lay->addWidget(tmpLabel, row, 0); + urMusic = new KURLRequester(this); + urMusic->setMode( KFile::Directory ); + tmpLabel->setBuddy( urMusic ); + lay->addMultiCellWidget(urMusic, row, row, 1, RO_LASTCOL); + connect(urMusic, TQT_SIGNAL(textChanged(const TQString &)), this, TQT_SLOT(changed())); + wtstr = i18n("This folder will be used by default to load or save music from or to."); + TQWhatsThis::add( tmpLabel, wtstr ); + TQWhatsThis::add( urMusic, wtstr ); + + row++; + tmpLabel = new TQLabel(i18n("Pictures path:"), this); + lay->addWidget(tmpLabel, row, 0); + urPictures = new KURLRequester(this); + urPictures->setMode( KFile::Directory ); + tmpLabel->setBuddy( urPictures ); + lay->addMultiCellWidget(urPictures, row, row, 1, RO_LASTCOL); + connect(urPictures, TQT_SIGNAL(textChanged(const TQString &)), this, TQT_SLOT(changed())); + wtstr = i18n("This folder will be used by default to load or save pictures from or to."); + TQWhatsThis::add( tmpLabel, wtstr ); + TQWhatsThis::add( urPictures, wtstr ); + + row++; + tmpLabel = new TQLabel(i18n("Public Share path:"), this); + lay->addWidget(tmpLabel, row, 0); + urPublicShare = new KURLRequester(this); + urPublicShare->setMode( KFile::Directory ); + tmpLabel->setBuddy( urPublicShare ); + lay->addMultiCellWidget(urPublicShare, row, row, 1, RO_LASTCOL); + connect(urPublicShare, TQT_SIGNAL(textChanged(const TQString &)), this, TQT_SLOT(changed())); + wtstr = i18n("This folder will be used by default to load or save public shared files from or to."); + TQWhatsThis::add( tmpLabel, wtstr ); + TQWhatsThis::add( urPublicShare, wtstr ); + + row++; + tmpLabel = new TQLabel(i18n("Templates path:"), this); + lay->addWidget(tmpLabel, row, 0); + urTemplates = new KURLRequester(this); + urTemplates->setMode( KFile::Directory ); + tmpLabel->setBuddy( urTemplates ); + lay->addMultiCellWidget(urTemplates, row, row, 1, RO_LASTCOL); + connect(urTemplates, TQT_SIGNAL(textChanged(const TQString &)), this, TQT_SLOT(changed())); + wtstr = i18n("This folder will be used by default to load or save templates from or to."); + TQWhatsThis::add( tmpLabel, wtstr ); + TQWhatsThis::add( urTemplates, wtstr ); + + row++; + tmpLabel = new TQLabel(i18n("Videos path:"), this); + lay->addWidget(tmpLabel, row, 0); + urVideos = new KURLRequester(this); + urVideos->setMode( KFile::Directory ); + tmpLabel->setBuddy( urVideos ); + lay->addMultiCellWidget(urVideos, row, row, 1, RO_LASTCOL); + connect(urVideos, TQT_SIGNAL(textChanged(const TQString &)), this, TQT_SLOT(changed())); + wtstr = i18n("This folder will be used by default to load or save videos from or to."); + TQWhatsThis::add( tmpLabel, wtstr ); + TQWhatsThis::add( urVideos, wtstr ); + + // -- Bottom -- + Q_ASSERT( row == RO_LASTROW-1 ); // if it fails here, check the row++ and RO_LASTROW above + + load(); +} + +void DesktopPathConfig::load() +{ + load( false ); +} + +void DesktopPathConfig::load( bool useDefaults ) +{ + TDEConfig config("kdeglobals", true, false); + // Desktop Paths + config.setReadDefaults( useDefaults ); + config.setGroup("Paths"); + urAutostart->setURL( config.readPathEntry( "Autostart" , TDEGlobalSettings::autostartPath() )); + + TDEConfig xdguserconfig( TQDir::homeDirPath()+"/.config/user-dirs.dirs" ); + + urDesktop->setURL( xdguserconfig.readPathEntry( "XDG_DESKTOP_DIR" , TQDir::homeDirPath() + "/Desktop" ).remove( "\"" )); + urDocument->setURL( xdguserconfig.readPathEntry( "XDG_DOCUMENTS_DIR", TQDir::homeDirPath() + "/Documents").remove( "\"" )); + urDownload->setURL( xdguserconfig.readPathEntry( "XDG_DOWNLOAD_DIR" , TQDir::homeDirPath() + "/Downloads" ).remove( "\"" )); + urMusic->setURL( xdguserconfig.readPathEntry( "XDG_MUSIC_DIR" , TQDir::homeDirPath() + "/Music" ).remove( "\"" )); + urPictures->setURL( xdguserconfig.readPathEntry( "XDG_PICTURES_DIR" , TQDir::homeDirPath() + "/Pictures" ).remove( "\"" )); + urPublicShare->setURL( xdguserconfig.readPathEntry( "XDG_PUBLICSHARE_DIR" , TQDir::homeDirPath() + "/Public" ).remove( "\"" )); + urTemplates->setURL( xdguserconfig.readPathEntry( "XDG_TEMPLATES_DIR" , TQDir::homeDirPath() + "/Templates" ).remove( "\"" )); + urVideos->setURL( xdguserconfig.readPathEntry( "XDG_VIDEOS_DIR" , TQDir::homeDirPath() + "/Videos" ).remove( "\"" )); + + emit changed( useDefaults ); +} + +void DesktopPathConfig::defaults() +{ + load( true ); +} + +void DesktopPathConfig::save() +{ + TDEConfig *config = TDEGlobal::config(); + TDEConfig *xdgconfig = new TDEConfig( TQDir::homeDirPath()+"/.config/user-dirs.dirs" ); + TDEConfigGroupSaver cgs( config, "Paths" ); + + bool pathChanged = false; + bool autostartMoved = false; + + KURL desktopURL; + desktopURL.setPath( TDEGlobalSettings::desktopPath() ); + KURL newDesktopURL; + newDesktopURL.setPath(urDesktop->url()); + + KURL autostartURL; + autostartURL.setPath( TDEGlobalSettings::autostartPath() ); + KURL newAutostartURL; + newAutostartURL.setPath(urAutostart->url()); + + KURL documentURL; + documentURL.setPath( TDEGlobalSettings::documentPath() ); + KURL newDocumentURL; + newDocumentURL.setPath(urDocument->url()); + + KURL downloadURL; +// downloadURL.setPath( TDEGlobalSettings::downloadPath() ); + KURL newDownloadURL; + newDownloadURL.setPath(urDownload->url()); + + KURL musicURL; +// musicURL.setPath( TDEGlobalSettings::musicPath() ); + KURL newMusicURL; + newMusicURL.setPath(urMusic->url()); + + KURL picturesURL; +// picturesURL.setPath( TDEGlobalSettings::picturesPath() ); + KURL newPicturesURL; + newPicturesURL.setPath(urPictures->url()); + + KURL publicShareURL; +// publicShareURL.setPath( TDEGlobalSettings::publicSharePath() ); + KURL newPublicShareURL; + newPublicShareURL.setPath(urPublicShare->url()); + + KURL templatesURL; +// templatesURL.setPath( TDEGlobalSettings::templatesPath() ); + KURL newTemplatesURL; + newTemplatesURL.setPath(urTemplates->url()); + + KURL videosURL; +// videosURL.setPath( TDEGlobalSettings::videosPath() ); + KURL newVideosURL; + newVideosURL.setPath(urVideos->url()); + + if ( !newDesktopURL.equals( desktopURL, true ) ) + { + // Test which other paths were inside this one (as it is by default) + // and for each, test where it should go. + // * Inside destination -> let them be moved with the desktop (but adjust name if necessary) + // * Not inside destination -> move first + // !!! + kdDebug() << "desktopURL=" << desktopURL.url() << endl; + TQString urlDesktop = urDesktop->url(); + if ( !urlDesktop.endsWith( "/" )) + urlDesktop+="/"; + + if ( desktopURL.isParentOf( autostartURL ) ) + { + kdDebug() << "Autostart is on the desktop" << endl; + + // Either the Autostart field wasn't changed (-> need to update it) + if ( newAutostartURL.equals( autostartURL, true ) ) + { + // Hack. It could be in a subdir inside desktop. Hmmm... Argl. + urAutostart->setURL( urlDesktop + "Autostart/" ); + kdDebug() << "Autostart is moved with the desktop" << endl; + autostartMoved = true; + } + // or it has been changed (->need to move it from here) + else + { + KURL futureAutostartURL; + futureAutostartURL.setPath( urlDesktop + "Autostart/" ); + if ( newAutostartURL.equals( futureAutostartURL, true ) ) + autostartMoved = true; + else + autostartMoved = moveDir( KURL( TDEGlobalSettings::autostartPath() ), KURL( urAutostart->url() ), i18n("Autostart") ); + } + } + + if ( moveDir( KURL( TDEGlobalSettings::desktopPath() ), KURL( urlDesktop ), i18n("Desktop") ) ) + { + xdgconfig->writePathEntry( "XDG_DESKTOP_DIR", '"'+ urlDesktop + '"', true, false, false, false ); + pathChanged = true; + } + } + + if ( !newAutostartURL.equals( autostartURL, true ) ) + { + if (!autostartMoved) + autostartMoved = moveDir( KURL( TDEGlobalSettings::autostartPath() ), KURL( urAutostart->url() ), i18n("Autostart") ); + if (autostartMoved) + { + config->writePathEntry( "Autostart", urAutostart->url(), true, true, false, false ); + pathChanged = true; + } + } + + if ( !newDocumentURL.equals( documentURL, true ) ) + { + bool pathOk = true; + TQString path = urDocument->url(); + if (!TQDir(path).exists()) + { + if (!TDEStandardDirs::makeDir(path)) + { + KMessageBox::sorry(this, TDEIO::buildErrorString(TDEIO::ERR_COULD_NOT_MKDIR, path)); + urDocument->setURL(documentURL.path()); + pathOk = false; + } + } + + if (pathOk) + { + xdgconfig->writePathEntry( "XDG_DOCUMENTS_DIR", '"' + path + '"', true, false, false, false ); + pathChanged = true; + } + } + + if ( !newDownloadURL.equals( downloadURL, true ) ) + { + bool pathOk = true; + TQString path = urDownload->url(); + if (!TQDir(path).exists()) + { + if (!TDEStandardDirs::makeDir(path)) + { + KMessageBox::sorry(this, TDEIO::buildErrorString(TDEIO::ERR_COULD_NOT_MKDIR, path)); + urDownload->setURL(downloadURL.path()); + pathOk = false; + } + } + + if (pathOk) + { + xdgconfig->writePathEntry( "XDG_DOWNLOAD_DIR", '"' + path + '"', true, false, false, false ); + pathChanged = true; + } + } + + if ( !newMusicURL.equals( musicURL, true ) ) + { + bool pathOk = true; + TQString path = urMusic->url(); + if (!TQDir(path).exists()) + { + if (!TDEStandardDirs::makeDir(path)) + { + KMessageBox::sorry(this, TDEIO::buildErrorString(TDEIO::ERR_COULD_NOT_MKDIR, path)); + urMusic->setURL(musicURL.path()); + pathOk = false; + } + } + + if (pathOk) + { + xdgconfig->writePathEntry( "XDG_MUSIC_DIR", '"' + path + '"', true, false, false, false ); + pathChanged = true; + } + } + + if ( !newPicturesURL.equals( picturesURL, true ) ) + { + bool pathOk = true; + TQString path = urPictures->url(); + if (!TQDir(path).exists()) + { + if (!TDEStandardDirs::makeDir(path)) + { + KMessageBox::sorry(this, TDEIO::buildErrorString(TDEIO::ERR_COULD_NOT_MKDIR, path)); + urPictures->setURL(picturesURL.path()); + pathOk = false; + } + } + + if (pathOk) + { + xdgconfig->writePathEntry( "XDG_PICTURES_DIR", '"' + path + '"', true, false, false, false ); + pathChanged = true; + } + } + + if ( !newPublicShareURL.equals( publicShareURL, true ) ) + { + bool pathOk = true; + TQString path = urPublicShare->url(); + if (!TQDir(path).exists()) + { + if (!TDEStandardDirs::makeDir(path)) + { + KMessageBox::sorry(this, TDEIO::buildErrorString(TDEIO::ERR_COULD_NOT_MKDIR, path)); + urPublicShare->setURL(publicShareURL.path()); + pathOk = false; + } + } + + if (pathOk) + { + xdgconfig->writePathEntry( "XDG_PUBLICSHARE_DIR", '"' + path + '"', true, false, false, false ); + pathChanged = true; + } + } + + if ( !newTemplatesURL.equals( templatesURL, true ) ) + { + bool pathOk = true; + TQString path = urTemplates->url(); + if (!TQDir(path).exists()) + { + if (!TDEStandardDirs::makeDir(path)) + { + KMessageBox::sorry(this, TDEIO::buildErrorString(TDEIO::ERR_COULD_NOT_MKDIR, path)); + urTemplates->setURL(templatesURL.path()); + pathOk = false; + } + } + + if (pathOk) + { + xdgconfig->writePathEntry( "XDG_TEMPLATES_DIR", '"' + path + '"', true, false, false, false ); + pathChanged = true; + } + } + + if ( !newVideosURL.equals( videosURL, true ) ) + { + bool pathOk = true; + TQString path = urVideos->url(); + if (!TQDir(path).exists()) + { + if (!TDEStandardDirs::makeDir(path)) + { + KMessageBox::sorry(this, TDEIO::buildErrorString(TDEIO::ERR_COULD_NOT_MKDIR, path)); + urVideos->setURL(videosURL.path()); + pathOk = false; + } + } + + if (pathOk) + { + xdgconfig->writePathEntry( "XDG_VIDEOS_DIR", '"' + path + '"', true, false, false, false ); + pathChanged = true; + } + } + + config->sync(); + xdgconfig->sync(); + + if (pathChanged) + { + kdDebug() << "DesktopPathConfig::save sending message SettingsChanged" << endl; + KIPC::sendMessageAll(KIPC::SettingsChanged, TDEApplication::SETTINGS_PATHS); + } + + // Tell kdesktop about the new config file + if ( !kapp->dcopClient()->isAttached() ) + kapp->dcopClient()->attach(); + TQByteArray data; + + int konq_screen_number = TDEApplication::desktop()->primaryScreen(); + TQCString appname; + if (konq_screen_number == 0) { + appname = "kdesktop"; + } + else { + appname.sprintf("kdesktop-screen-%d", konq_screen_number); + } + kapp->dcopClient()->send( appname, "KDesktopIface", "configure()", data ); +} + +bool DesktopPathConfig::moveDir( const KURL & src, const KURL & dest, const TQString & type ) +{ + if (!src.isLocalFile() || !dest.isLocalFile()) + return true; + m_ok = true; + // Ask for confirmation before moving the files + if ( KMessageBox::questionYesNo( this, i18n("The path for '%1' has been changed;\ndo you want the files to be moved from '%2' to '%3'?"). + arg(type).arg(src.path()).arg(dest.path()), i18n("Confirmation Required"),i18n("Move"),KStdGuiItem::cancel() ) + == KMessageBox::Yes ) + { + bool destExists = TQFile::exists(dest.path()); + if (destExists) + { + m_copyToDest = dest; + m_copyFromSrc = src; + TDEIO::ListJob* job = TDEIO::listDir( src ); + connect( job, TQT_SIGNAL( entries( TDEIO::Job *, const TDEIO::UDSEntryList& ) ), + this, TQT_SLOT( slotEntries( TDEIO::Job *, const TDEIO::UDSEntryList& ) ) ); + tqApp->enter_loop(); + + if (m_ok) + { + TDEIO::del( src ); + } + } + else + { + TDEIO::Job * job = TDEIO::move( src, dest ); + connect( job, TQT_SIGNAL( result( TDEIO::Job * ) ), this, TQT_SLOT( slotResult( TDEIO::Job * ) ) ); + // wait for job + tqApp->enter_loop(); + } + } + kdDebug() << "DesktopPathConfig::slotResult returning " << m_ok << endl; + return m_ok; +} + +void DesktopPathConfig::slotEntries( TDEIO::Job * job, const TDEIO::UDSEntryList& list) +{ + if (job->error()) + { + job->showErrorDialog(this); + return; + } + + TDEIO::UDSEntryListConstIterator it = list.begin(); + TDEIO::UDSEntryListConstIterator end = list.end(); + for (; it != end; ++it) + { + KFileItem file(*it, m_copyFromSrc, true, true); + if (file.url() == m_copyFromSrc || file.url().fileName() == "..") + { + continue; + } + + TDEIO::Job * moveJob = TDEIO::move( file.url(), m_copyToDest ); + connect( moveJob, TQT_SIGNAL( result( TDEIO::Job * ) ), this, TQT_SLOT( slotResult( TDEIO::Job * ) ) ); + tqApp->enter_loop(); + } + tqApp->exit_loop(); +} + +void DesktopPathConfig::slotResult( TDEIO::Job * job ) +{ + if (job->error()) + { + if ( job->error() != TDEIO::ERR_DOES_NOT_EXIST ) + m_ok = false; + // If the source doesn't exist, no wonder we couldn't move the dir. + // In that case, trust the user and set the new setting in any case. + + job->showErrorDialog(this); + } + tqApp->exit_loop(); +} + +#include "rootopts.moc" |