File: qwt__layout__metrics_8cpp-source.html

package info (click to toggle)
libqwt 4.2.0-4.1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 9,832 kB
  • ctags: 5,512
  • sloc: cpp: 22,973; ansic: 244; makefile: 66
file content (368 lines) | stat: -rw-r--r-- 20,508 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Qwt User&apos;s Guide: qwt_layout_metrics.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.8 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
<h1>qwt_layout_metrics.cpp</h1><pre class="fragment"><div>00001 <span class="comment">/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************</span>
00002 <span class="comment"> * Qwt Widget Library</span>
00003 <span class="comment"> * Copyright (C) 1997   Josef Wilgen</span>
00004 <span class="comment"> * Copyright (C) 2002   Uwe Rathmann</span>
00005 <span class="comment"> * </span>
00006 <span class="comment"> * This library is free software; you can redistribute it and/or</span>
00007 <span class="comment"> * modify it under the terms of the Qwt License, Version 1.0</span>
00008 <span class="comment"> *****************************************************************************/</span>
00009 
00010 <span class="preprocessor">#include &lt;qapplication.h&gt;</span>
00011 <span class="preprocessor">#include &lt;qpainter.h&gt;</span>
00012 <span class="preprocessor">#include &lt;qpaintdevicemetrics.h&gt;</span> 
00013 <span class="preprocessor">#include &lt;qsimplerichtext.h&gt;</span> 
00014 <span class="preprocessor">#if QT_VERSION &gt;= 300</span>
00015 <span class="preprocessor"></span><span class="preprocessor">#include &lt;qdesktopwidget.h&gt;</span> 
00016 <span class="preprocessor">#endif</span>
00017 <span class="preprocessor"></span><span class="preprocessor">#include "qwt_layout_metrics.h"</span>
00018 
00019 QwtMetricsMap::QwtMetricsMap()
00020 {
00021     d_screenToLayoutX = d_screenToLayoutY = 
00022         d_deviceToLayoutX = d_deviceToLayoutY = 1.0;
00023 }
00024 
00025 <span class="keywordtype">void</span> QwtMetricsMap::setMetrics(<span class="keyword">const</span> QPaintDeviceMetrics &amp;layoutMetrics, 
00026     <span class="keyword">const</span> QPaintDeviceMetrics &amp;deviceMetrics)
00027 {
00028     <span class="keyword">const</span> QPaintDeviceMetrics screenMetrics(QApplication::desktop());
00029 
00030     d_screenToLayoutX = double(layoutMetrics.logicalDpiX()) / 
00031         double(screenMetrics.logicalDpiX());
00032     d_screenToLayoutY = double(layoutMetrics.logicalDpiY()) / 
00033         double(screenMetrics.logicalDpiY());
00034 
00035     d_deviceToLayoutX = double(layoutMetrics.logicalDpiX()) / 
00036         double(deviceMetrics.logicalDpiX());
00037     d_deviceToLayoutY = double(layoutMetrics.logicalDpiY()) / 
00038         double(deviceMetrics.logicalDpiY());
00039 }
00040 
00041 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00042 <span class="preprocessor"></span>QPoint QwtMetricsMap::layoutToDevice(<span class="keyword">const</span> QPoint &amp;point, 
00043     <span class="keyword">const</span> QPainter *painter) <span class="keyword">const</span>
00044 <span class="preprocessor">#else</span>
00045 <span class="preprocessor"></span>QPoint QwtMetricsMap::layoutToDevice(<span class="keyword">const</span> QPoint &amp;point, 
00046     <span class="keyword">const</span> QPainter *) const
00047 #endif
00048 {
00049     <span class="keywordflow">if</span> ( isIdentity() )
00050         <span class="keywordflow">return</span> point;
00051 
00052     QPoint mappedPoint(point);
00053 
00054 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00055 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00056         mappedPoint = painter-&gt;worldMatrix().map(mappedPoint);
00057 <span class="preprocessor">#endif</span>
00058 <span class="preprocessor"></span>
00059     mappedPoint.setX(layoutToDeviceX(mappedPoint.x()));
00060     mappedPoint.setY(layoutToDeviceY(mappedPoint.y()));
00061 
00062 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00063 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00064         mappedPoint = painter-&gt;worldMatrix().invert().map(mappedPoint);
00065 <span class="preprocessor">#endif</span>
00066 <span class="preprocessor"></span>
00067     <span class="keywordflow">return</span> mappedPoint;
00068 }
00069 
00070 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00071 <span class="preprocessor"></span>QPoint QwtMetricsMap::deviceToLayout(<span class="keyword">const</span> QPoint &amp;point, 
00072     <span class="keyword">const</span> QPainter *painter) <span class="keyword">const</span>
00073 <span class="preprocessor">#else</span>
00074 <span class="preprocessor"></span>QPoint QwtMetricsMap::deviceToLayout(<span class="keyword">const</span> QPoint &amp;point, 
00075     <span class="keyword">const</span> QPainter *) const
00076 #endif
00077 {
00078     <span class="keywordflow">if</span> ( isIdentity() )
00079         <span class="keywordflow">return</span> point;
00080 
00081     QPoint mappedPoint(point);
00082 
00083 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00084 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00085         mappedPoint = painter-&gt;worldMatrix().map(mappedPoint);
00086 <span class="preprocessor">#endif</span>
00087 <span class="preprocessor"></span>
00088     mappedPoint.setX(deviceToLayoutX(mappedPoint.x()));
00089     mappedPoint.setY(deviceToLayoutY(mappedPoint.y()));
00090 
00091 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00092 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00093         mappedPoint = painter-&gt;worldMatrix().invert().map(mappedPoint);
00094 <span class="preprocessor">#endif</span>
00095 <span class="preprocessor"></span>
00096     <span class="keywordflow">return</span> mappedPoint;
00097 }
00098 
00099 QPoint QwtMetricsMap::screenToLayout(<span class="keyword">const</span> QPoint &amp;point)<span class="keyword"> const</span>
00100 <span class="keyword"></span>{
00101     <span class="keywordflow">if</span> ( d_screenToLayoutX == 1.0 &amp;&amp; d_screenToLayoutY == 1.0 )
00102         <span class="keywordflow">return</span> point;
00103 
00104     <span class="keywordflow">return</span> QPoint(screenToLayoutX(point.x()), screenToLayoutY(point.y()));
00105 }
00106 
00107 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00108 <span class="preprocessor"></span>QRect QwtMetricsMap::layoutToDevice(<span class="keyword">const</span> QRect &amp;rect, 
00109     <span class="keyword">const</span> QPainter *painter) <span class="keyword">const</span>
00110 <span class="preprocessor">#else</span>
00111 <span class="preprocessor"></span>QRect QwtMetricsMap::layoutToDevice(<span class="keyword">const</span> QRect &amp;rect, 
00112     <span class="keyword">const</span> QPainter *) const
00113 #endif
00114 {
00115     <span class="keywordflow">if</span> ( isIdentity() )
00116         <span class="keywordflow">return</span> rect;
00117 
00118     QRect mappedRect(rect);
00119 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00120 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00121         mappedRect = translate(painter-&gt;worldMatrix(), mappedRect);
00122 <span class="preprocessor">#endif</span>
00123 <span class="preprocessor"></span>
00124     mappedRect = QRect(
00125         layoutToDeviceX(mappedRect.x()), 
00126         layoutToDeviceY(mappedRect.y()),
00127         layoutToDeviceX(mappedRect.width()), 
00128         layoutToDeviceY(mappedRect.height())
00129     );
00130 
00131 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00132 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00133         mappedRect = translate(painter-&gt;worldMatrix().invert(), mappedRect);
00134 <span class="preprocessor">#endif</span>
00135 <span class="preprocessor"></span>
00136     <span class="keywordflow">return</span> mappedRect;
00137 }
00138 
00139 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00140 <span class="preprocessor"></span>QRect QwtMetricsMap::deviceToLayout(<span class="keyword">const</span> QRect &amp;rect,
00141     <span class="keyword">const</span> QPainter *painter) <span class="keyword">const</span>
00142 <span class="preprocessor">#else</span>
00143 <span class="preprocessor"></span>QRect QwtMetricsMap::deviceToLayout(<span class="keyword">const</span> QRect &amp;rect,
00144     <span class="keyword">const</span> QPainter *) const
00145 #endif
00146 {
00147     <span class="keywordflow">if</span> ( isIdentity() )
00148         <span class="keywordflow">return</span> rect;
00149 
00150     QRect mappedRect(rect);
00151 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00152 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00153         mappedRect = translate(painter-&gt;worldMatrix(), mappedRect);
00154 <span class="preprocessor">#endif</span>
00155 <span class="preprocessor"></span>
00156     mappedRect = QRect(
00157         deviceToLayoutX(mappedRect.x()), 
00158         deviceToLayoutY(mappedRect.y()),
00159         deviceToLayoutX(mappedRect.width()), 
00160         deviceToLayoutY(mappedRect.height())
00161     );
00162 
00163 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00164 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00165         mappedRect = translate(painter-&gt;worldMatrix().invert(), mappedRect);
00166 <span class="preprocessor">#endif</span>
00167 <span class="preprocessor"></span>
00168     <span class="keywordflow">return</span> mappedRect;
00169 }
00170 
00171 QRect QwtMetricsMap::screenToLayout(<span class="keyword">const</span> QRect &amp;rect)<span class="keyword"> const</span>
00172 <span class="keyword"></span>{
00173     <span class="keywordflow">if</span> ( d_deviceToLayoutX == 1.0 &amp;&amp; d_deviceToLayoutY == 1.0 )
00174         <span class="keywordflow">return</span> rect;
00175 
00176     <span class="keywordflow">return</span> QRect(screenToLayoutX(rect.x()), screenToLayoutY(rect.y()),
00177         screenToLayoutX(rect.width()), screenToLayoutY(rect.height()));
00178 }
00179 
00180 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00181 <span class="preprocessor"></span>QPointArray QwtMetricsMap::layoutToDevice(<span class="keyword">const</span> QPointArray &amp;pa, 
00182     <span class="keyword">const</span> QPainter *painter) <span class="keyword">const</span>
00183 <span class="preprocessor">#else</span>
00184 <span class="preprocessor"></span>QPointArray QwtMetricsMap::layoutToDevice(<span class="keyword">const</span> QPointArray &amp;pa, 
00185     <span class="keyword">const</span> QPainter *) const
00186 #endif
00187 {
00188     <span class="keywordflow">if</span> ( isIdentity() )
00189         <span class="keywordflow">return</span> pa;
00190     
00191     QPointArray mappedPa(pa);
00192 
00193 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00194 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00195         mappedPa = translate(painter-&gt;worldMatrix(), mappedPa);
00196 <span class="preprocessor">#endif</span>
00197 <span class="preprocessor"></span>
00198     QWMatrix m;
00199     m.scale(1.0 / d_deviceToLayoutX, 1.0 / d_deviceToLayoutY);
00200     mappedPa = translate(m, mappedPa);
00201 
00202 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00203 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00204         mappedPa = translate(painter-&gt;worldMatrix().invert(), mappedPa);
00205 <span class="preprocessor">#endif</span>
00206 <span class="preprocessor"></span>
00207     <span class="keywordflow">return</span> mappedPa;
00208 
00209 }
00210 
00211 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00212 <span class="preprocessor"></span>QPointArray QwtMetricsMap::deviceToLayout(<span class="keyword">const</span> QPointArray &amp;pa, 
00213     <span class="keyword">const</span> QPainter *painter) <span class="keyword">const</span>
00214 <span class="preprocessor">#else</span>
00215 <span class="preprocessor"></span>QPointArray QwtMetricsMap::deviceToLayout(<span class="keyword">const</span> QPointArray &amp;pa, 
00216     <span class="keyword">const</span> QPainter *) const
00217 #endif
00218 {
00219     <span class="keywordflow">if</span> ( isIdentity() )
00220         <span class="keywordflow">return</span> pa;
00221     
00222     QPointArray mappedPa(pa);
00223 
00224 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00225 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00226         mappedPa = translate(painter-&gt;worldMatrix(), mappedPa);
00227 <span class="preprocessor">#endif</span>
00228 <span class="preprocessor"></span>
00229     QWMatrix m;
00230     m.scale(d_deviceToLayoutX, d_deviceToLayoutY);
00231     mappedPa = translate(m, mappedPa);
00232 
00233 <span class="preprocessor">#ifndef QT_NO_TRANSFORMATIONS</span>
00234 <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( painter )
00235         mappedPa = translate(painter-&gt;worldMatrix().invert(), mappedPa);
00236 <span class="preprocessor">#endif</span>
00237 <span class="preprocessor"></span>
00238     <span class="keywordflow">return</span> mappedPa;
00239 }
00240 
00245 QRect QwtMetricsMap::translate(
00246     <span class="keyword">const</span> QWMatrix &amp;m, <span class="keyword">const</span> QRect &amp;rect) 
00247 {
00248 <span class="preprocessor">#if QT_VERSION &lt; 300</span>
00249 <span class="preprocessor"></span>    <span class="keywordflow">return</span> m.map(rect.normalize());
00250 <span class="preprocessor">#else</span>
00251 <span class="preprocessor"></span>    <span class="keywordflow">return</span> m.mapRect(rect);
00252 <span class="preprocessor">#endif</span>
00253 <span class="preprocessor"></span>}
00254 
00260 QPointArray QwtMetricsMap::translate(
00261     <span class="keyword">const</span> QWMatrix &amp;m, <span class="keyword">const</span> QPointArray &amp;pa) 
00262 {
00263 <span class="preprocessor">#if QT_VERSION &lt; 300</span>
00264 <span class="preprocessor"></span>    <span class="keywordflow">return</span> m.map(pa);
00265 <span class="preprocessor">#elif QT_VERSION &lt; 400</span>
00266 <span class="preprocessor"></span>    <span class="keywordflow">return</span> m * pa;
00267 <span class="preprocessor">#else</span>
00268 <span class="preprocessor"></span>    <span class="keywordflow">return</span> m.map(pa);
00269 <span class="preprocessor">#endif</span>
00270 <span class="preprocessor"></span>}
00271 
00272 QwtLayoutMetrics::QwtLayoutMetrics()
00273 {
00274 }
00275 
00276 QwtLayoutMetrics::QwtLayoutMetrics(<span class="keyword">const</span> QwtMetricsMap &amp;map):
00277     d_map(map)
00278 {
00279 }
00280 
00281 <span class="keywordtype">void</span> QwtLayoutMetrics::setMap(<span class="keyword">const</span> QwtMetricsMap &amp;map)
00282 {
00283     d_map = map;
00284 }
00285 
00286 <span class="keywordtype">int</span> QwtLayoutMetrics::heightForWidth(<span class="keyword">const</span> QString &amp;text,
00287     <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> flags, <span class="keyword">const</span> QFontMetrics &amp;fm)<span class="keyword"> const</span>
00288 <span class="keyword"></span>{
00289     <span class="keyword">const</span> QRect rect = fm.boundingRect(
00290         0, 0, d_map.layoutToScreenX(width), QCOORD_MAX, flags, text);
00291     <span class="keywordflow">return</span> d_map.screenToLayoutY(rect.height());
00292 }
00293 
00294 <span class="keywordtype">int</span> QwtLayoutMetrics::heightForWidth(<span class="keyword">const</span> QString &amp;text,
00295     <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> flags, QPainter *painter)<span class="keyword"> const</span>
00296 <span class="keyword"></span>{
00297     <span class="keyword">const</span> QRect rect = painter-&gt;boundingRect(
00298         0, 0, d_map.layoutToDeviceX(width), QCOORD_MAX, flags, text);
00299 
00300     <span class="keywordflow">return</span> d_map.deviceToLayoutY(rect.height());
00301 }
00302 
00303 QRect QwtLayoutMetrics::boundingRect(<span class="keyword">const</span> QString &amp;text, 
00304     <span class="keywordtype">int</span> flags, QPainter *painter)<span class="keyword"> const</span>
00305 <span class="keyword"></span>{
00306     <span class="keyword">const</span> QRect rect = painter-&gt;boundingRect(
00307         0, 0, 0, 0, flags, text);
00308 
00309     <span class="keywordflow">return</span> d_map.deviceToLayout(rect);
00310 }
00311 
00312 QRect QwtLayoutMetrics::boundingRect(<span class="keyword">const</span> QString &amp;text, 
00313     <span class="keywordtype">int</span> flags, <span class="keyword">const</span> QFontMetrics &amp;fm)<span class="keyword"> const</span>
00314 <span class="keyword"></span>{
00315     QRect rect = fm.boundingRect(
00316         0, 0, QCOORD_MAX, QCOORD_MAX, flags, text);
00317 
00318     <span class="keywordflow">return</span> d_map.screenToLayout(rect);
00319 }
00320 
00321 <span class="preprocessor">#ifndef QT_NO_RICHTEXT</span>
00322 <span class="preprocessor"></span>
00323 <span class="keywordtype">int</span> QwtLayoutMetrics::heightForWidth(QSimpleRichText &amp;text, <span class="keywordtype">int</span> width)<span class="keyword"> const</span>
00324 <span class="keyword"></span>{
00325     text.setWidth(d_map.layoutToScreenX(width));
00326     <span class="keywordflow">return</span> d_map.screenToLayoutY(text.height());
00327 }
00328 
00329 QRect QwtLayoutMetrics::boundingRect(
00330     <span class="keyword">const</span> QSimpleRichText &amp;text, <span class="keywordtype">int</span> flags, QPainter *painter)<span class="keyword"> const</span>
00331 <span class="keyword"></span>{
00332     <span class="keyword">const</span> <span class="keywordtype">int</span> tw = text.width();
00333 
00334     <span class="keywordtype">int</span> w, h;
00335     <span class="keywordflow">if</span> ( painter )
00336     {
00337         ((QSimpleRichText &amp;)text).setWidth(painter, QCOORD_MAX);
00338         w = d_map.deviceToLayoutX(text.widthUsed());
00339         h = d_map.deviceToLayoutY(text.height());
00340     }
00341     <span class="keywordflow">else</span>
00342     {
00343         ((QSimpleRichText &amp;)text).setWidth(QCOORD_MAX);
00344         w = d_map.screenToLayoutX(text.widthUsed());
00345         h = d_map.screenToLayoutY(text.height());
00346     }
00347 
00348     ((QSimpleRichText &amp;)text).setWidth(tw); <span class="comment">// reset width</span>
00349 
00350     <span class="keywordtype">int</span> x = 0; 
00351     <span class="keywordtype">int</span> y = 0;
00352     <span class="keywordflow">if</span> (flags &amp; Qt::AlignHCenter)
00353         x -= w/2;
00354     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (flags &amp; Qt::AlignRight)
00355         x -= w;
00356 
00357     <span class="keywordflow">if</span> (flags &amp; Qt::AlignVCenter)
00358         y -= h/2;
00359     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (flags &amp; Qt::AlignBottom)
00360         y -= h;
00361 
00362     <span class="keywordflow">return</span> QRect(x, y, w, h);
00363 }
00364 
00365 <span class="preprocessor">#endif // !QT_NO_RICHTEXT</span>
</div></pre><hr size="1"><address style="align: right;"><small>Generated on Tue Nov 16 21:12:20 2004 for Qwt User's Guide by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.8 </small></address>
</body>
</html>