/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sd.hxx" #include #include #ifndef SD_ACCESSIBILITY_ACCESSIBLE_OUTLINE_EDIT_SOURCE_HXX #include #endif #include "OutlineView.hxx" #include namespace accessibility { AccessibleOutlineEditSource::AccessibleOutlineEditSource( SdrOutliner& rOutliner, SdrView& rView, OutlinerView& rOutlView, const ::Window& rViewWindow ) : mrView( rView ), mrWindow( rViewWindow ), mpOutliner( &rOutliner ), mpOutlinerView( &rOutlView ), mTextForwarder( rOutliner, 0 ), mViewForwarder( rOutlView ) { // register as listener - need to broadcast state change messages // Moved to ::GetTextForwarder() //rOutliner.SetNotifyHdl( LINK(this, AccessibleOutlineEditSource, NotifyHdl) ); StartListening(rOutliner); } AccessibleOutlineEditSource::~AccessibleOutlineEditSource() { if( mpOutliner ) mpOutliner->SetNotifyHdl( Link() ); Broadcast( TextHint( SFX_HINT_DYING ) ); } SvxEditSource* AccessibleOutlineEditSource::Clone() const { /*return NULL;*/ return new AccessibleOutlineEditSource(*mpOutliner, mrView, *mpOutlinerView, mrWindow); } SvxTextForwarder* AccessibleOutlineEditSource::GetTextForwarder() { // TODO: maybe suboptimal if( IsValid() ) { // Moved here to make sure that // the NotifyHandler was set on the current object. mpOutliner->SetNotifyHdl( LINK(this, AccessibleOutlineEditSource, NotifyHdl) ); return &mTextForwarder; } else return NULL; } SvxViewForwarder* AccessibleOutlineEditSource::GetViewForwarder() { // TODO: maybe suboptimal if( IsValid() ) return this; else return NULL; } SvxEditViewForwarder* AccessibleOutlineEditSource::GetEditViewForwarder( sal_Bool ) { // TODO: maybe suboptimal if( IsValid() ) { // ignore parameter, we're always in edit mode here return &mViewForwarder; } else return NULL; } void AccessibleOutlineEditSource::UpdateData() { // NOOP, since we're always working on the 'real' outliner, // i.e. changes are immediately reflected on the screen } SfxBroadcaster& AccessibleOutlineEditSource::GetBroadcaster() const { return *( const_cast< AccessibleOutlineEditSource* > (this) ); } sal_Bool AccessibleOutlineEditSource::IsValid() const { if( mpOutliner && mpOutlinerView ) { // Our view still on outliner? sal_uLong nCurrView, nViews; for( nCurrView=0, nViews=mpOutliner->GetViewCount(); nCurrViewGetView(nCurrView) == mpOutlinerView ) return sal_True; } } return sal_False; } Rectangle AccessibleOutlineEditSource::GetVisArea() const { if( IsValid() ) { SdrPaintWindow* pPaintWindow = mrView.FindPaintWindow(mrWindow); Rectangle aVisArea; if(pPaintWindow) { aVisArea = pPaintWindow->GetVisibleArea(); } MapMode aMapMode(mrWindow.GetMapMode()); aMapMode.SetOrigin(Point()); return mrWindow.LogicToPixel( aVisArea, aMapMode ); } return Rectangle(); } Point AccessibleOutlineEditSource::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const { if( IsValid() && mrView.GetModel() ) { Point aPoint( OutputDevice::LogicToLogic( rPoint, rMapMode, MapMode(mrView.GetModel()->GetScaleUnit()) ) ); MapMode aMapMode(mrWindow.GetMapMode()); aMapMode.SetOrigin(Point()); return mrWindow.LogicToPixel( aPoint, aMapMode ); } return Point(); } Point AccessibleOutlineEditSource::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const { if( IsValid() && mrView.GetModel() ) { MapMode aMapMode(mrWindow.GetMapMode()); aMapMode.SetOrigin(Point()); Point aPoint( mrWindow.PixelToLogic( rPoint, aMapMode ) ); return OutputDevice::LogicToLogic( aPoint, MapMode(mrView.GetModel()->GetScaleUnit()), rMapMode ); } return Point(); } void AccessibleOutlineEditSource::Notify( SfxBroadcaster& rBroadcaster, const SfxHint& rHint ) { bool bDispose = false; if( &rBroadcaster == mpOutliner ) { const SfxSimpleHint* pHint = dynamic_cast< const SfxSimpleHint * >( &rHint ); if( pHint && (pHint->GetId() == SFX_HINT_DYING) ) { bDispose = true; mpOutliner = NULL; } } else { const SdrHint* pSdrHint = dynamic_cast< const SdrHint* >( &rHint ); if( pSdrHint && ( pSdrHint->GetKind() == HINT_MODELCLEARED ) ) { // model is dying under us, going defunc bDispose = true; } } if( bDispose ) { if( mpOutliner ) mpOutliner->SetNotifyHdl( Link() ); mpOutliner = NULL; mpOutlinerView = NULL; Broadcast( TextHint( SFX_HINT_DYING ) ); } } IMPL_LINK(AccessibleOutlineEditSource, NotifyHdl, EENotify*, aNotify) { if( aNotify ) { ::std::auto_ptr< SfxHint > aHint( SvxEditSourceHelper::EENotification2Hint( aNotify) ); if( aHint.get() ) Broadcast( *aHint.get() ); } return 0; } } // end of namespace accessibility