1*10ce8018SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*10ce8018SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*10ce8018SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*10ce8018SAndrew Rist * distributed with this work for additional information 6*10ce8018SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*10ce8018SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*10ce8018SAndrew Rist * "License"); you may not use this file except in compliance 9*10ce8018SAndrew Rist * with the License. You may obtain a copy of the License at 10*10ce8018SAndrew Rist * 11*10ce8018SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*10ce8018SAndrew Rist * 13*10ce8018SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*10ce8018SAndrew Rist * software distributed under the License is distributed on an 15*10ce8018SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*10ce8018SAndrew Rist * KIND, either express or implied. See the License for the 17*10ce8018SAndrew Rist * specific language governing permissions and limitations 18*10ce8018SAndrew Rist * under the License. 19*10ce8018SAndrew Rist * 20*10ce8018SAndrew Rist *************************************************************/ 21*10ce8018SAndrew Rist 22*10ce8018SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #ifndef _SALGTKFPICKER_HXX_ 25cdf0e10cSrcweir #define _SALGTKFPICKER_HXX_ 26cdf0e10cSrcweir 27cdf0e10cSrcweir //_____________________________________________________________________________ 28cdf0e10cSrcweir // includes of other projects 29cdf0e10cSrcweir //_____________________________________________________________________________ 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <osl/mutex.hxx> 32cdf0e10cSrcweir #include <cppuhelper/compbase1.hxx> 33cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePicker.hpp> 34cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePicker2.hpp> 35cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFolderPicker.hpp> 36cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp> 37cdf0e10cSrcweir #include <com/sun/star/util/XCancellable.hpp> 38cdf0e10cSrcweir 39cdf0e10cSrcweir #include <com/sun/star/awt/XTopWindowListener.hpp> 40cdf0e10cSrcweir #include <com/sun/star/awt/XExtendedToolkit.hpp> 41cdf0e10cSrcweir 42cdf0e10cSrcweir #include <gtk/gtk.h> 43cdf0e10cSrcweir #include <gdk/gdkkeysyms.h> 44cdf0e10cSrcweir 45cdf0e10cSrcweir //---------------------------------------------------------- 46cdf0e10cSrcweir // class declaration 47cdf0e10cSrcweir //---------------------------------------------------------- 48cdf0e10cSrcweir 49cdf0e10cSrcweir class SalGtkPicker 50cdf0e10cSrcweir { 51cdf0e10cSrcweir public: 52cdf0e10cSrcweir SalGtkPicker(const ::com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory>& xServiceMgr); 53cdf0e10cSrcweir virtual ~SalGtkPicker(); 54cdf0e10cSrcweir protected: 55cdf0e10cSrcweir osl::Mutex m_rbHelperMtx; 56cdf0e10cSrcweir GtkWidget *m_pDialog; 57cdf0e10cSrcweir protected: 58cdf0e10cSrcweir virtual void SAL_CALL implsetTitle( const ::rtl::OUString& aTitle ) 59cdf0e10cSrcweir throw( ::com::sun::star::uno::RuntimeException ); 60cdf0e10cSrcweir 61cdf0e10cSrcweir virtual void SAL_CALL implsetDisplayDirectory( const rtl::OUString& rDirectory ) 62cdf0e10cSrcweir throw( com::sun::star::lang::IllegalArgumentException, com::sun::star::uno::RuntimeException ); 63cdf0e10cSrcweir 64cdf0e10cSrcweir virtual rtl::OUString SAL_CALL implgetDisplayDirectory( ) 65cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException ); 66cdf0e10cSrcweir static rtl::OUString uritounicode(const gchar *pIn); 67cdf0e10cSrcweir static rtl::OString unicodetouri(const rtl::OUString &rURL); 68cdf0e10cSrcweir }; 69cdf0e10cSrcweir 70cdf0e10cSrcweir class GdkThreadLock 71cdf0e10cSrcweir { 72cdf0e10cSrcweir public: GdkThreadLock()73cdf0e10cSrcweir GdkThreadLock() { gdk_threads_enter(); } ~GdkThreadLock()74cdf0e10cSrcweir ~GdkThreadLock() { gdk_threads_leave(); } 75cdf0e10cSrcweir }; 76cdf0e10cSrcweir 77cdf0e10cSrcweir //Run the Gtk Dialog. Watch for any "new windows" created while we're 78cdf0e10cSrcweir //executing and consider that a CANCEL event to avoid e.g. "file cannot be opened" 79cdf0e10cSrcweir //modal dialogs and this one getting locked if some other API call causes this 80cdf0e10cSrcweir //to happen while we're opened waiting for user input, e.g. 81cdf0e10cSrcweir //https://bugzilla.redhat.com/show_bug.cgi?id=441108 82cdf0e10cSrcweir class RunDialog : 83cdf0e10cSrcweir public cppu::WeakComponentImplHelper1< ::com::sun::star::awt::XTopWindowListener > 84cdf0e10cSrcweir { 85cdf0e10cSrcweir private: 86cdf0e10cSrcweir osl::Mutex maLock; 87cdf0e10cSrcweir GtkWidget *mpDialog; 88cdf0e10cSrcweir GdkWindow *mpCreatedParent; 89cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::awt::XExtendedToolkit> mxToolkit; 90cdf0e10cSrcweir public: 91cdf0e10cSrcweir 92cdf0e10cSrcweir // XTopWindowListener 93cdf0e10cSrcweir using cppu::WeakComponentImplHelperBase::disposing; disposing(const::com::sun::star::lang::EventObject &)94cdf0e10cSrcweir virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& ) 95cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) {} 96cdf0e10cSrcweir virtual void SAL_CALL windowOpened( const ::com::sun::star::lang::EventObject& e ) 97cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); windowClosing(const::com::sun::star::lang::EventObject &)98cdf0e10cSrcweir virtual void SAL_CALL windowClosing( const ::com::sun::star::lang::EventObject& ) 99cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) {} windowClosed(const::com::sun::star::lang::EventObject &)100cdf0e10cSrcweir virtual void SAL_CALL windowClosed( const ::com::sun::star::lang::EventObject& ) 101cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) {} windowMinimized(const::com::sun::star::lang::EventObject &)102cdf0e10cSrcweir virtual void SAL_CALL windowMinimized( const ::com::sun::star::lang::EventObject& ) 103cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) {} windowNormalized(const::com::sun::star::lang::EventObject &)104cdf0e10cSrcweir virtual void SAL_CALL windowNormalized( const ::com::sun::star::lang::EventObject& ) 105cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) {} windowActivated(const::com::sun::star::lang::EventObject &)106cdf0e10cSrcweir virtual void SAL_CALL windowActivated( const ::com::sun::star::lang::EventObject& ) 107cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) {} windowDeactivated(const::com::sun::star::lang::EventObject &)108cdf0e10cSrcweir virtual void SAL_CALL windowDeactivated( const ::com::sun::star::lang::EventObject& ) 109cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) {} 110cdf0e10cSrcweir public: 111cdf0e10cSrcweir RunDialog(GtkWidget *pDialog, ::com::sun::star::uno::Reference< ::com::sun::star::awt::XExtendedToolkit > &rToolkit); 112cdf0e10cSrcweir gint run(); 113cdf0e10cSrcweir void cancel(); 114cdf0e10cSrcweir ~RunDialog(); 115cdf0e10cSrcweir }; 116cdf0e10cSrcweir 117cdf0e10cSrcweir #endif 118