2010-10-12 15:53:47 +02:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
re-base on ALv2 code. Includes (at least) relevant parts of:
linecap: Reintegrating finished LineCap feature
Patch contributed by Regina Henschel
http://svn.apache.org/viewvc?view=revision&revision=1232507
Patches contributed by Sven Jacobi
impress212: #i81610# fixed animation export
http://svn.apache.org/viewvc?view=revision&revision=1167620
impress212: drawinglayer gbuild environment changes
http://svn.apache.org/viewvc?view=revision&revision=1167627
http://svn.apache.org/viewvc?view=revision&revision=1167628
impress212: DffPropSet -> minor code improvements, removing table
http://svn.apache.org/viewvc?view=revision&revision=1167634
impress212: #158494# fixed excel import (text rotation)
http://svn.apache.org/viewvc?view=revision&revision=1167638
Patches contributed by Armin Le Grand
Svg: Reintegrated Svg replacement from /branches/alg/svgreplavement
http://svn.apache.org/viewvc?view=revision&revision=1220836
#118728# changed indentifying definitions for Svg file detection
http://svn.apache.org/viewvc?view=revision&revision=1229961
#118838# LineGeometry creation for complicated cases optimized to
create single Polygons
http://svn.apache.org/viewvc?view=revision&revision=1236232
#119176# corrected file type detection for SVG for svg files
without xml header
http://svn.apache.org/viewvc?view=revision&revision=1309445
#118728# Extended Svg file detection
http://svn.apache.org/viewvc?view=revision&revision=1230531
#118529# solve break converters and convert commands for OLEs and images
http://svn.apache.org/viewvc?view=revision&revision=1186168
svg: added WaE changes from branch svgreplacement to trunc
http://svn.apache.org/viewvc?view=revision&revision=1222974
svg: corrected missing member initialization
http://svn.apache.org/viewvc?view=revision&revision=1226134
fix for #118525#: Using primitives for chart sub-geometry visualisation
http://svn.apache.org/viewvc?view=revision&revision=1226879
#118898# Adapted ImpGraphic::ImplGetBitmap to correctly convert
metafiles to bitmapEx ...
http://svn.apache.org/viewvc?view=revision&revision=1293316
fix for #118525#: removed no longer used variable maOriginalMapMode, one
more exception eliminated
http://svn.apache.org/viewvc?view=revision&revision=1227097
#16758# Added buffering to the VDev usages of the VclProcessor2D derivates...
http://svn.apache.org/viewvc?view=revision&revision=1229521
#116758# Secured VDev buffer device to Vcl deinit
http://svn.apache.org/viewvc?view=revision&revision=1230574
#116758# added remembering allocated VDevs for VDevBuffer to be able to also
delete these when vcl goes down; it should never happen, but You never know
http://svn.apache.org/viewvc?view=revision&revision=1230927
#118730# Changed SvgClipPathNode to use MaskPrimitive2D for primitive
representation instead of TransparencePrimitive2D
http://svn.apache.org/viewvc?view=revision&revision=1231198
#118822# secured 3D geometry creation (slices) by subdividing the 2D
source polyPolygon early
http://svn.apache.org/viewvc?view=revision&revision=1234749
#118829# enhanced Svg gradient quality, obstacles avoided
http://svn.apache.org/viewvc?view=revision&revision=1235361
#118834# Unified usage of TextBreakupHelper as single tooling class
for i18n text primitive breakup
http://svn.apache.org/viewvc?view=revision&revision=1236110
#118853# added square pixel size limit to conversion of
TransparencePrimitive2D to Metafile action
http://svn.apache.org/viewvc?view=revision&revision=1237656
#118824# coreccted mirroring and boundrect when the graphicmanager
is used for bitmap output
http://svn.apache.org/viewvc?view=revision&revision=1240097
#115092# Corrected VclProcessor2D::RenderPolygonStrokePrimitive2D for
various optimization scenarios
http://svn.apache.org/viewvc?view=revision&revision=1241434
#118783# Corrected errors in ID strings, corrected Svg line/fill export,
corrected polygon close state
http://svn.apache.org/viewvc?view=revision&revision=1232006
#118796# corrected null-pointer usage in SVG text exporter
http://svn.apache.org/viewvc?view=revision&revision=1240262
#118729# Use GraphicStreamUrl and GraphicUrl to allow multi image
import with linked graphics, too
http://svn.apache.org/viewvc?view=revision&revision=1229962
#118898# corrected error in GDIMetaFile::GetBoundRect in handling
MetaFloatTransparentAction
http://svn.apache.org/viewvc?view=revision&revision=1293349
#118855# Corrected handling of possibly created empty clipRegions
after PolyPolygon clipping
http://svn.apache.org/viewvc?view=revision&revision=1237725
#115962# Better (but not yet optimal, see comments in task) handling
of MetaFloatTransparentAction in PDF export
http://svn.apache.org/viewvc?view=revision&revision=1241078
IP clearance: #118466# This patch removes librsvg, libcroco, libgsf, ...
http://svn.apache.org/viewvc?view=revision&revision=1200879
118779# Added svg content streaming in/out to ImpGraphic stream operators
http://svn.apache.org/viewvc?view=revision&revision=1231908
linecap: correctons for WaE and mac drawing
http://svn.apache.org/viewvc?view=revision&revision=1232793
svg: uses current system Dpi for Svg replacement image creation
http://svn.apache.org/viewvc?view=revision&revision=1233948
Patches contributed by Mathias Bauer (and others)
gnumake4 work variously
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
http://svn.apache.org/viewvc?view=revision&revision=1394326
Remove duplicate header includes.
cws mba34issues01: #i117720#: convert assertion into warning
http://svn.apache.org/viewvc?view=revision&revision=1172352
118485 - Styles for OLEs are not saved. Submitted by Armin Le Grand.
http://svn.apache.org/viewvc?view=revision&revision=1182166
cws mba34issues01: #i117714#: remove assertion
http://svn.apache.org/viewvc?view=revision&revision=1172357
Patch contributed by Jurgen Schmidt
add some additional checks to ensure proper reading operations
http://svn.apache.org/viewvc?view=revision&revision=1209022
mostly prefer our stream / bounds checking work.
Patches contributed by Herbert Duerr
#i118816# add clarifying comment regarding Font::*Color*() methods
http://svn.apache.org/viewvc?view=revision&revision=1233833
extend macro->string handling for empty strings
http://svn.apache.org/viewvc?view=revision&revision=1175801
avoid magic constants for SALCOLOR_NONE
http://svn.apache.org/viewvc?view=revision&revision=1177543
initialize slant properly in ImplFontMetricData constructor (author=iorsh)
http://svn.apache.org/viewvc?view=revision&revision=1177551
#i118675# make check for extension updates more stable
http://svn.apache.org/viewvc?view=revision&revision=1214797
#a118617# remove VBasicEventListener.dll binary
There are no known users depending on its CLSID
http://svn.apache.org/viewvc?view=revision&revision=1203697
Patches contributed by Ariel Constenla-Haile
Fix build breaker on Linux/gcc
http://svn.apache.org/viewvc?view=revision&revision=1221104
Fix crash when trying to instantiate css.graphic.GraphicRasterizer_RSVG
http://svn.apache.org/viewvc?view=revision&revision=1215559
Patches contributed by Oliver-Rainer Wittmann
sw34bf06: #i117962# - method <SwFlyFrm::IsPaint(..)> - consider
instances of <SwFlyDrawObj>
http://svn.apache.org/viewvc?view=revision&revision=1172120
sw34bf06: #i117783# - Writer's implementation of XPagePrintable -
apply print settings to new printing routines
http://svn.apache.org/viewvc?view=revision&revision=1172115
gnumake4 work variously from Hans-Joachim Lankenau
http://svn.apache.org/viewvc?view=revision&revision=1397315
http://svn.apache.org/viewvc?view=revision&revision=1396797
http://svn.apache.org/viewvc?view=revision&revision=1396782
http://svn.apache.org/viewvc?view=revision&revision=1394707
plus some amount of re-splitting of legacy headers.
Patch contributed by Pavel Janik
WaE: Remove unused variables.
http://svn.apache.org/viewvc?view=revision&revision=1230697
Patches contributed by Takashi Ono
mingwport35: i#117795: MinGW port fix for vcl2gnumake
http://svn.apache.org/viewvc?view=revision&revision=1172091
mingwport35: i#117795: MinGW port fix for vcl2gnumake
http://svn.apache.org/viewvc?view=revision&revision=1172091
Patch contributed by Christian Lippka
impress212: #i98044# re enable Text menu for outline and title shapes
http://svn.apache.org/viewvc?view=revision&revision=1167639
Patch contributed by Andre Fischer
118674: Made category B code optional and disabled by default.
http://svn.apache.org/viewvc?view=revision&revision=1215131
118881: Ignore empty paragraphs after bullets.
http://svn.apache.org/viewvc?view=revision&revision=1296205
Patches contributed by Philipp Lohmann
ooo340fixes: #i117780# use rtl allocator
http://svn.apache.org/viewvc?view=revision&revision=1172087
ooo34gsl02: #i117807# fix an off by one error (index actually
inside the pfb section header)
http://svn.apache.org/viewvc?view=revision&revision=1167576
various cleanups, related compilation fixes, warning cleanups, re-working
of obsolete stl template pieces to use boost instead, changed string
classes, re-adapt KDE about data, about dialog, fixing warnings,
and other fixes & improvements.
Disable svg import / render for about/ branding code-paths for now.
Restore full icon theme set.
Remove OS/2 conditionals and sources.
Remove conflicting gtk/full-screen monitors support.
Retain existing svg rasterizer files - temporarily disabled.
Standardize stringificaiton and fixup dllpostfix issues.
Rename SvgGradientHelper::== to equalTo to avoid overloading issues.
Use the flat GdiPlus API for LineCaps calls.
2012-10-09 12:22:23 +01: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-05-16 15:12:20 +00:00
2006-09-17 03:00:01 +00:00
2002-05-16 15:12:20 +00:00
// Global header
2014-02-25 18:24:10 +01:00
2014-02-22 21:20:15 +01:00
2002-05-16 15:12:20 +00:00
# include <limits.h>
# include <vector>
# include <algorithm>
2010-10-16 03:18:35 -05:00
# include <osl/mutex.hxx>
2002-05-16 15:12:20 +00:00
# include <vcl/window.hxx>
# include <vcl/svapp.hxx>
2016-06-12 14:42:51 +02:00
# include <tools/diagnose_ex.h>
2010-03-11 13:09:35 +01:00
# include <editeng/flditem.hxx>
2002-05-16 15:12:20 +00:00
# include <com/sun/star/uno/Any.hxx>
# include <com/sun/star/uno/Reference.hxx>
# include <com/sun/star/awt/Point.hpp>
# include <com/sun/star/awt/Rectangle.hpp>
2002-06-04 17:44:27 +00:00
# include <com/sun/star/lang/DisposedException.hpp>
2003-04-24 15:53:15 +00:00
# include <com/sun/star/accessibility/AccessibleRole.hpp>
# include <com/sun/star/accessibility/AccessibleTextType.hpp>
# include <com/sun/star/accessibility/AccessibleStateType.hpp>
# include <com/sun/star/accessibility/AccessibleEventId.hpp>
2003-03-27 14:06:05 +00:00
# include <comphelper/accessibleeventnotifier.hxx>
2006-08-04 12:10:12 +00:00
# include <comphelper/sequenceashashmap.hxx>
2013-09-25 15:41:29 -03:00
# include <cppuhelper/supportsservice.hxx>
2002-05-16 15:12:20 +00:00
# include <unotools/accessiblestatesethelper.hxx>
2006-02-01 13:59:29 +00:00
# include <unotools/accessiblerelationsethelper.hxx>
# include <com/sun/star/accessibility/AccessibleRelationType.hpp>
2002-08-23 16:50:51 +00:00
# include <vcl/unohelp.hxx>
2014-01-02 23:52:37 +01:00
# include <vcl/settings.hxx>
2010-01-06 19:26:54 +01:00
# include <editeng/editeng.hxx>
# include <editeng/unoprnms.hxx>
# include <editeng/unoipset.hxx>
# include <editeng/outliner.hxx>
2013-11-26 14:25:22 +00:00
# include <svl/intitem.hxx>
2002-08-23 16:50:51 +00:00
2014-02-22 21:20:15 +01:00
2002-05-16 15:12:20 +00:00
// Project-local header
2014-02-25 18:24:10 +01:00
2014-02-22 21:20:15 +01:00
2006-08-04 12:10:12 +00:00
# include <com/sun/star/beans/PropertyState.hpp>
2010-03-02 20:27:28 +01:00
2010-01-06 19:26:54 +01:00
# include <editeng/unolingu.hxx>
# include <editeng/unopracc.hxx>
2010-01-07 18:52:36 +01:00
# include "editeng/AccessibleEditableTextPara.hxx"
2010-03-03 21:15:58 +01:00
# include "AccessibleHyperlink.hxx"
2010-03-02 20:27:28 +01:00
2003-03-27 14:06:05 +00:00
# include <svtools/colorcfg.hxx>
2013-11-26 14:25:22 +00:00
using namespace std ;
# include "editeng.hrc"
# include <editeng/eerdll.hxx>
# include <editeng/numitem.hxx>
2015-06-15 17:58:15 +09:00
# include <memory>
2002-05-16 15:12:20 +00:00
using namespace : : com : : sun : : star ;
2006-08-04 12:10:12 +00:00
using namespace : : com : : sun : : star : : beans ;
2003-04-24 15:53:15 +00:00
using namespace : : com : : sun : : star : : accessibility ;
2002-05-16 15:12:20 +00:00
2014-02-22 21:20:15 +01:00
2002-05-16 15:12:20 +00:00
// AccessibleEditableTextPara implementation
2014-02-25 18:24:10 +01:00
2014-02-22 21:20:15 +01:00
2002-05-16 15:12:20 +00:00
namespace accessibility
{
2009-06-03 11:26:39 +00:00
const SvxItemPropertySet * ImplGetSvxCharAndParaPropertiesSet ( )
2006-08-04 12:10:12 +00:00
{
// PropertyMap for character and paragraph properties
2009-06-03 11:26:39 +00:00
static const SfxItemPropertyMapEntry aPropMap [ ] =
2006-08-04 12:10:12 +00:00
{
2013-11-26 14:25:22 +00:00
SVX_UNOEDIT_OUTLINER_PROPERTIES ,
2006-08-04 12:10:12 +00:00
SVX_UNOEDIT_CHAR_PROPERTIES ,
SVX_UNOEDIT_PARA_PROPERTIES ,
SVX_UNOEDIT_NUMBERING_PROPERTIE ,
2015-09-11 15:44:09 +02:00
{ OUString ( " TextUserDefinedAttributes " ) , EE_CHAR_XMLATTRIBS , cppu : : UnoType < css : : container : : XNameContainer > : : get ( ) , 0 , 0 } ,
{ OUString ( " ParaUserDefinedAttributes " ) , EE_PARA_XMLATTRIBS , cppu : : UnoType < css : : container : : XNameContainer > : : get ( ) , 0 , 0 } ,
2013-12-11 15:16:51 +01:00
{ OUString ( ) , 0 , css : : uno : : Type ( ) , 0 , 0 }
2006-08-04 12:10:12 +00:00
} ;
2009-12-10 18:09:38 +01:00
static SvxItemPropertySet aPropSet ( aPropMap , EditEngine : : GetGlobalItemPool ( ) ) ;
2009-06-03 11:26:39 +00:00
return & aPropSet ;
2006-08-04 12:10:12 +00:00
}
2010-10-04 16:20:36 +02:00
// #i27138# - add parameter <_pParaManager>
2006-02-01 13:59:29 +00:00
AccessibleEditableTextPara : : AccessibleEditableTextPara (
const uno : : Reference < XAccessible > & rParent ,
const AccessibleParaManager * _pParaManager )
: AccessibleTextParaInterfaceBase ( m_aMutex ) ,
mnParagraphIndex ( 0 ) ,
mnIndexInParent ( 0 ) ,
2015-11-10 10:14:16 +01:00
mpEditSource ( nullptr ) ,
2006-02-01 13:59:29 +00:00
maEEOffset ( 0 , 0 ) ,
mxParent ( rParent ) ,
// well, that's strictly (UNO) exception safe, though not
// really robust. We rely on the fact that this member is
// constructed last, and that the constructor body catches
// exceptions, thus no chance for exceptions once the Id is
// fetched. Nevertheless, normally should employ RAII here...
mnNotifierClientId ( : : comphelper : : AccessibleEventNotifier : : registerClient ( ) ) ,
2010-10-04 16:20:36 +02:00
// #i27138#
2006-02-01 13:59:29 +00:00
mpParaManager ( _pParaManager )
2003-03-27 14:06:05 +00:00
{
2002-05-23 11:46:18 +00:00
2003-03-27 14:06:05 +00:00
try
{
// Create the state set.
: : utl : : AccessibleStateSetHelper * pStateSet = new : : utl : : AccessibleStateSetHelper ( ) ;
mxStateSet = pStateSet ;
// these are always on
2003-04-24 15:53:15 +00:00
pStateSet - > AddState ( AccessibleStateType : : MULTI_LINE ) ;
2003-03-27 14:06:05 +00:00
pStateSet - > AddState ( AccessibleStateType : : FOCUSABLE ) ;
pStateSet - > AddState ( AccessibleStateType : : VISIBLE ) ;
pStateSet - > AddState ( AccessibleStateType : : SHOWING ) ;
pStateSet - > AddState ( AccessibleStateType : : ENABLED ) ;
2006-05-05 09:41:19 +00:00
pStateSet - > AddState ( AccessibleStateType : : SENSITIVE ) ;
2003-03-27 14:06:05 +00:00
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : Exception & )
{
}
2002-05-16 15:12:20 +00:00
}
AccessibleEditableTextPara : : ~ AccessibleEditableTextPara ( )
{
2003-03-27 14:06:05 +00:00
// sign off from event notifier
if ( getNotifierClientId ( ) ! = - 1 )
{
try
{
: : comphelper : : AccessibleEventNotifier : : revokeClient ( getNotifierClientId ( ) ) ;
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : Exception & )
{
}
2003-03-27 14:06:05 +00:00
}
2002-05-16 15:12:20 +00:00
}
2012-12-21 23:10:24 -02:00
OUString AccessibleEditableTextPara : : implGetText ( )
2002-08-02 10:35:10 +00:00
{
return GetTextRange ( 0 , GetTextLen ( ) ) ;
}
2015-09-11 15:44:09 +02:00
css : : lang : : Locale AccessibleEditableTextPara : : implGetLocale ( )
2002-08-02 10:35:10 +00:00
{
2013-05-08 18:12:32 +02:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = SAL_MAX_INT32 ,
2002-08-02 10:35:10 +00:00
" AccessibleEditableTextPara::getLocale: paragraph index value overflow " ) ;
// return locale of first character in the paragraph
2013-05-08 18:12:32 +02:00
return LanguageTag ( GetTextForwarder ( ) . GetLanguage ( GetParagraphIndex ( ) , 0 ) ) . getLocale ( ) ;
2002-08-02 10:35:10 +00:00
}
void AccessibleEditableTextPara : : implGetSelection ( sal_Int32 & nStartIndex , sal_Int32 & nEndIndex )
{
2014-06-09 09:34:24 +01:00
sal_Int32 nStart , nEnd ;
2002-08-02 10:35:10 +00:00
if ( GetSelection ( nStart , nEnd ) )
{
nStartIndex = nStart ;
nEndIndex = nEnd ;
}
else
{
2002-08-16 10:58:06 +00:00
// #102234# No exception, just set to 'invalid'
nStartIndex = - 1 ;
nEndIndex = - 1 ;
2002-08-02 10:35:10 +00:00
}
}
2015-09-11 15:44:09 +02:00
void AccessibleEditableTextPara : : implGetParagraphBoundary ( css : : i18n : : Boundary & rBoundary , sal_Int32 /*nIndex*/ )
2002-08-02 10:35:10 +00:00
{
2015-10-19 11:55:44 +02:00
SAL_INFO ( " editeng " , " AccessibleEditableTextPara::implGetParagraphBoundary: only a base implementation, ignoring the index " ) ;
2003-03-27 14:06:05 +00:00
2002-08-02 10:35:10 +00:00
rBoundary . startPos = 0 ;
2013-11-26 14:25:22 +00:00
//rBoundary.endPos = GetTextLen();
OUString sText ( implGetText ( ) ) ;
sal_Int32 nLength = sText . getLength ( ) ;
rBoundary . endPos = nLength ;
2002-08-02 10:35:10 +00:00
}
2015-09-11 15:44:09 +02:00
void AccessibleEditableTextPara : : implGetLineBoundary ( css : : i18n : : Boundary & rBoundary , sal_Int32 nIndex )
2002-08-02 10:35:10 +00:00
{
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
2003-12-01 08:28:01 +00:00
const sal_Int32 nParaIndex = GetParagraphIndex ( ) ;
2002-08-02 10:35:10 +00:00
2013-05-08 18:12:32 +02:00
DBG_ASSERT ( nParaIndex > = 0 & & nParaIndex < = SAL_MAX_INT32 ,
2003-12-01 08:28:01 +00:00
" AccessibleEditableTextPara::implGetLineBoundary: paragraph index value overflow " ) ;
2002-08-02 10:35:10 +00:00
2013-05-08 18:12:32 +02:00
const sal_Int32 nTextLen = rCacheTF . GetTextLen ( nParaIndex ) ;
2002-08-02 10:35:10 +00:00
2003-12-01 08:28:01 +00:00
CheckPosition ( nIndex ) ;
rBoundary . startPos = rBoundary . endPos = - 1 ;
2014-02-02 22:16:48 -06:00
const sal_Int32 nLineCount = rCacheTF . GetLineCount ( nParaIndex ) ;
2002-08-02 10:35:10 +00:00
2003-12-01 08:28:01 +00:00
if ( nIndex = = nTextLen )
2002-08-02 10:35:10 +00:00
{
2003-12-01 08:28:01 +00:00
// #i17014# Special-casing one-behind-the-end character
2006-12-13 13:58:16 +00:00
if ( nLineCount < = 1 )
rBoundary . startPos = 0 ;
else
2013-05-08 18:12:32 +02:00
rBoundary . startPos = nTextLen - rCacheTF . GetLineLen ( nParaIndex ,
2006-12-13 13:58:16 +00:00
nLineCount - 1 ) ;
2002-08-02 10:35:10 +00:00
2003-12-01 08:28:01 +00:00
rBoundary . endPos = nTextLen ;
}
else
{
// normal line search
2014-02-02 22:16:48 -06:00
sal_Int32 nLine ;
2003-12-01 08:28:01 +00:00
sal_Int32 nCurIndex ;
for ( nLine = 0 , nCurIndex = 0 ; nLine < nLineCount ; + + nLine )
2002-08-02 10:35:10 +00:00
{
2013-05-08 18:12:32 +02:00
nCurIndex + = rCacheTF . GetLineLen ( nParaIndex , nLine ) ;
2003-12-01 08:28:01 +00:00
if ( nCurIndex > nIndex )
{
2013-05-08 18:12:32 +02:00
rBoundary . startPos = nCurIndex - rCacheTF . GetLineLen ( nParaIndex , nLine ) ;
2003-12-01 08:28:01 +00:00
rBoundary . endPos = nCurIndex ;
break ;
}
2002-08-02 10:35:10 +00:00
}
}
}
2003-03-27 14:06:05 +00:00
2002-05-16 15:12:20 +00:00
void AccessibleEditableTextPara : : SetIndexInParent ( sal_Int32 nIndex )
{
mnIndexInParent = nIndex ;
}
void AccessibleEditableTextPara : : SetParagraphIndex ( sal_Int32 nIndex )
{
2002-05-23 11:46:18 +00:00
sal_Int32 nOldIndex = mnParagraphIndex ;
2002-05-16 15:12:20 +00:00
mnParagraphIndex = nIndex ;
2016-02-09 18:30:54 +01:00
auto aChild ( maImageBullet . get ( ) ) ;
2002-05-23 11:46:18 +00:00
if ( aChild . is ( ) )
aChild - > SetParagraphIndex ( mnParagraphIndex ) ;
2002-05-16 15:12:20 +00:00
try
{
2002-05-23 11:46:18 +00:00
if ( nOldIndex ! = nIndex )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
uno : : Any aOldDesc ;
uno : : Any aOldName ;
try
{
aOldDesc < < = getAccessibleDescription ( ) ;
aOldName < < = getAccessibleName ( ) ;
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : Exception & ) // optional behaviour
{
}
2002-05-23 11:46:18 +00:00
// index and therefore description changed
2003-04-24 15:53:15 +00:00
FireEvent ( AccessibleEventId : : DESCRIPTION_CHANGED , uno : : makeAny ( getAccessibleDescription ( ) ) , aOldDesc ) ;
FireEvent ( AccessibleEventId : : NAME_CHANGED , uno : : makeAny ( getAccessibleName ( ) ) , aOldName ) ;
2002-05-16 15:12:20 +00:00
}
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : Exception & ) // optional behaviour
{
}
2002-05-16 15:12:20 +00:00
}
2002-07-24 15:19:19 +00:00
void AccessibleEditableTextPara : : Dispose ( )
{
2003-04-01 12:46:46 +00:00
int nClientId ( getNotifierClientId ( ) ) ;
// #108212# drop all references before notifying dispose
2015-11-10 10:14:16 +01:00
mxParent = nullptr ;
2003-04-01 12:46:46 +00:00
mnNotifierClientId = - 1 ;
2015-11-10 10:14:16 +01:00
mpEditSource = nullptr ;
2003-04-01 12:46:46 +00:00
2002-07-24 15:19:19 +00:00
// notify listeners
2003-04-01 12:46:46 +00:00
if ( nClientId ! = - 1 )
2002-07-24 15:19:19 +00:00
{
2003-03-27 14:06:05 +00:00
try
{
uno : : Reference < XAccessibleContext > xThis = getAccessibleContext ( ) ;
2002-07-24 15:19:19 +00:00
2003-03-27 14:06:05 +00:00
// #106234# Delegate to EventNotifier
2003-04-01 12:46:46 +00:00
: : comphelper : : AccessibleEventNotifier : : revokeClientNotifyDisposing ( nClientId , xThis ) ;
2003-03-27 14:06:05 +00:00
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : Exception & )
{
}
2002-07-24 15:19:19 +00:00
}
}
2002-05-16 15:12:20 +00:00
void AccessibleEditableTextPara : : SetEditSource ( SvxEditSourceAdapter * pEditSource )
{
2016-02-09 18:30:54 +01:00
auto aChild ( maImageBullet . get ( ) ) ;
2002-05-23 11:46:18 +00:00
if ( aChild . is ( ) )
aChild - > SetEditSource ( pEditSource ) ;
2002-05-16 15:12:20 +00:00
2013-11-26 14:25:22 +00:00
if ( ! pEditSource )
2002-05-16 15:12:20 +00:00
{
// going defunc
2002-05-23 11:46:18 +00:00
UnSetState ( AccessibleStateType : : SHOWING ) ;
UnSetState ( AccessibleStateType : : VISIBLE ) ;
SetState ( AccessibleStateType : : INVALID ) ;
SetState ( AccessibleStateType : : DEFUNC ) ;
2002-05-16 15:12:20 +00:00
2002-07-24 15:19:19 +00:00
Dispose ( ) ;
2002-05-16 15:12:20 +00:00
}
2013-11-26 14:25:22 +00:00
mpEditSource = pEditSource ;
2003-04-24 15:53:15 +00:00
// #108900# Init last text content
try
{
TextChanged ( ) ;
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : RuntimeException & )
{
}
2002-05-16 15:12:20 +00:00
}
ESelection AccessibleEditableTextPara : : MakeSelection ( sal_Int32 nStartEEIndex , sal_Int32 nEndEEIndex )
{
// check overflow
DBG_ASSERT ( nStartEEIndex > = 0 & & nStartEEIndex < = USHRT_MAX & &
nEndEEIndex > = 0 & & nEndEEIndex < = USHRT_MAX & &
2013-05-08 18:12:32 +02:00
GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = SAL_MAX_INT32 ,
2002-05-16 15:12:20 +00:00
" AccessibleEditableTextPara::MakeSelection: index value overflow " ) ;
2013-05-08 18:12:32 +02:00
sal_Int32 nParaIndex = GetParagraphIndex ( ) ;
2014-06-09 09:34:24 +01:00
return ESelection ( nParaIndex , nStartEEIndex , nParaIndex , nEndEEIndex ) ;
2002-05-16 15:12:20 +00:00
}
ESelection AccessibleEditableTextPara : : MakeSelection ( sal_Int32 nEEIndex )
{
return MakeSelection ( nEEIndex , nEEIndex + 1 ) ;
}
2002-10-24 16:30:00 +00:00
ESelection AccessibleEditableTextPara : : MakeCursor ( sal_Int32 nEEIndex )
{
return MakeSelection ( nEEIndex , nEEIndex ) ;
}
2014-06-05 08:09:07 +02:00
void AccessibleEditableTextPara : : CheckIndex ( sal_Int32 nIndex )
2002-05-16 15:12:20 +00:00
{
if ( nIndex < 0 | | nIndex > = getCharacterCount ( ) )
2012-12-21 23:10:24 -02:00
throw lang : : IndexOutOfBoundsException ( " AccessibleEditableTextPara: character index out of bounds " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * > ( this ) ) ) ; // disambiguate hierarchy
}
2014-06-05 08:09:07 +02:00
void AccessibleEditableTextPara : : CheckPosition ( sal_Int32 nIndex )
2002-05-16 15:12:20 +00:00
{
if ( nIndex < 0 | | nIndex > getCharacterCount ( ) )
2012-12-21 23:10:24 -02:00
throw lang : : IndexOutOfBoundsException ( " AccessibleEditableTextPara: character position out of bounds " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * > ( this ) ) ) ; // disambiguate hierarchy
}
2014-06-05 08:09:07 +02:00
void AccessibleEditableTextPara : : CheckRange ( sal_Int32 nStart , sal_Int32 nEnd )
2002-05-16 15:12:20 +00:00
{
CheckPosition ( nStart ) ;
CheckPosition ( nEnd ) ;
}
2014-06-09 09:34:24 +01:00
bool AccessibleEditableTextPara : : GetSelection ( sal_Int32 & nStartPos , sal_Int32 & nEndPos )
2002-08-02 10:35:10 +00:00
{
ESelection aSelection ;
2013-05-08 18:12:32 +02:00
sal_Int32 nPara = GetParagraphIndex ( ) ;
2002-08-02 10:35:10 +00:00
if ( ! GetEditViewForwarder ( ) . GetSelection ( aSelection ) )
2014-02-19 14:52:32 +02:00
return false ;
2002-08-02 10:35:10 +00:00
if ( aSelection . nStartPara < aSelection . nEndPara )
{
if ( aSelection . nStartPara > nPara | |
aSelection . nEndPara < nPara )
2014-02-19 14:52:32 +02:00
return false ;
2002-08-02 10:35:10 +00:00
if ( nPara = = aSelection . nStartPara )
nStartPos = aSelection . nStartPos ;
else
nStartPos = 0 ;
if ( nPara = = aSelection . nEndPara )
nEndPos = aSelection . nEndPos ;
else
nEndPos = GetTextLen ( ) ;
}
else
{
if ( aSelection . nStartPara < nPara | |
aSelection . nEndPara > nPara )
2014-02-19 14:52:32 +02:00
return false ;
2002-08-02 10:35:10 +00:00
if ( nPara = = aSelection . nStartPara )
nStartPos = aSelection . nStartPos ;
else
nStartPos = GetTextLen ( ) ;
if ( nPara = = aSelection . nEndPara )
nEndPos = aSelection . nEndPos ;
else
nEndPos = 0 ;
}
2014-02-19 14:52:32 +02:00
return true ;
2002-08-02 10:35:10 +00:00
}
2014-06-05 08:09:07 +02:00
OUString AccessibleEditableTextPara : : GetTextRange ( sal_Int32 nStartIndex , sal_Int32 nEndIndex )
2002-05-16 15:12:20 +00:00
{
return GetTextForwarder ( ) . GetText ( MakeSelection ( nStartIndex , nEndIndex ) ) ;
}
2014-06-09 09:34:24 +01:00
sal_Int32 AccessibleEditableTextPara : : GetTextLen ( ) const
2002-05-16 15:12:20 +00:00
{
2014-06-09 09:34:24 +01:00
return GetTextForwarder ( ) . GetTextLen ( GetParagraphIndex ( ) ) ;
2002-05-16 15:12:20 +00:00
}
2014-06-05 08:09:07 +02:00
SvxEditSourceAdapter & AccessibleEditableTextPara : : GetEditSource ( ) const
2002-05-16 15:12:20 +00:00
{
if ( mpEditSource )
return * mpEditSource ;
else
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " No edit source, object is defunct " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * >
( const_cast < AccessibleEditableTextPara * > ( this ) ) ) ) ; // disambiguate hierarchy
}
2014-06-05 08:09:07 +02:00
SvxAccessibleTextAdapter & AccessibleEditableTextPara : : GetTextForwarder ( ) const
2002-05-16 15:12:20 +00:00
{
SvxEditSourceAdapter & rEditSource = GetEditSource ( ) ;
SvxAccessibleTextAdapter * pTextForwarder = rEditSource . GetTextForwarderAdapter ( ) ;
if ( ! pTextForwarder )
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " Unable to fetch text forwarder, object is defunct " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * >
( const_cast < AccessibleEditableTextPara * > ( this ) ) ) ) ; // disambiguate hierarchy
if ( pTextForwarder - > IsValid ( ) )
return * pTextForwarder ;
else
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " Text forwarder is invalid, object is defunct " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * >
( const_cast < AccessibleEditableTextPara * > ( this ) ) ) ) ; // disambiguate hierarchy
}
2014-06-05 08:09:07 +02:00
SvxViewForwarder & AccessibleEditableTextPara : : GetViewForwarder ( ) const
2002-05-16 15:12:20 +00:00
{
SvxEditSource & rEditSource = GetEditSource ( ) ;
SvxViewForwarder * pViewForwarder = rEditSource . GetViewForwarder ( ) ;
if ( ! pViewForwarder )
{
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " Unable to fetch view forwarder, object is defunct " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * >
( const_cast < AccessibleEditableTextPara * > ( this ) ) ) ) ; // disambiguate hierarchy
}
if ( pViewForwarder - > IsValid ( ) )
return * pViewForwarder ;
else
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " View forwarder is invalid, object is defunct " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * >
( const_cast < AccessibleEditableTextPara * > ( this ) ) ) ) ; // disambiguate hierarchy
}
2014-06-05 08:09:07 +02:00
SvxAccessibleTextEditViewAdapter & AccessibleEditableTextPara : : GetEditViewForwarder ( bool bCreate ) const
2002-05-16 15:12:20 +00:00
{
SvxEditSourceAdapter & rEditSource = GetEditSource ( ) ;
SvxAccessibleTextEditViewAdapter * pTextEditViewForwarder = rEditSource . GetEditViewForwarderAdapter ( bCreate ) ;
if ( ! pTextEditViewForwarder )
{
if ( bCreate )
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " Unable to fetch view forwarder, object is defunct " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * >
( const_cast < AccessibleEditableTextPara * > ( this ) ) ) ) ; // disambiguate hierarchy
else
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " No view forwarder, object not in edit mode " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * >
( const_cast < AccessibleEditableTextPara * > ( this ) ) ) ) ; // disambiguate hierarchy
}
if ( pTextEditViewForwarder - > IsValid ( ) )
return * pTextEditViewForwarder ;
else
{
if ( bCreate )
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " View forwarder is invalid, object is defunct " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * >
( const_cast < AccessibleEditableTextPara * > ( this ) ) ) ) ; // disambiguate hierarchy
else
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " View forwarder is invalid, object not in edit mode " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * >
( const_cast < AccessibleEditableTextPara * > ( this ) ) ) ) ; // disambiguate hierarchy
}
}
2014-02-19 14:52:32 +02:00
bool AccessibleEditableTextPara : : HaveEditView ( ) const
2002-05-16 15:12:20 +00:00
{
SvxEditSource & rEditSource = GetEditSource ( ) ;
SvxEditViewForwarder * pViewForwarder = rEditSource . GetEditViewForwarder ( ) ;
if ( ! pViewForwarder )
2014-02-19 14:52:32 +02:00
return false ;
2002-05-16 15:12:20 +00:00
if ( ! pViewForwarder - > IsValid ( ) )
2014-02-19 14:52:32 +02:00
return false ;
2002-05-16 15:12:20 +00:00
2014-02-19 14:52:32 +02:00
return true ;
2002-05-16 15:12:20 +00:00
}
2014-02-19 14:52:32 +02:00
bool AccessibleEditableTextPara : : HaveChildren ( )
2002-05-16 15:12:20 +00:00
{
2013-05-08 18:12:32 +02:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = SAL_MAX_INT32 ,
2002-05-16 15:12:20 +00:00
" AccessibleEditableTextPara::HaveChildren: paragraph index value overflow " ) ;
2013-05-08 18:12:32 +02:00
return GetTextForwarder ( ) . HaveImageBullet ( GetParagraphIndex ( ) ) ;
2002-05-16 15:12:20 +00:00
}
Rectangle AccessibleEditableTextPara : : LogicToPixel ( const Rectangle & rRect , const MapMode & rMapMode , SvxViewForwarder & rForwarder )
{
// convert to screen coordinates
return Rectangle ( rForwarder . LogicToPixel ( rRect . TopLeft ( ) , rMapMode ) ,
rForwarder . LogicToPixel ( rRect . BottomRight ( ) , rMapMode ) ) ;
}
void AccessibleEditableTextPara : : SetEEOffset ( const Point & rOffset )
{
2016-02-09 18:30:54 +01:00
auto aChild ( maImageBullet . get ( ) ) ;
2002-05-23 11:46:18 +00:00
if ( aChild . is ( ) )
aChild - > SetEEOffset ( rOffset ) ;
2002-05-16 15:12:20 +00:00
maEEOffset = rOffset ;
}
void AccessibleEditableTextPara : : FireEvent ( const sal_Int16 nEventId , const uno : : Any & rNewValue , const uno : : Any & rOldValue ) const
{
uno : : Reference < XAccessibleContext > xThis ( const_cast < AccessibleEditableTextPara * > ( this ) - > getAccessibleContext ( ) ) ;
AccessibleEventObject aEvent ( xThis , nEventId , rNewValue , rOldValue ) ;
2002-08-23 16:50:51 +00:00
// #102261# Call global queue for focus events
2006-01-13 16:17:41 +00:00
if ( nEventId = = AccessibleEventId : : STATE_CHANGED )
2002-08-23 16:50:51 +00:00
vcl : : unohelper : : NotifyAccessibleStateEventGlobally ( aEvent ) ;
2003-03-27 14:06:05 +00:00
// #106234# Delegate to EventNotifier
if ( getNotifierClientId ( ) ! = - 1 )
: : comphelper : : AccessibleEventNotifier : : addEvent ( getNotifierClientId ( ) ,
aEvent ) ;
2002-05-16 15:12:20 +00:00
}
2002-05-23 11:46:18 +00:00
void AccessibleEditableTextPara : : SetState ( const sal_Int16 nStateId )
{
: : utl : : AccessibleStateSetHelper * pStateSet = static_cast < : : utl : : AccessibleStateSetHelper * > ( mxStateSet . get ( ) ) ;
2015-11-10 10:14:16 +01:00
if ( pStateSet ! = nullptr & &
2002-05-23 11:46:18 +00:00
! pStateSet - > contains ( nStateId ) )
{
pStateSet - > AddState ( nStateId ) ;
2016-11-09 10:26:36 +02:00
FireEvent ( AccessibleEventId : : STATE_CHANGED , uno : : makeAny ( nStateId ) ) ;
2002-05-23 11:46:18 +00:00
}
}
void AccessibleEditableTextPara : : UnSetState ( const sal_Int16 nStateId )
{
: : utl : : AccessibleStateSetHelper * pStateSet = static_cast < : : utl : : AccessibleStateSetHelper * > ( mxStateSet . get ( ) ) ;
2015-11-10 10:14:16 +01:00
if ( pStateSet ! = nullptr & &
2002-05-23 11:46:18 +00:00
pStateSet - > contains ( nStateId ) )
{
pStateSet - > RemoveState ( nStateId ) ;
2016-11-09 10:26:36 +02:00
FireEvent ( AccessibleEventId : : STATE_CHANGED , uno : : Any ( ) , uno : : makeAny ( nStateId ) ) ;
2003-04-24 15:53:15 +00:00
}
}
void AccessibleEditableTextPara : : TextChanged ( )
{
2012-12-21 23:10:24 -02:00
OUString aCurrentString ( OCommonAccessibleText : : getText ( ) ) ;
2003-04-24 15:53:15 +00:00
uno : : Any aDeleted ;
uno : : Any aInserted ;
if ( OCommonAccessibleText : : implInitTextChangedEvent ( maLastTextString , aCurrentString ,
aDeleted , aInserted ) )
{
FireEvent ( AccessibleEventId : : TEXT_CHANGED , aInserted , aDeleted ) ;
maLastTextString = aCurrentString ;
2002-05-23 11:46:18 +00:00
}
}
2014-02-19 14:52:32 +02:00
bool AccessibleEditableTextPara : : GetAttributeRun ( sal_Int32 & nStartIndex , sal_Int32 & nEndIndex , sal_Int32 nIndex )
2002-08-02 10:35:10 +00:00
{
2014-02-02 22:16:48 -06:00
DBG_ASSERT ( nIndex > = 0 & & nIndex < = SAL_MAX_INT32 ,
2002-08-22 08:37:49 +00:00
" AccessibleEditableTextPara::GetAttributeRun: index value overflow " ) ;
2013-05-08 18:12:32 +02:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = SAL_MAX_INT32 ,
2002-08-22 08:37:49 +00:00
" AccessibleEditableTextPara::getLocale: paragraph index value overflow " ) ;
2003-12-01 08:28:01 +00:00
return GetTextForwarder ( ) . GetAttributeRun ( nStartIndex ,
nEndIndex ,
2013-05-08 18:12:32 +02:00
GetParagraphIndex ( ) ,
2014-06-09 09:34:24 +01:00
nIndex ) ;
2002-08-02 10:35:10 +00:00
}
2014-02-25 21:31:58 +01:00
uno : : Any SAL_CALL AccessibleEditableTextPara : : queryInterface ( const uno : : Type & rType ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
uno : : Any aRet ;
// must provide XAccesibleText by hand, since it comes publicly inherited by XAccessibleEditableText
2014-05-22 23:19:05 +02:00
if ( rType = = cppu : : UnoType < XAccessibleText > : : get ( ) )
2002-05-16 15:12:20 +00:00
{
2009-08-26 13:37:34 +00:00
uno : : Reference < XAccessibleText > aAccText = static_cast < XAccessibleEditableText * > ( this ) ;
2002-05-16 15:12:20 +00:00
aRet < < = aAccText ;
}
2014-05-22 23:19:05 +02:00
else if ( rType = = cppu : : UnoType < XAccessibleEditableText > : : get ( ) )
2002-05-16 15:12:20 +00:00
{
uno : : Reference < XAccessibleEditableText > aAccEditText = this ;
aRet < < = aAccEditText ;
}
2014-05-22 23:19:05 +02:00
else if ( rType = = cppu : : UnoType < XAccessibleHypertext > : : get ( ) )
2010-02-25 16:58:44 +01:00
{
uno : : Reference < XAccessibleHypertext > aAccHyperText = this ;
aRet < < = aAccHyperText ;
}
2002-05-16 15:12:20 +00:00
else
{
aRet = AccessibleTextParaInterfaceBase : : queryInterface ( rType ) ;
}
return aRet ;
}
// XAccessible
2014-02-25 21:31:58 +01:00
uno : : Reference < XAccessibleContext > SAL_CALL AccessibleEditableTextPara : : getAccessibleContext ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
// We implement the XAccessibleContext interface in the same object
return uno : : Reference < XAccessibleContext > ( this ) ;
}
// XAccessibleContext
2014-02-25 21:31:58 +01:00
sal_Int32 SAL_CALL AccessibleEditableTextPara : : getAccessibleChildCount ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
return HaveChildren ( ) ? 1 : 0 ;
}
2014-02-25 21:31:58 +01:00
uno : : Reference < XAccessible > SAL_CALL AccessibleEditableTextPara : : getAccessibleChild ( sal_Int32 i ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
if ( ! HaveChildren ( ) )
2012-12-21 23:10:24 -02:00
throw lang : : IndexOutOfBoundsException ( " No children available " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * > ( this ) ) ) ; // static_cast: disambiguate hierarchy
if ( i ! = 0 )
2012-12-21 23:10:24 -02:00
throw lang : : IndexOutOfBoundsException ( " Invalid child index " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < : : cppu : : OWeakObject * > ( this ) ) ) ; // static_cast: disambiguate hierarchy
2016-02-09 18:30:54 +01:00
auto aChild ( maImageBullet . get ( ) ) ;
2002-05-16 15:12:20 +00:00
if ( ! aChild . is ( ) )
{
// there is no hard reference available, create object then
2016-02-10 08:04:22 +01:00
aChild = new AccessibleImageBullet ( this ) ;
2002-05-16 15:12:20 +00:00
aChild - > SetEditSource ( & GetEditSource ( ) ) ;
aChild - > SetParagraphIndex ( GetParagraphIndex ( ) ) ;
aChild - > SetIndexInParent ( i ) ;
maImageBullet = aChild ;
}
2016-02-09 18:30:54 +01:00
return aChild . get ( ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
uno : : Reference < XAccessible > SAL_CALL AccessibleEditableTextPara : : getAccessibleParent ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2016-12-12 16:31:57 +02:00
SAL_WARN_IF ( ! mxParent . is ( ) , " editeng " , " AccessibleEditableTextPara::getAccessibleParent: no frontend set, did somebody forgot to call AccessibleTextHelper::SetEventSource()? " ) ;
2002-06-26 10:38:03 +00:00
2002-05-16 15:12:20 +00:00
return mxParent ;
}
2014-02-25 21:31:58 +01:00
sal_Int32 SAL_CALL AccessibleEditableTextPara : : getAccessibleIndexInParent ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
return mnIndexInParent ;
}
2014-02-25 21:31:58 +01:00
sal_Int16 SAL_CALL AccessibleEditableTextPara : : getAccessibleRole ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2002-06-25 11:21:28 +00:00
return AccessibleRole : : PARAGRAPH ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
OUString SAL_CALL AccessibleEditableTextPara : : getAccessibleDescription ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2013-11-26 14:25:22 +00:00
SolarMutexGuard aGuard ;
2003-03-27 14:06:05 +00:00
2013-11-26 14:25:22 +00:00
// append first 40 characters from text, or first line, if shorter
// (writer takes first sentence here, but that's not supported
// from EditEngine)
// throws if defunc
OUString aLine ;
if ( getCharacterCount ( ) )
aLine = getTextAtIndex ( 0 , AccessibleTextType : : LINE ) . SegmentText ;
// Get the string from the resource for the specified id.
OUString sStr ( EditResId ( RID_SVXSTR_A11Y_PARAGRAPH_DESCRIPTION ) ) ;
OUString sParaIndex = OUString : : number ( GetParagraphIndex ( ) ) ;
sStr = sStr . replaceFirst ( " $(ARG) " , sParaIndex ) ;
if ( aLine . getLength ( ) > MaxDescriptionLen )
{
OUString aCurrWord ;
sal_Int32 i ;
// search backward from MaxDescriptionLen for previous word start
for ( aCurrWord = getTextAtIndex ( MaxDescriptionLen , AccessibleTextType : : WORD ) . SegmentText ,
i = MaxDescriptionLen ,
aLine = OUString ( ) ;
i > = 0 ;
- - i )
{
if ( getTextAtIndex ( i , AccessibleTextType : : WORD ) . SegmentText ! = aCurrWord )
{
if ( i = = 0 )
// prevent completely empty string
aLine = getTextAtIndex ( 0 , AccessibleTextType : : WORD ) . SegmentText ;
else
aLine = getTextRange ( 0 , i ) ;
}
}
}
2002-05-16 15:12:20 +00:00
2013-11-26 14:25:22 +00:00
return OUString ( sStr ) + aLine ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
OUString SAL_CALL AccessibleEditableTextPara : : getAccessibleName ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2016-07-27 13:19:03 +01:00
//See tdf#101003 before implementing a body
return OUString ( ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
uno : : Reference < XAccessibleRelationSet > SAL_CALL AccessibleEditableTextPara : : getAccessibleRelationSet ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-04 16:20:36 +02:00
// #i27138# - provide relations CONTENT_FLOWS_FROM
2006-02-01 13:59:29 +00:00
// and CONTENT_FLOWS_TO
if ( mpParaManager )
{
utl : : AccessibleRelationSetHelper * pAccRelSetHelper =
new utl : : AccessibleRelationSetHelper ( ) ;
sal_Int32 nMyParaIndex ( GetParagraphIndex ( ) ) ;
// relation CONTENT_FLOWS_FROM
if ( nMyParaIndex > 0 & &
mpParaManager - > IsReferencable ( nMyParaIndex - 1 ) )
{
2015-10-29 13:57:50 +02:00
uno : : Sequence < uno : : Reference < XInterface > > aSequence
2016-02-09 18:30:54 +01:00
{ static_cast < cppu : : OWeakObject * > ( mpParaManager - > GetChild ( nMyParaIndex - 1 ) . first . get ( ) . get ( ) ) } ;
2006-02-01 13:59:29 +00:00
AccessibleRelation aAccRel ( AccessibleRelationType : : CONTENT_FLOWS_FROM ,
aSequence ) ;
pAccRelSetHelper - > AddRelation ( aAccRel ) ;
}
// relation CONTENT_FLOWS_TO
2006-06-19 13:52:02 +00:00
if ( ( nMyParaIndex + 1 ) < ( sal_Int32 ) mpParaManager - > GetNum ( ) & &
2006-02-01 13:59:29 +00:00
mpParaManager - > IsReferencable ( nMyParaIndex + 1 ) )
{
2015-10-29 13:57:50 +02:00
uno : : Sequence < uno : : Reference < XInterface > > aSequence
2016-02-09 18:30:54 +01:00
{ static_cast < cppu : : OWeakObject * > ( mpParaManager - > GetChild ( nMyParaIndex + 1 ) . first . get ( ) . get ( ) ) } ;
2006-02-01 13:59:29 +00:00
AccessibleRelation aAccRel ( AccessibleRelationType : : CONTENT_FLOWS_TO ,
aSequence ) ;
pAccRelSetHelper - > AddRelation ( aAccRel ) ;
}
return pAccRelSetHelper ;
}
else
{
// no relations, therefore empty
return uno : : Reference < XAccessibleRelationSet > ( ) ;
}
2002-05-16 15:12:20 +00:00
}
2016-07-18 09:22:27 +02:00
static uno : : Sequence < OUString > const & getAttributeNames ( )
2013-11-26 14:25:22 +00:00
{
2016-09-13 01:26:03 +02:00
static const uno : : Sequence < OUString > aNames {
" CharColor " ,
" CharContoured " ,
" CharEmphasis " ,
" CharEscapement " ,
" CharFontName " ,
" CharHeight " ,
" CharPosture " ,
" CharShadowed " ,
" CharStrikeout " ,
" CharCaseMap " ,
" CharUnderline " ,
" CharUnderlineColor " ,
" CharWeight " ,
" NumberingLevel " ,
" NumberingRules " ,
" ParaAdjust " ,
" ParaBottomMargin " ,
" ParaFirstLineIndent " ,
" ParaLeftMargin " ,
" ParaLineSpacing " ,
" ParaRightMargin " ,
" ParaTabStops " } ;
return aNames ;
2013-11-26 14:25:22 +00:00
}
struct IndexCompare
{
const PropertyValue * pValues ;
2015-09-07 09:33:18 +01:00
explicit IndexCompare ( const PropertyValue * pVals ) : pValues ( pVals ) { }
2016-06-08 17:14:34 +02:00
bool operator ( ) ( sal_Int32 a , sal_Int32 b ) const
2013-11-26 14:25:22 +00:00
{
2014-05-02 15:42:25 +02:00
return pValues [ a ] . Name < pValues [ b ] . Name ;
2013-11-26 14:25:22 +00:00
}
} ;
2016-10-26 21:33:31 +01:00
}
2013-11-26 14:25:22 +00:00
2016-10-26 21:33:31 +01:00
namespace
{
OUString GetFieldTypeNameFromField ( EFieldInfo & ree )
2013-11-26 14:25:22 +00:00
{
OUString strFldType ;
sal_Int32 nFieldType = - 1 ;
2016-10-26 21:33:31 +01:00
if ( ree . pFieldItem )
2013-11-26 14:25:22 +00:00
{
// So we get a field, check its type now.
nFieldType = ree . pFieldItem - > GetField ( ) - > GetClassId ( ) ;
}
2016-10-26 21:33:31 +01:00
switch ( nFieldType )
2013-11-26 14:25:22 +00:00
{
2016-10-26 21:33:31 +01:00
case text : : textfield : : Type : : DATE :
2013-11-26 14:25:22 +00:00
{
const SvxDateField * pDateField = static_cast < const SvxDateField * > ( ree . pFieldItem - > GetField ( ) ) ;
if ( pDateField )
{
if ( pDateField - > GetType ( ) = = SVXDATETYPE_FIX )
strFldType = " date (fixed) " ;
else if ( pDateField - > GetType ( ) = = SVXDATETYPE_VAR )
strFldType = " date (variable) " ;
}
2016-10-26 21:33:31 +01:00
break ;
2013-11-26 14:25:22 +00:00
}
2016-10-26 21:33:31 +01:00
case text : : textfield : : Type : : PAGE :
strFldType = " page-number " ;
break ;
//support the sheet name & pages fields
case text : : textfield : : Type : : PAGES :
strFldType = " page-count " ;
break ;
case text : : textfield : : Type : : TABLE :
strFldType = " sheet-name " ;
break ;
//End
case text : : textfield : : Type : : TIME :
strFldType = " time " ;
break ;
case text : : textfield : : Type : : EXTENDED_TIME :
2013-11-26 14:25:22 +00:00
{
const SvxExtTimeField * pTimeField = static_cast < const SvxExtTimeField * > ( ree . pFieldItem - > GetField ( ) ) ;
if ( pTimeField )
{
if ( pTimeField - > GetType ( ) = = SVXTIMETYPE_FIX )
strFldType = " time (fixed) " ;
else if ( pTimeField - > GetType ( ) = = SVXTIMETYPE_VAR )
strFldType = " time (variable) " ;
}
2016-10-26 21:33:31 +01:00
break ;
2013-11-26 14:25:22 +00:00
}
2016-10-26 21:33:31 +01:00
case text : : textfield : : Type : : AUTHOR :
strFldType = " author " ;
break ;
case text : : textfield : : Type : : EXTENDED_FILE :
case text : : textfield : : Type : : DOCINFO_TITLE :
strFldType = " file name " ;
break ;
default :
break ;
2013-11-26 14:25:22 +00:00
}
return strFldType ;
}
2016-10-26 21:33:31 +01:00
}
namespace accessibility
{
OUString AccessibleEditableTextPara : : GetFieldTypeNameAtIndex ( sal_Int32 nIndex )
{
SvxAccessibleTextAdapter & rCacheTF = GetTextForwarder ( ) ;
//For field object info
sal_Int32 nParaIndex = GetParagraphIndex ( ) ;
sal_Int32 nAllFieldLen = 0 ;
sal_Int32 nField = rCacheTF . GetFieldCount ( nParaIndex ) ;
for ( sal_Int32 j = 0 ; j < nField ; + + j )
{
EFieldInfo ree = rCacheTF . GetFieldInfo ( nParaIndex , j ) ;
sal_Int32 reeBegin = ree . aPosition . nIndex + nAllFieldLen ;
sal_Int32 reeEnd = reeBegin + ree . aCurrentText . getLength ( ) ;
nAllFieldLen + = ( ree . aCurrentText . getLength ( ) - 1 ) ;
if ( reeBegin > nIndex )
{
break ;
}
if ( nIndex > = reeBegin & & nIndex < reeEnd )
{
return GetFieldTypeNameFromField ( ree ) ;
}
}
return OUString ( ) ;
}
2013-11-26 14:25:22 +00:00
2014-02-25 21:31:58 +01:00
uno : : Reference < XAccessibleStateSet > SAL_CALL AccessibleEditableTextPara : : getAccessibleStateSet ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-05-23 11:46:18 +00:00
// Create a copy of the state set and return it.
: : utl : : AccessibleStateSetHelper * pStateSet = static_cast < : : utl : : AccessibleStateSetHelper * > ( mxStateSet . get ( ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-23 11:46:18 +00:00
if ( ! pStateSet )
return uno : : Reference < XAccessibleStateSet > ( ) ;
2013-11-26 14:25:22 +00:00
uno : : Reference < XAccessibleStateSet > xParentStates ;
if ( getAccessibleParent ( ) . is ( ) )
{
uno : : Reference < XAccessibleContext > xParentContext = getAccessibleParent ( ) - > getAccessibleContext ( ) ;
xParentStates = xParentContext - > getAccessibleStateSet ( ) ;
}
if ( xParentStates . is ( ) & & xParentStates - > contains ( AccessibleStateType : : EDITABLE ) )
{
pStateSet - > AddState ( AccessibleStateType : : EDITABLE ) ;
}
2002-05-23 11:46:18 +00:00
return uno : : Reference < XAccessibleStateSet > ( new : : utl : : AccessibleStateSetHelper ( * pStateSet ) ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
lang : : Locale SAL_CALL AccessibleEditableTextPara : : getLocale ( ) throw ( IllegalAccessibleComponentStateException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-08-02 10:35:10 +00:00
return implGetLocale ( ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
void SAL_CALL AccessibleEditableTextPara : : addAccessibleEventListener ( const uno : : Reference < XAccessibleEventListener > & xListener ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
if ( getNotifierClientId ( ) ! = - 1 )
: : comphelper : : AccessibleEventNotifier : : addEventListener ( getNotifierClientId ( ) , xListener ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
void SAL_CALL AccessibleEditableTextPara : : removeAccessibleEventListener ( const uno : : Reference < XAccessibleEventListener > & xListener ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
if ( getNotifierClientId ( ) ! = - 1 )
2014-11-03 17:49:06 +01:00
{
const sal_Int32 nListenerCount = : : comphelper : : AccessibleEventNotifier : : removeEventListener ( getNotifierClientId ( ) , xListener ) ;
if ( ! nListenerCount )
{
// no listeners anymore
// -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
// and at least to us not firing any events anymore, in case somebody calls
// NotifyAccessibleEvent, again
: : comphelper : : AccessibleEventNotifier : : TClientId nId ( getNotifierClientId ( ) ) ;
mnNotifierClientId = - 1 ;
: : comphelper : : AccessibleEventNotifier : : revokeClient ( nId ) ;
}
}
2002-05-16 15:12:20 +00:00
}
// XAccessibleComponent
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : containsPoint ( const awt : : Point & aTmpPoint ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2013-05-08 18:12:32 +02:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = SAL_MAX_INT32 ,
2002-05-16 15:12:20 +00:00
" AccessibleEditableTextPara::contains: index value overflow " ) ;
awt : : Rectangle aTmpRect = getBounds ( ) ;
Rectangle aRect ( Point ( aTmpRect . X , aTmpRect . Y ) , Size ( aTmpRect . Width , aTmpRect . Height ) ) ;
Point aPoint ( aTmpPoint . X , aTmpPoint . Y ) ;
return aRect . IsInside ( aPoint ) ;
}
2014-02-25 21:31:58 +01:00
uno : : Reference < XAccessible > SAL_CALL AccessibleEditableTextPara : : getAccessibleAtPoint ( const awt : : Point & _aPoint ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
if ( HaveChildren ( ) )
{
2002-10-02 16:07:03 +00:00
// #103862# No longer need to make given position relative
2002-05-23 11:46:18 +00:00
Point aPoint ( _aPoint . X , _aPoint . Y ) ;
// respect EditEngine offset to surrounding shape/cell
aPoint - = GetEEOffset ( ) ;
// convert to EditEngine coordinate system
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
Point aLogPoint ( GetViewForwarder ( ) . PixelToLogic ( aPoint , rCacheTF . GetMapMode ( ) ) ) ;
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = rCacheTF . GetBulletInfo ( GetParagraphIndex ( ) ) ;
2002-05-23 11:46:18 +00:00
if ( aBulletInfo . nParagraph ! = EE_PARA_NOT_FOUND & &
aBulletInfo . bVisible & &
aBulletInfo . nType = = SVX_NUM_BITMAP )
{
Rectangle aRect = aBulletInfo . aBounds ;
if ( aRect . IsInside ( aLogPoint ) )
return getAccessibleChild ( 0 ) ;
}
2002-05-16 15:12:20 +00:00
}
2002-05-23 11:46:18 +00:00
// no children at all, or none at given position
return uno : : Reference < XAccessible > ( ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
awt : : Rectangle SAL_CALL AccessibleEditableTextPara : : getBounds ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2013-05-08 18:12:32 +02:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = SAL_MAX_INT32 ,
2002-05-16 15:12:20 +00:00
" AccessibleEditableTextPara::getBounds: index value overflow " ) ;
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
2013-05-08 18:12:32 +02:00
Rectangle aRect = rCacheTF . GetParaBounds ( GetParagraphIndex ( ) ) ;
2002-05-16 15:12:20 +00:00
// convert to screen coordinates
Rectangle aScreenRect = AccessibleEditableTextPara : : LogicToPixel ( aRect ,
rCacheTF . GetMapMode ( ) ,
GetViewForwarder ( ) ) ;
// offset from shape/cell
Point aOffset = GetEEOffset ( ) ;
return awt : : Rectangle ( aScreenRect . Left ( ) + aOffset . X ( ) ,
aScreenRect . Top ( ) + aOffset . Y ( ) ,
aScreenRect . GetSize ( ) . Width ( ) ,
aScreenRect . GetSize ( ) . Height ( ) ) ;
}
2014-02-25 21:31:58 +01:00
awt : : Point SAL_CALL AccessibleEditableTextPara : : getLocation ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
awt : : Rectangle aRect = getBounds ( ) ;
return awt : : Point ( aRect . X , aRect . Y ) ;
}
2014-02-25 21:31:58 +01:00
awt : : Point SAL_CALL AccessibleEditableTextPara : : getLocationOnScreen ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
// relate us to parent
uno : : Reference < XAccessible > xParent = getAccessibleParent ( ) ;
if ( xParent . is ( ) )
{
uno : : Reference < XAccessibleComponent > xParentComponent ( xParent , uno : : UNO_QUERY ) ;
if ( xParentComponent . is ( ) )
{
awt : : Point aRefPoint = xParentComponent - > getLocationOnScreen ( ) ;
awt : : Point aPoint = getLocation ( ) ;
aPoint . X + = aRefPoint . X ;
aPoint . Y + = aRefPoint . Y ;
return aPoint ;
}
2010-10-04 16:20:36 +02:00
// #i88070#
2010-01-12 10:28:55 +01:00
// fallback to parent's <XAccessibleContext> instance
else
{
uno : : Reference < XAccessibleContext > xParentContext = xParent - > getAccessibleContext ( ) ;
if ( xParentContext . is ( ) )
{
uno : : Reference < XAccessibleComponent > xParentContextComponent ( xParentContext , uno : : UNO_QUERY ) ;
if ( xParentContextComponent . is ( ) )
{
awt : : Point aRefPoint = xParentContextComponent - > getLocationOnScreen ( ) ;
awt : : Point aPoint = getLocation ( ) ;
aPoint . X + = aRefPoint . X ;
aPoint . Y + = aRefPoint . Y ;
return aPoint ;
}
}
}
2002-05-16 15:12:20 +00:00
}
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " Cannot access parent " ,
2002-05-16 15:12:20 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < XAccessible * > ( this ) ) ) ; // disambiguate hierarchy
}
2014-02-25 21:31:58 +01:00
awt : : Size SAL_CALL AccessibleEditableTextPara : : getSize ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
awt : : Rectangle aRect = getBounds ( ) ;
return awt : : Size ( aRect . Width , aRect . Height ) ;
}
2014-02-25 21:31:58 +01:00
void SAL_CALL AccessibleEditableTextPara : : grabFocus ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
// set cursor to this paragraph
setSelection ( 0 , 0 ) ;
}
2015-09-11 15:44:09 +02:00
sal_Int32 SAL_CALL AccessibleEditableTextPara : : getForeground ( ) throw ( css : : uno : : RuntimeException , std : : exception )
2002-10-23 13:11:02 +00:00
{
// #104444# Added to XAccessibleComponent interface
2003-03-27 14:06:05 +00:00
svtools : : ColorConfig aColorConfig ;
2011-01-13 14:12:48 +01:00
sal_uInt32 nColor = aColorConfig . GetColorValue ( svtools : : FONTCOLOR ) . nColor ;
2002-10-23 13:11:02 +00:00
return static_cast < sal_Int32 > ( nColor ) ;
}
2015-09-11 15:44:09 +02:00
sal_Int32 SAL_CALL AccessibleEditableTextPara : : getBackground ( ) throw ( css : : uno : : RuntimeException , std : : exception )
2002-10-23 13:11:02 +00:00
{
// #104444# Added to XAccessibleComponent interface
Color aColor ( Application : : GetSettings ( ) . GetStyleSettings ( ) . GetWindowColor ( ) . GetColor ( ) ) ;
// the background is transparent
aColor . SetTransparency ( 0xFF ) ;
return static_cast < sal_Int32 > ( aColor . GetColor ( ) ) ;
}
2002-05-16 15:12:20 +00:00
// XAccessibleText
2014-02-25 21:31:58 +01:00
sal_Int32 SAL_CALL AccessibleEditableTextPara : : getCaretPosition ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
if ( ! HaveEditView ( ) )
return - 1 ;
ESelection aSelection ;
if ( GetEditViewForwarder ( ) . GetSelection ( aSelection ) & &
GetParagraphIndex ( ) = = aSelection . nEndPara )
{
// caret is always nEndPara,nEndPos
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = GetTextForwarder ( ) . GetBulletInfo ( GetParagraphIndex ( ) ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . nParagraph ! = EE_PARA_NOT_FOUND & &
aBulletInfo . bVisible & &
aBulletInfo . nType ! = SVX_NUM_BITMAP )
{
sal_Int32 nBulletLen = aBulletInfo . aText . getLength ( ) ;
if ( aSelection . nEndPos - nBulletLen > = 0 )
return aSelection . nEndPos - nBulletLen ;
}
2002-05-16 15:12:20 +00:00
return aSelection . nEndPos ;
}
// not within this paragraph
return - 1 ;
}
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : setCaretPosition ( sal_Int32 nIndex ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-06-26 14:43:05 +00:00
{
2002-06-28 08:32:31 +00:00
return setSelection ( nIndex , nIndex ) ;
2002-06-26 14:43:05 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Unicode SAL_CALL AccessibleEditableTextPara : : getCharacter ( sal_Int32 nIndex ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::getCharacter: index value overflow " ) ;
2002-08-02 10:35:10 +00:00
return OCommonAccessibleText : : getCharacter ( nIndex ) ;
2002-05-16 15:12:20 +00:00
}
2015-09-11 15:44:09 +02:00
uno : : Sequence < beans : : PropertyValue > SAL_CALL AccessibleEditableTextPara : : getCharacterAttributes ( sal_Int32 nIndex , const css : : uno : : Sequence < OUString > & rRequestedAttributes ) throw ( lang : : IndexOutOfBoundsException , beans : : UnknownPropertyException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2015-09-29 17:49:51 +02:00
//Skip the bullet range to ignore the bullet text
2013-11-26 14:25:22 +00:00
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = rCacheTF . GetBulletInfo ( GetParagraphIndex ( ) ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . bVisible )
nIndex + = aBulletInfo . aText . getLength ( ) ;
2013-11-27 11:28:57 +01:00
CheckIndex ( nIndex ) ; // may throw IndexOutOfBoundsException
2013-11-26 14:25:22 +00:00
bool bSupplementalMode = false ;
uno : : Sequence < OUString > aPropertyNames = rRequestedAttributes ;
if ( aPropertyNames . getLength ( ) = = 0 )
{
bSupplementalMode = true ;
aPropertyNames = getAttributeNames ( ) ;
}
2002-05-16 15:12:20 +00:00
2006-08-04 12:10:12 +00:00
// get default attribues...
2013-11-26 14:25:22 +00:00
: : comphelper : : SequenceAsHashMap aPropHashMap ( getDefaultAttributes ( aPropertyNames ) ) ;
2002-05-16 15:12:20 +00:00
2006-08-04 12:10:12 +00:00
// ... and override them with the direct attributes from the specific position
2013-11-26 14:25:22 +00:00
uno : : Sequence < beans : : PropertyValue > aRunAttribs ( getRunAttributes ( nIndex , aPropertyNames ) ) ;
2006-08-04 12:10:12 +00:00
sal_Int32 nRunAttribs = aRunAttribs . getLength ( ) ;
const beans : : PropertyValue * pRunAttrib = aRunAttribs . getConstArray ( ) ;
for ( sal_Int32 k = 0 ; k < nRunAttribs ; + + k )
{
const beans : : PropertyValue & rRunAttrib = pRunAttrib [ k ] ;
aPropHashMap [ rRunAttrib . Name ] = rRunAttrib . Value ; //!! should not only be the value !!
}
2002-05-16 15:12:20 +00:00
2006-08-04 12:10:12 +00:00
// get resulting sequence
uno : : Sequence < beans : : PropertyValue > aRes ;
aPropHashMap > > aRes ;
2002-05-16 15:12:20 +00:00
2006-08-04 12:10:12 +00:00
// since SequenceAsHashMap ignores property handles and property state
// we have to restore the property state here (property handles are
// of no use to the accessibility API).
sal_Int32 nRes = aRes . getLength ( ) ;
beans : : PropertyValue * pRes = aRes . getArray ( ) ;
for ( sal_Int32 i = 0 ; i < nRes ; + + i )
2002-05-16 15:12:20 +00:00
{
2006-08-04 12:10:12 +00:00
beans : : PropertyValue & rRes = pRes [ i ] ;
2014-04-09 11:03:42 +02:00
bool bIsDirectVal = false ;
2006-08-04 12:10:12 +00:00
for ( sal_Int32 k = 0 ; k < nRunAttribs & & ! bIsDirectVal ; + + k )
{
if ( rRes . Name = = pRunAttrib [ k ] . Name )
2014-04-09 11:03:42 +02:00
bIsDirectVal = true ;
2006-08-04 12:10:12 +00:00
}
rRes . Handle = - 1 ;
rRes . State = bIsDirectVal ? PropertyState_DIRECT_VALUE : PropertyState_DEFAULT_VALUE ;
2002-05-16 15:12:20 +00:00
}
2013-11-26 14:25:22 +00:00
if ( bSupplementalMode )
{
_correctValues ( nIndex , aRes ) ;
// NumberingPrefix
nRes = aRes . getLength ( ) ;
aRes . realloc ( nRes + 1 ) ;
pRes = aRes . getArray ( ) ;
beans : : PropertyValue & rRes = pRes [ nRes ] ;
rRes . Name = " NumberingPrefix " ;
OUString numStr ;
if ( aBulletInfo . nType ! = SVX_NUM_CHAR_SPECIAL & & aBulletInfo . nType ! = SVX_NUM_BITMAP )
numStr = aBulletInfo . aText ;
rRes . Value < < = numStr ;
rRes . Handle = - 1 ;
rRes . State = PropertyState_DIRECT_VALUE ;
//For field object.
OUString strFieldType = GetFieldTypeNameAtIndex ( nIndex ) ;
if ( ! strFieldType . isEmpty ( ) )
{
nRes = aRes . getLength ( ) ;
aRes . realloc ( nRes + 1 ) ;
pRes = aRes . getArray ( ) ;
beans : : PropertyValue & rResField = pRes [ nRes ] ;
beans : : PropertyValue aFieldType ;
rResField . Name = " FieldType " ;
rResField . Value < < = strFieldType . toAsciiLowerCase ( ) ;
rResField . Handle = - 1 ;
rResField . State = PropertyState_DIRECT_VALUE ;
}
//sort property values
// build sorted index array
sal_Int32 nLength = aRes . getLength ( ) ;
const beans : : PropertyValue * pPairs = aRes . getConstArray ( ) ;
2015-06-15 17:58:15 +09:00
std : : unique_ptr < sal_Int32 [ ] > pIndices ( new sal_Int32 [ nLength ] ) ;
2013-11-26 14:25:22 +00:00
sal_Int32 i = 0 ;
for ( i = 0 ; i < nLength ; i + + )
pIndices [ i ] = i ;
sort ( & pIndices [ 0 ] , & pIndices [ nLength ] , IndexCompare ( pPairs ) ) ;
2014-04-29 19:05:05 +00:00
// create sorted sequences according to index array
2013-11-26 14:25:22 +00:00
uno : : Sequence < beans : : PropertyValue > aNewValues ( nLength ) ;
beans : : PropertyValue * pNewValues = aNewValues . getArray ( ) ;
for ( i = 0 ; i < nLength ; i + + )
{
pNewValues [ i ] = pPairs [ pIndices [ i ] ] ;
}
2014-02-25 18:24:10 +01:00
2013-11-26 14:25:22 +00:00
return aNewValues ;
}
2006-08-04 12:10:12 +00:00
return aRes ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
awt : : Rectangle SAL_CALL AccessibleEditableTextPara : : getCharacterBounds ( sal_Int32 nIndex ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::getCharacterBounds: index value overflow " ) ;
2003-04-24 15:53:15 +00:00
// #108900# Have position semantics now for nIndex, as
// one-past-the-end values are legal, too.
CheckPosition ( nIndex ) ;
2002-05-16 15:12:20 +00:00
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
2014-06-09 09:34:24 +01:00
Rectangle aRect = rCacheTF . GetCharBounds ( GetParagraphIndex ( ) , nIndex ) ;
2002-05-16 15:12:20 +00:00
// convert to screen
Rectangle aScreenRect = AccessibleEditableTextPara : : LogicToPixel ( aRect ,
rCacheTF . GetMapMode ( ) ,
GetViewForwarder ( ) ) ;
2003-06-24 06:45:22 +00:00
// #109864# offset from parent (paragraph), but in screen
// coordinates. This makes sure the internal text offset in
// the outline view forwarder gets cancelled out here
awt : : Rectangle aParaRect ( getBounds ( ) ) ;
aScreenRect . Move ( - aParaRect . X , - aParaRect . Y ) ;
2002-05-16 15:12:20 +00:00
// offset from shape/cell
Point aOffset = GetEEOffset ( ) ;
return awt : : Rectangle ( aScreenRect . Left ( ) + aOffset . X ( ) ,
aScreenRect . Top ( ) + aOffset . Y ( ) ,
aScreenRect . GetSize ( ) . Width ( ) ,
aScreenRect . GetSize ( ) . Height ( ) ) ;
}
2014-02-25 21:31:58 +01:00
sal_Int32 SAL_CALL AccessibleEditableTextPara : : getCharacterCount ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::getCharacterCount: index value overflow " ) ;
2002-08-02 10:35:10 +00:00
return OCommonAccessibleText : : getCharacterCount ( ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Int32 SAL_CALL AccessibleEditableTextPara : : getIndexAtPoint ( const awt : : Point & rPoint ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2013-05-08 18:12:32 +02:00
sal_Int32 nPara ;
2014-02-02 22:16:48 -06:00
sal_Int32 nIndex ;
2002-05-16 15:12:20 +00:00
// offset from surrounding cell/shape
Point aOffset ( GetEEOffset ( ) ) ;
Point aPoint ( rPoint . X - aOffset . X ( ) , rPoint . Y - aOffset . Y ( ) ) ;
// convert to logical coordinates
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
Point aLogPoint ( GetViewForwarder ( ) . PixelToLogic ( aPoint , rCacheTF . GetMapMode ( ) ) ) ;
2002-05-27 15:43:06 +00:00
// re-offset to parent (paragraph)
2013-05-08 18:12:32 +02:00
Rectangle aParaRect = rCacheTF . GetParaBounds ( GetParagraphIndex ( ) ) ;
2002-05-27 15:43:06 +00:00
aLogPoint . Move ( aParaRect . Left ( ) , aParaRect . Top ( ) ) ;
2002-05-16 15:12:20 +00:00
if ( rCacheTF . GetIndexAtPoint ( aLogPoint , nPara , nIndex ) & &
GetParagraphIndex ( ) = = nPara )
{
2002-08-12 16:17:19 +00:00
// #102259# Double-check if we're _really_ on the given character
2002-10-02 11:20:32 +00:00
try
{
awt : : Rectangle aRect1 ( getCharacterBounds ( nIndex ) ) ;
Rectangle aRect2 ( aRect1 . X , aRect1 . Y ,
aRect1 . Width + aRect1 . X , aRect1 . Height + aRect1 . Y ) ;
if ( aRect2 . IsInside ( Point ( rPoint . X , rPoint . Y ) ) )
return nIndex ;
else
return - 1 ;
}
2011-06-20 22:01:49 +01:00
catch ( const lang : : IndexOutOfBoundsException & )
2002-10-02 11:20:32 +00:00
{
// #103927# Don't throw for invalid nIndex values
2002-08-12 16:17:19 +00:00
return - 1 ;
2002-10-02 11:20:32 +00:00
}
2002-05-16 15:12:20 +00:00
}
else
{
// not within our paragraph
return - 1 ;
}
}
2014-02-25 21:31:58 +01:00
OUString SAL_CALL AccessibleEditableTextPara : : getSelectedText ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::getSelectedText: index value overflow " ) ;
if ( ! HaveEditView ( ) )
2012-12-21 23:10:24 -02:00
return OUString ( ) ;
2002-05-16 15:12:20 +00:00
2002-08-02 10:35:10 +00:00
return OCommonAccessibleText : : getSelectedText ( ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Int32 SAL_CALL AccessibleEditableTextPara : : getSelectionStart ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::getSelectionStart: index value overflow " ) ;
if ( ! HaveEditView ( ) )
return - 1 ;
2002-08-02 10:35:10 +00:00
return OCommonAccessibleText : : getSelectionStart ( ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Int32 SAL_CALL AccessibleEditableTextPara : : getSelectionEnd ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::getSelectionEnd: index value overflow " ) ;
if ( ! HaveEditView ( ) )
return - 1 ;
2002-08-02 10:35:10 +00:00
return OCommonAccessibleText : : getSelectionEnd ( ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : setSelection ( sal_Int32 nStartIndex , sal_Int32 nEndIndex ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::setSelection: paragraph index value overflow " ) ;
CheckRange ( nStartIndex , nEndIndex ) ;
2002-08-09 14:50:29 +00:00
try
{
2014-02-19 14:52:32 +02:00
SvxEditViewForwarder & rCacheVF = GetEditViewForwarder ( true ) ;
2002-08-09 14:50:29 +00:00
return rCacheVF . SetSelection ( MakeSelection ( nStartIndex , nEndIndex ) ) ;
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : RuntimeException & )
2002-08-09 14:50:29 +00:00
{
2016-04-20 17:16:37 +02:00
return false ;
2002-08-09 14:50:29 +00:00
}
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
OUString SAL_CALL AccessibleEditableTextPara : : getText ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::getText: paragraph index value overflow " ) ;
2002-08-02 10:35:10 +00:00
return OCommonAccessibleText : : getText ( ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
OUString SAL_CALL AccessibleEditableTextPara : : getTextRange ( sal_Int32 nStartIndex , sal_Int32 nEndIndex ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::getTextRange: paragraph index value overflow " ) ;
2002-08-02 10:35:10 +00:00
return OCommonAccessibleText : : getTextRange ( nStartIndex , nEndIndex ) ;
2002-05-16 15:12:20 +00:00
}
2013-11-26 14:25:22 +00:00
void AccessibleEditableTextPara : : _correctValues ( const sal_Int32 /* nIndex */ ,
uno : : Sequence < PropertyValue > & rValues )
{
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
sal_Int32 nRes = rValues . getLength ( ) ;
beans : : PropertyValue * pRes = rValues . getArray ( ) ;
for ( sal_Int32 i = 0 ; i < nRes ; + + i )
{
beans : : PropertyValue & rRes = pRes [ i ] ;
// Char color
if ( rRes . Name = = " CharColor " )
{
uno : : Any & anyChar = rRes . Value ;
sal_uInt32 crChar = static_cast < sal_uInt32 > ( reinterpret_cast < sal_uIntPtr > ( anyChar . pReserved ) ) ;
if ( COL_AUTO = = crChar )
{
2015-09-11 15:44:09 +02:00
uno : : Reference < css : : accessibility : : XAccessibleComponent > xComponent ;
2013-11-26 14:25:22 +00:00
if ( mxParent . is ( ) )
{
xComponent . set ( mxParent , uno : : UNO_QUERY ) ;
}
else
{
xComponent . set ( m_xAccInfo , uno : : UNO_QUERY ) ;
}
if ( xComponent . is ( ) )
{
2015-09-11 15:44:09 +02:00
uno : : Reference < css : : accessibility : : XAccessibleContext > xContext ( xComponent , uno : : UNO_QUERY ) ;
2013-11-26 14:25:22 +00:00
if ( xContext - > getAccessibleRole ( ) = = AccessibleRole : : SHAPE
| | xContext - > getAccessibleRole ( ) = = AccessibleRole : : TABLE_CELL )
{
anyChar < < = COL_BLACK ;
}
else
{
Color cr ( xComponent - > getBackground ( ) ) ;
crChar = cr . IsDark ( ) ? COL_WHITE : COL_BLACK ;
anyChar < < = crChar ;
}
}
}
continue ;
}
// Underline
if ( rRes . Name = = " CharUnderline " )
{
continue ;
}
// Underline color && Mis-spell
if ( rRes . Name = = " CharUnderlineColor " )
{
uno : : Any & anyCharUnderLine = rRes . Value ;
sal_uInt32 crCharUnderLine = static_cast < sal_uInt32 > ( reinterpret_cast < sal_uIntPtr > ( anyCharUnderLine . pReserved ) ) ;
if ( COL_AUTO = = crCharUnderLine )
{
2015-09-11 15:44:09 +02:00
uno : : Reference < css : : accessibility : : XAccessibleComponent > xComponent ;
2013-11-26 14:25:22 +00:00
if ( mxParent . is ( ) )
{
xComponent . set ( mxParent , uno : : UNO_QUERY ) ;
}
else
{
xComponent . set ( m_xAccInfo , uno : : UNO_QUERY ) ;
}
if ( xComponent . is ( ) )
{
2015-09-11 15:44:09 +02:00
uno : : Reference < css : : accessibility : : XAccessibleContext > xContext ( xComponent , uno : : UNO_QUERY ) ;
2013-11-26 14:25:22 +00:00
if ( xContext - > getAccessibleRole ( ) = = AccessibleRole : : SHAPE
| | xContext - > getAccessibleRole ( ) = = AccessibleRole : : TABLE_CELL )
{
anyCharUnderLine < < = COL_BLACK ;
}
else
{
Color cr ( xComponent - > getBackground ( ) ) ;
crCharUnderLine = cr . IsDark ( ) ? COL_WHITE : COL_BLACK ;
anyCharUnderLine < < = crCharUnderLine ;
}
}
}
continue ;
}
// NumberingLevel
if ( rRes . Name = = " NumberingLevel " )
{
2014-09-30 09:02:35 +02:00
const SvxNumBulletItem & rNumBullet = static_cast < const SvxNumBulletItem & > ( rCacheTF . GetParaAttribs ( GetParagraphIndex ( ) ) . Get ( EE_PARA_NUMBULLET ) ) ;
2013-11-26 14:25:22 +00:00
if ( rNumBullet . GetNumRule ( ) - > GetLevelCount ( ) = = 0 )
{
rRes . Value < < = ( sal_Int16 ) - 1 ;
rRes . Handle = - 1 ;
rRes . State = PropertyState_DIRECT_VALUE ;
}
else
{
// SvxAccessibleTextPropertySet aPropSet( &GetEditSource(),
// ImplGetSvxCharAndParaPropertiesMap() );
// MT IA2 TODO: Check if this is the correct replacement for ImplGetSvxCharAndParaPropertiesMap
2016-05-26 16:02:39 +02:00
rtl : : Reference < SvxAccessibleTextPropertySet > xPropSet ( new SvxAccessibleTextPropertySet ( & GetEditSource ( ) , ImplGetSvxTextPortionSvxPropertySet ( ) ) ) ;
2013-11-26 14:25:22 +00:00
2015-07-13 16:17:00 +02:00
xPropSet - > SetSelection ( MakeSelection ( 0 , GetTextLen ( ) ) ) ;
rRes . Value = xPropSet - > _getPropertyValue ( rRes . Name , mnParagraphIndex ) ;
rRes . State = xPropSet - > _getPropertyState ( rRes . Name , mnParagraphIndex ) ;
2013-11-26 14:25:22 +00:00
rRes . Handle = - 1 ;
}
continue ;
}
// NumberingRules
if ( rRes . Name = = " NumberingRules " )
{
2014-06-09 09:34:24 +01:00
SfxItemSet aAttribs = rCacheTF . GetParaAttribs ( GetParagraphIndex ( ) ) ;
2015-04-24 12:25:45 +02:00
bool bVis = static_cast < const SfxUInt16Item & > ( aAttribs . Get ( EE_PARA_BULLETSTATE ) ) . GetValue ( ) ! = 0 ;
2013-11-26 14:25:22 +00:00
if ( bVis )
{
rRes . Value < < = ( sal_Int16 ) - 1 ;
rRes . Handle = - 1 ;
rRes . State = PropertyState_DIRECT_VALUE ;
}
else
{
// MT IA2 TODO: Check if this is the correct replacement for ImplGetSvxCharAndParaPropertiesMap
2016-05-26 16:02:39 +02:00
rtl : : Reference < SvxAccessibleTextPropertySet > xPropSet ( new SvxAccessibleTextPropertySet ( & GetEditSource ( ) , ImplGetSvxTextPortionSvxPropertySet ( ) ) ) ;
2015-07-13 16:17:00 +02:00
xPropSet - > SetSelection ( MakeSelection ( 0 , GetTextLen ( ) ) ) ;
rRes . Value = xPropSet - > _getPropertyValue ( rRes . Name , mnParagraphIndex ) ;
rRes . State = xPropSet - > _getPropertyState ( rRes . Name , mnParagraphIndex ) ;
2013-11-26 14:25:22 +00:00
rRes . Handle = - 1 ;
}
continue ;
}
}
}
2014-02-19 14:52:32 +02:00
sal_Int32 AccessibleEditableTextPara : : SkipField ( sal_Int32 nIndex , bool bForward )
2013-11-26 14:25:22 +00:00
{
sal_Int32 nParaIndex = GetParagraphIndex ( ) ;
SvxAccessibleTextAdapter & rCacheTF = GetTextForwarder ( ) ;
sal_Int32 nAllFieldLen = 0 ;
2014-06-09 09:34:24 +01:00
sal_Int32 nField = rCacheTF . GetFieldCount ( nParaIndex ) , nFoundFieldIndex = - 1 ;
2013-11-26 14:25:22 +00:00
sal_Int32 reeBegin = 0 , reeEnd = 0 ;
2016-10-26 21:23:16 +01:00
for ( sal_Int32 j = 0 ; j < nField ; + + j )
2013-11-26 14:25:22 +00:00
{
2016-10-26 21:23:16 +01:00
EFieldInfo ree = rCacheTF . GetFieldInfo ( nParaIndex , j ) ;
2016-10-26 21:33:31 +01:00
reeBegin = ree . aPosition . nIndex + nAllFieldLen ;
2013-11-26 14:25:22 +00:00
reeEnd = reeBegin + ree . aCurrentText . getLength ( ) ;
nAllFieldLen + = ( ree . aCurrentText . getLength ( ) - 1 ) ;
if ( reeBegin > nIndex )
{
break ;
}
2015-01-25 20:54:51 +00:00
if ( ! ree . pFieldItem )
continue ;
if ( nIndex > = reeBegin & & nIndex < reeEnd )
2013-11-26 14:25:22 +00:00
{
2015-01-25 20:54:51 +00:00
if ( ree . pFieldItem - > GetField ( ) - > GetClassId ( ) ! = text : : textfield : : Type : : URL )
2013-11-26 14:25:22 +00:00
{
nFoundFieldIndex = j ;
break ;
}
}
}
if ( nFoundFieldIndex > = 0 )
{
if ( bForward )
return reeEnd - 1 ;
else
return reeBegin ;
}
return nIndex ;
}
2016-01-11 16:02:17 +02:00
void AccessibleEditableTextPara : : ExtendByField ( css : : accessibility : : TextSegment & Segment )
2013-11-26 14:25:22 +00:00
{
sal_Int32 nParaIndex = GetParagraphIndex ( ) ;
SvxAccessibleTextAdapter & rCacheTF = GetTextForwarder ( ) ;
sal_Int32 nAllFieldLen = 0 ;
2014-06-09 09:34:24 +01:00
sal_Int32 nField = rCacheTF . GetFieldCount ( nParaIndex ) , nFoundFieldIndex = - 1 ;
2013-11-26 14:25:22 +00:00
sal_Int32 reeBegin = 0 , reeEnd = 0 ;
2016-10-26 21:23:16 +01:00
for ( sal_Int32 j = 0 ; j < nField ; + + j )
2013-11-26 14:25:22 +00:00
{
2016-10-26 21:23:16 +01:00
EFieldInfo ree = rCacheTF . GetFieldInfo ( nParaIndex , j ) ;
2013-11-26 14:25:22 +00:00
reeBegin = ree . aPosition . nIndex + nAllFieldLen ;
reeEnd = reeBegin + ree . aCurrentText . getLength ( ) ;
nAllFieldLen + = ( ree . aCurrentText . getLength ( ) - 1 ) ;
if ( reeBegin > Segment . SegmentEnd )
{
break ;
}
2015-01-25 20:55:56 +00:00
if ( ! ree . pFieldItem )
continue ;
2013-11-26 14:25:22 +00:00
if ( ( Segment . SegmentEnd > reeBegin & & Segment . SegmentEnd < = reeEnd ) | |
( Segment . SegmentStart > = reeBegin & & Segment . SegmentStart < reeEnd ) )
{
if ( ree . pFieldItem - > GetField ( ) - > GetClassId ( ) ! = text : : textfield : : Type : : URL )
{
nFoundFieldIndex = j ;
break ;
}
}
}
if ( nFoundFieldIndex > = 0 )
{
2016-01-17 14:20:23 +01:00
bool bExtend = false ;
2013-11-26 14:25:22 +00:00
if ( Segment . SegmentEnd < reeEnd )
{
Segment . SegmentEnd = reeEnd ;
2014-02-19 14:52:32 +02:00
bExtend = true ;
2013-11-26 14:25:22 +00:00
}
if ( Segment . SegmentStart > reeBegin )
{
Segment . SegmentStart = reeBegin ;
2014-02-19 14:52:32 +02:00
bExtend = true ;
2013-11-26 14:25:22 +00:00
}
if ( bExtend )
{
//If there is a bullet before the field, should add the bullet length into the segment.
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = rCacheTF . GetBulletInfo ( nParaIndex ) ;
2013-11-26 14:25:22 +00:00
sal_Int32 nBulletLen = aBulletInfo . aText . getLength ( ) ;
if ( nBulletLen > 0 )
{
Segment . SegmentEnd + = nBulletLen ;
if ( nFoundFieldIndex > 0 )
Segment . SegmentStart + = nBulletLen ;
Segment . SegmentText = GetTextRange ( Segment . SegmentStart , Segment . SegmentEnd ) ;
//After get the correct field name, should restore the offset value which don't contain the bullet.
Segment . SegmentEnd - = nBulletLen ;
if ( nFoundFieldIndex > 0 )
Segment . SegmentStart - = nBulletLen ;
}
else
Segment . SegmentText = GetTextRange ( Segment . SegmentStart , Segment . SegmentEnd ) ;
}
}
}
2015-09-11 15:44:09 +02:00
css : : accessibility : : TextSegment SAL_CALL AccessibleEditableTextPara : : getTextAtIndex ( sal_Int32 nIndex , sal_Int16 aTextType ) throw ( css : : lang : : IndexOutOfBoundsException , css : : lang : : IllegalArgumentException , css : : uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-08-02 10:35:10 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
2003-12-01 08:28:01 +00:00
" AccessibleEditableTextPara::getTextAtIndex: paragraph index value overflow " ) ;
2002-05-16 15:12:20 +00:00
2015-09-11 15:44:09 +02:00
css : : accessibility : : TextSegment aResult ;
2003-05-22 11:53:50 +00:00
aResult . SegmentStart = - 1 ;
aResult . SegmentEnd = - 1 ;
2002-05-16 15:12:20 +00:00
switch ( aTextType )
{
2013-11-26 14:25:22 +00:00
case AccessibleTextType : : CHARACTER :
case AccessibleTextType : : WORD :
{
aResult = OCommonAccessibleText : : getTextAtIndex ( nIndex , aTextType ) ;
ExtendByField ( aResult ) ;
break ;
}
2003-12-01 08:28:01 +00:00
// Not yet handled by OCommonAccessibleText. Missing
// implGetAttributeRunBoundary() method there
2002-05-16 15:12:20 +00:00
case AccessibleTextType : : ATTRIBUTE_RUN :
{
2013-05-08 18:12:32 +02:00
const sal_Int32 nTextLen = GetTextForwarder ( ) . GetTextLen ( GetParagraphIndex ( ) ) ;
2002-05-16 15:12:20 +00:00
2003-12-01 08:28:01 +00:00
if ( nIndex = = nTextLen )
2003-05-22 11:53:50 +00:00
{
2003-12-01 08:28:01 +00:00
// #i17014# Special-casing one-behind-the-end character
aResult . SegmentStart = aResult . SegmentEnd = nTextLen ;
2003-05-22 11:53:50 +00:00
}
2003-12-01 08:28:01 +00:00
else
2002-09-13 13:11:41 +00:00
{
2014-02-02 22:16:48 -06:00
sal_Int32 nStartIndex , nEndIndex ;
2015-09-29 17:49:51 +02:00
//For the bullet paragraph, the bullet string is ignored for IAText::attributes() function.
2013-11-26 14:25:22 +00:00
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
// MT IA2: Not used? sal_Int32 nBulletLen = 0;
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = rCacheTF . GetBulletInfo ( GetParagraphIndex ( ) ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . bVisible )
nIndex + = aBulletInfo . aText . getLength ( ) ;
if ( nIndex ! = 0 & & nIndex > = getCharacterCount ( ) )
nIndex = getCharacterCount ( ) - 1 ;
CheckPosition ( nIndex ) ;
2003-12-01 08:28:01 +00:00
if ( GetAttributeRun ( nStartIndex , nEndIndex , nIndex ) )
2003-05-22 11:53:50 +00:00
{
2003-12-01 08:28:01 +00:00
aResult . SegmentText = GetTextRange ( nStartIndex , nEndIndex ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . bVisible )
{
nStartIndex - = aBulletInfo . aText . getLength ( ) ;
nEndIndex - = aBulletInfo . aText . getLength ( ) ;
}
2003-12-01 08:28:01 +00:00
aResult . SegmentStart = nStartIndex ;
aResult . SegmentEnd = nEndIndex ;
2003-05-22 11:53:50 +00:00
}
2002-09-13 13:11:41 +00:00
}
2003-06-12 07:01:27 +00:00
break ;
2002-09-13 13:11:41 +00:00
}
2013-11-26 14:25:22 +00:00
case AccessibleTextType : : LINE :
{
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
sal_Int32 nParaIndex = GetParagraphIndex ( ) ;
CheckPosition ( nIndex ) ;
2015-09-11 15:44:09 +02:00
if ( nIndex ! = 0 & & nIndex = = getCharacterCount ( ) )
- - nIndex ;
2014-02-02 22:16:48 -06:00
sal_Int32 nLine , nLineCount = rCacheTF . GetLineCount ( nParaIndex ) ;
2013-11-26 14:25:22 +00:00
sal_Int32 nCurIndex ;
//the problem is that rCacheTF.GetLineLen() will include the bullet length. But for the bullet line,
//the text value doesn't contain the bullet characters. all of the bullet and numbering info are exposed
//by the IAText::attributes(). So here must do special support for bullet line.
sal_Int32 nBulletLen = 0 ;
for ( nLine = 0 , nCurIndex = 0 ; nLine < nLineCount ; + + nLine )
{
if ( nLine = = 0 )
{
EBulletInfo aBulletInfo = rCacheTF . GetBulletInfo ( nParaIndex ) ;
if ( aBulletInfo . bVisible )
{
//in bullet or numbering;
nBulletLen = aBulletInfo . aText . getLength ( ) ;
}
}
sal_Int32 nLineLen = rCacheTF . GetLineLen ( nParaIndex , nLine ) ;
if ( nLine = = 0 )
nCurIndex + = nLineLen - nBulletLen ;
else
nCurIndex + = nLineLen ;
if ( nCurIndex > nIndex )
{
if ( nLine = = 0 )
{
aResult . SegmentStart = 0 ;
aResult . SegmentEnd = nCurIndex ;
aResult . SegmentText = GetTextRange ( aResult . SegmentStart , aResult . SegmentEnd + nBulletLen ) ;
break ;
}
else
{
aResult . SegmentStart = nCurIndex - nLineLen ;
aResult . SegmentEnd = nCurIndex ;
//aResult.SegmentText = GetTextRange( aResult.SegmentStart, aResult.SegmentEnd );
aResult . SegmentText = GetTextRange ( aResult . SegmentStart + nBulletLen , aResult . SegmentEnd + nBulletLen ) ;
break ;
}
}
}
break ;
}
2002-05-16 15:12:20 +00:00
default :
2003-05-22 11:53:50 +00:00
aResult = OCommonAccessibleText : : getTextAtIndex ( nIndex , aTextType ) ;
2003-06-12 07:01:27 +00:00
break ;
2002-05-16 15:12:20 +00:00
} /* end of switch( aTextType ) */
2003-05-22 11:53:50 +00:00
return aResult ;
2002-05-16 15:12:20 +00:00
}
2015-09-11 15:44:09 +02:00
css : : accessibility : : TextSegment SAL_CALL AccessibleEditableTextPara : : getTextBeforeIndex ( sal_Int32 nIndex , sal_Int16 aTextType ) throw ( css : : lang : : IndexOutOfBoundsException , css : : lang : : IllegalArgumentException , css : : uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-08-02 10:35:10 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
2003-12-01 08:28:01 +00:00
" AccessibleEditableTextPara::getTextBeforeIndex: paragraph index value overflow " ) ;
2002-05-16 15:12:20 +00:00
2015-09-11 15:44:09 +02:00
css : : accessibility : : TextSegment aResult ;
2003-05-22 11:53:50 +00:00
aResult . SegmentStart = - 1 ;
aResult . SegmentEnd = - 1 ;
2013-11-26 14:25:22 +00:00
i18n : : Boundary aBoundary ;
2002-05-16 15:12:20 +00:00
switch ( aTextType )
{
2003-12-01 08:28:01 +00:00
// Not yet handled by OCommonAccessibleText. Missing
// implGetAttributeRunBoundary() method there
2002-05-16 15:12:20 +00:00
case AccessibleTextType : : ATTRIBUTE_RUN :
{
2013-05-08 18:12:32 +02:00
const sal_Int32 nTextLen = GetTextForwarder ( ) . GetTextLen ( GetParagraphIndex ( ) ) ;
2014-02-02 22:16:48 -06:00
sal_Int32 nStartIndex , nEndIndex ;
2002-05-16 15:12:20 +00:00
2003-12-01 08:28:01 +00:00
if ( nIndex = = nTextLen )
2002-05-16 15:12:20 +00:00
{
2003-12-01 08:28:01 +00:00
// #i17014# Special-casing one-behind-the-end character
if ( nIndex > 0 & &
GetAttributeRun ( nStartIndex , nEndIndex , nIndex - 1 ) )
2002-05-16 15:12:20 +00:00
{
2003-12-01 08:28:01 +00:00
aResult . SegmentText = GetTextRange ( nStartIndex , nEndIndex ) ;
aResult . SegmentStart = nStartIndex ;
aResult . SegmentEnd = nEndIndex ;
}
}
else
{
if ( GetAttributeRun ( nStartIndex , nEndIndex , nIndex ) )
{
// already at the left border? If not, query
// one index further left
if ( nStartIndex > 0 & &
GetAttributeRun ( nStartIndex , nEndIndex , nStartIndex - 1 ) )
2003-05-22 11:53:50 +00:00
{
aResult . SegmentText = GetTextRange ( nStartIndex , nEndIndex ) ;
aResult . SegmentStart = nStartIndex ;
aResult . SegmentEnd = nEndIndex ;
}
2002-05-16 15:12:20 +00:00
}
}
2003-06-12 07:01:27 +00:00
break ;
2002-09-13 13:11:41 +00:00
}
2013-11-26 14:25:22 +00:00
case AccessibleTextType : : LINE :
{
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
sal_Int32 nParaIndex = GetParagraphIndex ( ) ;
CheckPosition ( nIndex ) ;
2014-02-02 22:16:48 -06:00
sal_Int32 nLine , nLineCount = rCacheTF . GetLineCount ( nParaIndex ) ;
2013-11-26 14:25:22 +00:00
//the problem is that rCacheTF.GetLineLen() will include the bullet length. But for the bullet line,
//the text value doesn't contain the bullet characters. all of the bullet and numbering info are exposed
//by the IAText::attributes(). So here must do special support for bullet line.
sal_Int32 nCurIndex = 0 , nLastIndex = 0 , nCurLineLen = 0 ;
2016-01-09 22:55:28 +01:00
sal_Int32 nLastLineLen = 0 , nBulletLen = 0 ;
2013-11-26 14:25:22 +00:00
// get the line before the line the index points into
for ( nLine = 0 , nCurIndex = 0 , nLastIndex = 0 ; nLine < nLineCount ; + + nLine )
{
nLastIndex = nCurIndex ;
if ( nLine = = 0 )
{
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = rCacheTF . GetBulletInfo ( nParaIndex ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . bVisible )
{
//in bullet or numbering;
nBulletLen = aBulletInfo . aText . getLength ( ) ;
}
}
if ( nLine = = 1 )
nLastLineLen = nCurLineLen - nBulletLen ;
else
nLastLineLen = nCurLineLen ;
2014-02-02 22:16:48 -06:00
nCurLineLen = rCacheTF . GetLineLen ( nParaIndex , nLine ) ;
2013-11-26 14:25:22 +00:00
//nCurIndex += nCurLineLen;
if ( nLine = = 0 )
nCurIndex + = nCurLineLen - nBulletLen ;
else
nCurIndex + = nCurLineLen ;
//if( nCurIndex > nIndex &&
//nLastIndex > nCurLineLen )
if ( nCurIndex > nIndex )
{
if ( nLine = = 0 )
{
break ;
}
else if ( nLine = = 1 )
{
aResult . SegmentStart = 0 ;
2014-06-09 09:34:24 +01:00
aResult . SegmentEnd = nLastIndex ;
2013-11-26 14:25:22 +00:00
aResult . SegmentText = GetTextRange ( aResult . SegmentStart , aResult . SegmentEnd + nBulletLen ) ;
break ;
}
else
{
//aResult.SegmentStart = nLastIndex - nCurLineLen;
aResult . SegmentStart = nLastIndex - nLastLineLen ;
2014-06-09 09:34:24 +01:00
aResult . SegmentEnd = nLastIndex ;
2013-11-26 14:25:22 +00:00
aResult . SegmentText = GetTextRange ( aResult . SegmentStart + nBulletLen , aResult . SegmentEnd + nBulletLen ) ;
break ;
}
}
}
break ;
}
case AccessibleTextType : : WORD :
{
2014-02-19 14:52:32 +02:00
nIndex = SkipField ( nIndex , false ) ;
2013-11-26 14:25:22 +00:00
OUString sText ( implGetText ( ) ) ;
sal_Int32 nLength = sText . getLength ( ) ;
// get word at index
implGetWordBoundary ( aBoundary , nIndex ) ;
2002-09-13 13:11:41 +00:00
2013-11-26 14:25:22 +00:00
//sal_Int32 curWordStart = aBoundary.startPos;
//sal_Int32 preWordStart = curWordStart;
sal_Int32 curWordStart , preWordStart ;
if ( aBoundary . startPos = = - 1 | | aBoundary . startPos > nIndex )
curWordStart = preWordStart = nIndex ;
else
curWordStart = preWordStart = aBoundary . startPos ;
// get previous word
2014-04-09 11:03:42 +02:00
bool bWord = false ;
2013-11-26 14:25:22 +00:00
//while ( preWordStart > 0 && aBoundary.startPos == curWordStart)
while ( ( preWordStart > = 0 & & ! bWord ) | | ( aBoundary . endPos > curWordStart ) )
{
preWordStart - - ;
bWord = implGetWordBoundary ( aBoundary , preWordStart ) ;
}
if ( bWord & & implIsValidBoundary ( aBoundary , nLength ) )
{
aResult . SegmentText = sText . copy ( aBoundary . startPos , aBoundary . endPos - aBoundary . startPos ) ;
aResult . SegmentStart = aBoundary . startPos ;
aResult . SegmentEnd = aBoundary . endPos ;
ExtendByField ( aResult ) ;
}
}
break ;
case AccessibleTextType : : CHARACTER :
{
2014-02-19 14:52:32 +02:00
nIndex = SkipField ( nIndex , false ) ;
2013-11-26 14:25:22 +00:00
aResult = OCommonAccessibleText : : getTextBeforeIndex ( nIndex , aTextType ) ;
ExtendByField ( aResult ) ;
break ;
}
2002-05-16 15:12:20 +00:00
default :
2003-05-22 11:53:50 +00:00
aResult = OCommonAccessibleText : : getTextBeforeIndex ( nIndex , aTextType ) ;
2003-06-12 07:01:27 +00:00
break ;
2002-05-16 15:12:20 +00:00
} /* end of switch( aTextType ) */
2003-05-22 11:53:50 +00:00
return aResult ;
2002-05-16 15:12:20 +00:00
}
2015-09-11 15:44:09 +02:00
css : : accessibility : : TextSegment SAL_CALL AccessibleEditableTextPara : : getTextBehindIndex ( sal_Int32 nIndex , sal_Int16 aTextType ) throw ( css : : lang : : IndexOutOfBoundsException , css : : lang : : IllegalArgumentException , css : : uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-08-02 10:35:10 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
2003-12-01 08:28:01 +00:00
" AccessibleEditableTextPara::getTextBehindIndex: paragraph index value overflow " ) ;
2002-05-16 15:12:20 +00:00
2015-09-11 15:44:09 +02:00
css : : accessibility : : TextSegment aResult ;
2003-05-22 11:53:50 +00:00
aResult . SegmentStart = - 1 ;
aResult . SegmentEnd = - 1 ;
2013-11-26 14:25:22 +00:00
i18n : : Boundary aBoundary ;
2002-05-16 15:12:20 +00:00
switch ( aTextType )
{
case AccessibleTextType : : ATTRIBUTE_RUN :
{
2014-02-02 22:16:48 -06:00
sal_Int32 nStartIndex , nEndIndex ;
2002-05-16 15:12:20 +00:00
2002-08-02 10:35:10 +00:00
if ( GetAttributeRun ( nStartIndex , nEndIndex , nIndex ) )
2002-05-16 15:12:20 +00:00
{
2002-08-02 10:35:10 +00:00
// already at the right border?
if ( nEndIndex < GetTextLen ( ) )
2002-05-16 15:12:20 +00:00
{
2002-08-02 10:35:10 +00:00
if ( GetAttributeRun ( nStartIndex , nEndIndex , nEndIndex ) )
2003-05-22 11:53:50 +00:00
{
aResult . SegmentText = GetTextRange ( nStartIndex , nEndIndex ) ;
aResult . SegmentStart = nStartIndex ;
aResult . SegmentEnd = nEndIndex ;
}
2002-05-16 15:12:20 +00:00
}
}
2003-06-12 07:01:27 +00:00
break ;
2002-09-13 13:11:41 +00:00
}
2013-11-26 14:25:22 +00:00
case AccessibleTextType : : LINE :
{
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
sal_Int32 nParaIndex = GetParagraphIndex ( ) ;
CheckPosition ( nIndex ) ;
2014-02-02 22:16:48 -06:00
sal_Int32 nLine , nLineCount = rCacheTF . GetLineCount ( nParaIndex ) ;
2013-11-26 14:25:22 +00:00
sal_Int32 nCurIndex ;
//the problem is that rCacheTF.GetLineLen() will include the bullet length. But for the bullet line,
//the text value doesn't contain the bullet characters. all of the bullet and numbering info are exposed
//by the IAText::attributes(). So here must do special support for bullet line.
sal_Int32 nBulletLen = 0 ;
// get the line after the line the index points into
for ( nLine = 0 , nCurIndex = 0 ; nLine < nLineCount ; + + nLine )
{
if ( nLine = = 0 )
{
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = rCacheTF . GetBulletInfo ( nParaIndex ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . bVisible )
{
//in bullet or numbering;
nBulletLen = aBulletInfo . aText . getLength ( ) ;
}
}
2014-02-02 22:16:48 -06:00
sal_Int32 nLineLen = rCacheTF . GetLineLen ( nParaIndex , nLine ) ;
2013-11-26 14:25:22 +00:00
if ( nLine = = 0 )
nCurIndex + = nLineLen - nBulletLen ;
else
nCurIndex + = nLineLen ;
if ( nCurIndex > nIndex & &
nLine < nLineCount - 1 )
{
aResult . SegmentStart = nCurIndex ;
2014-02-02 22:16:48 -06:00
aResult . SegmentEnd = nCurIndex + rCacheTF . GetLineLen ( nParaIndex , nLine + 1 ) ;
2013-11-26 14:25:22 +00:00
aResult . SegmentText = GetTextRange ( aResult . SegmentStart + nBulletLen , aResult . SegmentEnd + nBulletLen ) ;
break ;
}
}
break ;
}
case AccessibleTextType : : WORD :
{
2014-02-19 14:52:32 +02:00
nIndex = SkipField ( nIndex , true ) ;
2013-11-26 14:25:22 +00:00
OUString sText ( implGetText ( ) ) ;
sal_Int32 nLength = sText . getLength ( ) ;
// get word at index
2014-04-09 11:03:42 +02:00
bool bWord = implGetWordBoundary ( aBoundary , nIndex ) ;
2013-11-26 14:25:22 +00:00
// real current world
sal_Int32 nextWord = nIndex ;
//if( nIndex >= aBoundary.startPos && nIndex <= aBoundary.endPos )
if ( nIndex < = aBoundary . endPos )
{
nextWord = aBoundary . endPos ;
if ( sText . getStr ( ) [ nextWord ] = = sal_Unicode ( ' ' ) ) nextWord + + ;
bWord = implGetWordBoundary ( aBoundary , nextWord ) ;
}
if ( bWord & & implIsValidBoundary ( aBoundary , nLength ) )
{
aResult . SegmentText = sText . copy ( aBoundary . startPos , aBoundary . endPos - aBoundary . startPos ) ;
aResult . SegmentStart = aBoundary . startPos ;
aResult . SegmentEnd = aBoundary . endPos ;
// If the end position of aBoundary is inside a field, extend the result to the end of the field
ExtendByField ( aResult ) ;
}
}
break ;
case AccessibleTextType : : CHARACTER :
{
2014-02-19 14:52:32 +02:00
nIndex = SkipField ( nIndex , true ) ;
2013-11-26 14:25:22 +00:00
aResult = OCommonAccessibleText : : getTextBehindIndex ( nIndex , aTextType ) ;
ExtendByField ( aResult ) ;
break ;
}
2002-05-16 15:12:20 +00:00
default :
2003-05-22 11:53:50 +00:00
aResult = OCommonAccessibleText : : getTextBehindIndex ( nIndex , aTextType ) ;
2003-06-12 07:01:27 +00:00
break ;
2002-05-16 15:12:20 +00:00
} /* end of switch( aTextType ) */
2003-05-22 11:53:50 +00:00
return aResult ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : copyText ( sal_Int32 nStartIndex , sal_Int32 nEndIndex ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
try
{
2014-02-19 14:52:32 +02:00
SvxEditViewForwarder & rCacheVF = GetEditViewForwarder ( true ) ;
2006-06-19 13:52:02 +00:00
# if OSL_DEBUG_LEVEL > 0
SvxAccessibleTextAdapter & rCacheTF = GetTextForwarder ( ) ; // MUST be after GetEditViewForwarder(), see method docs
( void ) rCacheTF ;
# else
GetTextForwarder ( ) ; // MUST be after GetEditViewForwarder(), see method docs
# endif
2014-04-09 11:03:42 +02:00
bool aRetVal ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::copyText: index value overflow " ) ;
CheckRange ( nStartIndex , nEndIndex ) ;
2002-05-16 15:12:20 +00:00
2013-11-26 14:25:22 +00:00
//Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet
sal_Int32 nBulletLen = 0 ;
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = GetTextForwarder ( ) . GetBulletInfo ( GetParagraphIndex ( ) ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . nParagraph ! = EE_PARA_NOT_FOUND & & aBulletInfo . bVisible )
nBulletLen = aBulletInfo . aText . getLength ( ) ;
2002-08-09 14:50:29 +00:00
// save current selection
ESelection aOldSelection ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
rCacheVF . GetSelection ( aOldSelection ) ;
2013-11-26 14:25:22 +00:00
//rCacheVF.SetSelection( MakeSelection(nStartIndex, nEndIndex) );
rCacheVF . SetSelection ( MakeSelection ( nStartIndex + nBulletLen , nEndIndex + nBulletLen ) ) ;
2002-08-09 14:50:29 +00:00
aRetVal = rCacheVF . Copy ( ) ;
rCacheVF . SetSelection ( aOldSelection ) ; // restore
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
return aRetVal ;
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : RuntimeException & )
2002-08-09 14:50:29 +00:00
{
2016-04-20 17:16:37 +02:00
return false ;
2002-08-09 14:50:29 +00:00
}
2002-05-16 15:12:20 +00:00
}
// XAccessibleEditableText
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : cutText ( sal_Int32 nStartIndex , sal_Int32 nEndIndex ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
try
{
2014-02-19 14:52:32 +02:00
SvxEditViewForwarder & rCacheVF = GetEditViewForwarder ( true ) ;
2002-08-09 14:50:29 +00:00
SvxAccessibleTextAdapter & rCacheTF = GetTextForwarder ( ) ; // MUST be after GetEditViewForwarder(), see method docs
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::cutText: index value overflow " ) ;
CheckRange ( nStartIndex , nEndIndex ) ;
2002-05-16 15:12:20 +00:00
2013-11-26 14:25:22 +00:00
// Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet
sal_Int32 nBulletLen = 0 ;
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = GetTextForwarder ( ) . GetBulletInfo ( GetParagraphIndex ( ) ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . nParagraph ! = EE_PARA_NOT_FOUND & & aBulletInfo . bVisible )
nBulletLen = aBulletInfo . aText . getLength ( ) ;
ESelection aSelection = MakeSelection ( nStartIndex + nBulletLen , nEndIndex + nBulletLen ) ;
//if( !rCacheTF.IsEditable( MakeSelection(nStartIndex, nEndIndex) ) )
if ( ! rCacheTF . IsEditable ( aSelection ) )
2016-04-20 17:16:37 +02:00
return false ; // non-editable area selected
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
// don't save selection, might become invalid after cut!
2013-11-26 14:25:22 +00:00
//rCacheVF.SetSelection( MakeSelection(nStartIndex, nEndIndex) );
rCacheVF . SetSelection ( aSelection ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
return rCacheVF . Cut ( ) ;
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : RuntimeException & )
2002-08-09 14:50:29 +00:00
{
2016-04-20 17:16:37 +02:00
return false ;
2002-08-09 14:50:29 +00:00
}
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : pasteText ( sal_Int32 nIndex ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
try
{
2014-02-19 14:52:32 +02:00
SvxEditViewForwarder & rCacheVF = GetEditViewForwarder ( true ) ;
2002-08-09 14:50:29 +00:00
SvxAccessibleTextAdapter & rCacheTF = GetTextForwarder ( ) ; // MUST be after GetEditViewForwarder(), see method docs
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::pasteText: index value overflow " ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
CheckPosition ( nIndex ) ;
2002-05-16 15:12:20 +00:00
2013-11-26 14:25:22 +00:00
// Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet
sal_Int32 nBulletLen = 0 ;
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = GetTextForwarder ( ) . GetBulletInfo ( GetParagraphIndex ( ) ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . nParagraph ! = EE_PARA_NOT_FOUND & & aBulletInfo . bVisible )
nBulletLen = aBulletInfo . aText . getLength ( ) ;
if ( ! rCacheTF . IsEditable ( MakeSelection ( nIndex + nBulletLen ) ) )
2016-04-20 17:16:37 +02:00
return false ; // non-editable area selected
2002-05-16 15:12:20 +00:00
2002-10-24 16:30:00 +00:00
// #104400# set empty selection (=> cursor) to given index
2013-11-26 14:25:22 +00:00
//rCacheVF.SetSelection( MakeCursor(nIndex) );
rCacheVF . SetSelection ( MakeCursor ( nIndex + nBulletLen ) ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
return rCacheVF . Paste ( ) ;
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : RuntimeException & )
2002-08-09 14:50:29 +00:00
{
2016-04-20 17:16:37 +02:00
return false ;
2002-08-09 14:50:29 +00:00
}
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : deleteText ( sal_Int32 nStartIndex , sal_Int32 nEndIndex ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
try
{
2002-10-22 14:41:17 +00:00
// #102710# Request edit view when doing changes
2003-04-01 12:46:46 +00:00
// AccessibleEmptyEditSource relies on this behaviour
2014-02-19 14:52:32 +02:00
GetEditViewForwarder ( true ) ;
2002-10-22 14:41:17 +00:00
SvxAccessibleTextAdapter & rCacheTF = GetTextForwarder ( ) ; // MUST be after GetEditViewForwarder(), see method docs
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::deleteText: index value overflow " ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
CheckRange ( nStartIndex , nEndIndex ) ;
2002-05-16 15:12:20 +00:00
2013-11-26 14:25:22 +00:00
// Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet
sal_Int32 nBulletLen = 0 ;
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = GetTextForwarder ( ) . GetBulletInfo ( GetParagraphIndex ( ) ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . nParagraph ! = EE_PARA_NOT_FOUND & & aBulletInfo . bVisible )
nBulletLen = aBulletInfo . aText . getLength ( ) ;
ESelection aSelection = MakeSelection ( nStartIndex + nBulletLen , nEndIndex + nBulletLen ) ;
//if( !rCacheTF.IsEditable( MakeSelection(nStartIndex, nEndIndex) ) )
if ( ! rCacheTF . IsEditable ( aSelection ) )
2016-04-20 17:16:37 +02:00
return false ; // non-editable area selected
2002-05-16 15:12:20 +00:00
2013-11-26 14:25:22 +00:00
//sal_Bool bRet = rCacheTF.Delete( MakeSelection(nStartIndex, nEndIndex) );
2014-04-09 11:03:42 +02:00
bool bRet = rCacheTF . Delete ( aSelection ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
GetEditSource ( ) . UpdateData ( ) ;
return bRet ;
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : RuntimeException & )
2002-08-09 14:50:29 +00:00
{
2016-04-20 17:16:37 +02:00
return false ;
2002-08-09 14:50:29 +00:00
}
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : insertText ( const OUString & sText , sal_Int32 nIndex ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
try
{
2002-10-22 14:41:17 +00:00
// #102710# Request edit view when doing changes
2003-04-01 12:46:46 +00:00
// AccessibleEmptyEditSource relies on this behaviour
2014-02-19 14:52:32 +02:00
GetEditViewForwarder ( true ) ;
2002-10-22 14:41:17 +00:00
SvxAccessibleTextAdapter & rCacheTF = GetTextForwarder ( ) ; // MUST be after GetEditViewForwarder(), see method docs
2002-08-09 14:50:29 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::insertText: index value overflow " ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
CheckPosition ( nIndex ) ;
2002-05-16 15:12:20 +00:00
2013-11-26 14:25:22 +00:00
// Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet
sal_Int32 nBulletLen = 0 ;
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = GetTextForwarder ( ) . GetBulletInfo ( GetParagraphIndex ( ) ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . nParagraph ! = EE_PARA_NOT_FOUND & & aBulletInfo . bVisible )
nBulletLen = aBulletInfo . aText . getLength ( ) ;
if ( ! rCacheTF . IsEditable ( MakeSelection ( nIndex + nBulletLen ) ) )
2016-04-20 17:16:37 +02:00
return false ; // non-editable area selected
2002-05-16 15:12:20 +00:00
2002-10-24 16:30:00 +00:00
// #104400# insert given text at empty selection (=> cursor)
2014-04-09 11:03:42 +02:00
bool bRet = rCacheTF . InsertText ( sText , MakeCursor ( nIndex + nBulletLen ) ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
rCacheTF . QuickFormatDoc ( ) ;
GetEditSource ( ) . UpdateData ( ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
return bRet ;
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : RuntimeException & )
2002-08-09 14:50:29 +00:00
{
2016-04-20 17:16:37 +02:00
return false ;
2002-08-09 14:50:29 +00:00
}
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : replaceText ( sal_Int32 nStartIndex , sal_Int32 nEndIndex , const OUString & sReplacement ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
try
{
2002-10-22 14:41:17 +00:00
// #102710# Request edit view when doing changes
2003-04-01 12:46:46 +00:00
// AccessibleEmptyEditSource relies on this behaviour
2014-02-19 14:52:32 +02:00
GetEditViewForwarder ( true ) ;
2002-10-22 14:41:17 +00:00
SvxAccessibleTextAdapter & rCacheTF = GetTextForwarder ( ) ; // MUST be after GetEditViewForwarder(), see method docs
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::replaceText: index value overflow " ) ;
CheckRange ( nStartIndex , nEndIndex ) ;
2002-05-16 15:12:20 +00:00
2013-11-26 14:25:22 +00:00
// Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet
sal_Int32 nBulletLen = 0 ;
2014-06-09 09:34:24 +01:00
EBulletInfo aBulletInfo = GetTextForwarder ( ) . GetBulletInfo ( GetParagraphIndex ( ) ) ;
2013-11-26 14:25:22 +00:00
if ( aBulletInfo . nParagraph ! = EE_PARA_NOT_FOUND & & aBulletInfo . bVisible )
nBulletLen = aBulletInfo . aText . getLength ( ) ;
ESelection aSelection = MakeSelection ( nStartIndex + nBulletLen , nEndIndex + nBulletLen ) ;
//if( !rCacheTF.IsEditable( MakeSelection(nStartIndex, nEndIndex) ) )
if ( ! rCacheTF . IsEditable ( aSelection ) )
2016-04-20 17:16:37 +02:00
return false ; // non-editable area selected
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
// insert given text into given range => replace
2013-11-26 14:25:22 +00:00
//sal_Bool bRet = rCacheTF.InsertText( sReplacement, MakeSelection(nStartIndex, nEndIndex) );
2014-04-09 11:03:42 +02:00
bool bRet = rCacheTF . InsertText ( sReplacement , aSelection ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
rCacheTF . QuickFormatDoc ( ) ;
GetEditSource ( ) . UpdateData ( ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
return bRet ;
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : RuntimeException & )
2002-08-09 14:50:29 +00:00
{
2016-04-20 17:16:37 +02:00
return false ;
2002-08-09 14:50:29 +00:00
}
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : setAttributes ( sal_Int32 nStartIndex , sal_Int32 nEndIndex , const uno : : Sequence < beans : : PropertyValue > & aAttributeSet ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
try
{
2002-10-22 14:41:17 +00:00
// #102710# Request edit view when doing changes
2003-04-01 12:46:46 +00:00
// AccessibleEmptyEditSource relies on this behaviour
2014-02-19 14:52:32 +02:00
GetEditViewForwarder ( true ) ;
2002-10-22 14:41:17 +00:00
SvxAccessibleTextAdapter & rCacheTF = GetTextForwarder ( ) ; // MUST be after GetEditViewForwarder(), see method docs
2014-06-09 09:34:24 +01:00
sal_Int32 nPara = GetParagraphIndex ( ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::setAttributes: index value overflow " ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
CheckRange ( nStartIndex , nEndIndex ) ;
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
if ( ! rCacheTF . IsEditable ( MakeSelection ( nStartIndex , nEndIndex ) ) )
2016-04-20 17:16:37 +02:00
return false ; // non-editable area selected
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
// do the indices span the whole paragraph? Then use the outliner map
// TODO: hold it as a member?
2016-05-26 16:02:39 +02:00
rtl : : Reference < SvxAccessibleTextPropertySet > xPropSet ( new SvxAccessibleTextPropertySet ( & GetEditSource ( ) ,
2002-08-09 14:50:29 +00:00
0 = = nStartIndex & &
rCacheTF . GetTextLen ( nPara ) = = nEndIndex ?
2009-06-03 11:26:39 +00:00
ImplGetSvxUnoOutlinerTextCursorSvxPropertySet ( ) :
2015-07-13 16:17:00 +02:00
ImplGetSvxTextPortionSvxPropertySet ( ) ) ) ;
2002-05-16 15:12:20 +00:00
2015-07-13 16:17:00 +02:00
xPropSet - > SetSelection ( MakeSelection ( nStartIndex , nEndIndex ) ) ;
2002-08-09 14:50:29 +00:00
// convert from PropertyValue to Any
sal_Int32 i , nLength ( aAttributeSet . getLength ( ) ) ;
const beans : : PropertyValue * pPropArray = aAttributeSet . getConstArray ( ) ;
for ( i = 0 ; i < nLength ; + + i )
2002-05-16 15:12:20 +00:00
{
2002-08-09 14:50:29 +00:00
try
{
2015-07-13 16:17:00 +02:00
xPropSet - > setPropertyValue ( pPropArray - > Name , pPropArray - > Value ) ;
2002-08-09 14:50:29 +00:00
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : Exception & )
2002-08-09 14:50:29 +00:00
{
2011-03-01 19:07:44 +01:00
OSL_FAIL ( " AccessibleEditableTextPara::setAttributes exception in setPropertyValue " ) ;
2002-08-09 14:50:29 +00:00
}
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
+ + pPropArray ;
}
2002-05-16 15:12:20 +00:00
2002-08-09 14:50:29 +00:00
rCacheTF . QuickFormatDoc ( ) ;
GetEditSource ( ) . UpdateData ( ) ;
2002-05-16 15:12:20 +00:00
2016-04-20 17:16:37 +02:00
return true ;
2002-08-09 14:50:29 +00:00
}
2011-06-20 22:01:49 +01:00
catch ( const uno : : RuntimeException & )
2002-08-09 14:50:29 +00:00
{
2016-04-20 17:16:37 +02:00
return false ;
2002-08-09 14:50:29 +00:00
}
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : setText ( const OUString & sText ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2002-05-16 15:12:20 +00:00
return replaceText ( 0 , getCharacterCount ( ) , sText ) ;
}
2006-08-04 12:10:12 +00:00
// XAccessibleTextAttributes
uno : : Sequence < beans : : PropertyValue > SAL_CALL AccessibleEditableTextPara : : getDefaultAttributes (
2012-12-21 23:10:24 -02:00
const uno : : Sequence < OUString > & rRequestedAttributes )
2014-07-06 14:45:13 +01:00
throw ( beans : : UnknownPropertyException , uno : : RuntimeException , std : : exception )
2006-08-04 12:10:12 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2006-08-04 12:10:12 +00:00
# if OSL_DEBUG_LEVEL > 0
SvxAccessibleTextAdapter & rCacheTF =
# endif
GetTextForwarder ( ) ;
# if OSL_DEBUG_LEVEL > 0
( void ) rCacheTF ;
# endif
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::getCharacterAttributes: index value overflow " ) ;
// get XPropertySetInfo for paragraph attributes and
// character attributes that span all the paragraphs text.
2016-05-26 16:02:39 +02:00
rtl : : Reference < SvxAccessibleTextPropertySet > xPropSet ( new SvxAccessibleTextPropertySet ( & GetEditSource ( ) ,
2015-07-13 16:17:00 +02:00
ImplGetSvxCharAndParaPropertiesSet ( ) ) ) ;
xPropSet - > SetSelection ( MakeSelection ( 0 , GetTextLen ( ) ) ) ;
uno : : Reference < beans : : XPropertySetInfo > xPropSetInfo = xPropSet - > getPropertySetInfo ( ) ;
2006-08-04 12:10:12 +00:00
if ( ! xPropSetInfo . is ( ) )
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " Cannot query XPropertySetInfo " ,
2006-08-04 12:10:12 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < XAccessible * > ( this ) ) ) ; // disambiguate hierarchy
// build sequence of available properties to check
sal_Int32 nLenReqAttr = rRequestedAttributes . getLength ( ) ;
uno : : Sequence < beans : : Property > aProperties ;
if ( nLenReqAttr )
{
2012-12-21 23:10:24 -02:00
const OUString * pRequestedAttributes = rRequestedAttributes . getConstArray ( ) ;
2006-08-04 12:10:12 +00:00
aProperties . realloc ( nLenReqAttr ) ;
beans : : Property * pProperties = aProperties . getArray ( ) ;
sal_Int32 nCurLen = 0 ;
for ( sal_Int32 i = 0 ; i < nLenReqAttr ; + + i )
{
beans : : Property aProp ;
try
{
aProp = xPropSetInfo - > getPropertyByName ( pRequestedAttributes [ i ] ) ;
}
2011-06-20 22:01:49 +01:00
catch ( const beans : : UnknownPropertyException & )
2006-08-04 12:10:12 +00:00
{
continue ;
}
pProperties [ nCurLen + + ] = aProp ;
}
aProperties . realloc ( nCurLen ) ;
}
else
aProperties = xPropSetInfo - > getProperties ( ) ;
sal_Int32 nLength = aProperties . getLength ( ) ;
const beans : : Property * pProperties = aProperties . getConstArray ( ) ;
// build resulting sequence
uno : : Sequence < beans : : PropertyValue > aOutSequence ( nLength ) ;
beans : : PropertyValue * pOutSequence = aOutSequence . getArray ( ) ;
sal_Int32 nOutLen = 0 ;
for ( sal_Int32 i = 0 ; i < nLength ; + + i )
{
// calling implementation functions:
// _getPropertyState and _getPropertyValue (see below) to provide
// the proper paragraph number when retrieving paragraph attributes
2015-07-13 16:17:00 +02:00
PropertyState eState = xPropSet - > _getPropertyState ( pProperties - > Name , mnParagraphIndex ) ;
2006-10-12 11:00:34 +00:00
if ( eState = = PropertyState_AMBIGUOUS_VALUE )
{
2011-03-12 14:27:45 +01:00
OSL_FAIL ( " ambiguous property value encountered " ) ;
2006-10-12 11:00:34 +00:00
}
2006-08-04 12:10:12 +00:00
//if (eState == PropertyState_DIRECT_VALUE)
// per definition all paragraph properties and all character
// properties spanning the whole paragraph should be returned
// and declared as default value
{
pOutSequence - > Name = pProperties - > Name ;
pOutSequence - > Handle = pProperties - > Handle ;
2015-07-13 16:17:00 +02:00
pOutSequence - > Value = xPropSet - > _getPropertyValue ( pProperties - > Name , mnParagraphIndex ) ;
2006-08-04 12:10:12 +00:00
pOutSequence - > State = PropertyState_DEFAULT_VALUE ;
+ + pOutSequence ;
+ + nOutLen ;
}
+ + pProperties ;
}
aOutSequence . realloc ( nOutLen ) ;
return aOutSequence ;
}
uno : : Sequence < beans : : PropertyValue > SAL_CALL AccessibleEditableTextPara : : getRunAttributes (
sal_Int32 nIndex ,
2012-12-21 23:10:24 -02:00
const uno : : Sequence < OUString > & rRequestedAttributes )
2015-01-31 20:49:41 +00:00
throw ( beans : : UnknownPropertyException , lang : : IndexOutOfBoundsException ,
uno : : RuntimeException , std : : exception )
2006-08-04 12:10:12 +00:00
{
2010-10-13 02:47:36 -05:00
SolarMutexGuard aGuard ;
2006-08-04 12:10:12 +00:00
# if OSL_DEBUG_LEVEL > 0
SvxAccessibleTextAdapter & rCacheTF =
# endif
GetTextForwarder ( ) ;
# if OSL_DEBUG_LEVEL > 0
( void ) rCacheTF ;
# endif
DBG_ASSERT ( GetParagraphIndex ( ) > = 0 & & GetParagraphIndex ( ) < = USHRT_MAX ,
" AccessibleEditableTextPara::getCharacterAttributes: index value overflow " ) ;
2013-11-26 14:25:22 +00:00
if ( getCharacterCount ( ) > 0 )
CheckIndex ( nIndex ) ;
else
CheckPosition ( nIndex ) ;
2006-08-04 12:10:12 +00:00
2016-05-26 16:02:39 +02:00
rtl : : Reference < SvxAccessibleTextPropertySet > xPropSet ( new SvxAccessibleTextPropertySet ( & GetEditSource ( ) ,
2015-07-13 16:17:00 +02:00
ImplGetSvxCharAndParaPropertiesSet ( ) ) ) ;
xPropSet - > SetSelection ( MakeSelection ( nIndex ) ) ;
uno : : Reference < beans : : XPropertySetInfo > xPropSetInfo = xPropSet - > getPropertySetInfo ( ) ;
2006-08-04 12:10:12 +00:00
if ( ! xPropSetInfo . is ( ) )
2012-12-21 23:10:24 -02:00
throw uno : : RuntimeException ( " Cannot query XPropertySetInfo " ,
2006-08-04 12:10:12 +00:00
uno : : Reference < uno : : XInterface >
( static_cast < XAccessible * > ( this ) ) ) ; // disambiguate hierarchy
// build sequence of available properties to check
sal_Int32 nLenReqAttr = rRequestedAttributes . getLength ( ) ;
uno : : Sequence < beans : : Property > aProperties ;
if ( nLenReqAttr )
{
2012-12-21 23:10:24 -02:00
const OUString * pRequestedAttributes = rRequestedAttributes . getConstArray ( ) ;
2006-08-04 12:10:12 +00:00
aProperties . realloc ( nLenReqAttr ) ;
beans : : Property * pProperties = aProperties . getArray ( ) ;
sal_Int32 nCurLen = 0 ;
for ( sal_Int32 i = 0 ; i < nLenReqAttr ; + + i )
{
beans : : Property aProp ;
try
{
aProp = xPropSetInfo - > getPropertyByName ( pRequestedAttributes [ i ] ) ;
}
2011-06-20 22:01:49 +01:00
catch ( const beans : : UnknownPropertyException & )
2006-08-04 12:10:12 +00:00
{
continue ;
}
pProperties [ nCurLen + + ] = aProp ;
}
aProperties . realloc ( nCurLen ) ;
}
else
aProperties = xPropSetInfo - > getProperties ( ) ;
sal_Int32 nLength = aProperties . getLength ( ) ;
const beans : : Property * pProperties = aProperties . getConstArray ( ) ;
// build resulting sequence
uno : : Sequence < beans : : PropertyValue > aOutSequence ( nLength ) ;
beans : : PropertyValue * pOutSequence = aOutSequence . getArray ( ) ;
sal_Int32 nOutLen = 0 ;
for ( sal_Int32 i = 0 ; i < nLength ; + + i )
{
// calling 'regular' functions that will operate on the selection
2015-07-13 16:17:00 +02:00
PropertyState eState = xPropSet - > getPropertyState ( pProperties - > Name ) ;
2006-08-04 12:10:12 +00:00
if ( eState = = PropertyState_DIRECT_VALUE )
{
pOutSequence - > Name = pProperties - > Name ;
pOutSequence - > Handle = pProperties - > Handle ;
2015-07-13 16:17:00 +02:00
pOutSequence - > Value = xPropSet - > getPropertyValue ( pProperties - > Name ) ;
2006-08-04 12:10:12 +00:00
pOutSequence - > State = eState ;
+ + pOutSequence ;
+ + nOutLen ;
}
+ + pProperties ;
}
aOutSequence . realloc ( nOutLen ) ;
return aOutSequence ;
}
2010-02-25 16:58:44 +01:00
// XAccessibleHypertext
2015-09-11 15:44:09 +02:00
: : sal_Int32 SAL_CALL AccessibleEditableTextPara : : getHyperLinkCount ( ) throw ( css : : uno : : RuntimeException , std : : exception )
2010-02-25 16:58:44 +01:00
{
SvxAccessibleTextAdapter & rT = GetTextForwarder ( ) ;
const sal_Int32 nPara = GetParagraphIndex ( ) ;
2014-06-09 09:34:24 +01:00
sal_Int32 nHyperLinks = 0 ;
sal_Int32 nFields = rT . GetFieldCount ( nPara ) ;
for ( sal_Int32 n = 0 ; n < nFields ; + + n )
2010-02-25 16:58:44 +01:00
{
EFieldInfo aField = rT . GetFieldInfo ( nPara , n ) ;
2015-09-29 11:00:09 +02:00
if ( dynamic_cast < const SvxURLField * > ( aField . pFieldItem - > GetField ( ) ) ! = nullptr )
2010-02-25 16:58:44 +01:00
nHyperLinks + + ;
}
return nHyperLinks ;
}
2015-09-11 15:44:09 +02:00
css : : uno : : Reference < css : : accessibility : : XAccessibleHyperlink > SAL_CALL AccessibleEditableTextPara : : getHyperLink ( : : sal_Int32 nLinkIndex ) throw ( css : : lang : : IndexOutOfBoundsException , css : : uno : : RuntimeException , std : : exception )
2010-02-25 16:58:44 +01:00
{
2015-09-11 15:44:09 +02:00
css : : uno : : Reference < css : : accessibility : : XAccessibleHyperlink > xRef ;
2010-02-25 16:58:44 +01:00
SvxAccessibleTextAdapter & rT = GetTextForwarder ( ) ;
const sal_Int32 nPara = GetParagraphIndex ( ) ;
2014-06-09 09:34:24 +01:00
sal_Int32 nHyperLink = 0 ;
sal_Int32 nFields = rT . GetFieldCount ( nPara ) ;
for ( sal_Int32 n = 0 ; n < nFields ; + + n )
2010-02-25 16:58:44 +01:00
{
EFieldInfo aField = rT . GetFieldInfo ( nPara , n ) ;
2015-09-29 11:00:09 +02:00
if ( dynamic_cast < const SvxURLField * > ( aField . pFieldItem - > GetField ( ) ) ! = nullptr )
2010-02-25 16:58:44 +01:00
{
if ( nHyperLink = = nLinkIndex )
{
2014-06-09 09:34:24 +01:00
sal_Int32 nEEStart = aField . aPosition . nIndex ;
2010-02-25 16:58:44 +01:00
// Translate EE Index to accessible index
2014-06-09 09:34:24 +01:00
sal_Int32 nStart = rT . CalcEditEngineIndex ( nPara , nEEStart ) ;
sal_Int32 nEnd = nStart + aField . aCurrentText . getLength ( ) ;
2010-02-25 16:58:44 +01:00
xRef = new AccessibleHyperlink ( rT , new SvxFieldItem ( * aField . pFieldItem ) , nPara , nEEStart , nStart , nEnd , aField . aCurrentText ) ;
break ;
}
nHyperLink + + ;
}
}
return xRef ;
}
2015-09-11 15:44:09 +02:00
: : sal_Int32 SAL_CALL AccessibleEditableTextPara : : getHyperLinkIndex ( : : sal_Int32 nCharIndex ) throw ( css : : lang : : IndexOutOfBoundsException , css : : uno : : RuntimeException , std : : exception )
2010-02-25 16:58:44 +01:00
{
const sal_Int32 nPara = GetParagraphIndex ( ) ;
SvxAccessibleTextAdapter & rT = GetTextForwarder ( ) ;
2014-06-09 09:34:24 +01:00
const sal_Int32 nEEIndex = rT . CalcEditEngineIndex ( nPara , nCharIndex ) ;
2013-12-10 07:58:01 +00:00
sal_Int32 nHLIndex = - 1 ; //i123620
2014-06-09 09:34:24 +01:00
sal_Int32 nHyperLink = 0 ;
sal_Int32 nFields = rT . GetFieldCount ( nPara ) ;
for ( sal_Int32 n = 0 ; n < nFields ; + + n )
2010-02-25 16:58:44 +01:00
{
EFieldInfo aField = rT . GetFieldInfo ( nPara , n ) ;
2015-09-29 11:00:09 +02:00
if ( dynamic_cast < const SvxURLField * > ( aField . pFieldItem - > GetField ( ) ) ! = nullptr )
2010-02-25 16:58:44 +01:00
{
if ( aField . aPosition . nIndex = = nEEIndex )
{
nHLIndex = nHyperLink ;
break ;
}
nHyperLink + + ;
}
}
return nHLIndex ;
}
2009-08-26 13:37:34 +00:00
// XAccessibleMultiLineText
2014-02-25 21:31:58 +01:00
sal_Int32 SAL_CALL AccessibleEditableTextPara : : getLineNumberAtIndex ( sal_Int32 nIndex ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2009-08-26 13:37:34 +00:00
{
sal_Int32 nRes = - 1 ;
sal_Int32 nPara = GetParagraphIndex ( ) ;
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
const bool bValidPara = 0 < = nPara & & nPara < rCacheTF . GetParagraphCount ( ) ;
DBG_ASSERT ( bValidPara , " getLineNumberAtIndex: current paragraph index out of range " ) ;
if ( bValidPara )
{
// we explicitly allow for the index to point at the character right behind the text
2013-05-08 18:12:32 +02:00
if ( 0 < = nIndex & & nIndex < = rCacheTF . GetTextLen ( nPara ) )
2014-02-02 22:16:48 -06:00
nRes = rCacheTF . GetLineNumberAtIndex ( nPara , nIndex ) ;
2009-08-26 13:37:34 +00:00
else
throw lang : : IndexOutOfBoundsException ( ) ;
}
return nRes ;
}
// XAccessibleMultiLineText
2015-09-11 15:44:09 +02:00
css : : accessibility : : TextSegment SAL_CALL AccessibleEditableTextPara : : getTextAtLineNumber ( sal_Int32 nLineNo ) throw ( lang : : IndexOutOfBoundsException , uno : : RuntimeException , std : : exception )
2009-08-26 13:37:34 +00:00
{
2015-09-11 15:44:09 +02:00
css : : accessibility : : TextSegment aResult ;
2009-08-26 13:37:34 +00:00
sal_Int32 nPara = GetParagraphIndex ( ) ;
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
const bool bValidPara = 0 < = nPara & & nPara < rCacheTF . GetParagraphCount ( ) ;
DBG_ASSERT ( bValidPara , " getTextAtLineNumber: current paragraph index out of range " ) ;
if ( bValidPara )
{
2013-05-08 18:12:32 +02:00
if ( 0 < = nLineNo & & nLineNo < rCacheTF . GetLineCount ( nPara ) )
2009-08-26 13:37:34 +00:00
{
2014-02-02 22:16:48 -06:00
sal_Int32 nStart = 0 , nEnd = 0 ;
rCacheTF . GetLineBoundaries ( nStart , nEnd , nPara , nLineNo ) ;
if ( nStart > = 0 & & nEnd > = 0 )
2009-08-26 13:37:34 +00:00
{
try
{
aResult . SegmentText = getTextRange ( nStart , nEnd ) ;
aResult . SegmentStart = nStart ;
aResult . SegmentEnd = nEnd ;
}
2011-06-20 22:01:49 +01:00
catch ( const lang : : IndexOutOfBoundsException & )
2009-08-26 13:37:34 +00:00
{
// this is not the exception that should be raised in this function ...
2016-06-12 14:42:51 +02:00
DBG_UNHANDLED_EXCEPTION ( ) ;
2009-08-26 13:37:34 +00:00
}
}
}
else
throw lang : : IndexOutOfBoundsException ( ) ;
}
return aResult ;
}
// XAccessibleMultiLineText
2015-09-11 15:44:09 +02:00
css : : accessibility : : TextSegment SAL_CALL AccessibleEditableTextPara : : getTextAtLineWithCaret ( ) throw ( uno : : RuntimeException , std : : exception )
2009-08-26 13:37:34 +00:00
{
2015-09-11 15:44:09 +02:00
css : : accessibility : : TextSegment aResult ;
2009-08-26 13:37:34 +00:00
try
{
aResult = getTextAtLineNumber ( getNumberOfLineWithCaret ( ) ) ;
}
2011-06-20 22:01:49 +01:00
catch ( const lang : : IndexOutOfBoundsException & )
2009-08-26 13:37:34 +00:00
{
// this one needs to be catched since this interface does not allow for it.
}
return aResult ;
}
// XAccessibleMultiLineText
2014-02-25 21:31:58 +01:00
sal_Int32 SAL_CALL AccessibleEditableTextPara : : getNumberOfLineWithCaret ( ) throw ( uno : : RuntimeException , std : : exception )
2009-08-26 13:37:34 +00:00
{
sal_Int32 nRes = - 1 ;
try
{
nRes = getLineNumberAtIndex ( getCaretPosition ( ) ) ;
}
2011-06-20 22:01:49 +01:00
catch ( const lang : : IndexOutOfBoundsException & )
2009-08-26 13:37:34 +00:00
{
// this one needs to be catched since this interface does not allow for it.
}
return nRes ;
}
2006-08-04 12:10:12 +00:00
2002-05-16 15:12:20 +00:00
// XServiceInfo
2015-04-14 12:44:47 +02:00
OUString SAL_CALL AccessibleEditableTextPara : : getImplementationName ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
2012-12-21 23:10:24 -02:00
return OUString ( " AccessibleEditableTextPara " ) ;
2002-05-16 15:12:20 +00:00
}
2014-02-25 21:31:58 +01:00
sal_Bool SAL_CALL AccessibleEditableTextPara : : supportsService ( const OUString & sServiceName ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2003-03-27 14:06:05 +00:00
2013-09-25 15:41:29 -03:00
return cppu : : supportsService ( this , sServiceName ) ;
2002-05-16 15:12:20 +00:00
}
2015-04-14 12:44:47 +02:00
uno : : Sequence < OUString > SAL_CALL AccessibleEditableTextPara : : getSupportedServiceNames ( ) throw ( uno : : RuntimeException , std : : exception )
2002-05-16 15:12:20 +00:00
{
2002-11-15 12:12:52 +00:00
// #105185# Using correct service now
2016-11-09 10:26:36 +02:00
return { OUString ( " com.sun.star.text.AccessibleParagraphView " ) } ;
2002-05-16 15:12:20 +00:00
}
} // end of namespace accessibility
2014-02-22 21:20:15 +01:00
2010-10-12 15:53:47 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */