Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <vcl/edit.hxx>
21 : #include <vcl/layout.hxx>
22 : #include <vcl/msgbox.hxx>
23 : #include <vcl/svapp.hxx>
24 : #include <svl/zforlist.hxx>
25 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
26 : #include <com/sun/star/i18n/BreakIterator.hpp>
27 : #include <comphelper/processfactory.hxx>
28 : #include <svtools/scriptedtext.hxx>
29 : #include <svtools/accessibilityoptions.hxx>
30 : #include <svx/framelinkarray.hxx>
31 : #include "app.hrc"
32 : #include "swmodule.hxx"
33 : #include "swtypes.hxx"
34 : #include "view.hxx"
35 : #include "wrtsh.hxx"
36 : #include "tblafmt.hxx"
37 : #include "tautofmt.hxx"
38 : #include "shellres.hxx"
39 :
40 : using namespace com::sun::star;
41 :
42 : #define FRAME_OFFSET 4
43 :
44 : //========================================================================
45 :
46 : class AutoFmtPreview : public Window
47 : {
48 : public:
49 : AutoFmtPreview(Window* pParent);
50 : ~AutoFmtPreview();
51 :
52 : void NotifyChange( const SwTableAutoFmt& rNewData );
53 :
54 : void DetectRTL(SwWrtShell* pWrtShell);
55 :
56 : virtual void Resize();
57 : protected:
58 : virtual void Paint( const Rectangle& rRect );
59 :
60 : private:
61 : SwTableAutoFmt aCurData;
62 : VirtualDevice aVD;
63 : SvtScriptedTextHelper aScriptedText;
64 : svx::frame::Array maArray; /// Implementation to draw the frame borders.
65 : sal_Bool bFitWidth;
66 : bool mbRTL;
67 : Size aPrvSize;
68 : long nLabelColWidth;
69 : long nDataColWidth1;
70 : long nDataColWidth2;
71 : long nRowHeight;
72 : const String aStrJan;
73 : const String aStrFeb;
74 : const String aStrMar;
75 : const String aStrNorth;
76 : const String aStrMid;
77 : const String aStrSouth;
78 : const String aStrSum;
79 : SvNumberFormatter* pNumFmt;
80 :
81 : uno::Reference< lang::XMultiServiceFactory > m_xMSF;
82 : uno::Reference< i18n::XBreakIterator > m_xBreak;
83 :
84 : //-------------------------------------------
85 : void Init ();
86 : void DoPaint ( const Rectangle& rRect );
87 : void CalcCellArray ( sal_Bool bFitWidth );
88 : void CalcLineMap ();
89 : void PaintCells ();
90 :
91 : sal_uInt8 GetFormatIndex( size_t nCol, size_t nRow ) const;
92 : const SvxBoxItem& GetBoxItem( size_t nCol, size_t nRow ) const;
93 :
94 : void DrawString( size_t nCol, size_t nRow );
95 : void DrawStrings();
96 : void DrawBackground();
97 :
98 : void MakeFonts ( sal_uInt8 nIndex, Font& rFont, Font& rCJKFont, Font& rCTLFont );
99 : String MakeNumberString( String cellString, sal_Bool bAddDec );
100 : };
101 :
102 : //========================================================================
103 :
104 : class SwStringInputDlg : public ModalDialog
105 : {
106 : public:
107 : SwStringInputDlg( Window* pParent,
108 : const String& rTitle,
109 : const String& rEditTitle,
110 : const String& rDefault );
111 : ~SwStringInputDlg();
112 :
113 : void GetInputString( String& rString ) const;
114 :
115 : private:
116 : Edit* m_pEdInput; // Edit erhaelt so den Focus
117 : };
118 :
119 :
120 0 : SwStringInputDlg::SwStringInputDlg(Window* pParent, const String& rTitle,
121 : const String& rEditTitle, const String& rDefault)
122 0 : : ModalDialog(pParent, "StringInputDialog", "modules/swriter/ui/stringinput.ui")
123 : {
124 0 : get<FixedText>("name")->SetText(rEditTitle);
125 0 : get(m_pEdInput, "edit");
126 :
127 0 : SetText(rTitle);
128 0 : m_pEdInput->SetText(rDefault);
129 0 : }
130 :
131 : //------------------------------------------------------------------------
132 :
133 0 : void SwStringInputDlg::GetInputString( String& rString ) const
134 : {
135 0 : rString = m_pEdInput->GetText();
136 0 : }
137 :
138 :
139 0 : SwStringInputDlg::~SwStringInputDlg()
140 : {
141 0 : }
142 :
143 : //========================================================================
144 : // AutoFormat-Dialog:
145 :
146 :
147 0 : SwAutoFormatDlg::SwAutoFormatDlg( Window* pParent, SwWrtShell* pWrtShell,
148 : sal_Bool bSetAutoFormat, const SwTableAutoFmt* pSelFmt )
149 : : SfxModalDialog(pParent, "AutoFormatTableDialog", "modules/swriter/ui/autoformattable.ui")
150 : , aStrTitle(SW_RES(STR_ADD_AUTOFORMAT_TITLE))
151 : , aStrLabel(SW_RES(STR_ADD_AUTOFORMAT_LABEL))
152 : , aStrClose(SW_RES(STR_BTN_AUTOFORMAT_CLOSE))
153 : , aStrDelTitle(SW_RES(STR_DEL_AUTOFORMAT_TITLE))
154 : , aStrDelMsg(SW_RES(STR_DEL_AUTOFORMAT_MSG))
155 : , aStrRenameTitle(SW_RES(STR_RENAME_AUTOFORMAT_TITLE))
156 : , aStrInvalidFmt(SW_RES(STR_INVALID_AUTOFORMAT_NAME))
157 : , pShell(pWrtShell)
158 : , nIndex(0)
159 : , nDfltStylePos(0)
160 : , bCoreDataChanged(sal_False)
161 0 : , bSetAutoFmt(bSetAutoFormat)
162 : {
163 0 : get(m_pLbFormat, "formatlb");
164 0 : get(m_pFormatting, "formatting");
165 0 : get(m_pBtnNumFormat, "numformatcb");
166 0 : get(m_pBtnBorder, "bordercb");
167 0 : get(m_pBtnFont, "fontcb");
168 0 : get(m_pBtnPattern, "patterncb");
169 0 : get(m_pBtnAlignment, "alignmentcb");
170 0 : get(m_pBtnOk, "ok");
171 0 : get(m_pBtnCancel, "cancel");
172 0 : get(m_pBtnAdd, "add");
173 0 : get(m_pBtnRemove, "remove");
174 0 : get(m_pBtnRename, "rename");
175 0 : get(m_pWndPreview, "preview");
176 :
177 0 : m_pWndPreview->DetectRTL(pWrtShell);
178 :
179 0 : pTableTbl = new SwTableAutoFmtTbl;
180 0 : pTableTbl->Load();
181 :
182 0 : Init(pSelFmt);
183 0 : }
184 :
185 : //------------------------------------------------------------------------
186 :
187 :
188 0 : SwAutoFormatDlg::~SwAutoFormatDlg()
189 : {
190 0 : if (bCoreDataChanged)
191 0 : pTableTbl->Save();
192 0 : delete pTableTbl;
193 0 : }
194 :
195 : //------------------------------------------------------------------------
196 :
197 :
198 0 : void SwAutoFormatDlg::Init( const SwTableAutoFmt* pSelFmt )
199 : {
200 0 : Link aLk( LINK( this, SwAutoFormatDlg, CheckHdl ) );
201 0 : m_pBtnBorder->SetClickHdl( aLk );
202 0 : m_pBtnFont->SetClickHdl( aLk );
203 0 : m_pBtnPattern->SetClickHdl( aLk );
204 0 : m_pBtnAlignment->SetClickHdl( aLk );
205 0 : m_pBtnNumFormat->SetClickHdl( aLk );
206 :
207 0 : m_pBtnAdd->SetClickHdl ( LINK( this, SwAutoFormatDlg, AddHdl ) );
208 0 : m_pBtnRemove->SetClickHdl ( LINK( this, SwAutoFormatDlg, RemoveHdl ) );
209 0 : m_pBtnRename->SetClickHdl ( LINK( this, SwAutoFormatDlg, RenameHdl ) );
210 0 : m_pBtnOk->SetClickHdl ( LINK( this, SwAutoFormatDlg, OkHdl ) );
211 0 : m_pLbFormat->SetSelectHdl( LINK( this, SwAutoFormatDlg, SelFmtHdl ) );
212 :
213 0 : m_pBtnAdd->Enable( bSetAutoFmt );
214 :
215 0 : nIndex = 0;
216 0 : if( !bSetAutoFmt )
217 : {
218 : // dann muss die Liste um den Eintrag <Keins> erweitert werden.
219 0 : m_pLbFormat->InsertEntry( ViewShell::GetShellRes()->aStrNone );
220 0 : nDfltStylePos = 1;
221 0 : nIndex = 255;
222 : }
223 :
224 0 : for (sal_uInt8 i = 0, nCount = static_cast<sal_uInt8>(pTableTbl->size());
225 : i < nCount; i++)
226 : {
227 0 : SwTableAutoFmt const& rFmt = (*pTableTbl)[ i ];
228 0 : m_pLbFormat->InsertEntry(rFmt.GetName());
229 0 : if (pSelFmt && rFmt.GetName() == pSelFmt->GetName())
230 0 : nIndex = i;
231 : }
232 :
233 0 : m_pLbFormat->SelectEntryPos( 255 != nIndex ? (nDfltStylePos + nIndex) : 0 );
234 0 : SelFmtHdl( 0 );
235 0 : }
236 :
237 : //------------------------------------------------------------------------
238 :
239 :
240 0 : void SwAutoFormatDlg::UpdateChecks( const SwTableAutoFmt& rFmt, sal_Bool bEnable )
241 : {
242 0 : m_pBtnNumFormat->Enable( bEnable );
243 0 : m_pBtnNumFormat->Check( rFmt.IsValueFormat() );
244 :
245 0 : m_pBtnBorder->Enable( bEnable );
246 0 : m_pBtnBorder->Check( rFmt.IsFrame() );
247 :
248 0 : m_pBtnFont->Enable( bEnable );
249 0 : m_pBtnFont->Check( rFmt.IsFont() );
250 :
251 0 : m_pBtnPattern->Enable( bEnable );
252 0 : m_pBtnPattern->Check( rFmt.IsBackground() );
253 :
254 0 : m_pBtnAlignment->Enable( bEnable );
255 0 : m_pBtnAlignment->Check( rFmt.IsJustify() );
256 0 : }
257 :
258 0 : void SwAutoFormatDlg::FillAutoFmtOfIndex( SwTableAutoFmt*& rToFill ) const
259 : {
260 0 : if( 255 != nIndex )
261 : {
262 0 : if( rToFill )
263 0 : *rToFill = (*pTableTbl)[ nIndex ];
264 : else
265 0 : rToFill = new SwTableAutoFmt( (*pTableTbl)[ nIndex ] );
266 : }
267 : else
268 0 : delete rToFill, rToFill = 0;
269 0 : }
270 :
271 :
272 : /*------------------------------------------------------------------------
273 : Handler:
274 : ---------*/
275 :
276 :
277 0 : IMPL_LINK( SwAutoFormatDlg, CheckHdl, Button *, pBtn )
278 : {
279 0 : SwTableAutoFmt* pData = &(*pTableTbl)[nIndex];
280 0 : sal_Bool bCheck = ((CheckBox*)pBtn)->IsChecked(), bDataChgd = sal_True;
281 :
282 0 : if( pBtn == m_pBtnNumFormat )
283 0 : pData->SetValueFormat( bCheck );
284 0 : else if ( pBtn == m_pBtnBorder )
285 0 : pData->SetFrame( bCheck );
286 0 : else if ( pBtn == m_pBtnFont )
287 0 : pData->SetFont( bCheck );
288 0 : else if ( pBtn == m_pBtnPattern )
289 0 : pData->SetBackground( bCheck );
290 0 : else if ( pBtn == m_pBtnAlignment )
291 0 : pData->SetJustify( bCheck );
292 : else
293 0 : bDataChgd = sal_False;
294 :
295 0 : if( bDataChgd )
296 : {
297 0 : if( !bCoreDataChanged )
298 : {
299 0 : m_pBtnCancel->SetText( aStrClose );
300 0 : bCoreDataChanged = sal_True;
301 : }
302 :
303 0 : m_pWndPreview->NotifyChange( *pData );
304 : }
305 0 : return 0;
306 : }
307 :
308 : /*------------------------------------------------------------------------*/
309 :
310 :
311 0 : IMPL_LINK_NOARG(SwAutoFormatDlg, AddHdl)
312 : {
313 0 : sal_Bool bOk = sal_False, bFmtInserted = sal_False;
314 0 : while( !bOk )
315 : {
316 : SwStringInputDlg* pDlg = new SwStringInputDlg( this,
317 : aStrTitle,
318 : aStrLabel,
319 0 : aEmptyStr );
320 0 : if( RET_OK == pDlg->Execute() )
321 : {
322 0 : String aFormatName;
323 0 : pDlg->GetInputString( aFormatName );
324 :
325 0 : if( aFormatName.Len() > 0 )
326 : {
327 : sal_uInt16 n;
328 0 : for( n = 0; n < pTableTbl->size(); ++n )
329 0 : if( (*pTableTbl)[n].GetName() == aFormatName )
330 0 : break;
331 :
332 0 : if( n >= pTableTbl->size() )
333 : {
334 : // Format mit dem Namen noch nicht vorhanden, also
335 : // aufnehmen
336 : SwTableAutoFmt* pNewData = new
337 0 : SwTableAutoFmt( aFormatName );
338 0 : pShell->GetTableAutoFmt( *pNewData );
339 :
340 : // Sortiert einfuegen!!
341 0 : for( n = 1; n < pTableTbl->size(); ++n )
342 0 : if( (*pTableTbl)[ n ].GetName() > aFormatName )
343 0 : break;
344 :
345 0 : pTableTbl->InsertAutoFmt(n, pNewData);
346 0 : m_pLbFormat->InsertEntry( aFormatName, nDfltStylePos + n );
347 0 : m_pLbFormat->SelectEntryPos( nDfltStylePos + n );
348 0 : bFmtInserted = sal_True;
349 0 : m_pBtnAdd->Enable( sal_False );
350 0 : if ( !bCoreDataChanged )
351 : {
352 0 : m_pBtnCancel->SetText( aStrClose );
353 0 : bCoreDataChanged = sal_True;
354 : }
355 :
356 0 : SelFmtHdl( 0 );
357 0 : bOk = sal_True;
358 : }
359 : }
360 :
361 0 : if( !bFmtInserted )
362 : {
363 : bOk = RET_CANCEL == ErrorBox( this,
364 : WinBits( WB_OK_CANCEL | WB_DEF_OK),
365 : aStrInvalidFmt
366 0 : ).Execute();
367 0 : }
368 : }
369 : else
370 0 : bOk = sal_True;
371 0 : delete pDlg;
372 : }
373 0 : return 0;
374 : }
375 :
376 : //------------------------------------------------------------------------
377 :
378 0 : IMPL_LINK_NOARG(SwAutoFormatDlg, RemoveHdl)
379 : {
380 0 : String aMessage = aStrDelMsg ;
381 0 : aMessage.AppendAscii("\n\n");
382 0 : aMessage += m_pLbFormat->GetSelectEntry() ;
383 0 : aMessage += '\n';
384 :
385 : MessBox* pBox = new MessBox( this, WinBits( WB_OK_CANCEL ),
386 0 : aStrDelTitle, aMessage);
387 :
388 0 : if ( pBox->Execute() == RET_OK )
389 : {
390 0 : m_pLbFormat->RemoveEntry( nDfltStylePos + nIndex );
391 0 : m_pLbFormat->SelectEntryPos( nDfltStylePos + nIndex-1 );
392 :
393 0 : pTableTbl->EraseAutoFmt(nIndex);
394 0 : nIndex--;
395 :
396 0 : if( !nIndex )
397 : {
398 0 : m_pBtnRemove->Enable(sal_False);
399 0 : m_pBtnRename->Enable(sal_False);
400 : }
401 :
402 0 : if( !bCoreDataChanged )
403 : {
404 0 : m_pBtnCancel->SetText( aStrClose );
405 0 : bCoreDataChanged = sal_True;
406 : }
407 : }
408 0 : delete pBox;
409 :
410 0 : SelFmtHdl( 0 );
411 :
412 0 : return 0;
413 : }
414 :
415 0 : IMPL_LINK_NOARG(SwAutoFormatDlg, RenameHdl)
416 : {
417 0 : sal_Bool bOk = sal_False;
418 0 : while( !bOk )
419 : {
420 : SwStringInputDlg* pDlg = new SwStringInputDlg( this,
421 0 : aStrRenameTitle, m_pLbFormat->GetSelectEntry(),
422 0 : aEmptyStr );
423 0 : if( pDlg->Execute() == RET_OK )
424 : {
425 0 : sal_Bool bFmtRenamed = sal_False;
426 0 : String aFormatName;
427 0 : pDlg->GetInputString( aFormatName );
428 :
429 0 : if ( aFormatName.Len() > 0 )
430 : {
431 : sal_uInt16 n;
432 0 : for( n = 0; n < pTableTbl->size(); ++n )
433 0 : if ((*pTableTbl)[n].GetName() == aFormatName)
434 0 : break;
435 :
436 0 : if( n >= pTableTbl->size() )
437 : {
438 : // no format with this name exists, so rename it
439 0 : m_pLbFormat->RemoveEntry( nDfltStylePos + nIndex );
440 0 : SwTableAutoFmt* p = &(*pTableTbl)[ nIndex ];
441 :
442 0 : p->SetName( aFormatName );
443 :
444 : // keep all arrays sorted!
445 0 : for( n = 1; n < pTableTbl->size(); ++n )
446 0 : if ((n != nIndex) &&
447 0 : ((*pTableTbl)[n].GetName() > aFormatName))
448 : {
449 0 : break;
450 : }
451 :
452 0 : pTableTbl->MoveAutoFmt(n, nIndex);
453 0 : m_pLbFormat->InsertEntry( aFormatName, nDfltStylePos + n );
454 0 : m_pLbFormat->SelectEntryPos( nDfltStylePos + n );
455 :
456 0 : if ( !bCoreDataChanged )
457 : {
458 0 : m_pBtnCancel->SetText( aStrClose );
459 0 : bCoreDataChanged = sal_True;
460 : }
461 :
462 0 : SelFmtHdl( 0 );
463 0 : bOk = sal_True;
464 0 : bFmtRenamed = sal_True;
465 : }
466 : }
467 :
468 0 : if( !bFmtRenamed )
469 : {
470 : bOk = RET_CANCEL == ErrorBox( this,
471 : WinBits( WB_OK_CANCEL | WB_DEF_OK),
472 : aStrInvalidFmt
473 0 : ).Execute();
474 0 : }
475 : }
476 : else
477 0 : bOk = sal_True;
478 0 : delete pDlg;
479 : }
480 0 : return 0;
481 : }
482 :
483 : //------------------------------------------------------------------------
484 :
485 0 : IMPL_LINK_NOARG(SwAutoFormatDlg, SelFmtHdl)
486 : {
487 0 : sal_Bool bBtnEnable = sal_False;
488 0 : sal_uInt8 nSelPos = (sal_uInt8) m_pLbFormat->GetSelectEntryPos(), nOldIdx = nIndex;
489 0 : if( nSelPos >= nDfltStylePos )
490 : {
491 0 : nIndex = nSelPos - nDfltStylePos;
492 0 : m_pWndPreview->NotifyChange( (*pTableTbl)[nIndex] );
493 0 : bBtnEnable = 0 != nIndex;
494 0 : UpdateChecks( (*pTableTbl)[nIndex], sal_True );
495 : }
496 : else
497 : {
498 0 : nIndex = 255;
499 :
500 0 : SwTableAutoFmt aTmp( ViewShell::GetShellRes()->aStrNone );
501 0 : aTmp.SetFont( sal_False );
502 0 : aTmp.SetJustify( sal_False );
503 0 : aTmp.SetFrame( sal_False );
504 0 : aTmp.SetBackground( sal_False );
505 0 : aTmp.SetValueFormat( sal_False );
506 0 : aTmp.SetWidthHeight( sal_False );
507 :
508 0 : if( nOldIdx != nIndex )
509 0 : m_pWndPreview->NotifyChange( aTmp );
510 0 : UpdateChecks( aTmp, sal_False );
511 : }
512 :
513 0 : m_pBtnRemove->Enable( bBtnEnable );
514 0 : m_pBtnRename->Enable( bBtnEnable );
515 :
516 0 : return 0;
517 : }
518 : //------------------------------------------------------------------------
519 :
520 0 : IMPL_LINK_NOARG_INLINE_START(SwAutoFormatDlg, OkHdl)
521 : {
522 0 : if( bSetAutoFmt )
523 0 : pShell->SetTableAutoFmt( (*pTableTbl)[ nIndex ] );
524 0 : EndDialog( RET_OK );
525 0 : return sal_True;
526 : }
527 0 : IMPL_LINK_NOARG_INLINE_END(SwAutoFormatDlg, OkHdl)
528 :
529 : //========================================================================
530 : // AutoFmtPreview
531 :
532 : //------------------------------------------------------------------------
533 :
534 0 : AutoFmtPreview::AutoFmtPreview(Window* pParent) :
535 : Window ( pParent ),
536 : aCurData ( aEmptyStr ),
537 : aVD ( *this ),
538 : aScriptedText ( aVD ),
539 : bFitWidth ( sal_False ),
540 : mbRTL ( false ),
541 : aStrJan ( SW_RES( STR_JAN ) ),
542 : aStrFeb ( SW_RES( STR_FEB ) ),
543 : aStrMar ( SW_RES( STR_MAR ) ),
544 : aStrNorth ( SW_RES( STR_NORTH ) ),
545 : aStrMid ( SW_RES( STR_MID ) ),
546 : aStrSouth ( SW_RES( STR_SOUTH ) ),
547 : aStrSum ( SW_RES( STR_SUM ) ),
548 0 : m_xMSF ( comphelper::getProcessServiceFactory() )
549 : {
550 : OSL_ENSURE( m_xMSF.is(), "AutoFmtPreview: no MultiServiceFactory");
551 0 : if ( m_xMSF.is() )
552 : {
553 0 : m_xBreak = i18n::BreakIterator::create(comphelper::getComponentContext(m_xMSF));
554 : }
555 0 : pNumFmt = new SvNumberFormatter( m_xMSF, LANGUAGE_SYSTEM );
556 :
557 0 : Init();
558 0 : }
559 :
560 0 : extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeAutoFmtPreview(Window *pParent, VclBuilder::stringmap &)
561 : {
562 0 : return new AutoFmtPreview(pParent);
563 : }
564 :
565 0 : void AutoFmtPreview::Resize()
566 : {
567 0 : aPrvSize = Size(GetSizePixel().Width() - 6, GetSizePixel().Height() - 30);
568 0 : nLabelColWidth = (aPrvSize.Width() - 4) / 4 - 12;
569 0 : nDataColWidth1 = (aPrvSize.Width() - 4 - 2 * nLabelColWidth) / 3;
570 0 : nDataColWidth2 = (aPrvSize.Width() - 4 - 2 * nLabelColWidth) / 4;
571 0 : nRowHeight = (aPrvSize.Height() - 4) / 5;
572 0 : NotifyChange(aCurData);
573 0 : }
574 :
575 0 : void AutoFmtPreview::DetectRTL(SwWrtShell* pWrtShell)
576 : {
577 0 : if (!pWrtShell->IsCrsrInTbl()) // We haven't created the table yet
578 0 : mbRTL = Application::GetSettings().GetLayoutRTL();
579 : else
580 0 : mbRTL = pWrtShell->IsTableRightToLeft();
581 0 : }
582 :
583 : //------------------------------------------------------------------------
584 :
585 0 : AutoFmtPreview::~AutoFmtPreview()
586 : {
587 0 : delete pNumFmt;
588 0 : }
589 :
590 : //------------------------------------------------------------------------
591 :
592 0 : static void lcl_SetFontProperties(
593 : Font& rFont,
594 : const SvxFontItem& rFontItem,
595 : const SvxWeightItem& rWeightItem,
596 : const SvxPostureItem& rPostureItem )
597 : {
598 0 : rFont.SetFamily ( rFontItem.GetFamily() );
599 0 : rFont.SetName ( rFontItem.GetFamilyName() );
600 0 : rFont.SetStyleName ( rFontItem.GetStyleName() );
601 0 : rFont.SetCharSet ( rFontItem.GetCharSet() );
602 0 : rFont.SetPitch ( rFontItem.GetPitch() );
603 0 : rFont.SetWeight ( (FontWeight)rWeightItem.GetValue() );
604 0 : rFont.SetItalic ( (FontItalic)rPostureItem.GetValue() );
605 0 : }
606 :
607 : #define SETONALLFONTS( MethodName, Value ) \
608 : rFont.MethodName( Value ); \
609 : rCJKFont.MethodName( Value ); \
610 : rCTLFont.MethodName( Value );
611 :
612 0 : void AutoFmtPreview::MakeFonts( sal_uInt8 nIndex, Font& rFont, Font& rCJKFont, Font& rCTLFont )
613 : {
614 0 : const SwBoxAutoFmt& rBoxFmt = aCurData.GetBoxFmt( nIndex );
615 :
616 0 : rFont = rCJKFont = rCTLFont = GetFont();
617 0 : Size aFontSize( rFont.GetSize().Width(), 10 );
618 :
619 0 : lcl_SetFontProperties( rFont, rBoxFmt.GetFont(), rBoxFmt.GetWeight(), rBoxFmt.GetPosture() );
620 0 : lcl_SetFontProperties( rCJKFont, rBoxFmt.GetCJKFont(), rBoxFmt.GetCJKWeight(), rBoxFmt.GetCJKPosture() );
621 0 : lcl_SetFontProperties( rCTLFont, rBoxFmt.GetCTLFont(), rBoxFmt.GetCTLWeight(), rBoxFmt.GetCTLPosture() );
622 :
623 0 : SETONALLFONTS( SetUnderline, (FontUnderline)rBoxFmt.GetUnderline().GetValue() );
624 0 : SETONALLFONTS( SetOverline, (FontUnderline)rBoxFmt.GetOverline().GetValue() );
625 0 : SETONALLFONTS( SetStrikeout, (FontStrikeout)rBoxFmt.GetCrossedOut().GetValue() );
626 0 : SETONALLFONTS( SetOutline, rBoxFmt.GetContour().GetValue() );
627 0 : SETONALLFONTS( SetShadow, rBoxFmt.GetShadowed().GetValue() );
628 0 : SETONALLFONTS( SetColor, rBoxFmt.GetColor().GetValue() );
629 0 : SETONALLFONTS( SetSize, aFontSize );
630 0 : SETONALLFONTS( SetTransparent, sal_True );
631 0 : }
632 :
633 : //------------------------------------------------------------------------
634 :
635 0 : sal_uInt8 AutoFmtPreview::GetFormatIndex( size_t nCol, size_t nRow ) const
636 : {
637 : static const sal_uInt8 pnFmtMap[] =
638 : {
639 : 0, 1, 2, 1, 3,
640 : 4, 5, 6, 5, 7,
641 : 8, 9, 10, 9, 11,
642 : 4, 5, 6, 5, 7,
643 : 12, 13, 14, 13, 15
644 : };
645 0 : return pnFmtMap[ maArray.GetCellIndex( nCol, nRow, mbRTL ) ];
646 : }
647 :
648 0 : const SvxBoxItem& AutoFmtPreview::GetBoxItem( size_t nCol, size_t nRow ) const
649 : {
650 0 : return aCurData.GetBoxFmt( GetFormatIndex( nCol, nRow ) ).GetBox();
651 : }
652 :
653 : //------------------------------------------------------------------------
654 :
655 0 : void AutoFmtPreview::DrawString( size_t nCol, size_t nRow )
656 : {
657 : //------------------------
658 : // Ausgabe des Zelltextes:
659 : //------------------------
660 : sal_uLong nNum;
661 : double nVal;
662 0 : String cellString;
663 0 : sal_uInt8 nIndex = static_cast< sal_uInt8 >( maArray.GetCellIndex( nCol, nRow, mbRTL ) );
664 :
665 0 : switch( nIndex )
666 : {
667 0 : case 1: cellString = aStrJan; break;
668 0 : case 2: cellString = aStrFeb; break;
669 0 : case 3: cellString = aStrMar; break;
670 0 : case 5: cellString = aStrNorth; break;
671 0 : case 10: cellString = aStrMid; break;
672 0 : case 15: cellString = aStrSouth; break;
673 : case 4:
674 0 : case 20: cellString = aStrSum; break;
675 :
676 : case 6:
677 : case 8:
678 : case 16:
679 0 : case 18: nVal = nIndex;
680 0 : nNum = 5;
681 0 : goto MAKENUMSTR;
682 : case 17:
683 0 : case 7: nVal = nIndex;
684 0 : nNum = 6;
685 0 : goto MAKENUMSTR;
686 : case 11:
687 : case 12:
688 0 : case 13: nVal = nIndex;
689 0 : nNum = 12 == nIndex ? 10 : 9;
690 0 : goto MAKENUMSTR;
691 :
692 0 : case 9: nVal = 21; nNum = 7; goto MAKENUMSTR;
693 0 : case 14: nVal = 36; nNum = 11; goto MAKENUMSTR;
694 0 : case 19: nVal = 51; nNum = 7; goto MAKENUMSTR;
695 0 : case 21: nVal = 33; nNum = 13; goto MAKENUMSTR;
696 0 : case 22: nVal = 36; nNum = 14; goto MAKENUMSTR;
697 0 : case 23: nVal = 39; nNum = 13; goto MAKENUMSTR;
698 0 : case 24: nVal = 108; nNum = 15; goto MAKENUMSTR;
699 : MAKENUMSTR:
700 0 : if( aCurData.IsValueFormat() )
701 : {
702 0 : String sFmt; LanguageType eLng, eSys;
703 0 : aCurData.GetBoxFmt( (sal_uInt8)nNum ).GetValueFormat( sFmt, eLng, eSys );
704 :
705 : short nType;
706 : bool bNew;
707 : xub_StrLen nCheckPos;
708 : sal_uInt32 nKey = pNumFmt->GetIndexPuttingAndConverting( sFmt, eLng,
709 0 : eSys, nType, bNew, nCheckPos);
710 : Color* pDummy;
711 0 : pNumFmt->GetOutputString( nVal, nKey, cellString, &pDummy );
712 : }
713 : else
714 0 : cellString = String::CreateFromInt32((sal_Int32)nVal);
715 0 : break;
716 :
717 : }
718 :
719 0 : if( cellString.Len() )
720 : {
721 0 : Size aStrSize;
722 0 : sal_uInt8 nFmtIndex = GetFormatIndex( nCol, nRow );
723 0 : Rectangle cellRect = maArray.GetCellRect( nCol, nRow );
724 0 : Point aPos = cellRect.TopLeft();
725 0 : sal_uInt16 nRightX = 0;
726 :
727 0 : Size theMaxStrSize( cellRect.GetWidth() - FRAME_OFFSET,
728 0 : cellRect.GetHeight() - FRAME_OFFSET );
729 0 : if( aCurData.IsFont() )
730 : {
731 0 : Font aFont, aCJKFont, aCTLFont;
732 0 : MakeFonts( nFmtIndex, aFont, aCJKFont, aCTLFont );
733 0 : aScriptedText.SetFonts( &aFont, &aCJKFont, &aCTLFont );
734 : }
735 : else
736 0 : aScriptedText.SetDefaultFont();
737 :
738 0 : aScriptedText.SetText( cellString, m_xBreak );
739 0 : aStrSize = aScriptedText.GetTextSize();
740 :
741 0 : if( aCurData.IsFont() &&
742 0 : theMaxStrSize.Height() < aStrSize.Height() )
743 : {
744 : // wenn der String in diesem Font nicht
745 : // in die Zelle passt, wird wieder der
746 : // Standard-Font genommen:
747 0 : aScriptedText.SetDefaultFont();
748 0 : aStrSize = aScriptedText.GetTextSize();
749 : }
750 :
751 0 : while( theMaxStrSize.Width() <= aStrSize.Width() &&
752 0 : cellString.Len() > 1 )
753 : {
754 0 : cellString.Erase( cellString.Len() - 1 );
755 0 : aScriptedText.SetText( cellString, m_xBreak );
756 0 : aStrSize = aScriptedText.GetTextSize();
757 : }
758 :
759 0 : nRightX = (sal_uInt16)( cellRect.GetWidth()
760 0 : - aStrSize.Width()
761 0 : - FRAME_OFFSET );
762 :
763 : //-----------------------------
764 : // vertikal (immer zentrieren):
765 : //-----------------------------
766 0 : aPos.Y() += (nRowHeight - (sal_uInt16)aStrSize.Height()) / 2;
767 :
768 : //-----------
769 : // horizontal
770 : //-----------
771 0 : if( mbRTL )
772 0 : aPos.X() += nRightX;
773 0 : else if (aCurData.IsJustify())
774 : {
775 : sal_uInt16 nHorPos = (sal_uInt16)
776 0 : ((cellRect.GetWidth()-aStrSize.Width())/2);
777 0 : const SvxAdjustItem& rAdj = aCurData.GetBoxFmt(nFmtIndex).GetAdjust();
778 0 : switch ( rAdj.GetAdjust() )
779 : {
780 : case SVX_ADJUST_LEFT:
781 0 : aPos.X() += FRAME_OFFSET;
782 0 : break;
783 : case SVX_ADJUST_RIGHT:
784 0 : aPos.X() += nRightX;
785 0 : break;
786 : default:
787 0 : aPos.X() += nHorPos;
788 0 : break;
789 : }
790 : }
791 : else
792 : {
793 : //---------------------
794 : // Standardausrichtung:
795 : //---------------------
796 0 : if ( (nCol == 0) || (nIndex == 4) )
797 : {
798 : // Text-Label links oder Summe linksbuendig
799 0 : aPos.X() += FRAME_OFFSET;
800 : }
801 : else
802 : {
803 : // Zahlen/Datum rechtsbuendig
804 0 : aPos.X() += nRightX;
805 : }
806 : }
807 :
808 : //-------------------------------
809 0 : aScriptedText.DrawText( aPos );
810 : //-------------------------------
811 0 : }
812 0 : }
813 :
814 : #undef FRAME_OFFSET
815 :
816 : //------------------------------------------------------------------------
817 :
818 0 : void AutoFmtPreview::DrawStrings()
819 : {
820 0 : for( size_t nRow = 0; nRow < 5; ++nRow )
821 0 : for( size_t nCol = 0; nCol < 5; ++nCol )
822 0 : DrawString( nCol, nRow );
823 0 : }
824 :
825 : //------------------------------------------------------------------------
826 :
827 :
828 0 : void AutoFmtPreview::DrawBackground()
829 : {
830 0 : for( size_t nRow = 0; nRow < 5; ++nRow )
831 : {
832 0 : for( size_t nCol = 0; nCol < 5; ++nCol )
833 : {
834 0 : SvxBrushItem aBrushItem( aCurData.GetBoxFmt( GetFormatIndex( nCol, nRow ) ).GetBackground() );
835 :
836 0 : aVD.Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
837 0 : aVD.SetLineColor();
838 0 : aVD.SetFillColor( aBrushItem.GetColor() );
839 0 : aVD.DrawRect( maArray.GetCellRect( nCol, nRow ) );
840 0 : aVD.Pop();
841 0 : }
842 : }
843 0 : }
844 :
845 : //------------------------------------------------------------------------
846 :
847 :
848 0 : void AutoFmtPreview::PaintCells()
849 : {
850 : // 1) background
851 0 : if ( aCurData.IsBackground() )
852 0 : DrawBackground();
853 :
854 : // 2) values
855 0 : DrawStrings();
856 :
857 : // 3) border
858 0 : if ( aCurData.IsFrame() )
859 0 : maArray.DrawArray( aVD );
860 0 : }
861 :
862 : //------------------------------------------------------------------------
863 :
864 :
865 0 : void AutoFmtPreview::Init()
866 : {
867 0 : SetBorderStyle( GetBorderStyle() | WINDOW_BORDER_MONO );
868 0 : maArray.Initialize( 5, 5 );
869 0 : maArray.SetUseDiagDoubleClipping( false );
870 0 : CalcCellArray( sal_False );
871 0 : CalcLineMap();
872 0 : }
873 :
874 : //------------------------------------------------------------------------
875 :
876 :
877 0 : void AutoFmtPreview::CalcCellArray( sal_Bool _bFitWidth )
878 : {
879 0 : maArray.SetXOffset( 2 );
880 0 : maArray.SetAllColWidths( _bFitWidth ? nDataColWidth2 : nDataColWidth1 );
881 0 : maArray.SetColWidth( 0, nLabelColWidth );
882 0 : maArray.SetColWidth( 4, nLabelColWidth );
883 :
884 0 : maArray.SetYOffset( 2 );
885 0 : maArray.SetAllRowHeights( nRowHeight );
886 :
887 0 : aPrvSize.Width() = maArray.GetWidth() + 4;
888 0 : aPrvSize.Height() = maArray.GetHeight() + 4;
889 0 : }
890 :
891 : //------------------------------------------------------------------------
892 :
893 0 : inline void lclSetStyleFromBorder( svx::frame::Style& rStyle, const ::editeng::SvxBorderLine* pBorder )
894 : {
895 0 : rStyle.Set( pBorder, 0.05, 5 );
896 0 : }
897 :
898 0 : void AutoFmtPreview::CalcLineMap()
899 : {
900 0 : for( size_t nRow = 0; nRow < 5; ++nRow )
901 : {
902 0 : for( size_t nCol = 0; nCol < 5; ++nCol )
903 : {
904 0 : svx::frame::Style aStyle;
905 :
906 0 : const SvxBoxItem& rItem = GetBoxItem( nCol, nRow );
907 0 : lclSetStyleFromBorder( aStyle, rItem.GetLeft() );
908 0 : maArray.SetCellStyleLeft( nCol, nRow, aStyle );
909 0 : lclSetStyleFromBorder( aStyle, rItem.GetRight() );
910 0 : maArray.SetCellStyleRight( nCol, nRow, aStyle );
911 0 : lclSetStyleFromBorder( aStyle, rItem.GetTop() );
912 0 : maArray.SetCellStyleTop( nCol, nRow, aStyle );
913 0 : lclSetStyleFromBorder( aStyle, rItem.GetBottom() );
914 0 : maArray.SetCellStyleBottom( nCol, nRow, aStyle );
915 :
916 : // FIXME - uncomment to draw diagonal borders
917 : // lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, true ).GetLine() );
918 : // maArray.SetCellStyleTLBR( nCol, nRow, aStyle );
919 : // lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, false ).GetLine() );
920 : // maArray.SetCellStyleBLTR( nCol, nRow, aStyle );
921 : }
922 : }
923 0 : }
924 :
925 : //------------------------------------------------------------------------
926 :
927 :
928 0 : void AutoFmtPreview::NotifyChange( const SwTableAutoFmt& rNewData )
929 : {
930 0 : aCurData = rNewData;
931 0 : bFitWidth = aCurData.IsJustify();//sal_True; //???
932 0 : CalcCellArray( bFitWidth );
933 0 : CalcLineMap();
934 0 : DoPaint( Rectangle( Point(0,0), GetSizePixel() ) );
935 0 : }
936 :
937 : //------------------------------------------------------------------------
938 :
939 :
940 0 : void AutoFmtPreview::DoPaint( const Rectangle& /*rRect*/ )
941 : {
942 0 : sal_uInt32 nOldDrawMode = aVD.GetDrawMode();
943 0 : if( GetSettings().GetStyleSettings().GetHighContrastMode() )
944 0 : aVD.SetDrawMode( DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT );
945 :
946 0 : Bitmap thePreview;
947 0 : Point aCenterPos;
948 0 : Size theWndSize = GetSizePixel();
949 0 : Color oldColor;
950 0 : Font aFont;
951 :
952 0 : aFont = aVD.GetFont();
953 0 : aFont.SetTransparent( sal_True );
954 :
955 0 : aVD.SetFont ( aFont );
956 0 : aVD.SetLineColor ();
957 0 : const Color& rWinColor = GetSettings().GetStyleSettings().GetWindowColor();
958 0 : aVD.SetBackground ( Wallpaper(rWinColor) );
959 0 : aVD.SetFillColor ( rWinColor );
960 0 : aVD.SetOutputSizePixel ( aPrvSize );
961 :
962 : //--------------------------------
963 : // Zellen auf virtual Device malen
964 : // und Ergebnis sichern
965 : //--------------------------------
966 0 : PaintCells();
967 0 : thePreview = aVD.GetBitmap( Point(0,0), aPrvSize );
968 :
969 : //--------------------------------------
970 : // Rahmen malen und Vorschau zentrieren:
971 : // (virtual Device fuer Fensterausgabe)
972 : //--------------------------------------
973 0 : aVD.SetOutputSizePixel( theWndSize );
974 0 : oldColor = aVD.GetLineColor();
975 0 : aVD.SetLineColor();
976 0 : aVD.DrawRect( Rectangle( Point(0,0), theWndSize ) );
977 0 : SetLineColor( oldColor );
978 0 : aCenterPos = Point( (theWndSize.Width() - aPrvSize.Width() ) / 2,
979 0 : (theWndSize.Height() - aPrvSize.Height()) / 2 );
980 0 : aVD.DrawBitmap( aCenterPos, thePreview );
981 :
982 : //----------------------------
983 : // Ausgabe im Vorschaufenster:
984 : //----------------------------
985 0 : DrawBitmap( Point(0,0), aVD.GetBitmap( Point(0,0), theWndSize ) );
986 :
987 0 : aVD.SetDrawMode( nOldDrawMode );
988 0 : }
989 :
990 : //------------------------------------------------------------------------
991 :
992 0 : void AutoFmtPreview::Paint( const Rectangle& rRect )
993 : {
994 0 : DoPaint( rRect );
995 0 : }
996 :
997 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|