summaryrefslogtreecommitdiff
path: root/svx/source/svdraw/svdotxat.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/svdraw/svdotxat.cxx')
-rw-r--r--svx/source/svdraw/svdotxat.cxx462
1 files changed, 462 insertions, 0 deletions
diff --git a/svx/source/svdraw/svdotxat.cxx b/svx/source/svdraw/svdotxat.cxx
new file mode 100644
index 000000000000..13064e890313
--- /dev/null
+++ b/svx/source/svdraw/svdotxat.cxx
@@ -0,0 +1,462 @@
+/*************************************************************************
+ *
+ * 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_svx.hxx"
+
+#include <svl/style.hxx>
+#include <svx/svdotext.hxx>
+#include "svditext.hxx"
+#include <svx/svdmodel.hxx> // fuer GetMaxObjSize und GetStyleSheetPool
+#include <svx/svdoutl.hxx>
+#include <svx/svdorect.hxx> // fuer SetDirty bei NbcAdjustTextFrameWidthAndHeight
+#include <svx/svdocapt.hxx> // fuer SetDirty bei NbcAdjustTextFrameWidthAndHeight
+#include <svx/svdetc.hxx>
+#include <editeng/writingmodeitem.hxx>
+#include <editeng/editeng.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/flditem.hxx>
+#include <svx/sdtfchim.hxx>
+
+
+#include <editeng/editview.hxx>
+#include <svl/smplhint.hxx>
+#include <svl/whiter.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/outliner.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/editobj.hxx>
+#include <editeng/fhgtitem.hxx>
+
+#include <editeng/charscaleitem.hxx>
+#include <svl/style.hxx>
+#include <svl/itemiter.hxx>
+#include <editeng/lrspitem.hxx>
+#include <svl/itempool.hxx>
+#include <editeng/numitem.hxx>
+#include <editeng/editeng.hxx>
+#include <editeng/postitem.hxx>
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// @@@@@@ @@@@@ @@ @@ @@@@@@ @@@@ @@@@@ @@@@@@
+// @@ @@ @@@ @@@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@@@@ @@ @@ @@ @@ @@ @@
+// @@ @@@@ @@@ @@ @@ @@ @@@@@ @@
+// @@ @@ @@@@@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@@ @@@ @@ @@ @@ @@ @@ @@ @@
+// @@ @@@@@ @@ @@ @@ @@@@ @@@@@ @@@@
+//
+// Attribute, StyleSheets und AutoGrow
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+FASTBOOL SdrTextObj::AdjustTextFrameWidthAndHeight(Rectangle& rR, FASTBOOL bHgt, FASTBOOL bWdt) const
+{
+ if (bTextFrame && pModel!=NULL && !rR.IsEmpty())
+ {
+ SdrFitToSizeType eFit=GetFitToSize();
+ FASTBOOL bFitToSize=(eFit==SDRTEXTFIT_PROPORTIONAL || eFit==SDRTEXTFIT_ALLLINES);
+ FASTBOOL bWdtGrow=bWdt && IsAutoGrowWidth();
+ FASTBOOL bHgtGrow=bHgt && IsAutoGrowHeight();
+ SdrTextAniKind eAniKind=GetTextAniKind();
+ SdrTextAniDirection eAniDir=GetTextAniDirection();
+ FASTBOOL bScroll=eAniKind==SDRTEXTANI_SCROLL || eAniKind==SDRTEXTANI_ALTERNATE || eAniKind==SDRTEXTANI_SLIDE;
+ FASTBOOL bHScroll=bScroll && (eAniDir==SDRTEXTANI_LEFT || eAniDir==SDRTEXTANI_RIGHT);
+ FASTBOOL bVScroll=bScroll && (eAniDir==SDRTEXTANI_UP || eAniDir==SDRTEXTANI_DOWN);
+ if (!bFitToSize && (bWdtGrow || bHgtGrow))
+ {
+ Rectangle aR0(rR);
+ long nHgt=0,nMinHgt=0,nMaxHgt=0;
+ long nWdt=0,nMinWdt=0,nMaxWdt=0;
+ Size aSiz(rR.GetSize()); aSiz.Width()--; aSiz.Height()--;
+ Size aMaxSiz(100000,100000);
+ Size aTmpSiz(pModel->GetMaxObjSize());
+ if (aTmpSiz.Width()!=0) aMaxSiz.Width()=aTmpSiz.Width();
+ if (aTmpSiz.Height()!=0) aMaxSiz.Height()=aTmpSiz.Height();
+ if (bWdtGrow)
+ {
+ nMinWdt=GetMinTextFrameWidth();
+ nMaxWdt=GetMaxTextFrameWidth();
+ if (nMaxWdt==0 || nMaxWdt>aMaxSiz.Width()) nMaxWdt=aMaxSiz.Width();
+ if (nMinWdt<=0) nMinWdt=1;
+ aSiz.Width()=nMaxWdt;
+ }
+ if (bHgtGrow)
+ {
+ nMinHgt=GetMinTextFrameHeight();
+ nMaxHgt=GetMaxTextFrameHeight();
+ if (nMaxHgt==0 || nMaxHgt>aMaxSiz.Height()) nMaxHgt=aMaxSiz.Height();
+ if (nMinHgt<=0) nMinHgt=1;
+ aSiz.Height()=nMaxHgt;
+ }
+ long nHDist=GetTextLeftDistance()+GetTextRightDistance();
+ long nVDist=GetTextUpperDistance()+GetTextLowerDistance();
+ aSiz.Width()-=nHDist;
+ aSiz.Height()-=nVDist;
+ if (aSiz.Width()<2) aSiz.Width()=2; // Mindestgroesse 2
+ if (aSiz.Height()<2) aSiz.Height()=2; // Mindestgroesse 2
+
+ // #101684#
+ BOOL bInEditMode = IsInEditMode();
+
+ if(!bInEditMode)
+ {
+ if (bHScroll) aSiz.Width()=0x0FFFFFFF; // Laufschrift nicht umbrechen
+ if (bVScroll) aSiz.Height()=0x0FFFFFFF;
+ }
+
+ if(pEdtOutl)
+ {
+ pEdtOutl->SetMaxAutoPaperSize(aSiz);
+ if (bWdtGrow) {
+ Size aSiz2(pEdtOutl->CalcTextSize());
+ nWdt=aSiz2.Width()+1; // lieber etwas Tolleranz
+ if (bHgtGrow) nHgt=aSiz2.Height()+1; // lieber etwas Tolleranz
+ } else {
+ nHgt=pEdtOutl->GetTextHeight()+1; // lieber etwas Tolleranz
+ }
+ } else {
+ Outliner& rOutliner=ImpGetDrawOutliner();
+ rOutliner.SetPaperSize(aSiz);
+ rOutliner.SetUpdateMode(TRUE);
+ // !!! hier sollte ich wohl auch noch mal die Optimierung mit
+ // bPortionInfoChecked usw einbauen
+ OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
+ if ( pOutlinerParaObject != NULL )
+ {
+ rOutliner.SetText(*pOutlinerParaObject);
+ rOutliner.SetFixedCellHeight(((const SdrTextFixedCellHeightItem&)GetMergedItem(SDRATTR_TEXT_USEFIXEDCELLHEIGHT)).GetValue());
+ }
+ if (bWdtGrow)
+ {
+ Size aSiz2(rOutliner.CalcTextSize());
+ nWdt=aSiz2.Width()+1; // lieber etwas Tolleranz
+ if (bHgtGrow) nHgt=aSiz2.Height()+1; // lieber etwas Tolleranz
+ } else {
+ nHgt=rOutliner.GetTextHeight()+1; // lieber etwas Tolleranz
+ }
+ rOutliner.Clear();
+ }
+ if (nWdt<nMinWdt) nWdt=nMinWdt;
+ if (nWdt>nMaxWdt) nWdt=nMaxWdt;
+ nWdt+=nHDist;
+ if (nWdt<1) nWdt=1; // nHDist kann auch negativ sein
+ if (nHgt<nMinHgt) nHgt=nMinHgt;
+ if (nHgt>nMaxHgt) nHgt=nMaxHgt;
+ nHgt+=nVDist;
+ if (nHgt<1) nHgt=1; // nVDist kann auch negativ sein
+ long nWdtGrow=nWdt-(rR.Right()-rR.Left());
+ long nHgtGrow=nHgt-(rR.Bottom()-rR.Top());
+ if (nWdtGrow==0) bWdtGrow=FALSE;
+ if (nHgtGrow==0) bHgtGrow=FALSE;
+ if (bWdtGrow || bHgtGrow) {
+ if (bWdtGrow) {
+ SdrTextHorzAdjust eHAdj=GetTextHorizontalAdjust();
+ if (eHAdj==SDRTEXTHORZADJUST_LEFT) rR.Right()+=nWdtGrow;
+ else if (eHAdj==SDRTEXTHORZADJUST_RIGHT) rR.Left()-=nWdtGrow;
+ else {
+ long nWdtGrow2=nWdtGrow/2;
+ rR.Left()-=nWdtGrow2;
+ rR.Right()=rR.Left()+nWdt;
+ }
+ }
+ if (bHgtGrow) {
+ SdrTextVertAdjust eVAdj=GetTextVerticalAdjust();
+ if (eVAdj==SDRTEXTVERTADJUST_TOP) rR.Bottom()+=nHgtGrow;
+ else if (eVAdj==SDRTEXTVERTADJUST_BOTTOM) rR.Top()-=nHgtGrow;
+ else {
+ long nHgtGrow2=nHgtGrow/2;
+ rR.Top()-=nHgtGrow2;
+ rR.Bottom()=rR.Top()+nHgt;
+ }
+ }
+ if (aGeo.nDrehWink!=0) {
+ Point aD1(rR.TopLeft());
+ aD1-=aR0.TopLeft();
+ Point aD2(aD1);
+ RotatePoint(aD2,Point(),aGeo.nSin,aGeo.nCos);
+ aD2-=aD1;
+ rR.Move(aD2.X(),aD2.Y());
+ }
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+FASTBOOL SdrTextObj::NbcAdjustTextFrameWidthAndHeight(FASTBOOL bHgt, FASTBOOL bWdt)
+{
+ FASTBOOL bRet=AdjustTextFrameWidthAndHeight(aRect,bHgt,bWdt);
+ if (bRet) {
+ SetRectsDirty();
+ if (HAS_BASE(SdrRectObj,this)) { // mal wieder 'nen Hack
+ ((SdrRectObj*)this)->SetXPolyDirty();
+ }
+ if (HAS_BASE(SdrCaptionObj,this)) { // mal wieder 'nen Hack
+ ((SdrCaptionObj*)this)->ImpRecalcTail();
+ }
+ }
+ return bRet;
+}
+
+FASTBOOL SdrTextObj::AdjustTextFrameWidthAndHeight(FASTBOOL bHgt, FASTBOOL bWdt)
+{
+ Rectangle aNeuRect(aRect);
+ FASTBOOL bRet=AdjustTextFrameWidthAndHeight(aNeuRect,bHgt,bWdt);
+ if (bRet) {
+ Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
+ // #110094#-14 SendRepaintBroadcast();
+ aRect=aNeuRect;
+ SetRectsDirty();
+ if (HAS_BASE(SdrRectObj,this)) { // mal wieder 'nen Hack
+ ((SdrRectObj*)this)->SetXPolyDirty();
+ }
+ if (HAS_BASE(SdrCaptionObj,this)) { // mal wieder 'nen Hack
+ ((SdrCaptionObj*)this)->ImpRecalcTail();
+ }
+ SetChanged();
+ BroadcastObjectChange();
+ SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
+ }
+ return bRet;
+}
+
+void SdrTextObj::ImpSetTextStyleSheetListeners()
+{
+ SfxStyleSheetBasePool* pStylePool=pModel!=NULL ? pModel->GetStyleSheetPool() : NULL;
+ if (pStylePool!=NULL)
+ {
+ Container aStyles(1024,64,64);
+ OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
+ if (pOutlinerParaObject!=NULL)
+ {
+ // Zunaechst werden alle im ParaObject enthaltenen StyleSheets
+ // im Container aStyles gesammelt. Dazu wird die Family jeweils
+ // ans Ende des StyleSheet-Namen drangehaengt.
+ const EditTextObject& rTextObj=pOutlinerParaObject->GetTextObject();
+ XubString aStyleName;
+ SfxStyleFamily eStyleFam;
+ USHORT nParaAnz=rTextObj.GetParagraphCount();
+
+ for(UINT16 nParaNum(0); nParaNum < nParaAnz; nParaNum++)
+ {
+ rTextObj.GetStyleSheet(nParaNum, aStyleName, eStyleFam);
+
+ if(aStyleName.Len())
+ {
+ XubString aFam = UniString::CreateFromInt32((UINT16)eStyleFam);
+ aFam.Expand(5);
+
+ aStyleName += sal_Unicode('|');
+ aStyleName += aFam;
+
+ BOOL bFnd(FALSE);
+ UINT32 nNum(aStyles.Count());
+
+ while(!bFnd && nNum > 0)
+ {
+ // kein StyleSheet doppelt!
+ nNum--;
+ bFnd = (aStyleName.Equals(*(XubString*)aStyles.GetObject(nNum)));
+ }
+
+ if(!bFnd)
+ {
+ aStyles.Insert(new XubString(aStyleName), CONTAINER_APPEND);
+ }
+ }
+ }
+ }
+
+ // nun die Strings im Container durch StyleSheet* ersetzten
+ ULONG nNum=aStyles.Count();
+ while (nNum>0) {
+ nNum--;
+ XubString* pName=(XubString*)aStyles.GetObject(nNum);
+
+ // UNICODE: String aFam(pName->Cut(pName->Len()-6));
+ String aFam = pName->Copy(0, pName->Len() - 6);
+
+ aFam.Erase(0,1);
+ aFam.EraseTrailingChars();
+
+ // UNICODE: USHORT nFam=USHORT(aFam);
+ UINT16 nFam = (UINT16)aFam.ToInt32();
+
+ SfxStyleFamily eFam=(SfxStyleFamily)nFam;
+ SfxStyleSheetBase* pStyleBase=pStylePool->Find(*pName,eFam);
+ SfxStyleSheet* pStyle=PTR_CAST(SfxStyleSheet,pStyleBase);
+ delete pName;
+ if (pStyle!=NULL && pStyle!=GetStyleSheet()) {
+ aStyles.Replace(pStyle,nNum);
+ } else {
+ aStyles.Remove(nNum);
+ }
+ }
+ // jetzt alle ueberfluessigen StyleSheets entfernen
+ nNum=GetBroadcasterCount();
+ while (nNum>0) {
+ nNum--;
+ SfxBroadcaster* pBroadcast=GetBroadcasterJOE((USHORT)nNum);
+ SfxStyleSheet* pStyle=PTR_CAST(SfxStyleSheet,pBroadcast);
+ if (pStyle!=NULL && pStyle!=GetStyleSheet()) { // Sonderbehandlung fuer den StyleSheet des Objekts
+ if (aStyles.GetPos(pStyle)==CONTAINER_ENTRY_NOTFOUND) {
+ EndListening(*pStyle);
+ }
+ }
+ }
+ // und schliesslich alle in aStyles enthaltenen StyleSheets mit den vorhandenen Broadcastern mergen
+ nNum=aStyles.Count();
+ while (nNum>0) {
+ nNum--;
+ SfxStyleSheet* pStyle=(SfxStyleSheet*)aStyles.GetObject(nNum);
+ // StartListening soll selbst nachsehen, ob hier nicht evtl. schon gehorcht wird
+ StartListening(*pStyle,TRUE);
+ }
+ }
+}
+
+void SdrTextObj::NbcResizeTextAttributes(const Fraction& xFact, const Fraction& yFact)
+{
+ OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
+ if (pOutlinerParaObject!=NULL && xFact.IsValid() && yFact.IsValid())
+ {
+ Fraction n100(100,1);
+ long nX=long(xFact*n100);
+ long nY=long(yFact*n100);
+ if (nX<0) nX=-nX;
+ if (nX<1) nX=1;
+ if (nX>0xFFFF) nX=0xFFFF;
+ if (nY<0) nY=-nY;
+ if (nY<1) nY=1;
+ if (nY>0xFFFF) nY=0xFFFF;
+ if (nX!=100 || nY!=100)
+ {
+ // Rahmenattribute
+ const SfxItemSet& rSet = GetObjectItemSet();
+ const SvxCharScaleWidthItem& rOldWdt=(SvxCharScaleWidthItem&)rSet.Get(EE_CHAR_FONTWIDTH);
+ const SvxFontHeightItem& rOldHgt=(SvxFontHeightItem&)rSet.Get(EE_CHAR_FONTHEIGHT);
+
+ // erstmal die alten Werte holen
+ long nRelWdt=rOldWdt.GetValue();
+ long nAbsHgt=rOldHgt.GetHeight();
+ long nRelHgt=rOldHgt.GetProp();
+
+ // Relative Breite aendern
+ nRelWdt*=nX;
+ nRelWdt/=nY;
+ if (nRelWdt<0) nRelWdt=-nRelWdt; // nicht negativ
+ if (nRelWdt<=0) nRelWdt=1; // und mind. 1%
+ if (nRelWdt>0xFFFF) nRelWdt=0xFFFF;
+
+ // Absolute Hoehe aendern
+ nAbsHgt*=nY;
+ nAbsHgt/=100;
+ if (nAbsHgt<0) nAbsHgt=-nAbsHgt; // nicht negativ
+ if (nAbsHgt<=0) nAbsHgt=1; // und mind. 1
+ if (nAbsHgt>0xFFFF) nAbsHgt=0xFFFF;
+
+ // und nun attributieren
+ SetObjectItem(SvxCharScaleWidthItem( (USHORT) nRelWdt, EE_CHAR_FONTWIDTH));
+ SetObjectItem(SvxFontHeightItem(nAbsHgt,(USHORT)nRelHgt, EE_CHAR_FONTHEIGHT));
+ // Zeichen- und Absatzattribute innerhalb des OutlinerParaObjects
+ Outliner& rOutliner=ImpGetDrawOutliner();
+ rOutliner.SetPaperSize(Size(LONG_MAX,LONG_MAX));
+ rOutliner.SetText(*pOutlinerParaObject);
+ rOutliner.DoStretchChars((USHORT)nX,(USHORT)nY);
+ OutlinerParaObject* pNewPara=rOutliner.CreateParaObject();
+ NbcSetOutlinerParaObject(pNewPara);
+ rOutliner.Clear();
+ }
+ }
+}
+
+/** #103836# iterates over the paragraphs of a given SdrObject and removes all
+ hard set character attributes with the which ids contained in the
+ given vector
+*/
+void SdrTextObj::RemoveOutlinerCharacterAttribs( const std::vector<sal_uInt16>& rCharWhichIds )
+{
+ sal_Int32 nText = getTextCount();
+
+ while( --nText >= 0 )
+ {
+ SdrText* pText = getText( nText );
+ OutlinerParaObject* pOutlinerParaObject = pText ? pText->GetOutlinerParaObject() : 0;
+
+ if(pOutlinerParaObject)
+ {
+ Outliner* pOutliner = 0;
+
+ if( pEdtOutl || (pText == getActiveText()) )
+ pOutliner = pEdtOutl;
+
+ if(!pOutliner)
+ {
+ pOutliner = &ImpGetDrawOutliner();
+ pOutliner->SetText(*pOutlinerParaObject);
+ }
+
+ ESelection aSelAll( 0, 0, 0xffff, 0xffff );
+ std::vector<sal_uInt16>::const_iterator aIter( rCharWhichIds.begin() );
+ while( aIter != rCharWhichIds.end() )
+ {
+ pOutliner->RemoveAttribs( aSelAll, false, (*aIter++) );
+ }
+
+ if(!pEdtOutl || (pText != getActiveText()) )
+ {
+ const sal_uInt32 nParaCount = pOutliner->GetParagraphCount();
+ OutlinerParaObject* pTemp = pOutliner->CreateParaObject(0, (sal_uInt16)nParaCount);
+ pOutliner->Clear();
+ NbcSetOutlinerParaObjectForText(pTemp, pText);
+ }
+ }
+ }
+}
+
+bool SdrTextObj::HasText() const
+{
+ if( pEdtOutl )
+ return HasEditText();
+
+ OutlinerParaObject* pOPO = GetOutlinerParaObject();
+
+ bool bHasText = false;
+ if( pOPO )
+ {
+ const EditTextObject& rETO = pOPO->GetTextObject();
+ USHORT nParaCount = rETO.GetParagraphCount();
+
+ if( nParaCount > 0 )
+ bHasText = (nParaCount > 1) || (rETO.GetText( 0 ).Len() != 0);
+ }
+
+ return bHasText;
+}