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 2761 : SwEditShell::SwEditShell( SwDoc& rDoc, vcl::Window *pWindow, const SwViewOption *pOptions )
41 2761 : : SwCrsrShell( rDoc, pWindow, pOptions )
42 : {
43 2761 : GetDoc()->GetIDocumentUndoRedo().DoUndo(true);
44 2761 : }
45 :
46 2757 : SwEditShell::~SwEditShell() // USED
47 : {
48 2757 : }
49 :
50 1 : bool SwEditShell::IsModified() const
51 : {
52 1 : return GetDoc()->getIDocumentState().IsModified();
53 : }
54 :
55 1 : void SwEditShell::SetModified()
56 : {
57 1 : GetDoc()->getIDocumentState().SetModified();
58 1 : }
59 :
60 2716 : void SwEditShell::ResetModified()
61 : {
62 2716 : GetDoc()->getIDocumentState().ResetModified();
63 2716 : }
64 :
65 0 : void SwEditShell::SetUndoNoResetModified()
66 : {
67 0 : GetDoc()->getIDocumentState().SetModified();
68 0 : GetDoc()->GetIDocumentUndoRedo().SetUndoNoResetModified();
69 0 : }
70 :
71 17539 : void SwEditShell::StartAllAction()
72 : {
73 35078 : for(SwViewShell& rCurrentShell : GetRingContainer())
74 : {
75 17539 : if( rCurrentShell.IsA( TYPE( SwEditShell ) ) )
76 17539 : static_cast<SwEditShell*>(&rCurrentShell)->StartAction();
77 : else
78 0 : rCurrentShell.StartAction();
79 : }
80 17539 : }
81 :
82 17536 : void SwEditShell::EndAllAction()
83 : {
84 35072 : for(SwViewShell& rCurrentShell : GetRingContainer())
85 : {
86 17536 : if( rCurrentShell.IsA( TYPE( SwEditShell ) ) )
87 17536 : static_cast<SwEditShell*>(&rCurrentShell)->EndAction();
88 : else
89 0 : rCurrentShell.EndAction();
90 : }
91 17536 : }
92 :
93 2819 : void SwEditShell::CalcLayout()
94 : {
95 2819 : StartAllAction();
96 2819 : SwViewShell::CalcLayout();
97 :
98 5638 : for(SwViewShell& rCurrentShell : GetRingContainer())
99 : {
100 2819 : if ( rCurrentShell.GetWin() )
101 2819 : rCurrentShell.GetWin()->Invalidate();
102 : }
103 :
104 2819 : EndAllAction();
105 2819 : }
106 :
107 : /** Get the content type of a shell
108 : *
109 : * @todo Is this called for every attribute?
110 : */
111 19903 : sal_uInt16 SwEditShell::GetCntType() const
112 : {
113 19903 : sal_uInt16 nRet = 0;
114 19903 : if( IsTableMode() )
115 33 : nRet = CNT_TXT;
116 : else
117 19870 : switch( GetCrsr()->GetNode().GetNodeType() )
118 : {
119 19870 : case ND_TEXTNODE: nRet = CNT_TXT; break;
120 0 : case ND_GRFNODE: nRet = CNT_GRF; break;
121 0 : case ND_OLENODE: nRet = CNT_OLE; break;
122 : }
123 :
124 : OSL_ASSERT( nRet );
125 19903 : return nRet;
126 : }
127 :
128 4 : bool SwEditShell::HasOtherCnt() const
129 :
130 : {
131 4 : if ( !GetDoc()->GetSpzFrameFormats()->empty() )
132 0 : return true;
133 :
134 4 : const SwNodes &rNds = GetDoc()->GetNodes();
135 : const SwNode *pNd;
136 :
137 4 : pNd = &rNds.GetEndOfInserts();
138 4 : if ( 1 != (pNd->GetIndex() - pNd->StartOfSectionIndex()) )
139 0 : return true;
140 :
141 4 : pNd = &rNds.GetEndOfAutotext();
142 4 : if ( 1 != (pNd->GetIndex() - pNd->StartOfSectionIndex()) )
143 0 : return true;
144 :
145 4 : return false;
146 : }
147 :
148 : // access control functions for file name handling
149 :
150 1325 : SwActContext::SwActContext(SwEditShell *pShell)
151 1325 : : m_rShell(*pShell)
152 : {
153 1325 : m_rShell.StartAction();
154 1325 : }
155 :
156 1325 : SwActContext::~SwActContext()
157 : {
158 1325 : m_rShell.EndAction();
159 1325 : }
160 :
161 24 : SwMvContext::SwMvContext(SwEditShell *pShell)
162 24 : : m_rShell(*pShell)
163 : {
164 24 : m_rShell.SttCrsrMove();
165 24 : }
166 :
167 24 : SwMvContext::~SwMvContext()
168 : {
169 24 : m_rShell.EndCrsrMove();
170 24 : }
171 :
172 17615 : SwFrameFormat *SwEditShell::GetTableFormat() // fastest test on a table
173 : {
174 17615 : const SwTableNode* pTableNd = IsCrsrInTable();
175 17615 : return pTableNd ? static_cast<SwFrameFormat*>(pTableNd->GetTable().GetFrameFormat()) : 0;
176 : }
177 :
178 : // TODO: Why is this called 3x for a new document?
179 0 : sal_uInt16 SwEditShell::GetTOXTypeCount(TOXTypes eTyp) const
180 : {
181 0 : return mpDoc->GetTOXTypeCount(eTyp);
182 : }
183 :
184 0 : void SwEditShell::InsertTOXType(const SwTOXType& rTyp)
185 : {
186 0 : mpDoc->InsertTOXType(rTyp);
187 0 : }
188 :
189 2773 : void SwEditShell::DoUndo( bool bOn )
190 2773 : { GetDoc()->GetIDocumentUndoRedo().DoUndo( bOn ); }
191 :
192 436 : bool SwEditShell::DoesUndo() const
193 436 : { return GetDoc()->GetIDocumentUndoRedo().DoesUndo(); }
194 :
195 0 : void SwEditShell::DoGroupUndo( bool bOn )
196 0 : { GetDoc()->GetIDocumentUndoRedo().DoGroupUndo( bOn ); }
197 :
198 0 : bool SwEditShell::DoesGroupUndo() const
199 0 : { return GetDoc()->GetIDocumentUndoRedo().DoesGroupUndo(); }
200 :
201 0 : void SwEditShell::DelAllUndoObj()
202 : {
203 0 : GetDoc()->GetIDocumentUndoRedo().DelAllUndoObj();
204 0 : }
205 :
206 : // Combine continuous calls of Insert/Delete/Overwrite on characters. Default: sdbcx::Group-Undo.
207 :
208 : /** open undo container
209 : *
210 : * @return nUndoId ID of the container
211 : */
212 268 : SwUndoId SwEditShell::StartUndo( SwUndoId eUndoId,
213 : const SwRewriter *pRewriter )
214 268 : { return GetDoc()->GetIDocumentUndoRedo().StartUndo( eUndoId, pRewriter ); }
215 :
216 : /** close undo container
217 : *
218 : * not used by UI
219 : *
220 : * @param eUndoId ID of the undo container
221 : * @param pRewriter ?
222 : */
223 268 : SwUndoId SwEditShell::EndUndo(SwUndoId eUndoId, const SwRewriter *pRewriter)
224 268 : { return GetDoc()->GetIDocumentUndoRedo().EndUndo(eUndoId, pRewriter); }
225 :
226 1426 : bool SwEditShell::GetLastUndoInfo(OUString *const o_pStr,
227 : SwUndoId *const o_pId) const
228 1426 : { return GetDoc()->GetIDocumentUndoRedo().GetLastUndoInfo(o_pStr, o_pId); }
229 :
230 957 : bool SwEditShell::GetFirstRedoInfo(OUString *const o_pStr) const
231 957 : { return GetDoc()->GetIDocumentUndoRedo().GetFirstRedoInfo(o_pStr); }
232 :
233 9 : SwUndoId SwEditShell::GetRepeatInfo(OUString *const o_pStr) const
234 9 : { return GetDoc()->GetIDocumentUndoRedo().GetRepeatInfo(o_pStr); }
235 :
236 : /** Auto correction */
237 3 : void SwEditShell::AutoCorrect( SvxAutoCorrect& rACorr, bool bInsert,
238 : sal_Unicode cChar )
239 : {
240 3 : SET_CURR_SHELL( this );
241 :
242 3 : StartAllAction();
243 :
244 3 : SwPaM* pCrsr = getShellCrsr( true );
245 3 : SwTextNode* pTNd = pCrsr->GetNode().GetTextNode();
246 :
247 6 : SwAutoCorrDoc aSwAutoCorrDoc( *this, *pCrsr, cChar );
248 : // FIXME: this _must_ be called with reference to the actual node text!
249 3 : OUString const& rNodeText(pTNd->GetText());
250 : rACorr.DoAutoCorrect( aSwAutoCorrDoc,
251 3 : rNodeText, pCrsr->GetPoint()->nContent.GetIndex(),
252 6 : cChar, bInsert, GetWin() );
253 3 : if( cChar )
254 3 : SaveTableBoxContent( pCrsr->GetPoint() );
255 6 : EndAllAction();
256 3 : }
257 :
258 0 : void SwEditShell::SetNewDoc(bool bNew)
259 : {
260 0 : GetDoc()->getIDocumentState().SetNewDoc(bNew);
261 0 : }
262 :
263 0 : bool SwEditShell::GetPrevAutoCorrWord( SvxAutoCorrect& rACorr, OUString& rWord )
264 : {
265 0 : SET_CURR_SHELL( this );
266 :
267 : bool bRet;
268 0 : SwPaM* pCrsr = getShellCrsr( true );
269 0 : const sal_Int32 nPos = pCrsr->GetPoint()->nContent.GetIndex();
270 0 : SwTextNode* pTNd = pCrsr->GetNode().GetTextNode();
271 0 : if( pTNd && nPos )
272 : {
273 0 : SwAutoCorrDoc aSwAutoCorrDoc( *this, *pCrsr, 0 );
274 : bRet = rACorr.GetPrevAutoCorrWord( aSwAutoCorrDoc,
275 0 : pTNd->GetText(), nPos, rWord );
276 : }
277 : else
278 0 : bRet = false;
279 0 : return bRet;
280 : }
281 :
282 0 : SwAutoCompleteWord& SwEditShell::GetAutoCompleteWords()
283 : {
284 0 : return SwDoc::GetAutoCompleteWords();
285 177 : }
286 :
287 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|