Conflicts: starmath/inc/applicat.hxx starmath/inc/dialog.hxx starmath/inc/document.hxx starmath/inc/edit.hxx starmath/inc/format.hxx starmath/inc/node.hxx starmath/inc/parse.hxx starmath/inc/rect.hxx starmath/inc/smdll.hxx starmath/inc/smmod.hxx starmath/inc/starmath.hrc starmath/inc/symbol.hxx starmath/inc/toolbox.hxx starmath/inc/utility.hxx starmath/inc/view.hxx starmath/prj/build.lst starmath/qa/cppunit/version.map starmath/sdi/smslots.sdi starmath/source/accessibility.cxx starmath/source/cfgitem.cxx starmath/source/cfgitem.hxx starmath/source/config.cxx starmath/source/dialog.cxx starmath/source/document.cxx starmath/source/edit.cxx starmath/source/format.cxx starmath/source/makefile.mk starmath/source/math_pch.cxx starmath/source/mathmlexport.cxx starmath/source/mathmlimport.cxx starmath/source/mathtype.cxx starmath/source/node.cxx starmath/source/parse.cxx starmath/source/rect.cxx starmath/source/register.cxx starmath/source/smdetect.cxx starmath/source/smdll.cxx starmath/source/smmod.cxx starmath/source/smres.src starmath/source/symbol.cxx starmath/source/toolbox.cxx starmath/source/unomodel.cxx starmath/source/utility.cxx starmath/source/view.cxx sw/JunitTest_sw_unoapi.mk sw/Library_swd.mk sw/Makefile sw/inc/IDocumentFieldsAccess.hxx sw/inc/IDocumentSettingAccess.hxx sw/inc/IDocumentUndoRedo.hxx sw/inc/IShellCursorSupplier.hxx sw/inc/SwUndoField.hxx sw/inc/acmplwrd.hxx sw/inc/authfld.hxx sw/inc/bparr.hxx sw/inc/calbck.hxx sw/inc/calc.hxx sw/inc/ccoll.hxx sw/inc/cellatr.hxx sw/inc/cellfml.hxx sw/inc/chpfld.hxx sw/inc/cmdid.h sw/inc/crsrsh.hxx sw/inc/crstate.hxx sw/inc/dbfld.hxx sw/inc/dbmgr.hxx sw/inc/dcontact.hxx sw/inc/ddefld.hxx sw/inc/doc.hxx sw/inc/docary.hxx sw/inc/docsh.hxx sw/inc/docstat.hxx sw/inc/docstyle.hxx sw/inc/docufld.hxx sw/inc/editsh.hxx sw/inc/errhdl.hxx sw/inc/expfld.hxx sw/inc/fchrfmt.hxx sw/inc/fesh.hxx sw/inc/fldbas.hxx sw/inc/flddat.hxx sw/inc/flddropdown.hxx sw/inc/flypos.hxx sw/inc/fmtanchr.hxx sw/inc/fmtautofmt.hxx sw/inc/fmtclds.hxx sw/inc/fmtcnct.hxx sw/inc/fmtcol.hxx sw/inc/fmtfsize.hxx sw/inc/fmtftn.hxx sw/inc/fmtftntx.hxx sw/inc/fmthdft.hxx sw/inc/fmtinfmt.hxx sw/inc/fmtline.hxx sw/inc/fmtornt.hxx sw/inc/fmtpdsc.hxx sw/inc/fmtruby.hxx sw/inc/fmtsrnd.hxx sw/inc/fmturl.hxx sw/inc/fmtwrapinfluenceonobjpos.hxx sw/inc/format.hxx sw/inc/frmatr.hxx sw/inc/frmfmt.hxx sw/inc/grfatr.hxx sw/inc/helpid.h sw/inc/hintids.hxx sw/inc/hints.hxx sw/inc/htmltbl.hxx sw/inc/inetfld.hxx sw/inc/io.hxx sw/inc/iodetect.hxx sw/inc/itabenum.hxx sw/inc/ndarr.hxx sw/inc/ndgrf.hxx sw/inc/ndindex.hxx sw/inc/ndnotxt.hxx sw/inc/ndole.hxx sw/inc/ndtxt.hxx sw/inc/ndtyp.hxx sw/inc/node.hxx sw/inc/numrule.hxx sw/inc/pagedesc.hxx sw/inc/pagepreviewlayout.hxx sw/inc/pam.hxx sw/inc/paratr.hxx sw/inc/poolfmt.awk sw/inc/poolfmt.hxx sw/inc/printdata.hxx sw/inc/reffld.hxx sw/inc/shellio.hxx sw/inc/shellres.hxx sw/inc/swabstdlg.hxx sw/inc/swatrset.hxx sw/inc/swerror.h sw/inc/swprtopt.hxx sw/inc/swtable.hxx sw/inc/swtypes.hxx sw/inc/tblafmt.hxx sw/inc/tgrditem.hxx sw/inc/tox.hxx sw/inc/undobj.hxx sw/inc/unocoll.hxx sw/inc/unoframe.hxx sw/inc/unoprnms.hxx sw/inc/usrfld.hxx sw/inc/viewopt.hxx sw/inc/viewsh.hxx sw/inc/viscrs.hxx sw/prj/build.lst sw/qa/complex/accessibility/makefile.mk sw/qa/core/Test-BigPtrArray.cxx sw/qa/core/makefile.mk sw/sdi/makefile.mk sw/source/core/access/makefile.mk sw/source/core/access/textmarkuphelper.cxx sw/source/core/attr/calbck.cxx sw/source/core/attr/cellatr.cxx sw/source/core/attr/fmtwrapinfluenceonobjpos.cxx sw/source/core/attr/format.cxx sw/source/core/attr/hints.cxx sw/source/core/bastyp/calc.cxx sw/source/core/bastyp/init.cxx sw/source/core/bastyp/makefile.mk sw/source/core/bastyp/swcache.cxx sw/source/core/crsr/bookmrk.cxx sw/source/core/crsr/callnk.cxx sw/source/core/crsr/crsrsh.cxx sw/source/core/crsr/crstrvl.cxx sw/source/core/crsr/findattr.cxx sw/source/core/crsr/findcoll.cxx sw/source/core/crsr/makefile.mk sw/source/core/crsr/pam.cxx sw/source/core/crsr/swcrsr.cxx sw/source/core/crsr/trvltbl.cxx sw/source/core/crsr/unocrsr.cxx sw/source/core/crsr/viscrs.cxx sw/source/core/doc/acmplwrd.cxx sw/source/core/doc/doc.cxx sw/source/core/doc/docbm.cxx sw/source/core/doc/doccomp.cxx sw/source/core/doc/docdesc.cxx sw/source/core/doc/docdraw.cxx sw/source/core/doc/docedt.cxx sw/source/core/doc/docfld.cxx sw/source/core/doc/docfly.cxx sw/source/core/doc/docfmt.cxx sw/source/core/doc/docftn.cxx sw/source/core/doc/docglbl.cxx sw/source/core/doc/docglos.cxx sw/source/core/doc/doclay.cxx sw/source/core/doc/docnew.cxx sw/source/core/doc/docnum.cxx sw/source/core/doc/docredln.cxx sw/source/core/doc/docruby.cxx sw/source/core/doc/docsort.cxx sw/source/core/doc/docstat.cxx sw/source/core/doc/doctxm.cxx sw/source/core/doc/fmtcol.cxx sw/source/core/doc/gctable.cxx sw/source/core/doc/htmltbl.cxx sw/source/core/doc/makefile.mk sw/source/core/doc/number.cxx sw/source/core/doc/poolfmt.cxx sw/source/core/doc/tblafmt.cxx sw/source/core/doc/tblcpy.cxx sw/source/core/doc/tblrwcl.cxx sw/source/core/docnode/makefile.mk sw/source/core/docnode/ndcopy.cxx sw/source/core/docnode/ndnum.cxx sw/source/core/docnode/ndsect.cxx sw/source/core/docnode/ndtbl.cxx sw/source/core/docnode/ndtbl1.cxx sw/source/core/docnode/node.cxx sw/source/core/docnode/node2lay.cxx sw/source/core/docnode/nodes.cxx sw/source/core/docnode/section.cxx sw/source/core/docnode/swbaslnk.cxx sw/source/core/draw/dcontact.cxx sw/source/core/draw/dflyobj.cxx sw/source/core/draw/drawdoc.cxx sw/source/core/draw/dview.cxx sw/source/core/draw/makefile.mk sw/source/core/edit/autofmt.cxx sw/source/core/edit/edattr.cxx sw/source/core/edit/eddel.cxx sw/source/core/edit/edfcol.cxx sw/source/core/edit/edfld.cxx sw/source/core/edit/edfldexp.cxx sw/source/core/edit/edfmt.cxx sw/source/core/edit/edglss.cxx sw/source/core/edit/editsh.cxx sw/source/core/edit/edlingu.cxx sw/source/core/edit/ednumber.cxx sw/source/core/edit/edsect.cxx sw/source/core/edit/edtab.cxx sw/source/core/edit/edtox.cxx sw/source/core/edit/edundo.cxx sw/source/core/edit/makefile.mk sw/source/core/except/dbgloop.cxx sw/source/core/except/errhdl.cxx sw/source/core/fields/authfld.cxx sw/source/core/fields/cellfml.cxx sw/source/core/fields/chpfld.cxx sw/source/core/fields/dbfld.cxx sw/source/core/fields/ddefld.cxx sw/source/core/fields/ddetbl.cxx sw/source/core/fields/docufld.cxx sw/source/core/fields/expfld.cxx sw/source/core/fields/fldbas.cxx sw/source/core/fields/flddat.cxx sw/source/core/fields/flddropdown.cxx sw/source/core/fields/macrofld.cxx sw/source/core/fields/makefile.mk sw/source/core/fields/reffld.cxx sw/source/core/fields/scrptfld.cxx sw/source/core/fields/tblcalc.cxx sw/source/core/fields/usrfld.cxx sw/source/core/frmedt/fecopy.cxx sw/source/core/frmedt/fedesc.cxx sw/source/core/frmedt/fefly1.cxx sw/source/core/frmedt/feshview.cxx sw/source/core/frmedt/fetab.cxx sw/source/core/frmedt/fews.cxx sw/source/core/frmedt/makefile.mk sw/source/core/frmedt/tblsel.cxx sw/source/core/graphic/grfatr.cxx sw/source/core/inc/SwUndoFmt.hxx sw/source/core/inc/SwUndoTOXChange.hxx sw/source/core/inc/anchoredobjectposition.hxx sw/source/core/inc/dbgloop.hxx sw/source/core/inc/drawfont.hxx sw/source/core/inc/flowfrm.hxx sw/source/core/inc/frame.hxx sw/source/core/inc/frmtool.hxx sw/source/core/inc/layact.hxx sw/source/core/inc/layfrm.hxx sw/source/core/inc/notxtfrm.hxx sw/source/core/inc/rolbck.hxx sw/source/core/inc/rootfrm.hxx sw/source/core/inc/scriptinfo.hxx sw/source/core/inc/swblocks.hxx sw/source/core/inc/swcache.hxx sw/source/core/inc/tabfrm.hxx sw/source/core/inc/txmsrt.hxx sw/source/core/inc/undoflystrattr.hxx sw/source/core/inc/viewimp.hxx sw/source/core/layout/atrfrm.cxx sw/source/core/layout/calcmove.cxx sw/source/core/layout/dbg_lay.cxx sw/source/core/layout/findfrm.cxx sw/source/core/layout/flowfrm.cxx sw/source/core/layout/fly.cxx sw/source/core/layout/flycnt.cxx sw/source/core/layout/flyincnt.cxx sw/source/core/layout/flylay.cxx sw/source/core/layout/frmtool.cxx sw/source/core/layout/ftnfrm.cxx sw/source/core/layout/layact.cxx sw/source/core/layout/laycache.cxx sw/source/core/layout/makefile.mk sw/source/core/layout/objectformatter.cxx sw/source/core/layout/pagechg.cxx sw/source/core/layout/pagedesc.cxx sw/source/core/layout/paintfrm.cxx sw/source/core/layout/sectfrm.cxx sw/source/core/layout/tabfrm.cxx sw/source/core/layout/trvlfrm.cxx sw/source/core/layout/unusedf.cxx sw/source/core/layout/wsfrm.cxx sw/source/core/makefile.mk sw/source/core/objectpositioning/anchoredobjectposition.cxx sw/source/core/objectpositioning/ascharanchoredobjectposition.cxx sw/source/core/objectpositioning/makefile.mk sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx sw/source/core/objectpositioning/tolayoutanchoredobjectposition.cxx sw/source/core/ole/ndole.cxx sw/source/core/para/makefile.mk sw/source/core/para/paratr.cxx sw/source/core/sw3io/makefile.mk sw/source/core/sw3io/sw3convert.cxx sw/source/core/swg/SwXMLTextBlocks.cxx sw/source/core/swg/makefile.mk sw/source/core/swg/swblocks.cxx sw/source/core/table/swnewtable.cxx sw/source/core/table/swtable.cxx sw/source/core/text/EnhancedPDFExportHelper.cxx sw/source/core/text/atrstck.cxx sw/source/core/text/frmcrsr.cxx sw/source/core/text/frmform.cxx sw/source/core/text/itrcrsr.cxx sw/source/core/text/itrform2.cxx sw/source/core/text/makefile.mk sw/source/core/text/porlay.cxx sw/source/core/text/pormulti.cxx sw/source/core/text/txtfld.cxx sw/source/core/text/txtfrm.cxx sw/source/core/text/txtio.cxx sw/source/core/tox/makefile.mk sw/source/core/tox/txmsrt.cxx sw/source/core/txtnode/fmtatr2.cxx sw/source/core/txtnode/fntcache.cxx sw/source/core/txtnode/fntcap.cxx sw/source/core/txtnode/makefile.mk sw/source/core/txtnode/ndhints.cxx sw/source/core/txtnode/ndtxt.cxx sw/source/core/txtnode/swfont.cxx sw/source/core/txtnode/thints.cxx sw/source/core/txtnode/txtatr2.cxx sw/source/core/txtnode/txtedt.cxx sw/source/core/undo/SwUndoField.cxx sw/source/core/undo/SwUndoPageDesc.cxx sw/source/core/undo/SwUndoTOXChange.cxx sw/source/core/undo/docundo.cxx sw/source/core/undo/makefile.mk sw/source/core/undo/rolbck.cxx sw/source/core/undo/unbkmk.cxx sw/source/core/undo/undel.cxx sw/source/core/undo/undobj.cxx sw/source/core/undo/undobj1.cxx sw/source/core/undo/unfmco.cxx sw/source/core/undo/unins.cxx sw/source/core/undo/unnum.cxx sw/source/core/undo/unoutl.cxx sw/source/core/undo/unredln.cxx sw/source/core/undo/unsect.cxx sw/source/core/undo/unsort.cxx sw/source/core/undo/unspnd.cxx sw/source/core/undo/untbl.cxx sw/source/core/unocore/makefile.mk sw/source/core/unocore/swunohelper.cxx sw/source/core/unocore/unobkm.cxx sw/source/core/unocore/unocoll.cxx sw/source/core/unocore/unocrsrhelper.cxx sw/source/core/unocore/unodraw.cxx sw/source/core/unocore/unofield.cxx sw/source/core/unocore/unoframe.cxx sw/source/core/unocore/unomap.cxx sw/source/core/unocore/unoprnms.cxx sw/source/core/unocore/unoredlines.cxx sw/source/core/unocore/unosett.cxx sw/source/core/unocore/unosrch.cxx sw/source/core/unocore/unostyle.cxx sw/source/core/unocore/unotbl.cxx sw/source/core/view/vdraw.cxx sw/source/core/view/viewimp.cxx sw/source/core/view/viewpg.cxx sw/source/core/view/viewsh.cxx sw/source/core/view/vnew.cxx sw/source/core/view/vprint.cxx sw/source/filter/ascii/ascatr.cxx sw/source/filter/ascii/makefile.mk sw/source/filter/ascii/wrtasc.cxx sw/source/filter/basflt/fltini.cxx sw/source/filter/basflt/iodetect.cxx sw/source/filter/basflt/makefile.mk sw/source/filter/html/SwAppletImpl.cxx sw/source/filter/html/css1atr.cxx sw/source/filter/html/htmlatr.cxx sw/source/filter/html/htmlbas.cxx sw/source/filter/html/htmlcss1.cxx sw/source/filter/html/htmlfly.cxx sw/source/filter/html/htmlftn.cxx sw/source/filter/html/htmlgrin.cxx sw/source/filter/html/htmlnum.cxx sw/source/filter/html/htmlplug.cxx sw/source/filter/html/htmltab.cxx sw/source/filter/html/makefile.mk sw/source/filter/html/parcss1.cxx sw/source/filter/html/svxcss1.cxx sw/source/filter/html/swhtml.cxx sw/source/filter/inc/msfilter.hxx sw/source/filter/inc/wrtswtbl.hxx sw/source/filter/rtf/makefile.mk sw/source/filter/rtf/rtffly.cxx sw/source/filter/rtf/rtfnum.cxx sw/source/filter/rtf/rtftbl.cxx sw/source/filter/rtf/swparrtf.cxx sw/source/filter/rtf/swparrtf.hxx sw/source/filter/writer/makefile.mk sw/source/filter/writer/writer.cxx sw/source/filter/writer/wrt_fn.cxx sw/source/filter/writer/wrtswtbl.cxx sw/source/filter/ww1/fltshell.cxx sw/source/filter/ww1/makefile.mk sw/source/filter/ww1/w1class.cxx sw/source/filter/ww1/w1class.hxx sw/source/filter/ww1/w1filter.cxx sw/source/filter/ww1/w1par.cxx sw/source/filter/ww1/w1sprm.cxx sw/source/filter/ww1/w1struct.hxx sw/source/filter/ww8/README-rtf.txt sw/source/filter/ww8/attributeoutputbase.hxx sw/source/filter/ww8/docxattributeoutput.cxx sw/source/filter/ww8/docxattributeoutput.hxx sw/source/filter/ww8/docxexport.cxx sw/source/filter/ww8/docxexport.hxx sw/source/filter/ww8/docxexportfilter.cxx sw/source/filter/ww8/dump/dump8.cxx sw/source/filter/ww8/dump/dump8a.cxx sw/source/filter/ww8/dump/msvbasic.cxx sw/source/filter/ww8/dump/msvbasic.hxx sw/source/filter/ww8/dump/ww8darr.cxx sw/source/filter/ww8/dump/ww8darr.hxx sw/source/filter/ww8/dump/ww8dout.cxx sw/source/filter/ww8/dump/ww8dout.hxx sw/source/filter/ww8/dump/ww8scan.cxx sw/source/filter/ww8/dump/ww8scan.hxx sw/source/filter/ww8/dump/ww8struc.hxx sw/source/filter/ww8/makefile.mk sw/source/filter/ww8/rtfattributeoutput.cxx sw/source/filter/ww8/rtfattributeoutput.hxx sw/source/filter/ww8/rtfexport.cxx sw/source/filter/ww8/rtfexport.hxx sw/source/filter/ww8/rtfexportfilter.cxx sw/source/filter/ww8/rtfexportfilter.hxx sw/source/filter/ww8/rtfimportfilter.cxx sw/source/filter/ww8/rtfimportfilter.hxx sw/source/filter/ww8/rtfsdrexport.cxx sw/source/filter/ww8/rtfsdrexport.hxx sw/source/filter/ww8/writerhelper.cxx sw/source/filter/ww8/writerwordglue.cxx sw/source/filter/ww8/wrtw8esh.cxx sw/source/filter/ww8/wrtw8nds.cxx sw/source/filter/ww8/wrtw8num.cxx sw/source/filter/ww8/wrtw8sty.cxx sw/source/filter/ww8/wrtww8.cxx sw/source/filter/ww8/wrtww8.hxx sw/source/filter/ww8/wrtww8gr.cxx sw/source/filter/ww8/ww8atr.cxx sw/source/filter/ww8/ww8attributeoutput.hxx sw/source/filter/ww8/ww8graf.cxx sw/source/filter/ww8/ww8graf.hxx sw/source/filter/ww8/ww8graf2.cxx sw/source/filter/ww8/ww8par.cxx sw/source/filter/ww8/ww8par.hxx sw/source/filter/ww8/ww8par2.cxx sw/source/filter/ww8/ww8par3.cxx sw/source/filter/ww8/ww8par5.cxx sw/source/filter/ww8/ww8par6.cxx sw/source/filter/ww8/ww8scan.cxx sw/source/filter/ww8/ww8scan.hxx sw/source/filter/ww8/ww8struc.hxx sw/source/filter/xml/makefile.mk sw/source/filter/xml/xmlimpit.cxx sw/source/filter/xml/xmltble.cxx sw/source/filter/xml/xmltbli.cxx sw/source/ui/app/appenv.cxx sw/source/ui/app/apphdl.cxx sw/source/ui/app/applab.cxx sw/source/ui/app/appopt.cxx sw/source/ui/app/docsh.cxx sw/source/ui/app/docsh2.cxx sw/source/ui/app/docshini.cxx sw/source/ui/app/docst.cxx sw/source/ui/app/docstyle.cxx sw/source/ui/app/makefile.mk sw/source/ui/app/mn.src sw/source/ui/app/swmodul1.cxx sw/source/ui/cctrl/makefile.mk sw/source/ui/cctrl/swlbox.cxx sw/source/ui/chrdlg/break.cxx sw/source/ui/chrdlg/ccoll.cxx sw/source/ui/chrdlg/chardlg.cxx sw/source/ui/chrdlg/drpcps.cxx sw/source/ui/chrdlg/makefile.mk sw/source/ui/chrdlg/numpara.cxx sw/source/ui/chrdlg/pardlg.cxx sw/source/ui/chrdlg/swuiccoll.cxx sw/source/ui/config/barcfg.cxx sw/source/ui/config/caption.cxx sw/source/ui/config/cfgitems.cxx sw/source/ui/config/fontcfg.cxx sw/source/ui/config/mailconfigpage.cxx sw/source/ui/config/makefile.mk sw/source/ui/config/modcfg.cxx sw/source/ui/config/optcomp.cxx sw/source/ui/config/optload.cxx sw/source/ui/config/optpage.cxx sw/source/ui/config/prtopt.cxx sw/source/ui/config/uinums.cxx sw/source/ui/config/usrpref.cxx sw/source/ui/config/viewopt.cxx sw/source/ui/dbui/dbinsdlg.cxx sw/source/ui/dbui/dbmgr.cxx sw/source/ui/dbui/dbtree.cxx sw/source/ui/dbui/makefile.mk sw/source/ui/dbui/mmaddressblockpage.cxx sw/source/ui/dbui/mmdocselectpage.cxx sw/source/ui/dbui/mmoutputpage.cxx sw/source/ui/dbui/swdbtoolsclient.cxx sw/source/ui/dialog/abstract.cxx sw/source/ui/dialog/ascfldlg.cxx sw/source/ui/dialog/macassgn.cxx sw/source/ui/dialog/makefile.mk sw/source/ui/dialog/regionsw.cxx sw/source/ui/dialog/swdlgfact.cxx sw/source/ui/dialog/swdlgfact.hxx sw/source/ui/dialog/uiregionsw.cxx sw/source/ui/dochdl/gloshdl.cxx sw/source/ui/dochdl/makefile.mk sw/source/ui/dochdl/swdtflvr.cxx sw/source/ui/docvw/PostItMgr.cxx sw/source/ui/docvw/SidebarWin.cxx sw/source/ui/docvw/edtdd.cxx sw/source/ui/docvw/edtwin.cxx sw/source/ui/docvw/edtwin2.cxx sw/source/ui/docvw/edtwin3.cxx sw/source/ui/docvw/makefile.mk sw/source/ui/docvw/romenu.cxx sw/source/ui/docvw/romenu.hxx sw/source/ui/docvw/srcedtw.cxx sw/source/ui/envelp/envfmt.cxx sw/source/ui/envelp/envimg.cxx sw/source/ui/envelp/envlop1.cxx sw/source/ui/envelp/envprt.cxx sw/source/ui/envelp/label1.cxx sw/source/ui/envelp/labfmt.cxx sw/source/ui/envelp/labprt.cxx sw/source/ui/envelp/mailmrge.cxx sw/source/ui/envelp/makefile.mk sw/source/ui/fldui/flddb.cxx sw/source/ui/fldui/flddinf.cxx sw/source/ui/fldui/flddok.cxx sw/source/ui/fldui/fldedt.cxx sw/source/ui/fldui/fldfunc.cxx sw/source/ui/fldui/fldmgr.cxx sw/source/ui/fldui/fldpage.cxx sw/source/ui/fldui/fldref.cxx sw/source/ui/fldui/fldtdlg.cxx sw/source/ui/fldui/fldvar.cxx sw/source/ui/fldui/fldwrap.cxx sw/source/ui/fldui/inpdlg.cxx sw/source/ui/fldui/makefile.mk sw/source/ui/fmtui/makefile.mk sw/source/ui/fmtui/tmpdlg.cxx sw/source/ui/frmdlg/colmgr.cxx sw/source/ui/frmdlg/column.cxx sw/source/ui/frmdlg/cption.cxx sw/source/ui/frmdlg/frmdlg.cxx sw/source/ui/frmdlg/frmmgr.cxx sw/source/ui/frmdlg/frmpage.cxx sw/source/ui/frmdlg/makefile.mk sw/source/ui/frmdlg/wrap.cxx sw/source/ui/globdoc/makefile.mk sw/source/ui/inc/bmpwin.hxx sw/source/ui/inc/colmgr.hxx sw/source/ui/inc/column.hxx sw/source/ui/inc/envimg.hxx sw/source/ui/inc/envlop.hxx sw/source/ui/inc/frmpage.hxx sw/source/ui/inc/inputwin.hxx sw/source/ui/inc/javaedit.hxx sw/source/ui/inc/num.hxx sw/source/ui/inc/optpage.hxx sw/source/ui/inc/regionsw.hxx sw/source/ui/inc/split.hxx sw/source/ui/inc/swlbox.hxx sw/source/ui/inc/swmn_tmpl.hrc sw/source/ui/inc/swuiidxmrk.hxx sw/source/ui/inc/tabsh.hxx sw/source/ui/inc/toxmgr.hxx sw/source/ui/inc/uiitems.hxx sw/source/ui/inc/view.hxx sw/source/ui/inc/workctrl.hxx sw/source/ui/inc/wrap.hxx sw/source/ui/inc/wrtsh.hxx sw/source/ui/index/cnttab.cxx sw/source/ui/index/makefile.mk sw/source/ui/index/toxmgr.cxx sw/source/ui/lingu/hhcwrp.cxx sw/source/ui/lingu/makefile.mk sw/source/ui/lingu/olmenu.cxx sw/source/ui/misc/bookmark.cxx sw/source/ui/misc/docfnote.cxx sw/source/ui/misc/glosbib.cxx sw/source/ui/misc/glosdoc.cxx sw/source/ui/misc/glshell.cxx sw/source/ui/misc/insfnote.cxx sw/source/ui/misc/linenum.cxx sw/source/ui/misc/makefile.mk sw/source/ui/misc/num.cxx sw/source/ui/misc/numberingtypelistbox.cxx sw/source/ui/misc/outline.cxx sw/source/ui/misc/pgfnote.cxx sw/source/ui/misc/pggrid.cxx sw/source/ui/misc/redlndlg.cxx sw/source/ui/misc/srtdlg.cxx sw/source/ui/misc/swmodalredlineacceptdlg.cxx sw/source/ui/ribbar/conarc.cxx sw/source/ui/ribbar/drawbase.cxx sw/source/ui/ribbar/inputwin.cxx sw/source/ui/ribbar/inputwin.src sw/source/ui/ribbar/makefile.mk sw/source/ui/ribbar/tbxanchr.cxx sw/source/ui/ribbar/workctrl.cxx sw/source/ui/ribbar/workctrl.src sw/source/ui/shells/annotsh.cxx sw/source/ui/shells/basesh.cxx sw/source/ui/shells/beziersh.cxx sw/source/ui/shells/drawdlg.cxx sw/source/ui/shells/drwbassh.cxx sw/source/ui/shells/drwtxtex.cxx sw/source/ui/shells/drwtxtsh.cxx sw/source/ui/shells/frmsh.cxx sw/source/ui/shells/grfsh.cxx sw/source/ui/shells/grfshex.cxx sw/source/ui/shells/makefile.mk sw/source/ui/shells/tabsh.cxx sw/source/ui/shells/textfld.cxx sw/source/ui/shells/textglos.cxx sw/source/ui/shells/textsh.cxx sw/source/ui/shells/textsh1.cxx sw/source/ui/shells/txtattr.cxx sw/source/ui/shells/txtcrsr.cxx sw/source/ui/shells/txtnum.cxx sw/source/ui/table/convert.cxx sw/source/ui/table/instable.cxx sw/source/ui/table/makefile.mk sw/source/ui/table/swtablerep.cxx sw/source/ui/table/tabledlg.cxx sw/source/ui/table/tablemgr.cxx sw/source/ui/table/tablepg.hxx sw/source/ui/table/tautofmt.cxx sw/source/ui/uiview/formatclipboard.cxx sw/source/ui/uiview/makefile.mk sw/source/ui/uiview/pview.cxx sw/source/ui/uiview/pview.src sw/source/ui/uiview/scroll.cxx sw/source/ui/uiview/srcview.cxx sw/source/ui/uiview/swcli.cxx sw/source/ui/uiview/uivwimp.cxx sw/source/ui/uiview/view.cxx sw/source/ui/uiview/view1.cxx sw/source/ui/uiview/view2.cxx sw/source/ui/uiview/viewcoll.cxx sw/source/ui/uiview/viewdlg2.cxx sw/source/ui/uiview/viewling.cxx sw/source/ui/uiview/viewmdi.cxx sw/source/ui/uiview/viewport.cxx sw/source/ui/uiview/viewprt.cxx sw/source/ui/uiview/viewsrch.cxx sw/source/ui/uiview/viewtab.cxx sw/source/ui/uno/SwXDocumentSettings.cxx sw/source/ui/uno/SwXPrintPreviewSettings.cxx sw/source/ui/uno/SwXPrintPreviewSettings.hxx sw/source/ui/uno/unoatxt.cxx sw/source/ui/uno/unomod.cxx sw/source/ui/uno/unotxdoc.cxx sw/source/ui/uno/unotxvw.cxx sw/source/ui/utlui/attrdesc.cxx sw/source/ui/utlui/content.cxx sw/source/ui/utlui/glbltree.cxx sw/source/ui/utlui/initui.cxx sw/source/ui/utlui/makefile.mk sw/source/ui/utlui/navipi.cxx sw/source/ui/utlui/navipi.src sw/source/ui/utlui/numfmtlb.cxx sw/source/ui/utlui/prcntfld.cxx sw/source/ui/utlui/uiitems.cxx sw/source/ui/utlui/uitool.cxx sw/source/ui/utlui/unotools.cxx sw/source/ui/utlui/viewlayoutctrl.cxx sw/source/ui/utlui/zoomctrl.cxx sw/source/ui/vba/makefile.mk sw/source/ui/vba/service.cxx sw/source/ui/web/makefile.mk sw/source/ui/wrtsh/makefile.mk sw/source/ui/wrtsh/wrtsh1.cxx sw/source/ui/wrtsh/wrtsh2.cxx sw/source/ui/wrtsh/wrtsh4.cxx sw/source/ui/wrtsh/wrtundo.cxx sw/util/hidother.src sw/util/makefile.mk sw/util/msword.map
751 lines
24 KiB
C++
751 lines
24 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 License.
|
|
*
|
|
************************************************************************/
|
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
#include "precompiled_sw.hxx"
|
|
#include "accportions.hxx"
|
|
#include <tools/debug.hxx>
|
|
#include <rtl/ustring.hxx>
|
|
#include <com/sun/star/i18n/Boundary.hpp>
|
|
#include <txttypes.hxx>
|
|
|
|
// for portion replacement in Special()
|
|
#include "access.hrc"
|
|
#include <tools/resid.hxx>
|
|
#include "viewopt.hxx"
|
|
|
|
// for GetWordBoundary(...), GetSentenceBoundary(...):
|
|
#include <breakit.hxx>
|
|
#include <com/sun/star/i18n/WordType.hpp>
|
|
#include <com/sun/star/i18n/XBreakIterator.hpp>
|
|
#include <ndtxt.hxx>
|
|
|
|
// for FillSpecialPos(...)
|
|
#include "crstate.hxx"
|
|
|
|
// for SwAccessibleContext::GetResource()
|
|
#include "acccontext.hxx"
|
|
|
|
// for Post-It replacement text:
|
|
#include "txatbase.hxx"
|
|
#include "fmtfld.hxx"
|
|
#include "fldbas.hxx"
|
|
#include "docufld.hxx"
|
|
|
|
// for in-line graphics replacement:
|
|
#include "ndindex.hxx"
|
|
#include "ndnotxt.hxx"
|
|
#include "fmtflcnt.hxx"
|
|
#include "frmfmt.hxx"
|
|
#include "fmtcntnt.hxx"
|
|
|
|
|
|
using namespace ::com::sun::star;
|
|
|
|
using rtl::OUString;
|
|
using rtl::OUStringBuffer;
|
|
using i18n::Boundary;
|
|
|
|
|
|
// 'portion type' for terminating portions
|
|
#define POR_TERMINATE 0
|
|
|
|
|
|
// portion attributes
|
|
#define PORATTR_SPECIAL 1
|
|
#define PORATTR_READONLY 2
|
|
#define PORATTR_GRAY 4
|
|
#define PORATTR_TERM 128
|
|
|
|
SwAccessiblePortionData::SwAccessiblePortionData(
|
|
const SwTxtNode* pTxtNd,
|
|
const SwViewOption* pViewOpt ) :
|
|
SwPortionHandler(),
|
|
pTxtNode( pTxtNd ),
|
|
aBuffer(),
|
|
nModelPosition( 0 ),
|
|
bFinished( sal_False ),
|
|
pViewOptions( pViewOpt ),
|
|
sAccessibleString(),
|
|
aLineBreaks(),
|
|
aModelPositions(),
|
|
aAccessiblePositions(),
|
|
pSentences( 0 ),
|
|
nBeforePortions( 0 ),
|
|
bLastIsSpecial( sal_False )
|
|
{
|
|
DBG_ASSERT( pTxtNode != NULL, "Text node is needed!" );
|
|
|
|
// reserve some space to reduce memory allocations
|
|
aLineBreaks.reserve( 5 );
|
|
aModelPositions.reserve( 10 );
|
|
aAccessiblePositions.reserve( 10 );
|
|
|
|
// always include 'first' line-break position
|
|
aLineBreaks.push_back( 0 );
|
|
}
|
|
|
|
SwAccessiblePortionData::~SwAccessiblePortionData()
|
|
{
|
|
delete pSentences;
|
|
}
|
|
|
|
void SwAccessiblePortionData::Text(sal_uInt16 nLength, sal_uInt16 nType)
|
|
{
|
|
DBG_ASSERT( (nModelPosition + nLength) <= pTxtNode->GetTxt().Len(),
|
|
"portion exceeds model string!" );
|
|
|
|
DBG_ASSERT( !bFinished, "We are already done!" );
|
|
|
|
// ignore zero-length portions
|
|
if( nLength == 0 )
|
|
return;
|
|
|
|
// store 'old' positions
|
|
aModelPositions.push_back( nModelPosition );
|
|
aAccessiblePositions.push_back( aBuffer.getLength() );
|
|
|
|
// store portion attributes
|
|
sal_uInt8 nAttr = IsGrayPortionType(nType) ? PORATTR_GRAY : 0;
|
|
aPortionAttrs.push_back( nAttr );
|
|
|
|
// update buffer + nModelPosition
|
|
aBuffer.append( OUString(
|
|
pTxtNode->GetTxt().Copy(
|
|
static_cast<sal_uInt16>( nModelPosition ),
|
|
nLength ) ) );
|
|
nModelPosition += nLength;
|
|
|
|
bLastIsSpecial = sal_False;
|
|
}
|
|
|
|
void SwAccessiblePortionData::Special(
|
|
sal_uInt16 nLength, const String& rText, sal_uInt16 nType)
|
|
{
|
|
DBG_ASSERT( nModelPosition >= 0, "illegal position" );
|
|
DBG_ASSERT( (nModelPosition + nLength) <= pTxtNode->GetTxt().Len(),
|
|
"portion exceeds model string!" );
|
|
|
|
DBG_ASSERT( !bFinished, "We are already done!" );
|
|
|
|
// construct string with representation; either directly from
|
|
// rText, or use resources for special case portions
|
|
String sDisplay;
|
|
switch( nType )
|
|
{
|
|
case POR_POSTITS:
|
|
case POR_FLYCNT:
|
|
case POR_GRFNUM:
|
|
sDisplay = String(sal_Unicode(0xfffc));
|
|
|
|
break;
|
|
case POR_NUMBER:
|
|
{
|
|
OUStringBuffer aTmpBuffer( rText.Len() + 1 );
|
|
aTmpBuffer.append( rText );
|
|
aTmpBuffer.append( sal_Unicode(' ') );
|
|
sDisplay = aTmpBuffer.makeStringAndClear();
|
|
break;
|
|
}
|
|
// #i111768# - apply patch from kstribley:
|
|
// Include the control characters.
|
|
case POR_CONTROLCHAR:
|
|
{
|
|
OUStringBuffer aTmpBuffer( rText.Len() + 1 );
|
|
aTmpBuffer.append( rText );
|
|
aTmpBuffer.append( pTxtNode->GetTxt().GetChar(nModelPosition) );
|
|
sDisplay = aTmpBuffer.makeStringAndClear();
|
|
break;
|
|
}
|
|
// <--
|
|
default:
|
|
sDisplay = rText;
|
|
break;
|
|
}
|
|
|
|
// ignore zero/zero portions (except for terminators)
|
|
if( (nLength == 0) && (sDisplay.Len() == 0) && (nType != POR_TERMINATE) )
|
|
return;
|
|
|
|
// special treatment for zero length portion at the beginning:
|
|
// count as 'before' portion
|
|
if( ( nLength == 0 ) && ( nModelPosition == 0 ) )
|
|
nBeforePortions++;
|
|
|
|
// store the 'old' positions
|
|
aModelPositions.push_back( nModelPosition );
|
|
aAccessiblePositions.push_back( aBuffer.getLength() );
|
|
|
|
// store portion attributes
|
|
sal_uInt8 nAttr = PORATTR_SPECIAL;
|
|
if( IsGrayPortionType(nType) ) nAttr |= PORATTR_GRAY;
|
|
if( nLength == 0 ) nAttr |= PORATTR_READONLY;
|
|
if( nType == POR_TERMINATE ) nAttr |= PORATTR_TERM;
|
|
aPortionAttrs.push_back( nAttr );
|
|
|
|
// update buffer + nModelPosition
|
|
aBuffer.append( OUString(sDisplay) );
|
|
nModelPosition += nLength;
|
|
|
|
// remember 'last' special portion (unless it's our own 'closing'
|
|
// portions from 'Finish()'
|
|
if( nType != POR_TERMINATE )
|
|
bLastIsSpecial = sal_True;
|
|
}
|
|
|
|
void SwAccessiblePortionData::LineBreak()
|
|
{
|
|
DBG_ASSERT( !bFinished, "We are already done!" );
|
|
|
|
aLineBreaks.push_back( aBuffer.getLength() );
|
|
}
|
|
|
|
void SwAccessiblePortionData::Skip(sal_uInt16 nLength)
|
|
{
|
|
DBG_ASSERT( !bFinished, "We are already done!" );
|
|
DBG_ASSERT( aModelPositions.size() == 0, "Never Skip() after portions" );
|
|
DBG_ASSERT( nLength <= pTxtNode->GetTxt().Len(), "skip exceeds model string!" );
|
|
|
|
nModelPosition += nLength;
|
|
}
|
|
|
|
void SwAccessiblePortionData::Finish()
|
|
{
|
|
DBG_ASSERT( !bFinished, "We are already done!" );
|
|
|
|
// include terminator values: always include two 'last character'
|
|
// markers in the position arrays to make sure we always find one
|
|
// position before the end
|
|
Special( 0, String(), POR_TERMINATE );
|
|
Special( 0, String(), POR_TERMINATE );
|
|
LineBreak();
|
|
LineBreak();
|
|
|
|
sAccessibleString = aBuffer.makeStringAndClear();
|
|
bFinished = sal_True;
|
|
}
|
|
|
|
|
|
sal_Bool SwAccessiblePortionData::IsPortionAttrSet(
|
|
size_t nPortionNo, sal_uInt8 nAttr ) const
|
|
{
|
|
DBG_ASSERT( nPortionNo < aPortionAttrs.size(),
|
|
"Illegal portion number" );
|
|
return (aPortionAttrs[nPortionNo] & nAttr) != 0;
|
|
}
|
|
|
|
sal_Bool SwAccessiblePortionData::IsSpecialPortion( size_t nPortionNo ) const
|
|
{
|
|
return IsPortionAttrSet(nPortionNo, PORATTR_SPECIAL);
|
|
}
|
|
|
|
sal_Bool SwAccessiblePortionData::IsReadOnlyPortion( size_t nPortionNo ) const
|
|
{
|
|
return IsPortionAttrSet(nPortionNo, PORATTR_READONLY);
|
|
}
|
|
|
|
sal_Bool SwAccessiblePortionData::IsGrayPortionType( sal_uInt16 nType ) const
|
|
{
|
|
// gray portions?
|
|
// Compare with: inftxt.cxx, SwTxtPaintInfo::DrawViewOpt(...)
|
|
sal_Bool bGray = sal_False;
|
|
switch( nType )
|
|
{
|
|
case POR_FTN:
|
|
case POR_ISOREF:
|
|
case POR_REF:
|
|
case POR_QUOVADIS:
|
|
case POR_NUMBER:
|
|
case POR_FLD:
|
|
case POR_URL:
|
|
case POR_ISOTOX:
|
|
case POR_TOX:
|
|
case POR_HIDDEN:
|
|
bGray = !pViewOptions->IsPagePreview() &&
|
|
!pViewOptions->IsReadonly() && SwViewOption::IsFieldShadings();
|
|
break;
|
|
case POR_TAB: bGray = pViewOptions->IsTab(); break;
|
|
case POR_SOFTHYPH: bGray = pViewOptions->IsSoftHyph(); break;
|
|
case POR_BLANK: bGray = pViewOptions->IsHardBlank(); break;
|
|
default:
|
|
break; // bGray is false
|
|
}
|
|
return bGray;
|
|
}
|
|
|
|
|
|
const OUString& SwAccessiblePortionData::GetAccessibleString() const
|
|
{
|
|
DBG_ASSERT( bFinished, "Shouldn't call this before we are done!" );
|
|
|
|
return sAccessibleString;
|
|
}
|
|
|
|
|
|
void SwAccessiblePortionData::GetLineBoundary(
|
|
Boundary& rBound,
|
|
sal_Int32 nPos ) const
|
|
{
|
|
FillBoundary( rBound, aLineBreaks,
|
|
FindBreak( aLineBreaks, nPos ) );
|
|
}
|
|
|
|
// #i89175#
|
|
sal_Int32 SwAccessiblePortionData::GetLineCount() const
|
|
{
|
|
size_t nBreaks = aLineBreaks.size();
|
|
// A non-empty paragraph has at least 4 breaks: one for each line3 and
|
|
// 3 additional ones.
|
|
// An empty paragraph has 3 breaks.
|
|
// Less than 3 breaks is an error case.
|
|
sal_Int32 nLineCount = ( nBreaks > 3 )
|
|
? nBreaks - 3
|
|
: ( ( nBreaks == 3 ) ? 1 : 0 );
|
|
return nLineCount;
|
|
}
|
|
|
|
sal_Int32 SwAccessiblePortionData::GetLineNo( const sal_Int32 nPos ) const
|
|
{
|
|
sal_Int32 nLineNo = FindBreak( aLineBreaks, nPos );
|
|
|
|
// handling of position after last character
|
|
const sal_Int32 nLineCount( GetLineCount() );
|
|
if ( nLineNo >= nLineCount )
|
|
{
|
|
nLineNo = nLineCount - 1;
|
|
}
|
|
|
|
return nLineNo;
|
|
}
|
|
|
|
void SwAccessiblePortionData::GetBoundaryOfLine( const sal_Int32 nLineNo,
|
|
i18n::Boundary& rLineBound )
|
|
{
|
|
FillBoundary( rLineBound, aLineBreaks, nLineNo );
|
|
}
|
|
// <--
|
|
|
|
void SwAccessiblePortionData::GetLastLineBoundary(
|
|
Boundary& rBound ) const
|
|
{
|
|
DBG_ASSERT( aLineBreaks.size() >= 2, "need min + max value" );
|
|
|
|
// The last two positions except the two deleimiters are the ones
|
|
// we are looking for, except for empty paragraphs (nBreaks==3)
|
|
size_t nBreaks = aLineBreaks.size();
|
|
FillBoundary( rBound, aLineBreaks, nBreaks <= 3 ? 0 : nBreaks-4 );
|
|
}
|
|
|
|
sal_uInt16 SwAccessiblePortionData::GetModelPosition( sal_Int32 nPos ) const
|
|
{
|
|
DBG_ASSERT( nPos >= 0, "illegal position" );
|
|
DBG_ASSERT( nPos <= sAccessibleString.getLength(), "illegal position" );
|
|
|
|
// find the portion number
|
|
size_t nPortionNo = FindBreak( aAccessiblePositions, nPos );
|
|
|
|
// get model portion size
|
|
sal_Int32 nStartPos = aModelPositions[nPortionNo];
|
|
|
|
// if it's a non-special portion, move into the portion, else
|
|
// return the portion start
|
|
if( ! IsSpecialPortion( nPortionNo ) )
|
|
{
|
|
// 'wide' portions have to be of the same width
|
|
DBG_ASSERT( ( aModelPositions[nPortionNo+1] - nStartPos ) ==
|
|
( aAccessiblePositions[nPortionNo+1] -
|
|
aAccessiblePositions[nPortionNo] ),
|
|
"accesability portion disagrees with text model" );
|
|
|
|
sal_Int32 nWithinPortion = nPos - aAccessiblePositions[nPortionNo];
|
|
nStartPos += nWithinPortion;
|
|
}
|
|
// else: return nStartPos unmodified
|
|
|
|
DBG_ASSERT( (nStartPos >= 0) && (nStartPos < USHRT_MAX),
|
|
"How can the SwTxtNode have so many characters?" );
|
|
return static_cast<sal_uInt16>(nStartPos);
|
|
}
|
|
|
|
void SwAccessiblePortionData::FillBoundary(
|
|
Boundary& rBound,
|
|
const Positions_t& rPositions,
|
|
size_t nPos ) const
|
|
{
|
|
rBound.startPos = rPositions[nPos];
|
|
rBound.endPos = rPositions[nPos+1];
|
|
}
|
|
|
|
|
|
size_t SwAccessiblePortionData::FindBreak(
|
|
const Positions_t& rPositions,
|
|
sal_Int32 nValue ) const
|
|
{
|
|
DBG_ASSERT( rPositions.size() >= 2, "need min + max value" );
|
|
DBG_ASSERT( rPositions[0] <= nValue, "need min value" );
|
|
DBG_ASSERT( rPositions[rPositions.size()-1] >= nValue,
|
|
"need first terminator value" );
|
|
DBG_ASSERT( rPositions[rPositions.size()-2] >= nValue,
|
|
"need second terminator value" );
|
|
|
|
size_t nMin = 0;
|
|
size_t nMax = rPositions.size()-2;
|
|
|
|
// loop until no more than two candidates are left
|
|
while( nMin+1 < nMax )
|
|
{
|
|
// check loop invariants
|
|
DBG_ASSERT( ( (nMin == 0) && (rPositions[nMin] <= nValue) ) ||
|
|
( (nMin != 0) && (rPositions[nMin] < nValue) ),
|
|
"minvalue not minimal" );
|
|
DBG_ASSERT( nValue <= rPositions[nMax], "max value not maximal" );
|
|
|
|
// get middle (and ensure progress)
|
|
size_t nMiddle = (nMin + nMax)/2;
|
|
DBG_ASSERT( nMin < nMiddle, "progress?" );
|
|
DBG_ASSERT( nMiddle < nMax, "progress?" );
|
|
|
|
// check array
|
|
DBG_ASSERT( rPositions[nMin] <= rPositions[nMiddle],
|
|
"garbled positions array" );
|
|
DBG_ASSERT( rPositions[nMiddle] <= rPositions[nMax],
|
|
"garbled positions array" );
|
|
|
|
if( nValue > rPositions[nMiddle] )
|
|
nMin = nMiddle;
|
|
else
|
|
nMax = nMiddle;
|
|
}
|
|
|
|
// only two are left; we only need to check which one is the winner
|
|
DBG_ASSERT( (nMax == nMin) || (nMax == nMin+1), "only two left" );
|
|
if( (rPositions[nMin] < nValue) && (rPositions[nMin+1] <= nValue) )
|
|
nMin = nMin+1;
|
|
|
|
// finally, check to see whether the returned value is the 'right' position
|
|
DBG_ASSERT( rPositions[nMin] <= nValue, "not smaller or equal" );
|
|
DBG_ASSERT( nValue <= rPositions[nMin+1], "not equal or larger" );
|
|
DBG_ASSERT( (nMin == 0) || (rPositions[nMin-1] <= nValue),
|
|
"earlier value should have been returned" );
|
|
|
|
DBG_ASSERT( nMin < rPositions.size()-1,
|
|
"shouldn't return last position (due to termintator values)" );
|
|
|
|
return nMin;
|
|
}
|
|
|
|
size_t SwAccessiblePortionData::FindLastBreak(
|
|
const Positions_t& rPositions,
|
|
sal_Int32 nValue ) const
|
|
{
|
|
size_t nResult = FindBreak( rPositions, nValue );
|
|
|
|
// skip 'zero-length' portions
|
|
// #i70538# consider size of <rPosition> and ignore last entry
|
|
while ( nResult < rPositions.size() - 2 &&
|
|
rPositions[nResult+1] <= nValue )
|
|
{
|
|
nResult++;
|
|
}
|
|
// <--
|
|
|
|
return nResult;
|
|
}
|
|
|
|
|
|
void SwAccessiblePortionData::GetSentenceBoundary(
|
|
Boundary& rBound,
|
|
sal_Int32 nPos )
|
|
{
|
|
DBG_ASSERT( nPos >= 0, "illegal position; check before" );
|
|
DBG_ASSERT( nPos < sAccessibleString.getLength(), "illegal position" );
|
|
|
|
if( pSentences == NULL )
|
|
{
|
|
DBG_ASSERT( pBreakIt != NULL, "We always need a break." );
|
|
DBG_ASSERT( pBreakIt->GetBreakIter().is(), "No break-iterator." );
|
|
if( pBreakIt->GetBreakIter().is() )
|
|
{
|
|
pSentences = new Positions_t();
|
|
pSentences->reserve(10);
|
|
|
|
// use xBreak->endOfSentence to iterate over all words; store
|
|
// positions in pSentences
|
|
sal_Int32 nCurrent = 0;
|
|
sal_Int32 nLength = sAccessibleString.getLength();
|
|
do
|
|
{
|
|
pSentences->push_back( nCurrent );
|
|
|
|
sal_uInt16 nModelPos = GetModelPosition( nCurrent );
|
|
|
|
sal_Int32 nNew = pBreakIt->GetBreakIter()->endOfSentence(
|
|
sAccessibleString, nCurrent,
|
|
pBreakIt->GetLocale(pTxtNode->GetLang(nModelPos)) ) + 1;
|
|
|
|
if( (nNew < 0) && (nNew > nLength) )
|
|
nNew = nLength;
|
|
else if (nNew <= nCurrent)
|
|
nNew = nCurrent + 1; // ensure forward progress
|
|
|
|
nCurrent = nNew;
|
|
}
|
|
while (nCurrent < nLength);
|
|
|
|
// finish with two terminators
|
|
pSentences->push_back( nLength );
|
|
pSentences->push_back( nLength );
|
|
}
|
|
else
|
|
{
|
|
// no break iterator -> empty word
|
|
rBound.startPos = 0;
|
|
rBound.endPos = 0;
|
|
return;
|
|
}
|
|
}
|
|
|
|
FillBoundary( rBound, *pSentences, FindBreak( *pSentences, nPos ) );
|
|
}
|
|
|
|
void SwAccessiblePortionData::GetAttributeBoundary(
|
|
Boundary& rBound,
|
|
sal_Int32 nPos) const
|
|
{
|
|
DBG_ASSERT( pTxtNode != NULL, "Need SwTxtNode!" );
|
|
|
|
// attribute boundaries can only occur on portion boundaries
|
|
FillBoundary( rBound, aAccessiblePositions,
|
|
FindBreak( aAccessiblePositions, nPos ) );
|
|
}
|
|
|
|
|
|
sal_Int32 SwAccessiblePortionData::GetAccessiblePosition( sal_uInt16 nPos ) const
|
|
{
|
|
DBG_ASSERT( nPos <= pTxtNode->GetTxt().Len(), "illegal position" );
|
|
|
|
// find the portion number
|
|
// #i70538# - consider "empty" model portions - e.g. number portion
|
|
size_t nPortionNo = FindLastBreak( aModelPositions,
|
|
static_cast<sal_Int32>(nPos) );
|
|
|
|
sal_Int32 nRet = aAccessiblePositions[nPortionNo];
|
|
|
|
// if the model portion has more than one position, go into it;
|
|
// else return that position
|
|
sal_Int32 nStartPos = aModelPositions[nPortionNo];
|
|
sal_Int32 nEndPos = aModelPositions[nPortionNo+1];
|
|
if( (nEndPos - nStartPos) > 1 )
|
|
{
|
|
// 'wide' portions have to be of the same width
|
|
DBG_ASSERT( ( nEndPos - nStartPos ) ==
|
|
( aAccessiblePositions[nPortionNo+1] -
|
|
aAccessiblePositions[nPortionNo] ),
|
|
"accesability portion disagrees with text model" );
|
|
|
|
sal_Int32 nWithinPortion = nPos - aModelPositions[nPortionNo];
|
|
nRet += nWithinPortion;
|
|
}
|
|
// else: return nRet unmodified
|
|
|
|
DBG_ASSERT( (nRet >= 0) && (nRet <= sAccessibleString.getLength()),
|
|
"too long!" );
|
|
return nRet;
|
|
}
|
|
|
|
sal_uInt16 SwAccessiblePortionData::FillSpecialPos(
|
|
sal_Int32 nPos,
|
|
SwSpecialPos& rPos,
|
|
SwSpecialPos*& rpPos ) const
|
|
{
|
|
size_t nPortionNo = FindLastBreak( aAccessiblePositions, nPos );
|
|
|
|
sal_uInt8 nExtend(SP_EXTEND_RANGE_NONE);
|
|
sal_Int32 nRefPos(0);
|
|
sal_Int32 nModelPos(0);
|
|
|
|
if( nPortionNo < nBeforePortions )
|
|
{
|
|
nExtend = SP_EXTEND_RANGE_BEFORE;
|
|
rpPos = &rPos;
|
|
}
|
|
else
|
|
{
|
|
sal_Int32 nModelEndPos = aModelPositions[nPortionNo+1];
|
|
nModelPos = aModelPositions[nPortionNo];
|
|
|
|
// skip backwards over zero-length portions, since GetCharRect()
|
|
// counts all model-zero-length portions as belonging to the
|
|
// previus portion
|
|
size_t nCorePortionNo = nPortionNo;
|
|
while( nModelPos == nModelEndPos )
|
|
{
|
|
nCorePortionNo--;
|
|
nModelEndPos = nModelPos;
|
|
nModelPos = aModelPositions[nCorePortionNo];
|
|
|
|
DBG_ASSERT( nModelPos >= 0, "Can't happen." );
|
|
DBG_ASSERT( nCorePortionNo >= nBeforePortions, "Can't happen." );
|
|
}
|
|
DBG_ASSERT( nModelPos != nModelEndPos,
|
|
"portion with core-representation expected" );
|
|
|
|
// if we have anything except plain text, compute nExtend + nRefPos
|
|
if( (nModelEndPos - nModelPos == 1) &&
|
|
(pTxtNode->GetTxt().GetChar(static_cast<sal_uInt16>(nModelPos)) !=
|
|
sAccessibleString.getStr()[nPos]) )
|
|
{
|
|
// case 1: a one-character, non-text portion
|
|
// reference position is the first accessibilty for our
|
|
// core portion
|
|
nRefPos = aAccessiblePositions[ nCorePortionNo ];
|
|
nExtend = SP_EXTEND_RANGE_NONE;
|
|
rpPos = &rPos;
|
|
}
|
|
else if(nPortionNo != nCorePortionNo)
|
|
{
|
|
// case 2: a multi-character (text!) portion, followed by
|
|
// zero-length portions
|
|
// reference position is the first character of the next
|
|
// portion, and we are 'behind'
|
|
nRefPos = aAccessiblePositions[ nCorePortionNo+1 ];
|
|
nExtend = SP_EXTEND_RANGE_BEHIND;
|
|
rpPos = &rPos;
|
|
}
|
|
else
|
|
{
|
|
// case 3: regular text portion
|
|
DBG_ASSERT( ( nModelEndPos - nModelPos ) ==
|
|
( aAccessiblePositions[nPortionNo+1] -
|
|
aAccessiblePositions[nPortionNo] ),
|
|
"text portion expected" );
|
|
|
|
nModelPos += nPos - aAccessiblePositions[ nPortionNo ];
|
|
rpPos = NULL;
|
|
}
|
|
}
|
|
if( rpPos != NULL )
|
|
{
|
|
DBG_ASSERT( rpPos == &rPos, "Yes!" );
|
|
DBG_ASSERT( nRefPos <= nPos, "wrong reference" );
|
|
DBG_ASSERT( (nExtend == SP_EXTEND_RANGE_NONE) ||
|
|
(nExtend == SP_EXTEND_RANGE_BEFORE) ||
|
|
(nExtend == SP_EXTEND_RANGE_BEHIND), "need extend" );
|
|
|
|
// get the line number, and adjust nRefPos for the line
|
|
// (if necessary)
|
|
size_t nRefLine = FindBreak( aLineBreaks, nRefPos );
|
|
size_t nMyLine = FindBreak( aLineBreaks, nPos );
|
|
sal_uInt16 nLineOffset = static_cast<sal_uInt16>( nMyLine - nRefLine );
|
|
if( nLineOffset != 0 )
|
|
nRefPos = aLineBreaks[ nMyLine ];
|
|
|
|
// fill char offset and 'special position'
|
|
rPos.nCharOfst = static_cast<sal_uInt16>( nPos - nRefPos );
|
|
rPos.nExtendRange = nExtend;
|
|
rPos.nLineOfst = nLineOffset;
|
|
}
|
|
|
|
return static_cast<sal_uInt16>( nModelPos );
|
|
}
|
|
|
|
void SwAccessiblePortionData::AdjustAndCheck(
|
|
sal_Int32 nPos,
|
|
size_t& nPortionNo,
|
|
sal_uInt16& nCorePos,
|
|
sal_Bool& bEdit) const
|
|
{
|
|
// find portion and get mode position
|
|
nPortionNo = FindBreak( aAccessiblePositions, nPos );
|
|
nCorePos = static_cast<sal_uInt16>( aModelPositions[ nPortionNo ] );
|
|
|
|
// for special portions, make sure we're on a portion boundary
|
|
// for text portions, add the in-portion offset
|
|
if( IsSpecialPortion( nPortionNo ) )
|
|
bEdit &= nPos == aAccessiblePositions[nPortionNo];
|
|
else
|
|
nCorePos = static_cast<sal_uInt16>( nCorePos +
|
|
nPos - aAccessiblePositions[nPortionNo] );
|
|
}
|
|
|
|
sal_Bool SwAccessiblePortionData::GetEditableRange(
|
|
sal_Int32 nStart, sal_Int32 nEnd,
|
|
sal_uInt16& nCoreStart, sal_uInt16& nCoreEnd ) const
|
|
{
|
|
sal_Bool bIsEditable = sal_True;
|
|
|
|
// get start and end portions
|
|
size_t nStartPortion, nEndPortion;
|
|
AdjustAndCheck( nStart, nStartPortion, nCoreStart, bIsEditable );
|
|
AdjustAndCheck( nEnd, nEndPortion, nCoreEnd, bIsEditable );
|
|
|
|
// iterate over portions, and make sure there is no read-only portion
|
|
// in-between
|
|
size_t nLastPortion = nEndPortion;
|
|
|
|
// don't count last portion if we're in front of a special portion
|
|
if( IsSpecialPortion(nLastPortion) )
|
|
{
|
|
if (nLastPortion > 0)
|
|
nLastPortion--;
|
|
else
|
|
// special case: because size_t is usually unsigned, we can't just
|
|
// decrease nLastPortion to -1 (which would normally do the job, so
|
|
// this whole if wouldn't be needed). Instead, we'll do this
|
|
// special case and just increae the start portion beyond the last
|
|
// portion to make sure the loop below will have zero iteration.
|
|
nStartPortion = nLastPortion + 1;
|
|
}
|
|
|
|
for( size_t nPor = nStartPortion; nPor <= nLastPortion; nPor ++ )
|
|
{
|
|
bIsEditable &= ! IsReadOnlyPortion( nPor );
|
|
}
|
|
|
|
return bIsEditable;
|
|
}
|
|
|
|
sal_Bool SwAccessiblePortionData::IsValidCorePosition( sal_uInt16 nPos ) const
|
|
{
|
|
// a position is valid its within the model positions that we know
|
|
return ( aModelPositions[0] <= nPos ) &&
|
|
( nPos <= aModelPositions[ aModelPositions.size()-1 ] );
|
|
}
|
|
|
|
sal_uInt16 SwAccessiblePortionData::GetFirstValidCorePosition() const
|
|
{
|
|
return static_cast<sal_uInt16>( aModelPositions[0] );
|
|
}
|
|
|
|
sal_uInt16 SwAccessiblePortionData::GetLastValidCorePosition() const
|
|
{
|
|
return static_cast<sal_uInt16>( aModelPositions[ aModelPositions.size()-1 ] );
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|