• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kate

katefileselector.cpp

Go to the documentation of this file.
00001 /* This file is part of the KDE project
00002    Copyright (C) 2001 Christoph Cullmann <cullmann@kde.org>
00003    Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
00004    Copyright (C) 2001 Anders Lund <anders.lund@lund.tdcadsl.dk>
00005 
00006    This library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Library General Public
00008    License version 2 as published by the Free Software Foundation.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018    Boston, MA 02110-1301, USA.
00019 */
00020 
00021 //BEGIN Includes
00022 #include "katefileselector.h"
00023 #include "katefileselector.moc"
00024 
00025 #include "katemainwindow.h"
00026 #include "kateviewmanager.h"
00027 #include "kbookmarkhandler.h"
00028 
00029 #include "kactionselector.h"
00030 
00031 #include <qlayout.h>
00032 #include <qtoolbutton.h>
00033 #include <qhbox.h>
00034 #include <qvbox.h>
00035 #include <qlabel.h>
00036 #include <qstrlist.h>
00037 #include <qtooltip.h>
00038 #include <qwhatsthis.h>
00039 #include <qapplication.h>
00040 #include <qlistbox.h>
00041 #include <qscrollbar.h>
00042 #include <qspinbox.h>
00043 #include <qgroupbox.h>
00044 #include <qcheckbox.h>
00045 #include <qregexp.h>
00046 #include <qdockarea.h>
00047 #include <qtimer.h>
00048 #include <qdir.h>
00049 
00050 #include <kapplication.h>
00051 #include <kiconloader.h>
00052 #include <kurlcombobox.h>
00053 #include <kurlcompletion.h>
00054 #include <kprotocolinfo.h>
00055 #include <kdiroperator.h>
00056 #include <kconfig.h>
00057 #include <klocale.h>
00058 #include <kcombobox.h>
00059 #include <kaction.h>
00060 #include <kmessagebox.h>
00061 #include <ktoolbarbutton.h>
00062 #include <qtoolbar.h>
00063 #include <kpopupmenu.h>
00064 #include <kdialog.h>
00065 #include <kdebug.h>
00066 //END Includes
00067 
00068 //BEGIN Toolbar
00069  // from kfiledialog.cpp - avoid qt warning in STDERR (~/.xsessionerrors)
00070 static void silenceQToolBar(QtMsgType, const char *){}
00071 
00072 // helper classes to be able to have a toolbar without move handle
00073 KateFileSelectorToolBar::KateFileSelectorToolBar(QWidget *parent)
00074   : KToolBar( parent, "Kate FileSelector Toolbar", true )
00075 {
00076     setMinimumWidth(10);
00077 }
00078 
00079 KateFileSelectorToolBar::~KateFileSelectorToolBar(){}
00080 
00081 void KateFileSelectorToolBar::setMovingEnabled( bool)
00082 {
00083     KToolBar::setMovingEnabled(false);
00084 }
00085 
00086 
00087 KateFileSelectorToolBarParent::KateFileSelectorToolBarParent(QWidget *parent)
00088     :QFrame(parent),m_tb(0){}
00089 KateFileSelectorToolBarParent::~KateFileSelectorToolBarParent(){}
00090 void KateFileSelectorToolBarParent::setToolBar(KateFileSelectorToolBar *tb)
00091 {
00092     m_tb=tb;
00093 }
00094 
00095 void KateFileSelectorToolBarParent::resizeEvent ( QResizeEvent * )
00096 {
00097     if (m_tb)
00098     {
00099         setMinimumHeight(m_tb->sizeHint().height());
00100         m_tb->resize(width(),height());
00101     }
00102 }
00103 //END
00104 
00105 //BEGIN Constructor/destructor
00106 
00107 KateFileSelector::KateFileSelector( KateMainWindow *mainWindow,
00108                                     KateViewManager *viewManager,
00109                                     QWidget * parent, const char * name )
00110     : QVBox (parent, name),
00111       mainwin(mainWindow),
00112       viewmanager(viewManager)
00113 {
00114   mActionCollection = new KActionCollection( this );
00115 
00116   QtMsgHandler oldHandler = qInstallMsgHandler( silenceQToolBar );
00117 
00118   KateFileSelectorToolBarParent *tbp=new KateFileSelectorToolBarParent(this);
00119   toolbar = new KateFileSelectorToolBar(tbp);
00120   tbp->setToolBar(toolbar);
00121   toolbar->setMovingEnabled(false);
00122   toolbar->setFlat(true);
00123   qInstallMsgHandler( oldHandler );
00124 
00125   cmbPath = new KURLComboBox( KURLComboBox::Directories, true, this, "path combo" );
00126   cmbPath->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ));
00127   KURLCompletion* cmpl = new KURLCompletion(KURLCompletion::DirCompletion);
00128   cmbPath->setCompletionObject( cmpl );
00129   cmbPath->setAutoDeleteCompletionObject( true );
00130   cmbPath->listBox()->installEventFilter( this );
00131 
00132   dir = new KDirOperator(KURL(), this, "operator");
00133   dir->setView(KFile::/* Simple */Detail);
00134   dir->view()->setSelectionMode(KFile::Extended);
00135   connect ( dir, SIGNAL( viewChanged(KFileView *) ),
00136                    this, SLOT( selectorViewChanged(KFileView *) ) );
00137   setStretchFactor(dir, 2);
00138 
00139   KActionCollection *coll = dir->actionCollection();
00140   // some shortcuts of diroperator that clashes with Kate
00141   coll->action( "delete" )->setShortcut( KShortcut( ALT + Key_Delete ) );
00142   coll->action( "reload" )->setShortcut( KShortcut( ALT + Key_F5 ) );
00143   coll->action( "back" )->setShortcut( KShortcut( ALT + SHIFT + Key_Left ) );
00144   coll->action( "forward" )->setShortcut( KShortcut( ALT + SHIFT + Key_Right ) );
00145   // some consistency - reset up for dir too
00146   coll->action( "up" )->setShortcut( KShortcut( ALT + SHIFT + Key_Up ) );
00147   coll->action( "home" )->setShortcut( KShortcut( CTRL + ALT + Key_Home ) );
00148 
00149   // bookmarks action!
00150   KActionMenu *acmBookmarks = new KActionMenu( i18n("Bookmarks"), "bookmark",
00151         mActionCollection, "bookmarks" );
00152   acmBookmarks->setDelayed( false );
00153   bookmarkHandler = new KBookmarkHandler( this, acmBookmarks->popupMenu() );
00154   QHBox* filterBox = new QHBox(this);
00155 
00156   btnFilter = new QToolButton( filterBox );
00157   btnFilter->setIconSet( SmallIconSet("filter" ) );
00158   btnFilter->setToggleButton( true );
00159   filter = new KHistoryCombo( true, filterBox, "filter");
00160   filter->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ));
00161   filterBox->setStretchFactor(filter, 2);
00162   connect( btnFilter, SIGNAL( clicked() ), this, SLOT( btnFilterClick() ) );
00163 
00164   connect( filter, SIGNAL( activated(const QString&) ),
00165                    SLOT( slotFilterChange(const QString&) ) );
00166   connect( filter, SIGNAL( returnPressed(const QString&) ),
00167            filter, SLOT( addToHistory(const QString&) ) );
00168 
00169   // kaction for the dir sync method
00170   acSyncDir = new KAction( i18n("Current Document Folder"), "curfiledir", 0,
00171         this, SLOT( setActiveDocumentDir() ), mActionCollection, "sync_dir" );
00172   toolbar->setIconText( KToolBar::IconOnly );
00173   toolbar->setIconSize( 16 );
00174   toolbar->setEnableContextMenu( false );
00175 
00176   connect( cmbPath, SIGNAL( urlActivated( const KURL&  )),
00177              this,  SLOT( cmbPathActivated( const KURL& ) ));
00178   connect( cmbPath, SIGNAL( returnPressed( const QString&  )),
00179              this,  SLOT( cmbPathReturnPressed( const QString& ) ));
00180   connect(dir, SIGNAL(urlEntered(const KURL&)),
00181              this, SLOT(dirUrlEntered(const KURL&)) );
00182 
00183   connect(dir, SIGNAL(finishedLoading()),
00184              this, SLOT(dirFinishedLoading()) );
00185 
00186   // enable dir sync button if current doc has a valid URL
00187   connect ( viewmanager, SIGNAL( viewChanged() ),
00188               this, SLOT( kateViewChanged() ) );
00189 
00190   // Connect the bookmark handler
00191   connect( bookmarkHandler, SIGNAL( openURL( const QString& )),
00192            this, SLOT( setDir( const QString& ) ) );
00193 
00194   waitingUrl = QString::null;
00195 
00196   // whatsthis help
00197   QWhatsThis::add( cmbPath,
00198        i18n("<p>Here you can enter a path for a folder to display."
00199             "<p>To go to a folder previously entered, press the arrow on "
00200             "the right and choose one. <p>The entry has folder "
00201             "completion. Right-click to choose how completion should behave.") );
00202   QWhatsThis::add( filter,
00203         i18n("<p>Here you can enter a name filter to limit which files are displayed."
00204              "<p>To clear the filter, toggle off the filter button to the left."
00205              "<p>To reapply the last filter used, toggle on the filter button." ) );
00206   QWhatsThis::add( btnFilter,
00207         i18n("<p>This button clears the name filter when toggled off, or "
00208              "reapplies the last filter used when toggled on.") );
00209 
00210 }
00211 
00212 KateFileSelector::~KateFileSelector()
00213 {
00214 }
00215 //END Constroctor/Destrctor
00216 
00217 //BEGIN Public Methods
00218 
00219 void KateFileSelector::readConfig(KConfig *config, const QString & name)
00220 {
00221   dir->setViewConfig( config, name + ":view" );
00222   dir->readConfig(config, name + ":dir");
00223   dir->setView( KFile::Default );
00224   dir->view()->setSelectionMode(KFile::Extended);
00225   config->setGroup( name );
00226 
00227   // set up the toolbar
00228   setupToolbar( config );
00229 
00230   cmbPath->setMaxItems( config->readNumEntry( "pathcombo history len", 9 ) );
00231   cmbPath->setURLs( config->readPathListEntry( "dir history" ) );
00232   // if we restore history
00233   if ( config->readBoolEntry( "restore location", true ) || kapp->isRestored() ) {
00234     QString loc( config->readPathEntry( "location" ) );
00235     if ( ! loc.isEmpty() ) {
00236 //       waitingDir = loc;
00237 //       QTimer::singleShot(0, this, SLOT(initialDirChangeHack()));
00238       setDir( loc );
00239     }
00240   }
00241 
00242   // else is automatic, as cmpPath->setURL is called when a location is entered.
00243 
00244   filter->setMaxCount( config->readNumEntry( "filter history len", 9 ) );
00245   filter->setHistoryItems( config->readListEntry("filter history"), true );
00246   lastFilter = config->readEntry( "last filter" );
00247   QString flt("");
00248   if ( config->readBoolEntry( "restore last filter", true ) || kapp->isRestored() )
00249     flt = config->readEntry("current filter");
00250   filter->lineEdit()->setText( flt );
00251   slotFilterChange( flt );
00252 
00253   autoSyncEvents = config->readNumEntry( "AutoSyncEvents", 0 );
00254 }
00255 
00256 void KateFileSelector::initialDirChangeHack()
00257 {
00258   setDir( waitingDir );
00259 }
00260 
00261 void KateFileSelector::setupToolbar( KConfig *config )
00262 {
00263   toolbar->clear();
00264   QStringList tbactions = config->readListEntry( "toolbar actions", ',' );
00265   if ( tbactions.isEmpty() ) {
00266     // reasonable collection for default toolbar
00267     tbactions << "up" << "back" << "forward" << "home" <<
00268                 "short view" << "detailed view" <<
00269                 "bookmarks" << "sync_dir";
00270   }
00271   KAction *ac;
00272   for ( QStringList::Iterator it=tbactions.begin(); it != tbactions.end(); ++it ) {
00273     if ( *it == "bookmarks" || *it == "sync_dir" )
00274       ac = mActionCollection->action( (*it).latin1() );
00275     else
00276       ac = dir->actionCollection()->action( (*it).latin1() );
00277     if ( ac )
00278       ac->plug( toolbar );
00279   }
00280 }
00281 
00282 void KateFileSelector::writeConfig(KConfig *config, const QString & name)
00283 {
00284   dir->writeConfig(config,name + ":dir");
00285 
00286   config->setGroup( name );
00287   config->writeEntry( "pathcombo history len", cmbPath->maxItems() );
00288   QStringList l;
00289   for (int i = 0; i < cmbPath->count(); i++) {
00290     l.append( cmbPath->text( i ) );
00291   }
00292   config->writePathEntry( "dir history", l );
00293   config->writePathEntry( "location", cmbPath->currentText() );
00294 
00295   config->writeEntry( "filter history len", filter->maxCount() );
00296   config->writeEntry( "filter history", filter->historyItems() );
00297   config->writeEntry( "current filter", filter->currentText() );
00298   config->writeEntry( "last filter", lastFilter );
00299   config->writeEntry( "AutoSyncEvents", autoSyncEvents );
00300 }
00301 
00302 void KateFileSelector::setView(KFile::FileView view)
00303 {
00304   dir->setView(view);
00305   dir->view()->setSelectionMode(KFile::Extended);
00306 }
00307 
00308 //END Public Methods
00309 
00310 //BEGIN Public Slots
00311 
00312 void KateFileSelector::slotFilterChange( const QString & nf )
00313 {
00314   QString f = nf.stripWhiteSpace();
00315   bool empty = f.isEmpty() || f == "*";
00316   QToolTip::remove( btnFilter );
00317   if ( empty ) {
00318     dir->clearFilter();
00319     filter->lineEdit()->setText( QString::null );
00320     QToolTip::add( btnFilter,
00321         QString( i18n("Apply last filter (\"%1\")") ).arg( lastFilter ) );
00322   }
00323   else {
00324     dir->setNameFilter( f );
00325     lastFilter = f;
00326     QToolTip::add( btnFilter, i18n("Clear filter") );
00327   }
00328   btnFilter->setOn( !empty );
00329   dir->updateDir();
00330   // this will be never true after the filter has been used;)
00331   btnFilter->setEnabled( !( empty && lastFilter.isEmpty() ) );
00332 
00333 }
00334 
00335 bool kateFileSelectorIsReadable ( const KURL& url )
00336 {
00337   if ( !url.isLocalFile() )
00338     return true; // what else can we say?
00339 
00340   QDir dir (url.path());
00341   return dir.exists ();
00342 }
00343 
00344 void KateFileSelector::setDir( KURL u )
00345 {
00346   KURL newurl;
00347 
00348   if ( !u.isValid() )
00349     newurl.setPath( QDir::homeDirPath() );
00350   else
00351     newurl = u;
00352 
00353   QString pathstr = newurl.path(+1);
00354   newurl.setPath(pathstr);
00355 
00356   if ( !kateFileSelectorIsReadable ( newurl ) )
00357     newurl.cd(QString::fromLatin1(".."));
00358 
00359   if ( !kateFileSelectorIsReadable (newurl) )
00360      newurl.setPath( QDir::homeDirPath() );
00361 
00362   dir->setURL(newurl, true);
00363 }
00364 
00365 //END Public Slots
00366 
00367 //BEGIN Private Slots
00368 
00369 void KateFileSelector::cmbPathActivated( const KURL& u )
00370 {
00371    cmbPathReturnPressed( u.url() );
00372 }
00373 
00374 void KateFileSelector::cmbPathReturnPressed( const QString& u )
00375 {
00376   KURL typedURL( u );
00377   if ( typedURL.hasPass() )
00378     typedURL.setPass( QString::null );
00379 
00380   QStringList urls = cmbPath->urls();
00381   urls.remove( typedURL.url() );
00382   urls.prepend( typedURL.url() );
00383   cmbPath->setURLs( urls, KURLComboBox::RemoveBottom );
00384   dir->setFocus();
00385   dir->setURL( KURL(u), true );
00386 }
00387 
00388 void KateFileSelector::dirUrlEntered( const KURL& u )
00389 {
00390   cmbPath->setURL( u );
00391 }
00392 
00393 void KateFileSelector::dirFinishedLoading()
00394 {
00395 }
00396 
00397 
00398 /*
00399    When the button in the filter box toggles:
00400    If off:
00401    If the name filer is anything but "" or "*", reset it.
00402    If on:
00403    Set last filter.
00404 */
00405 void KateFileSelector::btnFilterClick()
00406 {
00407   if ( !btnFilter->isOn() ) {
00408     slotFilterChange( QString::null );
00409   }
00410   else {
00411     filter->lineEdit()->setText( lastFilter );
00412     slotFilterChange( lastFilter );
00413   }
00414 }
00415 
00416 //FIXME crash on shutdown
00417 void KateFileSelector::setActiveDocumentDir()
00418 {
00419 //   kdDebug(13001)<<"KateFileSelector::setActiveDocumentDir()"<<endl;
00420   KURL u = mainwin->activeDocumentUrl();
00421 //   kdDebug(13001)<<"URL: "<<u.prettyURL()<<endl;
00422   if (!u.isEmpty())
00423     setDir( u.upURL() );
00424 //   kdDebug(13001)<<"... setActiveDocumentDir() DONE!"<<endl;
00425 }
00426 
00427 void KateFileSelector::kateViewChanged()
00428 {
00429   if ( autoSyncEvents & DocumentChanged )
00430   {
00431 //     kdDebug(13001)<<"KateFileSelector::do a sync ()"<<endl;
00432     // if visible, sync
00433     if ( isVisible() ) {
00434       setActiveDocumentDir();
00435       waitingUrl = QString::null;
00436     }
00437     // else set waiting url
00438     else {
00439       KURL u = mainwin->activeDocumentUrl();
00440       if (!u.isEmpty())
00441         waitingUrl = u.directory();
00442     }
00443   }
00444 
00445   // TODO: make sure the button is disabled if the directory is unreadable, eg
00446   //       the document URL has protocol http
00447   acSyncDir->setEnabled( ! mainwin->activeDocumentUrl().directory().isEmpty() );
00448 }
00449 
00450 void KateFileSelector::selectorViewChanged( KFileView * newView )
00451 {
00452   newView->setSelectionMode(KFile::Extended);
00453 }
00454 
00455 //END Private Slots
00456 
00457 //BEGIN Protected
00458 
00459 void KateFileSelector::focusInEvent( QFocusEvent * )
00460 {
00461    dir->setFocus();
00462 }
00463 
00464 void KateFileSelector::showEvent( QShowEvent * )
00465 {
00466     // sync if we should
00467     if ( autoSyncEvents & GotVisible ) {
00468 //     kdDebug(13001)<<"syncing fs on show"<<endl;
00469       setActiveDocumentDir();
00470       waitingUrl = QString::null;
00471     }
00472     // else, if we have a waiting URL set it
00473     else if ( ! waitingUrl.isEmpty() ) {
00474       setDir( waitingUrl );
00475       waitingUrl = QString::null;
00476    }
00477 }
00478 
00479 bool KateFileSelector::eventFilter( QObject* o, QEvent *e )
00480 {
00481   /*
00482       This is rather unfortunate, but:
00483       QComboBox does not support setting the size of the listbox to something
00484       reasonable. Even using listbox->setVariableWidth() does not yield a
00485       satisfying result, something is wrong with the handling of the sizehint.
00486       And the popup is rather useless, if the paths are only partly visible.
00487   */
00488   QListBox *lb = cmbPath->listBox();
00489   if ( o == lb && e->type() == QEvent::Show ) {
00490     int add = lb->height() < lb->contentsHeight() ? lb->verticalScrollBar()->width() : 0;
00491     int w = QMIN( mainwin->width(), lb->contentsWidth() + add );
00492     lb->resize( w, lb->height() );
00493     // TODO - move the listbox to a suitable place if nessecary
00494     // TODO - decide if it is worth caching the size while untill the contents
00495     //        are changed.
00496   }
00497   // TODO - same thing for the completion popup?
00498   return QWidget::eventFilter( o, e );
00499 }
00500 
00501 //END Protected
00502 
00503 //BEGIN ACtionLBItem
00504 /*
00505    QListboxItem that can store and return a string,
00506    used for the toolbar action selector.
00507 */
00508 class ActionLBItem : public QListBoxPixmap {
00509   public:
00510   ActionLBItem( QListBox *lb=0,
00511                 const QPixmap &pm = QPixmap(),
00512                 const QString &text=QString::null,
00513                 const QString &str=QString::null ) :
00514     QListBoxPixmap( lb, pm, text ),
00515     _str(str) {};
00516   QString idstring() { return _str; };
00517   private:
00518     QString _str;
00519 };
00520 //END ActionLBItem
00521 
00522 //BEGIN KFSConfigPage
00524 // KFSConfigPage implementation
00526 KFSConfigPage::KFSConfigPage( QWidget *parent, const char *name, KateFileSelector *kfs )
00527   : Kate::ConfigPage( parent, name ),
00528     fileSelector( kfs ),
00529     m_changed( false )
00530 {
00531   QVBoxLayout *lo = new QVBoxLayout( this );
00532   int spacing = KDialog::spacingHint();
00533   lo->setSpacing( spacing );
00534 
00535   // Toolbar - a lot for a little...
00536   QGroupBox *gbToolbar = new QGroupBox( 1, Qt::Vertical, i18n("Toolbar"), this );
00537   acSel = new KActionSelector( gbToolbar );
00538   acSel->setAvailableLabel( i18n("A&vailable actions:") );
00539   acSel->setSelectedLabel( i18n("S&elected actions:") );
00540   lo->addWidget( gbToolbar );
00541   connect( acSel, SIGNAL( added( QListBoxItem * ) ), this, SLOT( slotMyChanged() ) );
00542   connect( acSel, SIGNAL( removed( QListBoxItem * ) ), this, SLOT( slotMyChanged() ) );
00543   connect( acSel, SIGNAL( movedUp( QListBoxItem * ) ), this, SLOT( slotMyChanged() ) );
00544   connect( acSel, SIGNAL( movedDown( QListBoxItem * ) ), this, SLOT( slotMyChanged() ) );
00545 
00546   // Sync
00547   QGroupBox *gbSync = new QGroupBox( 1, Qt::Horizontal, i18n("Auto Synchronization"), this );
00548   cbSyncActive = new QCheckBox( i18n("When a docu&ment becomes active"), gbSync );
00549   cbSyncShow = new QCheckBox( i18n("When the file selector becomes visible"), gbSync );
00550   lo->addWidget( gbSync );
00551   connect( cbSyncActive, SIGNAL( toggled( bool ) ), this, SLOT( slotMyChanged() ) );
00552   connect( cbSyncShow, SIGNAL( toggled( bool ) ), this, SLOT( slotMyChanged() ) );
00553 
00554   // Histories
00555   QHBox *hbPathHist = new QHBox ( this );
00556   QLabel *lbPathHist = new QLabel( i18n("Remember &locations:"), hbPathHist );
00557   sbPathHistLength = new QSpinBox( hbPathHist );
00558   lbPathHist->setBuddy( sbPathHistLength );
00559   lo->addWidget( hbPathHist );
00560   connect( sbPathHistLength, SIGNAL( valueChanged ( int ) ), this, SLOT( slotMyChanged() ) );
00561 
00562   QHBox *hbFilterHist = new QHBox ( this );
00563   QLabel *lbFilterHist = new QLabel( i18n("Remember &filters:"), hbFilterHist );
00564   sbFilterHistLength = new QSpinBox( hbFilterHist );
00565   lbFilterHist->setBuddy( sbFilterHistLength );
00566   lo->addWidget( hbFilterHist );
00567   connect( sbFilterHistLength, SIGNAL( valueChanged ( int ) ), this, SLOT( slotMyChanged() ) );
00568 
00569   // Session
00570   QGroupBox *gbSession = new QGroupBox( 1, Qt::Horizontal, i18n("Session"), this );
00571   cbSesLocation = new QCheckBox( i18n("Restore loca&tion"), gbSession );
00572   cbSesFilter = new QCheckBox( i18n("Restore last f&ilter"), gbSession );
00573   lo->addWidget( gbSession );
00574   connect( cbSesLocation, SIGNAL( toggled( bool ) ), this, SLOT( slotMyChanged() ) );
00575   connect( cbSesFilter, SIGNAL( toggled( bool ) ), this, SLOT( slotMyChanged() ) );
00576 
00577   // make it look nice
00578   lo->addStretch( 1 );
00579 
00580   // be helpfull
00581   /*
00582   QWhatsThis::add( lbAvailableActions, i18n(
00583         "<p>Available actions for the toolbar. To add an action, select it here "
00584         "and press the add (<strong>-&gt;</strong>) button" ) );
00585   QWhatsThis::add( lbUsedActions, i18n(
00586         "<p>Actions used in the toolbar. To remove an action, select it and "
00587         "press the remove (<strong>&lt;-</strong>) button."
00588         "<p>To change the order of the actions, use the Up and Down buttons to "
00589         "move the selected action.") );
00590   */
00591   QString lhwt( i18n(
00592         "<p>Decides how many locations to keep in the history of the location "
00593         "combo box.") );
00594   QWhatsThis::add( lbPathHist, lhwt );
00595   QWhatsThis::add( sbPathHistLength, lhwt );
00596   QString fhwt( i18n(
00597         "<p>Decides how many filters to keep in the history of the filter "
00598         "combo box.") );
00599   QWhatsThis::add( lbFilterHist, fhwt );
00600   QWhatsThis::add( sbFilterHistLength, fhwt );
00601   QString synwt( i18n(
00602         "<p>These options allow you to have the File Selector automatically "
00603         "change location to the folder of the active document on certain "
00604         "events."
00605         "<p>Auto synchronization is <em>lazy</em>, meaning it will not take "
00606         "effect until the file selector is visible."
00607         "<p>None of these are enabled by default, but you can always sync the "
00608         "location by pressing the sync button in the toolbar.") );
00609   QWhatsThis::add( gbSync, synwt );
00610   QWhatsThis::add( cbSesLocation, i18n(
00611         "<p>If this option is enabled (default), the location will be restored "
00612         "when you start Kate.<p><strong>Note</strong> that if the session is "
00613         "handled by the KDE session manager, the location is always restored.") );
00614   QWhatsThis::add( cbSesFilter, i18n(
00615         "<p>If this option is enabled (default), the current filter will be "
00616         "restored when you start Kate.<p><strong>Note</strong> that if the "
00617         "session is handled by the KDE session manager, the filter is always "
00618         "restored."
00619         "<p><strong>Note</strong> that some of the autosync settings may "
00620         "override the restored location if on.") );
00621 
00622   init();
00623 
00624 }
00625 
00626 void KFSConfigPage::apply()
00627 {
00628   if ( ! m_changed )
00629     return;
00630 
00631   m_changed = false;
00632 
00633   KConfig *config = kapp->config();
00634   config->setGroup( "fileselector" );
00635   // toolbar
00636   QStringList l;
00637   QListBoxItem *item = acSel->selectedListBox()->firstItem();
00638   ActionLBItem *aItem;
00639   while ( item )
00640   {
00641     aItem = (ActionLBItem*)item;
00642     if ( aItem )
00643     {
00644       l << aItem->idstring();
00645     }
00646     item = item->next();
00647   }
00648   config->writeEntry( "toolbar actions", l );
00649   fileSelector->setupToolbar( config );
00650   // sync
00651   int s = 0;
00652   if ( cbSyncActive->isChecked() )
00653     s |= KateFileSelector::DocumentChanged;
00654   if ( cbSyncShow->isChecked() )
00655     s |= KateFileSelector::GotVisible;
00656   fileSelector->autoSyncEvents = s;
00657 
00658   // histories
00659   fileSelector->cmbPath->setMaxItems( sbPathHistLength->value() );
00660   fileSelector->filter->setMaxCount( sbFilterHistLength->value() );
00661   // session - theese are read/written directly to the app config,
00662   //           as they are not needed during operation.
00663   config->writeEntry( "restore location", cbSesLocation->isChecked() );
00664   config->writeEntry( "restore last filter", cbSesFilter->isChecked() );
00665 }
00666 
00667 void KFSConfigPage::reload()
00668 {
00669   // hmm, what is this supposed to do, actually??
00670   init();
00671   m_changed = false;
00672 }
00673 void KFSConfigPage::init()
00674 {
00675   KConfig *config = kapp->config();
00676   config->setGroup( "fileselector" );
00677   // toolbar
00678   QStringList l = config->readListEntry( "toolbar actions", ',' );
00679   if ( l.isEmpty() ) // default toolbar
00680     l << "up" << "back" << "forward" << "home" <<
00681                 "short view" << "detailed view" <<
00682                 "bookmarks" << "sync_dir";
00683 
00684   // actions from diroperator + two of our own
00685   QStringList allActions;
00686   allActions << "up" << "back" << "forward" << "home" <<
00687                 "reload" << "mkdir" << "delete" <<
00688                 "short view" << "detailed view" /*<< "view menu" <<
00689                 "show hidden" << "properties"*/ <<
00690                 "bookmarks" << "sync_dir";
00691   QRegExp re("&(?=[^&])");
00692   KAction *ac;
00693   QListBox *lb;
00694   for ( QStringList::Iterator it=allActions.begin(); it != allActions.end(); ++it ) {
00695     lb = l.contains( *it ) ? acSel->selectedListBox() : acSel->availableListBox();
00696     if ( *it == "bookmarks" || *it == "sync_dir" )
00697       ac = fileSelector->actionCollection()->action( (*it).latin1() );
00698     else
00699       ac = fileSelector->dirOperator()->actionCollection()->action( (*it).latin1() );
00700     if ( ac )
00701       new ActionLBItem( lb, SmallIcon( ac->icon() ), ac->text().replace( re, "" ), *it );
00702   }
00703 
00704   // sync
00705   int s = fileSelector->autoSyncEvents;
00706   cbSyncActive->setChecked( s & KateFileSelector::DocumentChanged );
00707   cbSyncShow->setChecked( s & KateFileSelector::GotVisible );
00708   // histories
00709   sbPathHistLength->setValue( fileSelector->cmbPath->maxItems() );
00710   sbFilterHistLength->setValue( fileSelector->filter->maxCount() );
00711   // session
00712   cbSesLocation->setChecked( config->readBoolEntry( "restore location", true ) );
00713   cbSesFilter->setChecked( config->readBoolEntry( "restore last filter", true ) );
00714 }
00715 
00716 void KFSConfigPage::slotMyChanged()
00717 {
00718   m_changed = true;
00719   slotChanged();
00720 }
00721 //END KFSConfigPage
00722 // kate: space-indent on; indent-width 2; replace-tabs on;

kate

Skip menu "kate"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members

API Reference

Skip menu "API Reference"
  • kate
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal