[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/4.0/kdelibs/kfile
From:       Jaroslaw Staniek <js () iidea ! pl>
Date:       2008-04-11 23:47:59
Message-ID: 1207957679.443141.24859.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 795939 by staniek:

backports for kfile

r794821, r795837:
A set of fixes for improving experience of file dialogs, mostly on Windows
+ some fixes for handling urls

KFileWidget:
- check whether a string contains protocol part more carefully because c:/ is
an absolute path, not a protocol
   (static containsProtocolSection()), so we assume the protocol has at least
two characters before ":/"
- enclose locationEdit->currentText() with QDir::fromNativeSeparators() and
add .trimmed() to cover more cases in conditions
- slotOk(): add code for handling accepting using OK button when directory
path is entered and directories are not acceptable result of the file widget:
cd to that directory then; in particuar it is now possible to enter C:\ or /
and press OK to change to the root dir on windows (or linux, respectively)


r795936:
Fix changing the current dir using the 'recent url' combo box.
Upon accepting new url in the 'directory' url combo box, append '/' if needed: the \
combo does not add it, but tokenize() expects it because uses KUrl::setFileName(), \
which would silently remove the last segment of the path.

Without the fix, if you select /home/js/foo/bar from the url combo box, and click on \
file.txt, the resulting url would be /home/js/foo/file.txt, not the expected \
/home/js/foo/bar/file.txt.

Another, and hopefully the last place where we have to care about trailing slashes \
for dirs, is kdiroperator.

(reviewed)



 M  +2 -1      kdiroperator.cpp  
 M  +65 -19    kfilewidget.cpp  


--- branches/KDE/4.0/kdelibs/kfile/kdiroperator.cpp #795938:795939
@@ -874,10 +874,11 @@
     else
         newurl = _newurl;
 
+    newurl.adjustPath( KUrl::AddTrailingSlash );
 #ifdef Q_WS_WIN
     QString pathstr = newurl.toLocalFile();
 #else
-    QString pathstr = newurl.path(KUrl::AddTrailingSlash);
+    QString pathstr = newurl.path();
 #endif
     newurl.setPath(pathstr);
 
--- branches/KDE/4.0/kdelibs/kfile/kfilewidget.cpp #795938:795939
@@ -134,6 +134,8 @@
 
     void addToRecentDocuments();
 
+    QString locationEditCurrentText() const;
+
     // the last selected url
     KUrl url;
 
@@ -207,6 +209,30 @@
                                                   "This feature can be controlled by \
                clicking with the right mouse button "
                                                   "and selecting a preferred mode \
from the <b>Text Completion</b> menu.")  "</qt>";  
+// returns true if the string contains "<a>:/" sequence, where <a> is at least 2 \
alpha chars +static bool containsProtocolSection( const QString& string )
+{
+    int len = string.length();
+    static const char prot[] = ":/";
+    for (int i=0; i < len;) {
+        i = string.indexOf( QLatin1String(prot), i );
+        if (i == -1)
+            return false;
+        int j=i-1;
+        for (; j >= 0; j--) {
+            const QChar& ch( string[j] );
+            if (ch.toAscii() == 0 || !ch.isLetter())
+                break;
+            if (ch.isSpace() && (i-j-1) >= 2)
+                return true;
+        }
+        if (j < 0 && i >= 2)
+            return true; // at least two letters before ":/"
+        i += 3; // skip : and / and one char
+    }
+    return false;
+}
+
 KFileWidget::KFileWidget( const KUrl& startDir, QWidget *parent )
     : QWidget(parent), KAbstractFileWidget(), d(new KFileWidgetPrivate(this))
 {
@@ -576,8 +602,10 @@
     // can only be used if the user didn't type any filenames/urls himself
     const KFileItemList items = d->ops->selectedItems();
 
+    const QString locationEditCurrentText( d->locationEditCurrentText() );
+
     if ( (mode() & KFile::Directory) != KFile::Directory ) {
-        if ( d->locationEdit->currentText().trimmed().isEmpty() ) {
+        if ( locationEditCurrentText.isEmpty() ) {
             if (items.isEmpty() )
             {
                 QString msg;
@@ -657,10 +685,9 @@
     KUrl selectedUrl;
 
     if ( (mode() & KFile::Files) == KFile::Files ) {// multiselection mode
-        QString locationText = d->locationEdit->currentText();
-        if ( locationText.contains( '/' )) {
+        if ( locationEditCurrentText.contains( '/' ) ) {
             // relative path? -> prepend the current directory
-            KUrl u( d->ops->url(), KShell::tildeExpand(locationText));
+            KUrl u( d->ops->url(), KShell::tildeExpand( locationEditCurrentText ));
             if ( u.isValid() )
                 selectedUrl = u;
             else
@@ -671,7 +698,7 @@
     }
 
     else {
-        selectedUrl = d->getCompleteUrl(d->locationEdit->currentText());
+        selectedUrl = d->getCompleteUrl( locationEditCurrentText );
 
         // appendExtension() may change selectedUrl
         d->appendExtension (selectedUrl);
@@ -699,7 +726,7 @@
         kDebug(kfile_area) << "Directory";
         bool done = true;
         if ( d->url.isLocalFile() ) {
-            if ( d->locationEdit->currentText().trimmed().isEmpty() ) {
+            if ( locationEditCurrentText.isEmpty() ) {
                 QFileInfo info( d->url.toLocalFile() );
                 if ( info.isDir() ) {
                     d->filenames.clear();
@@ -727,7 +754,7 @@
                 {
                     if ( d->ops->dirOnlyMode() )
                     {
-                        KUrl fullURL(d->url, d->locationEdit->currentText());
+                        KUrl fullURL(d->url, locationEditCurrentText);
                         if ( QFile::exists( fullURL.toLocalFile() ) )
                         {
                             d->url = fullURL;
@@ -741,7 +768,7 @@
                     }
                 }
 
-                d->filenames = d->locationEdit->currentText();
+                d->filenames = locationEditCurrentText;
                 emit accepted(); // what can we do?
             }
 
@@ -761,6 +788,17 @@
         if ( done )
             return;
     }
+    else { // we don't want dir
+        KUrl::List urls = d->tokenize( locationEditCurrentText );
+        if ( urls.count()==1 && urls.first().isLocalFile() ) {
+            QFileInfo info( urls.first().toLocalFile() );
+            if ( info.isDir() && this->selectedUrl().isValid() && \
!this->selectedUrl().equals( urls.first(), KUrl::CompareWithoutTrailingSlash ) ) { +  \
setSelection( info.absolutePath() ); +                slotOk();
+                return;
+            }
+        }
+    }
 
     if (!KAuthorized::authorizeUrlAction("open", KUrl(), d->url))
     {
@@ -771,10 +809,10 @@
 
     KIO::StatJob *job = 0L;
     d->statJobs.clear();
-    d->filenames = KShell::tildeExpand(d->locationEdit->currentText());
+    d->filenames = KShell::tildeExpand( locationEditCurrentText );
 
     if ( (mode() & KFile::Files) == KFile::Files &&
-         !d->locationEdit->currentText().contains( '/' )) {
+         !locationEditCurrentText.contains( '/' ) ) {
         kDebug(kfile_area) << "Files\n";
         KUrl::List list = d->parseSelectedUrls();
         for ( KUrl::List::ConstIterator it = list.begin();
@@ -1133,7 +1171,7 @@
 // Protected
 void KFileWidgetPrivate::_k_urlEntered(const KUrl& url)
 {
-    QString filename = locationEdit->currentText();
+    QString filename = locationEditCurrentText();
     selection.clear();
 
     KUrlComboBox* pathCombo = urlNavigator->editor();
@@ -1168,12 +1206,16 @@
 
 void KFileWidgetPrivate::_k_enterUrl( const KUrl& url )
 {
-    q->setUrl( url );
+    KUrl fixedUrl( url );
+    // append '/' if needed: url combo does not add it
+    // tokenize() expects it because uses KUrl::setFileName()
+    fixedUrl.adjustPath( KUrl::AddTrailingSlash );
+    q->setUrl( fixedUrl );
 }
 
 void KFileWidgetPrivate::_k_enterUrl( const QString& url )
 {
-    q->setUrl( KUrl( KUrlCompletion::replacedPath( url, true, true )) );
+    _k_enterUrl( KUrl( KUrlCompletion::replacedPath( url, true, true )) );
 }
 
 
@@ -1293,9 +1335,8 @@
 
     urlList.clear();
     if ( filenames.contains( '/' )) { // assume _one_ absolute filename
-        static const QString &prot = KGlobal::staticQString(":/");
         KUrl u;
-        if ( filenames.indexOf( prot ) != -1 )
+        if ( containsProtocolSection( filenames ) )
             u = filenames;
         else
             u.setPath( filenames );
@@ -1790,7 +1831,7 @@
     if (!autoSelectExtCheckBox->isChecked() || extension.isEmpty())
         return;
 
-    QString urlStr = locationEdit->currentText();
+    QString urlStr = locationEditCurrentText();
     if (urlStr.isEmpty())
         return;
 
@@ -1838,7 +1879,7 @@
 
         // add extension
         const QString newText = urlStr.left (fileNameOffset) + fileName + extension;
-        if ( newText != locationEdit->currentText() )
+        if ( newText != locationEditCurrentText() )
         {
             locationEdit->setItemText(locationEdit->currentIndex(),urlStr.left \
(fileNameOffset) + fileName + extension);  locationEdit->lineEdit()->setModified \
(true); @@ -1851,7 +1892,7 @@
 void KFileWidgetPrivate::updateFilter()
 {
     if ((operationMode == KFileWidget::Saving) && (ops->mode() & KFile::File) ) {
-        const QString urlStr = locationEdit->currentText();
+        const QString urlStr = locationEditCurrentText();
         if (urlStr.isEmpty())
             return;
 
@@ -2088,7 +2129,7 @@
 void KFileWidgetPrivate::setNonExtSelection()
 {
     // Enhanced rename: Don't highlight the file extension.
-    QString filename = locationEdit->currentText().trimmed();
+    QString filename = locationEditCurrentText();
     QString extension = KMimeType::extractKnownExtension( filename );
 
     if ( !extension.isEmpty() )
@@ -2144,4 +2185,9 @@
     Q_UNUSED(data);
 }
 
+QString KFileWidgetPrivate::locationEditCurrentText() const
+{
+    return QDir::fromNativeSeparators(locationEdit->currentText().trimmed());
+}
+
 #include "kfilewidget.moc"


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic