1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26
27 #include <tools/rtti.hxx>
28
29 #include <SwUndoField.hxx>
30 #include <swundo.hxx>
31 #include <doc.hxx>
32 #include <IDocumentUndoRedo.hxx>
33 #include <txtfld.hxx>
34 #include <fldbas.hxx>
35 #include <ndtxt.hxx>
36 #include <fmtfld.hxx>
37 #include <dbfld.hxx>
38 #include <docsh.hxx>
39
40 using namespace ::com::sun::star::uno;
41
SwUndoField(const SwPosition & rPos,SwUndoId _nId)42 SwUndoField::SwUndoField(const SwPosition & rPos, SwUndoId _nId )
43 : SwUndo(_nId)
44 {
45 nNodeIndex = rPos.nNode.GetIndex();
46 nOffset = rPos.nContent.GetIndex();
47 pDoc = rPos.GetDoc();
48 }
49
~SwUndoField()50 SwUndoField::~SwUndoField()
51 {
52 }
53
GetPosition()54 SwPosition SwUndoField::GetPosition()
55 {
56 SwNode * pNode = pDoc->GetNodes()[nNodeIndex];
57 SwNodeIndex aNodeIndex(*pNode);
58 SwIndex aIndex(pNode->GetCntntNode(), nOffset);
59 SwPosition aResult(aNodeIndex, aIndex);
60
61 return aResult;
62 }
63
SwUndoFieldFromDoc(const SwPosition & rPos,const SwField & rOldField,const SwField & rNewField,SwMsgPoolItem * _pHnt,sal_Bool _bUpdate,SwUndoId _nId)64 SwUndoFieldFromDoc::SwUndoFieldFromDoc(const SwPosition & rPos,
65 const SwField & rOldField,
66 const SwField & rNewField,
67 SwMsgPoolItem * _pHnt, sal_Bool _bUpdate, SwUndoId _nId)
68 : SwUndoField(rPos,_nId)
69 , pOldField(rOldField.CopyField())
70 , pNewField(rNewField.CopyField())
71 , pHnt(_pHnt)
72 , bUpdate(_bUpdate)
73 {
74 ASSERT(pOldField, "No old field!");
75 ASSERT(pNewField, "No new field!");
76 ASSERT(pDoc, "No document!");
77 }
78
~SwUndoFieldFromDoc()79 SwUndoFieldFromDoc::~SwUndoFieldFromDoc()
80 {
81 delete pOldField;
82 delete pNewField;
83 }
84
UndoImpl(::sw::UndoRedoContext &)85 void SwUndoFieldFromDoc::UndoImpl(::sw::UndoRedoContext &)
86 {
87 SwTxtFld * pTxtFld = SwDoc::GetTxtFldAtPos(GetPosition());
88 const SwField * pField = pTxtFld->GetFmtFld().GetField();
89
90 if (pField)
91 {
92 pDoc->UpdateFld(pTxtFld, *pOldField, pHnt, bUpdate);
93 }
94 }
95
DoImpl()96 void SwUndoFieldFromDoc::DoImpl()
97 {
98 SwTxtFld * pTxtFld = SwDoc::GetTxtFldAtPos(GetPosition());
99 const SwField * pField = pTxtFld->GetFmtFld().GetField();
100
101 if (pField)
102 {
103 pDoc->UpdateFld(pTxtFld, *pNewField, pHnt, bUpdate);
104 SwFmtFld* pDstFmtFld = (SwFmtFld*)&pTxtFld->GetFmtFld();
105
106 if ( pDoc->GetFldType(RES_POSTITFLD, aEmptyStr,false) == pDstFmtFld->GetField()->GetTyp() )
107 pDoc->GetDocShell()->Broadcast( SwFmtFldHint( pDstFmtFld, SWFMTFLD_INSERTED ) );
108 }
109 }
110
RedoImpl(::sw::UndoRedoContext &)111 void SwUndoFieldFromDoc::RedoImpl(::sw::UndoRedoContext &)
112 {
113 DoImpl();
114 }
115
RepeatImpl(::sw::RepeatContext &)116 void SwUndoFieldFromDoc::RepeatImpl(::sw::RepeatContext &)
117 {
118 ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo());
119 DoImpl();
120 }
121
SwUndoFieldFromAPI(const SwPosition & rPos,const Any & rOldVal,const Any & rNewVal,sal_uInt16 _nWhich)122 SwUndoFieldFromAPI::SwUndoFieldFromAPI(const SwPosition & rPos,
123 const Any & rOldVal, const Any & rNewVal,
124 sal_uInt16 _nWhich)
125 : SwUndoField(rPos), aOldVal(rOldVal), aNewVal(rNewVal), nWhich(_nWhich)
126 {
127 }
128
~SwUndoFieldFromAPI()129 SwUndoFieldFromAPI::~SwUndoFieldFromAPI()
130 {
131 }
132
UndoImpl(::sw::UndoRedoContext &)133 void SwUndoFieldFromAPI::UndoImpl(::sw::UndoRedoContext &)
134 {
135 SwField * pField = SwDoc::GetFieldAtPos(GetPosition());
136
137 if (pField)
138 pField->PutValue(aOldVal, nWhich);
139 }
140
DoImpl()141 void SwUndoFieldFromAPI::DoImpl()
142 {
143 SwField * pField = SwDoc::GetFieldAtPos(GetPosition());
144
145 if (pField)
146 pField->PutValue(aNewVal, nWhich);
147 }
148
RedoImpl(::sw::UndoRedoContext &)149 void SwUndoFieldFromAPI::RedoImpl(::sw::UndoRedoContext &)
150 {
151 DoImpl();
152 }
153
RepeatImpl(::sw::RepeatContext &)154 void SwUndoFieldFromAPI::RepeatImpl(::sw::RepeatContext &)
155 {
156 DoImpl();
157 }
158
159