00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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 <kfiledialog.h>
00031 #include <kglobal.h>
00032 #include <kiconloader.h>
00033 #include <klineedit.h>
00034 #include <klocale.h>
00035 #include <kurlcompletion.h>
00036 #include <kurldrag.h>
00037 #include <kprotocolinfo.h>
00038
00039 #include "kurlrequester.h"
00040
00041
00042 class KURLDragPushButton : public KPushButton
00043 {
00044 public:
00045 KURLDragPushButton( QWidget *parent, const char *name=0 )
00046 : KPushButton( parent, name ) {
00047 setDragEnabled( true );
00048 }
00049 ~KURLDragPushButton() {}
00050
00051 void setURL( const KURL& url ) {
00052 m_urls.clear();
00053 m_urls.append( url );
00054 }
00055
00056
00057
00058
00059
00060
00061
00062
00063 protected:
00064 virtual QDragObject *dragObject() {
00065 if ( m_urls.isEmpty() )
00066 return 0L;
00067
00068 QDragObject *drag = new KURLDrag( m_urls, this, "url drag" );
00069 return drag;
00070 }
00071
00072 private:
00073 KURL::List m_urls;
00074
00075 };
00076
00077
00078
00079
00080
00081
00082 class KURLRequester::KURLRequesterPrivate
00083 {
00084 public:
00085 KURLRequesterPrivate() {
00086 edit = 0L;
00087 combo = 0L;
00088 fileDialogMode = KFile::File | KFile::ExistingOnly | KFile::LocalOnly;
00089 }
00090
00091 void setText( const QString& text ) {
00092 if ( combo )
00093 {
00094 if (combo->editable())
00095 {
00096 combo->setEditText( text );
00097 }
00098 else
00099 {
00100 combo->insertItem( text );
00101 combo->setCurrentItem( combo->count()-1 );
00102 }
00103 }
00104 else
00105 {
00106 edit->setText( text );
00107 }
00108 }
00109
00110 void connectSignals( QObject *receiver ) {
00111 QObject *sender;
00112 if ( combo )
00113 sender = combo;
00114 else
00115 sender = edit;
00116
00117 connect( sender, SIGNAL( textChanged( const QString& )),
00118 receiver, SIGNAL( textChanged( const QString& )));
00119 connect( sender, SIGNAL( returnPressed() ),
00120 receiver, SIGNAL( returnPressed() ));
00121 connect( sender, SIGNAL( returnPressed( const QString& ) ),
00122 receiver, SIGNAL( returnPressed( const QString& ) ));
00123 }
00124
00125 void setCompletionObject( KCompletion *comp ) {
00126 if ( combo )
00127 combo->setCompletionObject( comp );
00128 else
00129 edit->setCompletionObject( comp );
00130 }
00131
00135 QString url() {
00136 QString txt = combo ? combo->currentText() : edit->text();
00137 KURLCompletion *comp;
00138 if ( combo )
00139 comp = dynamic_cast<KURLCompletion*>(combo->completionObject());
00140 else
00141 comp = dynamic_cast<KURLCompletion*>(edit->completionObject());
00142
00143 if ( comp )
00144 return comp->replacedPath( txt );
00145 else
00146 return txt;
00147 }
00148
00149 KLineEdit *edit;
00150 KComboBox *combo;
00151 int fileDialogMode;
00152 QString fileDialogFilter;
00153 };
00154
00155
00156
00157 KURLRequester::KURLRequester( QWidget *editWidget, QWidget *parent,
00158 const char *name )
00159 : QHBox( parent, name )
00160 {
00161 d = new KURLRequesterPrivate;
00162
00163
00164 editWidget->reparent( this, 0, QPoint(0,0) );
00165 d->edit = dynamic_cast<KLineEdit*>( editWidget );
00166 d->combo = dynamic_cast<KComboBox*>( editWidget );
00167
00168 init();
00169 }
00170
00171
00172 KURLRequester::KURLRequester( QWidget *parent, const char *name )
00173 : QHBox( parent, name )
00174 {
00175 d = new KURLRequesterPrivate;
00176 init();
00177 }
00178
00179
00180 KURLRequester::KURLRequester( const QString& url, QWidget *parent,
00181 const char *name )
00182 : QHBox( parent, name )
00183 {
00184 d = new KURLRequesterPrivate;
00185 init();
00186 setURL( url );
00187 }
00188
00189
00190 KURLRequester::~KURLRequester()
00191 {
00192 delete myCompletion;
00193 delete myFileDialog;
00194 delete d;
00195 }
00196
00197
00198 void KURLRequester::init()
00199 {
00200 myFileDialog = 0L;
00201 myShowLocalProt = false;
00202
00203 if ( !d->combo && !d->edit )
00204 d->edit = new KLineEdit( this, "line edit" );
00205
00206 myButton = new KURLDragPushButton( this, "kfile button");
00207 QIconSet iconSet = SmallIconSet(QString::fromLatin1("fileopen"));
00208 QPixmap pixMap = iconSet.pixmap( QIconSet::Small, QIconSet::Normal );
00209 myButton->setIconSet( iconSet );
00210 myButton->setFixedSize( pixMap.width()+8, pixMap.height()+8 );
00211 QToolTip::add(myButton, i18n("Open file dialog"));
00212
00213 connect( myButton, SIGNAL( pressed() ), SLOT( slotUpdateURL() ));
00214
00215 setSpacing( KDialog::spacingHint() );
00216
00217 QWidget *widget = d->combo ? (QWidget*) d->combo : (QWidget*) d->edit;
00218 setFocusProxy( widget );
00219
00220 d->connectSignals( this );
00221 connect( myButton, SIGNAL( clicked() ), this, SLOT( slotOpenDialog() ));
00222
00223 myCompletion = new KURLCompletion();
00224 d->setCompletionObject( myCompletion );
00225
00226 KAccel *accel = new KAccel( this );
00227 accel->insert( KStdAccel::Open, this, SLOT( slotOpenDialog() ));
00228 accel->readSettings();
00229 }
00230
00231
00232 void KURLRequester::setURL( const QString& url )
00233 {
00234 bool hasLocalPrefix = (url.startsWith("file:"));
00235
00236 if ( !myShowLocalProt && hasLocalPrefix )
00237 d->setText( url.mid( 5, url.length()-5 ));
00238 else
00239 d->setText( url );
00240 }
00241
00242 void KURLRequester::setCaption( const QString& caption )
00243 {
00244 QWidget::setCaption( caption );
00245 if (myFileDialog)
00246 myFileDialog->setCaption( caption );
00247 }
00248
00249 QString KURLRequester::url() const
00250 {
00251 return d->url();
00252 }
00253
00254
00255 void KURLRequester::slotOpenDialog()
00256 {
00257 emit openFileDialog( this );
00258
00259 KFileDialog *dlg = fileDialog();
00260 if ( !d->url().isEmpty() ) {
00261 KURL u( url() );
00262
00263 if ( KProtocolInfo::supportsListing( u ) )
00264 dlg->setSelection( u.url() );
00265 }
00266
00267 if ( dlg->exec() == QDialog::Accepted )
00268 {
00269 if ( dlg->selectedURL().isLocalFile() )
00270 {
00271 setURL( dlg->selectedURL().path() );
00272 }
00273 else
00274 {
00275 setURL( dlg->selectedURL().prettyURL() );
00276 }
00277 emit urlSelected( d->url() );
00278 }
00279 }
00280
00281 void KURLRequester::setMode(unsigned int mode)
00282 {
00283 Q_ASSERT( (mode & KFile::Files) == 0 );
00284 d->fileDialogMode = mode;
00285 if ( (mode & KFile::Directory) && !(mode & KFile::File) )
00286 myCompletion->setMode( KURLCompletion::DirCompletion );
00287
00288 if (myFileDialog)
00289 myFileDialog->setMode( d->fileDialogMode );
00290 }
00291
00292 void KURLRequester::setFilter(const QString &filter)
00293 {
00294 d->fileDialogFilter = filter;
00295 if (myFileDialog)
00296 myFileDialog->setFilter( d->fileDialogFilter );
00297 }
00298
00299 KFileDialog * KURLRequester::fileDialog() const
00300 {
00301 if ( !myFileDialog ) {
00302 QWidget *p = parentWidget();
00303 myFileDialog = new KFileDialog( QString::null, QString::null, p,
00304 "file dialog", true );
00305
00306 myFileDialog->setMode( d->fileDialogMode );
00307 myFileDialog->setFilter( d->fileDialogFilter );
00308 myFileDialog->setCaption( caption() );
00309 }
00310
00311 return myFileDialog;
00312 }
00313
00314
00315 void KURLRequester::setShowLocalProtocol( bool b )
00316 {
00317 if ( myShowLocalProt == b )
00318 return;
00319
00320 myShowLocalProt = b;
00321 setURL( url() );
00322 }
00323
00324 void KURLRequester::clear()
00325 {
00326 d->setText( QString::null );
00327 }
00328
00329 KLineEdit * KURLRequester::lineEdit() const
00330 {
00331 return d->edit;
00332 }
00333
00334 KComboBox * KURLRequester::comboBox() const
00335 {
00336 return d->combo;
00337 }
00338
00339 void KURLRequester::slotUpdateURL()
00340 {
00341
00342 KURL u( QDir::currentDirPath() + '/', url() );
00343 (static_cast<KURLDragPushButton *>( myButton))->setURL( u );
00344 }
00345
00346 KPushButton * KURLRequester::button() const
00347 {
00348 return myButton;
00349 }
00350
00351 KEditListBox::CustomEditor KURLRequester::customEditor()
00352 {
00353 setSizePolicy(QSizePolicy( QSizePolicy::Preferred,
00354 QSizePolicy::Fixed));
00355
00356 KLineEdit *edit = d->edit;
00357 if ( !edit && d->combo )
00358 edit = dynamic_cast<KLineEdit*>( d->combo->lineEdit() );
00359
00360 #ifndef NDEBUG
00361 if ( !edit )
00362 kdWarning() << "KURLRequester's lineedit is not a KLineEdit!??\n";
00363 #endif
00364
00365 KEditListBox::CustomEditor editor( this, edit );
00366 return editor;
00367 }
00368
00369 void KURLRequester::virtual_hook( int, void* )
00370 { }
00371
00372 KURLComboRequester::KURLComboRequester( QWidget *parent,
00373 const char *name )
00374 : KURLRequester( new KComboBox(false), parent, name)
00375 {
00376 }
00377
00378 #include "kurlrequester.moc"