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
1031 lines
37 KiB
C++
1031 lines
37 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 <hintids.hxx>
|
|
#include <svl/itemiter.hxx>
|
|
#include <svx/svdobj.hxx>
|
|
#include <svx/svdpage.hxx>
|
|
#include <svx/svdmodel.hxx>
|
|
#include <svx/svdocapt.hxx>
|
|
#include <svx/svdmark.hxx>
|
|
#include <fmtfsize.hxx>
|
|
#include <fmtornt.hxx>
|
|
#include <fmtsrnd.hxx>
|
|
#include <dcontact.hxx>
|
|
|
|
#include <ndgrf.hxx>
|
|
#include <doc.hxx>
|
|
#include <IDocumentUndoRedo.hxx>
|
|
#include <ndindex.hxx>
|
|
#include <docary.hxx>
|
|
#include <fmtcntnt.hxx>
|
|
#include <fmtanchr.hxx>
|
|
#include <txtflcnt.hxx>
|
|
#include <fmtflcnt.hxx>
|
|
#include <txtfrm.hxx>
|
|
#include <pagefrm.hxx>
|
|
#include <rootfrm.hxx>
|
|
#include <flyfrms.hxx>
|
|
#include <frmtool.hxx>
|
|
#include <frmfmt.hxx>
|
|
#include <ndtxt.hxx>
|
|
#include <pam.hxx>
|
|
#include <tblsel.hxx>
|
|
#include <swundo.hxx>
|
|
#include <swtable.hxx>
|
|
#include <crstate.hxx>
|
|
#include <UndoCore.hxx>
|
|
#include <UndoAttribute.hxx>
|
|
#include <fmtcnct.hxx>
|
|
#include <dflyobj.hxx>
|
|
|
|
#include <undoflystrattr.hxx>
|
|
|
|
extern sal_uInt16 GetHtmlMode( const SwDocShell* );
|
|
|
|
using namespace ::com::sun::star;
|
|
|
|
sal_uInt16 SwDoc::GetFlyCount( FlyCntType eType ) const
|
|
{
|
|
const SwSpzFrmFmts& rFmts = *GetSpzFrmFmts();
|
|
sal_uInt16 nSize = rFmts.Count();
|
|
sal_uInt16 nCount = 0;
|
|
const SwNodeIndex* pIdx;
|
|
for ( sal_uInt16 i = 0; i < nSize; i++)
|
|
{
|
|
const SwFrmFmt* pFlyFmt = rFmts[ i ];
|
|
if( RES_FLYFRMFMT == pFlyFmt->Which()
|
|
&& 0 != ( pIdx = pFlyFmt->GetCntnt().GetCntntIdx() )
|
|
&& pIdx->GetNodes().IsDocNodes()
|
|
)
|
|
{
|
|
const SwNode* pNd = GetNodes()[ pIdx->GetIndex() + 1 ];
|
|
|
|
switch( eType )
|
|
{
|
|
case FLYCNTTYPE_FRM:
|
|
if(!pNd->IsNoTxtNode())
|
|
nCount++;
|
|
break;
|
|
|
|
case FLYCNTTYPE_GRF:
|
|
if( pNd->IsGrfNode() )
|
|
nCount++;
|
|
break;
|
|
|
|
case FLYCNTTYPE_OLE:
|
|
if(pNd->IsOLENode())
|
|
nCount++;
|
|
break;
|
|
|
|
default:
|
|
nCount++;
|
|
}
|
|
}
|
|
}
|
|
return nCount;
|
|
}
|
|
|
|
// If you change this, also update SwXFrameEnumeration in unocoll.
|
|
SwFrmFmt* SwDoc::GetFlyNum( sal_uInt16 nIdx, FlyCntType eType )
|
|
{
|
|
SwSpzFrmFmts& rFmts = *GetSpzFrmFmts();
|
|
SwFrmFmt* pRetFmt = 0;
|
|
sal_uInt16 nSize = rFmts.Count();
|
|
const SwNodeIndex* pIdx;
|
|
sal_uInt16 nCount = 0;
|
|
for( sal_uInt16 i = 0; !pRetFmt && i < nSize; ++i )
|
|
{
|
|
SwFrmFmt* pFlyFmt = rFmts[ i ];
|
|
if( RES_FLYFRMFMT == pFlyFmt->Which()
|
|
&& 0 != ( pIdx = pFlyFmt->GetCntnt().GetCntntIdx() )
|
|
&& pIdx->GetNodes().IsDocNodes()
|
|
)
|
|
{
|
|
const SwNode* pNd = GetNodes()[ pIdx->GetIndex() + 1 ];
|
|
switch( eType )
|
|
{
|
|
case FLYCNTTYPE_FRM:
|
|
if( !pNd->IsNoTxtNode() && nIdx == nCount++)
|
|
pRetFmt = pFlyFmt;
|
|
break;
|
|
case FLYCNTTYPE_GRF:
|
|
if(pNd->IsGrfNode() && nIdx == nCount++ )
|
|
pRetFmt = pFlyFmt;
|
|
break;
|
|
case FLYCNTTYPE_OLE:
|
|
if(pNd->IsOLENode() && nIdx == nCount++)
|
|
pRetFmt = pFlyFmt;
|
|
break;
|
|
default:
|
|
if(nIdx == nCount++)
|
|
pRetFmt = pFlyFmt;
|
|
}
|
|
}
|
|
}
|
|
return pRetFmt;
|
|
}
|
|
|
|
/***********************************************************************
|
|
#* Class : SwDoc
|
|
#* Methode : SetFlyFrmAnchor
|
|
#* Beschreibung: Das Ankerattribut des FlyFrms aendert sich.
|
|
#***********************************************************************/
|
|
Point lcl_FindAnchorLayPos( SwDoc& rDoc, const SwFmtAnchor& rAnch,
|
|
const SwFrmFmt* pFlyFmt )
|
|
{
|
|
Point aRet;
|
|
if( rDoc.GetRootFrm() )
|
|
switch( rAnch.GetAnchorId() )
|
|
{
|
|
case FLY_AS_CHAR:
|
|
if( pFlyFmt && rAnch.GetCntntAnchor() )
|
|
{
|
|
const SwFrm* pOld = ((SwFlyFrmFmt*)pFlyFmt)->GetFrm( &aRet, sal_False );
|
|
if( pOld )
|
|
aRet = pOld->Frm().Pos();
|
|
}
|
|
break;
|
|
|
|
case FLY_AT_PARA:
|
|
case FLY_AT_CHAR: // LAYER_IMPL
|
|
if( rAnch.GetCntntAnchor() )
|
|
{
|
|
const SwPosition *pPos = rAnch.GetCntntAnchor();
|
|
const SwCntntNode* pNd = pPos->nNode.GetNode().GetCntntNode();
|
|
const SwFrm* pOld = pNd ? pNd->GetFrm( &aRet, 0, sal_False ) : 0;
|
|
if( pOld )
|
|
aRet = pOld->Frm().Pos();
|
|
}
|
|
break;
|
|
|
|
case FLY_AT_FLY: // LAYER_IMPL
|
|
if( rAnch.GetCntntAnchor() )
|
|
{
|
|
const SwFlyFrmFmt* pFmt = (SwFlyFrmFmt*)rAnch.GetCntntAnchor()->
|
|
nNode.GetNode().GetFlyFmt();
|
|
const SwFrm* pOld = pFmt ? pFmt->GetFrm( &aRet, sal_False ) : 0;
|
|
if( pOld )
|
|
aRet = pOld->Frm().Pos();
|
|
}
|
|
break;
|
|
|
|
case FLY_AT_PAGE:
|
|
{
|
|
sal_uInt16 nPgNum = rAnch.GetPageNum();
|
|
const SwPageFrm *pPage = (SwPageFrm*)rDoc.GetRootFrm()->Lower();
|
|
for( sal_uInt16 i = 1; (i <= nPgNum) && pPage; ++i,
|
|
pPage = (const SwPageFrm*)pPage->GetNext() )
|
|
if( i == nPgNum )
|
|
{
|
|
aRet = pPage->Frm().Pos();
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return aRet;
|
|
}
|
|
|
|
#define MAKEFRMS 0
|
|
#define IGNOREANCHOR 1
|
|
#define DONTMAKEFRMS 2
|
|
|
|
sal_Int8 SwDoc::SetFlyFrmAnchor( SwFrmFmt& rFmt, SfxItemSet& rSet, sal_Bool bNewFrms )
|
|
{
|
|
//Ankerwechsel sind fast immer in alle 'Richtungen' erlaubt.
|
|
//Ausnahme: Absatz- bzw. Zeichengebundene Rahmen duerfen wenn sie in
|
|
//Kopf-/Fusszeilen stehen nicht Seitengebunden werden.
|
|
const SwFmtAnchor &rOldAnch = rFmt.GetAnchor();
|
|
const RndStdIds nOld = rOldAnch.GetAnchorId();
|
|
|
|
SwFmtAnchor aNewAnch( (SwFmtAnchor&)rSet.Get( RES_ANCHOR ) );
|
|
RndStdIds nNew = aNewAnch.GetAnchorId();
|
|
|
|
// ist der neue ein gueltiger Anker?
|
|
if( !aNewAnch.GetCntntAnchor() && (FLY_AT_FLY == nNew ||
|
|
(FLY_AT_PARA == nNew) || (FLY_AS_CHAR == nNew) ||
|
|
(FLY_AT_CHAR == nNew) ))
|
|
{
|
|
return IGNOREANCHOR;
|
|
}
|
|
|
|
if( nOld == nNew )
|
|
return DONTMAKEFRMS;
|
|
|
|
|
|
Point aOldAnchorPos( ::lcl_FindAnchorLayPos( *this, rOldAnch, &rFmt ));
|
|
Point aNewAnchorPos( ::lcl_FindAnchorLayPos( *this, aNewAnch, 0 ));
|
|
|
|
//Die alten Frms vernichten. Dabei werden die Views implizit gehidet und
|
|
//doppeltes hiden waere so eine art Show!
|
|
rFmt.DelFrms();
|
|
|
|
if ( FLY_AS_CHAR == nOld )
|
|
{
|
|
//Bei InCntnt's wird es spannend: Das TxtAttribut muss vernichtet
|
|
//werden. Leider reisst dies neben den Frms auch noch das Format mit
|
|
//in sein Grab. Um dass zu unterbinden loesen wir vorher die
|
|
//Verbindung zwischen Attribut und Format.
|
|
const SwPosition *pPos = rOldAnch.GetCntntAnchor();
|
|
SwTxtNode *pTxtNode = pPos->nNode.GetNode().GetTxtNode();
|
|
OSL_ENSURE( pTxtNode->HasHints(), "Missing FlyInCnt-Hint." );
|
|
const xub_StrLen nIdx = pPos->nContent.GetIndex();
|
|
SwTxtAttr * const pHnt =
|
|
pTxtNode->GetTxtAttrForCharAt( nIdx, RES_TXTATR_FLYCNT );
|
|
OSL_ENSURE( pHnt && pHnt->Which() == RES_TXTATR_FLYCNT,
|
|
"Missing FlyInCnt-Hint." );
|
|
OSL_ENSURE( pHnt && pHnt->GetFlyCnt().GetFrmFmt() == &rFmt,
|
|
"Wrong TxtFlyCnt-Hint." );
|
|
const_cast<SwFmtFlyCnt&>(pHnt->GetFlyCnt()).SetFlyFmt();
|
|
|
|
//Die Verbindung ist geloest, jetzt muss noch das Attribut vernichtet
|
|
//werden.
|
|
pTxtNode->DeleteAttributes( RES_TXTATR_FLYCNT, nIdx, nIdx );
|
|
}
|
|
|
|
//Endlich kann das Attribut gesetzt werden. Es muss das erste Attribut
|
|
//sein; Undo depends on it!
|
|
rFmt.SetFmtAttr( aNewAnch );
|
|
|
|
//Positionskorrekturen
|
|
const SfxPoolItem* pItem;
|
|
switch( nNew )
|
|
{
|
|
case FLY_AS_CHAR:
|
|
//Wenn keine Positionsattribute hereinkommen, dann muss dafuer
|
|
//gesorgt werden, das keine unerlaubte automatische Ausrichtung
|
|
//bleibt.
|
|
{
|
|
const SwPosition *pPos = aNewAnch.GetCntntAnchor();
|
|
SwTxtNode *pNd = pPos->nNode.GetNode().GetTxtNode();
|
|
OSL_ENSURE( pNd, "Crsr steht nicht auf TxtNode." );
|
|
|
|
SwFmtFlyCnt aFmt( static_cast<SwFlyFrmFmt*>(&rFmt) );
|
|
pNd->InsertItem( aFmt, pPos->nContent.GetIndex(), 0 );
|
|
}
|
|
|
|
if( SFX_ITEM_SET != rSet.GetItemState( RES_VERT_ORIENT, sal_False, &pItem ))
|
|
{
|
|
SwFmtVertOrient aOldV( rFmt.GetVertOrient() );
|
|
sal_Bool bSet = sal_True;
|
|
switch( aOldV.GetVertOrient() )
|
|
{
|
|
case text::VertOrientation::LINE_TOP: aOldV.SetVertOrient( text::VertOrientation::TOP ); break;
|
|
case text::VertOrientation::LINE_CENTER: aOldV.SetVertOrient( text::VertOrientation::CENTER); break;
|
|
case text::VertOrientation::LINE_BOTTOM: aOldV.SetVertOrient( text::VertOrientation::BOTTOM); break;
|
|
case text::VertOrientation::NONE: aOldV.SetVertOrient( text::VertOrientation::CENTER); break;
|
|
default:
|
|
bSet = sal_False;
|
|
}
|
|
if( bSet )
|
|
rSet.Put( aOldV );
|
|
}
|
|
break;
|
|
|
|
case FLY_AT_PARA:
|
|
case FLY_AT_CHAR: // LAYER_IMPL
|
|
case FLY_AT_FLY: // LAYER_IMPL
|
|
case FLY_AT_PAGE:
|
|
{
|
|
//Wenn keine Positionsattribute hereinschneien korrigieren wir
|
|
//die Position so, dass die Dokumentkoordinaten des Flys erhalten
|
|
//bleiben.
|
|
//Chg: Wenn sich in den Positionsattributen lediglich die
|
|
//Ausrichtung veraendert (text::RelOrientation::FRAME vs. text::RelOrientation::PRTAREA), dann wird die
|
|
//Position ebenfalls korrigiert.
|
|
if( SFX_ITEM_SET != rSet.GetItemState( RES_HORI_ORIENT, sal_False, &pItem ))
|
|
pItem = 0;
|
|
|
|
SwFmtHoriOrient aOldH( rFmt.GetHoriOrient() );
|
|
|
|
if( text::HoriOrientation::NONE == aOldH.GetHoriOrient() && ( !pItem ||
|
|
aOldH.GetPos() == ((SwFmtHoriOrient*)pItem)->GetPos() ))
|
|
{
|
|
SwTwips nPos = (FLY_AS_CHAR == nOld) ? 0 : aOldH.GetPos();
|
|
nPos += aOldAnchorPos.X() - aNewAnchorPos.X();
|
|
|
|
if( pItem )
|
|
{
|
|
SwFmtHoriOrient* pH = (SwFmtHoriOrient*)pItem;
|
|
aOldH.SetHoriOrient( pH->GetHoriOrient() );
|
|
aOldH.SetRelationOrient( pH->GetRelationOrient() );
|
|
}
|
|
aOldH.SetPos( nPos );
|
|
rSet.Put( aOldH );
|
|
}
|
|
|
|
if( SFX_ITEM_SET != rSet.GetItemState( RES_VERT_ORIENT, sal_False, &pItem ))
|
|
pItem = 0;
|
|
SwFmtVertOrient aOldV( rFmt.GetVertOrient() );
|
|
|
|
// #i28922# - correction: compare <aOldV.GetVertOrient() with
|
|
// <text::VertOrientation::NONE>
|
|
if( text::VertOrientation::NONE == aOldV.GetVertOrient() && (!pItem ||
|
|
aOldV.GetPos() == ((SwFmtVertOrient*)pItem)->GetPos() ) )
|
|
{
|
|
SwTwips nPos = (FLY_AS_CHAR == nOld) ? 0 : aOldV.GetPos();
|
|
nPos += aOldAnchorPos.Y() - aNewAnchorPos.Y();
|
|
if( pItem )
|
|
{
|
|
SwFmtVertOrient* pV = (SwFmtVertOrient*)pItem;
|
|
aOldV.SetVertOrient( pV->GetVertOrient() );
|
|
aOldV.SetRelationOrient( pV->GetRelationOrient() );
|
|
}
|
|
aOldV.SetPos( nPos );
|
|
rSet.Put( aOldV );
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if( bNewFrms )
|
|
rFmt.MakeFrms();
|
|
|
|
return MAKEFRMS;
|
|
}
|
|
|
|
static bool
|
|
lcl_SetFlyFrmAttr(SwDoc & rDoc,
|
|
sal_Int8 (SwDoc::*pSetFlyFrmAnchor)(SwFrmFmt &, SfxItemSet &, sal_Bool),
|
|
SwFrmFmt & rFlyFmt, SfxItemSet & rSet)
|
|
{
|
|
// #i32968# Inserting columns in the frame causes MakeFrmFmt to put two
|
|
// objects of type SwUndoFrmFmt on the undo stack. We don't want them.
|
|
::sw::UndoGuard const undoGuard(rDoc.GetIDocumentUndoRedo());
|
|
|
|
//Ist das Ankerattribut dabei? Falls ja ueberlassen wir die Verarbeitung
|
|
//desselben einer Spezialmethode. Sie Returnt sal_True wenn der Fly neu
|
|
//erzeugt werden muss (z.B. weil ein Wechsel des FlyTyps vorliegt).
|
|
sal_Int8 const nMakeFrms =
|
|
(SFX_ITEM_SET == rSet.GetItemState( RES_ANCHOR, sal_False ))
|
|
? (rDoc.*pSetFlyFrmAnchor)( rFlyFmt, rSet, sal_False )
|
|
: DONTMAKEFRMS;
|
|
|
|
const SfxPoolItem* pItem;
|
|
SfxItemIter aIter( rSet );
|
|
SfxItemSet aTmpSet( rDoc.GetAttrPool(), aFrmFmtSetRange );
|
|
sal_uInt16 nWhich = aIter.GetCurItem()->Which();
|
|
do {
|
|
switch( nWhich )
|
|
{
|
|
case RES_FILL_ORDER:
|
|
case RES_BREAK:
|
|
case RES_PAGEDESC:
|
|
case RES_CNTNT:
|
|
case RES_FOOTER:
|
|
OSL_ENSURE( !this, ":-) Unbekanntes Attribut fuer Fly." );
|
|
// kein break;
|
|
case RES_CHAIN:
|
|
rSet.ClearItem( nWhich );
|
|
break;
|
|
case RES_ANCHOR:
|
|
if( DONTMAKEFRMS != nMakeFrms )
|
|
break;
|
|
|
|
default:
|
|
if( !IsInvalidItem( aIter.GetCurItem() ) && ( SFX_ITEM_SET !=
|
|
rFlyFmt.GetAttrSet().GetItemState( nWhich, sal_True, &pItem ) ||
|
|
*pItem != *aIter.GetCurItem() ))
|
|
aTmpSet.Put( *aIter.GetCurItem() );
|
|
break;
|
|
}
|
|
|
|
if( aIter.IsAtEnd() )
|
|
break;
|
|
|
|
} while( 0 != ( nWhich = aIter.NextItem()->Which() ) );
|
|
|
|
if( aTmpSet.Count() )
|
|
rFlyFmt.SetFmtAttr( aTmpSet );
|
|
|
|
if( MAKEFRMS == nMakeFrms )
|
|
rFlyFmt.MakeFrms();
|
|
|
|
return aTmpSet.Count() || MAKEFRMS == nMakeFrms;
|
|
}
|
|
|
|
sal_Bool SwDoc::SetFlyFrmAttr( SwFrmFmt& rFlyFmt, SfxItemSet& rSet )
|
|
{
|
|
if( !rSet.Count() )
|
|
return sal_False;
|
|
|
|
::std::auto_ptr<SwUndoFmtAttrHelper> pSaveUndo;
|
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
|
{
|
|
GetIDocumentUndoRedo().ClearRedo(); // AppendUndo far below, so leave it
|
|
pSaveUndo.reset( new SwUndoFmtAttrHelper( rFlyFmt ) );
|
|
}
|
|
|
|
bool const bRet =
|
|
lcl_SetFlyFrmAttr(*this, &SwDoc::SetFlyFrmAnchor, rFlyFmt, rSet);
|
|
|
|
if ( pSaveUndo.get() )
|
|
{
|
|
if ( pSaveUndo->GetUndo() )
|
|
{
|
|
GetIDocumentUndoRedo().AppendUndo( pSaveUndo->ReleaseUndo() );
|
|
}
|
|
}
|
|
|
|
SetModified();
|
|
|
|
return bRet;
|
|
}
|
|
|
|
// #i73249#
|
|
void SwDoc::SetFlyFrmTitle( SwFlyFrmFmt& rFlyFrmFmt,
|
|
const String& sNewTitle )
|
|
{
|
|
if ( rFlyFrmFmt.GetObjTitle() == sNewTitle )
|
|
{
|
|
return;
|
|
}
|
|
|
|
::sw::DrawUndoGuard const drawUndoGuard(GetIDocumentUndoRedo());
|
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
|
{
|
|
GetIDocumentUndoRedo().AppendUndo( new SwUndoFlyStrAttr( rFlyFrmFmt,
|
|
UNDO_FLYFRMFMT_TITLE,
|
|
rFlyFrmFmt.GetObjTitle(),
|
|
sNewTitle ) );
|
|
}
|
|
|
|
rFlyFrmFmt.SetObjTitle( sNewTitle, true );
|
|
|
|
SetModified();
|
|
}
|
|
|
|
void SwDoc::SetFlyFrmDescription( SwFlyFrmFmt& rFlyFrmFmt,
|
|
const String& sNewDescription )
|
|
{
|
|
if ( rFlyFrmFmt.GetObjDescription() == sNewDescription )
|
|
{
|
|
return;
|
|
}
|
|
|
|
::sw::DrawUndoGuard const drawUndoGuard(GetIDocumentUndoRedo());
|
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
|
{
|
|
GetIDocumentUndoRedo().AppendUndo( new SwUndoFlyStrAttr( rFlyFrmFmt,
|
|
UNDO_FLYFRMFMT_DESCRIPTION,
|
|
rFlyFrmFmt.GetObjDescription(),
|
|
sNewDescription ) );
|
|
}
|
|
|
|
rFlyFrmFmt.SetObjDescription( sNewDescription, true );
|
|
|
|
SetModified();
|
|
}
|
|
|
|
/***************************************************************************
|
|
* Methode : sal_Bool SwDoc::SetFrmFmtToFly( SwFlyFrm&, SwFrmFmt& )
|
|
* Beschreibung:
|
|
***************************************************************************/
|
|
sal_Bool SwDoc::SetFrmFmtToFly( SwFrmFmt& rFmt, SwFrmFmt& rNewFmt,
|
|
SfxItemSet* pSet, sal_Bool bKeepOrient )
|
|
{
|
|
sal_Bool bChgAnchor = sal_False, bFrmSz = sal_False;
|
|
|
|
const SwFmtFrmSize aFrmSz( rFmt.GetFrmSize() );
|
|
const SwFmtVertOrient aVert( rFmt.GetVertOrient() );
|
|
const SwFmtHoriOrient aHori( rFmt.GetHoriOrient() );
|
|
|
|
SwUndoSetFlyFmt* pUndo = 0;
|
|
bool const bUndo = GetIDocumentUndoRedo().DoesUndo();
|
|
if (bUndo)
|
|
{
|
|
pUndo = new SwUndoSetFlyFmt( rFmt, rNewFmt );
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
|
}
|
|
|
|
// #i32968# Inserting columns in the section causes MakeFrmFmt to put
|
|
// 2 objects of type SwUndoFrmFmt on the undo stack. We don't want them.
|
|
::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo());
|
|
|
|
//Erstmal die Spalten setzen, sonst gibts nix als Aerger mit dem
|
|
//Set/Reset/Abgleich usw.
|
|
const SfxPoolItem* pItem;
|
|
if( SFX_ITEM_SET != rNewFmt.GetAttrSet().GetItemState( RES_COL ))
|
|
rFmt.ResetFmtAttr( RES_COL );
|
|
|
|
if( rFmt.DerivedFrom() != &rNewFmt )
|
|
{
|
|
rFmt.SetDerivedFrom( &rNewFmt );
|
|
|
|
// 1. wenn nicht automatisch -> ignorieren, sonst -> wech
|
|
// 2. wech damit, MB!
|
|
if( SFX_ITEM_SET == rNewFmt.GetAttrSet().GetItemState( RES_FRM_SIZE, sal_False ))
|
|
{
|
|
rFmt.ResetFmtAttr( RES_FRM_SIZE );
|
|
bFrmSz = sal_True;
|
|
}
|
|
|
|
const SfxItemSet* pAsk = pSet;
|
|
if( !pAsk ) pAsk = &rNewFmt.GetAttrSet();
|
|
if( SFX_ITEM_SET == pAsk->GetItemState( RES_ANCHOR, sal_False, &pItem )
|
|
&& ((SwFmtAnchor*)pItem)->GetAnchorId() !=
|
|
rFmt.GetAnchor().GetAnchorId() )
|
|
{
|
|
if( pSet )
|
|
bChgAnchor = MAKEFRMS == SetFlyFrmAnchor( rFmt, *pSet, sal_False );
|
|
else
|
|
{
|
|
//JP 23.04.98: muss den FlyFmt-Range haben, denn im SetFlyFrmAnchor
|
|
// werden Attribute in diesen gesetzt!
|
|
SfxItemSet aFlySet( *rNewFmt.GetAttrSet().GetPool(),
|
|
rNewFmt.GetAttrSet().GetRanges() );
|
|
aFlySet.Put( *pItem );
|
|
bChgAnchor = MAKEFRMS == SetFlyFrmAnchor( rFmt, aFlySet, sal_False);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Hori und Vert nur dann resetten, wenn in der Vorlage eine
|
|
//automatische Ausrichtung eingestellt ist, anderfalls den alten Wert
|
|
//wieder hineinstopfen.
|
|
// beim Update der RahmenVorlage sollte der Fly NICHT
|
|
// seine Orientierng verlieren (diese wird nicht geupdatet!)
|
|
// text::HoriOrientation::NONE and text::VertOrientation::NONE are allowed now
|
|
if (!bKeepOrient)
|
|
{
|
|
rFmt.ResetFmtAttr(RES_VERT_ORIENT);
|
|
rFmt.ResetFmtAttr(RES_HORI_ORIENT);
|
|
}
|
|
|
|
rFmt.ResetFmtAttr( RES_PRINT, RES_SURROUND );
|
|
rFmt.ResetFmtAttr( RES_LR_SPACE, RES_UL_SPACE );
|
|
rFmt.ResetFmtAttr( RES_BACKGROUND, RES_COL );
|
|
rFmt.ResetFmtAttr( RES_URL, RES_EDIT_IN_READONLY );
|
|
|
|
if( !bFrmSz )
|
|
rFmt.SetFmtAttr( aFrmSz );
|
|
|
|
if( bChgAnchor )
|
|
rFmt.MakeFrms();
|
|
|
|
if( pUndo )
|
|
rFmt.Remove( pUndo );
|
|
|
|
SetModified();
|
|
|
|
return bChgAnchor;
|
|
}
|
|
|
|
void SwDoc::GetGrfNms( const SwFlyFrmFmt& rFmt, String* pGrfName,
|
|
String* pFltName ) const
|
|
{
|
|
SwNodeIndex aIdx( *rFmt.GetCntnt().GetCntntIdx(), 1 );
|
|
const SwGrfNode* pGrfNd = aIdx.GetNode().GetGrfNode();
|
|
if( pGrfNd && pGrfNd->IsLinkedFile() )
|
|
pGrfNd->GetFileFilterNms( pGrfName, pFltName );
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwDoc::ChgAnchor()
|
|
|*
|
|
*************************************************************************/
|
|
sal_Bool SwDoc::ChgAnchor( const SdrMarkList& _rMrkList,
|
|
RndStdIds _eAnchorType,
|
|
const sal_Bool _bSameOnly,
|
|
const sal_Bool _bPosCorr )
|
|
{
|
|
OSL_ENSURE( GetRootFrm(), "Ohne Layout geht gar nichts" );
|
|
|
|
if ( !_rMrkList.GetMarkCount() ||
|
|
_rMrkList.GetMark( 0 )->GetMarkedSdrObj()->GetUpGroup() )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
GetIDocumentUndoRedo().StartUndo( UNDO_INSATTR, NULL );
|
|
|
|
sal_Bool bUnmark = sal_False;
|
|
for ( sal_uInt16 i = 0; i < _rMrkList.GetMarkCount(); ++i )
|
|
{
|
|
SdrObject* pObj = _rMrkList.GetMark( i )->GetMarkedSdrObj();
|
|
if ( !pObj->ISA(SwVirtFlyDrawObj) )
|
|
{
|
|
SwDrawContact* pContact = static_cast<SwDrawContact*>(GetUserCall(pObj));
|
|
|
|
// consider, that drawing object has
|
|
// no user call. E.g.: a 'virtual' drawing object is disconnected by
|
|
// the anchor type change of the 'master' drawing object.
|
|
// Continue with next selected object and assert, if this isn't excepted.
|
|
if ( !pContact )
|
|
{
|
|
#if OSL_DEBUG_LEVEL > 1
|
|
bool bNoUserCallExcepted =
|
|
pObj->ISA(SwDrawVirtObj) &&
|
|
!static_cast<SwDrawVirtObj*>(pObj)->IsConnected();
|
|
OSL_ENSURE( bNoUserCallExcepted, "SwDoc::ChgAnchor(..) - no contact at selected drawing object" );
|
|
#endif
|
|
continue;
|
|
}
|
|
|
|
// #i26791#
|
|
const SwFrm* pOldAnchorFrm = pContact->GetAnchorFrm( pObj );
|
|
const SwFrm* pNewAnchorFrm = pOldAnchorFrm;
|
|
|
|
// #i54336#
|
|
// Instead of only keeping the index position for an as-character
|
|
// anchored object the complete <SwPosition> is kept, because the
|
|
// anchor index position could be moved, if the object again is
|
|
// anchored as character.
|
|
const SwPosition* pOldAsCharAnchorPos( 0L );
|
|
const RndStdIds eOldAnchorType = pContact->GetAnchorId();
|
|
if ( !_bSameOnly && eOldAnchorType == FLY_AS_CHAR )
|
|
{
|
|
pOldAsCharAnchorPos = new SwPosition( pContact->GetCntntAnchor() );
|
|
}
|
|
|
|
if ( _bSameOnly )
|
|
_eAnchorType = eOldAnchorType;
|
|
|
|
SwFmtAnchor aNewAnch( _eAnchorType );
|
|
Rectangle aObjRect( pContact->GetAnchoredObj( pObj )->GetObjRect().SVRect() );
|
|
const Point aPt( aObjRect.TopLeft() );
|
|
|
|
switch ( _eAnchorType )
|
|
{
|
|
case FLY_AT_PARA:
|
|
case FLY_AT_CHAR:
|
|
{
|
|
const Point aNewPoint = pOldAnchorFrm &&
|
|
( pOldAnchorFrm->IsVertical() ||
|
|
pOldAnchorFrm->IsRightToLeft() )
|
|
? aObjRect.TopRight()
|
|
: aPt;
|
|
|
|
// allow drawing objects in header/footer
|
|
pNewAnchorFrm = ::FindAnchor( pOldAnchorFrm, aNewPoint, false );
|
|
if ( pNewAnchorFrm->IsTxtFrm() && ((SwTxtFrm*)pNewAnchorFrm)->IsFollow() )
|
|
{
|
|
pNewAnchorFrm = ((SwTxtFrm*)pNewAnchorFrm)->FindMaster();
|
|
}
|
|
if ( pNewAnchorFrm->IsProtected() )
|
|
{
|
|
pNewAnchorFrm = 0;
|
|
}
|
|
else
|
|
{
|
|
SwPosition aPos( *((SwCntntFrm*)pNewAnchorFrm)->GetNode() );
|
|
aNewAnch.SetType( _eAnchorType );
|
|
aNewAnch.SetAnchor( &aPos );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case FLY_AT_FLY: // LAYER_IMPL
|
|
{
|
|
//Ausgehend von der linken oberen Ecke des Fly den
|
|
//dichtesten SwFlyFrm suchen.
|
|
SwFrm *pTxtFrm;
|
|
{
|
|
SwCrsrMoveState aState( MV_SETONLYTEXT );
|
|
SwPosition aPos( GetNodes() );
|
|
Point aPoint( aPt );
|
|
aPoint.X() -= 1;
|
|
GetRootFrm()->GetCrsrOfst( &aPos, aPoint, &aState );
|
|
// consider that drawing objects can be in
|
|
// header/footer. Thus, <GetFrm()> by left-top-corner
|
|
pTxtFrm = aPos.nNode.GetNode().
|
|
GetCntntNode()->GetFrm( &aPt, 0, sal_False );
|
|
}
|
|
const SwFrm *pTmp = ::FindAnchor( pTxtFrm, aPt );
|
|
pNewAnchorFrm = pTmp->FindFlyFrm();
|
|
if( pNewAnchorFrm && !pNewAnchorFrm->IsProtected() )
|
|
{
|
|
const SwFrmFmt *pTmpFmt = ((SwFlyFrm*)pNewAnchorFrm)->GetFmt();
|
|
const SwFmtCntnt& rCntnt = pTmpFmt->GetCntnt();
|
|
SwPosition aPos( *rCntnt.GetCntntIdx() );
|
|
aNewAnch.SetAnchor( &aPos );
|
|
break;
|
|
}
|
|
|
|
aNewAnch.SetType( FLY_AT_PAGE );
|
|
// no break
|
|
}
|
|
case FLY_AT_PAGE:
|
|
{
|
|
pNewAnchorFrm = GetRootFrm()->Lower();
|
|
while ( pNewAnchorFrm && !pNewAnchorFrm->Frm().IsInside( aPt ) )
|
|
pNewAnchorFrm = pNewAnchorFrm->GetNext();
|
|
if ( !pNewAnchorFrm )
|
|
continue;
|
|
|
|
aNewAnch.SetPageNum( ((SwPageFrm*)pNewAnchorFrm)->GetPhyPageNum());
|
|
}
|
|
break;
|
|
case FLY_AS_CHAR:
|
|
if( _bSameOnly ) // Positions/Groessenaenderung
|
|
{
|
|
if( !pOldAnchorFrm )
|
|
{
|
|
pContact->ConnectToLayout();
|
|
pOldAnchorFrm = pContact->GetAnchorFrm();
|
|
}
|
|
((SwTxtFrm*)pOldAnchorFrm)->Prepare();
|
|
}
|
|
else // Ankerwechsel
|
|
{
|
|
// allow drawing objects in header/footer
|
|
pNewAnchorFrm = ::FindAnchor( pOldAnchorFrm, aPt, false );
|
|
if( pNewAnchorFrm->IsProtected() )
|
|
{
|
|
pNewAnchorFrm = 0;
|
|
break;
|
|
}
|
|
|
|
bUnmark = ( 0 != i );
|
|
Point aPoint( aPt );
|
|
aPoint.X() -= 1; // nicht im DrawObj landen!!
|
|
aNewAnch.SetType( FLY_AS_CHAR );
|
|
SwPosition aPos( *((SwCntntFrm*)pNewAnchorFrm)->GetNode() );
|
|
if ( pNewAnchorFrm->Frm().IsInside( aPoint ) )
|
|
{
|
|
// es muss ein TextNode gefunden werden, denn nur dort
|
|
// ist ein inhaltsgebundenes DrawObjekt zu verankern
|
|
SwCrsrMoveState aState( MV_SETONLYTEXT );
|
|
GetRootFrm()->GetCrsrOfst( &aPos, aPoint, &aState );
|
|
}
|
|
else
|
|
{
|
|
SwCntntNode &rCNd = (SwCntntNode&)
|
|
*((SwCntntFrm*)pNewAnchorFrm)->GetNode();
|
|
if ( pNewAnchorFrm->Frm().Bottom() < aPt.Y() )
|
|
rCNd.MakeStartIndex( &aPos.nContent );
|
|
else
|
|
rCNd.MakeEndIndex( &aPos.nContent );
|
|
}
|
|
aNewAnch.SetAnchor( &aPos );
|
|
SetAttr( aNewAnch, *pContact->GetFmt() );
|
|
// #i26791# - adjust vertical positioning to 'center to
|
|
// baseline'
|
|
SetAttr( SwFmtVertOrient( 0, text::VertOrientation::CENTER, text::RelOrientation::FRAME ), *pContact->GetFmt() );
|
|
SwTxtNode *pNd = aPos.nNode.GetNode().GetTxtNode();
|
|
OSL_ENSURE( pNd, "Cursor not positioned at TxtNode." );
|
|
|
|
SwFmtFlyCnt aFmt( pContact->GetFmt() );
|
|
pNd->InsertItem( aFmt, aPos.nContent.GetIndex(), 0 );
|
|
}
|
|
break;
|
|
default:
|
|
OSL_ENSURE( !this, "unexpected AnchorId." );
|
|
}
|
|
|
|
if ( (FLY_AS_CHAR != _eAnchorType) &&
|
|
pNewAnchorFrm &&
|
|
( !_bSameOnly || pNewAnchorFrm != pOldAnchorFrm ) )
|
|
{
|
|
// #i26791# - Direct object positioning no longer needed. Apply
|
|
// of attributes (method call <SetAttr(..)>) takes care of the
|
|
// invalidation of the object position.
|
|
SetAttr( aNewAnch, *pContact->GetFmt() );
|
|
if ( _bPosCorr )
|
|
{
|
|
// #i33313# - consider not connected 'virtual' drawing
|
|
// objects
|
|
if ( pObj->ISA(SwDrawVirtObj) &&
|
|
!static_cast<SwDrawVirtObj*>(pObj)->IsConnected() )
|
|
{
|
|
SwRect aNewObjRect( aObjRect );
|
|
static_cast<SwAnchoredDrawObject*>(pContact->GetAnchoredObj( 0L ))
|
|
->AdjustPositioningAttr( pNewAnchorFrm,
|
|
&aNewObjRect );
|
|
|
|
}
|
|
else
|
|
{
|
|
static_cast<SwAnchoredDrawObject*>(pContact->GetAnchoredObj( pObj ))
|
|
->AdjustPositioningAttr( pNewAnchorFrm );
|
|
}
|
|
}
|
|
}
|
|
|
|
// #i54336#
|
|
if ( pNewAnchorFrm && pOldAsCharAnchorPos )
|
|
{
|
|
//Bei InCntnt's wird es spannend: Das TxtAttribut muss vernichtet
|
|
//werden. Leider reisst dies neben den Frms auch noch das Format mit
|
|
//in sein Grab. Um dass zu unterbinden loesen wir vorher die
|
|
//Verbindung zwischen Attribut und Format.
|
|
const xub_StrLen nIndx( pOldAsCharAnchorPos->nContent.GetIndex() );
|
|
SwTxtNode* pTxtNode( pOldAsCharAnchorPos->nNode.GetNode().GetTxtNode() );
|
|
OSL_ENSURE( pTxtNode, "<SwDoc::ChgAnchor(..)> - missing previous anchor text node for as-character anchored object" );
|
|
OSL_ENSURE( pTxtNode->HasHints(), "Missing FlyInCnt-Hint." );
|
|
SwTxtAttr * const pHnt =
|
|
pTxtNode->GetTxtAttrForCharAt( nIndx, RES_TXTATR_FLYCNT );
|
|
const_cast<SwFmtFlyCnt&>(pHnt->GetFlyCnt()).SetFlyFmt();
|
|
|
|
//Die Verbindung ist geloest, jetzt muss noch das Attribut vernichtet
|
|
//werden.
|
|
pTxtNode->DeleteAttributes( RES_TXTATR_FLYCNT, nIndx, nIndx );
|
|
delete pOldAsCharAnchorPos;
|
|
}
|
|
}
|
|
}
|
|
|
|
GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
|
|
SetModified();
|
|
|
|
return bUnmark;
|
|
}
|
|
|
|
int SwDoc::Chainable( const SwFrmFmt &rSource, const SwFrmFmt &rDest )
|
|
{
|
|
//Die Source darf noch keinen Follow haben.
|
|
const SwFmtChain &rOldChain = rSource.GetChain();
|
|
if ( rOldChain.GetNext() )
|
|
return SW_CHAIN_SOURCE_CHAINED;
|
|
|
|
//Ziel darf natuerlich nicht gleich Source sein und es
|
|
//darf keine geschlossene Kette entstehen.
|
|
const SwFrmFmt *pFmt = &rDest;
|
|
do {
|
|
if( pFmt == &rSource )
|
|
return SW_CHAIN_SELF;
|
|
pFmt = pFmt->GetChain().GetNext();
|
|
} while ( pFmt );
|
|
|
|
//Auch eine Verkettung von Innen nach aussen oder von aussen
|
|
//nach innen ist nicht zulaessig.
|
|
if( rDest.IsLowerOf( rSource ) || rSource .IsLowerOf( rDest ) )
|
|
return SW_CHAIN_SELF;
|
|
|
|
//Das Ziel darf noch keinen Master haben.
|
|
const SwFmtChain &rChain = rDest.GetChain();
|
|
if( rChain.GetPrev() )
|
|
return SW_CHAIN_IS_IN_CHAIN;
|
|
|
|
//Das Ziel muss leer sein.
|
|
const SwNodeIndex* pCntIdx = rDest.GetCntnt().GetCntntIdx();
|
|
if( !pCntIdx )
|
|
return SW_CHAIN_NOT_FOUND;
|
|
|
|
SwNodeIndex aNxtIdx( *pCntIdx, 1 );
|
|
const SwTxtNode* pTxtNd = aNxtIdx.GetNode().GetTxtNode();
|
|
if( !pTxtNd )
|
|
return SW_CHAIN_NOT_FOUND;
|
|
|
|
const sal_uLong nFlySttNd = pCntIdx->GetIndex();
|
|
if( 2 != ( pCntIdx->GetNode().EndOfSectionIndex() - nFlySttNd ) ||
|
|
pTxtNd->GetTxt().Len() )
|
|
return SW_CHAIN_NOT_EMPTY;
|
|
|
|
sal_uInt16 nArrLen = GetSpzFrmFmts()->Count();
|
|
for( sal_uInt16 n = 0; n < nArrLen; ++n )
|
|
{
|
|
const SwFmtAnchor& rAnchor = (*GetSpzFrmFmts())[ n ]->GetAnchor();
|
|
sal_uLong nTstSttNd;
|
|
// #i20622# - to-frame anchored objects are allowed.
|
|
if ( ((rAnchor.GetAnchorId() == FLY_AT_PARA) ||
|
|
(rAnchor.GetAnchorId() == FLY_AT_CHAR)) &&
|
|
0 != rAnchor.GetCntntAnchor() &&
|
|
nFlySttNd <= ( nTstSttNd =
|
|
rAnchor.GetCntntAnchor()->nNode.GetIndex() ) &&
|
|
nTstSttNd < nFlySttNd + 2 )
|
|
{
|
|
return SW_CHAIN_NOT_EMPTY;
|
|
}
|
|
}
|
|
|
|
//Auf die richtige Area muessen wir auch noch einen Blick werfen.
|
|
//Beide Flys muessen im selben Bereich (Body, Head/Foot, Fly) sitzen
|
|
//Wenn die Source nicht der selektierte Rahmen ist, so reicht es
|
|
//Wenn ein passender gefunden wird (Der Wunsch kann z.B. von der API
|
|
//kommen).
|
|
|
|
// both in the same fly, header, footer or on the page?
|
|
const SwFmtAnchor &rSrcAnchor = rSource.GetAnchor(),
|
|
&rDstAnchor = rDest.GetAnchor();
|
|
sal_uLong nEndOfExtras = GetNodes().GetEndOfExtras().GetIndex();
|
|
sal_Bool bAllowed = sal_False;
|
|
if ( FLY_AT_PAGE == rSrcAnchor.GetAnchorId() )
|
|
{
|
|
if ( (FLY_AT_PAGE == rDstAnchor.GetAnchorId()) ||
|
|
( rDstAnchor.GetCntntAnchor() &&
|
|
rDstAnchor.GetCntntAnchor()->nNode.GetIndex() > nEndOfExtras ))
|
|
bAllowed = sal_True;
|
|
}
|
|
else if( rSrcAnchor.GetCntntAnchor() && rDstAnchor.GetCntntAnchor() )
|
|
{
|
|
const SwNodeIndex &rSrcIdx = rSrcAnchor.GetCntntAnchor()->nNode,
|
|
&rDstIdx = rDstAnchor.GetCntntAnchor()->nNode;
|
|
const SwStartNode* pSttNd = 0;
|
|
if( rSrcIdx == rDstIdx ||
|
|
( !pSttNd &&
|
|
0 != ( pSttNd = rSrcIdx.GetNode().FindFlyStartNode() ) &&
|
|
pSttNd == rDstIdx.GetNode().FindFlyStartNode() ) ||
|
|
( !pSttNd &&
|
|
0 != ( pSttNd = rSrcIdx.GetNode().FindFooterStartNode() ) &&
|
|
pSttNd == rDstIdx.GetNode().FindFooterStartNode() ) ||
|
|
( !pSttNd &&
|
|
0 != ( pSttNd = rSrcIdx.GetNode().FindHeaderStartNode() ) &&
|
|
pSttNd == rDstIdx.GetNode().FindHeaderStartNode() ) ||
|
|
( !pSttNd && rDstIdx.GetIndex() > nEndOfExtras &&
|
|
rSrcIdx.GetIndex() > nEndOfExtras ))
|
|
bAllowed = sal_True;
|
|
}
|
|
|
|
return bAllowed ? SW_CHAIN_OK : SW_CHAIN_WRONG_AREA;
|
|
}
|
|
|
|
int SwDoc::Chain( SwFrmFmt &rSource, const SwFrmFmt &rDest )
|
|
{
|
|
int nErr = Chainable( rSource, rDest );
|
|
if ( !nErr )
|
|
{
|
|
GetIDocumentUndoRedo().StartUndo( UNDO_CHAINE, NULL );
|
|
|
|
SwFlyFrmFmt& rDestFmt = (SwFlyFrmFmt&)rDest;
|
|
|
|
//Follow an den Master haengen.
|
|
SwFmtChain aChain = rDestFmt.GetChain();
|
|
aChain.SetPrev( &(SwFlyFrmFmt&)rSource );
|
|
SetAttr( aChain, rDestFmt );
|
|
|
|
SfxItemSet aSet( GetAttrPool(), RES_FRM_SIZE, RES_FRM_SIZE,
|
|
RES_CHAIN, RES_CHAIN, 0 );
|
|
|
|
//Follow an den Master haengen.
|
|
aChain.SetPrev( &(SwFlyFrmFmt&)rSource );
|
|
SetAttr( aChain, rDestFmt );
|
|
|
|
//Master an den Follow haengen und dafuer sorgen, dass der Master
|
|
//eine fixierte Hoehe hat.
|
|
aChain = rSource.GetChain();
|
|
aChain.SetNext( &rDestFmt );
|
|
aSet.Put( aChain );
|
|
|
|
SwFmtFrmSize aSize( rSource.GetFrmSize() );
|
|
if ( aSize.GetHeightSizeType() != ATT_FIX_SIZE )
|
|
{
|
|
SwClientIter aIter( rSource );
|
|
SwFlyFrm *pFly = (SwFlyFrm*)aIter.First( TYPE(SwFlyFrm) );
|
|
if ( pFly )
|
|
aSize.SetHeight( pFly->Frm().Height() );
|
|
aSize.SetHeightSizeType( ATT_FIX_SIZE );
|
|
aSet.Put( aSize );
|
|
}
|
|
SetAttr( aSet, rSource );
|
|
|
|
GetIDocumentUndoRedo().EndUndo( UNDO_CHAINE, NULL );
|
|
}
|
|
return nErr;
|
|
}
|
|
|
|
void SwDoc::Unchain( SwFrmFmt &rFmt )
|
|
{
|
|
SwFmtChain aChain( rFmt.GetChain() );
|
|
if ( aChain.GetNext() )
|
|
{
|
|
GetIDocumentUndoRedo().StartUndo( UNDO_UNCHAIN, NULL );
|
|
SwFrmFmt *pFollow = aChain.GetNext();
|
|
aChain.SetNext( 0 );
|
|
SetAttr( aChain, rFmt );
|
|
aChain = pFollow->GetChain();
|
|
aChain.SetPrev( 0 );
|
|
SetAttr( aChain, *pFollow );
|
|
GetIDocumentUndoRedo().EndUndo( UNDO_UNCHAIN, NULL );
|
|
}
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|