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_framework.hxx" 26 27 #ifndef __FRAMEWORK_UIELEMENT_TOGGLEBUTTONTOOLBARCONTROLLER_HXX 28 #include "uielement/togglebuttontoolbarcontroller.hxx" 29 #endif 30 31 //_________________________________________________________________________________________________________________ 32 // my own includes 33 //_________________________________________________________________________________________________________________ 34 #include <framework/addonsoptions.hxx> 35 #ifndef __FRAMEWORK_TOOLBAR_HXX_ 36 #include "uielement/toolbar.hxx" 37 #endif 38 39 //_________________________________________________________________________________________________________________ 40 // interface includes 41 //_________________________________________________________________________________________________________________ 42 #include <com/sun/star/util/XURLTransformer.hpp> 43 #include <com/sun/star/frame/XDispatchProvider.hpp> 44 #include <com/sun/star/beans/PropertyValue.hpp> 45 #include <com/sun/star/frame/XControlNotificationListener.hpp> 46 #include "com/sun/star/util/XMacroExpander.hpp" 47 #include "com/sun/star/uno/XComponentContext.hpp" 48 #include "com/sun/star/beans/XPropertySet.hpp" 49 50 //_________________________________________________________________________________________________________________ 51 // other includes 52 //_________________________________________________________________________________________________________________ 53 54 #include <rtl/uri.hxx> 55 #include <vos/mutex.hxx> 56 #include <comphelper/processfactory.hxx> 57 #include <unotools/ucbstreamhelper.hxx> 58 #include <tools/urlobj.hxx> 59 #include <vcl/svapp.hxx> 60 #include <vcl/mnemonic.hxx> 61 #include <vcl/window.hxx> 62 #include <vcl/graph.hxx> 63 #include <vcl/bitmap.hxx> 64 #include <svtools/filter.hxx> 65 #include <svtools/miscopt.hxx> 66 67 using namespace ::com::sun::star; 68 using namespace ::com::sun::star::awt; 69 using namespace ::com::sun::star::uno; 70 using namespace ::com::sun::star::beans; 71 using namespace ::com::sun::star::lang; 72 using namespace ::com::sun::star::frame; 73 using namespace ::com::sun::star::util; 74 75 namespace framework 76 { 77 78 // ------------------------------------------------------------------ 79 80 ToggleButtonToolbarController::ToggleButtonToolbarController( 81 const Reference< XMultiServiceFactory >& rServiceManager, 82 const Reference< XFrame >& rFrame, 83 ToolBox* pToolbar, 84 sal_uInt16 nID, 85 Style eStyle, 86 const ::rtl::OUString& aCommand ) : 87 ComplexToolbarController( rServiceManager, rFrame, pToolbar, nID, aCommand ), 88 m_eStyle( eStyle ) 89 { 90 if ( eStyle == STYLE_DROPDOWNBUTTON ) 91 m_pToolbar->SetItemBits( m_nID, TIB_DROPDOWNONLY | m_pToolbar->GetItemBits( m_nID ) ); 92 else if ( eStyle == STYLE_TOGGLE_DROPDOWNBUTTON ) 93 m_pToolbar->SetItemBits( m_nID, TIB_DROPDOWN | m_pToolbar->GetItemBits( m_nID ) ); 94 } 95 96 // ------------------------------------------------------------------ 97 98 ToggleButtonToolbarController::~ToggleButtonToolbarController() 99 { 100 } 101 102 // ------------------------------------------------------------------ 103 104 void SAL_CALL ToggleButtonToolbarController::dispose() 105 throw ( RuntimeException ) 106 { 107 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 108 ComplexToolbarController::dispose(); 109 } 110 111 // ------------------------------------------------------------------ 112 Sequence<PropertyValue> ToggleButtonToolbarController::getExecuteArgs(sal_Int16 KeyModifier) const 113 { 114 Sequence<PropertyValue> aArgs( 2 ); 115 116 // Add key modifier to argument list 117 aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "KeyModifier" )); 118 aArgs[0].Value <<= KeyModifier; 119 aArgs[1].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Text" )); 120 aArgs[1].Value <<= m_aCurrentSelection; 121 return aArgs; 122 } 123 124 // ------------------------------------------------------------------ 125 126 uno::Reference< awt::XWindow > SAL_CALL ToggleButtonToolbarController::createPopupWindow() 127 throw (::com::sun::star::uno::RuntimeException) 128 { 129 uno::Reference< awt::XWindow > xWindow; 130 131 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 132 if (( m_eStyle == STYLE_DROPDOWNBUTTON ) || 133 ( m_eStyle == STYLE_TOGGLE_DROPDOWNBUTTON )) 134 { 135 // create popup menu 136 PopupMenu aPopup; 137 const sal_uInt32 nCount = m_aDropdownMenuList.size(); 138 for ( sal_uInt32 i = 0; i < nCount; i++ ) 139 { 140 rtl::OUString aLabel( m_aDropdownMenuList[i] ); 141 aPopup.InsertItem( sal_uInt16( i+1 ), aLabel ); 142 if ( aLabel == m_aCurrentSelection ) 143 aPopup.CheckItem( sal_uInt16( i+1 ), sal_True ); 144 else 145 aPopup.CheckItem( sal_uInt16( i+1 ), sal_False ); 146 } 147 148 m_pToolbar->SetItemDown( m_nID, sal_True ); 149 aPopup.SetSelectHdl( LINK( this, ToggleButtonToolbarController, MenuSelectHdl )); 150 aPopup.Execute( m_pToolbar, m_pToolbar->GetItemRect( m_nID )); 151 m_pToolbar->SetItemDown( m_nID, sal_False ); 152 } 153 154 return xWindow; 155 } 156 157 // ------------------------------------------------------------------ 158 159 void ToggleButtonToolbarController::executeControlCommand( const ::com::sun::star::frame::ControlCommand& rControlCommand ) 160 { 161 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 162 163 if (( m_eStyle == STYLE_DROPDOWNBUTTON ) || 164 ( m_eStyle == STYLE_TOGGLE_DROPDOWNBUTTON )) 165 { 166 if ( rControlCommand.Command.equalsAsciiL( "SetList", 7 )) 167 { 168 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 169 { 170 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "List", 4 )) 171 { 172 Sequence< ::rtl::OUString > aList; 173 m_aDropdownMenuList.clear(); 174 175 rControlCommand.Arguments[i].Value >>= aList; 176 for ( sal_Int32 j = 0; j < aList.getLength(); j++ ) 177 m_aDropdownMenuList.push_back( aList[j] ); 178 179 // send notification 180 uno::Sequence< beans::NamedValue > aInfo( 1 ); 181 aInfo[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "List" )); 182 aInfo[0].Value <<= aList; 183 addNotifyInfo( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ListChanged" )), 184 getDispatchFromCommand( m_aCommandURL ), 185 aInfo ); 186 187 break; 188 } 189 } 190 } 191 else if ( rControlCommand.Command.equalsAsciiL( "CheckItemPos", 12 )) 192 { 193 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 194 { 195 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Pos", 3 )) 196 { 197 sal_Int32 nPos( -1 ); 198 199 rControlCommand.Arguments[i].Value >>= nPos; 200 if ( nPos >= 0 && 201 ( sal::static_int_cast< sal_uInt32 >(nPos) 202 < m_aDropdownMenuList.size() ) ) 203 { 204 m_aCurrentSelection = m_aDropdownMenuList[nPos]; 205 206 // send notification 207 uno::Sequence< beans::NamedValue > aInfo( 1 ); 208 aInfo[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ItemChecked" )); 209 aInfo[0].Value <<= nPos; 210 addNotifyInfo( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Pos" )), 211 getDispatchFromCommand( m_aCommandURL ), 212 aInfo ); 213 } 214 break; 215 } 216 } 217 } 218 else if ( rControlCommand.Command.equalsAsciiL( "AddEntry", 8 )) 219 { 220 rtl::OUString aText; 221 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 222 { 223 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Text", 4 )) 224 { 225 if ( rControlCommand.Arguments[i].Value >>= aText ) 226 m_aDropdownMenuList.push_back( aText ); 227 break; 228 } 229 } 230 } 231 else if ( rControlCommand.Command.equalsAsciiL( "InsertEntry", 11 )) 232 { 233 sal_Int32 nPos( COMBOBOX_APPEND ); 234 sal_Int32 nSize = sal_Int32( m_aDropdownMenuList.size() ); 235 rtl::OUString aText; 236 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 237 { 238 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Pos", 3 )) 239 { 240 sal_Int32 nTmpPos = 0; 241 if ( rControlCommand.Arguments[i].Value >>= nTmpPos ) 242 { 243 if (( nTmpPos >= 0 ) && ( nTmpPos < sal_Int32( nSize ))) 244 nPos = nTmpPos; 245 } 246 } 247 else if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Text", 4 )) 248 rControlCommand.Arguments[i].Value >>= aText; 249 } 250 251 std::vector< ::rtl::OUString >::iterator aIter = m_aDropdownMenuList.begin(); 252 aIter += nPos; 253 m_aDropdownMenuList.insert( aIter, aText ); 254 } 255 else if ( rControlCommand.Command.equalsAsciiL( "RemoveEntryPos", 14 )) 256 { 257 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 258 { 259 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Pos", 3 )) 260 { 261 sal_Int32 nPos( -1 ); 262 if ( rControlCommand.Arguments[i].Value >>= nPos ) 263 { 264 if ( nPos < sal_Int32( m_aDropdownMenuList.size() )) 265 { 266 std::vector< ::rtl::OUString >::iterator aIter = m_aDropdownMenuList.begin(); 267 aIter += nPos; 268 m_aDropdownMenuList.erase( aIter ); 269 } 270 } 271 break; 272 } 273 } 274 } 275 else if ( rControlCommand.Command.equalsAsciiL( "RemoveEntryText", 15 )) 276 { 277 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 278 { 279 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Text", 4 )) 280 { 281 rtl::OUString aText; 282 if ( rControlCommand.Arguments[i].Value >>= aText ) 283 { 284 sal_Int32 nSize = sal_Int32( m_aDropdownMenuList.size() ); 285 for ( sal_Int32 j = 0; j < nSize; j++ ) 286 { 287 if ( m_aDropdownMenuList[j] == aText ) 288 { 289 std::vector< ::rtl::OUString >::iterator aIter = m_aDropdownMenuList.begin(); 290 aIter += j; 291 m_aDropdownMenuList.erase( aIter ); 292 break; 293 } 294 } 295 } 296 break; 297 } 298 } 299 } 300 } 301 } 302 303 IMPL_LINK( ToggleButtonToolbarController, MenuSelectHdl, Menu *, pMenu ) 304 { 305 vos::OGuard aGuard( Application::GetSolarMutex() ); 306 307 sal_uInt16 nItemId = pMenu->GetCurItemId(); 308 if ( nItemId > 0 && nItemId <= m_aDropdownMenuList.size() ) 309 { 310 m_aCurrentSelection = m_aDropdownMenuList[nItemId-1]; 311 312 execute( 0 ); 313 } 314 return 0; 315 } 316 317 } // namespace 318 319