Files
libreoffice/sw/source/core/access/accfrmobj.cxx

435 lines
11 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
re-base on ALv2 code. Includes: Patches contributed by Oliver-Rainer Wittmann sw34bf06: #i117783# - Writer's implementation of XPagePrintable - apply print settings to new printing routines http://svn.apache.org/viewvc?view=revision&revision=1172115 sw34bf06: #o12311627# use <rtl_random> methods to create unique ids for list styles and list ids http://svn.apache.org/viewvc?view=revision&revision=1172112 sw34bf06 #i114725#,#i115828# - method <SwDoc::ClearDoc()> - clear list structures completely http://svn.apache.org/viewvc?view=revision&revision=1172122 i#118572 - remove ui string and help content regarding usage of Java Mail in Writer's Mail Merge as Java Mail is not used. http://svn.apache.org/viewvc?view=revision&revision=1197035 Patches contributed by Mathias Bauer cws mba34issues01: #i117718#: provide filter name in case storage of medium does not allow to detect one http://svn.apache.org/viewvc?view=revision&revision=1172350 cws mba34issues01: #i117721#: directly provide parameters retrieved from SfxMedium http://svn.apache.org/viewvc?view=revision&revision=1172353 gnumake4 work variously http://svn.apache.org/viewvc?view=revision&revision=1394707 http://svn.apache.org/viewvc?view=revision&revision=1394326 http://svn.apache.org/viewvc?view=revision&revision=1396797 http://svn.apache.org/viewvc?view=revision&revision=1397315 cws mba34issues01: #i117723#: convert assertion into trace http://svn.apache.org/viewvc?view=revision&revision=1172355 cws mba34issues01: #i117699#: keep layout alive until swdoc dies http://svn.apache.org/viewvc?view=revision&revision=1172362 cws mba34issues01: #i117943#: missing color attributes in RTF clipboard http://svn.apache.org/viewvc?view=revision&revision=1172363 Patch contributed by Henning Brinkmann imported patch i#103878 http://svn.apache.org/viewvc?view=revision&revision=1172109 Patches contributed by Michael Stahl sw34bf06: #i117955#: WW8 export: disable storing of section breaks in endnotes http://svn.apache.org/viewvc?view=revision&revision=1172119 Patch contributed by imacat Fixed the Asian language work count. http://svn.apache.org/viewvc?view=revision&revision=1241345 Patch contributed by Pedro Giffuni i#20878 - Add comment with BZ issue for reference. http://svn.apache.org/viewvc?view=revision&revision=1244517 Patch contributed by Andre Fischer Do not add targets for junit tests when junit is disabled. http://svn.apache.org/viewvc?view=revision&revision=1241508 add writerperfect dependency.
2011-03-31 10:05:04 +02:00
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
2002-04-05 11:08:57 +00:00
#include <accfrmobj.hxx>
#include <accmap.hxx>
#include <acccontext.hxx>
2002-04-05 11:08:57 +00:00
#include <viewsh.hxx>
#include <rootfrm.hxx>
#include <flyfrm.hxx>
#include <pagefrm.hxx>
#include <cellfrm.hxx>
#include <swtable.hxx>
#include <dflyobj.hxx>
2002-05-15 12:22:47 +00:00
#include <frmfmt.hxx>
#include <fmtanchr.hxx>
#include <dcontact.hxx>
#include <pam.hxx>
#include <vcl/window.hxx>
namespace sw { namespace access {
SwAccessibleChild::SwAccessibleChild()
2010-02-02 16:39:44 +01:00
: mpFrm( 0 )
, mpDrawObj( 0 )
, mpWindow( 0 )
{}
SwAccessibleChild::SwAccessibleChild( const SdrObject* pDrawObj )
: mpFrm( 0 )
, mpDrawObj( 0 )
, mpWindow( 0 )
{
Init( pDrawObj );
}
SwAccessibleChild::SwAccessibleChild( const SwFrm* pFrm )
: mpFrm( 0 )
, mpDrawObj( 0 )
, mpWindow( 0 )
{
Init( pFrm );
}
SwAccessibleChild::SwAccessibleChild( Window* pWindow )
: mpFrm( 0 )
, mpDrawObj( 0 )
, mpWindow( 0 )
{
Init( pWindow );
}
SwAccessibleChild::SwAccessibleChild( const SwFrm* pFrm,
const SdrObject* pDrawObj,
Window* pWindow )
{
if ( pFrm )
{
Init( pFrm );
}
else if ( pDrawObj )
{
Init( pDrawObj );
}
else if ( pWindow )
{
Init( pWindow );
}
OSL_ENSURE( (!pFrm || pFrm == mpFrm) &&
(!pDrawObj || pDrawObj == mpDrawObj) &&
(!pWindow || pWindow == mpWindow),
"invalid frame/object/window combination" );
}
void SwAccessibleChild::Init( const SdrObject* pDrawObj )
{
mpDrawObj = pDrawObj;
mpFrm = mpDrawObj && mpDrawObj->ISA(SwVirtFlyDrawObj)
? static_cast < const SwVirtFlyDrawObj * >( mpDrawObj )->GetFlyFrm()
: 0;
mpWindow = 0;
}
void SwAccessibleChild::Init( const SwFrm* pFrm )
{
mpFrm = pFrm;
mpDrawObj = mpFrm && mpFrm->IsFlyFrm()
? static_cast < const SwFlyFrm * >( mpFrm )->GetVirtDrawObj()
: 0;
mpWindow = 0;
}
void SwAccessibleChild::Init( Window* pWindow )
{
mpWindow = pWindow;
mpFrm = 0;
mpDrawObj = 0;
}
bool SwAccessibleChild::IsAccessible( sal_Bool bPagePreview ) const
{
bool bRet( false );
if ( mpFrm )
{
bRet = mpFrm->IsAccessibleFrm() &&
( !mpFrm->IsCellFrm() ||
static_cast<const SwCellFrm *>( mpFrm )->GetTabBox()->GetSttNd() != 0 ) &&
!mpFrm->IsInCoveredCell() &&
( bPagePreview ||
!mpFrm->IsPageFrm() );
}
else if ( mpDrawObj )
{
bRet = true;
}
else if ( mpWindow )
{
bRet = true;
}
return bRet;
}
bool SwAccessibleChild::IsBoundAsChar() const
{
bool bRet( false );
if ( mpFrm )
{
bRet = mpFrm->IsFlyFrm() &&
static_cast< const SwFlyFrm *>(mpFrm)->IsFlyInCntFrm();
}
else if ( mpDrawObj )
{
const SwFrmFmt* mpFrmFmt = ::FindFrmFmt( mpDrawObj );
bRet = mpFrmFmt
? (FLY_AS_CHAR == mpFrmFmt->GetAnchor().GetAnchorId())
: false;
}
else if ( mpWindow )
{
bRet = false;
}
return bRet;
}
sal_uInt32 SwAccessibleChild::GetAnchorPosition() const
{
if( mpDrawObj )
{
const SwFrmFmt *pFrmFmt = ::FindFrmFmt( mpDrawObj );
if ( pFrmFmt )
{
const SwPosition *pPos = pFrmFmt->GetAnchor().GetCntntAnchor();
if ( pPos )
{
return pPos->nContent.GetIndex();
}
}
}
return 0;
}
SwAccessibleChild::SwAccessibleChild( const SwAccessibleChild& r )
: mpFrm( r.mpFrm )
, mpDrawObj( r.mpDrawObj )
, mpWindow( r.mpWindow )
{}
SwAccessibleChild& SwAccessibleChild::operator=( const SwAccessibleChild& r )
{
mpDrawObj = r.mpDrawObj;
mpFrm = r.mpFrm;
mpWindow = r.mpWindow;
return *this;
}
SwAccessibleChild& SwAccessibleChild::operator=( const SdrObject* pDrawObj )
{
Init( pDrawObj );
return *this;
}
SwAccessibleChild& SwAccessibleChild::operator=( const SwFrm* pFrm )
{
Init( pFrm );
return *this;
}
SwAccessibleChild& SwAccessibleChild::operator=( Window* pWindow )
{
Init( pWindow );
return *this;
}
bool SwAccessibleChild::operator==( const SwAccessibleChild& r ) const
{
return mpFrm == r.mpFrm &&
mpDrawObj == r.mpDrawObj &&
mpWindow == r.mpWindow;
}
2002-04-05 11:08:57 +00:00
bool SwAccessibleChild::IsValid() const
2002-04-05 11:08:57 +00:00
{
return mpFrm != 0 ||
mpDrawObj != 0 ||
mpWindow != 0;
}
const SdrObject* SwAccessibleChild::GetDrawObject() const
{
return mpDrawObj;
}
const SwFrm *SwAccessibleChild::GetSwFrm() const
{
return mpFrm;
}
Window* SwAccessibleChild::GetWindow() const
{
return mpWindow;
}
bool SwAccessibleChild::IsVisibleChildrenOnly() const
{
bool bRet( false );
if ( !mpFrm )
2002-04-05 11:08:57 +00:00
{
bRet = true;
2002-04-05 11:08:57 +00:00
}
else
{
bRet = mpFrm->IsRootFrm() ||
!( mpFrm->IsTabFrm() ||
mpFrm->IsInTab() ||
( IsBoundAsChar() &&
static_cast<const SwFlyFrm*>(mpFrm)->GetAnchorFrm()->IsInTab() ) );
2002-04-05 11:08:57 +00:00
}
return bRet;
2002-04-05 11:08:57 +00:00
}
SwRect SwAccessibleChild::GetBox( const SwAccessibleMap& rAccMap ) const
{
SwRect aBox;
if ( mpFrm )
{
if ( mpFrm->IsPageFrm() &&
static_cast< const SwPageFrm * >( mpFrm )->IsEmptyPage() )
{
aBox = SwRect( mpFrm->Frm().Left(), mpFrm->Frm().Top()-1, 1, 1 );
}
else if ( mpFrm->IsTabFrm() )
{
aBox = SwRect( mpFrm->Frm() );
aBox.Intersection( mpFrm->GetUpper()->Frm() );
}
else
{
aBox = mpFrm->Frm();
}
}
else if( mpDrawObj )
{
aBox = SwRect( mpDrawObj->GetCurrentBoundRect() );
}
else if ( mpWindow )
{
aBox = SwRect( rAccMap.GetShell()->GetWin()->PixelToLogic(
Rectangle( mpWindow->GetPosPixel(),
mpWindow->GetSizePixel() ) ) );
}
return aBox;
}
SwRect SwAccessibleChild::GetBounds( const SwAccessibleMap& rAccMap ) const
{
SwRect aBound;
if( mpFrm )
{
if( mpFrm->IsPageFrm() &&
static_cast< const SwPageFrm * >( mpFrm )->IsEmptyPage() )
{
aBound = SwRect( mpFrm->Frm().Left(), mpFrm->Frm().Top()-1, 0, 0 );
}
else
aBound = mpFrm->PaintArea();
}
else if( mpDrawObj )
{
aBound = GetBox( rAccMap );
}
else if ( mpWindow )
{
aBound = GetBox( rAccMap );
}
return aBound;
}
bool SwAccessibleChild::AlwaysIncludeAsChild() const
{
bool bAlwaysIncludedAsChild( false );
if ( mpWindow )
{
bAlwaysIncludedAsChild = true;
}
return bAlwaysIncludedAsChild;
}
const SwFrm* SwAccessibleChild::GetParent( const sal_Bool bInPagePreview ) const
{
const SwFrm* pParent( 0 );
if ( mpFrm )
{
if( mpFrm->IsFlyFrm() )
{
const SwFlyFrm* pFly = static_cast< const SwFlyFrm *>( mpFrm );
if( pFly->IsFlyInCntFrm() )
{
// For FLY_AS_CHAR the parent is the anchor
pParent = pFly->GetAnchorFrm();
OSL_ENSURE( SwAccessibleChild( pParent ).IsAccessible( bInPagePreview ),
"parent is not accessible" );
}
else
{
// In any other case the parent is the root frm
// (in page preview, the page frame)
if( bInPagePreview )
pParent = pFly->FindPageFrm();
else
pParent = pFly->getRootFrm();
}
}
else
{
SwAccessibleChild aUpper( mpFrm->GetUpper() );
while( aUpper.GetSwFrm() && !aUpper.IsAccessible(bInPagePreview) )
{
aUpper = aUpper.GetSwFrm()->GetUpper();
}
pParent = aUpper.GetSwFrm();
}
}
else if( mpDrawObj )
{
const SwDrawContact *pContact =
static_cast< const SwDrawContact* >( GetUserCall( mpDrawObj ) );
OSL_ENSURE( pContact, "sdr contact is missing" );
if( pContact )
{
const SwFrmFmt *pFrmFmt = pContact->GetFmt();
OSL_ENSURE( pFrmFmt, "frame format is missing" );
if( pFrmFmt && FLY_AS_CHAR == pFrmFmt->GetAnchor().GetAnchorId() )
{
// For FLY_AS_CHAR the parent is the anchor
pParent = pContact->GetAnchorFrm();
OSL_ENSURE( SwAccessibleChild( pParent ).IsAccessible( bInPagePreview ),
"parent is not accessible" );
}
else
{
// In any other case the parent is the root frm
if( bInPagePreview )
pParent = pContact->GetAnchorFrm()->FindPageFrm();
else
pParent = pContact->GetAnchorFrm()->getRootFrm();
}
}
}
else if ( mpWindow )
{
css::uno::Reference < css::accessibility::XAccessible > xAcc =
mpWindow->GetAccessible();
if ( xAcc.is() )
{
css::uno::Reference < css::accessibility::XAccessibleContext > xAccContext =
xAcc->getAccessibleContext();
if ( xAccContext.is() )
{
css::uno::Reference < css::accessibility::XAccessible > xAccParent =
xAccContext->getAccessibleParent();
if ( xAccParent.is() )
{
SwAccessibleContext* pAccParentImpl =
dynamic_cast< SwAccessibleContext *>( xAccParent.get() );
if ( pAccParentImpl )
{
pParent = pAccParentImpl->GetFrm();
}
}
}
}
}
return pParent;
}
} } // eof of namespace sw::access
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */