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 // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_sd.hxx" 26*b1cdbd2cSJim Jagielski #include <editeng/unoedhlp.hxx> 27*b1cdbd2cSJim Jagielski #include <svx/svdoutl.hxx> 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski #ifndef SD_ACCESSIBILITY_ACCESSIBLE_OUTLINE_EDIT_SOURCE_HXX 30*b1cdbd2cSJim Jagielski #include <AccessibleOutlineEditSource.hxx> 31*b1cdbd2cSJim Jagielski #endif 32*b1cdbd2cSJim Jagielski #include "OutlineView.hxx" 33*b1cdbd2cSJim Jagielski #include <svx/sdrpaintwindow.hxx> 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski namespace accessibility 36*b1cdbd2cSJim Jagielski { 37*b1cdbd2cSJim Jagielski AccessibleOutlineEditSource(SdrOutliner & rOutliner,SdrView & rView,OutlinerView & rOutlView,const::Window & rViewWindow)38*b1cdbd2cSJim Jagielski AccessibleOutlineEditSource::AccessibleOutlineEditSource( 39*b1cdbd2cSJim Jagielski SdrOutliner& rOutliner, 40*b1cdbd2cSJim Jagielski SdrView& rView, 41*b1cdbd2cSJim Jagielski OutlinerView& rOutlView, 42*b1cdbd2cSJim Jagielski const ::Window& rViewWindow ) 43*b1cdbd2cSJim Jagielski : mrView( rView ), 44*b1cdbd2cSJim Jagielski mrWindow( rViewWindow ), 45*b1cdbd2cSJim Jagielski mpOutliner( &rOutliner ), 46*b1cdbd2cSJim Jagielski mpOutlinerView( &rOutlView ), 47*b1cdbd2cSJim Jagielski mTextForwarder( rOutliner, 0 ), 48*b1cdbd2cSJim Jagielski mViewForwarder( rOutlView ) 49*b1cdbd2cSJim Jagielski { 50*b1cdbd2cSJim Jagielski // register as listener - need to broadcast state change messages 51*b1cdbd2cSJim Jagielski StartListening(rOutliner); 52*b1cdbd2cSJim Jagielski } 53*b1cdbd2cSJim Jagielski ~AccessibleOutlineEditSource()54*b1cdbd2cSJim Jagielski AccessibleOutlineEditSource::~AccessibleOutlineEditSource() 55*b1cdbd2cSJim Jagielski { 56*b1cdbd2cSJim Jagielski if( mpOutliner ) 57*b1cdbd2cSJim Jagielski mpOutliner->SetNotifyHdl( Link() ); 58*b1cdbd2cSJim Jagielski Broadcast( TextHint( SFX_HINT_DYING ) ); 59*b1cdbd2cSJim Jagielski } 60*b1cdbd2cSJim Jagielski Clone() const61*b1cdbd2cSJim Jagielski SvxEditSource* AccessibleOutlineEditSource::Clone() const 62*b1cdbd2cSJim Jagielski { 63*b1cdbd2cSJim Jagielski return new AccessibleOutlineEditSource(*mpOutliner, mrView, *mpOutlinerView, mrWindow); 64*b1cdbd2cSJim Jagielski } 65*b1cdbd2cSJim Jagielski GetTextForwarder()66*b1cdbd2cSJim Jagielski SvxTextForwarder* AccessibleOutlineEditSource::GetTextForwarder() 67*b1cdbd2cSJim Jagielski { 68*b1cdbd2cSJim Jagielski // TODO: maybe suboptimal 69*b1cdbd2cSJim Jagielski if( IsValid() ) 70*b1cdbd2cSJim Jagielski { 71*b1cdbd2cSJim Jagielski // Moved here to make sure that 72*b1cdbd2cSJim Jagielski // the NotifyHandler was set on the current object. 73*b1cdbd2cSJim Jagielski mpOutliner->SetNotifyHdl( LINK(this, AccessibleOutlineEditSource, NotifyHdl) ); 74*b1cdbd2cSJim Jagielski return &mTextForwarder; 75*b1cdbd2cSJim Jagielski } 76*b1cdbd2cSJim Jagielski else 77*b1cdbd2cSJim Jagielski return NULL; 78*b1cdbd2cSJim Jagielski } 79*b1cdbd2cSJim Jagielski GetViewForwarder()80*b1cdbd2cSJim Jagielski SvxViewForwarder* AccessibleOutlineEditSource::GetViewForwarder() 81*b1cdbd2cSJim Jagielski { 82*b1cdbd2cSJim Jagielski // TODO: maybe suboptimal 83*b1cdbd2cSJim Jagielski if( IsValid() ) 84*b1cdbd2cSJim Jagielski return this; 85*b1cdbd2cSJim Jagielski else 86*b1cdbd2cSJim Jagielski return NULL; 87*b1cdbd2cSJim Jagielski } 88*b1cdbd2cSJim Jagielski GetEditViewForwarder(sal_Bool)89*b1cdbd2cSJim Jagielski SvxEditViewForwarder* AccessibleOutlineEditSource::GetEditViewForwarder( sal_Bool ) 90*b1cdbd2cSJim Jagielski { 91*b1cdbd2cSJim Jagielski // TODO: maybe suboptimal 92*b1cdbd2cSJim Jagielski if( IsValid() ) 93*b1cdbd2cSJim Jagielski { 94*b1cdbd2cSJim Jagielski // ignore parameter, we're always in edit mode here 95*b1cdbd2cSJim Jagielski return &mViewForwarder; 96*b1cdbd2cSJim Jagielski } 97*b1cdbd2cSJim Jagielski else 98*b1cdbd2cSJim Jagielski return NULL; 99*b1cdbd2cSJim Jagielski } 100*b1cdbd2cSJim Jagielski UpdateData()101*b1cdbd2cSJim Jagielski void AccessibleOutlineEditSource::UpdateData() 102*b1cdbd2cSJim Jagielski { 103*b1cdbd2cSJim Jagielski // NOOP, since we're always working on the 'real' outliner, 104*b1cdbd2cSJim Jagielski // i.e. changes are immediately reflected on the screen 105*b1cdbd2cSJim Jagielski } 106*b1cdbd2cSJim Jagielski GetBroadcaster() const107*b1cdbd2cSJim Jagielski SfxBroadcaster& AccessibleOutlineEditSource::GetBroadcaster() const 108*b1cdbd2cSJim Jagielski { 109*b1cdbd2cSJim Jagielski return *( const_cast< AccessibleOutlineEditSource* > (this) ); 110*b1cdbd2cSJim Jagielski } 111*b1cdbd2cSJim Jagielski IsValid() const112*b1cdbd2cSJim Jagielski sal_Bool AccessibleOutlineEditSource::IsValid() const 113*b1cdbd2cSJim Jagielski { 114*b1cdbd2cSJim Jagielski if( mpOutliner && mpOutlinerView ) 115*b1cdbd2cSJim Jagielski { 116*b1cdbd2cSJim Jagielski // Our view still on outliner? 117*b1cdbd2cSJim Jagielski sal_uLong nCurrView, nViews; 118*b1cdbd2cSJim Jagielski 119*b1cdbd2cSJim Jagielski for( nCurrView=0, nViews=mpOutliner->GetViewCount(); nCurrView<nViews; ++nCurrView ) 120*b1cdbd2cSJim Jagielski { 121*b1cdbd2cSJim Jagielski if( mpOutliner->GetView(nCurrView) == mpOutlinerView ) 122*b1cdbd2cSJim Jagielski return sal_True; 123*b1cdbd2cSJim Jagielski } 124*b1cdbd2cSJim Jagielski } 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski return sal_False; 127*b1cdbd2cSJim Jagielski } 128*b1cdbd2cSJim Jagielski GetVisArea() const129*b1cdbd2cSJim Jagielski Rectangle AccessibleOutlineEditSource::GetVisArea() const 130*b1cdbd2cSJim Jagielski { 131*b1cdbd2cSJim Jagielski if( IsValid() ) 132*b1cdbd2cSJim Jagielski { 133*b1cdbd2cSJim Jagielski SdrPaintWindow* pPaintWindow = mrView.FindPaintWindow(mrWindow); 134*b1cdbd2cSJim Jagielski Rectangle aVisArea; 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski if(pPaintWindow) 137*b1cdbd2cSJim Jagielski { 138*b1cdbd2cSJim Jagielski aVisArea = pPaintWindow->GetVisibleArea(); 139*b1cdbd2cSJim Jagielski } 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski MapMode aMapMode(mrWindow.GetMapMode()); 142*b1cdbd2cSJim Jagielski aMapMode.SetOrigin(Point()); 143*b1cdbd2cSJim Jagielski return mrWindow.LogicToPixel( aVisArea, aMapMode ); 144*b1cdbd2cSJim Jagielski } 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski return Rectangle(); 147*b1cdbd2cSJim Jagielski } 148*b1cdbd2cSJim Jagielski LogicToPixel(const Point & rPoint,const MapMode & rMapMode) const149*b1cdbd2cSJim Jagielski Point AccessibleOutlineEditSource::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const 150*b1cdbd2cSJim Jagielski { 151*b1cdbd2cSJim Jagielski if( IsValid() && mrView.GetModel() ) 152*b1cdbd2cSJim Jagielski { 153*b1cdbd2cSJim Jagielski Point aPoint( OutputDevice::LogicToLogic( rPoint, rMapMode, 154*b1cdbd2cSJim Jagielski MapMode(mrView.GetModel()->GetScaleUnit()) ) ); 155*b1cdbd2cSJim Jagielski MapMode aMapMode(mrWindow.GetMapMode()); 156*b1cdbd2cSJim Jagielski aMapMode.SetOrigin(Point()); 157*b1cdbd2cSJim Jagielski return mrWindow.LogicToPixel( aPoint, aMapMode ); 158*b1cdbd2cSJim Jagielski } 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski return Point(); 161*b1cdbd2cSJim Jagielski } 162*b1cdbd2cSJim Jagielski PixelToLogic(const Point & rPoint,const MapMode & rMapMode) const163*b1cdbd2cSJim Jagielski Point AccessibleOutlineEditSource::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const 164*b1cdbd2cSJim Jagielski { 165*b1cdbd2cSJim Jagielski if( IsValid() && mrView.GetModel() ) 166*b1cdbd2cSJim Jagielski { 167*b1cdbd2cSJim Jagielski MapMode aMapMode(mrWindow.GetMapMode()); 168*b1cdbd2cSJim Jagielski aMapMode.SetOrigin(Point()); 169*b1cdbd2cSJim Jagielski Point aPoint( mrWindow.PixelToLogic( rPoint, aMapMode ) ); 170*b1cdbd2cSJim Jagielski return OutputDevice::LogicToLogic( aPoint, 171*b1cdbd2cSJim Jagielski MapMode(mrView.GetModel()->GetScaleUnit()), 172*b1cdbd2cSJim Jagielski rMapMode ); 173*b1cdbd2cSJim Jagielski } 174*b1cdbd2cSJim Jagielski 175*b1cdbd2cSJim Jagielski return Point(); 176*b1cdbd2cSJim Jagielski } 177*b1cdbd2cSJim Jagielski Notify(SfxBroadcaster & rBroadcaster,const SfxHint & rHint)178*b1cdbd2cSJim Jagielski void AccessibleOutlineEditSource::Notify( SfxBroadcaster& rBroadcaster, const SfxHint& rHint ) 179*b1cdbd2cSJim Jagielski { 180*b1cdbd2cSJim Jagielski bool bDispose = false; 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski if( &rBroadcaster == mpOutliner ) 183*b1cdbd2cSJim Jagielski { 184*b1cdbd2cSJim Jagielski const SfxSimpleHint* pHint = dynamic_cast< const SfxSimpleHint * >( &rHint ); 185*b1cdbd2cSJim Jagielski if( pHint && (pHint->GetId() == SFX_HINT_DYING) ) 186*b1cdbd2cSJim Jagielski { 187*b1cdbd2cSJim Jagielski bDispose = true; 188*b1cdbd2cSJim Jagielski mpOutliner = NULL; 189*b1cdbd2cSJim Jagielski } 190*b1cdbd2cSJim Jagielski } 191*b1cdbd2cSJim Jagielski else 192*b1cdbd2cSJim Jagielski { 193*b1cdbd2cSJim Jagielski const SdrHint* pSdrHint = dynamic_cast< const SdrHint* >( &rHint ); 194*b1cdbd2cSJim Jagielski 195*b1cdbd2cSJim Jagielski if( pSdrHint && ( pSdrHint->GetKind() == HINT_MODELCLEARED ) ) 196*b1cdbd2cSJim Jagielski { 197*b1cdbd2cSJim Jagielski // model is dying under us, going defunc 198*b1cdbd2cSJim Jagielski bDispose = true; 199*b1cdbd2cSJim Jagielski } 200*b1cdbd2cSJim Jagielski } 201*b1cdbd2cSJim Jagielski 202*b1cdbd2cSJim Jagielski if( bDispose ) 203*b1cdbd2cSJim Jagielski { 204*b1cdbd2cSJim Jagielski if( mpOutliner ) 205*b1cdbd2cSJim Jagielski mpOutliner->SetNotifyHdl( Link() ); 206*b1cdbd2cSJim Jagielski mpOutliner = NULL; 207*b1cdbd2cSJim Jagielski mpOutlinerView = NULL; 208*b1cdbd2cSJim Jagielski Broadcast( TextHint( SFX_HINT_DYING ) ); 209*b1cdbd2cSJim Jagielski } 210*b1cdbd2cSJim Jagielski } 211*b1cdbd2cSJim Jagielski IMPL_LINK(AccessibleOutlineEditSource,NotifyHdl,EENotify *,aNotify)212*b1cdbd2cSJim Jagielski IMPL_LINK(AccessibleOutlineEditSource, NotifyHdl, EENotify*, aNotify) 213*b1cdbd2cSJim Jagielski { 214*b1cdbd2cSJim Jagielski if( aNotify ) 215*b1cdbd2cSJim Jagielski { 216*b1cdbd2cSJim Jagielski ::std::auto_ptr< SfxHint > aHint( SvxEditSourceHelper::EENotification2Hint( aNotify) ); 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski if( aHint.get() ) 219*b1cdbd2cSJim Jagielski Broadcast( *aHint.get() ); 220*b1cdbd2cSJim Jagielski } 221*b1cdbd2cSJim Jagielski 222*b1cdbd2cSJim Jagielski return 0; 223*b1cdbd2cSJim Jagielski } 224*b1cdbd2cSJim Jagielski 225*b1cdbd2cSJim Jagielski } // end of namespace accessibility 226