[Libreoffice-commits] core.git: Branch 'feature/gsoc14-draw-chained-text-boxes' - editeng/source include/editeng include/svx svx/source
matteocam
matteo.campanelli at gmail.com
Tue Jun 2 16:35:30 PDT 2015
editeng/source/outliner/outliner.cxx | 38 +++++++++++++++++++++++-----
include/editeng/outliner.hxx | 3 +-
include/editeng/overflowingtxt.hxx | 21 ++++++++++++++-
include/svx/svdotext.hxx | 3 --
svx/source/svdraw/svdotext.cxx | 5 +++
svx/source/svdraw/svdotextdecomposition.cxx | 30 +++++++++++++++++++---
svx/source/svdraw/svdotxed.cxx | 12 +++++++-
7 files changed, 96 insertions(+), 16 deletions(-)
New commits:
commit 598dc8b516d313da6a0b1d13d48139b7b041ae8f
Author: matteocam <matteo.campanelli at gmail.com>
Date: Tue Jun 2 19:34:22 2015 -0400
Added NonOverflowingText and logic to leave it in editing text
Change-Id: I2cf4ad519917c80c51f9f693f9e27d5e3e655ffc
diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx
index d289e78..9e3e8f6 100644
--- a/editeng/source/outliner/outliner.cxx
+++ b/editeng/source/outliner/outliner.cxx
@@ -2089,7 +2089,7 @@ bool Outliner::HasParaFlag( const Paragraph* pPara, sal_uInt16 nFlag ) const
return pPara && pPara->HasFlag( nFlag );
}
-OutlinerParaObject *Outliner::GetNonOverflowingParaObject() const
+NonOverflowingText *Outliner::GetNonOverflowingText() const
{
/* XXX:
* nCount should be the number of paragraphs of the non overflowing text
@@ -2101,7 +2101,8 @@ OutlinerParaObject *Outliner::GetNonOverflowingParaObject() const
// last non-overflowing paragraph is before the first overflowing one
sal_Int32 nCount = pEditEngine->GetOverflowingParaNum();
- //sal_Int32 nCount = 1;
+ sal_Int32 nOverflowLine = pEditEngine->GetOverflowingLineNum();
+ OUString aPreOverflowingTxt("");
// Defensive check: oveflowing para index beyond actual # of paragraphs?
if ( nCount > GetParagraphCount()-1) {
@@ -2112,19 +2113,44 @@ OutlinerParaObject *Outliner::GetNonOverflowingParaObject() const
return NULL;
}
- if ( nCount == 0 ) // Only overflowing text, i.e. 1st paragraph overflowing
+ // Only overflowing text, i.e. 1st line of 1st paragraph overflowing
+ if ( nCount == 0 && nOverflowLine == 0)
{
EditTextObject *pEmptyText = pEditEngine->GetEmptyTextObject();
OutlinerParaObject* pPObj = new OutlinerParaObject( *pEmptyText );
pPObj->SetOutlinerMode(GetMode());
delete pEmptyText;
- return pPObj;
+ return new NonOverflowingText(pPObj, "");
- } else if (nCount < 0) // No overflowing Text
+ } else if (nCount < 0) { // No overflowing Text: all para-s included
nCount = GetParagraphCount();
+ // aPreOverflowingText == ""
+ } else { // Get the lines that of the overflowing para fit in the box
- return CreateParaObject(0, nCount);
+ // XXX: Is there a proper method to join lines in a single string?
+ sal_Int32 nOverflowingPara = nCount;
+ OUString aWholeTxtHeadPara = GetText(GetParagraph(nOverflowingPara));
+ sal_uInt32 nLen = 0;
+
+ for ( sal_Int32 nLine = 0;
+ nLine < pEditEngine->GetOverflowingLineNum();
+ nLine++)
+ {
+ nLen += GetLineLen(nOverflowingPara, nLine);
+ }
+
+ // XXX: Any separator to be included?
+ aPreOverflowingTxt = aWholeTxtHeadPara.copy(0, nLen);
+ }
+
+ OutlinerParaObject *pHeadParas;
+ if (nCount == 0) // No text to save expect for the one in the overflowing para (i.e. aPreOverflowingTxt)
+ pHeadParas = NULL;
+ else
+ pHeadParas = CreateParaObject(0, nCount);
+
+ return new NonOverflowingText(pHeadParas, aPreOverflowingTxt);
}
OverflowingText *Outliner::GetOverflowingText() const
diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx
index c493a7c..7093835 100644
--- a/include/editeng/outliner.hxx
+++ b/include/editeng/outliner.hxx
@@ -45,6 +45,7 @@ class EditUndo;
class ParagraphList;
class OutlinerParaObject;
class OverflowingText;
+class NonOverflowingText;
class SvStream;
class SvxBulletItem;
class SvxFont;
@@ -759,7 +760,7 @@ public:
void SetParaRemovingHdl(const Link& rLink){aParaRemovingHdl=rLink;}
Link GetParaRemovingHdl() const { return aParaRemovingHdl; }
- OutlinerParaObject *GetNonOverflowingParaObject() const;
+ NonOverflowingText *GetNonOverflowingText() const;
OverflowingText *GetOverflowingText() const;
void ClearOverflowingParaNum();
diff --git a/include/editeng/overflowingtxt.hxx b/include/editeng/overflowingtxt.hxx
index 287d237..98aa612 100644
--- a/include/editeng/overflowingtxt.hxx
+++ b/include/editeng/overflowingtxt.hxx
@@ -34,14 +34,31 @@ class OverflowingText {
// Constructor
OverflowingText(
const OUString &headTxt,
- const OutlinerParaObject *pMidParas = NULL,
- const OUString &tailTxt = "")
+ const OutlinerParaObject *pMidParas,
+ const OUString &tailTxt)
: mHeadTxt(headTxt),
mpMidParas(pMidParas),
mTailTxt(tailTxt)
{ }
};
+class NonOverflowingText {
+ public:
+ const OutlinerParaObject *mpHeadParas;
+ OUString mPreOverflowingTxt;
+ // NOTE: mPreOverflowingTxt might be empty
+
+ // Constructor
+ NonOverflowingText(
+ const OutlinerParaObject *pHeadParas,
+ const OUString &preOverflowingTxt)
+ : mpHeadParas(pHeadParas),
+ mPreOverflowingTxt(preOverflowingTxt)
+ {
+ DBG_ASSERT( pHeadParas != NULL, "pHeadParas is null?!" );
+ }
+};
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/svx/svdotext.hxx b/include/svx/svdotext.hxx
index 9144af4..a93f087 100644
--- a/include/svx/svdotext.hxx
+++ b/include/svx/svdotext.hxx
@@ -606,12 +606,11 @@ public:
const drawinglayer::geometry::ViewInformation2D& aViewInformation) const;
void impMoveChainedTextToNextLink(SdrTextObj *pNextTextObj) const;
+ void impLeaveOnlyNonOverflowingText() const;
// Handler for Chained Text
DECL_LINK(ImpDecomposeChainedText,EditStatus*);
- void embedText() const;
-
// timing generators
void impGetBlinkTextTiming(drawinglayer::animation::AnimationEntryList& rAnimList) const;
void impGetScrollTextTiming(drawinglayer::animation::AnimationEntryList& rAnimList, double fFrameLength, double fTextLength) const;
diff --git a/svx/source/svdraw/svdotext.cxx b/svx/source/svdraw/svdotext.cxx
index 3d13ebb..302346d 100644
--- a/svx/source/svdraw/svdotext.cxx
+++ b/svx/source/svdraw/svdotext.cxx
@@ -48,6 +48,7 @@
#include <svx/xflclit.hxx>
#include <svl/style.hxx>
#include <editeng/editeng.hxx>
+#include <editeng/overflowingtxt.hxx>
#include <svl/itemiter.hxx>
#include <svx/sdr/properties/textproperties.hxx>
#include <vcl/metaact.hxx>
@@ -1966,6 +1967,10 @@ void SdrTextObj::onEditOutlinerStatusEvent( EditStatus* pEditStatus )
if ( pEditStatus->IsPageOverflow() ) {
mpOverflowingText = pEdtOutl->GetOverflowingText();
SdrTextObj *pNextTextObj = GetNextLinkInChain();
+
+ impLeaveOnlyNonOverflowingText();
+
+ // Transfer overflowing text
impMoveChainedTextToNextLink(pNextTextObj);
}
diff --git a/svx/source/svdraw/svdotextdecomposition.cxx b/svx/source/svdraw/svdotextdecomposition.cxx
index 0d57eff..e60cbb8 100644
--- a/svx/source/svdraw/svdotextdecomposition.cxx
+++ b/svx/source/svdraw/svdotextdecomposition.cxx
@@ -728,13 +728,37 @@ void SdrTextObj::impDecomposeContourTextPrimitive(
rTarget = aConverter.getPrimitive2DSequence();
}
-void SdrTextObj::embedText() const
+void SdrTextObj::impLeaveOnlyNonOverflowingText() const
{
+ // Cut non overflowing text // FIXME: Move this in separate function
+ NonOverflowingText *pNonOverflowingTxt =
+ pEdtOutl->GetNonOverflowingText();
+ SdrOutliner &rOutliner = ImpGetDrawOutliner();
+ rOutliner.Clear();
+
+ if (pNonOverflowingTxt->mPreOverflowingTxt == "" &&
+ pNonOverflowingTxt->mpHeadParas != NULL) {
+ // Only (possibly empty) paragraphs before overflowing one
+ rOutliner.SetText(*pNonOverflowingTxt->mpHeadParas);
+ } else { // We have to include the non-overflowing lines from the overfl. para
+
+ // first make a ParaObject for the strings
+ Paragraph *pTmpPara0 = rOutliner.GetParagraph(0);
+ rOutliner.SetText(pNonOverflowingTxt->mPreOverflowingTxt, pTmpPara0);
+ OutlinerParaObject *pPObj = rOutliner.CreateParaObject();
+ rOutliner.Clear();
+ if (pNonOverflowingTxt->mpHeadParas != NULL)
+ rOutliner.SetText(*pNonOverflowingTxt->mpHeadParas);
+
+ rOutliner.AddText(*pPObj);
+ }
+
+ OutlinerParaObject *pNewText = rOutliner.CreateParaObject();
+ const_cast<SdrTextObj*>(this)->NbcSetOutlinerParaObject(pNewText);
}
-// A new temporary implementation of impMoveChainedTextToNextLink
-// Should implement the whole logic
+
void SdrTextObj::impMoveChainedTextToNextLink(SdrTextObj *pNextTextObj) const
{
// prevent copying text in same box
diff --git a/svx/source/svdraw/svdotxed.cxx b/svx/source/svdraw/svdotxed.cxx
index 1bebccf..c0a5164 100644
--- a/svx/source/svdraw/svdotxed.cxx
+++ b/svx/source/svdraw/svdotxed.cxx
@@ -24,6 +24,7 @@
#include <editeng/editdata.hxx>
#include <editeng/outliner.hxx>
#include <editeng/editstat.hxx>
+#include <editeng/overflowingtxt.hxx>
#include <svl/itemset.hxx>
#include <editeng/eeitem.hxx>
#include <svx/sdtfchim.hxx>
@@ -275,12 +276,19 @@ void SdrTextObj::EndTextEdit(SdrOutliner& rOutl)
// TODO: move this to one level higher
if ( IsToBeChained() && GetNextLinkInChain() != this) // XXX: defensive check
{
+ // FIXME: matteocam
+ // for now doing the same as below - probably we don't need
+ // any more chain checks here but one single default behavior
+ sal_Int32 nParaAnz = rOutl.GetParagraphCount();
+ pNewText = rOutl.CreateParaObject( 0, nParaAnz );
+
// set non overflow part of text to current box
- pNewText = rOutl.GetNonOverflowingParaObject(); // empty text obj. if 1st para is overflowing
+
+ // XXX XXX XXX XXX: decomment next line and fix const conversion problem
+ //pNewText = rOutl.GetNonOverflowingText()->mpHeadParas; // empty text obj. if 1st para is overflowing
// set overflowing text for SdrChainedTextPrimitive2D
mpOverflowingText = rOutl.GetOverflowingText();
// TODO: factor the lines of code above in a single function
-
}
else // standard case
{
More information about the Libreoffice-commits
mailing list