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