summaryrefslogtreecommitdiff
path: root/fpicker
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2010-10-07 12:59:11 +0100
committerCaolán McNamara <caolanm@redhat.com>2010-10-07 12:59:11 +0100
commit2bd572a540c3a8d1dec99422c62fb83604277ad8 (patch)
tree51c08183c064eebe414e33930c46538061512d68 /fpicker
parent648309966263c0d081d4d861056bf3943a131fad (diff)
#i113141# show all appropiate formats by default on save as
Diffstat (limited to 'fpicker')
-rw-r--r--fpicker/source/office/iodlg.src5
-rw-r--r--fpicker/source/unx/gnome/SalGtkFilePicker.cxx104
-rw-r--r--fpicker/source/unx/gnome/SalGtkFilePicker.hxx6
-rw-r--r--fpicker/source/unx/gnome/resourceprovider.cxx3
-rw-r--r--fpicker/source/unx/gnome/resourceprovider.hxx1
5 files changed, 85 insertions, 34 deletions
diff --git a/fpicker/source/office/iodlg.src b/fpicker/source/office/iodlg.src
index 4ddb6bb8e8..413f91c5c8 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 31053e3e57..bf8e7753c5 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 3b0c20058b..8c877b8265 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 35d718c0df..46fd1f422e 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 b71b376ccd..9bec39e63b 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