xref: /trunk/main/sd/source/ui/accessibility/AccessibleOutlineEditSource.cxx (revision 5b1900111deff329a5580f97b99b67a25168e53d)
1*5b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5b190011SAndrew Rist  * distributed with this work for additional information
6*5b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5b190011SAndrew Rist  * "License"); you may not use this file except in compliance
9*5b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*5b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*5b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5b190011SAndrew Rist  * software distributed under the License is distributed on an
15*5b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
17*5b190011SAndrew Rist  * specific language governing permissions and limitations
18*5b190011SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*5b190011SAndrew Rist  *************************************************************/
21*5b190011SAndrew Rist 
22*5b190011SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sd.hxx"
26cdf0e10cSrcweir #include <editeng/unoedhlp.hxx>
27cdf0e10cSrcweir #include <svx/svdoutl.hxx>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #ifndef SD_ACCESSIBILITY_ACCESSIBLE_OUTLINE_EDIT_SOURCE_HXX
30cdf0e10cSrcweir #include <AccessibleOutlineEditSource.hxx>
31cdf0e10cSrcweir #endif
32cdf0e10cSrcweir #include "OutlineView.hxx"
33cdf0e10cSrcweir #include <svx/sdrpaintwindow.hxx>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir namespace accessibility
36cdf0e10cSrcweir {
37cdf0e10cSrcweir 
38cdf0e10cSrcweir     AccessibleOutlineEditSource::AccessibleOutlineEditSource(
39cdf0e10cSrcweir         SdrOutliner&    rOutliner,
40cdf0e10cSrcweir         SdrView&        rView,
41cdf0e10cSrcweir         OutlinerView& rOutlView,
42cdf0e10cSrcweir         const ::Window& rViewWindow )
43cdf0e10cSrcweir         : mrView( rView ),
44cdf0e10cSrcweir           mrWindow( rViewWindow ),
45cdf0e10cSrcweir           mpOutliner( &rOutliner ),
46cdf0e10cSrcweir           mpOutlinerView( &rOutlView ),
47cdf0e10cSrcweir           mTextForwarder( rOutliner, 0 ),
48cdf0e10cSrcweir           mViewForwarder( rOutlView )
49cdf0e10cSrcweir     {
50cdf0e10cSrcweir         // register as listener - need to broadcast state change messages
51cdf0e10cSrcweir         rOutliner.SetNotifyHdl( LINK(this, AccessibleOutlineEditSource, NotifyHdl) );
52cdf0e10cSrcweir         StartListening(rOutliner);
53cdf0e10cSrcweir     }
54cdf0e10cSrcweir 
55cdf0e10cSrcweir     AccessibleOutlineEditSource::~AccessibleOutlineEditSource()
56cdf0e10cSrcweir     {
57cdf0e10cSrcweir         if( mpOutliner )
58cdf0e10cSrcweir             mpOutliner->SetNotifyHdl( Link() );
59cdf0e10cSrcweir         Broadcast( TextHint( SFX_HINT_DYING ) );
60cdf0e10cSrcweir     }
61cdf0e10cSrcweir 
62cdf0e10cSrcweir     SvxEditSource* AccessibleOutlineEditSource::Clone() const
63cdf0e10cSrcweir     {
64cdf0e10cSrcweir         return NULL;
65cdf0e10cSrcweir     }
66cdf0e10cSrcweir 
67cdf0e10cSrcweir     SvxTextForwarder* AccessibleOutlineEditSource::GetTextForwarder()
68cdf0e10cSrcweir     {
69cdf0e10cSrcweir         // TODO: maybe suboptimal
70cdf0e10cSrcweir         if( IsValid() )
71cdf0e10cSrcweir             return &mTextForwarder;
72cdf0e10cSrcweir         else
73cdf0e10cSrcweir             return NULL;
74cdf0e10cSrcweir     }
75cdf0e10cSrcweir 
76cdf0e10cSrcweir     SvxViewForwarder* AccessibleOutlineEditSource::GetViewForwarder()
77cdf0e10cSrcweir     {
78cdf0e10cSrcweir         // TODO: maybe suboptimal
79cdf0e10cSrcweir         if( IsValid() )
80cdf0e10cSrcweir             return this;
81cdf0e10cSrcweir         else
82cdf0e10cSrcweir             return NULL;
83cdf0e10cSrcweir     }
84cdf0e10cSrcweir 
85cdf0e10cSrcweir     SvxEditViewForwarder* AccessibleOutlineEditSource::GetEditViewForwarder( sal_Bool )
86cdf0e10cSrcweir     {
87cdf0e10cSrcweir         // TODO: maybe suboptimal
88cdf0e10cSrcweir         if( IsValid() )
89cdf0e10cSrcweir         {
90cdf0e10cSrcweir             // ignore parameter, we're always in edit mode here
91cdf0e10cSrcweir             return &mViewForwarder;
92cdf0e10cSrcweir         }
93cdf0e10cSrcweir         else
94cdf0e10cSrcweir             return NULL;
95cdf0e10cSrcweir     }
96cdf0e10cSrcweir 
97cdf0e10cSrcweir     void AccessibleOutlineEditSource::UpdateData()
98cdf0e10cSrcweir     {
99cdf0e10cSrcweir         // NOOP, since we're always working on the 'real' outliner,
100cdf0e10cSrcweir         // i.e. changes are immediately reflected on the screen
101cdf0e10cSrcweir     }
102cdf0e10cSrcweir 
103cdf0e10cSrcweir     SfxBroadcaster& AccessibleOutlineEditSource::GetBroadcaster() const
104cdf0e10cSrcweir     {
105cdf0e10cSrcweir         return *( const_cast< AccessibleOutlineEditSource* > (this) );
106cdf0e10cSrcweir     }
107cdf0e10cSrcweir 
108cdf0e10cSrcweir     sal_Bool AccessibleOutlineEditSource::IsValid() const
109cdf0e10cSrcweir     {
110cdf0e10cSrcweir         if( mpOutliner && mpOutlinerView )
111cdf0e10cSrcweir         {
112cdf0e10cSrcweir             // Our view still on outliner?
113cdf0e10cSrcweir             sal_uLong nCurrView, nViews;
114cdf0e10cSrcweir 
115cdf0e10cSrcweir             for( nCurrView=0, nViews=mpOutliner->GetViewCount(); nCurrView<nViews; ++nCurrView )
116cdf0e10cSrcweir             {
117cdf0e10cSrcweir                 if( mpOutliner->GetView(nCurrView) == mpOutlinerView )
118cdf0e10cSrcweir                     return sal_True;
119cdf0e10cSrcweir             }
120cdf0e10cSrcweir         }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir         return sal_False;
123cdf0e10cSrcweir     }
124cdf0e10cSrcweir 
125cdf0e10cSrcweir     Rectangle AccessibleOutlineEditSource::GetVisArea() const
126cdf0e10cSrcweir     {
127cdf0e10cSrcweir         if( IsValid() )
128cdf0e10cSrcweir         {
129cdf0e10cSrcweir             SdrPaintWindow* pPaintWindow = mrView.FindPaintWindow(mrWindow);
130cdf0e10cSrcweir             Rectangle aVisArea;
131cdf0e10cSrcweir 
132cdf0e10cSrcweir             if(pPaintWindow)
133cdf0e10cSrcweir             {
134cdf0e10cSrcweir                 aVisArea = pPaintWindow->GetVisibleArea();
135cdf0e10cSrcweir             }
136cdf0e10cSrcweir 
137cdf0e10cSrcweir             MapMode aMapMode(mrWindow.GetMapMode());
138cdf0e10cSrcweir             aMapMode.SetOrigin(Point());
139cdf0e10cSrcweir             return mrWindow.LogicToPixel( aVisArea, aMapMode );
140cdf0e10cSrcweir         }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir         return Rectangle();
143cdf0e10cSrcweir     }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir     Point AccessibleOutlineEditSource::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const
146cdf0e10cSrcweir     {
147cdf0e10cSrcweir         if( IsValid() && mrView.GetModel() )
148cdf0e10cSrcweir         {
149cdf0e10cSrcweir             Point aPoint( OutputDevice::LogicToLogic( rPoint, rMapMode,
150cdf0e10cSrcweir                                                       MapMode(mrView.GetModel()->GetScaleUnit()) ) );
151cdf0e10cSrcweir             MapMode aMapMode(mrWindow.GetMapMode());
152cdf0e10cSrcweir             aMapMode.SetOrigin(Point());
153cdf0e10cSrcweir             return mrWindow.LogicToPixel( aPoint, aMapMode );
154cdf0e10cSrcweir         }
155cdf0e10cSrcweir 
156cdf0e10cSrcweir         return Point();
157cdf0e10cSrcweir     }
158cdf0e10cSrcweir 
159cdf0e10cSrcweir     Point AccessibleOutlineEditSource::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const
160cdf0e10cSrcweir     {
161cdf0e10cSrcweir         if( IsValid() && mrView.GetModel() )
162cdf0e10cSrcweir         {
163cdf0e10cSrcweir             MapMode aMapMode(mrWindow.GetMapMode());
164cdf0e10cSrcweir             aMapMode.SetOrigin(Point());
165cdf0e10cSrcweir             Point aPoint( mrWindow.PixelToLogic( rPoint, aMapMode ) );
166cdf0e10cSrcweir             return OutputDevice::LogicToLogic( aPoint,
167cdf0e10cSrcweir                                                MapMode(mrView.GetModel()->GetScaleUnit()),
168cdf0e10cSrcweir                                                rMapMode );
169cdf0e10cSrcweir         }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir         return Point();
172cdf0e10cSrcweir     }
173cdf0e10cSrcweir 
174cdf0e10cSrcweir     void AccessibleOutlineEditSource::Notify( SfxBroadcaster& rBroadcaster, const SfxHint& rHint )
175cdf0e10cSrcweir     {
176cdf0e10cSrcweir         bool bDispose = false;
177cdf0e10cSrcweir 
178cdf0e10cSrcweir         if( &rBroadcaster == mpOutliner )
179cdf0e10cSrcweir         {
180cdf0e10cSrcweir             const SfxSimpleHint* pHint = dynamic_cast< const SfxSimpleHint * >( &rHint );
181cdf0e10cSrcweir             if( pHint && (pHint->GetId() == SFX_HINT_DYING) )
182cdf0e10cSrcweir             {
183cdf0e10cSrcweir                 bDispose = true;
184cdf0e10cSrcweir                 mpOutliner = NULL;
185cdf0e10cSrcweir             }
186cdf0e10cSrcweir         }
187cdf0e10cSrcweir         else
188cdf0e10cSrcweir         {
189cdf0e10cSrcweir             const SdrHint* pSdrHint = dynamic_cast< const SdrHint* >( &rHint );
190cdf0e10cSrcweir 
191cdf0e10cSrcweir             if( pSdrHint && ( pSdrHint->GetKind() == HINT_MODELCLEARED ) )
192cdf0e10cSrcweir             {
193cdf0e10cSrcweir                 // model is dying under us, going defunc
194cdf0e10cSrcweir                 bDispose = true;
195cdf0e10cSrcweir             }
196cdf0e10cSrcweir         }
197cdf0e10cSrcweir 
198cdf0e10cSrcweir         if( bDispose )
199cdf0e10cSrcweir         {
200cdf0e10cSrcweir             if( mpOutliner )
201cdf0e10cSrcweir                 mpOutliner->SetNotifyHdl( Link() );
202cdf0e10cSrcweir             mpOutliner = NULL;
203cdf0e10cSrcweir             mpOutlinerView = NULL;
204cdf0e10cSrcweir             Broadcast( TextHint( SFX_HINT_DYING ) );
205cdf0e10cSrcweir         }
206cdf0e10cSrcweir     }
207cdf0e10cSrcweir 
208cdf0e10cSrcweir     IMPL_LINK(AccessibleOutlineEditSource, NotifyHdl, EENotify*, aNotify)
209cdf0e10cSrcweir     {
210cdf0e10cSrcweir         if( aNotify )
211cdf0e10cSrcweir         {
212cdf0e10cSrcweir             ::std::auto_ptr< SfxHint > aHint( SvxEditSourceHelper::EENotification2Hint( aNotify) );
213cdf0e10cSrcweir 
214cdf0e10cSrcweir             if( aHint.get() )
215cdf0e10cSrcweir                 Broadcast( *aHint.get() );
216cdf0e10cSrcweir         }
217cdf0e10cSrcweir 
218cdf0e10cSrcweir         return 0;
219cdf0e10cSrcweir     }
220cdf0e10cSrcweir 
221cdf0e10cSrcweir } // end of namespace accessibility
222