xref: /trunk/main/toolkit/inc/toolkit/controls/controlmodelcontainerbase.hxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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