Kaydet (Commit) bcf5b54b authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Add SetStringCell() and SetEditCell() to ScDocFunc.

More on averting the use of PutCell().

Change-Id: I3881d7d468780eefe8016c754a053eb42ad3c5ad
üst e3504ca6
...@@ -58,6 +58,16 @@ void ScDocFuncSend::RecvMessage( const rtl::OString &rString ) ...@@ -58,6 +58,16 @@ void ScDocFuncSend::RecvMessage( const rtl::OString &rString )
mpDirect->SetValueCell( mpDirect->SetValueCell(
aReader.getAddress(1), aReader.getDouble(2), aReader.getBool(3)); aReader.getAddress(1), aReader.getDouble(2), aReader.getBool(3));
} }
else if (aReader.getMethod() == "setStringCell")
{
mpDirect->SetStringCell(
aReader.getAddress(1), aReader.getString(2), aReader.getBool(3));
}
else if (aReader.getMethod() == "setEditCell")
{
mpDirect->SetEditCell(
aReader.getAddress(1), aReader.getEdit(2), aReader.getBool(3));
}
else if ( aReader.getMethod() == "enterListAction" ) else if ( aReader.getMethod() == "enterListAction" )
mpDirect->EnterListAction( aReader.getInt( 1 ) ); mpDirect->EnterListAction( aReader.getInt( 1 ) );
else if ( aReader.getMethod() == "endListAction" ) else if ( aReader.getMethod() == "endListAction" )
...@@ -141,6 +151,26 @@ bool ScDocFuncSend::SetValueCell( const ScAddress& rPos, double fVal, bool bInte ...@@ -141,6 +151,26 @@ bool ScDocFuncSend::SetValueCell( const ScAddress& rPos, double fVal, bool bInte
return true; // needs some code auditing action return true; // needs some code auditing action
} }
bool ScDocFuncSend::SetStringCell( const ScAddress& rPos, const OUString& rStr, bool bInteraction )
{
ScChangeOpWriter aOp("setStringCell");
aOp.appendAddress( rPos );
aOp.appendString( rStr );
aOp.appendBool( bInteraction );
SendMessage( aOp );
return true; // needs some code auditing action
}
bool ScDocFuncSend::SetEditCell( const ScAddress& rPos, const EditTextObject& rStr, bool bInteraction )
{
ScChangeOpWriter aOp("setEditCell");
aOp.appendAddress( rPos );
aOp.appendEditText( rStr );
aOp.appendBool( bInteraction );
SendMessage( aOp );
return true; // needs some code auditing action
}
sal_Bool ScDocFuncSend::PutCell( const ScAddress& rPos, ScBaseCell* pNewCell, sal_Bool bApi ) sal_Bool ScDocFuncSend::PutCell( const ScAddress& rPos, ScBaseCell* pNewCell, sal_Bool bApi )
{ {
ScChangeOpWriter aOp( "putCell" ); ScChangeOpWriter aOp( "putCell" );
......
...@@ -24,6 +24,18 @@ rtl::OUString cellToString( ScBaseCell *pCell ) ...@@ -24,6 +24,18 @@ rtl::OUString cellToString( ScBaseCell *pCell )
return rtl::OUString(); return rtl::OUString();
} }
OUString editToString( const EditTextObject& /*rEditText*/ )
{
// FIXME: implement me.
return OUString();
}
EditTextObject stringToEdit( const OUString& rStr )
{
// FIXME: implement me.
return EditTextObject();
}
ScBaseCell *stringToCell( const rtl::OUString &rString ) ScBaseCell *stringToCell( const rtl::OUString &rString )
{ {
(void)rString; // FIXME: implement me (void)rString; // FIXME: implement me
...@@ -86,6 +98,11 @@ public: ...@@ -86,6 +98,11 @@ public:
appendString( cellToString( pCell ) ); appendString( cellToString( pCell ) );
} }
void appendEditText( const EditTextObject& rStr )
{
appendString( editToString(rStr) );
}
void appendDouble( double fVal ) void appendDouble( double fVal )
{ {
aMessage.append(fVal); aMessage.append(fVal);
...@@ -206,6 +223,12 @@ public: ...@@ -206,6 +223,12 @@ public:
{ {
return getString(n).toDouble(); return getString(n).toDouble();
} }
EditTextObject getEdit( sal_Int32 n )
{
return stringToEdit(getString(n));
}
}; };
} // anonymous namespace } // anonymous namespace
...@@ -229,6 +252,8 @@ public: ...@@ -229,6 +252,8 @@ public:
virtual sal_Bool SetNormalString( bool& o_rbNumFmtSet, const ScAddress& rPos, const String& rText, sal_Bool bApi ); virtual sal_Bool SetNormalString( bool& o_rbNumFmtSet, const ScAddress& rPos, const String& rText, sal_Bool bApi );
virtual bool SetValueCell( const ScAddress& rPos, double fVal, bool bInteraction ); virtual bool SetValueCell( const ScAddress& rPos, double fVal, bool bInteraction );
virtual bool SetStringCell( const ScAddress& rPos, const OUString& rStr, bool bInteraction );
virtual bool SetEditCell( const ScAddress& rPos, const EditTextObject& rStr, bool bInteraction );
virtual sal_Bool PutCell( const ScAddress& rPos, ScBaseCell* pNewCell, sal_Bool bApi ); virtual sal_Bool PutCell( const ScAddress& rPos, ScBaseCell* pNewCell, sal_Bool bApi );
virtual sal_Bool PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngine, virtual sal_Bool PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngine,
sal_Bool bInterpret, sal_Bool bApi ); sal_Bool bInterpret, sal_Bool bApi );
......
...@@ -80,6 +80,7 @@ ...@@ -80,6 +80,7 @@
#include "undorangename.hxx" #include "undorangename.hxx"
#include "progress.hxx" #include "progress.hxx"
#include "dpobject.hxx" #include "dpobject.hxx"
#include "stringutil.hxx"
#include <memory> #include <memory>
#include <basic/basmgr.hxx> #include <basic/basmgr.hxx>
...@@ -808,59 +809,118 @@ sal_Bool ScDocFunc::SetNormalString( bool& o_rbNumFmtSet, const ScAddress& rPos, ...@@ -808,59 +809,118 @@ sal_Bool ScDocFunc::SetNormalString( bool& o_rbNumFmtSet, const ScAddress& rPos,
return sal_True; return sal_True;
} }
namespace {
void pushUndoSetCell( ScDocShell& rDocShell, ScDocument* pDoc, const ScAddress& rPos, const ScUndoSetCell::Value& rNewVal )
{
svl::IUndoManager* pUndoMgr = rDocShell.GetUndoManager();
switch (pDoc->GetCellType(rPos))
{
case CELLTYPE_NONE:
case CELLTYPE_NOTE:
// Empty cell.
pUndoMgr->AddUndoAction(new ScUndoSetCell(&rDocShell, rPos, rNewVal));
break;
case CELLTYPE_VALUE:
{
double fOldVal = pDoc->GetValue(rPos);
pUndoMgr->AddUndoAction(new ScUndoSetCell(&rDocShell, rPos, fOldVal, rNewVal));
}
break;
case CELLTYPE_STRING:
{
OUString aOldStr = pDoc->GetString(rPos);
pUndoMgr->AddUndoAction(new ScUndoSetCell(&rDocShell, rPos, aOldStr, rNewVal));
}
break;
case CELLTYPE_EDIT:
{
const EditTextObject* pOldText = pDoc->GetEditText(rPos);
if (pOldText)
pUndoMgr->AddUndoAction(new ScUndoSetCell(&rDocShell, rPos, *pOldText, rNewVal));
}
break;
case CELLTYPE_FORMULA:
{
const ScTokenArray* pTokens = pDoc->GetFormula(rPos);
if (pTokens)
pUndoMgr->AddUndoAction(new ScUndoSetCell(&rDocShell, rPos, *pTokens, rNewVal));
}
break;
default:
;
}
}
}
bool ScDocFunc::SetValueCell( const ScAddress& rPos, double fVal, bool bInteraction ) bool ScDocFunc::SetValueCell( const ScAddress& rPos, double fVal, bool bInteraction )
{ {
ScDocShellModificator aModificator( rDocShell ); ScDocShellModificator aModificator( rDocShell );
ScDocument* pDoc = rDocShell.GetDocument(); ScDocument* pDoc = rDocShell.GetDocument();
bool bUndo = pDoc->IsUndoEnabled(); bool bUndo = pDoc->IsUndoEnabled();
bool bHeight = pDoc->HasAttrib(ScRange(rPos), HASATTR_NEEDHEIGHT); bool bHeight = pDoc->HasAttrib(rPos, HASATTR_NEEDHEIGHT);
if (bUndo) if (bUndo)
{ pushUndoSetCell(rDocShell, pDoc, rPos, fVal);
svl::IUndoManager* pUndoMgr = rDocShell.GetUndoManager();
switch (pDoc->GetCellType(rPos))
{
case CELLTYPE_NONE:
case CELLTYPE_NOTE:
// Empty cell.
pUndoMgr->AddUndoAction(new ScUndoSetCell(&rDocShell, rPos, fVal));
break;
case CELLTYPE_VALUE:
{
double fOldVal = pDoc->GetValue(rPos);
pUndoMgr->AddUndoAction(new ScUndoSetCell(&rDocShell, rPos, fOldVal, fVal));
}
break;
case CELLTYPE_STRING:
{
OUString aOldStr = pDoc->GetString(rPos);
pUndoMgr->AddUndoAction(new ScUndoSetCell(&rDocShell, rPos, aOldStr, fVal));
}
break;
case CELLTYPE_EDIT:
{
const EditTextObject* pOldText = pDoc->GetEditText(rPos);
if (pOldText)
pUndoMgr->AddUndoAction(new ScUndoSetCell(&rDocShell, rPos, *pOldText, fVal));
}
break;
case CELLTYPE_FORMULA:
{
const ScTokenArray* pTokens = pDoc->GetFormula(rPos);
if (pTokens)
pUndoMgr->AddUndoAction(new ScUndoSetCell(&rDocShell, rPos, *pTokens, fVal));
}
break;
default:
;
}
}
pDoc->SetValue(rPos, fVal); pDoc->SetValue(rPos, fVal);
if (bHeight) if (bHeight)
AdjustRowHeight( ScRange(rPos) ); AdjustRowHeight(rPos);
aModificator.SetDocumentModified();
// #103934#; notify editline and cell in edit mode
if (!bInteraction)
NotifyInputHandler( rPos );
return true;
}
bool ScDocFunc::SetStringCell( const ScAddress& rPos, const OUString& rStr, bool bInteraction )
{
ScDocShellModificator aModificator( rDocShell );
ScDocument* pDoc = rDocShell.GetDocument();
bool bUndo = pDoc->IsUndoEnabled();
bool bHeight = pDoc->HasAttrib(rPos, HASATTR_NEEDHEIGHT);
if (bUndo)
pushUndoSetCell(rDocShell, pDoc, rPos, rStr);
ScSetStringParam aParam;
aParam.setTextInput();
pDoc->SetString(rPos, rStr, &aParam);
if (bHeight)
AdjustRowHeight(rPos);
aModificator.SetDocumentModified();
// #103934#; notify editline and cell in edit mode
if (!bInteraction)
NotifyInputHandler( rPos );
return true;
}
bool ScDocFunc::SetEditCell( const ScAddress& rPos, const EditTextObject& rStr, bool bInteraction )
{
ScDocShellModificator aModificator( rDocShell );
ScDocument* pDoc = rDocShell.GetDocument();
bool bUndo = pDoc->IsUndoEnabled();
bool bHeight = pDoc->HasAttrib(rPos, HASATTR_NEEDHEIGHT);
if (bUndo)
pushUndoSetCell(rDocShell, pDoc, rPos, rStr);
pDoc->SetEditText(rPos, rStr.Clone());
if (bHeight)
AdjustRowHeight(rPos);
aModificator.SetDocumentModified(); aModificator.SetDocumentModified();
...@@ -1009,9 +1069,7 @@ sal_Bool ScDocFunc::PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngi ...@@ -1009,9 +1069,7 @@ sal_Bool ScDocFunc::PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngi
// A copy of pNewData will be stored in the cell. // A copy of pNewData will be stored in the cell.
boost::scoped_ptr<EditTextObject> pNewData(rEngine.CreateTextObject()); boost::scoped_ptr<EditTextObject> pNewData(rEngine.CreateTextObject());
bRet = PutCell( rPos, bRet = SetEditCell(rPos, *pNewData, !bApi);
new ScEditCell(*pNewData, pDoc, rEngine.GetEditTextObjectPool()),
bApi );
// Set the paragraph attributes back to the EditEngine. // Set the paragraph attributes back to the EditEngine.
if (!aRememberItems.empty()) if (!aRememberItems.empty())
...@@ -1040,7 +1098,7 @@ sal_Bool ScDocFunc::PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngi ...@@ -1040,7 +1098,7 @@ sal_Bool ScDocFunc::PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngi
bRet = SetNormalString( bNumFmtSet, rPos, aText, bApi ); bRet = SetNormalString( bNumFmtSet, rPos, aText, bApi );
} }
else else
bRet = PutCell( rPos, new ScStringCell( aText ), bApi ); bRet = SetStringCell(rPos, aText, !bApi);
} }
if ( bRet && aTester.NeedsCellAttr() ) if ( bRet && aTester.NeedsCellAttr() )
......
...@@ -89,6 +89,8 @@ public: ...@@ -89,6 +89,8 @@ public:
virtual sal_Bool SetNormalString( bool& o_rbNumFmtSet, const ScAddress& rPos, const String& rText, sal_Bool bApi ); virtual sal_Bool SetNormalString( bool& o_rbNumFmtSet, const ScAddress& rPos, const String& rText, sal_Bool bApi );
virtual bool SetValueCell( const ScAddress& rPos, double fVal, bool bInteraction ); virtual bool SetValueCell( const ScAddress& rPos, double fVal, bool bInteraction );
virtual bool SetStringCell( const ScAddress& rPos, const OUString& rStr, bool bInteraction );
virtual bool SetEditCell( const ScAddress& rPos, const EditTextObject& rStr, bool bInteraction );
virtual sal_Bool PutCell( const ScAddress& rPos, ScBaseCell* pNewCell, sal_Bool bApi ); virtual sal_Bool PutCell( const ScAddress& rPos, ScBaseCell* pNewCell, sal_Bool bApi );
virtual sal_Bool PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngine, virtual sal_Bool PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngine,
sal_Bool bInterpret, sal_Bool bApi ); sal_Bool bInterpret, sal_Bool bApi );
......
...@@ -502,13 +502,13 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab, ...@@ -502,13 +502,13 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab,
if ( pFormatter->GetType( nIndex ) == NUMBERFORMAT_TEXT || if ( pFormatter->GetType( nIndex ) == NUMBERFORMAT_TEXT ||
( ( rString.GetChar(0) == '+' || rString.GetChar(0) == '-' ) && nError && rString.Equals( aFormula ) ) ) ( ( rString.GetChar(0) == '+' || rString.GetChar(0) == '-' ) && nError && rString.Equals( aFormula ) ) )
{ {
ScBaseCell *pCell;
if ( pData ) if ( pData )
{
// A clone of pData will be stored in the cell. // A clone of pData will be stored in the cell.
pCell = new ScEditCell(*pData, pDoc, NULL); rFunc.SetEditCell(aPos, *pData, true);
}
else else
pCell = new ScStringCell( aFormula ); rFunc.SetStringCell(aPos, aFormula, true);
rFunc.PutCell( aPos, pCell, sal_False );
} }
else else
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment