xref: /trunk/main/sd/source/ui/accessibility/AccessibleOutlineEditSource.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
15b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
35b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
45b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
55b190011SAndrew Rist  * distributed with this work for additional information
65b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
75b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
85b190011SAndrew Rist  * "License"); you may not use this file except in compliance
95b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
115b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
135b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
145b190011SAndrew Rist  * software distributed under the License is distributed on an
155b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
175b190011SAndrew Rist  * specific language governing permissions and limitations
185b190011SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
205b190011SAndrew Rist  *************************************************************/
215b190011SAndrew Rist 
225b190011SAndrew 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 
AccessibleOutlineEditSource(SdrOutliner & rOutliner,SdrView & rView,OutlinerView & rOutlView,const::Window & rViewWindow)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         StartListening(rOutliner);
52cdf0e10cSrcweir     }
53cdf0e10cSrcweir 
~AccessibleOutlineEditSource()54cdf0e10cSrcweir     AccessibleOutlineEditSource::~AccessibleOutlineEditSource()
55cdf0e10cSrcweir     {
56cdf0e10cSrcweir         if( mpOutliner )
57cdf0e10cSrcweir             mpOutliner->SetNotifyHdl( Link() );
58cdf0e10cSrcweir         Broadcast( TextHint( SFX_HINT_DYING ) );
59cdf0e10cSrcweir     }
60cdf0e10cSrcweir 
Clone() const61cdf0e10cSrcweir     SvxEditSource* AccessibleOutlineEditSource::Clone() const
62cdf0e10cSrcweir     {
63*0deba7fbSSteve Yin         return new AccessibleOutlineEditSource(*mpOutliner, mrView, *mpOutlinerView, mrWindow);
64cdf0e10cSrcweir     }
65cdf0e10cSrcweir 
GetTextForwarder()66cdf0e10cSrcweir     SvxTextForwarder* AccessibleOutlineEditSource::GetTextForwarder()
67cdf0e10cSrcweir     {
68cdf0e10cSrcweir         // TODO: maybe suboptimal
69cdf0e10cSrcweir         if( IsValid() )
70*0deba7fbSSteve Yin         {
71*0deba7fbSSteve Yin             // Moved here to make sure that
72*0deba7fbSSteve Yin             // the NotifyHandler was set on the current object.
73*0deba7fbSSteve Yin             mpOutliner->SetNotifyHdl( LINK(this, AccessibleOutlineEditSource, NotifyHdl) );
74cdf0e10cSrcweir             return &mTextForwarder;
75*0deba7fbSSteve Yin         }
76cdf0e10cSrcweir         else
77cdf0e10cSrcweir             return NULL;
78cdf0e10cSrcweir     }
79cdf0e10cSrcweir 
GetViewForwarder()80cdf0e10cSrcweir     SvxViewForwarder* AccessibleOutlineEditSource::GetViewForwarder()
81cdf0e10cSrcweir     {
82cdf0e10cSrcweir         // TODO: maybe suboptimal
83cdf0e10cSrcweir         if( IsValid() )
84cdf0e10cSrcweir             return this;
85cdf0e10cSrcweir         else
86cdf0e10cSrcweir             return NULL;
87cdf0e10cSrcweir     }
88cdf0e10cSrcweir 
GetEditViewForwarder(sal_Bool)89cdf0e10cSrcweir     SvxEditViewForwarder* AccessibleOutlineEditSource::GetEditViewForwarder( sal_Bool )
90cdf0e10cSrcweir     {
91cdf0e10cSrcweir         // TODO: maybe suboptimal
92cdf0e10cSrcweir         if( IsValid() )
93cdf0e10cSrcweir         {
94cdf0e10cSrcweir             // ignore parameter, we're always in edit mode here
95cdf0e10cSrcweir             return &mViewForwarder;
96cdf0e10cSrcweir         }
97cdf0e10cSrcweir         else
98cdf0e10cSrcweir             return NULL;
99cdf0e10cSrcweir     }
100cdf0e10cSrcweir 
UpdateData()101cdf0e10cSrcweir     void AccessibleOutlineEditSource::UpdateData()
102cdf0e10cSrcweir     {
103cdf0e10cSrcweir         // NOOP, since we're always working on the 'real' outliner,
104cdf0e10cSrcweir         // i.e. changes are immediately reflected on the screen
105cdf0e10cSrcweir     }
106cdf0e10cSrcweir 
GetBroadcaster() const107cdf0e10cSrcweir     SfxBroadcaster& AccessibleOutlineEditSource::GetBroadcaster() const
108cdf0e10cSrcweir     {
109cdf0e10cSrcweir         return *( const_cast< AccessibleOutlineEditSource* > (this) );
110cdf0e10cSrcweir     }
111cdf0e10cSrcweir 
IsValid() const112cdf0e10cSrcweir     sal_Bool AccessibleOutlineEditSource::IsValid() const
113cdf0e10cSrcweir     {
114cdf0e10cSrcweir         if( mpOutliner && mpOutlinerView )
115cdf0e10cSrcweir         {
116cdf0e10cSrcweir             // Our view still on outliner?
117cdf0e10cSrcweir             sal_uLong nCurrView, nViews;
118cdf0e10cSrcweir 
119cdf0e10cSrcweir             for( nCurrView=0, nViews=mpOutliner->GetViewCount(); nCurrView<nViews; ++nCurrView )
120cdf0e10cSrcweir             {
121cdf0e10cSrcweir                 if( mpOutliner->GetView(nCurrView) == mpOutlinerView )
122cdf0e10cSrcweir                     return sal_True;
123cdf0e10cSrcweir             }
124cdf0e10cSrcweir         }
125cdf0e10cSrcweir 
126cdf0e10cSrcweir         return sal_False;
127cdf0e10cSrcweir     }
128cdf0e10cSrcweir 
GetVisArea() const129cdf0e10cSrcweir     Rectangle AccessibleOutlineEditSource::GetVisArea() const
130cdf0e10cSrcweir     {
131cdf0e10cSrcweir         if( IsValid() )
132cdf0e10cSrcweir         {
133cdf0e10cSrcweir             SdrPaintWindow* pPaintWindow = mrView.FindPaintWindow(mrWindow);
134cdf0e10cSrcweir             Rectangle aVisArea;
135cdf0e10cSrcweir 
136cdf0e10cSrcweir             if(pPaintWindow)
137cdf0e10cSrcweir             {
138cdf0e10cSrcweir                 aVisArea = pPaintWindow->GetVisibleArea();
139cdf0e10cSrcweir             }
140cdf0e10cSrcweir 
141cdf0e10cSrcweir             MapMode aMapMode(mrWindow.GetMapMode());
142cdf0e10cSrcweir             aMapMode.SetOrigin(Point());
143cdf0e10cSrcweir             return mrWindow.LogicToPixel( aVisArea, aMapMode );
144cdf0e10cSrcweir         }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir         return Rectangle();
147cdf0e10cSrcweir     }
148cdf0e10cSrcweir 
LogicToPixel(const Point & rPoint,const MapMode & rMapMode) const149cdf0e10cSrcweir     Point AccessibleOutlineEditSource::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const
150cdf0e10cSrcweir     {
151cdf0e10cSrcweir         if( IsValid() && mrView.GetModel() )
152cdf0e10cSrcweir         {
153cdf0e10cSrcweir             Point aPoint( OutputDevice::LogicToLogic( rPoint, rMapMode,
154cdf0e10cSrcweir                                                       MapMode(mrView.GetModel()->GetScaleUnit()) ) );
155cdf0e10cSrcweir             MapMode aMapMode(mrWindow.GetMapMode());
156cdf0e10cSrcweir             aMapMode.SetOrigin(Point());
157cdf0e10cSrcweir             return mrWindow.LogicToPixel( aPoint, aMapMode );
158cdf0e10cSrcweir         }
159cdf0e10cSrcweir 
160cdf0e10cSrcweir         return Point();
161cdf0e10cSrcweir     }
162cdf0e10cSrcweir 
PixelToLogic(const Point & rPoint,const MapMode & rMapMode) const163cdf0e10cSrcweir     Point AccessibleOutlineEditSource::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const
164cdf0e10cSrcweir     {
165cdf0e10cSrcweir         if( IsValid() && mrView.GetModel() )
166cdf0e10cSrcweir         {
167cdf0e10cSrcweir             MapMode aMapMode(mrWindow.GetMapMode());
168cdf0e10cSrcweir             aMapMode.SetOrigin(Point());
169cdf0e10cSrcweir             Point aPoint( mrWindow.PixelToLogic( rPoint, aMapMode ) );
170cdf0e10cSrcweir             return OutputDevice::LogicToLogic( aPoint,
171cdf0e10cSrcweir                                                MapMode(mrView.GetModel()->GetScaleUnit()),
172cdf0e10cSrcweir                                                rMapMode );
173cdf0e10cSrcweir         }
174cdf0e10cSrcweir 
175cdf0e10cSrcweir         return Point();
176cdf0e10cSrcweir     }
177cdf0e10cSrcweir 
Notify(SfxBroadcaster & rBroadcaster,const SfxHint & rHint)178cdf0e10cSrcweir     void AccessibleOutlineEditSource::Notify( SfxBroadcaster& rBroadcaster, const SfxHint& rHint )
179cdf0e10cSrcweir     {
180cdf0e10cSrcweir         bool bDispose = false;
181cdf0e10cSrcweir 
182cdf0e10cSrcweir         if( &rBroadcaster == mpOutliner )
183cdf0e10cSrcweir         {
184cdf0e10cSrcweir             const SfxSimpleHint* pHint = dynamic_cast< const SfxSimpleHint * >( &rHint );
185cdf0e10cSrcweir             if( pHint && (pHint->GetId() == SFX_HINT_DYING) )
186cdf0e10cSrcweir             {
187cdf0e10cSrcweir                 bDispose = true;
188cdf0e10cSrcweir                 mpOutliner = NULL;
189cdf0e10cSrcweir             }
190cdf0e10cSrcweir         }
191cdf0e10cSrcweir         else
192cdf0e10cSrcweir         {
193cdf0e10cSrcweir             const SdrHint* pSdrHint = dynamic_cast< const SdrHint* >( &rHint );
194cdf0e10cSrcweir 
195cdf0e10cSrcweir             if( pSdrHint && ( pSdrHint->GetKind() == HINT_MODELCLEARED ) )
196cdf0e10cSrcweir             {
197cdf0e10cSrcweir                 // model is dying under us, going defunc
198cdf0e10cSrcweir                 bDispose = true;
199cdf0e10cSrcweir             }
200cdf0e10cSrcweir         }
201cdf0e10cSrcweir 
202cdf0e10cSrcweir         if( bDispose )
203cdf0e10cSrcweir         {
204cdf0e10cSrcweir             if( mpOutliner )
205cdf0e10cSrcweir                 mpOutliner->SetNotifyHdl( Link() );
206cdf0e10cSrcweir             mpOutliner = NULL;
207cdf0e10cSrcweir             mpOutlinerView = NULL;
208cdf0e10cSrcweir             Broadcast( TextHint( SFX_HINT_DYING ) );
209cdf0e10cSrcweir         }
210cdf0e10cSrcweir     }
211cdf0e10cSrcweir 
IMPL_LINK(AccessibleOutlineEditSource,NotifyHdl,EENotify *,aNotify)212cdf0e10cSrcweir     IMPL_LINK(AccessibleOutlineEditSource, NotifyHdl, EENotify*, aNotify)
213cdf0e10cSrcweir     {
214cdf0e10cSrcweir         if( aNotify )
215cdf0e10cSrcweir         {
216cdf0e10cSrcweir             ::std::auto_ptr< SfxHint > aHint( SvxEditSourceHelper::EENotification2Hint( aNotify) );
217cdf0e10cSrcweir 
218cdf0e10cSrcweir             if( aHint.get() )
219cdf0e10cSrcweir                 Broadcast( *aHint.get() );
220cdf0e10cSrcweir         }
221cdf0e10cSrcweir 
222cdf0e10cSrcweir         return 0;
223cdf0e10cSrcweir     }
224cdf0e10cSrcweir 
225cdf0e10cSrcweir } // end of namespace accessibility
226