1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26
27 // include ---------------------------------------------------------------
28
29
30 #include <vcl/bitmap.hxx>
31 #include <editeng/frmdiritem.hxx>
32 #include <svx/pageitem.hxx>
33 #include <svx/pagectrl.hxx>
34 #include <editeng/boxitem.hxx>
35
36 #include <algorithm>
37
38 // struct PageWindow_Impl ------------------------------------------------
39
40 struct PageWindow_Impl
41 {
42 SvxBoxItem* pBorder;
43 Bitmap aBitmap;
44 FASTBOOL bBitmap;
45 sal_Bool bResetBackground;
46 sal_Bool bFrameDirection;
47 sal_Int32 nFrameDirection;
48
49
PageWindow_ImplPageWindow_Impl50 PageWindow_Impl() :
51 pBorder(0),
52 bBitmap(sal_False),
53 bResetBackground(sal_False),
54 bFrameDirection(sal_False),
55 nFrameDirection(0) {}
56
EnableFrameDirectionPageWindow_Impl57 void EnableFrameDirection(sal_Bool bEnable){bFrameDirection = bEnable;}
SetFrameDirectionPageWindow_Impl58 void SetFrameDirection(sal_Int32 nDirection){nFrameDirection = nDirection;}
59
60 };
61
62 // STATIC DATA -----------------------------------------------------------
63
64 #define CELL_WIDTH 1600L
65 #define CELL_HEIGHT 800L
66
67 // class SvxPageWindow ---------------------------------------------------
68
SvxPageWindow(Window * pParent,const ResId & rId)69 SvxPageWindow::SvxPageWindow( Window* pParent, const ResId& rId ) :
70
71 Window( pParent, rId ),
72
73 nTop ( 0 ),
74 nBottom ( 0 ),
75 nLeft ( 0 ),
76 nRight ( 0 ),
77 aColor ( COL_TRANSPARENT ),
78 nHdLeft ( 0 ),
79 nHdRight ( 0 ),
80 nHdDist ( 0 ),
81 nHdHeight ( 0 ),
82 aHdColor ( COL_TRANSPARENT ),
83 pHdBorder ( 0 ),
84 nFtLeft ( 0 ),
85 nFtRight ( 0 ),
86 nFtDist ( 0 ),
87 nFtHeight ( 0 ),
88 aFtColor ( COL_TRANSPARENT ),
89 pFtBorder ( 0 ),
90 bFooter ( sal_False ),
91 bHeader ( sal_False ),
92 bTable ( sal_False ),
93 bHorz ( sal_False ),
94 bVert ( sal_False ),
95 eUsage ( SVX_PAGE_ALL )
96
97 {
98 pImpl = new PageWindow_Impl;
99
100 // defaultmaessing in Twips rechnen
101 SetMapMode( MapMode( MAP_TWIP ) );
102 aWinSize = GetOutputSizePixel();
103 aWinSize.Height() -= 4;
104 aWinSize.Width() -= 4;
105
106 aWinSize = PixelToLogic( aWinSize );
107 SetBackground();
108 }
109
110 // -----------------------------------------------------------------------
111
~SvxPageWindow()112 SvxPageWindow::~SvxPageWindow()
113 {
114 delete pImpl;
115 delete pHdBorder;
116 delete pFtBorder;
117 }
118
119 // -----------------------------------------------------------------------
120
Paint(const Rectangle &)121 void __EXPORT SvxPageWindow::Paint( const Rectangle& )
122 {
123 Fraction aXScale( aWinSize.Width(), std::max( (long) (aSize.Width() * 2 + aSize.Width() / 8), 1L ) );
124 Fraction aYScale( aWinSize.Height(), std::max( aSize.Height(), 1L ) );
125 MapMode aMapMode( GetMapMode() );
126
127 if ( aYScale < aXScale )
128 {
129 aMapMode.SetScaleX( aYScale );
130 aMapMode.SetScaleY( aYScale );
131 }
132 else
133 {
134 aMapMode.SetScaleX( aXScale );
135 aMapMode.SetScaleY( aXScale );
136 }
137 SetMapMode( aMapMode );
138 Size aSz( PixelToLogic( GetSizePixel() ) );
139 long nYPos = ( aSz.Height() - aSize.Height() ) / 2;
140
141 if ( eUsage == SVX_PAGE_ALL )
142 {
143 // alle Seiten gleich -> eine Seite malen
144 if ( aSize.Width() > aSize.Height() )
145 {
146 // Querformat in gleicher Gr"osse zeichnen
147 Fraction aX = aMapMode.GetScaleX();
148 Fraction aY = aMapMode.GetScaleY();
149 Fraction a2( 1.5 );
150 aX *= a2;
151 aY *= a2;
152 aMapMode.SetScaleX( aX );
153 aMapMode.SetScaleY( aY );
154 SetMapMode( aMapMode );
155 aSz = PixelToLogic( GetSizePixel() );
156 nYPos = ( aSz.Height() - aSize.Height() ) / 2;
157 long nXPos = ( aSz.Width() - aSize.Width() ) / 2;
158 DrawPage( Point( nXPos, nYPos ), sal_True, sal_True );
159 }
160 else
161 // Hochformat
162 DrawPage( Point( ( aSz.Width() - aSize.Width() ) / 2, nYPos ), sal_True, sal_True );
163 }
164 else
165 {
166 // Linke und rechte Seite unterschiedlich -> ggf. zwei Seiten malen
167 DrawPage( Point( 0, nYPos ), sal_False, (sal_Bool)( eUsage & SVX_PAGE_LEFT ) );
168 DrawPage( Point( aSize.Width() + aSize.Width() / 8, nYPos ), sal_True,
169 (sal_Bool)( eUsage & SVX_PAGE_RIGHT ) );
170 }
171 }
172
173 // -----------------------------------------------------------------------
DrawPage(const Point & rOrg,const sal_Bool bSecond,const sal_Bool bEnabled)174 void SvxPageWindow::DrawPage( const Point& rOrg, const sal_Bool bSecond, const sal_Bool bEnabled )
175 {
176 const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
177 const Color& rFieldColor = rStyleSettings.GetFieldColor();
178 const Color& rFieldTextColor = rStyleSettings.GetFieldTextColor();
179 const Color& rDisableColor = rStyleSettings.GetDisableColor();
180 const Color& rDlgColor = rStyleSettings.GetDialogColor();
181
182 // background
183 if(!bSecond || pImpl->bResetBackground)
184 {
185 SetLineColor( Color(COL_TRANSPARENT) );
186 SetFillColor( rDlgColor );
187 Size winSize(GetOutputSize());
188 DrawRect( Rectangle( Point(0,0), winSize ) );
189
190 if ( pImpl->bResetBackground )
191 pImpl->bResetBackground = sal_False;
192 }
193 SetLineColor( rFieldTextColor );
194 // Schatten
195 Size aTempSize = aSize;
196 // Seite
197 if ( !bEnabled )
198 {
199 SetFillColor( rDisableColor );
200 DrawRect( Rectangle( rOrg, aTempSize ) );
201 return;
202 }
203 SetFillColor( rFieldColor );
204 DrawRect( Rectangle( rOrg, aTempSize ) );
205
206 // Border Top Bottom Left Right
207 Point aBegin( rOrg );
208 Point aEnd( rOrg );
209
210 long nL = nLeft;
211 long nR = nRight;
212
213 if ( eUsage == SVX_PAGE_MIRROR && !bSecond )
214 {
215 // f"ur gespiegelt drehen
216 nL = nRight;
217 nR = nLeft;
218 }
219
220 Rectangle aRect;
221
222 aRect.Left() = rOrg.X() + nL;
223 aRect.Right() = rOrg.X() + aTempSize.Width() - nR;
224 aRect.Top() = rOrg.Y() + nTop;
225 aRect.Bottom()= rOrg.Y() + aTempSize.Height() - nBottom;
226
227 Rectangle aHdRect( aRect );
228 Rectangle aFtRect( aRect );
229
230 if ( bHeader )
231 {
232 // ggf. Header anzeigen
233 aHdRect.Left() += nHdLeft;
234 aHdRect.Right() -= nHdRight;
235 aHdRect.Bottom() = aRect.Top() + nHdHeight;
236 aRect.Top() += nHdHeight + nHdDist;
237 SetFillColor( aHdColor );
238 DrawRect( aHdRect );
239 }
240
241 if ( bFooter )
242 {
243 // ggf. Footer anzeigen
244 aFtRect.Left() += nFtLeft;
245 aFtRect.Right() -= nFtRight;
246 aFtRect.Top() = aRect.Bottom() - nFtHeight;
247 aRect.Bottom() -= nFtHeight + nFtDist;
248 SetFillColor( aFtColor );
249 DrawRect( aFtRect );
250 }
251
252 // Body malen
253 SetFillColor( aColor );
254 if ( pImpl->bBitmap )
255 {
256 DrawRect( aRect );
257 Point aBmpPnt = aRect.TopLeft();
258 Size aBmpSiz = aRect.GetSize();
259 long nDeltaX = aBmpSiz.Width() / 15;
260 long nDeltaY = aBmpSiz.Height() / 15;
261 aBmpPnt.X() += nDeltaX;
262 aBmpPnt.Y() += nDeltaY;
263 aBmpSiz.Width() -= nDeltaX * 2;
264 aBmpSiz.Height() -= nDeltaY * 2;
265 DrawBitmap( aBmpPnt, aBmpSiz, pImpl->aBitmap );
266 }
267 else
268 DrawRect( aRect );
269
270 if(pImpl->bFrameDirection && !bTable)
271 {
272 //pImpl->nFrameDirection
273 Point aPos;
274 Font aFont(GetFont());
275 const Size aSaveSize = aFont.GetSize();
276 Size aDrawSize( 0, aRect.GetHeight() / 6);
277 aFont.SetSize(aDrawSize);
278 SetFont(aFont);
279 String sText(String::CreateFromAscii("ABC"));
280 Point aMove(1, GetTextHeight());
281 sal_Unicode cArrow = 0x2193;
282 long nAWidth = GetTextWidth(String(sText.GetChar(0)));
283 switch(pImpl->nFrameDirection)
284 {
285 case FRMDIR_HORI_LEFT_TOP:
286 aPos = aRect.TopLeft();
287 aPos.X() += PixelToLogic(Point(1,1)).X();
288 aMove.Y() = 0;
289 cArrow = 0x2192;
290 break;
291 case FRMDIR_HORI_RIGHT_TOP:
292 aPos = aRect.TopRight();
293 aPos.X() -= nAWidth;
294 aMove.Y() = 0;
295 aMove.X() *= -1;
296 cArrow = 0x2190;
297 break;
298 case FRMDIR_VERT_TOP_LEFT:
299 aPos = aRect.TopLeft();
300 aPos.X() += PixelToLogic(Point(1,1)).X();
301 aMove.X() = 0;
302 break;
303 case FRMDIR_VERT_TOP_RIGHT:
304 aPos = aRect.TopRight();
305 aPos.X() -= nAWidth;
306 aMove.X() = 0;
307 break;
308 }
309 sText.Append(cArrow);
310 for(sal_uInt16 i = 0; i < sText.Len(); i++)
311 {
312 String sDraw(sText.GetChar(i));
313 long nHDiff = 0;
314 long nCharWidth = GetTextWidth(sDraw);
315 sal_Bool bHorizontal = 0 == aMove.Y();
316 if(!bHorizontal)
317 {
318 nHDiff = (nAWidth - nCharWidth)/2;
319 aPos.X() += nHDiff;
320 }
321 DrawText(aPos, sDraw);
322 if(bHorizontal)
323 {
324 aPos.X() += aMove.X() < 0 ? - nCharWidth : nCharWidth;
325 }
326 else
327 {
328 aPos.X() -= nHDiff;
329 aPos.Y() += aMove.Y();
330 }
331 }
332 aFont.SetSize(aSaveSize);
333 SetFont(aFont);
334
335 }
336 if ( bTable )
337 {
338 // Tabelle malen, ggf. zentrieren
339 SetLineColor( Color(COL_LIGHTGRAY) );
340
341 long nW = aRect.GetWidth(), nH = aRect.GetHeight();
342 long nTW = CELL_WIDTH * 3, nTH = CELL_HEIGHT * 3;
343 long _nLeft = bHorz ? aRect.Left() + ((nW - nTW) / 2) : aRect.Left();
344 long _nTop = bVert ? aRect.Top() + ((nH - nTH) / 2) : aRect.Top();
345 Rectangle aCellRect( Point( _nLeft, _nTop ), Size( CELL_WIDTH, CELL_HEIGHT ) );
346
347 for ( sal_uInt16 i = 0; i < 3; ++i )
348 {
349 aCellRect.Left() = _nLeft;
350 aCellRect.Right() = _nLeft + CELL_WIDTH;
351 if ( i > 0 )
352 aCellRect.Move( 0, CELL_HEIGHT );
353
354 for ( sal_uInt16 j = 0; j < 3; ++j )
355 {
356 if ( j > 0 )
357 aCellRect.Move( CELL_WIDTH, 0 );
358 DrawRect( aCellRect );
359 }
360 }
361 }
362 }
363
364 // -----------------------------------------------------------------------
365
SetBorder(const SvxBoxItem & rNew)366 void SvxPageWindow::SetBorder( const SvxBoxItem& rNew )
367 {
368 delete pImpl->pBorder;
369 pImpl->pBorder = new SvxBoxItem( rNew );
370 }
371
372 // -----------------------------------------------------------------------
373
SetBitmap(Bitmap * pBmp)374 void SvxPageWindow::SetBitmap( Bitmap* pBmp )
375 {
376 if ( pBmp )
377 {
378 pImpl->aBitmap = *pBmp;
379 pImpl->bBitmap = sal_True;
380 }
381 else
382 pImpl->bBitmap = sal_False;
383 }
384
385 // -----------------------------------------------------------------------
386
SetHdBorder(const SvxBoxItem & rNew)387 void SvxPageWindow::SetHdBorder( const SvxBoxItem& rNew )
388 {
389 delete pHdBorder;
390 pHdBorder = new SvxBoxItem( rNew );
391 }
392 // -----------------------------------------------------------------------
393
SetFtBorder(const SvxBoxItem & rNew)394 void SvxPageWindow::SetFtBorder( const SvxBoxItem& rNew )
395 {
396 delete pFtBorder;
397 pFtBorder = new SvxBoxItem( rNew );
398 }
399 /* -----------------------------13.06.2002 16:16------------------------------
400
401 ---------------------------------------------------------------------------*/
EnableFrameDirection(sal_Bool bEnable)402 void SvxPageWindow::EnableFrameDirection(sal_Bool bEnable)
403 {
404 pImpl->EnableFrameDirection(bEnable);
405 }
406 /* -----------------------------13.06.2002 16:16------------------------------
407
408 ---------------------------------------------------------------------------*/
SetFrameDirection(sal_Int32 nFrameDirection)409 void SvxPageWindow::SetFrameDirection(sal_Int32 nFrameDirection)
410 {
411 pImpl->SetFrameDirection(nFrameDirection);
412 }
413
ResetBackground()414 void SvxPageWindow::ResetBackground()
415 {
416 pImpl->bResetBackground = sal_True;
417 }
418