[Libreoffice-commits] core.git: vcl/CustomTarget_kde4_moc.mk vcl/unx

Luboš Luňák l.lunak at suse.cz
Wed Jun 12 08:19:53 PDT 2013


 vcl/CustomTarget_kde4_moc.mk    |    7 ++--
 vcl/unx/kde4/KDE4FilePicker.cxx |   59 +++++++++++++++++++++++++++++++++++++---
 vcl/unx/kde4/KDE4FilePicker.hxx |   10 ++++++
 3 files changed, 68 insertions(+), 8 deletions(-)

New commits:
commit a274cbff7c138e110eba65f117df8d9cae3c4427
Author: Luboš Luňák <l.lunak at suse.cz>
Date:   Wed Jun 12 17:10:48 2013 +0200

    allow at least some KDE protocols in KFileDialog
    
    Although LO doesn't support all KIO protocols, it supports at least
    a subset (as can be see also in 673be8e76856c6bc39f448f3374db4ae84258952),
    so allow at least that subset.
    
    Change-Id: I2334764317ffc1e20d234e863b60bcc06d17fde0

diff --git a/vcl/CustomTarget_kde4_moc.mk b/vcl/CustomTarget_kde4_moc.mk
index 679cfbf..0846b0b 100644
--- a/vcl/CustomTarget_kde4_moc.mk
+++ b/vcl/CustomTarget_kde4_moc.mk
@@ -10,10 +10,11 @@
 $(eval $(call gb_CustomTarget_CustomTarget,vcl/unx/kde4))
 
 $(call gb_CustomTarget_get_target,vcl/unx/kde4) : \
