File: | home/maarten/src/libreoffice/core/sw/source/core/access/accdoc.cxx |
Warning: | line 646, column 38 Called C++ object pointer is null |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
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 | #include <rootfrm.hxx> | ||||
22 | |||||
23 | #include <com/sun/star/accessibility/AccessibleRole.hpp> | ||||
24 | #include <com/sun/star/accessibility/AccessibleStateType.hpp> | ||||
25 | #include <com/sun/star/accessibility/AccessibleEventId.hpp> | ||||
26 | #include <com/sun/star/lang/IndexOutOfBoundsException.hpp> | ||||
27 | #include <unotools/accessiblestatesethelper.hxx> | ||||
28 | #include <cppuhelper/typeprovider.hxx> | ||||
29 | #include <vcl/svapp.hxx> | ||||
30 | #include <cppuhelper/supportsservice.hxx> | ||||
31 | #include <viewsh.hxx> | ||||
32 | #include <doc.hxx> | ||||
33 | #include <accmap.hxx> | ||||
34 | #include "accdoc.hxx" | ||||
35 | #include <strings.hrc> | ||||
36 | #include <pagefrm.hxx> | ||||
37 | |||||
38 | #include <swatrset.hxx> | ||||
39 | #include <docsh.hxx> | ||||
40 | #include <crsrsh.hxx> | ||||
41 | #include <fesh.hxx> | ||||
42 | #include <fmtclds.hxx> | ||||
43 | #include <flyfrm.hxx> | ||||
44 | #include <txtfrm.hxx> | ||||
45 | #include <sectfrm.hxx> | ||||
46 | #include <section.hxx> | ||||
47 | #include <svx/unoapi.hxx> | ||||
48 | #include <swmodule.hxx> | ||||
49 | #include <svtools/colorcfg.hxx> | ||||
50 | |||||
51 | #include <fmtanchr.hxx> | ||||
52 | #include <viewimp.hxx> | ||||
53 | #include <dview.hxx> | ||||
54 | #include <dcontact.hxx> | ||||
55 | #include <svx/svdmark.hxx> | ||||
56 | const char sServiceName[] = "com.sun.star.text.AccessibleTextDocumentView"; | ||||
57 | const char sImplementationName[] = "com.sun.star.comp.Writer.SwAccessibleDocumentView"; | ||||
58 | |||||
59 | using namespace ::com::sun::star; | ||||
60 | using namespace ::com::sun::star::accessibility; | ||||
61 | |||||
62 | using lang::IndexOutOfBoundsException; | ||||
63 | |||||
64 | // SwAccessibleDocumentBase: base class for SwAccessibleDocument and | ||||
65 | // SwAccessiblePreview | ||||
66 | |||||
67 | SwAccessibleDocumentBase::SwAccessibleDocumentBase( | ||||
68 | std::shared_ptr<SwAccessibleMap> const& pMap) | ||||
69 | : SwAccessibleContext(pMap, AccessibleRole::DOCUMENT_TEXT, | ||||
70 | pMap->GetShell()->GetLayout()) | ||||
71 | , mxParent(pMap->GetShell()->GetWin()->GetAccessibleParentWindow()->GetAccessible()) | ||||
72 | , mpChildWin(nullptr) | ||||
73 | { | ||||
74 | } | ||||
75 | |||||
76 | SwAccessibleDocumentBase::~SwAccessibleDocumentBase() | ||||
77 | { | ||||
78 | } | ||||
79 | |||||
80 | void SwAccessibleDocumentBase::SetVisArea() | ||||
81 | { | ||||
82 | SolarMutexGuard aGuard; | ||||
83 | |||||
84 | SwRect aOldVisArea( GetVisArea() ); | ||||
85 | const SwRect& rNewVisArea = GetMap()->GetVisArea(); | ||||
86 | if( aOldVisArea != rNewVisArea ) | ||||
87 | { | ||||
88 | SwAccessibleFrame::SetVisArea( GetMap()->GetVisArea() ); | ||||
89 | // #i58139# - showing state of document view needs also be updated. | ||||
90 | // Thus, call method <Scrolled(..)> instead of <ChildrenScrolled(..)> | ||||
91 | // ChildrenScrolled( GetFrame(), aOldVisArea ); | ||||
92 | Scrolled( aOldVisArea ); | ||||
93 | } | ||||
94 | } | ||||
95 | |||||
96 | void SwAccessibleDocumentBase::AddChild( vcl::Window *pWin, bool bFireEvent ) | ||||
97 | { | ||||
98 | SolarMutexGuard aGuard; | ||||
99 | |||||
100 | OSL_ENSURE( !mpChildWin, "only one child window is supported" )do { if (true && (!(!mpChildWin))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/home/maarten/src/libreoffice/core/sw/source/core/access/accdoc.cxx" ":" "100" ": "), "%s", "only one child window is supported") ; } } while (false); | ||||
101 | if( !mpChildWin ) | ||||
102 | { | ||||
103 | mpChildWin = pWin; | ||||
104 | |||||
105 | if( bFireEvent ) | ||||
106 | { | ||||
107 | AccessibleEventObject aEvent; | ||||
108 | aEvent.EventId = AccessibleEventId::CHILD; | ||||
109 | aEvent.NewValue <<= mpChildWin->GetAccessible(); | ||||
110 | FireAccessibleEvent( aEvent ); | ||||
111 | } | ||||
112 | } | ||||
113 | } | ||||
114 | |||||
115 | void SwAccessibleDocumentBase::RemoveChild( vcl::Window *pWin ) | ||||
116 | { | ||||
117 | SolarMutexGuard aGuard; | ||||
118 | |||||
119 | OSL_ENSURE( !mpChildWin || pWin == mpChildWin, "invalid child window to remove" )do { if (true && (!(!mpChildWin || pWin == mpChildWin ))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/home/maarten/src/libreoffice/core/sw/source/core/access/accdoc.cxx" ":" "119" ": "), "%s", "invalid child window to remove"); } } while (false); | ||||
120 | if( mpChildWin && pWin == mpChildWin ) | ||||
121 | { | ||||
122 | AccessibleEventObject aEvent; | ||||
123 | aEvent.EventId = AccessibleEventId::CHILD; | ||||
124 | aEvent.OldValue <<= mpChildWin->GetAccessible(); | ||||
125 | FireAccessibleEvent( aEvent ); | ||||
126 | |||||
127 | mpChildWin = nullptr; | ||||
128 | } | ||||
129 | } | ||||
130 | |||||
131 | sal_Int32 SAL_CALL SwAccessibleDocumentBase::getAccessibleChildCount() | ||||
132 | { | ||||
133 | SolarMutexGuard aGuard; | ||||
134 | |||||
135 | // ThrowIfDisposed is called by parent | ||||
136 | |||||
137 | sal_Int32 nChildren = SwAccessibleContext::getAccessibleChildCount(); | ||||
138 | if( !IsDisposing() && mpChildWin ) | ||||
139 | nChildren++; | ||||
140 | |||||
141 | return nChildren; | ||||
142 | } | ||||
143 | |||||
144 | uno::Reference< XAccessible> SAL_CALL | ||||
145 | SwAccessibleDocumentBase::getAccessibleChild( sal_Int32 nIndex ) | ||||
146 | { | ||||
147 | SolarMutexGuard aGuard; | ||||
148 | |||||
149 | if( mpChildWin ) | ||||
150 | { | ||||
151 | ThrowIfDisposed(); | ||||
152 | |||||
153 | if ( nIndex == GetChildCount( *(GetMap()) ) ) | ||||
154 | { | ||||
155 | return mpChildWin->GetAccessible(); | ||||
156 | } | ||||
157 | } | ||||
158 | |||||
159 | return SwAccessibleContext::getAccessibleChild( nIndex ); | ||||
160 | } | ||||
161 | |||||
162 | uno::Reference< XAccessible> SAL_CALL SwAccessibleDocumentBase::getAccessibleParent() | ||||
163 | { | ||||
164 | return mxParent; | ||||
165 | } | ||||
166 | |||||
167 | sal_Int32 SAL_CALL SwAccessibleDocumentBase::getAccessibleIndexInParent() | ||||
168 | { | ||||
169 | SolarMutexGuard aGuard; | ||||
170 | |||||
171 | uno::Reference < XAccessibleContext > xAcc( mxParent->getAccessibleContext() ); | ||||
172 | uno::Reference < XAccessible > xThis( this ); | ||||
173 | sal_Int32 nCount = xAcc->getAccessibleChildCount(); | ||||
174 | |||||
175 | for( sal_Int32 i=0; i < nCount; i++ ) | ||||
176 | { | ||||
177 | try | ||||
178 | { | ||||
179 | if( xAcc->getAccessibleChild( i ) == xThis ) | ||||
180 | return i; | ||||
181 | } | ||||
182 | catch(const css::lang::IndexOutOfBoundsException &) | ||||
183 | { | ||||
184 | return -1; | ||||
185 | } | ||||
186 | } | ||||
187 | return -1; | ||||
188 | } | ||||
189 | |||||
190 | OUString SAL_CALL SwAccessibleDocumentBase::getAccessibleDescription() | ||||
191 | { | ||||
192 | return GetResource( STR_ACCESS_DOC_DESCreinterpret_cast<char const *>("STR_ACCESS_DOC_DESC" "\004" u8"Document view") ); | ||||
193 | } | ||||
194 | |||||
195 | OUString SAL_CALL SwAccessibleDocumentBase::getAccessibleName() | ||||
196 | { | ||||
197 | SolarMutexGuard g; | ||||
198 | |||||
199 | OUString sAccName = GetResource( STR_ACCESS_DOC_WORDPROCESSINGreinterpret_cast<char const *>("STR_ACCESS_DOC_WORDPROCESSING" "\004" u8"%PRODUCTNAME Document") ); | ||||
200 | SwDoc *pDoc = GetMap() ? GetShell()->GetDoc() : nullptr; | ||||
201 | if ( pDoc ) | ||||
202 | { | ||||
203 | OUString sFileName = pDoc->getDocAccTitle(); | ||||
204 | if ( sFileName.isEmpty() ) | ||||
205 | { | ||||
206 | SwDocShell* pDocSh = pDoc->GetDocShell(); | ||||
207 | if ( pDocSh ) | ||||
208 | { | ||||
209 | sFileName = pDocSh->GetTitle( SFX_TITLE_APINAME3 ); | ||||
210 | } | ||||
211 | } | ||||
212 | |||||
213 | if ( !sFileName.isEmpty() ) | ||||
214 | { | ||||
215 | sAccName = sFileName + " - " + sAccName; | ||||
216 | } | ||||
217 | } | ||||
218 | |||||
219 | return sAccName; | ||||
220 | } | ||||
221 | |||||
222 | awt::Rectangle SAL_CALL SwAccessibleDocumentBase::getBounds() | ||||
223 | { | ||||
224 | try | ||||
225 | { | ||||
226 | SolarMutexGuard aGuard; | ||||
227 | |||||
228 | vcl::Window *pWin = GetWindow(); | ||||
229 | if (!pWin) | ||||
230 | { | ||||
231 | throw uno::RuntimeException("no Window", static_cast<cppu::OWeakObject*>(this)); | ||||
232 | } | ||||
233 | |||||
234 | tools::Rectangle aPixBounds( pWin->GetWindowExtentsRelative( pWin->GetAccessibleParentWindow() ) ); | ||||
235 | awt::Rectangle aBox( aPixBounds.Left(), aPixBounds.Top(), | ||||
236 | aPixBounds.GetWidth(), aPixBounds.GetHeight() ); | ||||
237 | |||||
238 | return aBox; | ||||
239 | } | ||||
240 | catch(const css::lang::IndexOutOfBoundsException &) | ||||
241 | { | ||||
242 | return awt::Rectangle(); | ||||
243 | } | ||||
244 | } | ||||
245 | |||||
246 | awt::Point SAL_CALL SwAccessibleDocumentBase::getLocation() | ||||
247 | { | ||||
248 | SolarMutexGuard aGuard; | ||||
249 | |||||
250 | vcl::Window *pWin = GetWindow(); | ||||
251 | if (!pWin) | ||||
252 | { | ||||
253 | throw uno::RuntimeException("no Window", static_cast<cppu::OWeakObject*>(this)); | ||||
254 | } | ||||
255 | |||||
256 | Point aPixPos( pWin->GetWindowExtentsRelative( pWin->GetAccessibleParentWindow() ).TopLeft() ); | ||||
257 | awt::Point aLoc( aPixPos.getX(), aPixPos.getY() ); | ||||
258 | |||||
259 | return aLoc; | ||||
260 | } | ||||
261 | |||||
262 | css::awt::Point SAL_CALL SwAccessibleDocumentBase::getLocationOnScreen() | ||||
263 | { | ||||
264 | SolarMutexGuard aGuard; | ||||
265 | |||||
266 | vcl::Window *pWin = GetWindow(); | ||||
267 | if (!pWin) | ||||
268 | { | ||||
269 | throw uno::RuntimeException("no Window", static_cast<cppu::OWeakObject*>(this)); | ||||
270 | } | ||||
271 | |||||
272 | Point aPixPos( pWin->GetWindowExtentsRelative( nullptr ).TopLeft() ); | ||||
273 | awt::Point aLoc( aPixPos.getX(), aPixPos.getY() ); | ||||
274 | |||||
275 | return aLoc; | ||||
276 | } | ||||
277 | |||||
278 | css::awt::Size SAL_CALL SwAccessibleDocumentBase::getSize() | ||||
279 | { | ||||
280 | SolarMutexGuard aGuard; | ||||
281 | |||||
282 | vcl::Window *pWin = GetWindow(); | ||||
283 | if (!pWin) | ||||
284 | { | ||||
285 | throw uno::RuntimeException("no Window", static_cast<cppu::OWeakObject*>(this)); | ||||
286 | } | ||||
287 | |||||
288 | Size aPixSize( pWin->GetWindowExtentsRelative( nullptr ).GetSize() ); | ||||
289 | awt::Size aSize( aPixSize.Width(), aPixSize.Height() ); | ||||
290 | |||||
291 | return aSize; | ||||
292 | } | ||||
293 | |||||
294 | sal_Bool SAL_CALL SwAccessibleDocumentBase::containsPoint( | ||||
295 | const awt::Point& aPoint ) | ||||
296 | { | ||||
297 | SolarMutexGuard aGuard; | ||||
298 | |||||
299 | vcl::Window *pWin = GetWindow(); | ||||
300 | if (!pWin) | ||||
301 | { | ||||
302 | throw uno::RuntimeException("no Window", static_cast<cppu::OWeakObject*>(this)); | ||||
303 | } | ||||
304 | |||||
305 | tools::Rectangle aPixBounds( pWin->GetWindowExtentsRelative( nullptr ) ); | ||||
306 | aPixBounds.Move(-aPixBounds.Left(), -aPixBounds.Top()); | ||||
307 | |||||
308 | Point aPixPoint( aPoint.X, aPoint.Y ); | ||||
309 | return aPixBounds.IsInside( aPixPoint ); | ||||
310 | } | ||||
311 | |||||
312 | uno::Reference< XAccessible > SAL_CALL SwAccessibleDocumentBase::getAccessibleAtPoint( | ||||
313 | const awt::Point& aPoint ) | ||||
314 | { | ||||
315 | SolarMutexGuard aGuard; | ||||
316 | |||||
317 | if( mpChildWin ) | ||||
318 | { | ||||
319 | ThrowIfDisposed(); | ||||
320 | |||||
321 | vcl::Window *pWin = GetWindow(); | ||||
322 | if (!pWin) | ||||
323 | { | ||||
324 | throw uno::RuntimeException("no Window", static_cast<cppu::OWeakObject*>(this)); | ||||
325 | } | ||||
326 | |||||
327 | Point aPixPoint( aPoint.X, aPoint.Y ); // px rel to window | ||||
328 | if( mpChildWin->GetWindowExtentsRelative( pWin ).IsInside( aPixPoint ) ) | ||||
329 | return mpChildWin->GetAccessible(); | ||||
330 | } | ||||
331 | |||||
332 | return SwAccessibleContext::getAccessibleAtPoint( aPoint ); | ||||
333 | } | ||||
334 | |||||
335 | // SwAccessibleDocument | ||||
336 | |||||
337 | void SwAccessibleDocument::GetStates( | ||||
338 | ::utl::AccessibleStateSetHelper& rStateSet ) | ||||
339 | { | ||||
340 | SwAccessibleContext::GetStates( rStateSet ); | ||||
341 | |||||
342 | // MULTISELECTABLE | ||||
343 | rStateSet.AddState( AccessibleStateType::MULTI_SELECTABLE ); | ||||
344 | rStateSet.AddState( AccessibleStateType::MANAGES_DESCENDANTS ); | ||||
345 | } | ||||
346 | |||||
347 | SwAccessibleDocument::SwAccessibleDocument( | ||||
348 | std::shared_ptr<SwAccessibleMap> const& pInitMap) | ||||
349 | : SwAccessibleDocumentBase(pInitMap) | ||||
350 | , maSelectionHelper(*this) | ||||
351 | { | ||||
352 | SetName(pInitMap->GetDocName()); | ||||
353 | vcl::Window *pWin = pInitMap->GetShell()->GetWin(); | ||||
354 | if( pWin ) | ||||
355 | { | ||||
356 | pWin->AddChildEventListener( LINK( this, SwAccessibleDocument, WindowChildEventListener )::tools::detail::makeLink( ::tools::detail::castTo<SwAccessibleDocument *>(this), &SwAccessibleDocument::LinkStubWindowChildEventListener )); | ||||
357 | sal_uInt16 nCount = pWin->GetChildCount(); | ||||
358 | for( sal_uInt16 i=0; i < nCount; i++ ) | ||||
359 | { | ||||
360 | vcl::Window* pChildWin = pWin->GetChild( i ); | ||||
361 | if( pChildWin && | ||||
362 | AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() ) | ||||
363 | AddChild( pChildWin, false ); | ||||
364 | } | ||||
365 | } | ||||
366 | } | ||||
367 | |||||
368 | SwAccessibleDocument::~SwAccessibleDocument() | ||||
369 | { | ||||
370 | vcl::Window *pWin = GetMap() ? GetMap()->GetShell()->GetWin() : nullptr; | ||||
371 | if( pWin ) | ||||
372 | pWin->RemoveChildEventListener( LINK( this, SwAccessibleDocument, WindowChildEventListener )::tools::detail::makeLink( ::tools::detail::castTo<SwAccessibleDocument *>(this), &SwAccessibleDocument::LinkStubWindowChildEventListener )); | ||||
373 | } | ||||
374 | |||||
375 | void SwAccessibleDocument::Dispose(bool bRecursive, bool bCanSkipInvisible) | ||||
376 | { | ||||
377 | OSL_ENSURE( GetFrame() && GetMap(), "already disposed" )do { if (true && (!(GetFrame() && GetMap()))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/home/maarten/src/libreoffice/core/sw/source/core/access/accdoc.cxx" ":" "377" ": "), "%s", "already disposed"); } } while (false ); | ||||
378 | |||||
379 | vcl::Window *pWin = GetMap() ? GetMap()->GetShell()->GetWin() : nullptr; | ||||
380 | if( pWin ) | ||||
381 | pWin->RemoveChildEventListener( LINK( this, SwAccessibleDocument, WindowChildEventListener )::tools::detail::makeLink( ::tools::detail::castTo<SwAccessibleDocument *>(this), &SwAccessibleDocument::LinkStubWindowChildEventListener )); | ||||
382 | SwAccessibleContext::Dispose(bRecursive, bCanSkipInvisible); | ||||
383 | } | ||||
384 | |||||
385 | IMPL_LINK( SwAccessibleDocument, WindowChildEventListener, VclWindowEvent&, rEvent, void )void SwAccessibleDocument::LinkStubWindowChildEventListener(void * instance, VclWindowEvent& data) { return static_cast< SwAccessibleDocument *>(instance)->WindowChildEventListener (data); } void SwAccessibleDocument::WindowChildEventListener (VclWindowEvent& rEvent) | ||||
386 | { | ||||
387 | OSL_ENSURE( rEvent.GetWindow(), "Window???" )do { if (true && (!(rEvent.GetWindow()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/home/maarten/src/libreoffice/core/sw/source/core/access/accdoc.cxx" ":" "387" ": "), "%s", "Window???"); } } while (false); | ||||
388 | switch ( rEvent.GetId() ) | ||||
389 | { | ||||
390 | case VclEventId::WindowShow: // send create on show for direct accessible children | ||||
391 | { | ||||
392 | vcl::Window* pChildWin = static_cast< vcl::Window* >( rEvent.GetData() ); | ||||
393 | if( pChildWin && AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() ) | ||||
394 | { | ||||
395 | AddChild( pChildWin ); | ||||
396 | } | ||||
397 | } | ||||
398 | break; | ||||
399 | case VclEventId::WindowHide: // send destroy on hide for direct accessible children | ||||
400 | { | ||||
401 | vcl::Window* pChildWin = static_cast< vcl::Window* >( rEvent.GetData() ); | ||||
402 | if( pChildWin && AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() ) | ||||
403 | { | ||||
404 | RemoveChild( pChildWin ); | ||||
405 | } | ||||
406 | } | ||||
407 | break; | ||||
408 | case VclEventId::ObjectDying: // send destroy on hide for direct accessible children | ||||
409 | { | ||||
410 | vcl::Window* pChildWin = rEvent.GetWindow(); | ||||
411 | if( pChildWin && AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() ) | ||||
412 | { | ||||
413 | RemoveChild( pChildWin ); | ||||
414 | } | ||||
415 | } | ||||
416 | break; | ||||
417 | default: break; | ||||
418 | } | ||||
419 | } | ||||
420 | |||||
421 | OUString SAL_CALL SwAccessibleDocument::getImplementationName() | ||||
422 | { | ||||
423 | return sImplementationName; | ||||
424 | } | ||||
425 | |||||
426 | sal_Bool SAL_CALL SwAccessibleDocument::supportsService(const OUString& sTestServiceName) | ||||
427 | { | ||||
428 | return cppu::supportsService(this, sTestServiceName); | ||||
429 | } | ||||
430 | |||||
431 | uno::Sequence< OUString > SAL_CALL SwAccessibleDocument::getSupportedServiceNames() | ||||
432 | { | ||||
433 | return { sServiceName, sAccessibleServiceName }; | ||||
434 | } | ||||
435 | |||||
436 | // XInterface | ||||
437 | |||||
438 | uno::Any SwAccessibleDocument::queryInterface( | ||||
439 | const uno::Type& rType ) | ||||
440 | { | ||||
441 | uno::Any aRet; | ||||
442 | if ( rType == cppu::UnoType<XAccessibleSelection>::get() ) | ||||
443 | { | ||||
444 | uno::Reference<XAccessibleSelection> aSelect = this; | ||||
445 | aRet <<= aSelect; | ||||
446 | } | ||||
447 | else if ( rType == cppu::UnoType<XAccessibleExtendedAttributes>::get()) | ||||
448 | { | ||||
449 | uno::Reference<XAccessibleExtendedAttributes> aAttribute = this; | ||||
450 | aRet <<= aAttribute; | ||||
451 | } | ||||
452 | else | ||||
453 | aRet = SwAccessibleContext::queryInterface( rType ); | ||||
454 | return aRet; | ||||
455 | } | ||||
456 | |||||
457 | // XTypeProvider | ||||
458 | uno::Sequence< uno::Type > SAL_CALL SwAccessibleDocument::getTypes() | ||||
459 | { | ||||
460 | return cppu::OTypeCollection( | ||||
461 | cppu::UnoType<XAccessibleSelection>::get(), | ||||
462 | SwAccessibleDocumentBase::getTypes() ).getTypes(); | ||||
463 | } | ||||
464 | |||||
465 | uno::Sequence< sal_Int8 > SAL_CALL SwAccessibleDocument::getImplementationId() | ||||
466 | { | ||||
467 | return css::uno::Sequence<sal_Int8>(); | ||||
468 | } | ||||
469 | |||||
470 | // XAccessibleSelection | ||||
471 | |||||
472 | void SwAccessibleDocument::selectAccessibleChild( | ||||
473 | sal_Int32 nChildIndex ) | ||||
474 | { | ||||
475 | maSelectionHelper.selectAccessibleChild(nChildIndex); | ||||
476 | } | ||||
477 | |||||
478 | sal_Bool SwAccessibleDocument::isAccessibleChildSelected( | ||||
479 | sal_Int32 nChildIndex ) | ||||
480 | { | ||||
481 | return maSelectionHelper.isAccessibleChildSelected(nChildIndex); | ||||
482 | } | ||||
483 | |||||
484 | void SwAccessibleDocument::clearAccessibleSelection( ) | ||||
485 | { | ||||
486 | } | ||||
487 | |||||
488 | void SwAccessibleDocument::selectAllAccessibleChildren( ) | ||||
489 | { | ||||
490 | maSelectionHelper.selectAllAccessibleChildren(); | ||||
491 | } | ||||
492 | |||||
493 | sal_Int32 SwAccessibleDocument::getSelectedAccessibleChildCount( ) | ||||
494 | { | ||||
495 | return maSelectionHelper.getSelectedAccessibleChildCount(); | ||||
496 | } | ||||
497 | |||||
498 | uno::Reference<XAccessible> SwAccessibleDocument::getSelectedAccessibleChild( | ||||
499 | sal_Int32 nSelectedChildIndex ) | ||||
500 | { | ||||
501 | return maSelectionHelper.getSelectedAccessibleChild(nSelectedChildIndex); | ||||
502 | } | ||||
503 | |||||
504 | // index has to be treated as global child index. | ||||
505 | void SwAccessibleDocument::deselectAccessibleChild( | ||||
506 | sal_Int32 nChildIndex ) | ||||
507 | { | ||||
508 | maSelectionHelper.deselectAccessibleChild( nChildIndex ); | ||||
509 | } | ||||
510 | |||||
511 | uno::Any SAL_CALL SwAccessibleDocument::getExtendedAttributes() | ||||
512 | { | ||||
513 | SolarMutexGuard g; | ||||
514 | |||||
515 | uno::Any anyAttribute; | ||||
516 | SwDoc *pDoc = GetMap() ? GetShell()->GetDoc() : nullptr; | ||||
| |||||
517 | |||||
518 | if (!pDoc) | ||||
519 | return anyAttribute; | ||||
520 | SwCursorShell* pCursorShell = GetCursorShell(); | ||||
521 | if( !pCursorShell ) | ||||
522 | return anyAttribute; | ||||
523 | |||||
524 | SwFEShell* pFEShell = dynamic_cast<const SwFEShell*>( pCursorShell) != nullptr | ||||
525 | ? static_cast<SwFEShell*>( pCursorShell ) | ||||
526 | : nullptr; | ||||
527 | if( pFEShell
| ||||
528 | { | ||||
529 | OUString sDisplay; | ||||
530 | sal_uInt16 nPage, nLogPage; | ||||
531 | pFEShell->GetPageNumber(-1,true,nPage,nLogPage,sDisplay); | ||||
532 | |||||
533 | OUString sValue = "page-name:" + sDisplay + | ||||
534 | ";page-number:" + | ||||
535 | OUString::number( nPage ) + | ||||
536 | ";total-pages:" + | ||||
537 | OUString::number( pCursorShell->GetPageCnt() ) + ";"; | ||||
538 | |||||
539 | SwContentFrame* pCurrFrame = pCursorShell->GetCurrFrame(); | ||||
540 | SwPageFrame* pCurrPage=static_cast<SwFrame*>(pCurrFrame)->FindPageFrame(); | ||||
541 | sal_uLong nLineNum = 0; | ||||
542 | SwTextFrame* pTextFrame = nullptr; | ||||
543 | SwTextFrame* pCurrTextFrame = nullptr; | ||||
544 | pTextFrame = static_cast< SwTextFrame* >(pCurrPage->ContainsContent()); | ||||
545 | if (pCurrFrame->IsInFly())//such as, graphic,chart | ||||
546 | { | ||||
547 | SwFlyFrame *pFlyFrame = pCurrFrame->FindFlyFrame(); | ||||
548 | const SwFormatAnchor& rAnchor = pFlyFrame->GetFormat()->GetAnchor(); | ||||
549 | RndStdIds eAnchorId = rAnchor.GetAnchorId(); | ||||
550 | if(eAnchorId == RndStdIds::FLY_AS_CHAR) | ||||
551 | { | ||||
552 | const SwFrame *pSwFrame = pFlyFrame->GetAnchorFrame(); | ||||
553 | if(pSwFrame->IsTextFrame()) | ||||
554 | pCurrTextFrame = const_cast<SwTextFrame*>(static_cast<const SwTextFrame*>(pSwFrame)); | ||||
555 | } | ||||
556 | } | ||||
557 | else | ||||
558 | { | ||||
559 | assert(dynamic_cast<SwTextFrame*>(pCurrFrame))(static_cast <bool> (dynamic_cast<SwTextFrame*>(pCurrFrame )) ? void (0) : __assert_fail ("dynamic_cast<SwTextFrame*>(pCurrFrame)" , "/home/maarten/src/libreoffice/core/sw/source/core/access/accdoc.cxx" , 559, __extension__ __PRETTY_FUNCTION__)); | ||||
560 | pCurrTextFrame = static_cast<SwTextFrame* >(pCurrFrame); | ||||
561 | } | ||||
562 | //check whether the text frame where the Graph/OLE/Frame anchored is in the Header/Footer | ||||
563 | SwFrame* pFrame = pCurrTextFrame; | ||||
564 | while ( pFrame
| ||||
565 | pFrame = pFrame->GetUpper(); | ||||
566 | if ( pFrame
| ||||
567 | pCurrTextFrame = nullptr; | ||||
568 | //check shape | ||||
569 | if(pCursorShell->Imp()->GetDrawView()) | ||||
570 | { | ||||
571 | const SdrMarkList &rMrkList = pCursorShell->Imp()->GetDrawView()->GetMarkedObjectList(); | ||||
572 | for ( size_t i = 0; i < rMrkList.GetMarkCount(); ++i ) | ||||
573 | { | ||||
574 | SdrObject *pObj = rMrkList.GetMark(i)->GetMarkedSdrObj(); | ||||
575 | SwFrameFormat* pFormat = static_cast<SwDrawContact*>(pObj->GetUserCall())->GetFormat(); | ||||
576 | const SwFormatAnchor& rAnchor = pFormat->GetAnchor(); | ||||
577 | if( RndStdIds::FLY_AS_CHAR != rAnchor.GetAnchorId() ) | ||||
578 | pCurrTextFrame = nullptr; | ||||
579 | } | ||||
580 | } | ||||
581 | //calculate line number | ||||
582 | if (pCurrTextFrame
| ||||
583 | { | ||||
584 | if (!(pCurrTextFrame->IsInTab() || pCurrTextFrame->IsInFootnote())) | ||||
585 | { | ||||
586 | while( pTextFrame != pCurrTextFrame ) | ||||
587 | { | ||||
588 | //check header/footer | ||||
589 | pFrame = pTextFrame; | ||||
590 | while ( pFrame && !pFrame->IsHeaderFrame() && !pFrame->IsFooterFrame() ) | ||||
591 | pFrame = pFrame->GetUpper(); | ||||
592 | if ( pFrame ) | ||||
593 | { | ||||
594 | pTextFrame = static_cast< SwTextFrame*>(pTextFrame->GetNextContentFrame()); | ||||
595 | continue; | ||||
596 | } | ||||
597 | if (!(pTextFrame->IsInTab() || pTextFrame->IsInFootnote() || pTextFrame->IsInFly())) | ||||
598 | nLineNum += pTextFrame->GetThisLines(); | ||||
599 | pTextFrame = static_cast< SwTextFrame* >(pTextFrame ->GetNextContentFrame()); | ||||
600 | } | ||||
601 | SwPaM* pCaret = pCursorShell->GetCursor(); | ||||
602 | if (!pCurrTextFrame->IsEmpty() && pCaret) | ||||
603 | { | ||||
604 | assert(pCurrTextFrame->IsTextFrame())(static_cast <bool> (pCurrTextFrame->IsTextFrame()) ? void (0) : __assert_fail ("pCurrTextFrame->IsTextFrame()" , "/home/maarten/src/libreoffice/core/sw/source/core/access/accdoc.cxx" , 604, __extension__ __PRETTY_FUNCTION__)); | ||||
605 | const SwPosition* pPoint = nullptr; | ||||
606 | if (pCurrTextFrame->IsInFly()) | ||||
607 | { | ||||
608 | SwFlyFrame *pFlyFrame = pCurrTextFrame->FindFlyFrame(); | ||||
609 | const SwFormatAnchor& rAnchor = pFlyFrame->GetFormat()->GetAnchor(); | ||||
610 | pPoint = rAnchor.GetContentAnchor(); | ||||
611 | SwContentNode *const pNode(pPoint->nNode.GetNode().GetContentNode()); | ||||
612 | pCurrTextFrame = pNode | ||||
613 | ? static_cast<SwTextFrame*>(pNode->getLayoutFrame( | ||||
614 | pCurrTextFrame->getRootFrame(), pPoint)) | ||||
615 | : nullptr; | ||||
616 | } | ||||
617 | else | ||||
618 | pPoint = pCaret->GetPoint(); | ||||
619 | if (pCurrTextFrame) | ||||
620 | { | ||||
621 | TextFrameIndex const nActPos(pCurrTextFrame->MapModelToViewPos(*pPoint)); | ||||
622 | nLineNum += pCurrTextFrame->GetLineCount( nActPos ); | ||||
623 | } | ||||
624 | } | ||||
625 | else | ||||
626 | ++nLineNum; | ||||
627 | } | ||||
628 | } | ||||
629 | |||||
630 | sValue += "line-number:" + OUString::number( nLineNum ) + ";"; | ||||
631 | |||||
632 | SwFrame* pCurrCol=static_cast<SwFrame*>(pCurrFrame)->FindColFrame(); | ||||
633 | |||||
634 | sValue += "column-number:"; | ||||
635 | |||||
636 | int nCurrCol = 1; | ||||
637 | if(pCurrCol!=nullptr) | ||||
638 | { | ||||
639 | //SwLayoutFrame* pParent = pCurrCol->GetUpper(); | ||||
640 | SwFrame* pCurrPageCol=static_cast<SwFrame*>(pCurrFrame)->FindColFrame(); | ||||
641 | while(pCurrPageCol && pCurrPageCol->GetUpper() && pCurrPageCol->GetUpper()->IsPageFrame()) | ||||
642 | { | ||||
643 | pCurrPageCol = pCurrPageCol->GetUpper(); | ||||
644 | } | ||||
645 | |||||
646 | SwLayoutFrame* pParent = pCurrPageCol->GetUpper(); | ||||
| |||||
647 | |||||
648 | if(pParent!=nullptr) | ||||
649 | { | ||||
650 | SwFrame* pCol = pParent->Lower(); | ||||
651 | while(pCol&&(pCol!=pCurrPageCol)) | ||||
652 | { | ||||
653 | pCol = pCol->GetNext(); | ||||
654 | ++nCurrCol; | ||||
655 | } | ||||
656 | } | ||||
657 | } | ||||
658 | sValue += OUString::number( nCurrCol ) + ";"; | ||||
659 | |||||
660 | const SwFormatCol &rFormatCol=pCurrPage->GetAttrSet()->GetCol(); | ||||
661 | sal_uInt16 nColCount=rFormatCol.GetNumCols(); | ||||
662 | nColCount = nColCount>0?nColCount:1; | ||||
663 | sValue += "total-columns:" + OUString::number( nColCount ) + ";"; | ||||
664 | |||||
665 | SwSectionFrame* pCurrSctFrame=static_cast<SwFrame*>(pCurrFrame)->FindSctFrame(); | ||||
666 | if(pCurrSctFrame!=nullptr && pCurrSctFrame->GetSection()!=nullptr ) | ||||
667 | { | ||||
668 | OUString sectionName = pCurrSctFrame->GetSection()->GetSectionName(); | ||||
669 | |||||
670 | sectionName = sectionName.replaceFirst( "\\" , "\\\\" ); | ||||
671 | sectionName = sectionName.replaceFirst( "=" , "\\=" ); | ||||
672 | sectionName = sectionName.replaceFirst( ";" , "\\;" ); | ||||
673 | sectionName = sectionName.replaceFirst( "," , "\\," ); | ||||
674 | sectionName = sectionName.replaceFirst( ":" , "\\:" ); | ||||
675 | |||||
676 | sValue += "section-name:" + sectionName + ";"; | ||||
677 | |||||
678 | //section-columns-number | ||||
679 | |||||
680 | nCurrCol = 1; | ||||
681 | |||||
682 | if(pCurrCol!=nullptr) | ||||
683 | { | ||||
684 | SwLayoutFrame* pParent = pCurrCol->GetUpper(); | ||||
685 | if(pParent!=nullptr) | ||||
686 | { | ||||
687 | SwFrame* pCol = pParent->Lower(); | ||||
688 | while(pCol&&(pCol!=pCurrCol)) | ||||
689 | { | ||||
690 | pCol = pCol->GetNext(); | ||||
691 | nCurrCol +=1; | ||||
692 | } | ||||
693 | } | ||||
694 | } | ||||
695 | sValue += "section-columns-number:" + | ||||
696 | OUString::number( nCurrCol ) + ";"; | ||||
697 | |||||
698 | //section-total-columns | ||||
699 | const SwFormatCol &rFormatSctCol=pCurrSctFrame->GetAttrSet()->GetCol(); | ||||
700 | sal_uInt16 nSctColCount=rFormatSctCol.GetNumCols(); | ||||
701 | nSctColCount = nSctColCount>0?nSctColCount:1; | ||||
702 | sValue += "section-total-columns:" + | ||||
703 | OUString::number( nSctColCount ) + ";"; | ||||
704 | } | ||||
705 | |||||
706 | anyAttribute <<= sValue; | ||||
707 | } | ||||
708 | return anyAttribute; | ||||
709 | } | ||||
710 | |||||
711 | sal_Int32 SAL_CALL SwAccessibleDocument::getBackground() | ||||
712 | { | ||||
713 | SolarMutexGuard aGuard; | ||||
714 | return sal_Int32(SW_MOD()( static_cast<SwModule*>(SfxApplication::GetModule(SfxToolsModule ::Writer)))->GetColorConfig().GetColorValue( ::svtools::DOCCOLOR ).nColor); | ||||
715 | } | ||||
716 | |||||
717 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |
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 | #ifndef INCLUDED_SW_SOURCE_CORE_INC_FRAME_HXX |
21 | #define INCLUDED_SW_SOURCE_CORE_INC_FRAME_HXX |
22 | |
23 | #include <drawinglayer/primitive2d/baseprimitive2d.hxx> |
24 | #include <editeng/borderline.hxx> |
25 | #include <svl/poolitem.hxx> |
26 | #include <swtypes.hxx> |
27 | #include <swrect.hxx> |
28 | #include <calbck.hxx> |
29 | #include <svl/SfxBroadcaster.hxx> |
30 | #include <o3tl/typed_flags_set.hxx> |
31 | #include <com/sun/star/style/TabStop.hpp> |
32 | #include <basegfx/matrix/b2dhommatrix.hxx> |
33 | #include <vcl/outdev.hxx> |
34 | |
35 | #include <memory> |
36 | |
37 | namespace drawinglayer::processor2d { class BaseProcessor2D; } |
38 | |
39 | class SwLayoutFrame; |
40 | class SwRootFrame; |
41 | class SwPageFrame; |
42 | class SwBodyFrame; |
43 | class SwFlyFrame; |
44 | class SwSectionFrame; |
45 | class SwFootnoteFrame; |
46 | class SwFootnoteBossFrame; |
47 | class SwTabFrame; |
48 | class SwRowFrame; |
49 | class SwContentFrame; |
50 | class SwAttrSet; |
51 | class Color; |
52 | class SwBorderAttrs; |
53 | class SwCache; |
54 | class SvxBrushItem; |
55 | class SvxFormatBreakItem; |
56 | class SwFormatPageDesc; |
57 | class SwSelectionList; |
58 | struct SwPosition; |
59 | struct SwCursorMoveState; |
60 | class SwFormat; |
61 | class SwPrintData; |
62 | class SwSortedObjs; |
63 | class SwAnchoredObject; |
64 | enum class SvxFrameDirection; |
65 | class IDocumentDrawModelAccess; |
66 | |
67 | // Each FrameType is represented here as a bit. |
68 | // The bits must be set in a way that it can be determined with masking of |
69 | // which kind of FrameType an instance is _and_ from what classes it was derived. |
70 | // Each frame has in its base class a member that must be set by the |
71 | // constructors accordingly. |
72 | enum class SwFrameType |
73 | { |
74 | None = 0x0000, |
75 | Root = 0x0001, |
76 | Page = 0x0002, |
77 | Column = 0x0004, |
78 | Header = 0x0008, |
79 | Footer = 0x0010, |
80 | FtnCont = 0x0020, |
81 | Ftn = 0x0040, |
82 | Body = 0x0080, |
83 | Fly = 0x0100, |
84 | Section = 0x0200, |
85 | // UNUSED 0x0400 |
86 | Tab = 0x0800, |
87 | Row = 0x1000, |
88 | Cell = 0x2000, |
89 | Txt = 0x4000, |
90 | NoTxt = 0x8000, |
91 | }; |
92 | |
93 | namespace o3tl |
94 | { |
95 | template<> struct typed_flags<SwFrameType> : is_typed_flags<SwFrameType, 0xfbff> {}; |
96 | }; |
97 | |
98 | // for internal use some common combinations |
99 | #define FRM_LAYOUTSwFrameType(0x3bFF) SwFrameType(0x3bFF) |
100 | #define FRM_ALLSwFrameType(0xfbff) SwFrameType(0xfbff) |
101 | #define FRM_CNTNT(SwFrameType::Txt | SwFrameType::NoTxt) (SwFrameType::Txt | SwFrameType::NoTxt) |
102 | #define FRM_FTNBOSS(SwFrameType::Page | SwFrameType::Column) (SwFrameType::Page | SwFrameType::Column) |
103 | #define FRM_ACCESSIBLE(SwFrameType::Root | SwFrameType::Page | SwFrameType::Header | SwFrameType::Footer | SwFrameType::Ftn | SwFrameType::Fly | SwFrameType ::Tab | SwFrameType::Cell | SwFrameType::Txt) (SwFrameType::Root | SwFrameType::Page | SwFrameType::Header | SwFrameType::Footer | SwFrameType::Ftn | SwFrameType::Fly | SwFrameType::Tab | SwFrameType::Cell | SwFrameType::Txt) |
104 | #define FRM_NEIGHBOUR(SwFrameType::Column | SwFrameType::Cell) (SwFrameType::Column | SwFrameType::Cell) |
105 | #define FRM_NOTE_VERT(SwFrameType::FtnCont | SwFrameType::Ftn | SwFrameType::Section | SwFrameType::Tab | SwFrameType::Row | SwFrameType::Cell | SwFrameType ::Txt) (SwFrameType::FtnCont | SwFrameType::Ftn | SwFrameType::Section | SwFrameType::Tab | SwFrameType::Row | SwFrameType::Cell | SwFrameType::Txt) |
106 | #define FRM_HEADFOOT(SwFrameType::Header | SwFrameType::Footer) (SwFrameType::Header | SwFrameType::Footer) |
107 | #define FRM_BODYFTNC(SwFrameType::FtnCont | SwFrameType::Body) (SwFrameType::FtnCont | SwFrameType::Body) |
108 | |
109 | // for GetNextLeaf/GetPrevLeaf. |
110 | enum MakePageType |
111 | { |
112 | MAKEPAGE_NONE, // do not create page/footnote |
113 | MAKEPAGE_APPEND, // only append page if needed |
114 | MAKEPAGE_INSERT, // add or append page if needed |
115 | MAKEPAGE_FTN, // add footnote if needed |
116 | MAKEPAGE_NOSECTION // Don't create section frames |
117 | }; |
118 | |
119 | namespace drawinglayer::attribute { |
120 | class SdrAllFillAttributesHelper; |
121 | typedef std::shared_ptr< SdrAllFillAttributesHelper > SdrAllFillAttributesHelperPtr; |
122 | } |
123 | |
124 | /// Helper class to isolate geometry-defining members of SwFrame |
125 | /// and to control their accesses. Moved to own class to have no |
126 | /// hidden accesses to 'private' members anymore. |
127 | /// |
128 | /// Added most important flags about the state of this geometric |
129 | /// information and if it is valid or not |
130 | class SAL_DLLPUBLIC_RTTI__attribute__ ((type_visibility("default"))) SwFrameAreaDefinition |
131 | { |
132 | private: |
133 | friend void FriendHackInvalidateRowFrame(SwFrameAreaDefinition &); |
134 | |
135 | // The absolute position and size of the SwFrame in the document. |
136 | // This values are set by the layouter implementations |
137 | SwRect maFrameArea; |
138 | |
139 | // The 'inner' Frame Area defined by a SwRect relative to FrameArea: |
140 | // When identical to FrameArea, Pos() will be (0, 0) and Size identical. |
141 | SwRect maFramePrintArea; |
142 | |
143 | // bitfield |
144 | bool mbFrameAreaPositionValid : 1; |
145 | bool mbFrameAreaSizeValid : 1; |
146 | bool mbFramePrintAreaValid : 1; |
147 | |
148 | // #i65250# |
149 | // frame ID is now in general available - used for layout loop control |
150 | static sal_uInt32 mnLastFrameId; |
151 | const sal_uInt32 mnFrameId; |
152 | |
153 | protected: |
154 | // write access to mb*Valid flags |
155 | void setFrameAreaPositionValid(bool bNew); |
156 | void setFrameAreaSizeValid(bool bNew); |
157 | void setFramePrintAreaValid(bool bNew); |
158 | |
159 | public: |
160 | SwFrameAreaDefinition(); |
161 | virtual ~SwFrameAreaDefinition(); |
162 | |
163 | // read access to mb*Valid flags |
164 | bool isFrameAreaPositionValid() const { return mbFrameAreaPositionValid; } |
165 | bool isFrameAreaSizeValid() const { return mbFrameAreaSizeValid; } |
166 | bool isFramePrintAreaValid() const { return mbFramePrintAreaValid; } |
167 | |
168 | // syntactic sugar: test whole FrameAreaDefinition |
169 | bool isFrameAreaDefinitionValid() const { return isFrameAreaPositionValid() && isFrameAreaSizeValid() && isFramePrintAreaValid(); } |
170 | |
171 | // #i65250# |
172 | sal_uInt32 GetFrameId() const { return mnFrameId; } |
173 | |
174 | // read accesses to FrameArea definitions - only const access allowed. |
175 | // Do *not* const_cast results, it is necessary to track changes. use |
176 | // the below offered WriteAccess helper classes instead |
177 | const SwRect& getFrameArea() const { return maFrameArea; } |
178 | const SwRect& getFramePrintArea() const { return maFramePrintArea; } |
179 | |
180 | // helper class(es) for FrameArea manipulation. These |
181 | // have to be used to apply changes to FrameAreas. They hold a copy of the |
182 | // SwRect for manipulation. It gets written back at destruction. Thus, this |
183 | // mechanism depends on scope usage, take care. It prevents errors using |
184 | // different instances of SwFrame in get/set methods which is more safe |
185 | class FrameAreaWriteAccess : public SwRect |
186 | { |
187 | private: |
188 | SwFrameAreaDefinition& mrTarget; |
189 | |
190 | FrameAreaWriteAccess(const FrameAreaWriteAccess&) = delete; |
191 | FrameAreaWriteAccess& operator=(const FrameAreaWriteAccess&) = delete; |
192 | |
193 | public: |
194 | FrameAreaWriteAccess(SwFrameAreaDefinition& rTarget) : SwRect(rTarget.getFrameArea()), mrTarget(rTarget) {} |
195 | ~FrameAreaWriteAccess(); |
196 | void setSwRect(const SwRect& rNew) { *reinterpret_cast< SwRect* >(this) = rNew; } |
197 | }; |
198 | |
199 | // same helper for FramePrintArea |
200 | class FramePrintAreaWriteAccess : public SwRect |
201 | { |
202 | private: |
203 | SwFrameAreaDefinition& mrTarget; |
204 | |
205 | FramePrintAreaWriteAccess(const FramePrintAreaWriteAccess&) = delete; |
206 | FramePrintAreaWriteAccess& operator=(const FramePrintAreaWriteAccess&) = delete; |
207 | |
208 | public: |
209 | FramePrintAreaWriteAccess(SwFrameAreaDefinition& rTarget) : SwRect(rTarget.getFramePrintArea()), mrTarget(rTarget) {} |
210 | ~FramePrintAreaWriteAccess(); |
211 | void setSwRect(const SwRect& rNew) { *reinterpret_cast< SwRect* >(this) = rNew; } |
212 | }; |
213 | |
214 | // RotateFlyFrame3 - Support for Transformations |
215 | // Hand out the Transformations for the current FrameAreaDefinition |
216 | // for the FrameArea and FramePrintArea. |
217 | // FramePrintArea is not relative to FrameArea in this |
218 | // transformation representation (to make it easier to use and understand). |
219 | // There is no 'set' method since SwFrame is a layout object. For |
220 | // some cases rotation will be included (used for SwGrfNode in inner |
221 | // SwFrame of a SwFlyFrame) |
222 | virtual basegfx::B2DHomMatrix getFrameAreaTransformation() const; |
223 | virtual basegfx::B2DHomMatrix getFramePrintAreaTransformation() const; |
224 | |
225 | // RotateFlyFrame3 - Support for Transformations |
226 | // Modify current transformations by applying given translation |
227 | virtual void transform_translate(const Point& rOffset); |
228 | }; |
229 | |
230 | /// RotateFlyFrame3: Helper class when you want to make your SwFrame derivate |
231 | /// transformable. It provides some tooling to do so. To use, add as member |
232 | /// (see e.g. SwFlyFreeFrame which uses 'std::unique_ptr< TransformableSwFrame >') |
233 | class TransformableSwFrame |
234 | { |
235 | private: |
236 | // The SwFrameAreaDefinition to work on |
237 | SwFrameAreaDefinition& mrSwFrameAreaDefinition; |
238 | |
239 | // FrameAreaTransformation and FramePrintAreaTransformation |
240 | // !identity when needed (translate/scale is used (e.g. rotation)) |
241 | basegfx::B2DHomMatrix maFrameAreaTransformation; |
242 | basegfx::B2DHomMatrix maFramePrintAreaTransformation; |
243 | |
244 | public: |
245 | TransformableSwFrame(SwFrameAreaDefinition& rSwFrameAreaDefinition) |
246 | : mrSwFrameAreaDefinition(rSwFrameAreaDefinition), |
247 | maFrameAreaTransformation(), |
248 | maFramePrintAreaTransformation() |
249 | { |
250 | } |
251 | |
252 | // get SwFrameArea in transformation form |
253 | const basegfx::B2DHomMatrix& getLocalFrameAreaTransformation() const |
254 | { |
255 | return maFrameAreaTransformation; |
256 | } |
257 | |
258 | // get SwFramePrintArea in transformation form |
259 | const basegfx::B2DHomMatrix& getLocalFramePrintAreaTransformation() const |
260 | { |
261 | return maFramePrintAreaTransformation; |
262 | } |
263 | |
264 | // Helpers to re-create the untransformed SwRect(s) originally |
265 | // in the SwFrameAreaDefinition, based on the current Transformations. |
266 | SwRect getUntransformedFrameArea() const; |
267 | SwRect getUntransformedFramePrintArea() const; |
268 | |
269 | // Helper method to re-create FrameAreaTransformations based on the |
270 | // current FrameAreaDefinition transformed by given rotation and Center |
271 | void createFrameAreaTransformations( |
272 | double fRotation, |
273 | const basegfx::B2DPoint& rCenter); |
274 | |
275 | // Tooling method to reset the SwRect(s) in the current |
276 | // SwFrameAreaDefinition which are already adapted to |
277 | // Transformation back to the untransformed state, using |
278 | // the getUntransformedFrame*Area calls above when needed. |
279 | // Only the SwRect(s) are changed back, not the transformations. |
280 | void restoreFrameAreas(); |
281 | |
282 | // Re-Creates the SwRect(s) as BoundAreas based on the current |
283 | // set Transformations. |
284 | void adaptFrameAreasToTransformations(); |
285 | |
286 | // Modify current definitions by applying the given transformation |
287 | void transform(const basegfx::B2DHomMatrix& aTransform); |
288 | }; |
289 | |
290 | /** |
291 | * Base class of the Writer layout elements. |
292 | * |
293 | * This includes not only fly frames, but everything down to the paragraph |
294 | * level: pages, headers, footers, etc. (Inside a paragraph SwLinePortion |
295 | * instances are used.) |
296 | */ |
297 | class SW_DLLPUBLIC__attribute__ ((visibility("default"))) SwFrame : public SwFrameAreaDefinition, public SwClient, public SfxBroadcaster |
298 | { |
299 | // the hidden Frame |
300 | friend class SwFlowFrame; |
301 | friend class SwLayoutFrame; |
302 | friend class SwLooping; |
303 | friend class SwDeletionChecker; // for GetDep() |
304 | |
305 | // voids lower during creation of a column |
306 | friend SwFrame *SaveContent( SwLayoutFrame *, SwFrame* pStart ); |
307 | friend void RestoreContent( SwFrame *, SwLayoutFrame *, SwFrame *pSibling ); |
308 | |
309 | // for validating a mistakenly invalidated one in SwContentFrame::MakeAll |
310 | friend void ValidateSz( SwFrame *pFrame ); |
311 | // implemented in text/txtftn.cxx, prevents Footnote oscillation |
312 | friend void ValidateText( SwFrame *pFrame ); |
313 | |
314 | friend void MakeNxt( SwFrame *pFrame, SwFrame *pNxt ); |
315 | |
316 | // cache for (border) attributes |
317 | static SwCache *mpCache; |
318 | |
319 | SwRootFrame *mpRoot; |
320 | SwLayoutFrame *mpUpper; |
321 | SwFrame *mpNext; |
322 | SwFrame *mpPrev; |
323 | |
324 | // sw_redlinehide: hide these dangerous SwClient functions |
325 | using SwClient::GetRegisteredInNonConst; |
326 | using SwClient::GetRegisteredIn; |
327 | |
328 | SwFrame *FindNext_(); |
329 | SwFrame *FindPrev_(); |
330 | |
331 | /** method to determine next content frame in the same environment |
332 | for a flow frame (content frame, table frame, section frame) |
333 | |
334 | #i27138# - adding documentation: |
335 | Travelling downwards through the layout to determine the next content |
336 | frame in the same environment. There are several environments in a |
337 | document, which form a closed context regarding this function. These |
338 | environments are: |
339 | - Each page header |
340 | - Each page footer |
341 | - Each unlinked fly frame |
342 | - Each group of linked fly frames |
343 | - All footnotes |
344 | - All document body frames |
345 | #i27138# - adding parameter <_bInSameFootnote> |
346 | Its default value is <false>. If its value is <true>, the environment |
347 | 'All footnotes' is no longer treated. Instead each footnote is treated |
348 | as an own environment. |
349 | |
350 | @param _bInSameFootnote |
351 | input parameter - boolean indicating, that the found next content |
352 | frame has to be in the same footnote frame. This parameter is only |
353 | relevant for flow frames in footnotes. |
354 | |
355 | @return SwContentFrame* |
356 | pointer to the found next content frame. It's NULL, if none exists. |
357 | */ |
358 | SwContentFrame* FindNextCnt_( const bool _bInSameFootnote ); |
359 | |
360 | /** method to determine previous content frame in the same environment |
361 | for a flow frame (content frame, table frame, section frame) |
362 | |
363 | #i27138# |
364 | Travelling upwards through the layout to determine the previous content |
365 | frame in the same environment. There are several environments in a |
366 | document, which form a closed context regarding this function. These |
367 | environments are: |
368 | - Each page header |
369 | - Each page footer |
370 | - Each unlinked fly frame |
371 | - Each group of linked fly frames |
372 | - All footnotes |
373 | - All document body frames |
374 | #i27138# - adding parameter <_bInSameFootnote> |
375 | Its default value is <false>. If its value is <true>, the environment |
376 | 'All footnotes' is no longer treated. Instead each footnote is treated |
377 | as an own environment. |
378 | |
379 | The found previous content frame has to be in the same footnote frame. This is only |
380 | relevant for flow frames in footnotes. |
381 | |
382 | @return SwContentFrame* |
383 | pointer to the found previous content frame. It's NULL, if none exists. |
384 | */ |
385 | SwContentFrame* FindPrevCnt_(); |
386 | |
387 | void UpdateAttrFrame( const SfxPoolItem*, const SfxPoolItem*, sal_uInt8 & ); |
388 | SwFrame* GetIndNext_(); |
389 | void SetDirFlags( bool bVert ); |
390 | |
391 | const SwLayoutFrame* ImplGetNextLayoutLeaf( bool bFwd ) const; |
392 | |
393 | SwPageFrame* ImplFindPageFrame(); |
394 | |
395 | protected: |
396 | std::unique_ptr<SwSortedObjs> m_pDrawObjs; // draw objects, can be null |
397 | SwFrameType mnFrameType; //Who am I? |
398 | |
399 | bool mbInDtor : 1; |
400 | bool mbInvalidR2L : 1; |
401 | bool mbDerivedR2L : 1; |
402 | bool mbRightToLeft : 1; |
403 | bool mbInvalidVert : 1; |
404 | bool mbDerivedVert : 1; |
405 | bool mbVertical : 1; |
406 | |
407 | bool mbVertLR : 1; |
408 | bool mbVertLRBT : 1; |
409 | |
410 | bool mbValidLineNum : 1; |
411 | bool mbFixSize : 1; |
412 | |
413 | // if true, frame will be painted completely even content was changed |
414 | // only partially. For ContentFrames a border (from Action) will exclusively |
415 | // painted if <mbCompletePaint> is true. |
416 | bool mbCompletePaint : 1; |
417 | |
418 | bool mbRetouche : 1; // frame is responsible for retouching |
419 | |
420 | bool mbInfInvalid : 1; // InfoFlags are invalid |
421 | bool mbInfBody : 1; // Frame is in document body |
422 | bool mbInfTab : 1; // Frame is in a table |
423 | bool mbInfFly : 1; // Frame is in a Fly |
424 | bool mbInfFootnote : 1; // Frame is in a footnote |
425 | bool mbInfSct : 1; // Frame is in a section |
426 | bool mbColLocked : 1; // lock Grow/Shrink for column-wise section |
427 | // or fly frames, will be set in Format |
428 | bool m_isInDestroy : 1; |
429 | bool mbForbidDelete : 1; |
430 | |
431 | void ColLock() { mbColLocked = true; } |
432 | void ColUnlock() { mbColLocked = false; } |
433 | |
434 | virtual void DestroyImpl(); |
435 | virtual ~SwFrame() override; |
436 | |
437 | // Only used by SwRootFrame Ctor to get 'this' into mpRoot... |
438 | void setRootFrame( SwRootFrame* pRoot ) { mpRoot = pRoot; } |
439 | |
440 | SwPageFrame *InsertPage( SwPageFrame *pSibling, bool bFootnote ); |
441 | void PrepareMake(vcl::RenderContext* pRenderContext); |
442 | void OptPrepareMake(); |
443 | virtual void MakePos(); |
444 | // Format next frame of table frame to assure keeping attributes. |
445 | // In case of nested tables method <SwFrame::MakeAll()> is called to |
446 | // avoid formatting of superior table frame. |
447 | friend SwFrame* sw_FormatNextContentForKeep( SwTabFrame* pTabFrame ); |
448 | |
449 | virtual void MakeAll(vcl::RenderContext* pRenderContext) = 0; |
450 | // adjust frames of a page |
451 | SwTwips AdjustNeighbourhood( SwTwips nDiff, bool bTst = false ); |
452 | |
453 | // change only frame size not the size of PrtArea |
454 | virtual SwTwips ShrinkFrame( SwTwips, bool bTst = false, bool bInfo = false ) = 0; |
455 | virtual SwTwips GrowFrame ( SwTwips, bool bTst = false, bool bInfo = false ) = 0; |
456 | |
457 | /// use these so we can grep for SwFrame's GetRegisteredIn accesses |
458 | /// beware that SwTextFrame may return sw::WriterMultiListener |
459 | SwModify *GetDep() { return GetRegisteredInNonConst(); } |
460 | const SwModify *GetDep() const { return GetRegisteredIn(); } |
461 | |
462 | SwFrame( SwModify*, SwFrame* ); |
463 | |
464 | void CheckDir( SvxFrameDirection nDir, bool bVert, bool bOnlyBiDi, bool bBrowse ); |
465 | |
466 | /** enumeration for the different invalidations |
467 | #i28701# |
468 | */ |
469 | enum InvalidationType |
470 | { |
471 | INVALID_SIZE, INVALID_PRTAREA, INVALID_POS, INVALID_LINENUM, INVALID_ALL |
472 | }; |
473 | |
474 | /** method to determine, if an invalidation is allowed. |
475 | #i28701 |
476 | */ |
477 | virtual bool InvalidationAllowed( const InvalidationType _nInvalid ) const; |
478 | |
479 | /** method to perform additional actions on an invalidation |
480 | |
481 | #i28701# |
482 | Method has *only* to contain actions, which has to be performed on |
483 | *every* assignment of the corresponding flag to <false>. |
484 | */ |
485 | virtual void ActionOnInvalidation( const InvalidationType _nInvalid ); |
486 | |
487 | // draw shadow and borders |
488 | void PaintShadow( const SwRect&, SwRect&, const SwBorderAttrs& ) const; |
489 | virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ) override; |
490 | |
491 | virtual const IDocumentDrawModelAccess& getIDocumentDrawModelAccess( ); |
492 | |
493 | public: |
494 | virtual css::uno::Sequence< css::style::TabStop > GetTabStopInfo( SwTwips ) |
495 | { |
496 | return css::uno::Sequence< css::style::TabStop >(); |
497 | } |
498 | |
499 | |
500 | SwFrameType GetType() const { return mnFrameType; } |
501 | |
502 | static SwCache &GetCache() { return *mpCache; } |
503 | static SwCache *GetCachePtr() { return mpCache; } |
504 | static void SetCache( SwCache *pNew ) { mpCache = pNew; } |
505 | |
506 | // change PrtArea size and FrameSize |
507 | SwTwips Shrink( SwTwips, bool bTst = false, bool bInfo = false ); |
508 | SwTwips Grow ( SwTwips, bool bTst = false, bool bInfo = false ); |
509 | |
510 | // different methods for inserting in layout tree (for performance reasons) |
511 | |
512 | // insert before pBehind or at the end of the chain below mpUpper |
513 | void InsertBefore( SwLayoutFrame* pParent, SwFrame* pBehind ); |
514 | // insert after pBefore or at the beginning of the chain below mpUpper |
515 | void InsertBehind( SwLayoutFrame *pParent, SwFrame *pBefore ); |
516 | // insert before pBehind or at the end of the chain while considering |
517 | // the siblings of pSct |
518 | bool InsertGroupBefore( SwFrame* pParent, SwFrame* pWhere, SwFrame* pSct ); |
519 | void RemoveFromLayout(); |
520 | |
521 | // For internal use only - who ignores this will be put in a sack and has |
522 | // to stay there for two days |
523 | // Does special treatment for Get_[Next|Prev]Leaf() (for tables). |
524 | SwLayoutFrame *GetLeaf( MakePageType eMakePage, bool bFwd ); |
525 | SwLayoutFrame *GetNextLeaf ( MakePageType eMakePage ); |
526 | SwLayoutFrame *GetNextFootnoteLeaf( MakePageType eMakePage ); |
527 | SwLayoutFrame *GetNextSctLeaf( MakePageType eMakePage ); |
528 | SwLayoutFrame *GetNextCellLeaf(); |
529 | SwLayoutFrame *GetPrevLeaf (); |
530 | SwLayoutFrame *GetPrevFootnoteLeaf( MakePageType eMakeFootnote ); |
531 | SwLayoutFrame *GetPrevSctLeaf(); |
532 | SwLayoutFrame *GetPrevCellLeaf(); |
533 | const SwLayoutFrame *GetLeaf ( MakePageType eMakePage, bool bFwd, |
534 | const SwFrame *pAnch ) const; |
535 | |
536 | bool WrongPageDesc( SwPageFrame* pNew ); |
537 | |
538 | //#i28701# - new methods to append/remove drawing objects |
539 | void AppendDrawObj( SwAnchoredObject& _rNewObj ); |
540 | void RemoveDrawObj( SwAnchoredObject& _rToRemoveObj ); |
541 | |
542 | // work with chain of FlyFrames |
543 | void AppendFly( SwFlyFrame *pNew ); |
544 | void RemoveFly( SwFlyFrame *pToRemove ); |
545 | const SwSortedObjs *GetDrawObjs() const { return m_pDrawObjs.get(); } |
546 | SwSortedObjs *GetDrawObjs() { return m_pDrawObjs.get(); } |
547 | // #i28701# - change purpose of method and adjust its name |
548 | void InvalidateObjs( const bool _bNoInvaOfAsCharAnchoredObjs = true ); |
549 | |
550 | virtual void PaintSwFrameShadowAndBorder( |
551 | const SwRect&, |
552 | const SwPageFrame* pPage, |
553 | const SwBorderAttrs&) const; |
554 | void PaintBaBo( const SwRect&, const SwPageFrame *pPage, |
555 | const bool bOnlyTextBackground = false) const; |
556 | void PaintSwFrameBackground( const SwRect&, const SwPageFrame *pPage, |
557 | const SwBorderAttrs &, |
558 | const bool bLowerMode = false, |
559 | const bool bLowerBorder = false, |
560 | const bool bOnlyTextBackground = false ) const; |
561 | void PaintBorderLine( const SwRect&, const SwRect&, const SwPageFrame*, |
562 | const Color *pColor, |
563 | const SvxBorderLineStyle = SvxBorderLineStyle::SOLID ) const; |
564 | |
565 | std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> CreateProcessor2D( ) const; |
566 | void ProcessPrimitives( const drawinglayer::primitive2d::Primitive2DContainer& rSequence ) const; |
567 | |
568 | // retouch, not in the area of the given Rect! |
569 | void Retouch( const SwPageFrame *pPage, const SwRect &rRect ) const; |
570 | |
571 | bool GetBackgroundBrush( |
572 | drawinglayer::attribute::SdrAllFillAttributesHelperPtr& rFillAttributes, |
573 | const SvxBrushItem*& rpBrush, |
574 | const Color*& rpColor, |
575 | SwRect &rOrigRect, |
576 | bool bLowerMode, |
577 | bool bConsiderTextBox ) const; |
578 | |
579 | inline void SetCompletePaint() const; |
580 | inline void ResetCompletePaint() const; |
581 | bool IsCompletePaint() const { return mbCompletePaint; } |
582 | |
583 | inline void SetRetouche() const; |
584 | inline void ResetRetouche() const; |
585 | bool IsRetouche() const { return mbRetouche; } |
586 | |
587 | void SetInfFlags(); |
588 | void InvalidateInfFlags() { mbInfInvalid = true; } |
589 | inline bool IsInDocBody() const; // use InfoFlags, determine flags |
590 | inline bool IsInFootnote() const; // if necessary |
591 | inline bool IsInTab() const; |
592 | inline bool IsInFly() const; |
593 | inline bool IsInSct() const; |
594 | |
595 | // If frame is inside a split table row, this function returns |
596 | // the corresponding row frame in the follow table. |
597 | const SwRowFrame* IsInSplitTableRow() const; |
598 | |
599 | // If frame is inside a follow flow row, this function returns |
600 | // the corresponding row frame master table |
601 | const SwRowFrame* IsInFollowFlowRow() const; |
602 | |
603 | bool IsInBalancedSection() const; |
604 | |
605 | inline bool IsVertical() const; |
606 | inline bool IsVertLR() const; |
607 | inline bool IsVertLRBT() const; |
608 | |
609 | void SetDerivedVert( bool bNew ){ mbDerivedVert = bNew; } |
610 | void SetInvalidVert( bool bNew) { mbInvalidVert = bNew; } |
611 | inline bool IsRightToLeft() const; |
612 | void SetDerivedR2L( bool bNew ) { mbDerivedR2L = bNew; } |
613 | |
614 | void CheckDirChange(); |
615 | // returns upper left frame position for LTR and |
616 | // upper right frame position for Asian / RTL frames |
617 | Point GetFrameAnchorPos( bool bIgnoreFlysAnchoredAtThisFrame ) const; |
618 | |
619 | /** determine, if frame is moveable in given environment |
620 | |
621 | method replaced 'old' method <bool IsMoveable() const>. |
622 | Determines, if frame is moveable in given environment. if no environment |
623 | is given (parameter _pLayoutFrame == 0), the movability in the actual |
624 | environment (<GetUpper()) is checked. |
625 | |
626 | @param _pLayoutFrame |
627 | input parameter - given environment (layout frame), in which the movability |
628 | will be checked. If not set ( == 0 ), actual environment is taken. |
629 | |
630 | @return boolean, indicating, if frame is moveable in given environment |
631 | */ |
632 | bool IsMoveable( const SwLayoutFrame* _pLayoutFrame = nullptr ) const; |
633 | |
634 | // Is it permitted for the (Text)Frame to add a footnote in the current |
635 | // environment (not e.g. for repeating table headlines) |
636 | bool IsFootnoteAllowed() const; |
637 | |
638 | virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ); |
639 | |
640 | virtual void CheckDirection( bool bVert ); |
641 | |
642 | void ReinitializeFrameSizeAttrFlags(); |
643 | |
644 | /// WARNING: this may not return correct RES_PAGEDESC/RES_BREAK items for |
645 | /// SwTextFrame, use GetBreakItem()/GetPageDescItem() instead |
646 | const SwAttrSet *GetAttrSet() const; |
647 | virtual const SvxFormatBreakItem& GetBreakItem() const; |
648 | virtual const SwFormatPageDesc& GetPageDescItem() const; |
649 | |
650 | bool HasFixSize() const { return mbFixSize; } |
651 | |
652 | // check all pages (starting from the given) and correct them if needed |
653 | static void CheckPageDescs( SwPageFrame *pStart, bool bNotifyFields = true, SwPageFrame** ppPrev = nullptr); |
654 | |
655 | // might return 0, with and without const |
656 | SwFrame *GetNext() { return mpNext; } |
657 | SwFrame *GetPrev() { return mpPrev; } |
658 | SwLayoutFrame *GetUpper() { return mpUpper; } |
659 | SwRootFrame *getRootFrame(){ return mpRoot; } |
660 | SwPageFrame *FindPageFrame() { return IsPageFrame() ? reinterpret_cast<SwPageFrame*>(this) : ImplFindPageFrame(); } |
661 | SwFrame *FindColFrame(); |
662 | SwRowFrame *FindRowFrame(); |
663 | SwFootnoteBossFrame *FindFootnoteBossFrame( bool bFootnotes = false ); |
664 | SwTabFrame *ImplFindTabFrame(); |
665 | SwFootnoteFrame *ImplFindFootnoteFrame(); |
666 | SwFlyFrame *ImplFindFlyFrame(); |
667 | SwSectionFrame *ImplFindSctFrame(); |
668 | const SwBodyFrame *ImplFindBodyFrame() const; |
669 | SwFrame *FindFooterOrHeader(); |
670 | SwFrame *GetLower(); |
671 | const SwFrame *GetNext() const { return mpNext; } |
672 | const SwFrame *GetPrev() const { return mpPrev; } |
673 | const SwLayoutFrame *GetUpper() const { return mpUpper; } |
674 | const SwRootFrame *getRootFrame() const { return mpRoot; } |
675 | inline SwTabFrame *FindTabFrame(); |
676 | inline SwFootnoteFrame *FindFootnoteFrame(); |
677 | inline SwFlyFrame *FindFlyFrame(); |
678 | inline SwSectionFrame *FindSctFrame(); |
679 | inline SwFrame *FindNext(); |
680 | // #i27138# - add parameter <_bInSameFootnote> |
681 | SwContentFrame* FindNextCnt( const bool _bInSameFootnote = false ); |
682 | inline SwFrame *FindPrev(); |
683 | inline const SwPageFrame *FindPageFrame() const; |
684 | inline const SwFootnoteBossFrame *FindFootnoteBossFrame( bool bFootnote = false ) const; |
685 | inline const SwFrame *FindColFrame() const; |
686 | inline const SwFrame *FindFooterOrHeader() const; |
687 | inline const SwTabFrame *FindTabFrame() const; |
688 | inline const SwFootnoteFrame *FindFootnoteFrame() const; |
689 | inline const SwFlyFrame *FindFlyFrame() const; |
690 | inline const SwSectionFrame *FindSctFrame() const; |
691 | inline const SwBodyFrame *FindBodyFrame() const; |
692 | inline const SwFrame *FindNext() const; |
693 | // #i27138# - add parameter <_bInSameFootnote> |
694 | const SwContentFrame* FindNextCnt( const bool _bInSameFootnote = false ) const; |
695 | inline const SwFrame *FindPrev() const; |
696 | const SwFrame *GetLower() const; |
697 | |
698 | SwContentFrame* FindPrevCnt(); |
699 | |
700 | const SwContentFrame* FindPrevCnt() const; |
701 | |
702 | // #i79774# |
703 | SwFrame* GetIndPrev_() const; |
704 | SwFrame* GetIndPrev() const |
705 | { return ( mpPrev || !IsInSct() ) ? mpPrev : GetIndPrev_(); } |
706 | |
707 | SwFrame* GetIndNext() |
708 | { return ( mpNext || !IsInSct() ) ? mpNext : GetIndNext_(); } |
709 | const SwFrame* GetIndNext() const { return const_cast<SwFrame*>(this)->GetIndNext(); } |
710 | |
711 | sal_uInt16 GetPhyPageNum() const; // page number without offset |
712 | sal_uInt16 GetVirtPageNum() const; // page number with offset |
713 | bool OnRightPage() const { return 0 != GetPhyPageNum() % 2; }; |
714 | bool WannaRightPage() const; |
715 | bool OnFirstPage() const; |
716 | |
717 | inline const SwLayoutFrame *GetPrevLayoutLeaf() const; |
718 | inline const SwLayoutFrame *GetNextLayoutLeaf() const; |
719 | inline SwLayoutFrame *GetPrevLayoutLeaf(); |
720 | inline SwLayoutFrame *GetNextLayoutLeaf(); |
721 | |
722 | virtual void Calc(vcl::RenderContext* pRenderContext) const; // here might be "formatted" |
723 | inline void OptCalc() const; // here we assume (for optimization) that |
724 | // the predecessors are already formatted |
725 | Point GetRelPos() const; |
726 | |
727 | // PaintArea is the area where content might be displayed. |
728 | // The margin of a page or the space between columns belongs to it. |
729 | SwRect GetPaintArea() const; |
730 | |
731 | // UnionFrame is the union of Frame- and PrtArea, normally identical |
732 | // to the FrameArea except in case of negative Prt margins. |
733 | SwRect UnionFrame( bool bBorder = false ) const; |
734 | |
735 | virtual Size ChgSize( const Size& aNewSize ); |
736 | |
737 | virtual void Cut() = 0; |
738 | virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) = 0; |
739 | |
740 | void ValidateLineNum() { mbValidLineNum = true; } |
741 | |
742 | bool GetValidLineNumFlag()const { return mbValidLineNum; } |
743 | |
744 | // Only invalidate Frame |
745 | // #i28701# - add call to method <ActionOnInvalidation(..)> |
746 | // for all invalidation methods. |
747 | // #i28701# - use method <InvalidationAllowed(..)> to |
748 | // decide, if invalidation will to be performed or not. |
749 | // #i26945# - no additional invalidation, if it's already |
750 | // invalidate. |
751 | void InvalidateSize_() |
752 | { |
753 | if ( isFrameAreaSizeValid() && InvalidationAllowed( INVALID_SIZE ) ) |
754 | { |
755 | setFrameAreaSizeValid(false); |
756 | ActionOnInvalidation( INVALID_SIZE ); |
757 | } |
758 | } |
759 | void InvalidatePrt_() |
760 | { |
761 | if ( isFramePrintAreaValid() && InvalidationAllowed( INVALID_PRTAREA ) ) |
762 | { |
763 | setFramePrintAreaValid(false); |
764 | ActionOnInvalidation( INVALID_PRTAREA ); |
765 | } |
766 | } |
767 | void InvalidatePos_() |
768 | { |
769 | if ( isFrameAreaPositionValid() && InvalidationAllowed( INVALID_POS ) ) |
770 | { |
771 | setFrameAreaPositionValid(false); |
772 | ActionOnInvalidation( INVALID_POS ); |
773 | } |
774 | } |
775 | void InvalidateLineNum_() |
776 | { |
777 | if ( mbValidLineNum && InvalidationAllowed( INVALID_LINENUM ) ) |
778 | { |
779 | mbValidLineNum = false; |
780 | ActionOnInvalidation( INVALID_LINENUM ); |
781 | } |
782 | } |
783 | void InvalidateAll_() |
784 | { |
785 | if ( ( isFrameAreaSizeValid() || isFramePrintAreaValid() || isFrameAreaPositionValid() ) && InvalidationAllowed( INVALID_ALL ) ) |
786 | { |
787 | setFrameAreaSizeValid(false); |
788 | setFrameAreaPositionValid(false); |
789 | setFramePrintAreaValid(false); |
790 | ActionOnInvalidation( INVALID_ALL ); |
791 | } |
792 | } |
793 | // also notify page at the same time |
794 | inline void InvalidateSize(); |
795 | inline void InvalidatePrt(); |
796 | inline void InvalidatePos(); |
797 | inline void InvalidateLineNum(); |
798 | inline void InvalidateAll(); |
799 | void ImplInvalidateSize(); |
800 | void ImplInvalidatePrt(); |
801 | void ImplInvalidatePos(); |
802 | void ImplInvalidateLineNum(); |
803 | |
804 | inline void InvalidateNextPos( bool bNoFootnote = false ); |
805 | void ImplInvalidateNextPos( bool bNoFootnote ); |
806 | |
807 | /** method to invalidate printing area of next frame |
808 | #i11859# |
809 | */ |
810 | void InvalidateNextPrtArea(); |
811 | |
812 | void InvalidatePage( const SwPageFrame *pPage = nullptr ) const; |
813 | |
814 | virtual bool FillSelection( SwSelectionList& rList, const SwRect& rRect ) const; |
815 | |
816 | virtual bool GetModelPositionForViewPoint( SwPosition *, Point&, |
817 | SwCursorMoveState* = nullptr, bool bTestBackground = false ) const; |
818 | virtual bool GetCharRect( SwRect &, const SwPosition&, |
819 | SwCursorMoveState* = nullptr, bool bAllowFarAway = true ) const; |
820 | virtual void PaintSwFrame( vcl::RenderContext& rRenderContext, SwRect const&, |
821 | SwPrintData const*const pPrintData = nullptr ) const; |
822 | |
823 | // HACK: shortcut between frame and formatting |
824 | // It's your own fault if you cast void* incorrectly! In any case check |
825 | // the void* for 0. |
826 | virtual bool Prepare( const PrepareHint ePrep = PrepareHint::Clear, |
827 | const void *pVoid = nullptr, bool bNotify = true ); |
828 | |
829 | // true if it is the correct class, false otherwise |
830 | inline bool IsLayoutFrame() const; |
831 | inline bool IsRootFrame() const; |
832 | inline bool IsPageFrame() const; |
833 | inline bool IsColumnFrame() const; |
834 | inline bool IsFootnoteBossFrame() const; // footnote bosses might be PageFrames or ColumnFrames |
835 | inline bool IsHeaderFrame() const; |
836 | inline bool IsFooterFrame() const; |
837 | inline bool IsFootnoteContFrame() const; |
838 | inline bool IsFootnoteFrame() const; |
839 | inline bool IsBodyFrame() const; |
840 | inline bool IsColBodyFrame() const; // implemented in layfrm.hxx, BodyFrame above ColumnFrame |
841 | inline bool IsPageBodyFrame() const; // implemented in layfrm.hxx, BodyFrame above PageFrame |
842 | inline bool IsFlyFrame() const; |
843 | inline bool IsSctFrame() const; |
844 | inline bool IsTabFrame() const; |
845 | inline bool IsRowFrame() const; |
846 | inline bool IsCellFrame() const; |
847 | inline bool IsContentFrame() const; |
848 | inline bool IsTextFrame() const; |
849 | inline bool IsNoTextFrame() const; |
850 | // Frames where its PrtArea depends on their neighbors and that are |
851 | // positioned in the content flow |
852 | inline bool IsFlowFrame() const; |
853 | // Frames that are capable of retouching or that might need to retouch behind |
854 | // themselves |
855 | inline bool IsRetoucheFrame() const; |
856 | inline bool IsAccessibleFrame() const; |
857 | |
858 | void PrepareCursor(); // CursorShell is allowed to call this |
859 | |
860 | // Is the Frame (or the section containing it) protected? Same for Fly in |
861 | // Fly in ... and footnotes |
862 | bool IsProtected() const; |
863 | |
864 | bool IsColLocked() const { return mbColLocked; } |
865 | virtual bool IsDeleteForbidden() const { return mbForbidDelete; } |
866 | |
867 | /// this is the only way to delete a SwFrame instance |
868 | static void DestroyFrame(SwFrame *const pFrame); |
869 | |
870 | bool IsInDtor() const { return mbInDtor; } |
871 | |
872 | // No inline cause we need the function pointers |
873 | long GetTopMargin() const; |
874 | long GetBottomMargin() const; |
875 | long GetLeftMargin() const; |
876 | long GetRightMargin() const; |
877 | void SetTopBottomMargins( long, long ); |
878 | void SetLeftRightMargins( long, long ); |
879 | void SetRightLeftMargins( long, long ); |
880 | long GetPrtLeft() const; |
881 | long GetPrtBottom() const; |
882 | long GetPrtRight() const; |
883 | long GetPrtTop() const; |
884 | bool SetMinLeft( long ); |
885 | bool SetMaxBottom( long ); |
886 | bool SetMaxRight( long ); |
887 | void MakeBelowPos( const SwFrame*, const SwFrame*, bool ); |
888 | void MakeLeftPos( const SwFrame*, const SwFrame*, bool ); |
889 | void MakeRightPos( const SwFrame*, const SwFrame*, bool ); |
890 | bool IsNeighbourFrame() const |
891 | { return bool(GetType() & FRM_NEIGHBOUR(SwFrameType::Column | SwFrameType::Cell)); } |
892 | |
893 | // NEW TABLES |
894 | // Some functions for covered/covering table cells. This way unnecessary |
895 | // includes can be avoided |
896 | virtual bool IsLeaveUpperAllowed() const; |
897 | virtual bool IsCoveredCell() const; |
898 | bool IsInCoveredCell() const; |
899 | |
900 | // #i81146# new loop control |
901 | bool KnowsFormat( const SwFormat& rFormat ) const; |
902 | void RegisterToFormat( SwFormat& rFormat ); |
903 | void ValidateThisAndAllLowers( const sal_uInt16 nStage ); |
904 | |
905 | void ForbidDelete() { mbForbidDelete = true; } |
906 | void AllowDelete() { mbForbidDelete = false; } |
907 | |
908 | drawinglayer::attribute::SdrAllFillAttributesHelperPtr getSdrAllFillAttributesHelper() const; |
909 | bool supportsFullDrawingLayerFillAttributeSet() const; |
910 | |
911 | public: |
912 | // if writer is NULL, dumps the layout structure as XML in layout.xml |
913 | virtual void dumpAsXml(xmlTextWriterPtr writer = nullptr) const; |
914 | void dumpTopMostAsXml(xmlTextWriterPtr writer = nullptr) const; |
915 | void dumpInfosAsXml(xmlTextWriterPtr writer) const; |
916 | virtual void dumpAsXmlAttributes(xmlTextWriterPtr writer) const; |
917 | void dumpChildrenAsXml(xmlTextWriterPtr writer) const; |
918 | bool IsCollapse() const; |
919 | }; |
920 | |
921 | inline bool SwFrame::IsInDocBody() const |
922 | { |
923 | if ( mbInfInvalid ) |
924 | const_cast<SwFrame*>(this)->SetInfFlags(); |
925 | return mbInfBody; |
926 | } |
927 | inline bool SwFrame::IsInFootnote() const |
928 | { |
929 | if ( mbInfInvalid ) |
930 | const_cast<SwFrame*>(this)->SetInfFlags(); |
931 | return mbInfFootnote; |
932 | } |
933 | inline bool SwFrame::IsInTab() const |
934 | { |
935 | if ( mbInfInvalid ) |
936 | const_cast<SwFrame*>(this)->SetInfFlags(); |
937 | return mbInfTab; |
938 | } |
939 | inline bool SwFrame::IsInFly() const |
940 | { |
941 | if ( mbInfInvalid ) |
942 | const_cast<SwFrame*>(this)->SetInfFlags(); |
943 | return mbInfFly; |
944 | } |
945 | inline bool SwFrame::IsInSct() const |
946 | { |
947 | if ( mbInfInvalid ) |
948 | const_cast<SwFrame*>(this)->SetInfFlags(); |
949 | return mbInfSct; |
950 | } |
951 | bool SwFrame::IsVertical() const |
952 | { |
953 | if( mbInvalidVert ) |
954 | const_cast<SwFrame*>(this)->SetDirFlags( true ); |
955 | return mbVertical; |
956 | } |
957 | inline bool SwFrame::IsVertLR() const |
958 | { |
959 | return mbVertLR; |
960 | } |
961 | inline bool SwFrame::IsVertLRBT() const |
962 | { |
963 | return mbVertLRBT; |
964 | } |
965 | inline bool SwFrame::IsRightToLeft() const |
966 | { |
967 | if( mbInvalidR2L ) |
968 | const_cast<SwFrame*>(this)->SetDirFlags( false ); |
969 | return mbRightToLeft; |
970 | } |
971 | |
972 | inline void SwFrame::SetCompletePaint() const |
973 | { |
974 | const_cast<SwFrame*>(this)->mbCompletePaint = true; |
975 | } |
976 | inline void SwFrame::ResetCompletePaint() const |
977 | { |
978 | const_cast<SwFrame*>(this)->mbCompletePaint = false; |
979 | } |
980 | |
981 | inline void SwFrame::SetRetouche() const |
982 | { |
983 | const_cast<SwFrame*>(this)->mbRetouche = true; |
984 | } |
985 | inline void SwFrame::ResetRetouche() const |
986 | { |
987 | const_cast<SwFrame*>(this)->mbRetouche = false; |
988 | } |
989 | |
990 | inline SwLayoutFrame *SwFrame::GetNextLayoutLeaf() |
991 | { |
992 | return const_cast<SwLayoutFrame*>(static_cast<const SwFrame*>(this)->GetNextLayoutLeaf()); |
993 | } |
994 | inline SwLayoutFrame *SwFrame::GetPrevLayoutLeaf() |
995 | { |
996 | return const_cast<SwLayoutFrame*>(static_cast<const SwFrame*>(this)->GetPrevLayoutLeaf()); |
997 | } |
998 | inline const SwLayoutFrame *SwFrame::GetNextLayoutLeaf() const |
999 | { |
1000 | return ImplGetNextLayoutLeaf( true ); |
1001 | } |
1002 | inline const SwLayoutFrame *SwFrame::GetPrevLayoutLeaf() const |
1003 | { |
1004 | return ImplGetNextLayoutLeaf( false ); |
1005 | } |
1006 | |
1007 | inline void SwFrame::InvalidateSize() |
1008 | { |
1009 | if ( isFrameAreaSizeValid() ) |
1010 | { |
1011 | ImplInvalidateSize(); |
1012 | } |
1013 | } |
1014 | inline void SwFrame::InvalidatePrt() |
1015 | { |
1016 | if ( isFramePrintAreaValid() ) |
1017 | { |
1018 | ImplInvalidatePrt(); |
1019 | } |
1020 | } |
1021 | inline void SwFrame::InvalidatePos() |
1022 | { |
1023 | if ( isFrameAreaPositionValid() ) |
1024 | { |
1025 | ImplInvalidatePos(); |
1026 | } |
1027 | } |
1028 | inline void SwFrame::InvalidateLineNum() |
1029 | { |
1030 | if ( mbValidLineNum ) |
1031 | ImplInvalidateLineNum(); |
1032 | } |
1033 | inline void SwFrame::InvalidateAll() |
1034 | { |
1035 | if ( InvalidationAllowed( INVALID_ALL ) ) |
1036 | { |
1037 | if ( isFrameAreaDefinitionValid() ) |
1038 | { |
1039 | ImplInvalidatePos(); |
1040 | } |
1041 | |
1042 | setFrameAreaSizeValid(false); |
1043 | setFrameAreaPositionValid(false); |
1044 | setFramePrintAreaValid(false); |
1045 | |
1046 | // #i28701# |
1047 | ActionOnInvalidation( INVALID_ALL ); |
1048 | } |
1049 | } |
1050 | inline void SwFrame::InvalidateNextPos( bool bNoFootnote ) |
1051 | { |
1052 | if ( mpNext && !mpNext->IsSctFrame() ) |
1053 | mpNext->InvalidatePos(); |
1054 | else |
1055 | ImplInvalidateNextPos( bNoFootnote ); |
1056 | } |
1057 | |
1058 | inline void SwFrame::OptCalc() const |
1059 | { |
1060 | if ( !isFrameAreaPositionValid() || !isFramePrintAreaValid() || !isFrameAreaSizeValid() ) |
1061 | { |
1062 | const_cast<SwFrame*>(this)->OptPrepareMake(); |
1063 | } |
1064 | } |
1065 | inline const SwPageFrame *SwFrame::FindPageFrame() const |
1066 | { |
1067 | return const_cast<SwFrame*>(this)->FindPageFrame(); |
1068 | } |
1069 | inline const SwFrame *SwFrame::FindColFrame() const |
1070 | { |
1071 | return const_cast<SwFrame*>(this)->FindColFrame(); |
1072 | } |
1073 | inline const SwFrame *SwFrame::FindFooterOrHeader() const |
1074 | { |
1075 | return const_cast<SwFrame*>(this)->FindFooterOrHeader(); |
1076 | } |
1077 | inline SwTabFrame *SwFrame::FindTabFrame() |
1078 | { |
1079 | return IsInTab() ? ImplFindTabFrame() : nullptr; |
1080 | } |
1081 | inline const SwFootnoteBossFrame *SwFrame::FindFootnoteBossFrame( bool bFootnote ) const |
1082 | { |
1083 | return const_cast<SwFrame*>(this)->FindFootnoteBossFrame( bFootnote ); |
1084 | } |
1085 | inline SwFootnoteFrame *SwFrame::FindFootnoteFrame() |
1086 | { |
1087 | return IsInFootnote() ? ImplFindFootnoteFrame() : nullptr; |
1088 | } |
1089 | inline SwFlyFrame *SwFrame::FindFlyFrame() |
1090 | { |
1091 | return IsInFly() ? ImplFindFlyFrame() : nullptr; |
1092 | } |
1093 | inline SwSectionFrame *SwFrame::FindSctFrame() |
1094 | { |
1095 | return IsInSct() ? ImplFindSctFrame() : nullptr; |
1096 | } |
1097 | |
1098 | inline const SwBodyFrame *SwFrame::FindBodyFrame() const |
1099 | { |
1100 | return IsInDocBody() ? ImplFindBodyFrame() : nullptr; |
1101 | } |
1102 | |
1103 | inline const SwTabFrame *SwFrame::FindTabFrame() const |
1104 | { |
1105 | return IsInTab() ? const_cast<SwFrame*>(this)->ImplFindTabFrame() : nullptr; |
1106 | } |
1107 | inline const SwFootnoteFrame *SwFrame::FindFootnoteFrame() const |
1108 | { |
1109 | return IsInFootnote() ? const_cast<SwFrame*>(this)->ImplFindFootnoteFrame() : nullptr; |
1110 | } |
1111 | inline const SwFlyFrame *SwFrame::FindFlyFrame() const |
1112 | { |
1113 | return IsInFly() ? const_cast<SwFrame*>(this)->ImplFindFlyFrame() : nullptr; |
1114 | } |
1115 | inline const SwSectionFrame *SwFrame::FindSctFrame() const |
1116 | { |
1117 | return IsInSct() ? const_cast<SwFrame*>(this)->ImplFindSctFrame() : nullptr; |
1118 | } |
1119 | inline SwFrame *SwFrame::FindNext() |
1120 | { |
1121 | if ( mpNext ) |
1122 | return mpNext; |
1123 | else |
1124 | return FindNext_(); |
1125 | } |
1126 | inline const SwFrame *SwFrame::FindNext() const |
1127 | { |
1128 | if ( mpNext ) |
1129 | return mpNext; |
1130 | else |
1131 | return const_cast<SwFrame*>(this)->FindNext_(); |
1132 | } |
1133 | inline SwFrame *SwFrame::FindPrev() |
1134 | { |
1135 | if ( mpPrev && !mpPrev->IsSctFrame() ) |
1136 | return mpPrev; |
1137 | else |
1138 | return FindPrev_(); |
1139 | } |
1140 | inline const SwFrame *SwFrame::FindPrev() const |
1141 | { |
1142 | if ( mpPrev && !mpPrev->IsSctFrame() ) |
1143 | return mpPrev; |
1144 | else |
1145 | return const_cast<SwFrame*>(this)->FindPrev_(); |
1146 | } |
1147 | |
1148 | inline bool SwFrame::IsLayoutFrame() const |
1149 | { |
1150 | return bool(GetType() & FRM_LAYOUTSwFrameType(0x3bFF)); |
1151 | } |
1152 | inline bool SwFrame::IsRootFrame() const |
1153 | { |
1154 | return mnFrameType == SwFrameType::Root; |
1155 | } |
1156 | inline bool SwFrame::IsPageFrame() const |
1157 | { |
1158 | return mnFrameType == SwFrameType::Page; |
1159 | } |
1160 | inline bool SwFrame::IsColumnFrame() const |
1161 | { |
1162 | return mnFrameType == SwFrameType::Column; |
1163 | } |
1164 | inline bool SwFrame::IsFootnoteBossFrame() const |
1165 | { |
1166 | return bool(GetType() & FRM_FTNBOSS(SwFrameType::Page | SwFrameType::Column)); |
1167 | } |
1168 | inline bool SwFrame::IsHeaderFrame() const |
1169 | { |
1170 | return mnFrameType == SwFrameType::Header; |
1171 | } |
1172 | inline bool SwFrame::IsFooterFrame() const |
1173 | { |
1174 | return mnFrameType == SwFrameType::Footer; |
1175 | } |
1176 | inline bool SwFrame::IsFootnoteContFrame() const |
1177 | { |
1178 | return mnFrameType == SwFrameType::FtnCont; |
1179 | } |
1180 | inline bool SwFrame::IsFootnoteFrame() const |
1181 | { |
1182 | return mnFrameType == SwFrameType::Ftn; |
1183 | } |
1184 | inline bool SwFrame::IsBodyFrame() const |
1185 | { |
1186 | return mnFrameType == SwFrameType::Body; |
1187 | } |
1188 | inline bool SwFrame::IsFlyFrame() const |
1189 | { |
1190 | return mnFrameType == SwFrameType::Fly; |
1191 | } |
1192 | inline bool SwFrame::IsSctFrame() const |
1193 | { |
1194 | return mnFrameType == SwFrameType::Section; |
1195 | } |
1196 | inline bool SwFrame::IsTabFrame() const |
1197 | { |
1198 | return mnFrameType == SwFrameType::Tab; |
1199 | } |
1200 | inline bool SwFrame::IsRowFrame() const |
1201 | { |
1202 | return mnFrameType == SwFrameType::Row; |
1203 | } |
1204 | inline bool SwFrame::IsCellFrame() const |
1205 | { |
1206 | return mnFrameType == SwFrameType::Cell; |
1207 | } |
1208 | inline bool SwFrame::IsContentFrame() const |
1209 | { |
1210 | return bool(GetType() & FRM_CNTNT(SwFrameType::Txt | SwFrameType::NoTxt)); |
1211 | } |
1212 | inline bool SwFrame::IsTextFrame() const |
1213 | { |
1214 | return mnFrameType == SwFrameType::Txt; |
1215 | } |
1216 | inline bool SwFrame::IsNoTextFrame() const |
1217 | { |
1218 | return mnFrameType == SwFrameType::NoTxt; |
1219 | } |
1220 | inline bool SwFrame::IsFlowFrame() const |
1221 | { |
1222 | return bool(GetType() & (FRM_CNTNT(SwFrameType::Txt | SwFrameType::NoTxt)|SwFrameType::Tab|SwFrameType::Section)); |
1223 | } |
1224 | inline bool SwFrame::IsRetoucheFrame() const |
1225 | { |
1226 | return bool(GetType() & (FRM_CNTNT(SwFrameType::Txt | SwFrameType::NoTxt)|SwFrameType::Tab|SwFrameType::Section|SwFrameType::Ftn)); |
1227 | } |
1228 | inline bool SwFrame::IsAccessibleFrame() const |
1229 | { |
1230 | return bool(GetType() & FRM_ACCESSIBLE(SwFrameType::Root | SwFrameType::Page | SwFrameType::Header | SwFrameType::Footer | SwFrameType::Ftn | SwFrameType::Fly | SwFrameType ::Tab | SwFrameType::Cell | SwFrameType::Txt)); |
1231 | } |
1232 | |
1233 | //use this to protect a SwFrame for a given scope from getting deleted |
1234 | class SwFrameDeleteGuard |
1235 | { |
1236 | private: |
1237 | SwFrame *m_pForbidFrame; |
1238 | public: |
1239 | //Flag pFrame for SwFrameDeleteGuard lifetime that we shouldn't delete |
1240 | //it in e.g. SwSectionFrame::MergeNext etc because we will need it |
1241 | //again after the SwFrameDeleteGuard dtor |
1242 | explicit SwFrameDeleteGuard(SwFrame* pFrame) |
1243 | : m_pForbidFrame((pFrame && !pFrame->IsDeleteForbidden()) ? |
1244 | pFrame : nullptr) |
1245 | { |
1246 | if (m_pForbidFrame) |
1247 | m_pForbidFrame->ForbidDelete(); |
1248 | } |
1249 | |
1250 | SwFrameDeleteGuard(const SwFrameDeleteGuard&) =delete; |
1251 | |
1252 | ~SwFrameDeleteGuard() |
1253 | { |
1254 | if (m_pForbidFrame) |
1255 | m_pForbidFrame->AllowDelete(); |
1256 | } |
1257 | |
1258 | SwFrameDeleteGuard& operator=(const SwFrameDeleteGuard&) =delete; |
1259 | }; |
1260 | |
1261 | typedef long (SwFrame::*SwFrameGet)() const; |
1262 | typedef bool (SwFrame::*SwFrameMax)( long ); |
1263 | typedef void (SwFrame::*SwFrameMakePos)( const SwFrame*, const SwFrame*, bool ); |
1264 | typedef long (*SwOperator)( long, long ); |
1265 | typedef void (SwFrame::*SwFrameSet)( long, long ); |
1266 | |
1267 | struct SwRectFnCollection |
1268 | { |
1269 | SwRectGet fnGetTop; |
1270 | SwRectGet fnGetBottom; |
1271 | SwRectGet fnGetLeft; |
1272 | SwRectGet fnGetRight; |
1273 | SwRectGet fnGetWidth; |
1274 | SwRectGet fnGetHeight; |
1275 | SwRectPoint fnGetPos; |
1276 | SwRectSize fnGetSize; |
1277 | |
1278 | SwRectSet fnSetTop; |
1279 | SwRectSet fnSetBottom; |
1280 | SwRectSet fnSetLeft; |
1281 | SwRectSet fnSetRight; |
1282 | SwRectSet fnSetWidth; |
1283 | SwRectSet fnSetHeight; |
1284 | |
1285 | SwRectSet fnSubTop; |
1286 | SwRectSet fnAddBottom; |
1287 | SwRectSet fnSubLeft; |
1288 | SwRectSet fnAddRight; |
1289 | SwRectSet fnAddWidth; |
1290 | SwRectSet fnAddHeight; |
1291 | |
1292 | SwRectSet fnSetPosX; |
1293 | SwRectSet fnSetPosY; |
1294 | |
1295 | SwFrameGet fnGetTopMargin; |
1296 | SwFrameGet fnGetBottomMargin; |
1297 | SwFrameGet fnGetLeftMargin; |
1298 | SwFrameGet fnGetRightMargin; |
1299 | SwFrameSet fnSetXMargins; |
1300 | SwFrameSet fnSetYMargins; |
1301 | SwFrameGet fnGetPrtTop; |
1302 | SwFrameGet fnGetPrtBottom; |
1303 | SwFrameGet fnGetPrtLeft; |
1304 | SwFrameGet fnGetPrtRight; |
1305 | SwRectDist fnTopDist; |
1306 | SwRectDist fnBottomDist; |
1307 | SwRectDist fnLeftDist; |
1308 | SwRectDist fnRightDist; |
1309 | SwFrameMax fnSetLimit; |
1310 | SwRectMax fnOverStep; |
1311 | |
1312 | SwRectSetPos fnSetPos; |
1313 | SwFrameMakePos fnMakePos; |
1314 | SwOperator fnXDiff; |
1315 | SwOperator fnYDiff; |
1316 | SwOperator fnXInc; |
1317 | SwOperator fnYInc; |
1318 | |
1319 | SwRectSetTwice fnSetLeftAndWidth; |
1320 | SwRectSetTwice fnSetTopAndHeight; |
1321 | }; |
1322 | |
1323 | typedef SwRectFnCollection* SwRectFn; |
1324 | |
1325 | // This class allows to use proper methods regardless of orientation (LTR/RTL, horizontal or vertical) |
1326 | extern SwRectFn fnRectHori, fnRectVert, fnRectVertL2R, fnRectVertL2RB2T; |
1327 | class SwRectFnSet { |
1328 | public: |
1329 | explicit SwRectFnSet(const SwFrame *pFrame) |
1330 | : m_bVert(pFrame->IsVertical()) |
1331 | , m_bVertL2R(pFrame->IsVertLR()) |
1332 | , m_bVertL2RB2T(pFrame->IsVertLRBT()) |
1333 | { |
1334 | m_fnRect = m_bVert ? (m_bVertL2R ? (m_bVertL2RB2T ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert) : fnRectHori; |
1335 | } |
1336 | |
1337 | void Refresh(const SwFrame *pFrame) |
1338 | { |
1339 | m_bVert = pFrame->IsVertical(); |
1340 | m_bVertL2R = pFrame->IsVertLR(); |
1341 | m_bVertL2RB2T = pFrame->IsVertLRBT(); |
1342 | m_fnRect = m_bVert ? (m_bVertL2R ? (m_bVertL2RB2T ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert) : fnRectHori; |
1343 | } |
1344 | |
1345 | bool IsVert() const { return m_bVert; } |
1346 | bool IsVertL2R() const { return m_bVertL2R; } |
1347 | SwRectFn FnRect() const { return m_fnRect; } |
1348 | |
1349 | bool PosDiff(const SwRect &rRect1, const SwRect &rRect2) const |
1350 | { |
1351 | return ((rRect1.*m_fnRect->fnGetTop)() != (rRect2.*m_fnRect->fnGetTop)() |
1352 | || (rRect1.*m_fnRect->fnGetLeft)() != (rRect2.*m_fnRect->fnGetLeft)()); |
1353 | } |
1354 | |
1355 | long GetTop (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetTop) (); } |
1356 | long GetBottom(const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetBottom)(); } |
1357 | long GetLeft (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetLeft) (); } |
1358 | long GetRight (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetRight) (); } |
1359 | long GetWidth (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetWidth) (); } |
1360 | long GetHeight(const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetHeight)(); } |
1361 | Point GetPos (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetPos) (); } |
1362 | Size GetSize (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetSize) (); } |
1363 | |
1364 | void SetTop (SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnSetTop) (nNew); } |
1365 | void SetBottom(SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnSetBottom)(nNew); } |
1366 | void SetLeft (SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnSetLeft) (nNew); } |
1367 | void SetRight (SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnSetRight) (nNew); } |
1368 | void SetWidth (SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnSetWidth) (nNew); } |
1369 | void SetHeight(SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnSetHeight)(nNew); } |
1370 | |
1371 | void SubTop (SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnSubTop) (nNew); } |
1372 | void AddBottom(SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnAddBottom)(nNew); } |
1373 | void SubLeft (SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnSubLeft) (nNew); } |
1374 | void AddRight (SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnAddRight) (nNew); } |
1375 | void AddWidth (SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnAddWidth) (nNew); } |
1376 | void AddHeight(SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnAddHeight)(nNew); } |
1377 | |
1378 | void SetPosX(SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnSetPosX)(nNew); } |
1379 | void SetPosY(SwRect& rRect, long nNew) const { (rRect.*m_fnRect->fnSetPosY)(nNew); } |
1380 | |
1381 | long GetTopMargin (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetTopMargin) (); } |
1382 | long GetBottomMargin(const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetBottomMargin)(); } |
1383 | long GetLeftMargin (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetLeftMargin) (); } |
1384 | long GetRightMargin (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetRightMargin) (); } |
1385 | void SetXMargins(SwFrame& rFrame, long nLeft, long nRight) const { (rFrame.*m_fnRect->fnSetXMargins)(nLeft, nRight); } |
1386 | void SetYMargins(SwFrame& rFrame, long nTop, long nBottom) const { (rFrame.*m_fnRect->fnSetYMargins)(nTop, nBottom); } |
1387 | long GetPrtTop (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetPrtTop) (); } |
1388 | long GetPrtBottom (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetPrtBottom) (); } |
1389 | long GetPrtLeft (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetPrtLeft) (); } |
1390 | long GetPrtRight (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetPrtRight) (); } |
1391 | long TopDist (const SwRect& rRect, long nPos) const { return (rRect.*m_fnRect->fnTopDist) (nPos); } |
1392 | long BottomDist(const SwRect& rRect, long nPos) const { return (rRect.*m_fnRect->fnBottomDist) (nPos); } |
1393 | long LeftDist (const SwRect& rRect, long nPos) const { return (rRect.*m_fnRect->fnLeftDist) (nPos); } |
1394 | long RightDist (const SwRect& rRect, long nPos) const { return (rRect.*m_fnRect->fnRightDist) (nPos); } |
1395 | void SetLimit (SwFrame& rFrame, long nNew) const { (rFrame.*m_fnRect->fnSetLimit) (nNew); } |
1396 | bool OverStep (const SwRect& rRect, long nPos) const { return (rRect.*m_fnRect->fnOverStep) (nPos); } |
1397 | |
1398 | void SetPos(SwRect& rRect, const Point& rNew) const { (rRect.*m_fnRect->fnSetPos)(rNew); } |
1399 | void MakePos(SwFrame& rFrame, const SwFrame* pUp, const SwFrame* pPrv, bool bNotify) const { (rFrame.*m_fnRect->fnMakePos)(pUp, pPrv, bNotify); } |
1400 | long XDiff(long n1, long n2) const { return (m_fnRect->fnXDiff) (n1, n2); } |
1401 | long YDiff(long n1, long n2) const { return (m_fnRect->fnYDiff) (n1, n2); } |
1402 | long XInc (long n1, long n2) const { return (m_fnRect->fnXInc) (n1, n2); } |
1403 | long YInc (long n1, long n2) const { return (m_fnRect->fnYInc) (n1, n2); } |
1404 | |
1405 | void SetLeftAndWidth(SwRect& rRect, long nLeft, long nWidth) const { (rRect.*m_fnRect->fnSetLeftAndWidth)(nLeft, nWidth); } |
1406 | void SetTopAndHeight(SwRect& rRect, long nTop, long nHeight) const { (rRect.*m_fnRect->fnSetTopAndHeight)(nTop, nHeight); } |
1407 | |
1408 | private: |
1409 | bool m_bVert; |
1410 | bool m_bVertL2R; |
1411 | bool m_bVertL2RB2T; |
1412 | SwRectFn m_fnRect; |
1413 | }; |
1414 | |
1415 | #endif |
1416 | |
1417 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |