[ooo-build-commit] .: fpicker/source

Caolán McNamara caolan at kemper.freedesktop.org
Thu Oct 7 05:46:40 PDT 2010


 fpicker/source/office/iodlg.src               |    5 +
 fpicker/source/unx/gnome/SalGtkFilePicker.cxx |  104 ++++++++++++++++++--------
 fpicker/source/unx/gnome/SalGtkFilePicker.hxx |    6 +
 fpicker/source/unx/gnome/resourceprovider.cxx |    3 
 fpicker/source/unx/gnome/resourceprovider.hxx |    1 
 5 files changed, 85 insertions(+), 34 deletions(-)

New commits:
commit 2bd572a540c3a8d1dec99422c62fb83604277ad8
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Oct 7 12:59:11 2010 +0100

    #i113141# show all appropiate formats by default on save as

diff --git a/fpicker/source/office/iodlg.src b/fpicker/source/office/iodlg.src
index 4ddb6bb..413f91c 100644
--- a/fpicker/source/office/iodlg.src
+++ b/fpicker/source/office/iodlg.src
@@ -314,5 +314,10 @@ String STR_SVT_NOREMOVABLEDEVICE
     Text [ en-US ] = "No removable storage device detected.\nMake sure it is plugged in properly and try again." ;
 };
 
+String STR_SVT_ALLFORMATS
+{
+    Text [ en-US ] = "All Formats" ;
+};
+
 //******************************************************************** EOF
 
diff --git a/fpicker/source/unx/gnome/SalGtkFilePicker.cxx b/fpicker/source/unx/gnome/SalGtkFilePicker.cxx
index 31053e3..bf8e775 100644
--- a/fpicker/source/unx/gnome/SalGtkFilePicker.cxx
+++ b/fpicker/source/unx/gnome/SalGtkFilePicker.cxx
@@ -52,6 +52,7 @@
 
 #include <iostream>
 #include <algorithm>
+#include <set>
 #include "resourceprovider.hxx"
 #include <tools/rc.hxx>
 
@@ -179,6 +180,7 @@ SalGtkFilePicker::SalGtkFilePicker( const uno::Reference<lang::XMultiServiceFact
     mbPreviewState( sal_False ),
     mHID_Preview( 0 ),
     m_pPreview( NULL ),
+    m_pPseudoFilter( NULL ),
     m_PreviewImageWidth( 256 ),
     m_PreviewImageHeight( 256 )
 {
@@ -427,7 +429,7 @@ void SAL_CALL SalGtkFilePicker::directoryChanged( FilePickerEvent aEvent )
 }
 
 void SAL_CALL SalGtkFilePicker::controlStateChanged( FilePickerEvent aEvent ) 
-{	
+{
     OSL_TRACE("control state changed");
     if (m_xListener.is()) m_xListener->controlStateChanged( aEvent );
 }
@@ -472,7 +474,7 @@ rtl::OUString SAL_CALL SalGtkFilePicker::helpRequested( FilePickerEvent aEvent )
             {
                 OSL_ENSURE( false, "RuntimeException during event dispatching" );
             }
-        }		
+        }
     }
 
     return aHelpText;
@@ -690,7 +692,7 @@ void SalGtkFilePicker::ensureFilterList( const ::rtl::OUString& _rInitialCurrent
         m_pFilterList = new FilterList;
 
         // set the first filter to the current filter
-        if( ( !m_aCurrentFilter ) || ( !m_aCurrentFilter.getLength() ) )
+        if ( !m_aCurrentFilter.getLength() )
             m_aCurrentFilter = _rInitialCurrentFilter;
     }
 }
@@ -713,7 +715,6 @@ void SAL_CALL SalGtkFilePicker::appendFilter( const rtl::OUString& aTitle, const
 
     // append the filter
     m_pFilterList->insert( m_pFilterList->end(), FilterEntry( aTitle, aFilter ) );
-    // implAddFilter( aTitle, aFilter );
 }
 
 //-----------------------------------------------------------------------------------------
@@ -780,7 +781,10 @@ void SalGtkFilePicker::UpdateFilterfromUI()
     }
     else if( GtkFileFilter *filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(m_pDialog)))
     {
-        updateCurrentFilterFromName(gtk_file_filter_get_name( filter ));
+        if (m_pPseudoFilter != filter)
+            updateCurrentFilterFromName(gtk_file_filter_get_name( filter ));
+        else
+            updateCurrentFilterFromName(OUStringToOString( m_aInitialFilter, RTL_TEXTENCODING_UTF8 ).getStr());
     }
 }
 
@@ -948,9 +952,14 @@ uno::Sequence<rtl::OUString> SAL_CALL SalGtkFilePicker::getSelectedFiles() throw
                     }
                 }
 
