xref: /aoo4110/main/sw/source/core/undo/SwUndoField.cxx (revision b1cdbd2c)
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