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
992 lines
35 KiB
C++
992 lines
35 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 <UndoDelete.hxx>
|
|
#include <hintids.hxx>
|
|
#include <unotools/charclass.hxx>
|
|
#include <editeng/brkitem.hxx>
|
|
#include <fmtpdsc.hxx>
|
|
#include <frmfmt.hxx>
|
|
#include <fmtanchr.hxx>
|
|
#include <doc.hxx>
|
|
#include <UndoManager.hxx>
|
|
#include <swtable.hxx>
|
|
#include <swundo.hxx> // fuer die UndoIds
|
|
#include <pam.hxx>
|
|
#include <ndtxt.hxx>
|
|
#include <UndoCore.hxx>
|
|
#include <rolbck.hxx>
|
|
#include <poolfmt.hxx>
|
|
#include <mvsave.hxx>
|
|
#include <redline.hxx>
|
|
#include <docary.hxx>
|
|
#include <sfx2/app.hxx>
|
|
|
|
#include <fldbas.hxx>
|
|
#include <fmtfld.hxx>
|
|
#include <comcore.hrc> // #111827#
|
|
#include <undo.hrc>
|
|
|
|
|
|
// DELETE
|
|
/* lcl_MakeAutoFrms has to call MakeFrms for objects bounded "AtChar" ( == AUTO ),
|
|
if the anchor frame has be moved via _MoveNodes(..) and DelFrms(..)
|
|
*/
|
|
|
|
void lcl_MakeAutoFrms( const SwSpzFrmFmts& rSpzArr, sal_uLong nMovedIndex )
|
|
{
|
|
if( rSpzArr.Count() )
|
|
{
|
|
SwFlyFrmFmt* pFmt;
|
|
const SwFmtAnchor* pAnchor;
|
|
for( sal_uInt16 n = 0; n < rSpzArr.Count(); ++n )
|
|
{
|
|
pFmt = (SwFlyFrmFmt*)rSpzArr[n];
|
|
pAnchor = &pFmt->GetAnchor();
|
|
if (pAnchor->GetAnchorId() == FLY_AT_CHAR)
|
|
{
|
|
const SwPosition* pAPos = pAnchor->GetCntntAnchor();
|
|
if( pAPos && nMovedIndex == pAPos->nNode.GetIndex() )
|
|
pFmt->MakeFrms();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
SwUndoDelete has to perform a deletion and to record anything that is needed to restore the
|
|
situation before the deletion. Unfortunately a part of the deletion will be done after calling
|
|
this Ctor, this has to be kept in mind! In this Ctor only the complete paragraphs will be deleted,
|
|
the joining of the first and last paragraph of the selection will be handled outside this function.
|
|
Here are the main steps of the function:
|
|
1. Deletion/recording of content indizes of the selection: footnotes, fly frames and bookmarks
|
|
Step 1 could shift all nodes by deletion of footnotes => nNdDiff will be set.
|
|
2. If the paragraph where the selection ends, is the last content of a section so that this
|
|
section becomes empty when the paragraphs will be joined we have to do some smart actions ;-)
|
|
The paragraph will be moved outside the section and replaced by a dummy text node, the complete
|
|
section will be deleted in step 3. The difference between replacement dummy and original is
|
|
nReplacementDummy.
|
|
3. Moving complete selected nodes into the UndoArray. Before this happens the selection has to be
|
|
extended if there are sections which would become empty otherwise. BTW: sections will be moved into
|
|
the UndoArray if they are complete part of the selection. Sections starting or ending outside of the
|
|
selection will not be removed from the DocNodeArray even they got a "dummy"-copy in the UndoArray.
|
|
4. We have to anticipate the joining of the two paragraphs if the start paragraph is inside a
|
|
section and the end paragraph not. Then we have to move the paragraph into this section and to
|
|
record this in nSectDiff.
|
|
*/
|
|
|
|
SwUndoDelete::SwUndoDelete( SwPaM& rPam, sal_Bool bFullPara, sal_Bool bCalledByTblCpy )
|
|
: SwUndo(UNDO_DELETE), SwUndRng( rPam ),
|
|
pMvStt( 0 ), pSttStr(0), pEndStr(0), pRedlData(0), pRedlSaveData(0),
|
|
nNode(0), nNdDiff(0), nSectDiff(0), nReplaceDummy(0), nSetPos(0),
|
|
bGroup( sal_False ), bBackSp( sal_False ), bJoinNext( sal_False ), bTblDelLastNd( sal_False ),
|
|
bDelFullPara( bFullPara ), bResetPgDesc( sal_False ), bResetPgBrk( sal_False ),
|
|
bFromTableCopy( bCalledByTblCpy )
|
|
{
|
|
bDelFullPara = bFullPara; // This is set e.g. if an empty paragraph before a table is deleted
|
|
|
|
bCacheComment = false;
|
|
|
|
SwDoc * pDoc = rPam.GetDoc();
|
|
|
|
if( !pDoc->IsIgnoreRedline() && pDoc->GetRedlineTbl().Count() )
|
|
{
|
|
pRedlSaveData = new SwRedlineSaveDatas;
|
|
if( !FillSaveData( rPam, *pRedlSaveData ))
|
|
delete pRedlSaveData, pRedlSaveData = 0;
|
|
}
|
|
|
|
if( !pHistory )
|
|
pHistory = new SwHistory;
|
|
|
|
// loesche erstmal alle Fussnoten
|
|
const SwPosition *pStt = rPam.Start(),
|
|
*pEnd = rPam.GetPoint() == pStt
|
|
? rPam.GetMark()
|
|
: rPam.GetPoint();
|
|
|
|
// Step 1. deletion/record of content indizes
|
|
if( bDelFullPara )
|
|
{
|
|
OSL_ENSURE( rPam.HasMark(), "PaM ohne Mark" );
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint(),
|
|
DelCntntType(nsDelCntntType::DELCNT_ALL | nsDelCntntType::DELCNT_CHKNOCNTNT) );
|
|
|
|
::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo());
|
|
_DelBookmarks(pStt->nNode, pEnd->nNode);
|
|
}
|
|
else
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint() );
|
|
|
|
nSetPos = pHistory ? pHistory->Count() : 0;
|
|
|
|
// wurde schon was geloescht ??
|
|
nNdDiff = nSttNode - pStt->nNode.GetIndex();
|
|
|
|
bJoinNext = !bFullPara && pEnd == rPam.GetPoint();
|
|
bBackSp = !bFullPara && !bJoinNext;
|
|
|
|
SwTxtNode *pSttTxtNd = 0, *pEndTxtNd = 0;
|
|
if( !bFullPara )
|
|
{
|
|
pSttTxtNd = pStt->nNode.GetNode().GetTxtNode();
|
|
pEndTxtNd = nSttNode == nEndNode
|
|
? pSttTxtNd
|
|
: pEnd->nNode.GetNode().GetTxtNode();
|
|
}
|
|
|
|
sal_Bool bMoveNds = *pStt == *pEnd // noch ein Bereich vorhanden ??
|
|
? sal_False
|
|
: ( SaveCntnt( pStt, pEnd, pSttTxtNd, pEndTxtNd ) || bFromTableCopy );
|
|
|
|
if( pSttTxtNd && pEndTxtNd && pSttTxtNd != pEndTxtNd )
|
|
{
|
|
// zwei unterschiedliche TextNodes, also speicher noch die
|
|
// TextFormatCollection fuers
|
|
pHistory->Add( pSttTxtNd->GetTxtColl(),pStt->nNode.GetIndex(), ND_TEXTNODE );
|
|
pHistory->Add( pEndTxtNd->GetTxtColl(),pEnd->nNode.GetIndex(), ND_TEXTNODE );
|
|
|
|
if( !bJoinNext ) // Selection von Unten nach Oben
|
|
{
|
|
// Beim JoinPrev() werden die AUTO-PageBreak's richtig
|
|
// kopiert. Um diese beim Undo wieder herzustellen, muss das
|
|
// Auto-PageBreak aus dem EndNode zurueckgesetzt werden.
|
|
// - fuer die PageDesc, ColBreak dito !
|
|
if( pEndTxtNd->HasSwAttrSet() )
|
|
{
|
|
SwRegHistory aRegHist( *pEndTxtNd, pHistory );
|
|
if( SFX_ITEM_SET == pEndTxtNd->GetpSwAttrSet()->GetItemState(
|
|
RES_BREAK, sal_False ) )
|
|
pEndTxtNd->ResetAttr( RES_BREAK );
|
|
if( pEndTxtNd->HasSwAttrSet() &&
|
|
SFX_ITEM_SET == pEndTxtNd->GetpSwAttrSet()->GetItemState(
|
|
RES_PAGEDESC, sal_False ) )
|
|
pEndTxtNd->ResetAttr( RES_PAGEDESC );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// verschiebe jetzt noch den PaM !!!
|
|
// der SPoint steht am Anfang der SSelection
|
|
if( pEnd == rPam.GetPoint() && ( !bFullPara || pSttTxtNd || pEndTxtNd ) )
|
|
rPam.Exchange();
|
|
|
|
if( !pSttTxtNd && !pEndTxtNd )
|
|
rPam.GetPoint()->nNode--;
|
|
rPam.DeleteMark(); // der SPoint ist aus dem Bereich
|
|
|
|
if( !pEndTxtNd )
|
|
nEndCntnt = 0;
|
|
if( !pSttTxtNd )
|
|
nSttCntnt = 0;
|
|
|
|
if( bMoveNds ) // sind noch Nodes zu verschieben ?
|
|
{
|
|
SwNodes& rNds = pDoc->GetUndoManager().GetUndoNodes();
|
|
SwNodes& rDocNds = pDoc->GetNodes();
|
|
SwNodeRange aRg( rDocNds, nSttNode - nNdDiff,
|
|
rDocNds, nEndNode - nNdDiff );
|
|
if( !bFullPara && !pEndTxtNd &&
|
|
&aRg.aEnd.GetNode() != &pDoc->GetNodes().GetEndOfContent() )
|
|
{
|
|
SwNode* pNode = aRg.aEnd.GetNode().StartOfSectionNode();
|
|
if( pNode->GetIndex() >= nSttNode - nNdDiff )
|
|
aRg.aEnd++; // Deletion of a complete table
|
|
}
|
|
SwNode* pTmpNd;
|
|
// Step 2: Expand selection if necessary
|
|
if( bJoinNext || bFullPara )
|
|
{
|
|
// If all content of a section will be moved into Undo,
|
|
// the section itself should be moved complete.
|
|
while( aRg.aEnd.GetIndex() + 2 < rDocNds.Count() &&
|
|
( (pTmpNd = rDocNds[ aRg.aEnd.GetIndex()+1 ])->IsEndNode() &&
|
|
pTmpNd->StartOfSectionNode()->IsSectionNode() &&
|
|
pTmpNd->StartOfSectionNode()->GetIndex() >= aRg.aStart.GetIndex() ) )
|
|
aRg.aEnd++;
|
|
nReplaceDummy = aRg.aEnd.GetIndex() + nNdDiff - nEndNode;
|
|
if( nReplaceDummy )
|
|
{ // The selection has been expanded, because
|
|
aRg.aEnd++;
|
|
if( pEndTxtNd )
|
|
{
|
|
// The end text node has to leave the (expanded) selection
|
|
// The dummy is needed because _MoveNodes deletes empty sections
|
|
++nReplaceDummy;
|
|
SwNodeRange aMvRg( *pEndTxtNd, 0, *pEndTxtNd, 1 );
|
|
SwPosition aSplitPos( *pEndTxtNd );
|
|
::sw::UndoGuard const ug(pDoc->GetIDocumentUndoRedo());
|
|
pDoc->SplitNode( aSplitPos, false );
|
|
rDocNds._MoveNodes( aMvRg, rDocNds, aRg.aEnd, sal_True );
|
|
aRg.aEnd--;
|
|
}
|
|
else
|
|
nReplaceDummy = 0;
|
|
}
|
|
}
|
|
if( bBackSp || bFullPara )
|
|
{
|
|
//See above, the selection has to expanded if there are "nearly empty" sections
|
|
// and a replacement dummy has to be set if needed.
|
|
while( 1 < aRg.aStart.GetIndex() &&
|
|
( (pTmpNd = rDocNds[ aRg.aStart.GetIndex()-1 ])->IsSectionNode() &&
|
|
pTmpNd->EndOfSectionIndex() < aRg.aEnd.GetIndex() ) )
|
|
aRg.aStart--;
|
|
if( pSttTxtNd )
|
|
{
|
|
nReplaceDummy = nSttNode - nNdDiff - aRg.aStart.GetIndex();
|
|
if( nReplaceDummy )
|
|
{
|
|
SwNodeRange aMvRg( *pSttTxtNd, 0, *pSttTxtNd, 1 );
|
|
SwPosition aSplitPos( *pSttTxtNd );
|
|
::sw::UndoGuard const ug(pDoc->GetIDocumentUndoRedo());
|
|
pDoc->SplitNode( aSplitPos, false );
|
|
rDocNds._MoveNodes( aMvRg, rDocNds, aRg.aStart, sal_True );
|
|
aRg.aStart--;
|
|
}
|
|
}
|
|
}
|
|
|
|
if( bFromTableCopy )
|
|
{
|
|
if( !pEndTxtNd )
|
|
{
|
|
if( pSttTxtNd )
|
|
aRg.aStart++;
|
|
else if( !bFullPara && !aRg.aEnd.GetNode().IsCntntNode() )
|
|
aRg.aEnd--;
|
|
}
|
|
}
|
|
else if( pSttTxtNd && ( pEndTxtNd || pSttTxtNd->GetTxt().Len() ) )
|
|
aRg.aStart++;
|
|
|
|
// Step 3: Moving into UndoArray...
|
|
nNode = rNds.GetEndOfContent().GetIndex();
|
|
rDocNds._MoveNodes( aRg, rNds, SwNodeIndex( rNds.GetEndOfContent() ));
|
|
pMvStt = new SwNodeIndex( rNds, nNode );
|
|
nNode = rNds.GetEndOfContent().GetIndex() - nNode; // Differenz merken !
|
|
if( pSttTxtNd && pEndTxtNd )
|
|
{
|
|
//Step 4: Moving around sections
|
|
nSectDiff = aRg.aEnd.GetIndex() - aRg.aStart.GetIndex();
|
|
// nSect is the number of sections which starts(ends) between start and end node of the
|
|
// selection. The "loser" paragraph has to be moved into the section(s) of the
|
|
// "winner" paragraph
|
|
if( nSectDiff )
|
|
{
|
|
if( bJoinNext )
|
|
{
|
|
SwNodeRange aMvRg( *pEndTxtNd, 0, *pEndTxtNd, 1 );
|
|
rDocNds._MoveNodes( aMvRg, rDocNds, aRg.aStart, sal_True );
|
|
}
|
|
else
|
|
{
|
|
SwNodeRange aMvRg( *pSttTxtNd, 0, *pSttTxtNd, 1 );
|
|
rDocNds._MoveNodes( aMvRg, rDocNds, aRg.aEnd, sal_True );
|
|
}
|
|
}
|
|
}
|
|
if( nSectDiff || nReplaceDummy )
|
|
lcl_MakeAutoFrms( *pDoc->GetSpzFrmFmts(),
|
|
bJoinNext ? pEndTxtNd->GetIndex() : pSttTxtNd->GetIndex() );
|
|
}
|
|
else
|
|
nNode = 0; // kein Node verschoben -> keine Differenz zum Ende
|
|
|
|
// wurden davor noch Nodes geloescht ?? (FootNotes haben ContentNodes!)
|
|
if( !pSttTxtNd && !pEndTxtNd )
|
|
{
|
|
nNdDiff = nSttNode - rPam.GetPoint()->nNode.GetIndex() - (bFullPara ? 0 : 1);
|
|
rPam.Move( fnMoveForward, fnGoNode );
|
|
}
|
|
else
|
|
{
|
|
nNdDiff = nSttNode;
|
|
if( nSectDiff && bBackSp )
|
|
nNdDiff += nSectDiff;
|
|
nNdDiff -= rPam.GetPoint()->nNode.GetIndex();
|
|
}
|
|
|
|
if( !rPam.GetNode()->IsCntntNode() )
|
|
rPam.GetPoint()->nContent.Assign( 0, 0 );
|
|
|
|
// wird die History ueberhaupt benoetigt ??
|
|
if( pHistory && !pHistory->Count() )
|
|
DELETEZ( pHistory );
|
|
}
|
|
|
|
sal_Bool SwUndoDelete::SaveCntnt( const SwPosition* pStt, const SwPosition* pEnd,
|
|
SwTxtNode* pSttTxtNd, SwTxtNode* pEndTxtNd )
|
|
{
|
|
sal_uLong nNdIdx = pStt->nNode.GetIndex();
|
|
// 1 - kopiere den Anfang in den Start-String
|
|
if( pSttTxtNd )
|
|
{
|
|
sal_Bool bOneNode = nSttNode == nEndNode;
|
|
xub_StrLen nLen = bOneNode ? nEndCntnt - nSttCntnt
|
|
: pSttTxtNd->GetTxt().Len() - nSttCntnt;
|
|
SwRegHistory aRHst( *pSttTxtNd, pHistory );
|
|
// always save all text atttibutes because of possibly overlapping
|
|
// areas of on/off
|
|
pHistory->CopyAttr( pSttTxtNd->GetpSwpHints(), nNdIdx,
|
|
0, pSttTxtNd->GetTxt().Len(), true );
|
|
if( !bOneNode && pSttTxtNd->HasSwAttrSet() )
|
|
pHistory->CopyFmtAttr( *pSttTxtNd->GetpSwAttrSet(), nNdIdx );
|
|
|
|
// die Laenge kann sich veraendert haben (!!Felder!!)
|
|
nLen = ( bOneNode ? pEnd->nContent.GetIndex() : pSttTxtNd->GetTxt().Len() )
|
|
- pStt->nContent.GetIndex();
|
|
|
|
|
|
// loesche jetzt noch den Text (alle Attribut-Aenderungen kommen in
|
|
// die Undo-History
|
|
pSttStr = (String*)new String( pSttTxtNd->GetTxt().Copy( nSttCntnt, nLen ));
|
|
pSttTxtNd->EraseText( pStt->nContent, nLen );
|
|
if( pSttTxtNd->GetpSwpHints() )
|
|
pSttTxtNd->GetpSwpHints()->DeRegister();
|
|
|
|
// METADATA: store
|
|
bool emptied( pSttStr->Len() && !pSttTxtNd->Len() );
|
|
if (!bOneNode || emptied) // merging may overwrite xmlids...
|
|
{
|
|
m_pMetadataUndoStart = (emptied)
|
|
? pSttTxtNd->CreateUndoForDelete()
|
|
: pSttTxtNd->CreateUndo();
|
|
}
|
|
|
|
if( bOneNode )
|
|
return sal_False; // keine Nodes mehr verschieben
|
|
}
|
|
|
|
|
|
// 2 - kopiere das Ende in den End-String
|
|
if( pEndTxtNd )
|
|
{
|
|
SwIndex aEndIdx( pEndTxtNd );
|
|
nNdIdx = pEnd->nNode.GetIndex();
|
|
SwRegHistory aRHst( *pEndTxtNd, pHistory );
|
|
|
|
// always save all text atttibutes because of possibly overlapping
|
|
// areas of on/off
|
|
pHistory->CopyAttr( pEndTxtNd->GetpSwpHints(), nNdIdx, 0,
|
|
pEndTxtNd->GetTxt().Len(), true );
|
|
|
|
if( pEndTxtNd->HasSwAttrSet() )
|
|
pHistory->CopyFmtAttr( *pEndTxtNd->GetpSwAttrSet(), nNdIdx );
|
|
|
|
|
|
// loesche jetzt noch den Text (alle Attribut-Aenderungen kommen in
|
|
// die Undo-History
|
|
pEndStr = (String*)new String( pEndTxtNd->GetTxt().Copy( 0,
|
|
pEnd->nContent.GetIndex() ));
|
|
pEndTxtNd->EraseText( aEndIdx, pEnd->nContent.GetIndex() );
|
|
if( pEndTxtNd->GetpSwpHints() )
|
|
pEndTxtNd->GetpSwpHints()->DeRegister();
|
|
|
|
// METADATA: store
|
|
bool emptied( pEndStr->Len() && !pEndTxtNd->Len() );
|
|
|
|
m_pMetadataUndoEnd = (emptied)
|
|
? pEndTxtNd->CreateUndoForDelete()
|
|
: pEndTxtNd->CreateUndo();
|
|
}
|
|
|
|
// sind es nur zwei Nodes, dann ist schon alles erledigt.
|
|
if( ( pSttTxtNd || pEndTxtNd ) && nSttNode + 1 == nEndNode )
|
|
return sal_False; // keine Nodes mehr verschieben
|
|
|
|
return sal_True; // verschiebe die dazwischen liegenden Nodes
|
|
}
|
|
|
|
|
|
sal_Bool SwUndoDelete::CanGrouping( SwDoc* pDoc, const SwPaM& rDelPam )
|
|
{
|
|
// ist das Undo groesser als 1 Node ? (sprich: Start und EndString)
|
|
if( pSttStr ? !pSttStr->Len() || pEndStr : sal_True )
|
|
return sal_False;
|
|
|
|
// es kann nur das Loeschen von einzelnen char's zusammengefasst werden
|
|
if( nSttNode != nEndNode || ( !bGroup && nSttCntnt+1 != nEndCntnt ))
|
|
return sal_False;
|
|
|
|
const SwPosition *pStt = rDelPam.Start(),
|
|
*pEnd = rDelPam.GetPoint() == pStt
|
|
? rDelPam.GetMark()
|
|
: rDelPam.GetPoint();
|
|
|
|
if( pStt->nNode != pEnd->nNode ||
|
|
pStt->nContent.GetIndex()+1 != pEnd->nContent.GetIndex() ||
|
|
pEnd->nNode != nSttNode )
|
|
return sal_False;
|
|
|
|
// untercheide zwischen BackSpace und Delete. Es muss dann das
|
|
// Undo-Array unterschiedlich aufgebaut werden !!
|
|
if( pEnd->nContent == nSttCntnt )
|
|
{
|
|
if( bGroup && !bBackSp ) return sal_False;
|
|
bBackSp = sal_True;
|
|
}
|
|
else if( pStt->nContent == nSttCntnt )
|
|
{
|
|
if( bGroup && bBackSp ) return sal_False;
|
|
bBackSp = sal_False;
|
|
}
|
|
else
|
|
return sal_False;
|
|
|
|
// sind die beiden Nodes (Nodes-/Undo-Array) ueberhaupt TextNodes?
|
|
SwTxtNode * pDelTxtNd = pStt->nNode.GetNode().GetTxtNode();
|
|
if( !pDelTxtNd ) return sal_False;
|
|
|
|
xub_StrLen nUChrPos = bBackSp ? 0 : pSttStr->Len()-1;
|
|
sal_Unicode cDelChar = pDelTxtNd->GetTxt().GetChar( pStt->nContent.GetIndex() );
|
|
CharClass& rCC = GetAppCharClass();
|
|
if( ( CH_TXTATR_BREAKWORD == cDelChar || CH_TXTATR_INWORD == cDelChar ) ||
|
|
rCC.isLetterNumeric( String( cDelChar ), 0 ) !=
|
|
rCC.isLetterNumeric( *pSttStr, nUChrPos ) )
|
|
return sal_False;
|
|
|
|
{
|
|
SwRedlineSaveDatas* pTmpSav = new SwRedlineSaveDatas;
|
|
if( !FillSaveData( rDelPam, *pTmpSav, sal_False ))
|
|
delete pTmpSav, pTmpSav = 0;
|
|
|
|
sal_Bool bOk = ( !pRedlSaveData && !pTmpSav ) ||
|
|
( pRedlSaveData && pTmpSav &&
|
|
SwUndo::CanRedlineGroup( *pRedlSaveData, *pTmpSav, bBackSp ));
|
|
delete pTmpSav;
|
|
if( !bOk )
|
|
return sal_False;
|
|
|
|
pDoc->DeleteRedline( rDelPam, false, USHRT_MAX );
|
|
}
|
|
|
|
// Ok, die beiden 'Deletes' koennen zusammen gefasst werden, also
|
|
// 'verschiebe' das enstprechende Zeichen
|
|
if( bBackSp )
|
|
nSttCntnt--; // BackSpace: Zeichen in Array einfuegen !!
|
|
else
|
|
{
|
|
nEndCntnt++; // Delete: Zeichen am Ende anhaengen
|
|
nUChrPos++;
|
|
}
|
|
pSttStr->Insert( cDelChar, nUChrPos );
|
|
pDelTxtNd->EraseText( pStt->nContent, 1 );
|
|
|
|
bGroup = sal_True;
|
|
return sal_True;
|
|
}
|
|
|
|
|
|
|
|
SwUndoDelete::~SwUndoDelete()
|
|
{
|
|
delete pSttStr;
|
|
delete pEndStr;
|
|
if( pMvStt ) // loesche noch den Bereich aus dem UndoNodes Array
|
|
{
|
|
// Insert speichert den Inhalt in der IconSection
|
|
pMvStt->GetNode().GetNodes().Delete( *pMvStt, nNode );
|
|
delete pMvStt;
|
|
}
|
|
delete pRedlData;
|
|
delete pRedlSaveData;
|
|
}
|
|
|
|
static SwRewriter lcl_RewriterFromHistory(SwHistory & rHistory)
|
|
{
|
|
SwRewriter aRewriter;
|
|
|
|
bool bDone = false;
|
|
|
|
for ( sal_uInt16 n = 0; n < rHistory.Count(); n++)
|
|
{
|
|
String aDescr = rHistory[n]->GetDescription();
|
|
|
|
if (aDescr.Len() > 0)
|
|
{
|
|
aRewriter.AddRule(UNDO_ARG2, aDescr);
|
|
|
|
bDone = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (! bDone)
|
|
{
|
|
aRewriter.AddRule(UNDO_ARG2, SW_RES(STR_FIELD));
|
|
}
|
|
|
|
return aRewriter;
|
|
}
|
|
|
|
SwRewriter SwUndoDelete::GetRewriter() const
|
|
{
|
|
SwRewriter aResult;
|
|
String * pStr = NULL;
|
|
|
|
if (nNode != 0)
|
|
{
|
|
if (sTableName.Len() > 0)
|
|
{
|
|
|
|
SwRewriter aRewriter;
|
|
aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_START_QUOTE));
|
|
aRewriter.AddRule(UNDO_ARG2, sTableName);
|
|
aRewriter.AddRule(UNDO_ARG3, SW_RES(STR_END_QUOTE));
|
|
|
|
String sTmp = aRewriter.Apply(SW_RES(STR_TABLE_NAME));
|
|
aResult.AddRule(UNDO_ARG1, sTmp);
|
|
}
|
|
else
|
|
aResult.AddRule(UNDO_ARG1, String(SW_RES(STR_PARAGRAPHS)));
|
|
}
|
|
else
|
|
{
|
|
String aStr;
|
|
|
|
if (pSttStr != NULL && pEndStr != NULL && pSttStr->Len() == 0 &&
|
|
pEndStr->Len() == 0)
|
|
{
|
|
aStr = SW_RES(STR_PARAGRAPH_UNDO);
|
|
}
|
|
else
|
|
{
|
|
if (pSttStr != NULL)
|
|
pStr = pSttStr;
|
|
else if (pEndStr != NULL)
|
|
pStr = pEndStr;
|
|
|
|
if (pStr != NULL)
|
|
{
|
|
aStr = DenoteSpecialCharacters(*pStr);
|
|
}
|
|
else
|
|
{
|
|
aStr = UNDO_ARG2;
|
|
}
|
|
}
|
|
|
|
aStr = ShortenString(aStr, nUndoStringLength, String(SW_RES(STR_LDOTS)));
|
|
if (pHistory)
|
|
{
|
|
SwRewriter aRewriter = lcl_RewriterFromHistory(*pHistory);
|
|
aStr = aRewriter.Apply(aStr);
|
|
}
|
|
|
|
aResult.AddRule(UNDO_ARG1, aStr);
|
|
}
|
|
|
|
return aResult;
|
|
}
|
|
|
|
// Every object, anchored "AtCntnt" will be reanchored at rPos
|
|
void lcl_ReAnchorAtCntntFlyFrames( const SwSpzFrmFmts& rSpzArr, SwPosition &rPos, sal_uLong nOldIdx )
|
|
{
|
|
if( rSpzArr.Count() )
|
|
{
|
|
SwFlyFrmFmt* pFmt;
|
|
const SwFmtAnchor* pAnchor;
|
|
const SwPosition* pAPos;
|
|
for( sal_uInt16 n = 0; n < rSpzArr.Count(); ++n )
|
|
{
|
|
pFmt = (SwFlyFrmFmt*)rSpzArr[n];
|
|
pAnchor = &pFmt->GetAnchor();
|
|
if (pAnchor->GetAnchorId() == FLY_AT_PARA)
|
|
{
|
|
pAPos = pAnchor->GetCntntAnchor();
|
|
if( pAPos && nOldIdx == pAPos->nNode.GetIndex() )
|
|
{
|
|
SwFmtAnchor aAnch( *pAnchor );
|
|
aAnch.SetAnchor( &rPos );
|
|
pFmt->SetFmtAttr( aAnch );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void SwUndoDelete::UndoImpl(::sw::UndoRedoContext & rContext)
|
|
{
|
|
SwDoc *const pDoc = & rContext.GetDoc();
|
|
|
|
sal_uLong nCalcStt = nSttNode - nNdDiff;
|
|
|
|
if( nSectDiff && bBackSp )
|
|
nCalcStt += nSectDiff;
|
|
|
|
SwNodeIndex aIdx( pDoc->GetNodes(), nCalcStt );
|
|
SwNode* pInsNd = &aIdx.GetNode();
|
|
|
|
{ // Block, damit der SwPosition beim loeschen vom Node
|
|
// abgemeldet ist
|
|
SwPosition aPos( aIdx );
|
|
if( !bDelFullPara )
|
|
{
|
|
if( pInsNd->IsTableNode() )
|
|
{
|
|
pInsNd = pDoc->GetNodes().MakeTxtNode( aIdx,
|
|
(SwTxtFmtColl*)pDoc->GetDfltTxtFmtColl() );
|
|
aIdx--;
|
|
aPos.nNode = aIdx;
|
|
aPos.nContent.Assign( pInsNd->GetCntntNode(), nSttCntnt );
|
|
}
|
|
else
|
|
{
|
|
if( pInsNd->IsCntntNode() )
|
|
aPos.nContent.Assign( (SwCntntNode*)pInsNd, nSttCntnt );
|
|
if( !bTblDelLastNd )
|
|
pInsNd = 0; // Node nicht loeschen !!
|
|
}
|
|
}
|
|
else
|
|
pInsNd = 0; // Node nicht loeschen !!
|
|
|
|
sal_Bool bNodeMove = 0 != nNode;
|
|
|
|
if( pEndStr )
|
|
{
|
|
// alle Attribute verwerfen, wurden alle gespeichert!
|
|
SwTxtNode* pTxtNd = aPos.nNode.GetNode().GetTxtNode();
|
|
|
|
if( pTxtNd && pTxtNd->HasSwAttrSet() )
|
|
pTxtNd->ResetAllAttr();
|
|
|
|
if( pTxtNd && pTxtNd->GetpSwpHints() )
|
|
pTxtNd->ClearSwpHintsArr( true );
|
|
|
|
if( pSttStr && !bFromTableCopy )
|
|
{
|
|
sal_uLong nOldIdx = aPos.nNode.GetIndex();
|
|
pDoc->SplitNode( aPos, false );
|
|
// After the split all objects are anchored at the first paragraph,
|
|
// but the pHistory of the fly frame formats relies on anchoring at
|
|
// the start of the selection => selection backwards needs a correction.
|
|
if( bBackSp )
|
|
lcl_ReAnchorAtCntntFlyFrames( *pDoc->GetSpzFrmFmts(), aPos, nOldIdx );
|
|
pTxtNd = aPos.nNode.GetNode().GetTxtNode();
|
|
}
|
|
if( pTxtNd )
|
|
{
|
|
pTxtNd->InsertText( *pEndStr, aPos.nContent,
|
|
IDocumentContentOperations::INS_NOHINTEXPAND );
|
|
// METADATA: restore
|
|
pTxtNd->RestoreMetadata(m_pMetadataUndoEnd);
|
|
}
|
|
}
|
|
else if( pSttStr && bNodeMove )
|
|
{
|
|
SwTxtNode * pNd = aPos.nNode.GetNode().GetTxtNode();
|
|
if( pNd )
|
|
{
|
|
if( nSttCntnt < pNd->GetTxt().Len() )
|
|
{
|
|
sal_uLong nOldIdx = aPos.nNode.GetIndex();
|
|
pDoc->SplitNode( aPos, false );
|
|
if( bBackSp )
|
|
lcl_ReAnchorAtCntntFlyFrames( *pDoc->GetSpzFrmFmts(), aPos, nOldIdx );
|
|
}
|
|
else
|
|
aPos.nNode++;
|
|
}
|
|
}
|
|
SwNode* pMovedNode = NULL;
|
|
if( nSectDiff )
|
|
{
|
|
sal_uLong nMoveIndex = aPos.nNode.GetIndex();
|
|
int nDiff = 0;
|
|
if( bJoinNext )
|
|
{
|
|
nMoveIndex += nSectDiff + 1;
|
|
pMovedNode = &aPos.nNode.GetNode();
|
|
}
|
|
else
|
|
{
|
|
nMoveIndex -= nSectDiff + 1;
|
|
++nDiff;
|
|
}
|
|
SwNodeIndex aMvIdx( pDoc->GetNodes(), nMoveIndex );
|
|
SwNodeRange aRg( aPos.nNode, 0 - nDiff, aPos.nNode, 1 - nDiff );
|
|
aPos.nNode--;
|
|
if( !bJoinNext )
|
|
pMovedNode = &aPos.nNode.GetNode();
|
|
pDoc->GetNodes()._MoveNodes( aRg, pDoc->GetNodes(), aMvIdx, sal_True );
|
|
aPos.nNode++;
|
|
}
|
|
|
|
if( bNodeMove )
|
|
{
|
|
SwNodeRange aRange( *pMvStt, 0, *pMvStt, nNode );
|
|
SwNodeIndex aCopyIndex( aPos.nNode, -1 );
|
|
pDoc->GetUndoManager().GetUndoNodes()._Copy( aRange, aPos.nNode );
|
|
|
|
if( nReplaceDummy )
|
|
{
|
|
sal_uLong nMoveIndex;
|
|
if( bJoinNext )
|
|
{
|
|
nMoveIndex = nEndNode - nNdDiff;
|
|
aPos.nNode = nMoveIndex + nReplaceDummy;
|
|
}
|
|
else
|
|
{
|
|
aPos = SwPosition( aCopyIndex );
|
|
nMoveIndex = aPos.nNode.GetIndex() + nReplaceDummy + 1;
|
|
}
|
|
SwNodeIndex aMvIdx( pDoc->GetNodes(), nMoveIndex );
|
|
SwNodeRange aRg( aPos.nNode, 0, aPos.nNode, 1 );
|
|
pMovedNode = &aPos.nNode.GetNode();
|
|
pDoc->GetNodes()._MoveNodes( aRg, pDoc->GetNodes(), aMvIdx, sal_True );
|
|
pDoc->GetNodes().Delete( aMvIdx, 1 );
|
|
}
|
|
}
|
|
|
|
if( pMovedNode )
|
|
lcl_MakeAutoFrms( *pDoc->GetSpzFrmFmts(), pMovedNode->GetIndex() );
|
|
|
|
if( pSttStr )
|
|
{
|
|
aPos.nNode = nSttNode - nNdDiff + ( bJoinNext ? 0 : nReplaceDummy );
|
|
SwTxtNode * pTxtNd = aPos.nNode.GetNode().GetTxtNode();
|
|
// wenn mehr als ein Node geloescht wurde, dann wurden auch
|
|
// alle "Node"-Attribute gespeichert
|
|
|
|
if (pTxtNd != NULL)
|
|
{
|
|
if( pTxtNd->HasSwAttrSet() && bNodeMove && !pEndStr )
|
|
pTxtNd->ResetAllAttr();
|
|
|
|
if( pTxtNd->GetpSwpHints() )
|
|
pTxtNd->ClearSwpHintsArr( true );
|
|
|
|
// SectionNode-Modus und von oben nach unten selektiert:
|
|
// -> im StartNode steht noch der Rest vom Join => loeschen
|
|
aPos.nContent.Assign( pTxtNd, nSttCntnt );
|
|
pTxtNd->InsertText( *pSttStr, aPos.nContent,
|
|
IDocumentContentOperations::INS_NOHINTEXPAND );
|
|
// METADATA: restore
|
|
pTxtNd->RestoreMetadata(m_pMetadataUndoStart);
|
|
}
|
|
}
|
|
|
|
if( pHistory )
|
|
{
|
|
pHistory->TmpRollback( pDoc, nSetPos, false );
|
|
if( nSetPos ) // es gab Fussnoten/FlyFrames
|
|
{
|
|
// gibts ausser diesen noch andere ?
|
|
if( nSetPos < pHistory->Count() )
|
|
{
|
|
// dann sicher die Attribute anderen Attribute
|
|
SwHistory aHstr;
|
|
aHstr.Move( 0, pHistory, nSetPos );
|
|
pHistory->Rollback( pDoc );
|
|
pHistory->Move( 0, &aHstr );
|
|
}
|
|
else
|
|
{
|
|
pHistory->Rollback( pDoc );
|
|
DELETEZ( pHistory );
|
|
}
|
|
}
|
|
}
|
|
|
|
if( bResetPgDesc || bResetPgBrk )
|
|
{
|
|
sal_uInt16 nStt = static_cast<sal_uInt16>( bResetPgDesc ? RES_PAGEDESC : RES_BREAK );
|
|
sal_uInt16 nEnd = static_cast<sal_uInt16>( bResetPgBrk ? RES_BREAK : RES_PAGEDESC );
|
|
|
|
SwNode* pNode = pDoc->GetNodes()[ nEndNode + 1 ];
|
|
if( pNode->IsCntntNode() )
|
|
((SwCntntNode*)pNode)->ResetAttr( nStt, nEnd );
|
|
else if( pNode->IsTableNode() )
|
|
((SwTableNode*)pNode)->GetTable().GetFrmFmt()->ResetFmtAttr( nStt, nEnd );
|
|
}
|
|
}
|
|
// den temp. eingefuegten Node noch loeschen !!
|
|
if( pInsNd )
|
|
pDoc->GetNodes().Delete( aIdx, 1 );
|
|
if( pRedlSaveData )
|
|
SetSaveData( *pDoc, *pRedlSaveData );
|
|
|
|
AddUndoRedoPaM(rContext, true);
|
|
}
|
|
|
|
void SwUndoDelete::RedoImpl(::sw::UndoRedoContext & rContext)
|
|
{
|
|
SwPaM & rPam = AddUndoRedoPaM(rContext);
|
|
SwDoc& rDoc = *rPam.GetDoc();
|
|
|
|
if( pRedlSaveData )
|
|
{
|
|
bool bSuccess = FillSaveData(rPam, *pRedlSaveData, sal_True);
|
|
OSL_ENSURE(bSuccess,
|
|
"SwUndoDelete::Redo: used to have redline data, but now none?");
|
|
if (!bSuccess)
|
|
{
|
|
delete pRedlSaveData, pRedlSaveData = 0;
|
|
}
|
|
}
|
|
|
|
if( !bDelFullPara )
|
|
{
|
|
SwUndRng aTmpRng( rPam );
|
|
RemoveIdxFromRange( rPam, sal_False );
|
|
aTmpRng.SetPaM( rPam );
|
|
|
|
if( !bJoinNext ) // Dann Selektion von unten nach oben
|
|
rPam.Exchange(); // wieder herstellen!
|
|
}
|
|
|
|
if( pHistory ) // wurden Attribute gesichert ?
|
|
{
|
|
pHistory->SetTmpEnd( pHistory->Count() );
|
|
SwHistory aHstr;
|
|
aHstr.Move( 0, pHistory );
|
|
|
|
if( bDelFullPara )
|
|
{
|
|
OSL_ENSURE( rPam.HasMark(), "PaM ohne Mark" );
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint(),
|
|
DelCntntType(nsDelCntntType::DELCNT_ALL | nsDelCntntType::DELCNT_CHKNOCNTNT) );
|
|
|
|
_DelBookmarks(rPam.GetMark()->nNode, rPam.GetPoint()->nNode);
|
|
}
|
|
else
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint() );
|
|
nSetPos = pHistory ? pHistory->Count() : 0;
|
|
|
|
pHistory->Move( nSetPos, &aHstr );
|
|
}
|
|
else
|
|
{
|
|
if( bDelFullPara )
|
|
{
|
|
OSL_ENSURE( rPam.HasMark(), "PaM ohne Mark" );
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint(),
|
|
DelCntntType(nsDelCntntType::DELCNT_ALL | nsDelCntntType::DELCNT_CHKNOCNTNT) );
|
|
|
|
_DelBookmarks( rPam.GetMark()->nNode, rPam.GetPoint()->nNode );
|
|
}
|
|
else
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint() );
|
|
nSetPos = pHistory ? pHistory->Count() : 0;
|
|
}
|
|
|
|
if( !pSttStr && !pEndStr )
|
|
{
|
|
SwNodeIndex aSttIdx = ( bDelFullPara || bJoinNext )
|
|
? rPam.GetMark()->nNode
|
|
: rPam.GetPoint()->nNode;
|
|
SwTableNode* pTblNd = aSttIdx.GetNode().GetTableNode();
|
|
if( pTblNd )
|
|
{
|
|
if( bTblDelLastNd )
|
|
{
|
|
// dann am Ende wieder einen Node einfuegen
|
|
const SwNodeIndex aTmpIdx( *pTblNd->EndOfSectionNode(), 1 );
|
|
rDoc.GetNodes().MakeTxtNode( aTmpIdx,
|
|
rDoc.GetTxtCollFromPool( RES_POOLCOLL_STANDARD ) );
|
|
}
|
|
|
|
SwCntntNode* pNextNd = rDoc.GetNodes()[
|
|
pTblNd->EndOfSectionIndex()+1 ]->GetCntntNode();
|
|
if( pNextNd )
|
|
{
|
|
SwFrmFmt* pTableFmt = pTblNd->GetTable().GetFrmFmt();
|
|
|
|
const SfxPoolItem *pItem;
|
|
if( SFX_ITEM_SET == pTableFmt->GetItemState( RES_PAGEDESC,
|
|
sal_False, &pItem ) )
|
|
pNextNd->SetAttr( *pItem );
|
|
|
|
if( SFX_ITEM_SET == pTableFmt->GetItemState( RES_BREAK,
|
|
sal_False, &pItem ) )
|
|
pNextNd->SetAttr( *pItem );
|
|
}
|
|
pTblNd->DelFrms();
|
|
}
|
|
|
|
rPam.SetMark();
|
|
rPam.DeleteMark();
|
|
|
|
rDoc.GetNodes().Delete( aSttIdx, nEndNode - nSttNode );
|
|
|
|
// setze den Cursor immer in einen ContentNode !!
|
|
if( !rPam.Move( fnMoveBackward, fnGoCntnt ) &&
|
|
!rPam.Move( fnMoveForward, fnGoCntnt ) )
|
|
rPam.GetPoint()->nContent.Assign( rPam.GetCntntNode(), 0 );
|
|
}
|
|
else if( bDelFullPara )
|
|
{
|
|
// der Pam wurde am Point( == Ende) um eins erhoeht, um einen
|
|
// Bereich fuers Undo zu haben. Der muss jetzt aber wieder entfernt
|
|
// werden!!!
|
|
rPam.End()->nNode--;
|
|
if( rPam.GetPoint()->nNode == rPam.GetMark()->nNode )
|
|
*rPam.GetMark() = *rPam.GetPoint();
|
|
rDoc.DelFullPara( rPam );
|
|
}
|
|
else
|
|
rDoc.DeleteAndJoin( rPam );
|
|
}
|
|
|
|
void SwUndoDelete::RepeatImpl(::sw::RepeatContext & rContext)
|
|
{
|
|
// this action does not seem idempotent,
|
|
// so make sure it is only executed once on repeat
|
|
if (rContext.m_bDeleteRepeated)
|
|
return;
|
|
|
|
SwPaM & rPam = rContext.GetRepeatPaM();
|
|
SwDoc& rDoc = *rPam.GetDoc();
|
|
::sw::GroupUndoGuard const undoGuard(rDoc.GetIDocumentUndoRedo());
|
|
if( !rPam.HasMark() )
|
|
{
|
|
rPam.SetMark();
|
|
rPam.Move( fnMoveForward, fnGoCntnt );
|
|
}
|
|
if( bDelFullPara )
|
|
rDoc.DelFullPara( rPam );
|
|
else
|
|
rDoc.DeleteAndJoin( rPam );
|
|
rContext.m_bDeleteRepeated = true;
|
|
}
|
|
|
|
|
|
void SwUndoDelete::SetTableName(const String & rName)
|
|
{
|
|
sTableName = rName;
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|