xref: /AOO41X/main/sc/source/ui/miscdlgs/autofmt.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 
32 
33 //------------------------------------------------------------------
34 
35 #include "scitems.hxx"
36 #include <svx/algitem.hxx>
37 #include <editeng/boxitem.hxx>
38 #include <editeng/brshitem.hxx>
39 #include <editeng/cntritem.hxx>
40 #include <editeng/colritem.hxx>
41 #include <editeng/crsditem.hxx>
42 #include <editeng/fontitem.hxx>
43 #include <editeng/postitem.hxx>
44 #include <editeng/shdditem.hxx>
45 #include <editeng/udlnitem.hxx>
46 #include <editeng/wghtitem.hxx>
47 #include <vcl/svapp.hxx>
48 #include <svl/zforlist.hxx>
49 #include <vcl/msgbox.hxx>
50 #include <sfx2/viewfrm.hxx>
51 #include <comphelper/processfactory.hxx>
52 
53 #include "sc.hrc"
54 #include "scmod.hxx"
55 #include "attrib.hxx"
56 #include "zforauto.hxx"
57 #include "scitems.hxx"
58 #include "global.hxx"
59 #include "globstr.hrc"
60 #include "autoform.hxx"
61 //CHINA001 #include "strindlg.hxx"
62 #include "miscdlgs.hrc"
63 #include "autofmt.hxx"
64 #include "scresid.hxx"
65 #include "document.hxx"
66 #include "docsh.hxx"
67 #include "tabvwsh.hxx"
68 
69 #define FRAME_OFFSET 4
70 
71 
72 //CHINA001 //========================================================================
73 //CHINA001 // AutoFormat-Dialog:
74 //CHINA001
75 //CHINA001 ScAutoFormatDlg::ScAutoFormatDlg( Window*                 pParent,
76 //CHINA001                               ScAutoFormat*             pAutoFormat,
77 //CHINA001                                 const ScAutoFormatData*   pSelFormatData,
78 //CHINA001                                 ScDocument*               pDoc ) :
79 //CHINA001
80 //CHINA001   ModalDialog     ( pParent, ScResId( RID_SCDLG_AUTOFORMAT ) ),
81 //CHINA001   //
82 //CHINA001   aLbFormat       ( this, ScResId( LB_FORMAT ) ),
83 //CHINA001   aFlFormat       ( this, ScResId( FL_FORMAT ) ),
84 //CHINA001   pWndPreview     ( new ScAutoFmtPreview( this, ScResId( WND_PREVIEW ), pDoc ) ),
85 //CHINA001   aBtnNumFormat   ( this, ScResId( BTN_NUMFORMAT ) ),
86 //CHINA001   aBtnBorder      ( this, ScResId( BTN_BORDER ) ),
87 //CHINA001   aBtnFont        ( this, ScResId( BTN_FONT ) ),
88 //CHINA001   aBtnPattern     ( this, ScResId( BTN_PATTERN ) ),
89 //CHINA001   aBtnAlignment   ( this, ScResId( BTN_ALIGNMENT ) ),
90 //CHINA001   aBtnAdjust      ( this, ScResId( BTN_ADJUST ) ),
91 //CHINA001   aFlFormatting   ( this, ScResId( FL_FORMATTING ) ),
92 //CHINA001   aBtnOk          ( this, ScResId( BTN_OK ) ),
93 //CHINA001   aBtnCancel      ( this, ScResId( BTN_CANCEL ) ),
94 //CHINA001   aBtnHelp        ( this, ScResId( BTN_HELP ) ),
95 //CHINA001   aBtnAdd         ( this, ScResId( BTN_ADD ) ),
96 //CHINA001   aBtnRemove      ( this, ScResId( BTN_REMOVE ) ),
97 //CHINA001   aBtnMore        ( this, ScResId( BTN_MORE ) ),
98 //CHINA001   aBtnRename      ( this, ScResId( BTN_RENAME ) ),
99 //CHINA001   aStrTitle       ( ScResId( STR_ADD_TITLE ) ),
100 //CHINA001   aStrLabel       ( ScResId( STR_ADD_LABEL ) ),
101 //CHINA001   aStrRename      ( ScResId( STR_RENAME_TITLE ) ),
102 //CHINA001   aStrClose       ( ScResId( STR_BTN_CLOSE ) ),
103 //CHINA001   aStrDelTitle    ( ScResId( STR_DEL_TITLE ) ),
104 //CHINA001   aStrDelMsg      ( ScResId( STR_DEL_MSG ) ) ,
105 //CHINA001   //
106 //CHINA001   nIndex          ( 0 ),
107 //CHINA001   bFmtInserted    ( sal_False ),
108 //CHINA001   bCoreDataChanged( sal_False ),
109 //CHINA001   pFormat         ( pAutoFormat ),
110 //CHINA001   pSelFmtData     ( pSelFormatData )
111 //CHINA001 {
112 //CHINA001   Init();
113 //CHINA001   pWndPreview->NotifyChange( (*pFormat)[0] );
114 //CHINA001   FreeResource();
115 //CHINA001 }
116 //CHINA001
117 //CHINA001 //------------------------------------------------------------------------
118 //CHINA001
119 //CHINA001 ScAutoFormatDlg::~ScAutoFormatDlg()
120 //CHINA001 {
121 //CHINA001   delete pWndPreview;
122 //CHINA001 }
123 //CHINA001
124 //CHINA001 //------------------------------------------------------------------------
125 //CHINA001
126 //CHINA001 void ScAutoFormatDlg::Init()
127 //CHINA001 {
128 //CHINA001   sal_uInt16 nCount;
129 //CHINA001   String aEntry;
130 //CHINA001
131 //CHINA001   aLbFormat    .SetSelectHdl( LINK( this, ScAutoFormatDlg, SelFmtHdl ) );
132 //CHINA001   aBtnNumFormat.SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
133 //CHINA001   aBtnBorder   .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
134 //CHINA001   aBtnFont     .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
135 //CHINA001   aBtnPattern  .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
136 //CHINA001   aBtnAlignment.SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
137 //CHINA001   aBtnAdjust   .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
138 //CHINA001   aBtnAdd      .SetClickHdl ( LINK( this, ScAutoFormatDlg, AddHdl ) );
139 //CHINA001   aBtnRemove   .SetClickHdl ( LINK( this, ScAutoFormatDlg, RemoveHdl ) );
140 //CHINA001   aBtnOk       .SetClickHdl ( LINK( this, ScAutoFormatDlg, CloseHdl ) );
141 //CHINA001   aBtnCancel   .SetClickHdl ( LINK( this, ScAutoFormatDlg, CloseHdl ) );
142 //CHINA001   aBtnRename   .SetClickHdl ( LINK( this, ScAutoFormatDlg, RenameHdl ) );
143 //CHINA001   aLbFormat    .SetDoubleClickHdl( LINK( this, ScAutoFormatDlg, DblClkHdl ) );
144 //CHINA001
145 //CHINA001   aBtnMore.AddWindow( &aBtnRename );
146 //CHINA001   aBtnMore.AddWindow( &aBtnNumFormat );
147 //CHINA001   aBtnMore.AddWindow( &aBtnBorder );
148 //CHINA001   aBtnMore.AddWindow( &aBtnFont );
149 //CHINA001   aBtnMore.AddWindow( &aBtnPattern );
150 //CHINA001   aBtnMore.AddWindow( &aBtnAlignment );
151 //CHINA001   aBtnMore.AddWindow( &aBtnAdjust );
152 //CHINA001   aBtnMore.AddWindow( &aFlFormatting );
153 //CHINA001
154 //CHINA001   nCount = pFormat->GetCount();
155 //CHINA001
156 //CHINA001   for ( sal_uInt16 i = 0; i < nCount; i++ )
157 //CHINA001   {
158 //CHINA001     ((*pFormat)[i])->GetName( aEntry );
159 //CHINA001     aLbFormat.InsertEntry( aEntry );
160 //CHINA001   }
161 //CHINA001
162 //CHINA001   if ( nCount == 1 )
163 //CHINA001     aBtnRemove.Disable();
164 //CHINA001
165 //CHINA001   aLbFormat.SelectEntryPos( 0 );
166 //CHINA001   aBtnRename.Disable();
167 //CHINA001   aBtnRemove.Disable();
168 //CHINA001
169 //CHINA001   nIndex = 0;
170 //CHINA001   UpdateChecks();
171 //CHINA001
172 //CHINA001   if ( !pSelFmtData )
173 //CHINA001   {
174 //CHINA001     aBtnAdd.Disable();
175 //CHINA001     aBtnRemove.Disable();
176 //CHINA001     bFmtInserted = sal_True;
177 //CHINA001   }
178 //CHINA001 }
179 //CHINA001
180 //CHINA001 //------------------------------------------------------------------------
181 //CHINA001
182 //CHINA001 void ScAutoFormatDlg::UpdateChecks()
183 //CHINA001 {
184 //CHINA001   ScAutoFormatData* pData = (*pFormat)[nIndex];
185 //CHINA001
186 //CHINA001   aBtnNumFormat.Check( pData->GetIncludeValueFormat() );
187 //CHINA001   aBtnBorder   .Check( pData->GetIncludeFrame() );
188 //CHINA001   aBtnFont     .Check( pData->GetIncludeFont() );
189 //CHINA001   aBtnPattern  .Check( pData->GetIncludeBackground() );
190 //CHINA001   aBtnAlignment.Check( pData->GetIncludeJustify() );
191 //CHINA001   aBtnAdjust   .Check( pData->GetIncludeWidthHeight() );
192 //CHINA001 }
193 //CHINA001
194 //CHINA001 //------------------------------------------------------------------------
195 //CHINA001 // Handler:
196 //CHINA001 //---------
197 //CHINA001
198 //CHINA001 IMPL_LINK( ScAutoFormatDlg, CloseHdl, PushButton *, pBtn )
199 //CHINA001 {
200 //CHINA001   if ( pBtn == &aBtnOk || pBtn == &aBtnCancel )
201 //CHINA001   {
202 //CHINA001     if ( bCoreDataChanged )
203 //CHINA001         ScGlobal::GetAutoFormat()->Save();
204 //CHINA001
205 //CHINA001     EndDialog( (pBtn == &aBtnOk) ? RET_OK : RET_CANCEL );
206 //CHINA001   }
207 //CHINA001   return 0;
208 //CHINA001 }
209 //CHINA001
210 //CHINA001 //------------------------------------------------------------------------
211 //CHINA001
212 //CHINA001 IMPL_LINK_INLINE_START( ScAutoFormatDlg, DblClkHdl, void *, EMPTYARG )
213 //CHINA001 {
214 //CHINA001   if ( bCoreDataChanged )
215 //CHINA001     ScGlobal::GetAutoFormat()->Save();
216 //CHINA001
217 //CHINA001   EndDialog( RET_OK );
218 //CHINA001   return 0;
219 //CHINA001 }
220 //CHINA001 IMPL_LINK_INLINE_END( ScAutoFormatDlg, DblClkHdl, void *, EMPTYARG )
221 //CHINA001
222 //CHINA001 //------------------------------------------------------------------------
223 //CHINA001
224 //CHINA001 IMPL_LINK( ScAutoFormatDlg, CheckHdl, Button *, pBtn )
225 //CHINA001 {
226 //CHINA001   ScAutoFormatData* pData  = (*pFormat)[nIndex];
227 //CHINA001   sal_Bool              bCheck = ((CheckBox*)pBtn)->IsChecked();
228 //CHINA001
229 //CHINA001   if ( pBtn == &aBtnNumFormat )
230 //CHINA001     pData->SetIncludeValueFormat( bCheck );
231 //CHINA001   else if ( pBtn == &aBtnBorder )
232 //CHINA001     pData->SetIncludeFrame( bCheck );
233 //CHINA001   else if ( pBtn == &aBtnFont )
234 //CHINA001     pData->SetIncludeFont( bCheck );
235 //CHINA001   else if ( pBtn == &aBtnPattern )
236 //CHINA001     pData->SetIncludeBackground( bCheck );
237 //CHINA001   else if ( pBtn == &aBtnAlignment )
238 //CHINA001     pData->SetIncludeJustify( bCheck );
239 //CHINA001   else if ( pBtn == &aBtnAdjust )
240 //CHINA001     pData->SetIncludeWidthHeight( bCheck );
241 //CHINA001
242 //CHINA001   if ( !bCoreDataChanged )
243 //CHINA001   {
244 //CHINA001     aBtnCancel.SetText( aStrClose );
245 //CHINA001     bCoreDataChanged = sal_True;
246 //CHINA001   }
247 //CHINA001
248 //CHINA001   pWndPreview->NotifyChange( pData );
249 //CHINA001
250 //CHINA001   return 0;
251 //CHINA001 }
252 //CHINA001
253 //CHINA001 //------------------------------------------------------------------------
254 //CHINA001
255 //CHINA001 IMPL_LINK( ScAutoFormatDlg, AddHdl, void *, EMPTYARG )
256 //CHINA001 {
257 //CHINA001   if ( !bFmtInserted && pSelFmtData )
258 //CHINA001   {
259 //CHINA001     String              aStrStandard( ScResId(STR_STANDARD) );
260 //CHINA001     String              aFormatName;
261 //CHINA001     ScStringInputDlg*   pDlg;
262 //CHINA001     sal_Bool                bOk = sal_False;
263 //CHINA001
264 //CHINA001     while ( !bOk )
265 //CHINA001     {
266 //CHINA001         pDlg = new ScStringInputDlg( this,
267 //CHINA001                                      aStrTitle,
268 //CHINA001                                      aStrLabel,
269 //CHINA001                                      aFormatName,
270 //CHINA001                                      HID_SC_ADD_AUTOFMT );
271 //CHINA001
272 //CHINA001         if ( pDlg->Execute() == RET_OK )
273 //CHINA001         {
274 //CHINA001             pDlg->GetInputString( aFormatName );
275 //CHINA001
276 //CHINA001             if ( (aFormatName.Len() > 0) && (aFormatName != aStrStandard) )
277 //CHINA001             {
278 //CHINA001                 ScAutoFormatData* pNewData
279 //CHINA001                     = new ScAutoFormatData( *pSelFmtData );
280 //CHINA001
281 //CHINA001                 pNewData->SetName( aFormatName );
282 //CHINA001                 bFmtInserted = pFormat->Insert( pNewData );
283 //CHINA001
284 //CHINA001                 if ( bFmtInserted )
285 //CHINA001                 {
286 //CHINA001                     sal_uInt16 nAt = pFormat->IndexOf( pNewData );
287 //CHINA001
288 //CHINA001                     aLbFormat.InsertEntry( aFormatName, nAt );
289 //CHINA001                     aLbFormat.SelectEntry( aFormatName );
290 //CHINA001                     aBtnAdd.Disable();
291 //CHINA001
292 //CHINA001                     if ( !bCoreDataChanged )
293 //CHINA001                     {
294 //CHINA001                         aBtnCancel.SetText( aStrClose );
295 //CHINA001                         bCoreDataChanged = sal_True;
296 //CHINA001                     }
297 //CHINA001
298 //CHINA001                     SelFmtHdl( 0 );
299 //CHINA001                     bOk = sal_True;
300 //CHINA001                 }
301 //CHINA001                 else
302 //CHINA001                     delete pNewData;
303 //CHINA001
304 //CHINA001             }
305 //CHINA001
306 //CHINA001             if ( !bFmtInserted )
307 //CHINA001             {
308 //CHINA001                 sal_uInt16 nRet = ErrorBox( this,
309 //CHINA001                                         WinBits( WB_OK_CANCEL | WB_DEF_OK),
310 //CHINA001                                         ScGlobal::GetRscString(STR_INVALID_AFNAME)
311 //CHINA001                                       ).Execute();
312 //CHINA001
313 //CHINA001                 bOk = ( nRet == RET_CANCEL );
314 //CHINA001             }
315 //CHINA001         }
316 //CHINA001         else
317 //CHINA001             bOk = sal_True;
318 //CHINA001
319 //CHINA001         delete pDlg;
320 //CHINA001     }
321 //CHINA001   }
322 //CHINA001
323 //CHINA001   return 0;
324 //CHINA001 }
325 //CHINA001
326 //CHINA001 //------------------------------------------------------------------------
327 //CHINA001
328 //CHINA001 IMPL_LINK( ScAutoFormatDlg, RemoveHdl, void *, EMPTYARG )
329 //CHINA001 {
330 //CHINA001   if ( (nIndex > 0) && (aLbFormat.GetEntryCount() > 0) )
331 //CHINA001   {
332 //CHINA001     String aMsg( aStrDelMsg.GetToken( 0, '#' ) );
333 //CHINA001
334 //CHINA001     aMsg += aLbFormat.GetSelectEntry();
335 //CHINA001     aMsg += aStrDelMsg.GetToken( 1, '#' );
336 //CHINA001
337 //CHINA001     if ( RET_YES ==
338 //CHINA001          QueryBox( this, WinBits( WB_YES_NO | WB_DEF_YES ), aMsg ).Execute() )
339 //CHINA001     {
340 //CHINA001         aLbFormat.RemoveEntry( nIndex );
341 //CHINA001         aLbFormat.SelectEntryPos( nIndex-1 );
342 //CHINA001
343 //CHINA001         if ( nIndex-1 == 0 )
344 //CHINA001             aBtnRemove.Disable();
345 //CHINA001
346 //CHINA001         if ( !bCoreDataChanged )
347 //CHINA001         {
348 //CHINA001             aBtnCancel.SetText( aStrClose );
349 //CHINA001             bCoreDataChanged = sal_True;
350 //CHINA001         }
351 //CHINA001
352 //CHINA001         pFormat->AtFree( nIndex ); // in der Core loeschen
353 //CHINA001         nIndex--;
354 //CHINA001
355 //CHINA001         SelFmtHdl( 0 );
356 //CHINA001     }
357 //CHINA001   }
358 //CHINA001
359 //CHINA001   SelFmtHdl( 0 );
360 //CHINA001
361 //CHINA001   return 0;
362 //CHINA001 }
363 //CHINA001
364 //CHINA001 IMPL_LINK( ScAutoFormatDlg, RenameHdl, void *, pBtn)
365 //CHINA001 {
366 //CHINA001   sal_Bool bOk = sal_False;
367 //CHINA001   while( !bOk )
368 //CHINA001   {
369 //CHINA001
370 //CHINA001     String aFormatName=aLbFormat.GetSelectEntry();
371 //CHINA001     String aEntry;
372 //CHINA001
373 //CHINA001     ScStringInputDlg* pDlg = new ScStringInputDlg( this,
374 //CHINA001                                      aStrRename,
375 //CHINA001                                      aStrLabel,
376 //CHINA001                                      aFormatName,
377 //CHINA001                                      HID_SC_RENAME_AUTOFMT );
378 //CHINA001     if( pDlg->Execute() == RET_OK )
379 //CHINA001     {
380 //CHINA001         sal_Bool bFmtRenamed = sal_False;
381 //CHINA001         pDlg->GetInputString( aFormatName );
382 //CHINA001         sal_uInt16 n;
383 //CHINA001
384 //CHINA001         if ( aFormatName.Len() > 0 )
385 //CHINA001         {
386 //CHINA001             for( n = 0; n < pFormat->GetCount(); ++n )
387 //CHINA001             {
388 //CHINA001                 (*pFormat)[n]->GetName(aEntry);
389 //CHINA001                 if ( aEntry== aFormatName)
390 //CHINA001                     break;
391 //CHINA001             }
392 //CHINA001             if( n >= pFormat->GetCount() )
393 //CHINA001             {
394 //CHINA001                 // Format mit dem Namen noch nicht vorhanden, also
395 //CHINA001                 // umbenennen
396 //CHINA001
397 //CHINA001                 aLbFormat.RemoveEntry(nIndex );
398 //CHINA001                 ScAutoFormatData* p=(*pFormat)[ nIndex ];
399 //CHINA001                 ScAutoFormatData* pNewData
400 //CHINA001                     = new ScAutoFormatData(*p);
401 //CHINA001
402 //CHINA001                 pFormat->AtFree( nIndex );
403 //CHINA001
404 //CHINA001                 pNewData->SetName( aFormatName );
405 //CHINA001
406 //CHINA001                 pFormat->Insert( pNewData);
407 //CHINA001
408 //CHINA001                 sal_uInt16 nCount = pFormat->GetCount();
409 //CHINA001
410 //CHINA001                 aLbFormat.SetUpdateMode(sal_False);
411 //CHINA001                 aLbFormat.Clear();
412 //CHINA001                 for ( sal_uInt16 i = 0; i < nCount; i++ )
413 //CHINA001                 {
414 //CHINA001                     ((*pFormat)[i])->GetName( aEntry );
415 //CHINA001                     aLbFormat.InsertEntry( aEntry );
416 //CHINA001                 }
417 //CHINA001
418 //CHINA001                 aLbFormat.SetUpdateMode( sal_True);
419 //CHINA001                 aLbFormat.SelectEntry( aFormatName);
420 //CHINA001
421 //CHINA001                 if ( !bCoreDataChanged )
422 //CHINA001                 {
423 //CHINA001                     aBtnCancel.SetText( aStrClose );
424 //CHINA001                     bCoreDataChanged = sal_True;
425 //CHINA001                 }
426 //CHINA001
427 //CHINA001
428 //CHINA001                 SelFmtHdl( 0 );
429 //CHINA001                 bOk = sal_True;
430 //CHINA001                 bFmtRenamed = sal_True;
431 //CHINA001             }
432 //CHINA001         }
433 //CHINA001         if( !bFmtRenamed )
434 //CHINA001         {
435 //CHINA001             bOk = RET_CANCEL == ErrorBox( this,
436 //CHINA001                                 WinBits( WB_OK_CANCEL | WB_DEF_OK),
437 //CHINA001                                 ScGlobal::GetRscString(STR_INVALID_AFNAME)
438 //CHINA001                                 ).Execute();
439 //CHINA001         }
440 //CHINA001     }
441 //CHINA001     else
442 //CHINA001         bOk = sal_True;
443 //CHINA001     delete pDlg;
444 //CHINA001   }
445 //CHINA001
446 //CHINA001   return 0;
447 //CHINA001 }
448 //CHINA001
449 //CHINA001 //------------------------------------------------------------------------
450 //CHINA001
451 //CHINA001 IMPL_LINK( ScAutoFormatDlg, SelFmtHdl, void *, EMPTYARG )
452 //CHINA001 {
453 //CHINA001  nIndex = aLbFormat.GetSelectEntryPos();
454 //CHINA001  UpdateChecks();
455 //CHINA001
456 //CHINA001  if ( nIndex == 0 )
457 //CHINA001  {
458 //CHINA001      aBtnRename.Disable();
459 //CHINA001      aBtnRemove.Disable();
460 //CHINA001  }
461 //CHINA001  else
462 //CHINA001  {
463 //CHINA001      aBtnRename.Enable();
464 //CHINA001      aBtnRemove.Enable();
465 //CHINA001  }
466 //CHINA001
467 //CHINA001  pWndPreview->NotifyChange( (*pFormat)[nIndex] );
468 //CHINA001
469 //CHINA001  return 0;
470 //CHINA001 }
471 //CHINA001
472 //CHINA001 //------------------------------------------------------------------------
473 //CHINA001
474 //CHINA001 String ScAutoFormatDlg::GetCurrFormatName()
475 //CHINA001 {
476 //CHINA001  String  aResult;
477 //CHINA001
478 //CHINA001  ((*pFormat)[nIndex])->GetName( aResult );
479 //CHINA001
480 //CHINA001  return aResult;
481 //CHINA001 }
482 //CHINA001
483 //========================================================================
484 // ScAutoFmtPreview
485 
486 ScAutoFmtPreview::ScAutoFmtPreview( Window* pParent, const ResId& rRes, ScDocument* pDoc ) :
487 		Window			( pParent, rRes ),
488 		pCurData		( NULL ),
489 		aVD 			( *this ),
490         aScriptedText   ( aVD ),
491         xBreakIter      ( pDoc->GetBreakIterator() ),
492 		bFitWidth		( sal_False ),
493         mbRTL           ( false ),
494         aPrvSize        ( GetSizePixel().Width() - 6, GetSizePixel().Height() - 30 ),
495         mnLabelColWidth ( (aPrvSize.Width() - 4) / 4 - 12 ),
496         mnDataColWidth1 ( (aPrvSize.Width() - 4 - 2 * mnLabelColWidth) / 3 ),
497         mnDataColWidth2 ( (aPrvSize.Width() - 4 - 2 * mnLabelColWidth) / 4 ),
498         mnRowHeight     ( (aPrvSize.Height() - 4) / 5 ),
499         aStrJan         ( ScResId( STR_JAN ) ),
500         aStrFeb         ( ScResId( STR_FEB ) ),
501         aStrMar         ( ScResId( STR_MAR ) ),
502         aStrNorth       ( ScResId( STR_NORTH ) ),
503         aStrMid         ( ScResId( STR_MID ) ),
504         aStrSouth       ( ScResId( STR_SOUTH ) ),
505         aStrSum         ( ScResId( STR_SUM ) ),
506 		pNumFmt			( new SvNumberFormatter( ::comphelper::getProcessServiceFactory(), ScGlobal::eLnge ) )
507 {
508 	Init();
509 }
510 
511 //------------------------------------------------------------------------
512 
513 ScAutoFmtPreview::~ScAutoFmtPreview()
514 {
515 	delete pNumFmt;
516 }
517 
518 //------------------------------------------------------------------------
519 
520 void lcl_SetFontProperties(
521         Font& rFont,
522         const SvxFontItem& rFontItem,
523         const SvxWeightItem& rWeightItem,
524         const SvxPostureItem& rPostureItem )
525 {
526     rFont.SetFamily     ( rFontItem.GetFamily() );
527     rFont.SetName       ( rFontItem.GetFamilyName() );
528     rFont.SetStyleName  ( rFontItem.GetStyleName() );
529     rFont.SetCharSet    ( rFontItem.GetCharSet() );
530     rFont.SetPitch      ( rFontItem.GetPitch() );
531     rFont.SetWeight     ( (FontWeight)rWeightItem.GetValue() );
532     rFont.SetItalic     ( (FontItalic)rPostureItem.GetValue() );
533 }
534 
535 void ScAutoFmtPreview::MakeFonts( sal_uInt16 nIndex, Font& rFont, Font& rCJKFont, Font& rCTLFont )
536 {
537 	if ( pCurData )
538 	{
539         rFont = rCJKFont = rCTLFont = GetFont();
540         Size aFontSize( rFont.GetSize().Width(), 10 );
541 
542         const SvxFontItem*        pFontItem       = (const SvxFontItem*)      pCurData->GetItem( nIndex, ATTR_FONT );
543         const SvxWeightItem*      pWeightItem     = (const SvxWeightItem*)    pCurData->GetItem( nIndex, ATTR_FONT_WEIGHT );
544         const SvxPostureItem*     pPostureItem    = (const SvxPostureItem*)   pCurData->GetItem( nIndex, ATTR_FONT_POSTURE );
545         const SvxFontItem*        pCJKFontItem    = (const SvxFontItem*)      pCurData->GetItem( nIndex, ATTR_CJK_FONT );
546         const SvxWeightItem*      pCJKWeightItem  = (const SvxWeightItem*)    pCurData->GetItem( nIndex, ATTR_CJK_FONT_WEIGHT );
547         const SvxPostureItem*     pCJKPostureItem = (const SvxPostureItem*)   pCurData->GetItem( nIndex, ATTR_CJK_FONT_POSTURE );
548         const SvxFontItem*        pCTLFontItem    = (const SvxFontItem*)      pCurData->GetItem( nIndex, ATTR_CTL_FONT );
549         const SvxWeightItem*      pCTLWeightItem  = (const SvxWeightItem*)    pCurData->GetItem( nIndex, ATTR_CTL_FONT_WEIGHT );
550         const SvxPostureItem*     pCTLPostureItem = (const SvxPostureItem*)   pCurData->GetItem( nIndex, ATTR_CTL_FONT_POSTURE );
551         const SvxUnderlineItem*   pUnderlineItem  = (const SvxUnderlineItem*) pCurData->GetItem( nIndex, ATTR_FONT_UNDERLINE );
552         const SvxOverlineItem*    pOverlineItem   = (const SvxOverlineItem*)  pCurData->GetItem( nIndex, ATTR_FONT_OVERLINE );
553         const SvxCrossedOutItem*  pCrossedOutItem = (const SvxCrossedOutItem*)pCurData->GetItem( nIndex, ATTR_FONT_CROSSEDOUT );
554         const SvxContourItem*     pContourItem    = (const SvxContourItem*)   pCurData->GetItem( nIndex, ATTR_FONT_CONTOUR );
555         const SvxShadowedItem*    pShadowedItem   = (const SvxShadowedItem*)  pCurData->GetItem( nIndex, ATTR_FONT_SHADOWED );
556         const SvxColorItem*       pColorItem      = (const SvxColorItem*)     pCurData->GetItem( nIndex, ATTR_FONT_COLOR );
557 
558         lcl_SetFontProperties( rFont, *pFontItem, *pWeightItem, *pPostureItem );
559         lcl_SetFontProperties( rCJKFont, *pCJKFontItem, *pCJKWeightItem, *pCJKPostureItem );
560         lcl_SetFontProperties( rCTLFont, *pCTLFontItem, *pCTLWeightItem, *pCTLPostureItem );
561 
562         Color aColor( pColorItem->GetValue() );
563         if( aColor.GetColor() == COL_TRANSPARENT )
564             aColor = GetSettings().GetStyleSettings().GetWindowTextColor();
565 
566 #define SETONALLFONTS( MethodName, Value ) \
567 rFont.MethodName( Value ); rCJKFont.MethodName( Value ); rCTLFont.MethodName( Value );
568 
569         SETONALLFONTS( SetUnderline,    (FontUnderline)pUnderlineItem->GetValue() )
570         SETONALLFONTS( SetOverline,     (FontUnderline)pOverlineItem->GetValue() )
571         SETONALLFONTS( SetStrikeout,    (FontStrikeout)pCrossedOutItem->GetValue() )
572         SETONALLFONTS( SetOutline,      pContourItem->GetValue() )
573         SETONALLFONTS( SetShadow,       pShadowedItem->GetValue() )
574         SETONALLFONTS( SetColor,        aColor )
575         SETONALLFONTS( SetSize,         aFontSize )
576         SETONALLFONTS( SetTransparent,  sal_True )
577 
578 #undef SETONALLFONTS
579 	}
580 }
581 
582 //------------------------------------------------------------------------
583 
584 sal_uInt16 ScAutoFmtPreview::GetFormatIndex( size_t nCol, size_t nRow ) const
585 {
586     static const sal_uInt16 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     return pnFmtMap[ maArray.GetCellIndex( nCol, nRow, mbRTL ) ];
595 }
596 
597 const SvxBoxItem& ScAutoFmtPreview::GetBoxItem( size_t nCol, size_t nRow ) const
598 {
599     DBG_ASSERT( pCurData, "ScAutoFmtPreview::GetBoxItem - no format data found" );
600     return *static_cast< const SvxBoxItem* >( pCurData->GetItem( GetFormatIndex( nCol, nRow ), ATTR_BORDER ) );
601 }
602 
603 const SvxLineItem& ScAutoFmtPreview::GetDiagItem( size_t nCol, size_t nRow, bool bTLBR ) const
604 {
605     DBG_ASSERT( pCurData, "ScAutoFmtPreview::GetDiagItem - no format data found" );
606     return *static_cast< const SvxLineItem* >( pCurData->GetItem( GetFormatIndex( nCol, nRow ), bTLBR ? ATTR_BORDER_TLBR : ATTR_BORDER_BLTR ) );
607 }
608 
609 //------------------------------------------------------------------------
610 
611 void ScAutoFmtPreview::DrawString( size_t nCol, size_t nRow )
612 {
613 	if ( pCurData )
614 	{
615 		//------------------------
616 		// Ausgabe des Zelltextes:
617 		//------------------------
618 
619 		String	cellString;
620 		sal_Bool	bNumFormat	= pCurData->GetIncludeValueFormat();
621 		sal_uLong   nNum;
622 		double  nVal;
623 		Color*  pDummy = NULL;
624         sal_uInt16  nIndex = static_cast< sal_uInt16 >( maArray.GetCellIndex( nCol, nRow, mbRTL ) );
625 
626 		switch( nIndex )
627 		{
628 			case  1: cellString = aStrJan;			break;
629 			case  2: cellString = aStrFeb;			break;
630 			case  3: cellString = aStrMar;			break;
631 			case  5: cellString = aStrNorth;		break;
632 			case 10: cellString = aStrMid;			break;
633 			case 15: cellString = aStrSouth;		break;
634 			case  4:
635 			case 20: cellString = aStrSum;			break;
636 
637 			case  6:
638 			case  8:
639 			case 16:
640 			case 18: nVal = nIndex;
641 					 nNum = 5;
642 					 goto mknum;
643 			case 17:
644 			case  7: nVal = nIndex;
645 					 nNum = 6;
646 					 goto mknum;
647 			case 11:
648 			case 12:
649 			case 13: nVal = nIndex;
650 					 nNum = 12 == nIndex ? 10 : 9;
651 					 goto mknum;
652 
653 			case  9: nVal = 21; nNum = 7; goto mknum;
654 			case 14: nVal = 36; nNum = 11; goto mknum;
655 			case 19: nVal = 51; nNum = 7; goto mknum;
656 			case 21: nVal = 33; nNum = 13; goto mknum;
657 			case 22: nVal = 36; nNum = 14; goto mknum;
658 			case 23: nVal = 39; nNum = 13; goto mknum;
659 			case 24: nVal = 108; nNum = 15;
660 			mknum:
661                 if( bNumFormat )
662                 {
663                     ScNumFormatAbbrev& rNumFormat = (ScNumFormatAbbrev&)pCurData->GetNumFormat( (sal_uInt16) nNum );
664                     nNum = rNumFormat.GetFormatIndex( *pNumFmt );
665                 }
666                 else
667                     nNum = 0;
668 				pNumFmt->GetOutputString( nVal, nNum, cellString, &pDummy );
669 				break;
670 		}
671 
672 		if ( cellString.Len() > 0 )
673 		{
674 			Size				aStrSize;
675             sal_uInt16              nFmtIndex       = GetFormatIndex( nCol, nRow );
676             Rectangle           cellRect        = maArray.GetCellRect( nCol, nRow );
677             Point               aPos            = cellRect.TopLeft();
678 			sal_uInt16				nRightX 		= 0;
679 			sal_Bool				bJustify		= pCurData->GetIncludeJustify();
680             SvxHorJustifyItem    aHorJustifyItem( SVX_HOR_JUSTIFY_STANDARD, ATTR_HOR_JUSTIFY );
681 			SvxCellHorJustify	   eJustification;
682 
683 			//-------------
684 			// Ausrichtung:
685 			//-------------
686             eJustification  = mbRTL ? SVX_HOR_JUSTIFY_RIGHT : bJustify ?
687                 (SvxCellHorJustify)(((const SvxHorJustifyItem*)pCurData->GetItem( nFmtIndex, ATTR_HOR_JUSTIFY ))->GetValue()) :
688                 SVX_HOR_JUSTIFY_STANDARD;
689 
690 			if ( pCurData->GetIncludeFont() )
691 			{
692                 Font aFont, aCJKFont, aCTLFont;
693 				Size theMaxStrSize;
694 
695                 MakeFonts( nFmtIndex, aFont, aCJKFont, aCTLFont );
696 
697 				theMaxStrSize			= cellRect.GetSize();
698 				theMaxStrSize.Width()  -= FRAME_OFFSET;
699 				theMaxStrSize.Height() -= FRAME_OFFSET;
700 
701                 aScriptedText.SetFonts( &aFont, &aCJKFont, &aCTLFont );
702                 aScriptedText.SetText( cellString, xBreakIter );
703                 aStrSize = aScriptedText.GetTextSize();
704 
705 				if ( theMaxStrSize.Height() < aStrSize.Height() )
706 				{
707 					// wenn der String in diesem Font nicht
708 					// in die Zelle passt, wird wieder der
709 					// Standard-Font genommen:
710                     aScriptedText.SetDefaultFont();
711                     aStrSize = aScriptedText.GetTextSize();
712 				}
713 				while ( ( theMaxStrSize.Width() <= aStrSize.Width() )
714 					&& ( cellString.Len() > 1 ) )
715 				{
716 					if( eJustification == SVX_HOR_JUSTIFY_RIGHT )
717 						cellString.Erase( 0, 1 );
718 					else
719 						cellString.Erase( cellString.Len() - 1 );
720 
721                     aScriptedText.SetText( cellString, xBreakIter );
722                     aStrSize = aScriptedText.GetTextSize();
723 				}
724 			}
725 			else
726 			{
727                 aScriptedText.SetDefaultFont();
728                 aScriptedText.SetText( cellString, xBreakIter );
729                 aStrSize = aScriptedText.GetTextSize();
730 			}
731 
732 			nRightX  = (sal_uInt16)(  cellRect.GetWidth()
733 								  - aStrSize.Width()
734 								  - FRAME_OFFSET );
735 
736 			//-----------------------------
737 			// vertikal (immer zentrieren):
738 			//-----------------------------
739             aPos.Y() += (mnRowHeight - (sal_uInt16)aStrSize.Height()) / 2;
740 
741 			//-----------
742 			// horizontal
743 			//-----------
744 			if ( eJustification != SVX_HOR_JUSTIFY_STANDARD )
745 			{
746 				sal_uInt16 nHorPos = (sal_uInt16)
747 								 ((cellRect.GetWidth()-aStrSize.Width())/2);
748 
749 				switch ( eJustification )
750 				{
751 					case SVX_HOR_JUSTIFY_LEFT:
752 						aPos.X() += FRAME_OFFSET;
753 						break;
754 					case SVX_HOR_JUSTIFY_RIGHT:
755 						aPos.X() += nRightX;
756 						break;
757 					case SVX_HOR_JUSTIFY_BLOCK:
758 					case SVX_HOR_JUSTIFY_REPEAT:
759 					case SVX_HOR_JUSTIFY_CENTER:
760 						aPos.X() += nHorPos;
761 						break;
762 					case SVX_HOR_JUSTIFY_STANDARD:
763 					default:
764 						// Standard wird hier nicht behandelt
765 						break;
766 				}
767 			}
768 			else
769 			{
770 				//---------------------
771 				// Standardausrichtung:
772 				//---------------------
773                 if ( (nCol == 0) || (nRow == 0) )
774 				{
775 					// Text-Label links oder Summe linksbuendig
776 					aPos.X() += FRAME_OFFSET;
777 				}
778 				else
779 				{
780 					 // Zahlen/Datum rechtsbuendig
781 					aPos.X() += nRightX;
782 				}
783 			}
784 
785 			//-------------------------------
786             aScriptedText.DrawText( aPos );
787 			//-------------------------------
788 		}
789 	}
790 }
791 
792 #undef FRAME_OFFSET
793 
794 //------------------------------------------------------------------------
795 
796 void ScAutoFmtPreview::DrawStrings()
797 {
798     for( size_t nRow = 0; nRow < 5; ++nRow )
799         for( size_t nCol = 0; nCol < 5; ++nCol )
800             DrawString( nCol, nRow );
801 }
802 
803 //------------------------------------------------------------------------
804 
805 void ScAutoFmtPreview::DrawBackground()
806 {
807     if( pCurData )
808     {
809         for( size_t nRow = 0; nRow < 5; ++nRow )
810         {
811             for( size_t nCol = 0; nCol < 5; ++nCol )
812             {
813                 const SvxBrushItem* pItem = static_cast< const SvxBrushItem* >(
814                     pCurData->GetItem( GetFormatIndex( nCol, nRow ), ATTR_BACKGROUND ) );
815 
816                 aVD.Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
817                 aVD.SetLineColor();
818                 aVD.SetFillColor( pItem->GetColor() );
819                 aVD.DrawRect( maArray.GetCellRect( nCol, nRow ) );
820                 aVD.Pop();
821             }
822         }
823     }
824 }
825 
826 //------------------------------------------------------------------------
827 
828 void ScAutoFmtPreview::PaintCells()
829 {
830 	if ( pCurData )
831 	{
832         // 1) background
833 		if ( pCurData->GetIncludeBackground() )
834             DrawBackground();
835 
836         // 2) values
837         DrawStrings();
838 
839         // 3) border
840 		if ( pCurData->GetIncludeFrame() )
841             maArray.DrawArray( aVD );
842 	}
843 }
844 
845 //------------------------------------------------------------------------
846 
847 void ScAutoFmtPreview::Init()
848 {
849     SetBorderStyle( WINDOW_BORDER_MONO );
850     maArray.Initialize( 5, 5 );
851     maArray.SetUseDiagDoubleClipping( false );
852 	CalcCellArray( sal_False );
853 	CalcLineMap();
854 
855     TypeId aType(TYPE(ScDocShell));
856     ScDocShell* pDocShell = (ScDocShell*)SfxObjectShell::GetFirst(&aType);
857     SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocShell );
858     SfxViewShell* p = pFrame->GetViewShell();
859     ScTabViewShell* pViewSh = dynamic_cast< ScTabViewShell* >( p );
860     ScViewData* pViewData = pViewSh->GetViewData();
861     SCTAB nCurrentTab = pViewData->GetTabNo();
862     ScDocument* pDoc = pViewData->GetDocument();
863     mbRTL = pDoc->IsLayoutRTL( nCurrentTab );
864 }
865 
866 //------------------------------------------------------------------------
867 
868 void ScAutoFmtPreview::CalcCellArray( sal_Bool bFitWidthP )
869 {
870     maArray.SetXOffset( 2 );
871     maArray.SetAllColWidths( bFitWidthP ? mnDataColWidth2 : mnDataColWidth1 );
872     maArray.SetColWidth( 0, mnLabelColWidth );
873     maArray.SetColWidth( 4, mnLabelColWidth );
874 
875     maArray.SetYOffset( 2 );
876     maArray.SetAllRowHeights( mnRowHeight );
877 
878     aPrvSize.Width() = maArray.GetWidth() + 4;
879     aPrvSize.Height() = maArray.GetHeight() + 4;
880 }
881 
882 //------------------------------------------------------------------------
883 
884 inline void lclSetStyleFromBorder( svx::frame::Style& rStyle, const SvxBorderLine* pBorder )
885 {
886     rStyle.Set( pBorder, 1.0 / TWIPS_PER_POINT, 5 );
887 }
888 
889 void ScAutoFmtPreview::CalcLineMap()
890 {
891 	if ( pCurData )
892 	{
893         for( size_t nRow = 0; nRow < 5; ++nRow )
894         {
895             for( size_t nCol = 0; nCol < 5; ++nCol )
896             {
897                 svx::frame::Style aStyle;
898 
899                 const SvxBoxItem& rItem = GetBoxItem( nCol, nRow );
900                 lclSetStyleFromBorder( aStyle, rItem.GetLeft() );
901                 maArray.SetCellStyleLeft( nCol, nRow, aStyle );
902                 lclSetStyleFromBorder( aStyle, rItem.GetRight() );
903                 maArray.SetCellStyleRight( nCol, nRow, aStyle );
904                 lclSetStyleFromBorder( aStyle, rItem.GetTop() );
905                 maArray.SetCellStyleTop( nCol, nRow, aStyle );
906                 lclSetStyleFromBorder( aStyle, rItem.GetBottom() );
907                 maArray.SetCellStyleBottom( nCol, nRow, aStyle );
908 
909                 lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, true ).GetLine() );
910                 maArray.SetCellStyleTLBR( nCol, nRow, aStyle );
911                 lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, false ).GetLine() );
912                 maArray.SetCellStyleBLTR( nCol, nRow, aStyle );
913             }
914         }
915 	}
916 }
917 
918 //------------------------------------------------------------------------
919 
920 void ScAutoFmtPreview::NotifyChange( ScAutoFormatData* pNewData )
921 {
922 	if ( pNewData != pCurData )
923 	{
924 		pCurData  = pNewData;
925 		bFitWidth = pNewData->GetIncludeWidthHeight();
926 		CalcCellArray( bFitWidth );
927 		CalcLineMap();
928 	}
929 	else if ( bFitWidth != pNewData->GetIncludeWidthHeight() )
930 	{
931 		bFitWidth = !bFitWidth;
932 		CalcCellArray( bFitWidth );
933 	}
934 
935 	DoPaint( Rectangle( Point(0,0), GetSizePixel() ) );
936 }
937 
938 //------------------------------------------------------------------------
939 
940 void ScAutoFmtPreview::DoPaint( const Rectangle& /* rRect */ )
941 {
942     sal_uInt32 nOldDrawMode = aVD.GetDrawMode();
943 	//	#105733# SvtAccessibilityOptions::GetIsForBorders is no longer used (always assumed sal_True)
944     if( GetSettings().GetStyleSettings().GetHighContrastMode() )
945         aVD.SetDrawMode( DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT );
946 
947     Size aWndSize( GetSizePixel() );
948     Font aFont( aVD.GetFont() );
949     Color aBackCol( GetSettings().GetStyleSettings().GetWindowColor() );
950     Point aTmpPoint;
951     Rectangle aRect( aTmpPoint, aWndSize );
952 
953     aFont.SetTransparent( sal_True );
954 	aVD.SetFont( aFont );
955 	aVD.SetLineColor();
956     aVD.SetFillColor( aBackCol );
957     aVD.SetOutputSize( aWndSize );
958     aVD.DrawRect( aRect );
959 
960 	PaintCells();
961     SetLineColor();
962     SetFillColor( aBackCol );
963     DrawRect( aRect );
964 
965     Point aPos( (aWndSize.Width() - aPrvSize.Width()) / 2, (aWndSize.Height() - aPrvSize.Height()) / 2 );
966     if (Application::GetSettings().GetLayoutRTL())
967        aPos.X() = -aPos.X();
968     DrawOutDev( aPos, aWndSize, Point(), aWndSize, aVD );
969 
970     aVD.SetDrawMode( nOldDrawMode );
971 }
972 
973 //------------------------------------------------------------------------
974 
975 void ScAutoFmtPreview::Paint( const Rectangle& rRect )
976 {
977 	DoPaint( rRect );
978 }
979 
980