xref: /trunk/main/uui/source/fltdlg.cxx (revision 9f813b30)
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 //_________________________________________________________________________________________________________________
25 //	my own includes
26 //_________________________________________________________________________________________________________________
27 
28 #include "fltdlg.hxx"
29 
30 #ifndef UUI_IDS_HRC
31 #include "ids.hrc"
32 #endif
33 
34 #ifndef UUI_FLTDLG_HRC
35 #include "fltdlg.hrc"
36 #endif
37 
38 //_________________________________________________________________________________________________________________
39 //	includes of other projects
40 //_________________________________________________________________________________________________________________
41 #include <com/sun/star/util/XStringWidth.hpp>
42 #include <cppuhelper/implbase1.hxx>
43 #include <unotools/localfilehelper.hxx>
44 #include <tools/list.hxx>
45 #include <tools/urlobj.hxx>
46 
47 #ifndef _BUTTON_HXX //autogen
48 #include <vcl/button.hxx>
49 #endif
50 #include <vos/mutex.hxx>
51 #include <vcl/svapp.hxx>
52 
53 namespace uui
54 {
55 
56 /*-************************************************************************************************************//**
57     @short      initialize filter dialog with start values
58     @descr      We set some necessary informations on these instance for later working and create internal structures.
59                 After construction user should call "SetFilters()" and "SetURL()" to fill listbox with selectable filter
60                 names and set file name of file, which should be used for selected filter.
61 
62     @seealso    method SetFilters()
63     @seealso    method SetURL()
64 
65     @param      "pParentWindow"  , parent window for dialog
66     @param      "pResMgr"        , ressource manager
67     @return     -
68 
69     @onerror    -
70     @threadsafe no
71 *//*-*************************************************************************************************************/
FilterDialog(Window * pParentWindow,ResMgr * pResMgr)72 FilterDialog::FilterDialog( Window* pParentWindow ,
73                             ResMgr* pResMgr       )
74     :   ModalDialog  ( pParentWindow, ResId( DLG_FILTER_SELECT, *pResMgr ) )
75     ,   m_ftURL      ( this, ResId( FT_URL, *pResMgr            )                   )
76     ,   m_lbFilters  ( this, ResId( LB_FILTERS, *pResMgr        )                   )
77     ,   m_btnOK      ( this, ResId( BTN_OK, *pResMgr            )                   )
78     ,   m_btnCancel  ( this, ResId( BTN_CANCEL, *pResMgr        )                   )
79     ,   m_btnHelp    ( this, ResId( BTN_HELP, *pResMgr          )                   )
80 {
81     FreeResource();
82 }
83 
84 /*-************************************************************************************************************//**
85     @short      set file name on dialog control
86     @descr      We convert given URL (it must be an URL!) into valid file name and show it on our dialog.
87 
88     @seealso    -
89 
90     @param      "sURL", URL for showing
91     @return     -
92 
93     @onerror    -
94     @threadsafe no
95 *//*-*************************************************************************************************************/
SetURL(const String & sURL)96 void FilterDialog::SetURL( const String& sURL )
97 {
98     // convert it and use given pure string as fallback if conversion failed
99     m_ftURL.SetText( impl_buildUIFileName(sURL) );
100 }
101 
102 /*-************************************************************************************************************//**
103     @short      change list of filter names
104     @descr      We save given pointer internal and use it to fill our listbox with given names.
105                 Saved list pointer is used on method "AskForFilter()" too, to find user selected item
106                 and return pointer into these list as result of operation.
107                 So it's possible to call dialog again and again for different or same filter list
108                 and ask user for his decision by best performance!
109 
110     @attention  Don't free memory of given list after this call till object will die ... or
111                 you call "ChangeFilters( NULL )"! Then we forget it too.
112 
113     @seealso    method AskForFilter()
114 
115     @param      "pFilterNames", pointer to list of filter names, which should be used for later operations.
116     @return     -
117 
118     @onerror    We clear list box and forget our currently set filter informations completly!
119     @threadsafe no
120 *//*-*************************************************************************************************************/
ChangeFilters(const FilterNameList * pFilterNames)121 void FilterDialog::ChangeFilters( const FilterNameList* pFilterNames )
122 {
123     m_pFilterNames = pFilterNames;
124     m_lbFilters.Clear();
125     if( m_pFilterNames != NULL )
126     {
127         for( FilterNameListPtr pItem  = m_pFilterNames->begin();
128                                pItem != m_pFilterNames->end()  ;
129                                ++pItem                         )
130         {
131             m_lbFilters.InsertEntry( pItem->sUI );
132         }
133     }
134 }
135 
136 /*-************************************************************************************************************//**
137     @short      ask user for his decision
138     @descr      We show the dialog and if user finish it with "OK" - we try to find selected item in internal saved
139                 name list (which you must set in "ChangeFilters()"!). If we return sal_True as result, you can use out
140                 parameter "pSelectedItem" as pointer into your FilterNameList to get selected item really ...
141                 but if we return sal_False ... user has canceled the dialog ... you shouldn't do that. pSelectedItem isn't
142                 set to any valid value then. We don't change them ...
143 
144     @seealso    method ChangeFilters()
145 
146     @param      "pSelectedItem", returns result of selection as pointer into set list of filter names
147                                  (valid for function return sal_True only!)
148     @return     true  => pSelectedItem parameter points into name list and represent use decision
149                 false => use has canceled dialog (pSelectedItem isn't valid then!)
150 
151     @onerror    We return false ... but don't change pSelectedItem!
152     @threadsafe no
153 *//*-*************************************************************************************************************/
AskForFilter(FilterNameListPtr & pSelectedItem)154 bool FilterDialog::AskForFilter( FilterNameListPtr& pSelectedItem )
155 {
156     bool bSelected = sal_False;
157 
158     if( m_pFilterNames != NULL )
159     {
160         if( ModalDialog::Execute() == RET_OK )
161         {
162             String sEntry = m_lbFilters.GetSelectEntry();
163             if( sEntry.Len() > 0 )
164             {
165                 int nPos = m_lbFilters.GetSelectEntryPos();
166                 if( nPos < (int)(m_pFilterNames->size()) )
167                 {
168                     pSelectedItem  = m_pFilterNames->begin();
169                     pSelectedItem += nPos;
170                     bSelected      = ( pSelectedItem != m_pFilterNames->end() );
171                 }
172             }
173         }
174     }
175 
176     return bSelected;
177 }
178 
179 /*-************************************************************************************************************//**
180     @short      helper class to calculate length of given string
181     @descr      Instances of it can be used as callback for INetURLObject::getAbbreviated() method to build
182                 short URLs to show it on GUI. We use in ctor set OutputDevice to call special VCL method ...
183 
184     @seealso    method OutputDevice::GetTextWidth()
185     @seealso    method InetURLObject::getAbbreviated()
186 
187     @param      -
188     @return     -
189 
190     @onerror    -
191     @threadsafe no
192 *//*-*************************************************************************************************************/
193 class StringCalculator : public ::cppu::WeakImplHelper1< ::com::sun::star::util::XStringWidth >
194 {
195 	public:
StringCalculator(const OutputDevice * pDevice)196         StringCalculator( const OutputDevice* pDevice )
197             : m_pDevice( pDevice )
198         {
199         }
200 
queryStringWidth(const::rtl::OUString & sString)201         sal_Int32 SAL_CALL queryStringWidth( const ::rtl::OUString& sString ) throw( ::com::sun::star::uno::RuntimeException )
202 		{
203             return (sal_Int32)(m_pDevice->GetTextWidth(String(sString)));
204 		}
205 
206     private:
207         const OutputDevice* m_pDevice;
208 };
209 
210 /*-************************************************************************************************************//**
211     @short      try to build short name of given URL to show it in GUI
212     @descr      We detect type of given URL automatically and build this short name depend on this type ...
213                 If we couldn't make it right we return full given string without any changes ...
214 
215     @seealso    class LocalFileHelper
216     @seealso    method InetURLObject::getAbbreviated()
217 
218     @param      "sName", file name
219     @return     A short file name ...
220 
221     @onerror    We return given name without any changes.
222     @threadsafe no
223 *//*-*************************************************************************************************************/
impl_buildUIFileName(const String & sName)224 String FilterDialog::impl_buildUIFileName( const String& sName )
225 {
226     String sShortName( sName );
227 
228     if( ::utl::LocalFileHelper::ConvertURLToSystemPath( sName, sShortName ) == sal_True )
229     {
230         // it's a system file ... build short name by using osl functionality
231     }
232     else
233     {
234         // otherwise its really a url ... build short name by using INetURLObject
235         ::com::sun::star::uno::Reference< ::com::sun::star::util::XStringWidth > xStringCalculator( new StringCalculator(&m_ftURL) );
236         if( xStringCalculator.is() == sal_True )
237         {
238             INetURLObject aBuilder   ( sName );
239             Size          aSize      = m_ftURL.GetOutputSize();
240                           sShortName = aBuilder.getAbbreviated( xStringCalculator, aSize.Width(), INetURLObject::DECODE_UNAMBIGUOUS );
241         }
242     }
243 
244     return sShortName;
245 }
246 
247 }   // namespace uui
248