-                const gchar* filtername = 
-                    gtk_file_filter_get_name( gtk_file_chooser_get_filter( GTK_FILE_CHOOSER( m_pDialog ) ) );
-                sFilterName = OUString( filtername, strlen( filtername ), RTL_TEXTENCODING_UTF8 );
+                GtkFileFilter *filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(m_pDialog));
+                if (m_pPseudoFilter != filter)
+                {
+                    const gchar* filtername = gtk_file_filter_get_name( filter );
+                    sFilterName = OUString( filtername, strlen( filtername ), RTL_TEXTENCODING_UTF8 );
+                }
+                else
+                    sFilterName = m_aInitialFilter;
             }
 
             OSL_TRACE( "2: current filter is %s\n", 
@@ -1646,7 +1655,7 @@ sal_Bool SAL_CALL SalGtkFilePicker::getShowState() throw( uno::RuntimeException
 void SAL_CALL SalGtkFilePicker::initialize( const uno::Sequence<uno::Any>& aArguments ) 
     throw( uno::Exception, uno::RuntimeException )
 {
-    // parameter checking	    
+    // parameter checking
     uno::Any aAny;
     if( 0 == aArguments.getLength() )
         throw lang::IllegalArgumentException(
@@ -1915,7 +1924,7 @@ case_insensitive_filter (const GtkFileFilterInfo *filter_info, gpointer data)
 }
 }
 
-int SalGtkFilePicker::implAddFilter( const OUString& rFilter, const OUString& rType )
+GtkFileFilter* SalGtkFilePicker::implAddFilter( const OUString& rFilter, const OUString& rType )
 {
     GdkThreadLock aLock;
 
@@ -1966,7 +1975,6 @@ int SalGtkFilePicker::implAddFilter( const OUString& rFilter, const OUString& rT
 
     gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( m_pDialog ), filter );
 
-    int nAdded = 0;
     if (!bAllGlob)
     {
         GtkTreeIter iter;
@@ -1977,67 +1985,101 @@ int SalGtkFilePicker::implAddFilter( const OUString& rFilter, const OUString& rT
             2, aFilterName.getStr(),
             3, OUStringToOString(rType, RTL_TEXTENCODING_UTF8).getStr(),
             -1);
-        nAdded = 1;
     }
-    return nAdded;
+    return filter;
 }
 
-int SalGtkFilePicker::implAddFilterGroup( const OUString& /*_rFilter*/, const Sequence< StringPair >& _rFilters )
+void SalGtkFilePicker::implAddFilterGroup( const OUString& /*_rFilter*/, const Sequence< StringPair >& _rFilters )
 {
     // Gtk+ has no filter group concept I think so ...
     // implAddFilter( _rFilter, String() );
-    int nAdded = 0;
     const StringPair* pSubFilters	= _rFilters.getConstArray();
     const StringPair* pSubFiltersEnd = pSubFilters + _rFilters.getLength();
     for( ; pSubFilters != pSubFiltersEnd; ++pSubFilters )
-        nAdded += implAddFilter( pSubFilters->First, pSubFilters->Second );
-    return nAdded;
+        implAddFilter( pSubFilters->First, pSubFilters->Second );
 }
 
 void SalGtkFilePicker::SetFilters()
 {
-    OSL_TRACE( "start setting filters\n");
-
     GdkThreadLock aLock;
 
-    int nAdded = 0;
+    if (!m_aInitialFilter.getLength())
+        m_aInitialFilter = m_aCurrentFilter;
+
+    rtl::OUString sPseudoFilter;
+    if( GTK_FILE_CHOOSER_ACTION_SAVE == gtk_file_chooser_get_action( GTK_FILE_CHOOSER( m_pDialog ) ) )
+    {
+        std::set<OUString> aAllFormats;
+        if( m_pFilterList && !m_pFilterList->empty() )
+        {
+            for (   FilterList::iterator aListIter = m_pFilterList->begin();
+                    aListIter != m_pFilterList->end();
+                    ++aListIter
+                )
+            {
+                if( aListIter->hasSubFilters() )
+                {   // it's a filter group
+                    UnoFilterList aSubFilters;
+                    aListIter->getSubFilters( aSubFilters );
+                    const StringPair* pSubFilters   = aSubFilters.getConstArray();
+                    const StringPair* pSubFiltersEnd = pSubFilters + aSubFilters.getLength();
+                    for( ; pSubFilters != pSubFiltersEnd; ++pSubFilters )
+                        aAllFormats.insert(pSubFilters->Second);
+                }
+                else
+                    aAllFormats.insert(aListIter->getFilter());
+            }
+        }
+        if (aAllFormats.size() > 1)
+        {
+            rtl::OUString sAllFilter;
+            std::set<OUString>::const_iterator aEnd = aAllFormats.end();
+            for (std::set<OUString>::const_iterator aIter = aAllFormats.begin(); aIter != aEnd; ++aIter)
+            {
+                if (sAllFilter.getLength())
+                    sAllFilter += OUString(sal_Unicode(';'));
+                sAllFilter += *aIter;
+            }
+            CResourceProvider aResProvider;
+            sPseudoFilter = aResProvider.getResString(FILE_PICKER_ALLFORMATS);
+            m_pPseudoFilter = implAddFilter( sPseudoFilter, sAllFilter );
+        }
+    }
+
     if( m_pFilterList && !m_pFilterList->empty() )
     {
-        for	(	FilterList::iterator aListIter = m_pFilterList->begin();
+        for (   FilterList::iterator aListIter = m_pFilterList->begin();
                 aListIter != m_pFilterList->end();
                 ++aListIter
             )
         {
             if( aListIter->hasSubFilters() )
-            {	// it's a filter group
+            {   // it's a filter group
 
                 UnoFilterList aSubFilters;
                 aListIter->getSubFilters( aSubFilters );
 
-                nAdded += implAddFilterGroup( aListIter->getTitle(), aSubFilters );
+                implAddFilterGroup( aListIter->getTitle(), aSubFilters );
             }
             else
             {
                 // it's a single filter
 
-                nAdded += implAddFilter( aListIter->getTitle(), aListIter->getFilter() );
+                implAddFilter( aListIter->getTitle(), aListIter->getFilter() );
             }
         }
     }
 
-    if (nAdded)
+    if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(m_pFilterStore), NULL)) //If m_pFilterStore is not empty
         gtk_widget_show( m_pFilterExpander );
     else
         gtk_widget_hide( m_pFilterExpander );
 
     // set the default filter
-    if( m_aCurrentFilter && (m_aCurrentFilter.getLength() > 0) )
-    {
-        OSL_TRACE( "Setting current filter to %s\n", 
-            OUStringToOString( m_aCurrentFilter, RTL_TEXTENCODING_UTF8 ).getStr() );
-
+    if (sPseudoFilter.getLength())
+        SetCurFilter( sPseudoFilter );
+    else if(m_aCurrentFilter.getLength())
         SetCurFilter( m_aCurrentFilter );
-    }
 
     OSL_TRACE( "end setting filters\n");
 }
diff --git a/fpicker/source/unx/gnome/SalGtkFilePicker.hxx b/fpicker/source/unx/gnome/SalGtkFilePicker.hxx
index 3b0c200..8c877b8 100644
--- a/fpicker/source/unx/gnome/SalGtkFilePicker.hxx
+++ b/fpicker/source/unx/gnome/SalGtkFilePicker.hxx
@@ -310,11 +310,13 @@ class SalGtkFilePicker :
         gulong mnHID_SelectionChange;
 
         ::rtl::OUString	m_aCurrentFilter;
+        ::rtl::OUString	m_aInitialFilter;
 
         bool bVersionWidthUnset;
         sal_Bool mbPreviewState;
         gulong mHID_Preview;
         GtkWidget* m_pPreview;
+        GtkFileFilter* m_pPseudoFilter;
         sal_Int32 m_PreviewImageWidth;
         sal_Int32 m_PreviewImageHeight;
         
@@ -325,8 +327,8 @@ class SalGtkFilePicker :
         void UpdateFilterfromUI();
 
         void implChangeType( GtkTreeSelection *selection );
-        int implAddFilter( const OUString& rFilter, const OUString& rType);
-        int implAddFilterGroup( const OUString& rFilter, 
+        GtkFileFilter * implAddFilter( const OUString& rFilter, const OUString& rType );
+        void implAddFilterGroup( const OUString& rFilter,
                      const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::StringPair>& _rFilters );
         void updateCurrentFilterFromName(const gchar* filtername);
         void unselect_type();
diff --git a/fpicker/source/unx/gnome/resourceprovider.cxx b/fpicker/source/unx/gnome/resourceprovider.cxx
index 35d718c..46fd1f4 100644
--- a/fpicker/source/unx/gnome/resourceprovider.cxx
+++ b/fpicker/source/unx/gnome/resourceprovider.cxx
@@ -82,7 +82,8 @@ _Entry CtrlIdToResIdTable[] = {
     { CHECKBOX_SELECTION,                       STR_SVT_FILEPICKER_SELECTION },
     { FOLDERPICKER_TITLE,                       STR_SVT_FOLDERPICKER_DEFAULT_TITLE },
     { FOLDER_PICKER_DEF_DESCRIPTION,            STR_SVT_FOLDERPICKER_DEFAULT_DESCRIPTION },
-    { FILE_PICKER_OVERWRITE,                    STR_SVT_ALREADYEXISTOVERWRITE }
+    { FILE_PICKER_OVERWRITE,                    STR_SVT_ALREADYEXISTOVERWRITE },
+    { FILE_PICKER_ALLFORMATS,                   STR_SVT_ALLFORMATS }
 };
 
 _Entry OtherCtrlIdToResIdTable[] = {
diff --git a/fpicker/source/unx/gnome/resourceprovider.hxx b/fpicker/source/unx/gnome/resourceprovider.hxx
index b71b376..9bec39e 100644
--- a/fpicker/source/unx/gnome/resourceprovider.hxx
+++ b/fpicker/source/unx/gnome/resourceprovider.hxx
@@ -43,6 +43,7 @@
 #define FILE_PICKER_TITLE_SAVE        503
 #define FILE_PICKER_FILE_TYPE         504
 #define FILE_PICKER_OVERWRITE         505
+#define FILE_PICKER_ALLFORMATS        506
 
 //------------------------------------------------------------------------
 // deklarations


More information about the ooo-build-commit mailing list