1 # -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
3 # This file is part of the LibreOffice project.
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/.
10 from libreoffice
.util
import printing
12 class SwPositionPrinter(object):
13 '''Prints SwPosition.'''
15 def __init__(self
, typename
, value
):
16 self
.typename
= typename
20 node
= self
.value
['nNode']['pNd'].dereference();
21 offset
= self
.value
['nContent']['m_nIndex']
22 return "%s (node %d, offset %d)" % (self
.typename
, node
['nOffset'], offset
)
24 class SwNodeIndexPrinter(object):
25 '''Prints SwNodeIndex.'''
27 def __init__(self
, typename
, value
):
28 self
.typename
= typename
32 node
= self
.value
['pNd'].dereference();
33 return "%s (node %d)" % (self
.typename
, node
['nOffset'])
35 class SwIndexPrinter(object):
38 def __init__(self
, typename
, value
):
39 self
.typename
= typename
43 offset
= self
.value
['m_nIndex']
44 return "%s (offset %d)" % (self
.typename
, offset
)
46 class SwPaMPrinter(object):
49 def __init__(self
, typename
, value
):
50 self
.typename
= typename
54 return "%s" % (self
.typename
)
57 next_
= self
.value
['pNext']
58 prev
= self
.value
['pPrev']
59 point
= self
.value
['m_pPoint'].dereference()
60 mark
= self
.value
['m_pMark'].dereference()
61 children
= [ ( 'point', point
), ( 'mark', mark
) ]
62 if next_
!= self
.value
.address
:
63 children
.append(("next", next_
))
64 if prev
!= self
.value
.address
:
65 children
.append(("prev", prev
))
66 return children
.__iter
__()
68 class SwUnoCrsrPrinter(SwPaMPrinter
):
69 '''Prints SwUnoCrsr.'''
71 class SwRectPrinter(object):
74 def __init__(self
, typename
, value
):
75 self
.typename
= typename
79 return "%s" % (self
.typename
)
82 point
= self
.value
['m_Point']
83 size
= self
.value
['m_Size']
84 children
= [ ( 'point', point
), ( 'size', size
) ]
85 return children
.__iter
__()
87 class SwIMarkPrinter(object):
88 '''Prints sw::mark::IMark.'''
90 def __init__(self
, typename
, value
):
91 self
.typename
= typename
95 return "%s" % (self
.typename
)
98 if str(self
.value
.dynamic_type
) == "sw::mark::UnoMark":
99 unoMark
= self
.value
.cast(self
.value
.dynamic_type
)
100 pos1
= unoMark
['m_pPos1']
101 pos2
= unoMark
['m_pPos2']
102 children
= [ ( 'pos1', pos1
), ( 'pos2', pos2
) ]
103 return children
.__iter
__()
105 return self
._iterator
(self
.value
)
107 class SwModifyPrinter(object):
108 '''Prints SwModify.'''
110 def __init__(self
, typename
, value
):
111 self
.typename
= typename
115 return "%s" % (self
.typename
)
118 if str(self
.value
.dynamic_type
) == "SwUnoCrsr":
119 unoCrsr
= self
.value
.cast(self
.value
.dynamic_type
)
120 return SwUnoCrsrPrinter(self
.typename
, unoCrsr
).children()
122 return self
._iterator
(self
.value
)
124 class SwXTextRangeImplPrinter(object):
125 '''Prints SwXTextRange::Impl.'''
127 def __init__(self
, typename
, value
):
128 self
.typename
= typename
132 return "%s" % (self
.typename
)
135 mark
= self
.value
['m_pMark'].dereference()
136 children
= [('mark', mark
)]
137 return children
.__iter
__()
139 class SwXTextCursorImplPrinter(object):
140 '''Prints SwXTextCursor::Impl.'''
142 def __init__(self
, typename
, value
):
143 self
.typename
= typename
147 return "%s" % (self
.typename
)
150 registeredIn
= self
.value
['pRegisteredIn'].dereference()
151 children
= [('registeredIn', registeredIn
)]
152 return children
.__iter
__()
154 class SwUnoImplPtrPrinter(object):
155 """Prints sw::UnoImplPtr"""
157 def __init__(self
, typename
, value
):
158 self
.typename
= typename
162 if self
.value
['m_p']:
163 return "%s %s" % (self
.typename
, self
.value
['m_p'].dereference())
165 return "empty %s" % (self
.typename
,)
167 class SwXTextRangePrinter(object):
168 '''Prints SwXTextRange.'''
170 def __init__(self
, typename
, value
):
171 self
.typename
= typename
175 return "%s %s" % (self
.typename
, self
.value
['m_pImpl'])
177 class SwXTextCursorPrinter(object):
178 '''Prints SwXTextCursor.'''
180 def __init__(self
, typename
, value
):
181 self
.typename
= typename
185 return "%s %s" % (self
.typename
, self
.value
['m_pImpl'])
187 class BigPtrArrayPrinter(object):
188 '''Prints BigPtrArray.'''
190 def __init__(self
, typename
, value
):
191 self
.typename
= typename
195 length
= self
.value
['nSize']
197 return "%s of length %d" % (self
.typename
, length
)
199 return "empty %s" % self
.typename
202 return self
._iterator
(self
.value
)
204 def display_hint(self
):
208 class _iterator(object):
210 def __init__(self
, array
):
211 self
.blocks
= array
['ppInf']
212 self
.count
= array
['nSize']
214 self
.block_count
= array
['nBlock']
218 self
.max_indent
= " "
219 self
._next
_block
(False)
220 self
._check
_invariant
()
225 def _node_value(self
, node
):
226 cur_indent
= self
.indent
227 if str(node
.dynamic_type
.target()) == "SwTxtNode":
228 # accessing this is completely non-obvious...
229 # also, node.dynamic_cast(node.dynamic_type) is null?
230 value
= " TextNode " + \
231 unicode(node
.cast(node
.dynamic_type
).dereference()['m_Text'])
232 elif str(node
.dynamic_type
.target()) == "SwOLENode":
234 elif str(node
.dynamic_type
.target()) == "SwGrfNode":
236 elif str(node
.dynamic_type
.target()) == "SwSectionNode":
237 value
= " SectionNode "
239 elif str(node
.dynamic_type
.target()) == "SwTableNode":
240 value
= " TableNode "
242 elif str(node
.dynamic_type
.target()) == "SwStartNode":
243 value
= " StartNode "
245 elif str(node
.dynamic_type
.target()) == "SwEndNode":
247 self
.indent
= self
.indent
[:-1]
248 cur_indent
= self
.indent
249 elif str(node
.dynamic_type
.target()) == "SwDummySectionNode":
250 value
= "DummySctNode "
251 else: # must be currently being deleted, so has some abstract type
252 value
= "~DeletedNode "
253 # return "\n[%s%4d%s] %s %s" % (cur_indent, self.pos, \
254 # self.max_indent[len(cur_indent):], node, value)
255 return "\n[%4d] %s%s%s %s" % (self
.pos
, cur_indent
, \
256 node
, self
.max_indent
[len(cur_indent
):], value
)
259 if self
.pos
== self
.count
:
260 raise StopIteration()
263 node
= self
.block
['pData'][self
.pos
- self
.block
['nStart']]
264 value
= self
._node
_value
(node
)
265 if self
.pos
== self
.block
['nEnd']:
269 self
._check
_invariant
()
272 def _next_block(self
, advance
= True):
276 if self
.block_pos
== self
.block_count
:
279 pblock
= self
.blocks
[self
.block_pos
]
281 block
= pblock
.dereference()
282 start
= block
['nStart']
284 assert end
- start
+ 1 == block
['nElem']
286 assert start
== self
.block
['nEnd'] + 1
287 assert end
<= self
.count
292 def _check_invariant(self
):
293 assert self
.pos
<= self
.count
294 assert self
.block_pos
<= self
.block_count
295 if self
.pos
== 0 and self
.pos
< self
.count
:
296 assert self
.block
!= None
300 def build_pretty_printers():
303 printer
= printing
.Printer("libreoffice/sw")
304 printer
.add('BigPtrArray', BigPtrArrayPrinter
)
305 printer
.add('SwPosition', SwPositionPrinter
)
306 printer
.add('SwNodeIndex', SwNodeIndexPrinter
)
307 printer
.add('SwIndex', SwIndexPrinter
)
308 printer
.add('SwPaM', SwPaMPrinter
)
309 printer
.add('SwUnoCrsr', SwUnoCrsrPrinter
)
310 printer
.add('SwRect', SwRectPrinter
)
311 printer
.add('sw::mark::IMark', SwIMarkPrinter
)
312 printer
.add('SwXTextRange::Impl', SwXTextRangeImplPrinter
)
313 printer
.add('sw::UnoImplPtr', SwUnoImplPtrPrinter
)
314 printer
.add('SwXTextRange', SwXTextRangePrinter
)
315 printer
.add('SwModify', SwModifyPrinter
)
316 printer
.add('SwXTextCursor::Impl', SwXTextCursorImplPrinter
)
317 printer
.add('SwXTextCursor', SwXTextCursorPrinter
)
319 def register_pretty_printers(obj
):
320 printing
.register_pretty_printer(printer
, obj
)
322 build_pretty_printers()
324 # vim:set shiftwidth=4 softtabstop=4 expandtab: