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