1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #include <listenercontext.hxx>
11 #include <document.hxx>
12 #include <mtvelements.hxx>
13 
14 namespace sc {
15 
StartListeningContext(ScDocument & rDoc)16 StartListeningContext::StartListeningContext(ScDocument& rDoc) :
17     mrDoc(rDoc), mpSet(std::make_shared<ColumnBlockPositionSet>(rDoc)) {}
18 
StartListeningContext(ScDocument & rDoc,const std::shared_ptr<ColumnBlockPositionSet> & pSet)19 StartListeningContext::StartListeningContext(
20     ScDocument& rDoc, const std::shared_ptr<ColumnBlockPositionSet>& pSet) :
21     mrDoc(rDoc), mpSet(pSet) {}
22 
setColumnSet(const std::shared_ptr<const ColumnSet> & rpColSet)23 void StartListeningContext::setColumnSet( const std::shared_ptr<const ColumnSet>& rpColSet )
24 {
25     mpColSet = rpColSet;
26 }
27 
getColumnSet() const28 const std::shared_ptr<const ColumnSet>& StartListeningContext::getColumnSet() const
29 {
30     return mpColSet;
31 }
32 
getBlockPosition(SCTAB nTab,SCCOL nCol)33 ColumnBlockPosition* StartListeningContext::getBlockPosition(SCTAB nTab, SCCOL nCol)
34 {
35     return mpSet->getBlockPosition(nTab, nCol);
36 }
37 
EndListeningContext(ScDocument & rDoc,ScTokenArray * pOldCode)38 EndListeningContext::EndListeningContext(ScDocument& rDoc, ScTokenArray* pOldCode) :
39     mrDoc(rDoc), maSet(), mpPosSet(std::make_shared<ColumnBlockPositionSet>(rDoc)),
40     mpOldCode(pOldCode), maPosDelta(0,0,0) {}
41 
EndListeningContext(ScDocument & rDoc,const std::shared_ptr<ColumnBlockPositionSet> & pSet,ScTokenArray * pOldCode)42 EndListeningContext::EndListeningContext(
43     ScDocument& rDoc, const std::shared_ptr<ColumnBlockPositionSet>& pSet, ScTokenArray* pOldCode) :
44     mrDoc(rDoc), maSet(), mpPosSet(pSet),
45     mpOldCode(pOldCode), maPosDelta(0,0,0) {}
46 
setPositionDelta(const ScAddress & rDelta)47 void EndListeningContext::setPositionDelta( const ScAddress& rDelta )
48 {
49     maPosDelta = rDelta;
50 }
51 
getOldPosition(const ScAddress & rPos) const52 ScAddress EndListeningContext::getOldPosition( const ScAddress& rPos ) const
53 {
54     ScAddress aOldPos = rPos;
55     aOldPos.IncCol(maPosDelta.Col());
56     aOldPos.IncRow(maPosDelta.Row());
57     aOldPos.IncTab(maPosDelta.Tab());
58     return aOldPos;
59 }
60 
getBlockPosition(SCTAB nTab,SCCOL nCol)61 ColumnBlockPosition* EndListeningContext::getBlockPosition(SCTAB nTab, SCCOL nCol)
62 {
63     return mpPosSet->getBlockPosition(nTab, nCol);
64 }
65 
addEmptyBroadcasterPosition(SCTAB nTab,SCCOL nCol,SCROW nRow)66 void EndListeningContext::addEmptyBroadcasterPosition(SCTAB nTab, SCCOL nCol, SCROW nRow)
67 {
68     maSet.set(mrDoc, nTab, nCol, nRow, true);
69 }
70 
purgeEmptyBroadcasters()71 void EndListeningContext::purgeEmptyBroadcasters()
72 {
73     PurgeListenerAction aAction(mrDoc);
74     maSet.executeAction(aAction);
75 }
76 
PurgeListenerAction(ScDocument & rDoc)77 PurgeListenerAction::PurgeListenerAction(ScDocument& rDoc) :
78     mrDoc(rDoc), mpBlockPos(new ColumnBlockPosition) {}
79 
startColumn(SCTAB nTab,SCCOL nCol)80 void PurgeListenerAction::startColumn( SCTAB nTab, SCCOL nCol )
81 {
82     mrDoc.InitColumnBlockPosition(*mpBlockPos, nTab, nCol);
83 }
84 
execute(const ScAddress & rPos,SCROW nLength,bool bVal)85 void PurgeListenerAction::execute( const ScAddress& rPos, SCROW nLength, bool bVal )
86 {
87     if (bVal)
88     {
89         mrDoc.DeleteBroadcasters(*mpBlockPos, rPos, nLength);
90     }
91 };
92 
93 }
94 
95 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
96