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 #ifndef TOOLKIT_CONTROL_MODEL_CONTAINERBASE_HXX 25 #define TOOLKIT_CONTROL_MODEL_CONTAINERBASE_HXX 26 27 #include <com/sun/star/container/XNameContainer.hpp> 28 #include <com/sun/star/container/XContainer.hpp> 29 #include <com/sun/star/awt/XTabControllerModel.hpp> 30 #include <com/sun/star/util/XChangesNotifier.hpp> 31 #include <com/sun/star/util/XChangesListener.hpp> 32 #include <com/sun/star/util/XModifyListener.hpp> 33 #include <com/sun/star/beans/XPropertyChangeListener.hpp> 34 #include <com/sun/star/resource/XStringResourceResolver.hpp> 35 #include <cppuhelper/implbase8.hxx> 36 #include <cppuhelper/implbase2.hxx> 37 #include <toolkit/helper/listenermultiplexer.hxx> 38 #include <toolkit/controls/unocontrolmodel.hxx> 39 #include <toolkit/controls/unocontrolcontainer.hxx> 40 #include <cppuhelper/propshlp.hxx> 41 #include <cppuhelper/basemutex.hxx> 42 #include <com/sun/star/graphic/XGraphic.hpp> 43 #include <com/sun/star/awt/tab/XTabPageModel.hpp> 44 #include <com/sun/star/uno/XComponentContext.hpp> 45 #include <com/sun/star/lang/XInitialization.hpp> 46 // ---------------------------------------------------- 47 // class ControlModelContainerBase 48 // ---------------------------------------------------- 49 typedef UnoControlModel ControlModel_Base; 50 typedef ::cppu::AggImplInheritanceHelper8 < ControlModel_Base 51 , ::com::sun::star::lang::XMultiServiceFactory 52 , ::com::sun::star::container::XContainer 53 , ::com::sun::star::container::XNameContainer 54 , ::com::sun::star::awt::XTabControllerModel 55 , ::com::sun::star::util::XChangesNotifier 56 , ::com::sun::star::beans::XPropertyChangeListener 57 , ::com::sun::star::awt::tab::XTabPageModel 58 , ::com::sun::star::lang::XInitialization 59 > ControlModelContainer_IBase; 60 61 class ControlModelContainerBase : public ControlModelContainer_IBase 62 { 63 public: 64 // would like to make this typedef private, too, but the Forte 7 compiler does have 65 // problems with this ..... 66 typedef ::std::pair< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >, ::rtl::OUString > 67 UnoControlModelHolder; 68 private: 69 typedef ::std::list< UnoControlModelHolder > UnoControlModelHolderList; 70 71 // for grouping control models (XTabControllerModel::getGroupXXX) 72 typedef ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > > 73 ModelGroup; 74 typedef ::std::vector< ModelGroup > AllGroups; 75 76 friend struct CloneControlModel; 77 friend struct FindControlModel; 78 friend struct CompareControlModel; 79 80 protected: 81 ContainerListenerMultiplexer maContainerListeners; 82 ::cppu::OInterfaceContainerHelper maChangeListeners; 83 UnoControlModelHolderList maModels; 84 85 AllGroups maGroups; 86 sal_Bool mbGroupsUpToDate; 87 88 sal_Bool m_bEnabled; 89 ::rtl::OUString m_sImageURL; 90 ::rtl::OUString m_sTooltip; 91 sal_Int16 m_nTabPageId; 92 93 void Clone_Impl(ControlModelContainerBase& _rClone) const; 94 95 protected: 96 ::com::sun::star::uno::Any ImplGetDefaultValue( sal_uInt16 nPropId ) const; 97 ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); 98 99 UnoControlModelHolderList::iterator ImplFindElement( const ::rtl::OUString& rName ); 100 101 public: 102 ControlModelContainerBase( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& i_factory ); 103 ControlModelContainerBase( const ControlModelContainerBase& rModel ); 104 ~ControlModelContainerBase(); 105 106 UnoControlModel* Clone() const; 107 108 // ::com::sun::star::container::XContainer 109 void SAL_CALL addContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerListener >& xListener ); 110 void SAL_CALL removeContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerListener >& xListener ); 111 112 // ::com::sun::star::container::XElementAcces 113 ::com::sun::star::uno::Type SAL_CALL getElementType( ); 114 sal_Bool SAL_CALL hasElements( ); 115 116 // ::com::sun::star::container::XNameContainer, XNameReplace, XNameAccess 117 void SAL_CALL replaceByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ); 118 ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ); 119 ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ); 120 sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ); 121 void SAL_CALL insertByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ); 122 void SAL_CALL removeByName( const ::rtl::OUString& Name ); 123 124 // ::com::sun::star::beans::XMultiPropertySet 125 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ); 126 127 // ::com::sun::star::lang::XMultiServiceFactory 128 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstance( const ::rtl::OUString& aServiceSpecifier ); 129 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstanceWithArguments( const ::rtl::OUString& ServiceSpecifier, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& Arguments ); 130 ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getAvailableServiceNames( ); 131 132 // XComponent 133 void SAL_CALL dispose( ); 134 135 // XTabControllerModel 136 virtual sal_Bool SAL_CALL getGroupControl( ); 137 virtual void SAL_CALL setGroupControl( sal_Bool GroupControl ); 138 virtual void SAL_CALL setControlModels( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > >& Controls ); 139 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > > SAL_CALL getControlModels( ); 140 virtual void SAL_CALL setGroup( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > >& Group, const ::rtl::OUString& GroupName ); 141 virtual sal_Int32 SAL_CALL getGroupCount( ); 142 virtual void SAL_CALL getGroup( sal_Int32 nGroup, ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > >& Group, ::rtl::OUString& Name ); 143 virtual void SAL_CALL getGroupByName( const ::rtl::OUString& Name, ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > >& Group ); 144 145 // XChangesNotifier 146 virtual void SAL_CALL addChangesListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XChangesListener >& aListener ); 147 virtual void SAL_CALL removeChangesListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XChangesListener >& aListener ); 148 149 // XPropertyChangeListener 150 virtual void SAL_CALL propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& evt ); 151 152 // XEventListener 153 using cppu::OPropertySetHelper::disposing; 154 virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& evt ); 155 156 // XServiceInfo 157 DECLIMPL_SERVICEINFO_DERIVED(ControlModelContainerBase, ControlModel_Base, "toolkit.ControlModelContainerBase" ) 158 159 // XInitialization 160 virtual void SAL_CALL initialize (const com::sun::star::uno::Sequence<com::sun::star::uno::Any>& rArguments); 161 162 // ::com::sun::star::awt::tab::XTabPageModel 163 virtual ::sal_Int16 SAL_CALL getTabPageID(); 164 virtual ::sal_Bool SAL_CALL getEnabled(); 165 virtual void SAL_CALL setEnabled( ::sal_Bool _enabled ); 166 virtual ::rtl::OUString SAL_CALL getTitle(); 167 virtual void SAL_CALL setTitle( const ::rtl::OUString& _title ); 168 virtual ::rtl::OUString SAL_CALL getImageURL(); 169 virtual void SAL_CALL setImageURL( const ::rtl::OUString& _imageurl ); 170 virtual ::rtl::OUString SAL_CALL getToolTip(); 171 virtual void SAL_CALL setToolTip( const ::rtl::OUString& _tooltip ); 172 173 protected: 174 void startControlListening( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& _rxChildModel ); 175 void stopControlListening( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& _rxChildModel ); 176 177 void implNotifyTabModelChange( const ::rtl::OUString& _rAccessor ); 178 179 void implUpdateGroupStructure(); 180 }; 181 182 class ResourceListener :public ::com::sun::star::util::XModifyListener, 183 public ::cppu::OWeakObject, 184 public ::cppu::BaseMutex 185 { 186 public: 187 ResourceListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& xListener ); 188 virtual ~ResourceListener(); 189 190 void startListening( const ::com::sun::star::uno::Reference< ::com::sun::star::resource::XStringResourceResolver >& rResource ); 191 void stopListening(); 192 193 // XInterface 194 virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ); 195 virtual void SAL_CALL acquire() throw (); 196 virtual void SAL_CALL release() throw (); 197 198 // XModifyListener 199 virtual void SAL_CALL modified( const ::com::sun::star::lang::EventObject& aEvent ); 200 201 // XEventListener 202 virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ); 203 204 private: 205 ::com::sun::star::uno::Reference< ::com::sun::star::resource::XStringResourceResolver > m_xResource; 206 ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener > m_xListener; 207 bool m_bListening; 208 }; 209 210 typedef ::cppu::AggImplInheritanceHelper2 < UnoControlContainer 211 , ::com::sun::star::container::XContainerListener 212 , ::com::sun::star::util::XChangesListener 213 > ContainerControl_IBase; 214 215 class ControlContainerBase : public ContainerControl_IBase 216 { 217 protected: 218 bool mbSizeModified; 219 bool mbPosModified; 220 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabController > mxTabController; 221 ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener > mxListener; 222 223 void ImplInsertControl( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& rxModel, const ::rtl::OUString& rName ); 224 void ImplRemoveControl( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& rxModel ); 225 virtual void ImplSetPosSize( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& rxCtrl ); 226 void ImplUpdateResourceResolver(); 227 void ImplStartListingForResourceEvents(); 228 ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > Impl_getGraphicFromURL_nothrow( const ::rtl::OUString& _rURL ); 229 230 ControlContainerBase(); 231 232 public: 233 ControlContainerBase( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& i_factory ); 234 ~ControlContainerBase(); 235 236 DECLIMPL_SERVICEINFO_DERIVED( ControlContainerBase, UnoControlBase, "toolkit.ControlContainerBase" ) 237 238 void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ); 239 void SAL_CALL dispose(); 240 241 void SAL_CALL createPeer( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit >& Toolkit, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >& Parent ); 242 243 // ::com::sun::star::container::XContainerListener 244 void SAL_CALL elementInserted( const ::com::sun::star::container::ContainerEvent& Event ); 245 void SAL_CALL elementRemoved( const ::com::sun::star::container::ContainerEvent& Event ); 246 void SAL_CALL elementReplaced( const ::com::sun::star::container::ContainerEvent& Event ); 247 248 // XChangesListener 249 virtual void SAL_CALL changesOccurred( const ::com::sun::star::util::ChangesEvent& Event ); 250 251 // ::com::sun::star::awt::XControl 252 sal_Bool SAL_CALL setModel( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& Model ); 253 void SAL_CALL setDesignMode( sal_Bool bOn ); 254 protected: 255 virtual void ImplModelPropertiesChanged( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyChangeEvent >& rEvents ); 256 virtual void removingControl( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxControl ); 257 virtual void addingControl( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxControl ); 258 }; 259 #endif 260