summaryrefslogtreecommitdiff
path: root/starmath
diff options
context:
space:
mode:
authordante <dante19031999@gmail.com>2021-03-14 19:11:58 +0100
committerNoel Grandin <noel.grandin@collabora.co.uk>2021-03-18 09:48:25 +0100
commitb3b1936ecdf5396892849d0e90d94324fad609ac (patch)
treeacbe9bdafb33cce48e3fb966ae08e12756ae2e7c /starmath
parentc9e5640c8fcad7beb42a66f9bee0252eee9fe323 (diff)
Use ESelection to locate code on node instead of SmToken
Will allow to use different input sources besides starmath code. Also, for adopting mathml standar the purpose is to make smnodes separate from the starmath code. Change-Id: Iefab5943cf59a8d2e31f5d59406c253fbe680ead Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112477 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'starmath')
-rw-r--r--starmath/inc/edit.hxx1
-rw-r--r--starmath/inc/node.hxx23
-rw-r--r--starmath/inc/parse5.hxx1
-rw-r--r--starmath/inc/token.hxx18
-rw-r--r--starmath/source/edit.cxx2
-rw-r--r--starmath/source/node.cxx4
-rw-r--r--starmath/source/parse5.cxx98
-rw-r--r--starmath/source/view.cxx9
-rw-r--r--starmath/source/visitors.cxx27
9 files changed, 132 insertions, 51 deletions
diff --git a/starmath/inc/edit.hxx b/starmath/inc/edit.hxx
index 78ab94bbd702..279c06867dc2 100644
--- a/starmath/inc/edit.hxx
+++ b/starmath/inc/edit.hxx
@@ -22,7 +22,6 @@
#include <vcl/window.hxx>
#include <vcl/idle.hxx>
#include <vcl/transfer.hxx>
-#include <editeng/editdata.hxx>
class SmDocShell;
class SmViewShell;
diff --git a/starmath/inc/node.hxx b/starmath/inc/node.hxx
index acbedccc7c2a..7014f7c2363f 100644
--- a/starmath/inc/node.hxx
+++ b/starmath/inc/node.hxx
@@ -67,6 +67,8 @@
#include "format.hxx"
#include "nodetype.hxx"
+#include <editeng/editdata.hxx>
+
enum class FontAttribute {
None = 0x0000,
Bold = 0x0001,
@@ -120,9 +122,12 @@ enum class SmScaleMode
class SmNode : public SmRect
{
-
+ // Rendering info for SmRect
SmFace maFace;
+ // Anclage to the code
SmToken maNodeToken;
+ ESelection m_aESelection;
+ // Node information
SmNodeType meType;
SmScaleMode meScaleMode;
RectHorAlign meRectHorAlign;
@@ -340,14 +345,14 @@ public:
* It is used to do the visual <-> text correspondence.
* @return line
*/
- sal_uInt16 GetRow() const { return sal::static_int_cast<sal_uInt16>(maNodeToken.nRow); }
+ sal_uInt16 GetRow() const { return sal::static_int_cast<sal_uInt16>(m_aESelection.nStartPara); }
/**
* Gets the column of the line in the text where the node is located.
* It is used to do the visual <-> text correspondence.
* @return column
*/
- sal_uInt16 GetColumn() const { return sal::static_int_cast<sal_uInt16>(maNodeToken.nCol); }
+ sal_uInt16 GetColumn() const { return sal::static_int_cast<sal_uInt16>(m_aESelection.nStartPos); }
/**
* Gets the scale mode.
@@ -382,6 +387,18 @@ public:
SmToken & GetToken() { return maNodeToken; }
/**
+ * Gets node position in input text.
+ * @return node position in input text
+ */
+ ESelection GetSelection() const { return m_aESelection; }
+
+ /**
+ * Gets node position in input text.
+ * @param aESelection
+ */
+ void SetSelection(ESelection aESelection) { m_aESelection = aESelection; }
+
+ /**
* Finds the node from the position in the text.
* It is used to do the visual <-> text correspondence.
* @param nRow
diff --git a/starmath/inc/parse5.hxx b/starmath/inc/parse5.hxx
index 1d312351fb36..bfc09a139e5a 100644
--- a/starmath/inc/parse5.hxx
+++ b/starmath/inc/parse5.hxx
@@ -29,6 +29,7 @@ class SmParser5 : public AbstractSmParser
{
OUString m_aBufferString;
SmToken m_aCurToken;
+ ESelection m_aCurESelection;
std::vector<SmErrorDesc> m_aErrDescList;
int m_nCurError;
sal_Int32 m_nBufferIndex, m_nTokenIndex;
diff --git a/starmath/inc/token.hxx b/starmath/inc/token.hxx
index 8555d745fc72..e38b3e5afb5a 100644
--- a/starmath/inc/token.hxx
+++ b/starmath/inc/token.hxx
@@ -223,17 +223,11 @@ struct SmToken
TG nGroup;
sal_uInt16 nLevel;
- // token position
- sal_Int32 nRow; // 1-based
- sal_Int32 nCol; // 1-based
-
SmToken()
: eType(TUNKNOWN)
, cMathChar('\0')
, nGroup(TG::NONE)
, nLevel(0)
- , nRow(0)
- , nCol(0)
{
}
@@ -244,8 +238,6 @@ struct SmToken
, cMathChar(cMath)
, nGroup(nTokenGroup)
, nLevel(nTokenLevel)
- , nRow(0)
- , nCol(0)
{
}
@@ -256,8 +248,6 @@ struct SmToken
cMathChar = OUString(&aTokenTableEntry.cMathChar, 1);
nGroup = aTokenTableEntry.nGroup;
nLevel = aTokenTableEntry.nLevel;
- nRow = 0;
- nCol = 0;
}
void operator=(const SmTokenTableEntry* aTokenTableEntry)
@@ -267,8 +257,6 @@ struct SmToken
cMathChar = OUString(&aTokenTableEntry->cMathChar, 1);
nGroup = aTokenTableEntry->nGroup;
nLevel = aTokenTableEntry->nLevel;
- nRow = 0;
- nCol = 0;
}
void operator=(const SmColorTokenTableEntry& aTokenTableEntry)
@@ -278,8 +266,6 @@ struct SmToken
cMathChar = OUString::number(static_cast<sal_uInt32>(aTokenTableEntry.cColor), 16);
nGroup = TG::Color;
nLevel = 0;
- nRow = 0;
- nCol = 0;
}
void operator=(const SmColorTokenTableEntry* aTokenTableEntry)
@@ -289,8 +275,6 @@ struct SmToken
cMathChar = OUString::number(static_cast<sal_uInt32>(aTokenTableEntry->cColor), 16);
nGroup = TG::Color;
nLevel = 0;
- nRow = 0;
- nCol = 0;
}
void operator=(const std::unique_ptr<SmColorTokenTableEntry>& aTokenTableEntry)
@@ -300,8 +284,6 @@ struct SmToken
cMathChar = OUString::number(static_cast<sal_uInt32>(aTokenTableEntry->cColor), 16);
nGroup = TG::Color;
nLevel = 0;
- nRow = 0;
- nCol = 0;
}
void setChar(sal_Unicode cChar) { cMathChar = OUString(&cChar, 1); }
diff --git a/starmath/source/edit.cxx b/starmath/source/edit.cxx
index 27d33f889dfb..fb9cee21447e 100644
--- a/starmath/source/edit.cxx
+++ b/starmath/source/edit.cxx
@@ -276,8 +276,6 @@ IMPL_LINK_NOARG(SmEditWindow, CursorMoveTimerHdl, Timer *, void)
sal_Int32 nRow;
sal_uInt16 nCol;
SmGetLeftSelectionPart(aNewSelection, nRow, nCol);
- nRow++;
- nCol++;
pView->GetGraphicWindow().SetCursorPos(static_cast<sal_uInt16>(nRow), nCol);
aOldSelection = aNewSelection;
}
diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx
index 922786adf9fd..4a20216a3771 100644
--- a/starmath/source/node.cxx
+++ b/starmath/source/node.cxx
@@ -252,8 +252,8 @@ const SmNode * SmNode::FindTokenAt(sal_uInt16 nRow, sal_uInt16 nCol) const
//! (there should be exactly one such node if any)
{
if ( IsVisible()
- && nRow == GetToken().nRow
- && nCol >= GetToken().nCol && nCol < GetToken().nCol + GetToken().aText.getLength())
+ && nRow == GetSelection().nStartPara
+ && nCol >= GetSelection().nStartPos && nCol <= GetSelection().nEndPos )
return this;
else
{
diff --git a/starmath/source/parse5.cxx b/starmath/source/parse5.cxx
index afafdd3b21c1..23ffb17d19d3 100644
--- a/starmath/source/parse5.cxx
+++ b/starmath/source/parse5.cxx
@@ -435,9 +435,7 @@ void SmParser5::NextToken() //Central part of the parser
// set index of current token
m_nTokenIndex = m_nBufferIndex;
-
- m_aCurToken.nRow = m_nRow;
- m_aCurToken.nCol = nRealStart - m_nColOff + 1;
+ sal_uInt32 nCol = nRealStart - m_nColOff;
bool bHandled = true;
if (nRealStart >= nBufLen)
@@ -475,8 +473,7 @@ void SmParser5::NextToken() //Central part of the parser
m_aCurToken.nGroup = TG::NONE;
m_aCurToken.nLevel = 5;
m_aCurToken.aText = aRes.DequotedNameOrString;
- m_aCurToken.nRow = m_nRow;
- m_aCurToken.nCol = nRealStart - m_nColOff + 2;
+ nCol++;
}
else if (aRes.TokenType & KParseType::IDENTNAME)
{
@@ -652,8 +649,6 @@ void SmParser5::NextToken() //Central part of the parser
m_aCurToken.nGroup = TG::NONE;
m_aCurToken.nLevel = 5;
m_aCurToken.aText = "%";
- m_aCurToken.nRow = m_nRow;
- m_aCurToken.nCol = nTmpStart - m_nColOff;
if (aTmpRes.TokenType & KParseType::IDENTNAME)
{
@@ -937,6 +932,7 @@ void SmParser5::NextToken() //Central part of the parser
aRes.EndPos = nRealStart + nOffset;
}
+ m_aCurESelection = ESelection(m_nRow, nCol, m_nRow, nCol + m_aCurToken.aText.getLength());
if (TEND != m_aCurToken.eType)
m_nBufferIndex = aRes.EndPos;
@@ -982,8 +978,8 @@ void SmParser5::NextTokenColor(SmTokenType dvipload)
// set index of current token
m_nTokenIndex = m_nBufferIndex;
- m_aCurToken.nRow = m_nRow;
- m_aCurToken.nCol = nRealStart - m_nColOff + 1;
+ sal_uInt32 nCol = nRealStart - m_nColOff;
+
if (nRealStart >= nBufLen)
m_aCurToken.eType = TEND;
else if (aRes.TokenType & KParseType::IDENTNAME)
@@ -1017,6 +1013,8 @@ void SmParser5::NextTokenColor(SmTokenType dvipload)
}
else
m_aCurToken.eType = TNONE;
+
+ m_aCurESelection = ESelection(m_nRow, nCol, m_nRow, nCol + m_aCurToken.aText.getLength());
if (TEND != m_aCurToken.eType)
m_nBufferIndex = aRes.EndPos;
}
@@ -1070,8 +1068,8 @@ void SmParser5::NextTokenFontSize()
// set index of current token
m_nTokenIndex = m_nBufferIndex;
- m_aCurToken.nRow = m_nRow;
- m_aCurToken.nCol = nRealStart - m_nColOff + 1;
+ sal_uInt32 nCol = nRealStart - m_nColOff;
+
if (nRealStart >= nBufLen)
m_aCurToken.eType = TEND;
else if (aRes.TokenType & KParseType::ONE_SINGLE_CHAR)
@@ -1129,6 +1127,8 @@ void SmParser5::NextTokenFontSize()
}
else
m_aCurToken.eType = TNONE;
+
+ m_aCurESelection = ESelection(m_nRow, nCol, m_nRow, nCol + m_aCurToken.aText.getLength());
if (TEND != m_aCurToken.eType)
m_nBufferIndex = aRes.EndPos;
}
@@ -1160,6 +1160,7 @@ std::unique_ptr<SmTableNode> SmParser5::DoTable()
}
assert(m_aCurToken.eType == TEND);
std::unique_ptr<SmTableNode> xSNode(new SmTableNode(m_aCurToken));
+ xSNode->SetSelection(m_aCurESelection);
xSNode->SetSubNodes(buildNodeArray(aLineArray));
return xSNode;
}
@@ -1174,6 +1175,7 @@ std::unique_ptr<SmNode> SmParser5::DoAlign(bool bUseExtraSpaces)
if (TokenInGroup(TG::Align))
{
xSNode.reset(new SmAlignNode(m_aCurToken));
+ xSNode->SetSelection(m_aCurESelection);
NextToken();
@@ -1219,6 +1221,7 @@ std::unique_ptr<SmNode> SmParser5::DoLine()
}
auto xSNode = std::make_unique<SmLineNode>(m_aCurToken);
+ xSNode->SetSelection(m_aCurESelection);
xSNode->SetSubNodes(buildNodeArray(ExpressionArray));
return xSNode;
}
@@ -1256,6 +1259,7 @@ std::unique_ptr<SmNode> SmParser5::DoRelation()
while (TokenInGroup(TG::Relation))
{
std::unique_ptr<SmStructureNode> xSNode(new SmBinHorNode(m_aCurToken));
+ xSNode->SetSelection(m_aCurESelection);
auto xSecond = DoOpSubSup();
auto xThird = DoSum();
xSNode->SetSubNodes(std::move(xFirst), std::move(xSecond), std::move(xThird));
@@ -1280,6 +1284,7 @@ std::unique_ptr<SmNode> SmParser5::DoSum()
while (TokenInGroup(TG::Sum))
{
std::unique_ptr<SmStructureNode> xSNode(new SmBinHorNode(m_aCurToken));
+ xSNode->SetSelection(m_aCurESelection);
auto xSecond = DoOpSubSup();
auto xThird = DoProduct();
xSNode->SetSubNodes(std::move(xFirst), std::move(xSecond), std::move(xThird));
@@ -1318,7 +1323,9 @@ std::unique_ptr<SmNode> SmParser5::DoProduct()
{
case TOVER:
xSNode.reset(new SmBinVerNode(m_aCurToken));
+ xSNode->SetSelection(m_aCurESelection);
xOper.reset(new SmRectangleNode(m_aCurToken));
+ xOper->SetSelection(m_aCurESelection);
NextToken();
break;
@@ -1336,7 +1343,9 @@ std::unique_ptr<SmNode> SmParser5::DoProduct()
case TOVERBRACE:
case TUNDERBRACE:
xSNode.reset(new SmVerticalBraceNode(m_aCurToken));
+ xSNode->SetSelection(m_aCurESelection);
xOper.reset(new SmMathSymbolNode(m_aCurToken));
+ xOper->SetSelection(m_aCurESelection);
NextToken();
break;
@@ -1349,6 +1358,7 @@ std::unique_ptr<SmNode> SmParser5::DoProduct()
xSNode.reset(pSTmp);
xOper.reset(new SmPolyLineNode(m_aCurToken));
+ xOper->SetSelection(m_aCurESelection);
NextToken();
break;
@@ -1356,6 +1366,7 @@ std::unique_ptr<SmNode> SmParser5::DoProduct()
default:
xSNode.reset(new SmBinHorNode(m_aCurToken));
+ xSNode->SetSelection(m_aCurESelection);
xOper = DoOpSubSup();
}
@@ -1376,6 +1387,7 @@ std::unique_ptr<SmNode> SmParser5::DoSubSup(TG nActiveGroup, std::unique_ptr<SmN
assert(m_aCurToken.nGroup == nActiveGroup);
std::unique_ptr<SmSubSupNode> pNode(new SmSubSupNode(m_aCurToken));
+ pNode->SetSelection(m_aCurESelection);
//! Of course 'm_aCurToken' is just the first sub-/supscript token.
//! It should be of no further interest. The positions of the
//! sub-/supscripts will be identified by the corresponding subnodes
@@ -1458,6 +1470,7 @@ std::unique_ptr<SmNode> SmParser5::DoSubSupEvaluate(std::unique_ptr<SmNode> xGiv
DepthProtect aDepthGuard(m_nParseDepth);
std::unique_ptr<SmSubSupNode> pNode(new SmSubSupNode(m_aCurToken));
+ pNode->SetSelection(m_aCurESelection);
pNode->SetUseLimits(true);
// initialize subnodes array
@@ -1511,6 +1524,7 @@ std::unique_ptr<SmNode> SmParser5::DoOpSubSup()
// get operator symbol
auto xNode = std::make_unique<SmMathSymbolNode>(m_aCurToken);
+ xNode->SetSelection(m_aCurESelection);
// skip operator token
NextToken();
// get sub- supscripts if any
@@ -1537,6 +1551,7 @@ std::unique_ptr<SmBlankNode> SmParser5::DoBlank()
assert(TokenInGroup(TG::Blank));
std::unique_ptr<SmBlankNode> pBlankNode(new SmBlankNode(m_aCurToken));
+ pBlankNode->SetSelection(m_aCurESelection);
do
{
@@ -1578,6 +1593,7 @@ std::unique_ptr<SmNode> SmParser5::DoTerm(bool bGroupNumberIdent)
if (m_aCurToken.eType == TRGROUP)
{
std::unique_ptr<SmStructureNode> xSNode(new SmExpressionNode(m_aCurToken));
+ xSNode->SetSelection(m_aCurESelection);
xSNode->SetSubNodes(nullptr, nullptr);
NextToken();
@@ -1591,6 +1607,7 @@ std::unique_ptr<SmNode> SmParser5::DoTerm(bool bGroupNumberIdent)
return pNode;
}
auto xSNode = std::make_unique<SmExpressionNode>(m_aCurToken);
+ xSNode->SetSelection(m_aCurESelection);
std::unique_ptr<SmNode> xError(DoError(SmParseError::RgroupExpected));
xSNode->SetSubNodes(std::move(pNode), std::move(xError));
return std::unique_ptr<SmNode>(xSNode.release());
@@ -1608,12 +1625,14 @@ std::unique_ptr<SmNode> SmParser5::DoTerm(bool bGroupNumberIdent)
case TTEXT:
{
auto pNode = std::make_unique<SmTextNode>(m_aCurToken, FNT_TEXT);
+ pNode->SetSelection(m_aCurESelection);
NextToken();
return std::unique_ptr<SmNode>(pNode.release());
}
case TCHARACTER:
{
auto pNode = std::make_unique<SmTextNode>(m_aCurToken, FNT_VARIABLE);
+ pNode->SetSelection(m_aCurESelection);
NextToken();
return std::unique_ptr<SmNode>(pNode.release());
}
@@ -1622,6 +1641,7 @@ std::unique_ptr<SmNode> SmParser5::DoTerm(bool bGroupNumberIdent)
{
auto pTextNode = std::make_unique<SmTextNode>(
m_aCurToken, m_aCurToken.eType == TNUMBER ? FNT_NUMBER : FNT_VARIABLE);
+ pTextNode->SetSelection(m_aCurESelection);
if (!bGroupNumberIdent)
{
NextToken();
@@ -1690,6 +1710,7 @@ std::unique_ptr<SmNode> SmParser5::DoTerm(bool bGroupNumberIdent)
case TDOTSVERT:
{
auto pNode = std::make_unique<SmMathSymbolNode>(m_aCurToken);
+ pNode->SetSelection(m_aCurESelection);
NextToken();
return std::unique_ptr<SmNode>(pNode.release());
}
@@ -1710,6 +1731,7 @@ std::unique_ptr<SmNode> SmParser5::DoTerm(bool bGroupNumberIdent)
case TINFINITY:
{
auto pNode = std::make_unique<SmMathIdentifierNode>(m_aCurToken);
+ pNode->SetSelection(m_aCurESelection);
NextToken();
return std::unique_ptr<SmNode>(pNode.release());
}
@@ -1717,6 +1739,7 @@ std::unique_ptr<SmNode> SmParser5::DoTerm(bool bGroupNumberIdent)
case TPLACE:
{
auto pNode = std::make_unique<SmPlaceNode>(m_aCurToken);
+ pNode->SetSelection(m_aCurESelection);
NextToken();
return std::unique_ptr<SmNode>(pNode.release());
}
@@ -1741,6 +1764,7 @@ std::unique_ptr<SmNode> SmParser5::DoTerm(bool bGroupNumberIdent)
if (m_aCurToken.eType == THEX)
{
auto pTextNode = std::make_unique<SmTextNode>(m_aCurToken, FNT_NUMBER);
+ pTextNode->SetSelection(m_aCurESelection);
NextToken();
return pTextNode;
}
@@ -1811,6 +1835,7 @@ std::unique_ptr<SmNode> SmParser5::DoEscape()
case TRDLINE:
{
auto pNode = std::make_unique<SmMathSymbolNode>(m_aCurToken);
+ pNode->SetSelection(m_aCurESelection);
NextToken();
return std::unique_ptr<SmNode>(pNode.release());
}
@@ -1826,6 +1851,7 @@ std::unique_ptr<SmOperNode> SmParser5::DoOperator()
assert(TokenInGroup(TG::Oper));
auto xSNode = std::make_unique<SmOperNode>(m_aCurToken);
+ xSNode->SetSelection(m_aCurESelection);
// get operator
auto xOperator = DoOper();
@@ -1860,6 +1886,7 @@ std::unique_ptr<SmNode> SmParser5::DoOper()
case TLLINT:
case TLLLINT:
pNode.reset(new SmMathSymbolNode(m_aCurToken));
+ pNode->SetSelection(m_aCurESelection);
break;
case TLIM:
@@ -1868,6 +1895,7 @@ std::unique_ptr<SmNode> SmParser5::DoOper()
m_aCurToken.aText
= eType == TLIMSUP ? u"lim sup" : eType == TLIMINF ? u"lim inf" : u"lim";
pNode.reset(new SmTextNode(m_aCurToken, FNT_TEXT));
+ pNode->SetSelection(m_aCurESelection);
break;
case TOPER:
@@ -1875,6 +1903,7 @@ std::unique_ptr<SmNode> SmParser5::DoOper()
OSL_ENSURE(m_aCurToken.eType == TSPECIAL, "Sm: wrong token");
m_aCurToken.eType = TOPER;
pNode.reset(new SmGlyphSpecialNode(m_aCurToken));
+ pNode->SetSelection(m_aCurESelection);
break;
default:
@@ -1892,6 +1921,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoUnOper()
assert(TokenInGroup(TG::UnOper));
SmToken aNodeToken = m_aCurToken;
+ ESelection aESelection = m_aCurESelection;
SmTokenType eType = m_aCurToken.eType;
bool bIsPostfix = eType == TFACT;
@@ -1939,6 +1969,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoUnOper()
if (eType == TABS)
{
xSNode.reset(new SmBraceNode(aNodeToken));
+ xSNode->SetSelection(aESelection);
xSNode->SetScaleMode(SmScaleMode::Height);
// build nodes for left & right lines
@@ -1948,19 +1979,24 @@ std::unique_ptr<SmStructureNode> SmParser5::DoUnOper()
aNodeToken.setChar(MS_VERTLINE);
std::unique_ptr<SmNode> xLeft(new SmMathSymbolNode(aNodeToken));
+ xLeft->SetSelection(aESelection);
std::unique_ptr<SmNode> xRight(new SmMathSymbolNode(aNodeToken));
+ xRight->SetSelection(aESelection);
xSNode->SetSubNodes(std::move(xLeft), std::move(xArg), std::move(xRight));
}
else if (eType == TSQRT || eType == TNROOT)
{
xSNode.reset(new SmRootNode(aNodeToken));
+ xSNode->SetSelection(aESelection);
xOper.reset(new SmRootSymbolNode(aNodeToken));
+ xOper->SetSelection(aESelection);
xSNode->SetSubNodes(std::move(xExtra), std::move(xOper), std::move(xArg));
}
else
{
xSNode.reset(new SmUnHorNode(aNodeToken));
+ xSNode->SetSelection(aESelection);
if (bIsPostfix)
xSNode->SetSubNodes(std::move(xArg), std::move(xOper));
else
@@ -1979,6 +2015,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoAttribute()
assert(TokenInGroup(TG::Attribute));
auto xSNode = std::make_unique<SmAttributeNode>(m_aCurToken);
+ xSNode->SetSelection(m_aCurESelection);
std::unique_ptr<SmNode> xAttr;
SmScaleMode eScaleMode = SmScaleMode::None;
@@ -1989,6 +2026,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoAttribute()
case TOVERLINE:
case TOVERSTRIKE:
xAttr.reset(new SmRectangleNode(m_aCurToken));
+ xAttr->SetSelection(m_aCurESelection);
eScaleMode = SmScaleMode::Width;
break;
@@ -1997,11 +2035,13 @@ std::unique_ptr<SmStructureNode> SmParser5::DoAttribute()
case TWIDEHAT:
case TWIDETILDE:
xAttr.reset(new SmMathSymbolNode(m_aCurToken));
+ xAttr->SetSelection(m_aCurESelection);
eScaleMode = SmScaleMode::Width;
break;
default:
xAttr.reset(new SmMathSymbolNode(m_aCurToken));
+ xAttr->SetSelection(m_aCurESelection);
}
NextToken();
@@ -2026,6 +2066,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoFontAttribute()
case TPHANTOM:
{
auto pNode = std::make_unique<SmFontNode>(m_aCurToken);
+ pNode->SetSelection(m_aCurESelection);
NextToken();
return pNode;
}
@@ -2053,6 +2094,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoColor()
sal_Int32 nBufferIndex = m_nBufferIndex;
NextTokenColor(TCOLOR);
SmToken aToken;
+ ESelection aESelection;
if (m_aCurToken.eType == TDVIPSNAMESCOL)
NextTokenColor(TDVIPSNAMESCOL);
@@ -2061,6 +2103,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoColor()
if (TokenInGroup(TG::Color))
{
aToken = m_aCurToken;
+ aESelection = m_aCurESelection;
if (m_aCurToken.eType == TRGB) //loads r, g and b
{
sal_uInt32 nr, ng, nb, nc;
@@ -2132,6 +2175,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoColor()
std::unique_ptr<SmStructureNode> xNode;
xNode.reset(new SmFontNode(aToken));
+ xNode->SetSelection(aESelection);
return xNode;
}
@@ -2144,6 +2188,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoFont()
std::unique_ptr<SmStructureNode> xNode;
// last font rules, get that one
SmToken aToken;
+ ESelection aESelection = m_aCurESelection;
do
{
NextToken();
@@ -2160,6 +2205,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoFont()
} while (m_aCurToken.eType == TFONT);
xNode.reset(new SmFontNode(aToken));
+ xNode->SetSelection(aESelection);
return xNode;
}
@@ -2167,6 +2213,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoFontSize()
{
DepthProtect aDepthGuard(m_nParseDepth);
std::unique_ptr<SmFontNode> pFontNode(new SmFontNode(m_aCurToken));
+ pFontNode->SetSelection(m_aCurESelection);
NextTokenFontSize();
FontSizeType Type;
@@ -2232,6 +2279,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoBrace()
assert(m_aCurToken.eType == TLEFT || TokenInGroup(TG::LBrace));
std::unique_ptr<SmStructureNode> xSNode(new SmBraceNode(m_aCurToken));
+ xSNode->SetSelection(m_aCurESelection);
std::unique_ptr<SmNode> pBody, pLeft, pRight;
SmScaleMode eScaleMode = SmScaleMode::None;
SmParseError eError = SmParseError::None;
@@ -2246,6 +2294,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoBrace()
if (TokenInGroup(TG::LBrace) || TokenInGroup(TG::RBrace))
{
pLeft.reset(new SmMathSymbolNode(m_aCurToken));
+ pLeft->SetSelection(m_aCurESelection);
NextToken();
pBody = DoBracebody(true);
@@ -2258,6 +2307,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoBrace()
if (TokenInGroup(TG::LBrace) || TokenInGroup(TG::RBrace))
{
pRight.reset(new SmMathSymbolNode(m_aCurToken));
+ pRight->SetSelection(m_aCurESelection);
NextToken();
}
else
@@ -2274,6 +2324,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoBrace()
assert(TokenInGroup(TG::LBrace));
pLeft.reset(new SmMathSymbolNode(m_aCurToken));
+ pLeft->SetSelection(m_aCurESelection);
NextToken();
pBody = DoBracebody(false);
@@ -2321,6 +2372,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoBrace()
if (m_aCurToken.eType == eExpectedType)
{
pRight.reset(new SmMathSymbolNode(m_aCurToken));
+ pRight->SetSelection(m_aCurESelection);
NextToken();
}
else
@@ -2343,6 +2395,7 @@ std::unique_ptr<SmBracebodyNode> SmParser5::DoBracebody(bool bIsLeftRight)
DepthProtect aDepthGuard(m_nParseDepth);
auto pBody = std::make_unique<SmBracebodyNode>(m_aCurToken);
+ pBody->SetSelection(m_aCurESelection);
std::vector<std::unique_ptr<SmNode>> aNodes;
// get body if any
@@ -2352,7 +2405,9 @@ std::unique_ptr<SmBracebodyNode> SmParser5::DoBracebody(bool bIsLeftRight)
{
if (m_aCurToken.eType == TMLINE)
{
- aNodes.emplace_back(std::make_unique<SmMathSymbolNode>(m_aCurToken));
+ SmMathSymbolNode* pTempNode = new SmMathSymbolNode(m_aCurToken);
+ pTempNode->SetSelection(m_aCurESelection);
+ aNodes.emplace_back(std::unique_ptr<SmMathSymbolNode>(pTempNode));
NextToken();
}
else if (m_aCurToken.eType != TRIGHT)
@@ -2369,7 +2424,9 @@ std::unique_ptr<SmBracebodyNode> SmParser5::DoBracebody(bool bIsLeftRight)
{
if (m_aCurToken.eType == TMLINE)
{
- aNodes.emplace_back(std::make_unique<SmMathSymbolNode>(m_aCurToken));
+ SmMathSymbolNode* pTempNode = new SmMathSymbolNode(m_aCurToken);
+ pTempNode->SetSelection(m_aCurESelection);
+ aNodes.emplace_back(std::unique_ptr<SmMathSymbolNode>(pTempNode));
NextToken();
}
else if (!TokenInGroup(TG::RBrace))
@@ -2392,9 +2449,8 @@ std::unique_ptr<SmNode> SmParser5::DoEvaluate()
// Create node
std::unique_ptr<SmStructureNode> xSNode(new SmBraceNode(m_aCurToken));
+ xSNode->SetSelection(m_aCurESelection);
SmToken aToken(TRLINE, MS_VERTLINE, "evaluate", TG::RBrace, 5);
- aToken.nRow = m_aCurToken.nRow;
- aToken.nCol = m_aCurToken.nCol;
// Parse body && left none
NextToken();
@@ -2432,6 +2488,7 @@ std::unique_ptr<SmTextNode> SmParser5::DoFunction()
m_aCurToken.nGroup = TG::Function;
}
auto pNode = std::make_unique<SmTextNode>(m_aCurToken, FNT_FUNCTION);
+ pNode->SetSelection(m_aCurESelection);
NextToken();
return pNode;
}
@@ -2441,6 +2498,7 @@ std::unique_ptr<SmTableNode> SmParser5::DoBinom()
DepthProtect aDepthGuard(m_nParseDepth);
auto xSNode = std::make_unique<SmTableNode>(m_aCurToken);
+ xSNode->SetSelection(m_aCurESelection);
NextToken();
@@ -2455,7 +2513,9 @@ std::unique_ptr<SmBinVerNode> SmParser5::DoFrac()
DepthProtect aDepthGuard(m_nParseDepth);
std::unique_ptr<SmBinVerNode> xSNode = std::make_unique<SmBinVerNode>(m_aCurToken);
+ xSNode->SetSelection(m_aCurESelection);
std::unique_ptr<SmNode> xOper = std::make_unique<SmRectangleNode>(m_aCurToken);
+ xOper->SetSelection(m_aCurESelection);
NextToken();
@@ -2470,6 +2530,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoStack()
DepthProtect aDepthGuard(m_nParseDepth);
std::unique_ptr<SmStructureNode> xSNode(new SmTableNode(m_aCurToken));
+ xSNode->SetSelection(m_aCurESelection);
NextToken();
if (m_aCurToken.eType != TLGROUP)
return DoError(SmParseError::LgroupExpected);
@@ -2494,6 +2555,7 @@ std::unique_ptr<SmStructureNode> SmParser5::DoMatrix()
DepthProtect aDepthGuard(m_nParseDepth);
std::unique_ptr<SmMatrixNode> xMNode(new SmMatrixNode(m_aCurToken));
+ xMNode->SetSelection(m_aCurESelection);
NextToken();
if (m_aCurToken.eType != TLGROUP)
return DoError(SmParseError::LgroupExpected);
@@ -2581,6 +2643,7 @@ std::unique_ptr<SmSpecialNode> SmParser5::DoSpecial()
m_aUsedSymbols.insert(aSymbolName);
auto pNode = std::make_unique<SmSpecialNode>(m_aCurToken);
+ pNode->SetSelection(m_aCurESelection);
NextToken();
return pNode;
}
@@ -2608,6 +2671,7 @@ std::unique_ptr<SmExpressionNode> SmParser5::DoError(SmParseError eError)
m_aCurToken.cMathChar = sStrBuf.makeStringAndClear();
auto xSNode = std::make_unique<SmExpressionNode>(m_aCurToken);
SmErrorNode* pErr(new SmErrorNode(m_aCurToken));
+ pErr->SetSelection(m_aCurESelection);
xSNode->SetSubNode(0, pErr);
// Append error to the error list
@@ -2645,7 +2709,7 @@ std::unique_ptr<SmTableNode> SmParser5::Parse(const OUString& rBuffer)
m_aBufferString = convertLineEnd(rBuffer, LINEEND_LF);
m_nBufferIndex = 0;
m_nTokenIndex = 0;
- m_nRow = 1;
+ m_nRow = 0;
m_nColOff = 0;
m_nCurError = -1;
@@ -2660,7 +2724,7 @@ std::unique_ptr<SmNode> SmParser5::ParseExpression(const OUString& rBuffer)
m_aBufferString = convertLineEnd(rBuffer, LINEEND_LF);
m_nBufferIndex = 0;
m_nTokenIndex = 0;
- m_nRow = 1;
+ m_nRow = 0;
m_nColOff = 0;
m_nCurError = -1;
diff --git a/starmath/source/view.cxx b/starmath/source/view.cxx
index b9399656d006..3a177f6276cb 100644
--- a/starmath/source/view.cxx
+++ b/starmath/source/view.cxx
@@ -173,12 +173,7 @@ void SmGraphicWindow::MouseButtonDown(const MouseEvent& rMEvt)
const SmToken aToken (pNode->GetToken());
// set selection to the beginning of the token
- ESelection aSel (aToken.nRow - 1, aToken.nCol - 1);
-
- if (rMEvt.GetClicks() != 1 || aToken.eType == TPLACE)
- aSel.nEndPos = aSel.nEndPos + sal::static_int_cast< sal_uInt16 >(aToken.aText.getLength());
-
- pEdit->SetSelection(aSel);
+ pEdit->SetSelection(pNode->GetSelection());
SetCursor(pNode);
// allow for immediate editing and
@@ -387,8 +382,6 @@ void SmGraphicWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Rec
sal_Int32 nRow;
sal_uInt16 nCol;
SmGetLeftSelectionPart(pEdit->GetSelection(), nRow, nCol);
- nRow++;
- nCol++;
const SmNode *pFound = SetCursorPos(static_cast<sal_uInt16>(nRow), nCol);
SmModule *pp = SM_MOD();
diff --git a/starmath/source/visitors.cxx b/starmath/source/visitors.cxx
index f1f1f94cc962..7e02d4739c62 100644
--- a/starmath/source/visitors.cxx
+++ b/starmath/source/visitors.cxx
@@ -1634,6 +1634,7 @@ void SmCloningVisitor::CloneKids( SmStructureNode* pSource, SmStructureNode* pTa
void SmCloningVisitor::Visit( SmTableNode* pNode )
{
SmTableNode* pClone = new SmTableNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1642,6 +1643,7 @@ void SmCloningVisitor::Visit( SmTableNode* pNode )
void SmCloningVisitor::Visit( SmBraceNode* pNode )
{
SmBraceNode* pClone = new SmBraceNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1650,6 +1652,7 @@ void SmCloningVisitor::Visit( SmBraceNode* pNode )
void SmCloningVisitor::Visit( SmBracebodyNode* pNode )
{
SmBracebodyNode* pClone = new SmBracebodyNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1658,6 +1661,7 @@ void SmCloningVisitor::Visit( SmBracebodyNode* pNode )
void SmCloningVisitor::Visit( SmOperNode* pNode )
{
SmOperNode* pClone = new SmOperNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1666,6 +1670,7 @@ void SmCloningVisitor::Visit( SmOperNode* pNode )
void SmCloningVisitor::Visit( SmAlignNode* pNode )
{
SmAlignNode* pClone = new SmAlignNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1674,6 +1679,7 @@ void SmCloningVisitor::Visit( SmAlignNode* pNode )
void SmCloningVisitor::Visit( SmAttributeNode* pNode )
{
SmAttributeNode* pClone = new SmAttributeNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1682,6 +1688,7 @@ void SmCloningVisitor::Visit( SmAttributeNode* pNode )
void SmCloningVisitor::Visit( SmFontNode* pNode )
{
SmFontNode* pClone = new SmFontNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
pClone->SetSizeParameter( pNode->GetSizeParameter( ), pNode->GetSizeType( ) );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
@@ -1691,6 +1698,7 @@ void SmCloningVisitor::Visit( SmFontNode* pNode )
void SmCloningVisitor::Visit( SmUnHorNode* pNode )
{
SmUnHorNode* pClone = new SmUnHorNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1699,6 +1707,7 @@ void SmCloningVisitor::Visit( SmUnHorNode* pNode )
void SmCloningVisitor::Visit( SmBinHorNode* pNode )
{
SmBinHorNode* pClone = new SmBinHorNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1707,6 +1716,7 @@ void SmCloningVisitor::Visit( SmBinHorNode* pNode )
void SmCloningVisitor::Visit( SmBinVerNode* pNode )
{
SmBinVerNode* pClone = new SmBinVerNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1715,6 +1725,7 @@ void SmCloningVisitor::Visit( SmBinVerNode* pNode )
void SmCloningVisitor::Visit( SmBinDiagonalNode* pNode )
{
SmBinDiagonalNode *pClone = new SmBinDiagonalNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
pClone->SetAscending( pNode->IsAscending( ) );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
@@ -1724,6 +1735,7 @@ void SmCloningVisitor::Visit( SmBinDiagonalNode* pNode )
void SmCloningVisitor::Visit( SmSubSupNode* pNode )
{
SmSubSupNode *pClone = new SmSubSupNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
pClone->SetUseLimits( pNode->IsUseLimits( ) );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
@@ -1733,6 +1745,7 @@ void SmCloningVisitor::Visit( SmSubSupNode* pNode )
void SmCloningVisitor::Visit( SmMatrixNode* pNode )
{
SmMatrixNode *pClone = new SmMatrixNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
pClone->SetRowCol( pNode->GetNumRows( ), pNode->GetNumCols( ) );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
@@ -1742,12 +1755,14 @@ void SmCloningVisitor::Visit( SmMatrixNode* pNode )
void SmCloningVisitor::Visit( SmPlaceNode* pNode )
{
mpResult = new SmPlaceNode( pNode->GetToken( ) );
+ mpResult->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, mpResult );
}
void SmCloningVisitor::Visit( SmTextNode* pNode )
{
SmTextNode* pClone = new SmTextNode( pNode->GetToken( ), pNode->GetFontDesc( ) );
+ pClone->SetSelection( pNode->GetSelection() );
pClone->ChangeText( pNode->GetText( ) );
CloneNodeAttr( pNode, pClone );
mpResult = pClone;
@@ -1756,24 +1771,28 @@ void SmCloningVisitor::Visit( SmTextNode* pNode )
void SmCloningVisitor::Visit( SmSpecialNode* pNode )
{
mpResult = new SmSpecialNode( pNode->GetToken( ) );
+ mpResult->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, mpResult );
}
void SmCloningVisitor::Visit( SmGlyphSpecialNode* pNode )
{
mpResult = new SmGlyphSpecialNode( pNode->GetToken( ) );
+ mpResult->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, mpResult );
}
void SmCloningVisitor::Visit( SmMathSymbolNode* pNode )
{
mpResult = new SmMathSymbolNode( pNode->GetToken( ) );
+ mpResult->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, mpResult );
}
void SmCloningVisitor::Visit( SmBlankNode* pNode )
{
SmBlankNode* pClone = new SmBlankNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
pClone->SetBlankNum( pNode->GetBlankNum( ) );
mpResult = pClone;
CloneNodeAttr( pNode, mpResult );
@@ -1782,12 +1801,14 @@ void SmCloningVisitor::Visit( SmBlankNode* pNode )
void SmCloningVisitor::Visit( SmErrorNode* pNode )
{
mpResult = new SmErrorNode( pNode->GetToken( ) );
+ mpResult->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, mpResult );
}
void SmCloningVisitor::Visit( SmLineNode* pNode )
{
SmLineNode* pClone = new SmLineNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1796,6 +1817,7 @@ void SmCloningVisitor::Visit( SmLineNode* pNode )
void SmCloningVisitor::Visit( SmExpressionNode* pNode )
{
SmExpressionNode* pClone = new SmExpressionNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1804,12 +1826,14 @@ void SmCloningVisitor::Visit( SmExpressionNode* pNode )
void SmCloningVisitor::Visit( SmPolyLineNode* pNode )
{
mpResult = new SmPolyLineNode( pNode->GetToken( ) );
+ mpResult->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, mpResult );
}
void SmCloningVisitor::Visit( SmRootNode* pNode )
{
SmRootNode* pClone = new SmRootNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;
@@ -1818,18 +1842,21 @@ void SmCloningVisitor::Visit( SmRootNode* pNode )
void SmCloningVisitor::Visit( SmRootSymbolNode* pNode )
{
mpResult = new SmRootSymbolNode( pNode->GetToken( ) );
+ mpResult->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, mpResult );
}
void SmCloningVisitor::Visit( SmRectangleNode* pNode )
{
mpResult = new SmRectangleNode( pNode->GetToken( ) );
+ mpResult->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, mpResult );
}
void SmCloningVisitor::Visit( SmVerticalBraceNode* pNode )
{
SmVerticalBraceNode* pClone = new SmVerticalBraceNode( pNode->GetToken( ) );
+ pClone->SetSelection( pNode->GetSelection() );
CloneNodeAttr( pNode, pClone );
CloneKids( pNode, pClone );
mpResult = pClone;