katefileselector.cpp
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 <tqlayout.h> 00032 #include <tqtoolbutton.h> 00033 #include <tqhbox.h> 00034 #include <tqvbox.h> 00035 #include <tqlabel.h> 00036 #include <tqstrlist.h> 00037 #include <tqtooltip.h> 00038 #include <tqwhatsthis.h> 00039 #include <tqapplication.h> 00040 #include <tqlistbox.h> 00041 #include <tqscrollbar.h> 00042 #include <tqspinbox.h> 00043 #include <tqgroupbox.h> 00044 #include <tqcheckbox.h> 00045 #include <tqregexp.h> 00046 #include <tqdockarea.h> 00047 #include <tqtimer.h> 00048 #include <tqdir.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 <tqtoolbar.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(TQtMsgType, const char *){} 00071 00072 // helper classes to be able to have a toolbar without move handle 00073 KateFileSelectorToolBar::KateFileSelectorToolBar(TQWidget *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(TQWidget *parent) 00088 :TQFrame(parent),m_tb(0){} 00089 KateFileSelectorToolBarParent::~KateFileSelectorToolBarParent(){} 00090 void KateFileSelectorToolBarParent::setToolBar(KateFileSelectorToolBar *tb) 00091 { 00092 m_tb=tb; 00093 } 00094 00095 void KateFileSelectorToolBarParent::resizeEvent ( TQResizeEvent * ) 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 TQWidget * parent, const char * name ) 00110 : TQVBox (parent, name), 00111 mainwin(mainWindow), 00112 viewmanager(viewManager) 00113 { 00114 mActionCollection = new KActionCollection( this ); 00115 00116 TQtMsgHandler oldHandler = tqInstallMsgHandler( 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 tqInstallMsgHandler( oldHandler ); 00124 00125 cmbPath = new KURLComboBox( KURLComboBox::Directories, true, this, "path combo" ); 00126 cmbPath->setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::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, TQT_SIGNAL( viewChanged(KFileView *) ), 00136 this, TQT_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 TQHBox* filterBox = new TQHBox(this); 00155 00156 btnFilter = new TQToolButton( filterBox ); 00157 btnFilter->setIconSet( SmallIconSet("filter" ) ); 00158 btnFilter->setToggleButton( true ); 00159 filter = new KHistoryCombo( true, filterBox, "filter"); 00160 filter->setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Fixed )); 00161 filterBox->setStretchFactor(filter, 2); 00162 connect( btnFilter, TQT_SIGNAL( clicked() ), this, TQT_SLOT( btnFilterClick() ) ); 00163 00164 connect( filter, TQT_SIGNAL( activated(const TQString&) ), 00165 TQT_SLOT( slotFilterChange(const TQString&) ) ); 00166 connect( filter, TQT_SIGNAL( returnPressed(const TQString&) ), 00167 filter, TQT_SLOT( addToHistory(const TQString&) ) ); 00168 00169 // kaction for the dir sync method 00170 acSyncDir = new KAction( i18n("Current Document Folder"), "curfiledir", 0, 00171 TQT_TQOBJECT(this), TQT_SLOT( setActiveDocumentDir() ), mActionCollection, "sync_dir" ); 00172 toolbar->setIconText( KToolBar::IconOnly ); 00173 toolbar->setIconSize( 16 ); 00174 toolbar->setEnableContextMenu( false ); 00175 00176 connect( cmbPath, TQT_SIGNAL( urlActivated( const KURL& )), 00177 this, TQT_SLOT( cmbPathActivated( const KURL& ) )); 00178 connect( cmbPath, TQT_SIGNAL( returnPressed( const TQString& )), 00179 this, TQT_SLOT( cmbPathReturnPressed( const TQString& ) )); 00180 connect(dir, TQT_SIGNAL(urlEntered(const KURL&)), 00181 this, TQT_SLOT(dirUrlEntered(const KURL&)) ); 00182 00183 connect(dir, TQT_SIGNAL(finishedLoading()), 00184 this, TQT_SLOT(dirFinishedLoading()) ); 00185 00186 // enable dir sync button if current doc has a valid URL 00187 connect ( viewmanager, TQT_SIGNAL( viewChanged() ), 00188 this, TQT_SLOT( kateViewChanged() ) ); 00189 00190 // Connect the bookmark handler 00191 connect( bookmarkHandler, TQT_SIGNAL( openURL( const TQString& )), 00192 this, TQT_SLOT( setDir( const TQString& ) ) ); 00193 00194 waitingUrl = TQString::null; 00195 00196 // whatsthis help 00197 TQWhatsThis::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 TQWhatsThis::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 TQWhatsThis::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 TQString & 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 TQString loc( config->readPathEntry( "location" ) ); 00235 if ( ! loc.isEmpty() ) { 00236 // waitingDir = loc; 00237 // TQTimer::singleShot(0, this, TQT_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 TQString 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 TQStringList 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 ( TQStringList::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 TQString & name) 00283 { 00284 dir->writeConfig(config,name + ":dir"); 00285 00286 config->setGroup( name ); 00287 config->writeEntry( "pathcombo history len", cmbPath->maxItems() ); 00288 TQStringList 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 TQString & nf ) 00313 { 00314 TQString f = nf.stripWhiteSpace(); 00315 bool empty = f.isEmpty() || f == "*"; 00316 TQToolTip::remove( btnFilter ); 00317 if ( empty ) { 00318 dir->clearFilter(); 00319 filter->lineEdit()->setText( TQString::null ); 00320 TQToolTip::add( btnFilter, 00321 TQString( i18n("Apply last filter (\"%1\")") ).arg( lastFilter ) ); 00322 } 00323 else { 00324 dir->setNameFilter( f ); 00325 lastFilter = f; 00326 TQToolTip::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 TQDir 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( TQDir::homeDirPath() ); 00350 else 00351 newurl = u; 00352 00353 TQString pathstr = newurl.path(+1); 00354 newurl.setPath(pathstr); 00355 00356 if ( !kateFileSelectorIsReadable ( newurl ) ) 00357 newurl.cd(TQString::fromLatin1("..")); 00358 00359 if ( !kateFileSelectorIsReadable (newurl) ) 00360 newurl.setPath( TQDir::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 TQString& u ) 00375 { 00376 KURL typedURL( u ); 00377 if ( typedURL.hasPass() ) 00378 typedURL.setPass( TQString::null ); 00379 00380 TQStringList 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( TQString::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 = TQString::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( TQFocusEvent * ) 00460 { 00461 dir->setFocus(); 00462 } 00463 00464 void KateFileSelector::showEvent( TQShowEvent * ) 00465 { 00466 // sync if we should 00467 if ( autoSyncEvents & GotVisible ) { 00468 // kdDebug(13001)<<"syncing fs on show"<<endl; 00469 setActiveDocumentDir(); 00470 waitingUrl = TQString::null; 00471 } 00472 // else, if we have a waiting URL set it 00473 else if ( ! waitingUrl.isEmpty() ) { 00474 setDir( waitingUrl ); 00475 waitingUrl = TQString::null; 00476 } 00477 } 00478 00479 bool KateFileSelector::eventFilter( TQObject* o, TQEvent *e ) 00480 { 00481 /* 00482 This is rather unfortunate, but: 00483 TQComboBox 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 TQListBox *lb = cmbPath->listBox(); 00489 if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(lb) && e->type() == TQEvent::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 TQWidget::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 TQListBoxPixmap { 00509 public: 00510 ActionLBItem( TQListBox *lb=0, 00511 const TQPixmap &pm = TQPixmap(), 00512 const TQString &text=TQString::null, 00513 const TQString &str=TQString::null ) : 00514 TQListBoxPixmap( lb, pm, text ), 00515 _str(str) {}; 00516 TQString idstring() { return _str; }; 00517 private: 00518 TQString _str; 00519 }; 00520 //END ActionLBItem 00521 00522 //BEGIN KFSConfigPage 00524 // KFSConfigPage implementation 00526 KFSConfigPage::KFSConfigPage( TQWidget *parent, const char *name, KateFileSelector *kfs ) 00527 : Kate::ConfigPage( parent, name ), 00528 fileSelector( kfs ), 00529 m_changed( false ) 00530 { 00531 TQVBoxLayout *lo = new TQVBoxLayout( this ); 00532 int spacing = KDialog::spacingHint(); 00533 lo->setSpacing( spacing ); 00534 00535 // Toolbar - a lot for a little... 00536 TQGroupBox *gbToolbar = new TQGroupBox( 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, TQT_SIGNAL( added( TQListBoxItem * ) ), this, TQT_SLOT( slotMyChanged() ) ); 00542 connect( acSel, TQT_SIGNAL( removed( TQListBoxItem * ) ), this, TQT_SLOT( slotMyChanged() ) ); 00543 connect( acSel, TQT_SIGNAL( movedUp( TQListBoxItem * ) ), this, TQT_SLOT( slotMyChanged() ) ); 00544 connect( acSel, TQT_SIGNAL( movedDown( TQListBoxItem * ) ), this, TQT_SLOT( slotMyChanged() ) ); 00545 00546 // Sync 00547 TQGroupBox *gbSync = new TQGroupBox( 1, Qt::Horizontal, i18n("Auto Synchronization"), this ); 00548 cbSyncActive = new TQCheckBox( i18n("When a docu&ment becomes active"), gbSync ); 00549 cbSyncShow = new TQCheckBox( i18n("When the file selector becomes visible"), gbSync ); 00550 lo->addWidget( gbSync ); 00551 connect( cbSyncActive, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( slotMyChanged() ) ); 00552 connect( cbSyncShow, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( slotMyChanged() ) ); 00553 00554 // Histories 00555 TQHBox *hbPathHist = new TQHBox ( this ); 00556 TQLabel *lbPathHist = new TQLabel( i18n("Remember &locations:"), hbPathHist ); 00557 sbPathHistLength = new TQSpinBox( hbPathHist ); 00558 lbPathHist->setBuddy( sbPathHistLength ); 00559 lo->addWidget( hbPathHist ); 00560 connect( sbPathHistLength, TQT_SIGNAL( valueChanged ( int ) ), this, TQT_SLOT( slotMyChanged() ) ); 00561 00562 TQHBox *hbFilterHist = new TQHBox ( this ); 00563 TQLabel *lbFilterHist = new TQLabel( i18n("Remember &filters:"), hbFilterHist ); 00564 sbFilterHistLength = new TQSpinBox( hbFilterHist ); 00565 lbFilterHist->setBuddy( sbFilterHistLength ); 00566 lo->addWidget( hbFilterHist ); 00567 connect( sbFilterHistLength, TQT_SIGNAL( valueChanged ( int ) ), this, TQT_SLOT( slotMyChanged() ) ); 00568 00569 // Session 00570 TQGroupBox *gbSession = new TQGroupBox( 1, Qt::Horizontal, i18n("Session"), this ); 00571 cbSesLocation = new TQCheckBox( i18n("Restore loca&tion"), gbSession ); 00572 cbSesFilter = new TQCheckBox( i18n("Restore last f&ilter"), gbSession ); 00573 lo->addWidget( gbSession ); 00574 connect( cbSesLocation, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( slotMyChanged() ) ); 00575 connect( cbSesFilter, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( slotMyChanged() ) ); 00576 00577 // make it look nice 00578 lo->addStretch( 1 ); 00579 00580 // be helpfull 00581 /* 00582 TQWhatsThis::add( lbAvailableActions, i18n( 00583 "<p>Available actions for the toolbar. To add an action, select it here " 00584 "and press the add (<strong>-></strong>) button" ) ); 00585 TQWhatsThis::add( lbUsedActions, i18n( 00586 "<p>Actions used in the toolbar. To remove an action, select it and " 00587 "press the remove (<strong><-</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 TQString lhwt( i18n( 00592 "<p>Decides how many locations to keep in the history of the location " 00593 "combo box.") ); 00594 TQWhatsThis::add( lbPathHist, lhwt ); 00595 TQWhatsThis::add( sbPathHistLength, lhwt ); 00596 TQString fhwt( i18n( 00597 "<p>Decides how many filters to keep in the history of the filter " 00598 "combo box.") ); 00599 TQWhatsThis::add( lbFilterHist, fhwt ); 00600 TQWhatsThis::add( sbFilterHistLength, fhwt ); 00601 TQString 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 TQWhatsThis::add( gbSync, synwt ); 00610 TQWhatsThis::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 TQWhatsThis::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 TQStringList l; 00637 TQListBoxItem *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 TQStringList 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 TQStringList 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 TQRegExp re("&(?=[^&])"); 00692 KAction *ac; 00693 TQListBox *lb; 00694 for ( TQStringList::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;