kio Library API Documentation

kurlrequester.cpp

00001 /* This file is part of the KDE libraries 00002 Copyright (C) 1999,2000,2001 Carsten Pfeiffer <pfeiffer@kde.org> 00003 00004 library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License version 2, as published by the Free Software Foundation. 00007 00008 This library is distributed in the hope that it will be useful, 00009 but WITHOUT ANY WARRANTY; without even the implied warranty of 00010 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00011 Library General Public License for more details. 00012 00013 You should have received a copy of the GNU Library General Public License 00014 along with this library; see the file COPYING.LIB. If not, write to 00015 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00016 Boston, MA 02111-1307, USA. 00017 */ 00018 00019 00020 #include <sys/stat.h> 00021 #include <unistd.h> 00022 00023 #include <qstring.h> 00024 #include <qtooltip.h> 00025 00026 #include <kaccel.h> 00027 #include <kcombobox.h> 00028 #include <kdebug.h> 00029 #include <kdialog.h> 00030 #include <kdirselectdialog.h> 00031 #include <kfiledialog.h> 00032 #include <kglobal.h> 00033 #include <kiconloader.h> 00034 #include <klineedit.h> 00035 #include <klocale.h> 00036 #include <kurlcompletion.h> 00037 #include <kurldrag.h> 00038 #include <kprotocolinfo.h> 00039 00040 #include "kurlrequester.h" 00041 00042 00043 class KURLDragPushButton : public KPushButton 00044 { 00045 public: 00046 KURLDragPushButton( QWidget *parent, const char *name=0 ) 00047 : KPushButton( parent, name ) { 00048 setDragEnabled( true ); 00049 } 00050 ~KURLDragPushButton() {} 00051 00052 void setURL( const KURL& url ) { 00053 m_urls.clear(); 00054 m_urls.append( url ); 00055 } 00056 00057 /* not needed so far 00058 void setURLs( const KURL::List& urls ) { 00059 m_urls = urls; 00060 } 00061 const KURL::List& urls() const { return m_urls; } 00062 */ 00063 00064 protected: 00065 virtual QDragObject *dragObject() { 00066 if ( m_urls.isEmpty() ) 00067 return 0L; 00068 00069 QDragObject *drag = new KURLDrag( m_urls, this, "url drag" ); 00070 return drag; 00071 } 00072 00073 private: 00074 KURL::List m_urls; 00075 00076 }; 00077 00078 00079 /* 00080 ************************************************************************* 00081 */ 00082 00083 class KURLRequester::KURLRequesterPrivate 00084 { 00085 public: 00086 KURLRequesterPrivate() { 00087 edit = 0L; 00088 combo = 0L; 00089 fileDialogMode = KFile::File | KFile::ExistingOnly | KFile::LocalOnly; 00090 } 00091 00092 void setText( const QString& text ) { 00093 if ( combo ) 00094 { 00095 if (combo->editable()) 00096 { 00097 combo->setEditText( text ); 00098 } 00099 else 00100 { 00101 combo->insertItem( text ); 00102 combo->setCurrentItem( combo->count()-1 ); 00103 } 00104 } 00105 else 00106 { 00107 edit->setText( text ); 00108 } 00109 } 00110 00111 void connectSignals( QObject *receiver ) { 00112 QObject *sender; 00113 if ( combo ) 00114 sender = combo; 00115 else 00116 sender = edit; 00117 00118 connect( sender, SIGNAL( textChanged( const QString& )), 00119 receiver, SIGNAL( textChanged( const QString& ))); 00120 connect( sender, SIGNAL( returnPressed() ), 00121 receiver, SIGNAL( returnPressed() )); 00122 connect( sender, SIGNAL( returnPressed( const QString& ) ), 00123 receiver, SIGNAL( returnPressed( const QString& ) )); 00124 } 00125 00126 void setCompletionObject( KCompletion *comp ) { 00127 if ( combo ) 00128 combo->setCompletionObject( comp ); 00129 else 00130 edit->setCompletionObject( comp ); 00131 } 00132 00136 QString url() { 00137 QString txt = combo ? combo->currentText() : edit->text(); 00138 KURLCompletion *comp; 00139 if ( combo ) 00140 comp = dynamic_cast<KURLCompletion*>(combo->completionObject()); 00141 else 00142 comp = dynamic_cast<KURLCompletion*>(edit->completionObject()); 00143 00144 if ( comp ) 00145 return comp->replacedPath( txt ); 00146 else 00147 return txt; 00148 } 00149 00150 KLineEdit *edit; 00151 KComboBox *combo; 00152 int fileDialogMode; 00153 QString fileDialogFilter; 00154 }; 00155 00156 00157 00158 KURLRequester::KURLRequester( QWidget *editWidget, QWidget *parent, 00159 const char *name ) 00160 : QHBox( parent, name ) 00161 { 00162 d = new KURLRequesterPrivate; 00163 00164 // must have this as parent 00165 editWidget->reparent( this, 0, QPoint(0,0) ); 00166 d->edit = dynamic_cast<KLineEdit*>( editWidget ); 00167 d->combo = dynamic_cast<KComboBox*>( editWidget ); 00168 00169 init(); 00170 } 00171 00172 00173 KURLRequester::KURLRequester( QWidget *parent, const char *name ) 00174 : QHBox( parent, name ) 00175 { 00176 d = new KURLRequesterPrivate; 00177 init(); 00178 } 00179 00180 00181 KURLRequester::KURLRequester( const QString& url, QWidget *parent, 00182 const char *name ) 00183 : QHBox( parent, name ) 00184 { 00185 d = new KURLRequesterPrivate; 00186 init(); 00187 setKURL( KURL::fromPathOrURL( url ) ); 00188 } 00189 00190 00191 KURLRequester::~KURLRequester() 00192 { 00193 delete myCompletion; 00194 delete myFileDialog; 00195 delete d; 00196 } 00197 00198 00199 void KURLRequester::init() 00200 { 00201 myFileDialog = 0L; 00202 myShowLocalProt = false; 00203 00204 if ( !d->combo && !d->edit ) 00205 d->edit = new KLineEdit( this, "line edit" ); 00206 00207 myButton = new KURLDragPushButton( this, "kfile button"); 00208 QIconSet iconSet = SmallIconSet(QString::fromLatin1("fileopen")); 00209 QPixmap pixMap = iconSet.pixmap( QIconSet::Small, QIconSet::Normal ); 00210 myButton->setIconSet( iconSet ); 00211 myButton->setFixedSize( pixMap.width()+8, pixMap.height()+8 ); 00212 QToolTip::add(myButton, i18n("Open file dialog")); 00213 00214 connect( myButton, SIGNAL( pressed() ), SLOT( slotUpdateURL() )); 00215 00216 setSpacing( KDialog::spacingHint() ); 00217 00218 QWidget *widget = d->combo ? (QWidget*) d->combo : (QWidget*) d->edit; 00219 setFocusProxy( widget ); 00220 00221 d->connectSignals( this ); 00222 connect( myButton, SIGNAL( clicked() ), this, SLOT( slotOpenDialog() )); 00223 00224 myCompletion = new KURLCompletion(); 00225 d->setCompletionObject( myCompletion ); 00226 00227 KAccel *accel = new KAccel( this ); 00228 accel->insert( KStdAccel::Open, this, SLOT( slotOpenDialog() )); 00229 accel->readSettings(); 00230 } 00231 00232 00233 void KURLRequester::setURL( const QString& url ) 00234 { 00235 if ( myShowLocalProt ) 00236 { 00237 d->setText( url ); 00238 } 00239 else 00240 { 00241 // ### This code is broken (e.g. for paths with '#') 00242 if ( url.startsWith("file://") ) 00243 d->setText( url.mid( 7 ) ); 00244 else if ( url.startsWith("file:") ) 00245 d->setText( url.mid( 5 ) ); 00246 else 00247 d->setText( url ); 00248 } 00249 } 00250 00251 void KURLRequester::setKURL( const KURL& url ) 00252 { 00253 if ( myShowLocalProt ) 00254 d->setText( url.url() ); 00255 else 00256 d->setText( url.pathOrURL() ); 00257 } 00258 00259 void KURLRequester::setCaption( const QString& caption ) 00260 { 00261 QWidget::setCaption( caption ); 00262 if (myFileDialog) 00263 myFileDialog->setCaption( caption ); 00264 } 00265 00266 QString KURLRequester::url() const 00267 { 00268 return d->url(); 00269 } 00270 00271 void KURLRequester::slotOpenDialog() 00272 { 00273 KURL newurl; 00274 if ( (d->fileDialogMode & KFile::Directory) && !(d->fileDialogMode & KFile::File) || 00275 /* catch possible fileDialog()->setMode( KFile::Directory ) changes */ 00276 (myFileDialog && ( (myFileDialog->mode() & KFile::Directory) && 00277 (myFileDialog->mode() & (KFile::File | KFile::Files)) == 0 ) ) ) 00278 { 00279 newurl = KDirSelectDialog::selectDirectory(url(), d->fileDialogMode & KFile::LocalOnly); 00280 if ( !newurl.isValid() ) 00281 { 00282 return; 00283 } 00284 } 00285 else 00286 { 00287 emit openFileDialog( this ); 00288 00289 KFileDialog *dlg = fileDialog(); 00290 if ( !d->url().isEmpty() ) { 00291 KURL u( url() ); 00292 // If we won't be able to list it (e.g. http), then don't try :) 00293 if ( KProtocolInfo::supportsListing( u ) ) 00294 dlg->setSelection( u.url() ); 00295 } 00296 00297 if ( dlg->exec() != QDialog::Accepted ) 00298 { 00299 return; 00300 } 00301 00302 newurl = dlg->selectedURL(); 00303 } 00304 00305 setKURL( newurl ); 00306 emit urlSelected( d->url() ); 00307 } 00308 00309 void KURLRequester::setMode(unsigned int mode) 00310 { 00311 Q_ASSERT( (mode & KFile::Files) == 0 ); 00312 d->fileDialogMode = mode; 00313 if ( (mode & KFile::Directory) && !(mode & KFile::File) ) 00314 myCompletion->setMode( KURLCompletion::DirCompletion ); 00315 00316 if (myFileDialog) 00317 myFileDialog->setMode( d->fileDialogMode ); 00318 } 00319 00320 unsigned int KURLRequester::mode() const 00321 { 00322 return d->fileDialogMode; 00323 } 00324 00325 void KURLRequester::setFilter(const QString &filter) 00326 { 00327 d->fileDialogFilter = filter; 00328 if (myFileDialog) 00329 myFileDialog->setFilter( d->fileDialogFilter ); 00330 } 00331 00332 QString KURLRequester::filter( ) const 00333 { 00334 return d->fileDialogFilter; 00335 } 00336 00337 00338 KFileDialog * KURLRequester::fileDialog() const 00339 { 00340 if ( !myFileDialog ) { 00341 QWidget *p = parentWidget(); 00342 myFileDialog = new KFileDialog( QString::null, d->fileDialogFilter, p, 00343 "file dialog", true ); 00344 00345 myFileDialog->setMode( d->fileDialogMode ); 00346 myFileDialog->setCaption( caption() ); 00347 } 00348 00349 return myFileDialog; 00350 } 00351 00352 00353 void KURLRequester::setShowLocalProtocol( bool b ) 00354 { 00355 if ( myShowLocalProt == b ) 00356 return; 00357 00358 myShowLocalProt = b; 00359 setKURL( url() ); 00360 } 00361 00362 void KURLRequester::clear() 00363 { 00364 d->setText( QString::null ); 00365 } 00366 00367 KLineEdit * KURLRequester::lineEdit() const 00368 { 00369 return d->edit; 00370 } 00371 00372 KComboBox * KURLRequester::comboBox() const 00373 { 00374 return d->combo; 00375 } 00376 00377 void KURLRequester::slotUpdateURL() 00378 { 00379 // bin compat, myButton is declared as QPushButton 00380 KURL u; 00381 u = KURL( KURL( QDir::currentDirPath() + '/' ), url() ); 00382 (static_cast<KURLDragPushButton *>( myButton ))->setURL( u ); 00383 } 00384 00385 KPushButton * KURLRequester::button() const 00386 { 00387 return myButton; 00388 } 00389 00390 KEditListBox::CustomEditor KURLRequester::customEditor() 00391 { 00392 setSizePolicy(QSizePolicy( QSizePolicy::Preferred, 00393 QSizePolicy::Fixed)); 00394 00395 KLineEdit *edit = d->edit; 00396 if ( !edit && d->combo ) 00397 edit = dynamic_cast<KLineEdit*>( d->combo->lineEdit() ); 00398 00399 #ifndef NDEBUG 00400 if ( !edit ) 00401 kdWarning() << "KURLRequester's lineedit is not a KLineEdit!??\n"; 00402 #endif 00403 00404 KEditListBox::CustomEditor editor( this, edit ); 00405 return editor; 00406 } 00407 00408 void KURLRequester::virtual_hook( int, void* ) 00409 { /*BASE::virtual_hook( id, data );*/ } 00410 00411 KURLComboRequester::KURLComboRequester( QWidget *parent, 00412 const char *name ) 00413 : KURLRequester( new KComboBox(false), parent, name) 00414 { 00415 } 00416 00417 #include "kurlrequester.moc"
KDE Logo
This file is part of the documentation for kio Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Apr 14 00:20:31 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003