1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef SD_SLIDESORTER_SLIDE_SORTER_LISTENER_HXX
25*b1cdbd2cSJim Jagielski #define SD_SLIDESORTER_SLIDE_SORTER_LISTENER_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "MutexOwner.hxx"
28*b1cdbd2cSJim Jagielski #include "controller/SlideSorterController.hxx"
29*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEventListener.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertyChangeListener.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/XAccessibleEventListener.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFrameActionListener.hpp>
35*b1cdbd2cSJim Jagielski #include <cppuhelper/compbase4.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <svl/lstner.hxx>
38*b1cdbd2cSJim Jagielski #include <tools/link.hxx>
39*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski namespace sd {
42*b1cdbd2cSJim Jagielski class ViewShellBase;
43*b1cdbd2cSJim Jagielski }
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski namespace sd { namespace tools {
46*b1cdbd2cSJim Jagielski class EventMultiplexerEvent;
47*b1cdbd2cSJim Jagielski } }
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski namespace sd { namespace slidesorter {
50*b1cdbd2cSJim Jagielski class SlideSorter;
51*b1cdbd2cSJim Jagielski } }
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski namespace sd { namespace slidesorter { namespace controller {
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski typedef cppu::WeakComponentImplHelper4<
57*b1cdbd2cSJim Jagielski     ::com::sun::star::document::XEventListener,
58*b1cdbd2cSJim Jagielski     ::com::sun::star::beans::XPropertyChangeListener,
59*b1cdbd2cSJim Jagielski     ::com::sun::star::accessibility::XAccessibleEventListener,
60*b1cdbd2cSJim Jagielski     ::com::sun::star::frame::XFrameActionListener
61*b1cdbd2cSJim Jagielski     > ListenerInterfaceBase;
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski class SlideSorterController;
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski /** Listen for events of various types and sources and react to them.  This
66*b1cdbd2cSJim Jagielski     class is a part of the controller.
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski     When the view shell in the center pane is replaced by another the
69*b1cdbd2cSJim Jagielski     associated controller is replaced as well.  Therefore we have to
70*b1cdbd2cSJim Jagielski     register at the frame and on certain FrameActionEvents to stop listening
71*b1cdbd2cSJim Jagielski     to the old controller and register as listener at the new one.
72*b1cdbd2cSJim Jagielski */
73*b1cdbd2cSJim Jagielski class Listener
74*b1cdbd2cSJim Jagielski     : protected MutexOwner,
75*b1cdbd2cSJim Jagielski       public ListenerInterfaceBase,
76*b1cdbd2cSJim Jagielski       public SfxListener
77*b1cdbd2cSJim Jagielski {
78*b1cdbd2cSJim Jagielski public:
79*b1cdbd2cSJim Jagielski     Listener (SlideSorter& rSlideSorter);
80*b1cdbd2cSJim Jagielski     virtual ~Listener (void);
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski     /** Connect to the current controller of the view shell as listener.
83*b1cdbd2cSJim Jagielski         This method is called once during initialization and every time a
84*b1cdbd2cSJim Jagielski         FrameActionEvent signals the current controller being exchanged.
85*b1cdbd2cSJim Jagielski         When the connection is successfull then the flag
86*b1cdbd2cSJim Jagielski         mbListeningToController is set to <TRUE/>.
87*b1cdbd2cSJim Jagielski     */
88*b1cdbd2cSJim Jagielski     void ConnectToController (void);
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski     /** Disconnect from the current controller of the view shell as
91*b1cdbd2cSJim Jagielski         listener.  This method is called once during initialization and
92*b1cdbd2cSJim Jagielski         every time a FrameActionEvent signals the current controller being
93*b1cdbd2cSJim Jagielski         exchanged.  When this method terminates then mbListeningToController
94*b1cdbd2cSJim Jagielski         is <FALSE/>.
95*b1cdbd2cSJim Jagielski     */
96*b1cdbd2cSJim Jagielski     void DisconnectFromController (void);
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski     virtual void Notify (
99*b1cdbd2cSJim Jagielski         SfxBroadcaster& rBroadcaster,
100*b1cdbd2cSJim Jagielski         const SfxHint& rHint);
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski     //=====  lang::XEventListener  ============================================
103*b1cdbd2cSJim Jagielski     virtual void SAL_CALL
104*b1cdbd2cSJim Jagielski         disposing (const ::com::sun::star::lang::EventObject& rEventObject)
105*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski     //=====  document::XEventListener  ========================================
109*b1cdbd2cSJim Jagielski     virtual void SAL_CALL
110*b1cdbd2cSJim Jagielski         notifyEvent (
111*b1cdbd2cSJim Jagielski             const ::com::sun::star::document::EventObject& rEventObject)
112*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski     //=====  beans::XPropertySetListener  =====================================
115*b1cdbd2cSJim Jagielski     virtual void SAL_CALL
116*b1cdbd2cSJim Jagielski         propertyChange (
117*b1cdbd2cSJim Jagielski             const com::sun::star::beans::PropertyChangeEvent& rEvent)
118*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski     //===== accessibility::XAccessibleEventListener  ==========================
121*b1cdbd2cSJim Jagielski     virtual void SAL_CALL
122*b1cdbd2cSJim Jagielski         notifyEvent (
123*b1cdbd2cSJim Jagielski             const ::com::sun::star::accessibility::AccessibleEventObject&
124*b1cdbd2cSJim Jagielski             rEvent)
125*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski     //===== frame::XFrameActionListener  ======================================
128*b1cdbd2cSJim Jagielski     /** For certain actions the listener connects to a new controller of the
129*b1cdbd2cSJim Jagielski         frame it is listening to.  This usually happens when the view shell
130*b1cdbd2cSJim Jagielski         in the center pane is replaced by another view shell.
131*b1cdbd2cSJim Jagielski     */
132*b1cdbd2cSJim Jagielski     virtual void SAL_CALL
133*b1cdbd2cSJim Jagielski         frameAction (const ::com::sun::star::frame::FrameActionEvent& rEvent)
134*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski     virtual void SAL_CALL disposing (void);
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski private:
139*b1cdbd2cSJim Jagielski     SlideSorter& mrSlideSorter;
140*b1cdbd2cSJim Jagielski     SlideSorterController& mrController;
141*b1cdbd2cSJim Jagielski     ViewShellBase* mpBase;
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski     /// Remember whether we are listening to the document.
144*b1cdbd2cSJim Jagielski     bool mbListeningToDocument;
145*b1cdbd2cSJim Jagielski     /// Remember whether we are listening to the UNO document.
146*b1cdbd2cSJim Jagielski     bool mbListeningToUNODocument;
147*b1cdbd2cSJim Jagielski     /// Remember whether we are listening to the UNO controller.
148*b1cdbd2cSJim Jagielski     bool mbListeningToController;
149*b1cdbd2cSJim Jagielski     /// Remember whether we are listening to the frame.
150*b1cdbd2cSJim Jagielski     bool mbListeningToFrame;
151*b1cdbd2cSJim Jagielski     bool mbIsMainViewChangePending;
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XController> mxControllerWeak;
154*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XFrame> mxFrameWeak;
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski     /** This object is used to lock the model between some
157*b1cdbd2cSJim Jagielski         events.  It is refernce counted in order to cope with events that
158*b1cdbd2cSJim Jagielski         are expected but never sent.
159*b1cdbd2cSJim Jagielski     */
160*b1cdbd2cSJim Jagielski     ::boost::shared_ptr<SlideSorterController::ModelChangeLock> mpModelChangeLock;
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski     void ReleaseListeners (void);
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski     /** Called when the edit mode has changed.  Update model accordingly.
165*b1cdbd2cSJim Jagielski     */
166*b1cdbd2cSJim Jagielski     void UpdateEditMode (void);
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski     /** Handle a change in the order of slides or when the set of slides has
169*b1cdbd2cSJim Jagielski         changed, i.e. a slide has been created.
170*b1cdbd2cSJim Jagielski     */
171*b1cdbd2cSJim Jagielski     void HandleModelChange (const SdrPage* pPage);
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski     /** Handle a modification to a shape on the given page.  When this is a
174*b1cdbd2cSJim Jagielski         regular page then update its preview.  When it is a master page then
175*b1cdbd2cSJim Jagielski         additionally update the previews of all pages linked to it.
176*b1cdbd2cSJim Jagielski     */
177*b1cdbd2cSJim Jagielski     void HandleShapeModification (const SdrPage* pPage);
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski     /** This method throws a DisposedException when the object has already been
180*b1cdbd2cSJim Jagielski         disposed.
181*b1cdbd2cSJim Jagielski     */
182*b1cdbd2cSJim Jagielski     void ThrowIfDisposed (void)
183*b1cdbd2cSJim Jagielski         throw (::com::sun::star::lang::DisposedException);
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     DECL_LINK(EventMultiplexerCallback, tools::EventMultiplexerEvent*);
186*b1cdbd2cSJim Jagielski };
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski } } } // end of namespace ::sd::slidesorter::controller
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski #endif
191