Line data Source code
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 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <vcl/window.hxx>
21 :
22 : #include <editsh.hxx>
23 : #include <doc.hxx>
24 : #include <IDocumentUndoRedo.hxx>
25 : #include <IDocumentState.hxx>
26 : #include <pam.hxx>
27 : #include <docary.hxx>
28 : #include <acorrect.hxx>
29 : #include <swtable.hxx>
30 : #include <ndtxt.hxx>
31 : #include <swundo.hxx>
32 : #include <SwRewriter.hxx>
33 :
34 : // masqueraded copy constructor
35 0 : SwEditShell::SwEditShell( SwEditShell& rEdSH, vcl::Window *pWindow )
36 0 : : SwCrsrShell( rEdSH, pWindow )
37 : {
38 0 : }
39 :
40 4708 : SwEditShell::SwEditShell( SwDoc& rDoc, vcl::Window *pWindow, const SwViewOption *pOptions )
41 4708 : : SwCrsrShell( rDoc, pWindow, pOptions )
42 : {
43 4708 : GetDoc()->GetIDocumentUndoRedo().DoUndo(true);
44 4708 : }
45 :
46 4706 : SwEditShell::~SwEditShell() // USED
47 : {
48 4706 : }
49 :
50 2 : bool SwEditShell::IsModified() const
51 : {
52 2 : return GetDoc()->getIDocumentState().IsModified();
53 : }
54 :
55 2 : void SwEditShell::SetModified()
56 : {
57 2 : GetDoc()->getIDocumentState().SetModified();
58 2 : }
59 :
60 4702 : void SwEditShell::ResetModified()
61 : {
62 4702 : GetDoc()->getIDocumentState().ResetModified();
63 4702 : }
64 :
65 0 : void SwEditShell::SetUndoNoResetModified()
66 : {
67 0 : GetDoc()->getIDocumentState().SetModified();
68 0 : GetDoc()->GetIDocumentUndoRedo().SetUndoNoResetModified();
69 0 : }
70 :
71 30900 : void SwEditShell::StartAllAction()
72 : {
73 30900 : SwViewShell *pSh = this;
74 30900 : do {
75 30900 : if( pSh->IsA( TYPE( SwEditShell ) ) )
76 30900 : ((SwEditShell*)pSh)->StartAction();
77 : else
78 0 : pSh->StartAction();
79 30900 : pSh = (SwViewShell *)pSh->GetNext();
80 30900 : } while(pSh != this);
81 30900 : }
82 :
83 30896 : void SwEditShell::EndAllAction()
84 : {
85 30896 : SwViewShell *pSh = this;
86 30896 : do {
87 30896 : if( pSh->IsA( TYPE( SwEditShell ) ) )
88 30896 : ((SwEditShell*)pSh)->EndAction();
89 : else
90 0 : pSh->EndAction();
91 30896 : pSh = (SwViewShell *)pSh->GetNext();
92 30896 : } while(pSh != this);
93 30896 : }
94 :
95 4728 : void SwEditShell::CalcLayout()
96 : {
97 4728 : StartAllAction();
98 4728 : SwViewShell::CalcLayout();
99 :
100 4728 : SwViewShell *pSh = this;
101 4728 : do
102 : {
103 4728 : if ( pSh->GetWin() )
104 4728 : pSh->GetWin()->Invalidate();
105 4728 : pSh = (SwViewShell*)pSh->GetNext();
106 :
107 4728 : } while ( pSh != this );
108 :
109 4728 : EndAllAction();
110 4728 : }
111 :
112 : /** Get the content type of a shell
113 : *
114 : * @todo Is this called for every attribute?
115 : */
116 33750 : sal_uInt16 SwEditShell::GetCntType() const
117 : {
118 33750 : sal_uInt16 nRet = 0;
119 33750 : if( IsTableMode() )
120 42 : nRet = CNT_TXT;
121 : else
122 33708 : switch( GetCrsr()->GetNode().GetNodeType() )
123 : {
124 33708 : case ND_TEXTNODE: nRet = CNT_TXT; break;
125 0 : case ND_GRFNODE: nRet = CNT_GRF; break;
126 0 : case ND_OLENODE: nRet = CNT_OLE; break;
127 : }
128 :
129 : OSL_ASSERT( nRet );
130 33750 : return nRet;
131 : }
132 :
133 8 : bool SwEditShell::HasOtherCnt() const
134 :
135 : {
136 8 : if ( !GetDoc()->GetSpzFrmFmts()->empty() )
137 0 : return true;
138 :
139 8 : const SwNodes &rNds = GetDoc()->GetNodes();
140 : const SwNode *pNd;
141 :
142 8 : pNd = &rNds.GetEndOfInserts();
143 8 : if ( 1 != (pNd->GetIndex() - pNd->StartOfSectionIndex()) )
144 0 : return true;
145 :
146 8 : pNd = &rNds.GetEndOfAutotext();
147 8 : if ( 1 != (pNd->GetIndex() - pNd->StartOfSectionIndex()) )
148 0 : return true;
149 :
150 8 : return false;
151 : }
152 :
153 : // access controll functions for file name handling
154 :
155 1840 : SwActContext::SwActContext(SwEditShell *pShell)
156 1840 : : pSh(pShell)
157 : {
158 1840 : pSh->StartAction();
159 1840 : }
160 :
161 1840 : SwActContext::~SwActContext()
162 : {
163 1840 : pSh->EndAction();
164 1840 : }
165 :
166 20 : SwMvContext::SwMvContext(SwEditShell *pShell)
167 20 : : pSh(pShell)
168 : {
169 20 : pSh->SttCrsrMove();
170 20 : }
171 :
172 20 : SwMvContext::~SwMvContext()
173 : {
174 20 : pSh->EndCrsrMove();
175 20 : }
176 :
177 30211 : SwFrmFmt *SwEditShell::GetTableFmt() // fastest test on a table
178 : {
179 30211 : const SwTableNode* pTblNd = IsCrsrInTbl();
180 30211 : return pTblNd ? (SwFrmFmt*)pTblNd->GetTable().GetFrmFmt() : 0;
181 : }
182 :
183 : // TODO: Why is this called 3x for a new document?
184 0 : sal_uInt16 SwEditShell::GetTOXTypeCount(TOXTypes eTyp) const
185 : {
186 0 : return mpDoc->GetTOXTypeCount(eTyp);
187 : }
188 :
189 0 : void SwEditShell::InsertTOXType(const SwTOXType& rTyp)
190 : {
191 0 : mpDoc->InsertTOXType(rTyp);
192 0 : }
193 :
194 4732 : void SwEditShell::DoUndo( bool bOn )
195 4732 : { GetDoc()->GetIDocumentUndoRedo().DoUndo( bOn ); }
196 :
197 808 : bool SwEditShell::DoesUndo() const
198 808 : { return GetDoc()->GetIDocumentUndoRedo().DoesUndo(); }
199 :
200 0 : void SwEditShell::DoGroupUndo( bool bOn )
201 0 : { GetDoc()->GetIDocumentUndoRedo().DoGroupUndo( bOn ); }
202 :
203 0 : bool SwEditShell::DoesGroupUndo() const
204 0 : { return GetDoc()->GetIDocumentUndoRedo().DoesGroupUndo(); }
205 :
206 0 : void SwEditShell::DelAllUndoObj()
207 : {
208 0 : GetDoc()->GetIDocumentUndoRedo().DelAllUndoObj();
209 0 : }
210 :
211 : // Combine continuous calls of Insert/Delete/Overwrite on characters. Default: sdbcx::Group-Undo.
212 :
213 : /** open undo container
214 : *
215 : * @return nUndoId ID of the container
216 : */
217 416 : SwUndoId SwEditShell::StartUndo( SwUndoId eUndoId,
218 : const SwRewriter *pRewriter )
219 416 : { return GetDoc()->GetIDocumentUndoRedo().StartUndo( eUndoId, pRewriter ); }
220 :
221 : /** close undo container
222 : *
223 : * not used by UI
224 : *
225 : * @param eUndoId ID of the undo container
226 : * @param pRewriter ?
227 : */
228 416 : SwUndoId SwEditShell::EndUndo(SwUndoId eUndoId, const SwRewriter *pRewriter)
229 416 : { return GetDoc()->GetIDocumentUndoRedo().EndUndo(eUndoId, pRewriter); }
230 :
231 1313 : bool SwEditShell::GetLastUndoInfo(OUString *const o_pStr,
232 : SwUndoId *const o_pId) const
233 1313 : { return GetDoc()->GetIDocumentUndoRedo().GetLastUndoInfo(o_pStr, o_pId); }
234 :
235 946 : bool SwEditShell::GetFirstRedoInfo(OUString *const o_pStr) const
236 946 : { return GetDoc()->GetIDocumentUndoRedo().GetFirstRedoInfo(o_pStr); }
237 :
238 18 : SwUndoId SwEditShell::GetRepeatInfo(OUString *const o_pStr) const
239 18 : { return GetDoc()->GetIDocumentUndoRedo().GetRepeatInfo(o_pStr); }
240 :
241 : /** Auto correction */
242 0 : void SwEditShell::AutoCorrect( SvxAutoCorrect& rACorr, bool bInsert,
243 : sal_Unicode cChar )
244 : {
245 0 : SET_CURR_SHELL( this );
246 :
247 0 : StartAllAction();
248 :
249 0 : SwPaM* pCrsr = getShellCrsr( true );
250 0 : SwTxtNode* pTNd = pCrsr->GetNode().GetTxtNode();
251 :
252 0 : SwAutoCorrDoc aSwAutoCorrDoc( *this, *pCrsr, cChar );
253 : // FIXME: this _must_ be called with reference to the actual node text!
254 0 : OUString const& rNodeText(pTNd->GetTxt());
255 : rACorr.DoAutoCorrect( aSwAutoCorrDoc,
256 0 : rNodeText, pCrsr->GetPoint()->nContent.GetIndex(),
257 0 : cChar, bInsert, GetWin() );
258 0 : if( cChar )
259 0 : SaveTblBoxCntnt( pCrsr->GetPoint() );
260 0 : EndAllAction();
261 0 : }
262 :
263 0 : void SwEditShell::SetNewDoc(bool bNew)
264 : {
265 0 : GetDoc()->getIDocumentState().SetNewDoc(bNew);
266 0 : }
267 :
268 0 : bool SwEditShell::GetPrevAutoCorrWord( SvxAutoCorrect& rACorr, OUString& rWord )
269 : {
270 0 : SET_CURR_SHELL( this );
271 :
272 : bool bRet;
273 0 : SwPaM* pCrsr = getShellCrsr( true );
274 0 : const sal_Int32 nPos = pCrsr->GetPoint()->nContent.GetIndex();
275 0 : SwTxtNode* pTNd = pCrsr->GetNode().GetTxtNode();
276 0 : if( pTNd && nPos )
277 : {
278 0 : SwAutoCorrDoc aSwAutoCorrDoc( *this, *pCrsr, 0 );
279 : bRet = rACorr.GetPrevAutoCorrWord( aSwAutoCorrDoc,
280 0 : pTNd->GetTxt(), nPos, rWord );
281 : }
282 : else
283 0 : bRet = false;
284 0 : return bRet;
285 : }
286 :
287 0 : SwAutoCompleteWord& SwEditShell::GetAutoCompleteWords()
288 : {
289 0 : return SwDoc::GetAutoCompleteWords();
290 270 : }
291 :
292 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|