-	$(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/KDEXLib.moc
+	$(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/KDEXLib.moc \
+	$(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/KDE4FilePicker.moc
 
-$(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/KDEXLib.moc : \
-		$(SRCDIR)/vcl/unx/kde4/KDEXLib.hxx \
+$(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/%.moc : \
+		$(SRCDIR)/vcl/unx/kde4/%.hxx \
 		| $(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/.dir
 	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),MOC,1)
 	$(MOC4) $< -o $@
diff --git a/vcl/unx/kde4/KDE4FilePicker.cxx b/vcl/unx/kde4/KDE4FilePicker.cxx
index 01493d0..e76c752 100644
--- a/vcl/unx/kde4/KDE4FilePicker.cxx
+++ b/vcl/unx/kde4/KDE4FilePicker.cxx
@@ -45,6 +45,10 @@
 #include <kwindowsystem.h>
 #include <kapplication.h>
 #include <kfilefiltercombo.h>
+#include <kfilewidget.h>
+#include <kdiroperator.h>
+#include <kservicetypetrader.h>
+#include <kmessagebox.h>
 
 #include <qclipboard.h>
 #include <QWidget>
@@ -62,6 +66,17 @@ using namespace ::com::sun::star::lang;
 using namespace ::com::sun::star::beans;
 using namespace ::com::sun::star::uno;
 
+// The dialog should check whether LO also supports the protocol
+// provided by KIO, and KFileWidget::dirOperator() is only 4.3+ .
+// Moreover it's only in this somewhat internal KFileWidget class,
+// which may not necessarily be what KFileDialog::fileWidget() returns,
+// but that's hopefully not a problem in practice.
+#if KDE_VERSION_MAJOR == 4 && KDE_VERSION_MINOR >= 2
+#define ALLOW_REMOTE_URLS 1
+#else
+#define ALLOW_REMOTE_URLS 0
+#endif
+
 //////////////////////////////////////////////////////////////////////////
 // helper functions
 //////////////////////////////////////////////////////////////////////////
@@ -102,13 +117,24 @@ QString toQString(const OUString& s)
 KDE4FilePicker::KDE4FilePicker( const uno::Reference<uno::XComponentContext>& )
     : KDE4FilePicker_Base(_helperMutex)
     , _resMgr( ResMgr::CreateResMgr("fps_office") )
+    , allowRemoteUrls( false )
 {
     _extraControls = new QWidget();
     _layout = new QGridLayout(_extraControls);
 
     _dialog = new KFileDialog(KUrl("~"), QString(""), 0, _extraControls);
-    _dialog->setMode(KFile::File | KFile::LocalOnly);
+#if ALLOW_REMOTE_URLS
+    if( KFileWidget* fileWidget = dynamic_cast< KFileWidget* >( _dialog->fileWidget()))
+    {
+        allowRemoteUrls = true;
+        // Use finishedLoading signal rather than e.g. urlEntered, because if there's a problem
+        // such as the URL being mistyped, there's no way to prevent two message boxes about it,
+        // one from us and one from KDE code.
+        connect( fileWidget->dirOperator(), SIGNAL( finishedLoading()), SLOT( checkProtocol()));
+    }
+#endif
 
+    setMultiSelectionMode( false );
     //default mode
     _dialog->setOperationMode(KFileDialog::Opening);
 }
@@ -188,10 +214,20 @@ sal_Int16 SAL_CALL KDE4FilePicker::execute()
 void SAL_CALL KDE4FilePicker::setMultiSelectionMode( sal_Bool multiSelect )
     throw( uno::RuntimeException )
 {
-    if (multiSelect)
-        _dialog->setMode(KFile::Files | KFile::LocalOnly);
+    if( allowRemoteUrls )
+    {
+        if (multiSelect)
+            _dialog->setMode(KFile::Files);
+        else
+            _dialog->setMode(KFile::File);
+    }
     else
-        _dialog->setMode(KFile::File | KFile::LocalOnly);
+    {
+        if (multiSelect)
+            _dialog->setMode(KFile::Files | KFile::LocalOnly);
+        else
+            _dialog->setMode(KFile::File | KFile::LocalOnly);
+    }
 }
 
 void SAL_CALL KDE4FilePicker::setDefaultName( const OUString &name )
@@ -688,4 +724,19 @@ uno::Sequence< OUString > SAL_CALL KDE4FilePicker::getSupportedServiceNames()
     return FilePicker_getSupportedServiceNames();
 }
 
+void KDE4FilePicker::checkProtocol()
+{
+    // There's no libreoffice.desktop :(, so find a matching one.
+    KService::List services = KServiceTypeTrader::self()->query( "Application", "Exec =~ 'libreoffice %U'" );
+    QStringList protocols;
+    if( !services.isEmpty())
+        protocols = services[ 0 ]->property( "X-KDE-Protocols" ).toStringList();
+    if( protocols.isEmpty()) // incorrect (developer?) installation ?
+        protocols << "file" << "http";
+    if( !protocols.contains( _dialog->baseUrl().protocol()) && !protocols.contains( "KIO" ))
+        KMessageBox::error( _dialog, KIO::buildErrorString( KIO::ERR_UNSUPPORTED_PROTOCOL, _dialog->baseUrl().protocol()));
+}
+
+#include "KDE4FilePicker.moc"
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDE4FilePicker.hxx b/vcl/unx/kde4/KDE4FilePicker.hxx
index 01eb808..5ac37d0 100644
--- a/vcl/unx/kde4/KDE4FilePicker.hxx
+++ b/vcl/unx/kde4/KDE4FilePicker.hxx
@@ -33,6 +33,7 @@
 
 #include <rtl/ustrbuf.hxx>
 
+#include <QObject>
 #include <QString>
 #include <QHash>
 
@@ -52,8 +53,10 @@ typedef ::cppu::WeakComponentImplHelper5
 > KDE4FilePicker_Base;
 
 class KDE4FilePicker
-    : public KDE4FilePicker_Base
+    : public QObject
+    , public KDE4FilePicker_Base
 {
+    Q_OBJECT
 protected:
 
     ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener > m_xListener;
@@ -77,6 +80,8 @@ protected:
     //layout for extra custom controls
     QLayout* _layout;
 
+    bool allowRemoteUrls;
+
 public:
     KDE4FilePicker( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& );
     virtual ~KDE4FilePicker();
@@ -160,6 +165,9 @@ private:
     //add a custom control widget to the file dialog
     void addCustomControl(sal_Int16 controlId);
 
+private Q_SLOTS:
+    void checkProtocol();
+
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list