1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_fpicker.hxx"
26 
27 //------------------------------------------------------------------------
28 // includes
29 //------------------------------------------------------------------------
30 #include <osl/diagnose.h>
31 #include <rtl/ustrbuf.hxx>
32 #include "resourceprovider.hxx"
33 #include <vos/mutex.hxx>
34 #include <vcl/svapp.hxx>
35 #include <tools/resmgr.hxx>
36 #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
37 #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
38 
39 #include <svtools/svtools.hrc>
40 #include <svtools/filedlg2.hrc>
41 
42 //------------------------------------------------------------
43 // namespace directives
44 //------------------------------------------------------------
45 
46 using rtl::OUString;
47 using namespace ::com::sun::star::ui::dialogs::ExtendedFilePickerElementIds;
48 using namespace ::com::sun::star::ui::dialogs::CommonFilePickerElementIds;
49 
50 //------------------------------------------------------------
51 //
52 //------------------------------------------------------------
53 
54 static const char* RES_NAME = "fps_office";
55 static const char* OTHER_RES_NAME = "svt";
56 
57 //------------------------------------------------------------
58 // we have to translate control ids to resource ids
59 //------------------------------------------------------------
60 
61 struct _Entry
62 {
63     sal_Int32 ctrlId;
64     sal_Int16 resId;
65 };
66 
67 _Entry CtrlIdToResIdTable[] = {
68     { CHECKBOX_AUTOEXTENSION,                   STR_SVT_FILEPICKER_AUTO_EXTENSION },
69     { CHECKBOX_PASSWORD,                        STR_SVT_FILEPICKER_PASSWORD },
70     { CHECKBOX_FILTEROPTIONS,                   STR_SVT_FILEPICKER_FILTER_OPTIONS },
71     { CHECKBOX_READONLY,                        STR_SVT_FILEPICKER_READONLY },
72     { CHECKBOX_LINK,                            STR_SVT_FILEPICKER_INSERT_AS_LINK },
73     { CHECKBOX_PREVIEW,                         STR_SVT_FILEPICKER_SHOW_PREVIEW },
74     { PUSHBUTTON_PLAY,                          STR_SVT_FILEPICKER_PLAY },
75     { LISTBOX_VERSION_LABEL,                    STR_SVT_FILEPICKER_VERSION },
76     { LISTBOX_TEMPLATE_LABEL,                   STR_SVT_FILEPICKER_TEMPLATES },
77     { LISTBOX_IMAGE_TEMPLATE_LABEL,             STR_SVT_FILEPICKER_IMAGE_TEMPLATE },
78     { CHECKBOX_SELECTION,                       STR_SVT_FILEPICKER_SELECTION },
79     { FOLDERPICKER_TITLE,                       STR_SVT_FOLDERPICKER_DEFAULT_TITLE },
80     { FOLDER_PICKER_DEF_DESCRIPTION,            STR_SVT_FOLDERPICKER_DEFAULT_DESCRIPTION },
81     { FILE_PICKER_OVERWRITE,                    STR_SVT_ALREADYEXISTOVERWRITE },
82     { FILE_PICKER_ALLFORMATS,                   STR_SVT_ALLFORMATS }
83 };
84 
85 _Entry OtherCtrlIdToResIdTable[] = {
86     { FILE_PICKER_TITLE_OPEN,                   STR_FILEDLG_OPEN },
87     { FILE_PICKER_TITLE_SAVE,                   STR_FILEDLG_SAVE },
88     { FILE_PICKER_FILE_TYPE,                    STR_FILEDLG_TYPE },
89 };
90 
91 
92 const sal_Int32 SIZE_TABLE = sizeof( CtrlIdToResIdTable ) / sizeof( _Entry );
93 const sal_Int32 OTHER_SIZE_TABLE = sizeof( OtherCtrlIdToResIdTable ) / sizeof( _Entry );
94 
95 //------------------------------------------------------------
96 //
97 //------------------------------------------------------------
98 
CtrlIdToResId(sal_Int32 aControlId)99 sal_Int16 CtrlIdToResId( sal_Int32 aControlId )
100 {
101     sal_Int16 aResId = -1;
102 
103     for ( sal_Int32 i = 0; i < SIZE_TABLE; i++ )
104     {
105         if ( CtrlIdToResIdTable[i].ctrlId == aControlId )
106         {
107             aResId = CtrlIdToResIdTable[i].resId;
108             break;
109         }
110     }
111 
112     return aResId;
113 }
114 
OtherCtrlIdToResId(sal_Int32 aControlId)115 sal_Int16 OtherCtrlIdToResId( sal_Int32 aControlId )
116 {
117     sal_Int16 aResId = -1;
118 
119     for ( sal_Int32 i = 0; i < OTHER_SIZE_TABLE; i++ )
120     {
121         if ( OtherCtrlIdToResIdTable[i].ctrlId == aControlId )
122         {
123             aResId = OtherCtrlIdToResIdTable[i].resId;
124             break;
125         }
126     }
127 
128     return aResId;
129 }
130 
131 //------------------------------------------------------------
132 //
133 //------------------------------------------------------------
134 
135 class CResourceProvider_Impl
136 {
137 public:
138 
139     //-------------------------------------
140     //
141     //-------------------------------------
142 
CResourceProvider_Impl()143     CResourceProvider_Impl( )
144     {
145         m_ResMgr = ResMgr::CreateResMgr( RES_NAME );
146         m_OtherResMgr = ResMgr::CreateResMgr( OTHER_RES_NAME );
147     }
148 
149     //-------------------------------------
150     //
151     //-------------------------------------
152 
~CResourceProvider_Impl()153     ~CResourceProvider_Impl( )
154     {
155         delete m_ResMgr;
156         delete m_OtherResMgr;
157     }
158 
159     //-------------------------------------
160     //
161     //-------------------------------------
162 
getResString(sal_Int16 aId)163     OUString getResString( sal_Int16 aId )
164     {
165         String   aResString;
166         OUString aResOUString;
167 
168         try
169         {
170             OSL_ASSERT( m_ResMgr && m_OtherResMgr );
171 
172             // translate the control id to a resource id
173             sal_Int16 aResId = CtrlIdToResId( aId );
174             if ( aResId > -1 )
175                 aResString = String( ResId( aResId, *m_ResMgr ) );
176 	    else
177 	    {
178                 aResId = OtherCtrlIdToResId( aId );
179                 if ( aResId > -1 )
180                     aResString = String( ResId( aResId, *m_OtherResMgr ) );
181 	    }
182 	    if ( aResId > -1 )
183                 aResOUString = OUString( aResString );
184         }
185         catch(...)
186         {
187         }
188 
189         return aResOUString;
190     }
191 
192 public:
193     ResMgr* m_ResMgr;
194     ResMgr* m_OtherResMgr;
195 };
196 
197 //------------------------------------------------------------
198 //
199 //------------------------------------------------------------
200 
CResourceProvider()201 CResourceProvider::CResourceProvider( ) :
202     m_pImpl( new CResourceProvider_Impl() )
203 {
204 }
205 
206 //------------------------------------------------------------
207 //
208 //------------------------------------------------------------
209 
~CResourceProvider()210 CResourceProvider::~CResourceProvider( )
211 {
212     delete m_pImpl;
213 }
214 
215 //------------------------------------------------------------
216 //
217 //------------------------------------------------------------
218 
getResString(sal_Int32 aId)219 OUString CResourceProvider::getResString( sal_Int32 aId )
220 {
221    return m_pImpl->getResString( aId ).replace('~', '_');
222 }
223