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 #include "ListenerHelper.h"
26
27 using com::sun::star::frame::XFrame;
28 using com::sun::star::frame::XDispatch;
29 using com::sun::star::frame::XStatusListener;
30 using com::sun::star::lang::XEventListener;
31 using com::sun::star::lang::EventObject;
32 using com::sun::star::uno::Reference;
33 using com::sun::star::uno::RuntimeException;
34 using com::sun::star::frame::FeatureStateEvent;
35
36 static AllListeners aListeners;
37
AddListener(const Reference<XFrame> & xFrame,const Reference<XStatusListener> xControl,const::rtl::OUString & aCommand)38 void ListenerHelper::AddListener(
39 const Reference < XFrame >& xFrame,
40 const Reference < XStatusListener > xControl,
41 const ::rtl::OUString& aCommand )
42 {
43 sal_uInt32 i=0;
44 sal_uInt32 nSize = aListeners.size();
45 for ( i=0; i<nSize; i++ )
46 if ( aListeners[i].xFrame == xFrame )
47 break;
48
49 OSL_ENSURE( i<nSize, "No dispatch found for this listener!" );
50 aListeners[i].aContainer[aCommand].push_back( xControl );
51 }
52
RemoveListener(const Reference<XFrame> & xFrame,const Reference<XStatusListener> xControl,const::rtl::OUString & aCommand)53 void ListenerHelper::RemoveListener(
54 const Reference < XFrame >& xFrame,
55 const Reference < XStatusListener > xControl,
56 const ::rtl::OUString& aCommand )
57 {
58 sal_uInt32 nSize = aListeners.size();
59 for ( sal_uInt32 i=0; i<nSize; i++ )
60 {
61 if ( aListeners[i].xFrame == xFrame )
62 {
63 StatusListeners& aL = aListeners[i].aContainer[aCommand];
64 StatusListeners::iterator aIter = aL.begin();
65 while ( aIter != aL.end() )
66 {
67 if ( (*aIter) == xControl )
68 {
69 aL.erase( aIter );
70 break;
71 }
72
73 aIter++;
74 }
75 }
76 }
77 }
78
Notify(const Reference<XFrame> & xFrame,const::rtl::OUString & aCommand,FeatureStateEvent & rEvent)79 void ListenerHelper::Notify(
80 const Reference < XFrame >& xFrame,
81 const ::rtl::OUString& aCommand,
82 FeatureStateEvent& rEvent )
83 {
84 sal_uInt32 nSize = aListeners.size();
85 for ( sal_uInt32 i=0; i<nSize; i++ )
86 {
87 if ( aListeners[i].xFrame == xFrame )
88 {
89 rEvent.Source = aListeners[i].xDispatch;
90 StatusListeners& aL = aListeners[i].aContainer[aCommand];
91 StatusListeners::iterator aIter = aL.begin();
92 while ( aIter != aL.end() )
93 {
94 (*aIter)->statusChanged( rEvent );
95 aIter++;
96 }
97 }
98 }
99 }
100
GetDispatch(const Reference<XFrame> & xFrame,const::rtl::OUString & aCommand)101 com::sun::star::uno::Reference < XDispatch > ListenerHelper::GetDispatch(
102 const Reference < XFrame >& xFrame,
103 const ::rtl::OUString& aCommand )
104 {
105 sal_uInt32 nSize = aListeners.size();
106 for ( sal_uInt32 i=0; i<nSize; i++ )
107 {
108 if ( aListeners[i].xFrame == xFrame )
109 return aListeners[i].xDispatch;
110 }
111
112 return Reference < XDispatch >();
113 }
114
AddDispatch(const Reference<XDispatch> xDispatch,const Reference<XFrame> & xFrame,const::rtl::OUString & aCommand)115 void ListenerHelper::AddDispatch(
116 const Reference < XDispatch > xDispatch,
117 const Reference < XFrame >& xFrame,
118 const ::rtl::OUString& aCommand )
119 {
120 ListenerItem aItem;
121 aItem.xFrame = xFrame;
122 aItem.xDispatch = xDispatch;
123 aListeners.push_back( aItem );
124 xFrame->addEventListener( new ListenerItemEventListener( xFrame ) );
125 }
126
disposing(const EventObject & aEvent)127 void SAL_CALL ListenerItemEventListener::disposing( const EventObject& aEvent) throw (RuntimeException)
128 {
129 AllListeners::iterator aIter = aListeners.begin();
130 while ( aIter != aListeners.end() )
131 {
132 if ( (*aIter).xFrame == mxFrame )
133 {
134 aListeners.erase( aIter );
135 break;
136 }
137
138 aIter++;
139 }
140 }
141