[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
Mon Jun 1 16:21:06 PDT 2015
editeng/source/editeng/editeng.cxx | 5 +
editeng/source/outliner/outliner.cxx | 78 +++++++++++++----------
include/editeng/editeng.hxx | 1
include/editeng/outliner.hxx | 3
include/svx/svdotext.hxx | 6 -
svx/source/svdraw/svdotext.cxx | 4 -
svx/source/svdraw/svdotextdecomposition.cxx | 94 ++++------------------------
svx/source/svdraw/svdotxed.cxx | 2
8 files changed, 71 insertions(+), 122 deletions(-)
New commits:
commit fed813654b69ca34e6890ff85799af844206af95
Author: matteocam <matteo.campanelli at gmail.com>
Date: Mon Jun 1 19:20:05 2015 -0400
Making right overflowing line flow in dest box. Currently crashing
Change-Id: Idfae9fa4f606b4f1314fd0eba0e509d3840aba95
diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx
index 6193b98..a86e088 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -59,7 +59,6 @@
#include <editeng/emphasismarkitem.hxx>
#include <editeng/charscaleitem.hxx>
#include <editeng/charreliefitem.hxx>
-#include <editeng/overflowingtxt.hxx>
#include <sot/exchange.hxx>
#include <sot/formats.hxx>
@@ -2787,6 +2786,10 @@ sal_Int32 EditEngine::GetOverflowingParaNum() const {
return pImpEditEngine->GetOverflowingParaNum();
}
+sal_Int32 EditEngine::GetOverflowingLineNum() const {
+ return pImpEditEngine->GetOverflowingLineNum();
+}
+
void EditEngine::ClearOverflowingParaNum() {
pImpEditEngine->ClearOverflowingParaNum();
}
diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx
index 909e821..a6b3a83 100644
--- a/editeng/source/outliner/outliner.cxx
+++ b/editeng/source/outliner/outliner.cxx
@@ -2099,7 +2099,6 @@ OutlinerParaObject *Outliner::GetNonOverflowingParaObject() const
if ( GetParagraphCount() < 1 )
return NULL;
- sal_Int32 nStartPara = 0;
// last non-overflowing paragraph is before the first overflowing one
sal_Int32 nCount = pEditEngine->GetOverflowingParaNum();
//sal_Int32 nCount = 1;
@@ -2125,48 +2124,59 @@ OutlinerParaObject *Outliner::GetNonOverflowingParaObject() const
} else if (nCount < 0) // No overflowing Text
nCount = GetParagraphCount();
- // code inspired from Outliner::CreateParaObject
+ return CreateParaObject(0, nCount);
+}
- // we need a paragraph data vector and the actual text
- ParagraphDataVector aParagraphDataVector(nCount);
- const sal_Int32 nLastPara(nStartPara + nCount - 1);
+OverflowingText *Outliner::GetOverflowingText() const
+{
+ if ( pEditEngine->GetOverflowingParaNum() < 0)
+ return NULL;
- for(sal_Int32 nPara(nStartPara); nPara <= nLastPara; nPara++)
- {
- aParagraphDataVector[nPara-nStartPara] = *GetParagraph(nPara);
+
+ // Defensive check: oveflowing para index beyond actual # of paragraphs?
+ if ( pEditEngine->GetOverflowingParaNum() > GetParagraphCount()-1) {
+ fprintf(stderr,
+ "[Overflowing] Ops, trying to retrieve para %d when max index is %d\n",
+ pEditEngine->GetOverflowingParaNum(),
+ GetParagraphCount()-1);
+ return NULL;
}
- EditTextObject* pText = pEditEngine->CreateTextObject( nStartPara, nCount );
- const bool bIsEditDoc(OUTLINERMODE_TEXTOBJECT == ImplGetOutlinerMode());
+ OUString aHeadTxt, aTailTxt("");
+ OutlinerParaObject *pMidParas = NULL;
- OutlinerParaObject* pPObj = new OutlinerParaObject(*pText, aParagraphDataVector, bIsEditDoc);
- pPObj->SetOutlinerMode(GetMode());
- delete pText;
- return pPObj;
-}
-OutlinerParaObject *Outliner::GetOverflowingParaObject() const
-{
- if ( pEditEngine->GetOverflowingParaNum() >= 0) {
- // Defensive check: oveflowing para index beyond actual # of paragraphs?
- if ( pEditEngine->GetOverflowingParaNum() > GetParagraphCount()-1) {
- fprintf(stderr,
- "[Overflowing] Ops, trying to retrieve para %d when max index is %d\n",
- pEditEngine->GetOverflowingParaNum(),
- GetParagraphCount()-1);
- return NULL;
+ sal_uInt32 nHeadPara = pEditEngine->GetOverflowingParaNum();
+ sal_uInt32 nParaCount = GetParagraphCount();
+ sal_uInt32 nTailPara = nParaCount-1;
+ sal_uInt32 nMidParas = nTailPara-nHeadPara-1;
+
+ // Set the head text
+ // XXX: Is there a proper method to join lines in a single string?
+ OUString aWholeTxtHeadPara = GetText(GetParagraph(nHeadPara));
+ sal_uInt32 nLen = 0;
+ for ( sal_Int32 nLine = 0;
+ nLine < pEditEngine->GetOverflowingLineNum();
+ nLine++) {
+ nLen += GetLineLen(nHeadPara, nLine);
}
- return CreateParaObject( pEditEngine->GetOverflowingParaNum() );
+ // XXX: Any separator to be included?
+ aHeadTxt = aWholeTxtHeadPara.copy(nLen);
+
+
+ // If there is at least one more paragraph overflowing
+ if (nTailPara > nHeadPara) {
+ // Get text of last paragraph
+ aTailTxt = GetText(GetParagraph(nTailPara));
}
- return NULL;
- /*
- // XXX: returns second paragraph if there is one, first otherwise
- if ( GetParagraphCount() >= 2 )
- return CreateParaObject(1, 1);
- else
- return CreateParaObject(0, 1);
- */
+ if (nMidParas > 0) {
+ // Get everything between first and last overflowing para
+ pMidParas = CreateParaObject(nHeadPara+1, nMidParas);
+ }
+
+ // XXX: Who deletes this?
+ return new OverflowingText(aHeadTxt, pMidParas, aTailTxt);
}
void Outliner::ClearOverflowingParaNum()
diff --git a/include/editeng/editeng.hxx b/include/editeng/editeng.hxx
index dda4e29..08c6522 100644
--- a/include/editeng/editeng.hxx
+++ b/include/editeng/editeng.hxx
@@ -599,6 +599,7 @@ public:
bool Redo(EditView* pView);
sal_Int32 GetOverflowingParaNum() const;
+ sal_Int32 GetOverflowingLineNum() const;
void ClearOverflowingParaNum();
};
diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx
index 8889adf..c493a7c 100644
--- a/include/editeng/outliner.hxx
+++ b/include/editeng/outliner.hxx
@@ -44,6 +44,7 @@ class EditView;
class EditUndo;
class ParagraphList;
class OutlinerParaObject;
+class OverflowingText;
class SvStream;
class SvxBulletItem;
class SvxFont;
@@ -759,7 +760,7 @@ public:
Link GetParaRemovingHdl() const { return aParaRemovingHdl; }
OutlinerParaObject *GetNonOverflowingParaObject() const;
- OutlinerParaObject *GetOverflowingParaObject() const;
+ OverflowingText *GetOverflowingText() const;
void ClearOverflowingParaNum();
virtual void DepthChangedHdl();
diff --git a/include/svx/svdotext.hxx b/include/svx/svdotext.hxx
index 1e50a68..9144af4 100644
--- a/include/svx/svdotext.hxx
+++ b/include/svx/svdotext.hxx
@@ -38,6 +38,7 @@
class OutlinerParaObject;
+class OverflowingText;
class SdrOutliner;
class SdrTextObj;
class SvxFieldItem;
@@ -215,7 +216,7 @@ public:
void SetTextEditOffset(const Point& rNew) { maTextEditOffset = rNew; }
// FIXME(matteocam) // XXX: move as protected
- OutlinerParaObject *mpOverflowingText = NULL;
+ OverflowingText *mpOverflowingText = NULL;
protected:
@@ -604,8 +605,7 @@ public:
const drawinglayer::primitive2d::SdrChainedTextPrimitive2D& rSdrChainedTextPrimitive,
const drawinglayer::geometry::ViewInformation2D& aViewInformation) const;
- void impCopyTextInTextObj(SdrTextObj *pNextTextObj) const;
- void impCopyTextInTextObj2(SdrTextObj *pNextTextObj) const;
+ void impMoveChainedTextToNextLink(SdrTextObj *pNextTextObj) const;
// Handler for Chained Text
DECL_LINK(ImpDecomposeChainedText,EditStatus*);
diff --git a/svx/source/svdraw/svdotext.cxx b/svx/source/svdraw/svdotext.cxx
index c0b59e8..3d13ebb 100644
--- a/svx/source/svdraw/svdotext.cxx
+++ b/svx/source/svdraw/svdotext.cxx
@@ -1964,9 +1964,9 @@ void SdrTextObj::onEditOutlinerStatusEvent( EditStatus* pEditStatus )
// Pushes text in next link on the fly
if ( pEditStatus->IsPageOverflow() ) {
- mpOverflowingText = pEdtOutl->GetOverflowingParaObject();
+ mpOverflowingText = pEdtOutl->GetOverflowingText();
SdrTextObj *pNextTextObj = GetNextLinkInChain();
- impCopyTextInTextObj2(pNextTextObj);
+ impMoveChainedTextToNextLink(pNextTextObj);
}
}
diff --git a/svx/source/svdraw/svdotextdecomposition.cxx b/svx/source/svdraw/svdotextdecomposition.cxx
index 30f1fcc..0d57eff 100644
--- a/svx/source/svdraw/svdotextdecomposition.cxx
+++ b/svx/source/svdraw/svdotextdecomposition.cxx
@@ -733,9 +733,9 @@ void SdrTextObj::embedText() const
}
-// A new temporary implementation of impCopyTextInTextObj
+// A new temporary implementation of impMoveChainedTextToNextLink
// Should implement the whole logic
-void SdrTextObj::impCopyTextInTextObj2(SdrTextObj *pNextTextObj) const
+void SdrTextObj::impMoveChainedTextToNextLink(SdrTextObj *pNextTextObj) const
{
// prevent copying text in same box
if ( this == pNextTextObj )
@@ -745,10 +745,7 @@ void SdrTextObj::impCopyTextInTextObj2(SdrTextObj *pNextTextObj) const
rOutliner.SetStatusEventHdl1(LINK(this,SdrTextObj,ImpDecomposeChainedText));
- OverflowingText aOverflowingTxt =
- OverflowingText("headTxt (On its own)", NULL, "I'm Appended to #");
-
- if (mpOverflowingText) {
+ if (mpOverflowingText != NULL) {
// XXX: Not sure if necessary
rOutliner.Clear();
@@ -762,8 +759,9 @@ void SdrTextObj::impCopyTextInTextObj2(SdrTextObj *pNextTextObj) const
aOldPara0Txt = rOutliner.GetText(pOldPara0);
// Get other paras of destination box (from second on)
- OutlinerParaObject *pOldParasTail =
- rOutliner.CreateParaObject(1);
+ OutlinerParaObject *pOldParasTail = NULL;
+ if (rOutliner.GetParagraphCount() > 1)
+ pOldParasTail = rOutliner.CreateParaObject(1);
// Create ParaObject appending old first para in the dest. box
// to last part of overflowing text
@@ -774,7 +772,7 @@ void SdrTextObj::impCopyTextInTextObj2(SdrTextObj *pNextTextObj) const
rOutliner.Clear();
pTmpPara0 = rOutliner.GetParagraph(0);
- rOutliner.SetText(aOverflowingTxt.mTailTxt + aOldPara0Txt, pTmpPara0);
+ rOutliner.SetText(mpOverflowingText->mTailTxt + aOldPara0Txt, pTmpPara0);
pJoiningPara = rOutliner.CreateParaObject();
}
@@ -783,11 +781,11 @@ void SdrTextObj::impCopyTextInTextObj2(SdrTextObj *pNextTextObj) const
// Set headText at the beginning of box
Paragraph *pNewPara0 = rOutliner.GetParagraph(0);
- rOutliner.SetText(aOverflowingTxt.mHeadTxt, pNewPara0);
+ rOutliner.SetText(mpOverflowingText->mHeadTxt, pNewPara0);
// Set all the intermediate Paras
- if (aOverflowingTxt.mpMidParas)
- rOutliner.AddText(*aOverflowingTxt.mpMidParas);
+ if (mpOverflowingText->mpMidParas)
+ rOutliner.AddText(*mpOverflowingText->mpMidParas);
// Append old first para in the destination box to
// last part of overflowing text
@@ -803,70 +801,6 @@ void SdrTextObj::impCopyTextInTextObj2(SdrTextObj *pNextTextObj) const
pNextTextObj->NbcSetOutlinerParaObject(pNewText);
}
-}
-
-
-void SdrTextObj::impCopyTextInTextObj(SdrTextObj *pNextTextObj) const
-{
- // prevent copying text in same box
- if ( this == pNextTextObj )
- return;
-
- SdrOutliner &rOutliner = ImpGetDrawOutliner();
-
- /*
- // Code inspired by SvxOutlinerForwarder::AppendTextPortion
- sal_Int32 nLen = 0;
-
- EditEngine& rEditEngine = const_cast< EditEngine& >( rOutliner.GetEditEngine() );
- sal_Int32 nParaCount = rEditEngine.GetParagraphCount();
- DBG_ASSERT( 0 <= nPara && nPara < nParaCount, "paragraph index out of bounds" );
- if (0 <= nPara && nPara < nParaCount)
- {
- nLen = rEditEngine.GetTextLen( nPara );
- rEditEngine.QuickInsertText( rText, ESelection( nPara, nLen, nPara, nLen ) );
- }
- * */
-
- rOutliner.SetStatusEventHdl1(LINK(this,SdrTextObj,ImpDecomposeChainedText));
-
- // Push text through the chain if there's any
-
- // append a string in front of everything
- // NOTE: Trying with set-text first
-
- if (mpOverflowingText) {
-
- /* Desired behavior:
- * - take first overflowing word and paragraph from there
- * - Outliner::GetOverflowingPara should return the second overflowing para
- * - then these two should pasted together (as below?)
- */
-
- /*
- * The goal is to have UpdateOverflowingParaNum be finer grained and
- * work at level of lines instead of para-s
- */
-
- // Set new text first
- rOutliner.SetText(*mpOverflowingText);
-
- /*
- * We merge new text in front of the first paragraph
- * so we get a pointer to it and its text.
- */
- Paragraph *pFstPara = rOutliner.GetParagraph(0);
- OUString aTxtFstPara = rOutliner.GetText(pFstPara);
-
- //
- rOutliner.SetText("X" + aTxtFstPara, pFstPara);
- // gets the whole thing
- OutlinerParaObject *pNewText = rOutliner.CreateParaObject();
- // draws everything - result = "X" ++ overflowingText
- pNextTextObj->NbcSetOutlinerParaObject(pNewText);
- }
-
-
rOutliner.SetStatusEventHdl1(Link());
}
@@ -1573,21 +1507,21 @@ void SdrTextObj::impDecomposeChainedTextPrimitive(
/* fprintf(stderr, "Object #0 = %p, Object #1 = %p\n",
pPage->GetObj(0), pPage->GetObj(1)); */
- //impCopyTextInTextObj(pNextTextObj); // just do it
+ //impMoveChainedTextToNextLink(pNextTextObj); // just do it
// put overflowing text in next text box
if (mpOverflowingText != NULL) {
SdrTextObj *pNextTextObj = GetNextLinkInChain();
assert (pNextTextObj);
// NOTE: Commented because we do not need to do this anymore (maybe and for now)
- //impCopyTextInTextObj(pNextTextObj); // XXX: it actually moves the overflowing text currently
+ //impMoveChainedTextToNextLink(pNextTextObj); // XXX: it actually moves the overflowing text currently
// Chaining occurred. Let's reset the status
const_cast<SdrTextObj*>(this)->SetToBeChained( false );
- //pNextTextObj->SetOutlinerParaObject( mpOverflowingText );
+
//SdrOutliner rOutl = pNextTextObj->ImpGetDrawOutliner();
//pNextTextObj->BegTextEdit( rOutl );
- // XXX: Also, will all those calls currently in impCopyTextInTextObj be necessary too?
+ // XXX: Also, will all those calls currently in impMoveChainedTextToNextLink be necessary too?
}
drawinglayer::primitive2d::Primitive2DSequence aRetval(0);
diff --git a/svx/source/svdraw/svdotxed.cxx b/svx/source/svdraw/svdotxed.cxx
index 1471711..1bebccf 100644
--- a/svx/source/svdraw/svdotxed.cxx
+++ b/svx/source/svdraw/svdotxed.cxx
@@ -278,7 +278,7 @@ void SdrTextObj::EndTextEdit(SdrOutliner& rOutl)
// set non overflow part of text to current box
pNewText = rOutl.GetNonOverflowingParaObject(); // empty text obj. if 1st para is overflowing
// set overflowing text for SdrChainedTextPrimitive2D
- mpOverflowingText = rOutl.GetOverflowingParaObject();
+ mpOverflowingText = rOutl.GetOverflowingText();
// TODO: factor the lines of code above in a single function
}
More information about the Libreoffice-commits
mailing list