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