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_scui.hxx" 26 27 28 29 30 //------------------------------------------------------------------ 31 32 #include "scitems.hxx" 33 #include <svx/algitem.hxx> 34 #include <editeng/boxitem.hxx> 35 #include <editeng/brshitem.hxx> 36 #include <editeng/cntritem.hxx> 37 #include <editeng/colritem.hxx> 38 #include <editeng/crsditem.hxx> 39 #include <editeng/fontitem.hxx> 40 #include <editeng/postitem.hxx> 41 #include <editeng/shdditem.hxx> 42 #include <editeng/udlnitem.hxx> 43 #include <editeng/wghtitem.hxx> 44 #include <svl/zforlist.hxx> 45 #include <vcl/msgbox.hxx> 46 #include <comphelper/processfactory.hxx> 47 #include <sfx2/sfxresid.hxx> 48 #include "sc.hrc" 49 #include "scmod.hxx" 50 #include "attrib.hxx" 51 #include "zforauto.hxx" 52 #include "scitems.hxx" 53 #include "global.hxx" 54 #include "globstr.hrc" 55 #include "autoform.hxx" 56 #include "strindlg.hxx" 57 #include "miscdlgs.hrc" 58 #include "scuiautofmt.hxx" 59 #include "scresid.hxx" 60 #include "document.hxx" 61 62 //======================================================================== 63 // AutoFormat-Dialog: 64 65 ScAutoFormatDlg::ScAutoFormatDlg( Window* pParent, 66 ScAutoFormat* pAutoFormat, 67 const ScAutoFormatData* pSelFormatData, 68 ScDocument* pDoc ) : 69 70 ModalDialog ( pParent, ScResId( RID_SCDLG_AUTOFORMAT ) ), 71 // 72 aFlFormat ( this, ScResId( FL_FORMAT ) ), 73 aLbFormat ( this, ScResId( LB_FORMAT ) ), 74 pWndPreview ( new ScAutoFmtPreview( this, ScResId( WND_PREVIEW ), pDoc ) ), 75 aBtnOk ( this, ScResId( BTN_OK ) ), 76 aBtnCancel ( this, ScResId( BTN_CANCEL ) ), 77 aBtnHelp ( this, ScResId( BTN_HELP ) ), 78 aBtnAdd ( this, ScResId( BTN_ADD ) ), 79 aBtnRemove ( this, ScResId( BTN_REMOVE ) ), 80 aBtnMore ( this, ScResId( BTN_MORE ) ), 81 aFlFormatting ( this, ScResId( FL_FORMATTING ) ), 82 aBtnNumFormat ( this, ScResId( BTN_NUMFORMAT ) ), 83 aBtnBorder ( this, ScResId( BTN_BORDER ) ), 84 aBtnFont ( this, ScResId( BTN_FONT ) ), 85 aBtnPattern ( this, ScResId( BTN_PATTERN ) ), 86 aBtnAlignment ( this, ScResId( BTN_ALIGNMENT ) ), 87 aBtnAdjust ( this, ScResId( BTN_ADJUST ) ), 88 aBtnRename ( this, ScResId( BTN_RENAME ) ), 89 aStrTitle ( ScResId( STR_ADD_TITLE ) ), 90 aStrLabel ( ScResId( STR_ADD_LABEL ) ), 91 aStrClose ( ScResId( STR_BTN_CLOSE ) ), 92 aStrDelTitle ( ScResId( STR_DEL_TITLE ) ), 93 aStrDelMsg ( ScResId( STR_DEL_MSG ) ) , 94 aStrRename ( ScResId( STR_RENAME_TITLE ) ), 95 // 96 pFormat ( pAutoFormat ), 97 pSelFmtData ( pSelFormatData ), 98 nIndex ( 0 ), 99 bCoreDataChanged( sal_False ), 100 bFmtInserted ( sal_False ) 101 { 102 Init(); 103 pWndPreview->NotifyChange( (*pFormat)[0] ); 104 FreeResource(); 105 } 106 107 //------------------------------------------------------------------------ 108 109 __EXPORT ScAutoFormatDlg::~ScAutoFormatDlg() 110 { 111 delete pWndPreview; 112 } 113 114 //------------------------------------------------------------------------ 115 116 void ScAutoFormatDlg::Init() 117 { 118 sal_uInt16 nCount; 119 String aEntry; 120 121 aLbFormat .SetSelectHdl( LINK( this, ScAutoFormatDlg, SelFmtHdl ) ); 122 aBtnNumFormat.SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) ); 123 aBtnBorder .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) ); 124 aBtnFont .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) ); 125 aBtnPattern .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) ); 126 aBtnAlignment.SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) ); 127 aBtnAdjust .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) ); 128 aBtnAdd .SetClickHdl ( LINK( this, ScAutoFormatDlg, AddHdl ) ); 129 aBtnRemove .SetClickHdl ( LINK( this, ScAutoFormatDlg, RemoveHdl ) ); 130 aBtnOk .SetClickHdl ( LINK( this, ScAutoFormatDlg, CloseHdl ) ); 131 aBtnCancel .SetClickHdl ( LINK( this, ScAutoFormatDlg, CloseHdl ) ); 132 aBtnRename .SetClickHdl ( LINK( this, ScAutoFormatDlg, RenameHdl ) ); 133 aLbFormat .SetDoubleClickHdl( LINK( this, ScAutoFormatDlg, DblClkHdl ) ); 134 135 aBtnMore.AddWindow( &aBtnRename ); 136 aBtnMore.AddWindow( &aBtnNumFormat ); 137 aBtnMore.AddWindow( &aBtnBorder ); 138 aBtnMore.AddWindow( &aBtnFont ); 139 aBtnMore.AddWindow( &aBtnPattern ); 140 aBtnMore.AddWindow( &aBtnAlignment ); 141 aBtnMore.AddWindow( &aBtnAdjust ); 142 aBtnMore.AddWindow( &aFlFormatting ); 143 144 nCount = pFormat->GetCount(); 145 146 for ( sal_uInt16 i = 0; i < nCount; i++ ) 147 { 148 ((*pFormat)[i])->GetName( aEntry ); 149 aLbFormat.InsertEntry( aEntry ); 150 } 151 152 if ( nCount == 1 ) 153 aBtnRemove.Disable(); 154 155 aLbFormat.SelectEntryPos( 0 ); 156 aBtnRename.Disable(); 157 aBtnRemove.Disable(); 158 159 nIndex = 0; 160 UpdateChecks(); 161 162 if ( !pSelFmtData ) 163 { 164 aBtnAdd.Disable(); 165 aBtnRemove.Disable(); 166 bFmtInserted = sal_True; 167 } 168 } 169 170 //------------------------------------------------------------------------ 171 172 void ScAutoFormatDlg::UpdateChecks() 173 { 174 ScAutoFormatData* pData = (*pFormat)[nIndex]; 175 176 aBtnNumFormat.Check( pData->GetIncludeValueFormat() ); 177 aBtnBorder .Check( pData->GetIncludeFrame() ); 178 aBtnFont .Check( pData->GetIncludeFont() ); 179 aBtnPattern .Check( pData->GetIncludeBackground() ); 180 aBtnAlignment.Check( pData->GetIncludeJustify() ); 181 aBtnAdjust .Check( pData->GetIncludeWidthHeight() ); 182 } 183 184 //------------------------------------------------------------------------ 185 // Handler: 186 //--------- 187 188 IMPL_LINK( ScAutoFormatDlg, CloseHdl, PushButton *, pBtn ) 189 { 190 if ( pBtn == &aBtnOk || pBtn == &aBtnCancel ) 191 { 192 if ( bCoreDataChanged ) 193 ScGlobal::GetAutoFormat()->Save(); 194 195 EndDialog( (pBtn == &aBtnOk) ? RET_OK : RET_CANCEL ); 196 } 197 return 0; 198 } 199 200 //------------------------------------------------------------------------ 201 202 IMPL_LINK_INLINE_START( ScAutoFormatDlg, DblClkHdl, void *, EMPTYARG ) 203 { 204 if ( bCoreDataChanged ) 205 ScGlobal::GetAutoFormat()->Save(); 206 207 EndDialog( RET_OK ); 208 return 0; 209 } 210 IMPL_LINK_INLINE_END( ScAutoFormatDlg, DblClkHdl, void *, EMPTYARG ) 211 212 //------------------------------------------------------------------------ 213 214 IMPL_LINK( ScAutoFormatDlg, CheckHdl, Button *, pBtn ) 215 { 216 ScAutoFormatData* pData = (*pFormat)[nIndex]; 217 sal_Bool bCheck = ((CheckBox*)pBtn)->IsChecked(); 218 219 if ( pBtn == &aBtnNumFormat ) 220 pData->SetIncludeValueFormat( bCheck ); 221 else if ( pBtn == &aBtnBorder ) 222 pData->SetIncludeFrame( bCheck ); 223 else if ( pBtn == &aBtnFont ) 224 pData->SetIncludeFont( bCheck ); 225 else if ( pBtn == &aBtnPattern ) 226 pData->SetIncludeBackground( bCheck ); 227 else if ( pBtn == &aBtnAlignment ) 228 pData->SetIncludeJustify( bCheck ); 229 else if ( pBtn == &aBtnAdjust ) 230 pData->SetIncludeWidthHeight( bCheck ); 231 232 if ( !bCoreDataChanged ) 233 { 234 aBtnCancel.SetText( aStrClose ); 235 bCoreDataChanged = sal_True; 236 } 237 238 pWndPreview->NotifyChange( pData ); 239 240 return 0; 241 } 242 243 //------------------------------------------------------------------------ 244 245 IMPL_LINK( ScAutoFormatDlg, AddHdl, void *, EMPTYARG ) 246 { 247 if ( !bFmtInserted && pSelFmtData ) 248 { 249 String aStrStandard( SfxResId(STR_STANDARD) ); 250 String aFormatName; 251 ScStringInputDlg* pDlg; 252 sal_Bool bOk = sal_False; 253 254 while ( !bOk ) 255 { 256 pDlg = new ScStringInputDlg( this, 257 aStrTitle, 258 aStrLabel, 259 aFormatName, 260 HID_SC_ADD_AUTOFMT, HID_SC_AUTOFMT_NAME ); 261 262 if ( pDlg->Execute() == RET_OK ) 263 { 264 pDlg->GetInputString( aFormatName ); 265 266 if ( (aFormatName.Len() > 0) && (aFormatName != aStrStandard) ) 267 { 268 ScAutoFormatData* pNewData 269 = new ScAutoFormatData( *pSelFmtData ); 270 271 pNewData->SetName( aFormatName ); 272 bFmtInserted = pFormat->Insert( pNewData ); 273 274 if ( bFmtInserted ) 275 { 276 sal_uInt16 nAt = pFormat->IndexOf( pNewData ); 277 278 aLbFormat.InsertEntry( aFormatName, nAt ); 279 aLbFormat.SelectEntry( aFormatName ); 280 aBtnAdd.Disable(); 281 282 if ( !bCoreDataChanged ) 283 { 284 aBtnCancel.SetText( aStrClose ); 285 bCoreDataChanged = sal_True; 286 } 287 288 SelFmtHdl( 0 ); 289 bOk = sal_True; 290 } 291 else 292 delete pNewData; 293 294 } 295 296 if ( !bFmtInserted ) 297 { 298 sal_uInt16 nRet = ErrorBox( this, 299 WinBits( WB_OK_CANCEL | WB_DEF_OK), 300 ScGlobal::GetRscString(STR_INVALID_AFNAME) 301 ).Execute(); 302 303 bOk = ( nRet == RET_CANCEL ); 304 } 305 } 306 else 307 bOk = sal_True; 308 309 delete pDlg; 310 } 311 } 312 313 return 0; 314 } 315 316 //------------------------------------------------------------------------ 317 318 IMPL_LINK( ScAutoFormatDlg, RemoveHdl, void *, EMPTYARG ) 319 { 320 if ( (nIndex > 0) && (aLbFormat.GetEntryCount() > 0) ) 321 { 322 String aMsg( aStrDelMsg.GetToken( 0, '#' ) ); 323 324 aMsg += aLbFormat.GetSelectEntry(); 325 aMsg += aStrDelMsg.GetToken( 1, '#' ); 326 327 if ( RET_YES == 328 QueryBox( this, WinBits( WB_YES_NO | WB_DEF_YES ), aMsg ).Execute() ) 329 { 330 aLbFormat.RemoveEntry( nIndex ); 331 aLbFormat.SelectEntryPos( nIndex-1 ); 332 333 if ( nIndex-1 == 0 ) 334 aBtnRemove.Disable(); 335 336 if ( !bCoreDataChanged ) 337 { 338 aBtnCancel.SetText( aStrClose ); 339 bCoreDataChanged = sal_True; 340 } 341 342 pFormat->AtFree( nIndex ); // in der Core loeschen 343 nIndex--; 344 345 SelFmtHdl( 0 ); 346 } 347 } 348 349 SelFmtHdl( 0 ); 350 351 return 0; 352 } 353 354 IMPL_LINK( ScAutoFormatDlg, RenameHdl, void *, EMPTYARG ) 355 { 356 sal_Bool bOk = sal_False; 357 while( !bOk ) 358 { 359 360 String aFormatName=aLbFormat.GetSelectEntry(); 361 String aEntry; 362 363 ScStringInputDlg* pDlg = new ScStringInputDlg( this, 364 aStrRename, 365 aStrLabel, 366 aFormatName, 367 HID_SC_REN_AFMT_DLG, HID_SC_REN_AFMT_NAME ); 368 if( pDlg->Execute() == RET_OK ) 369 { 370 sal_Bool bFmtRenamed = sal_False; 371 pDlg->GetInputString( aFormatName ); 372 sal_uInt16 n; 373 374 if ( aFormatName.Len() > 0 ) 375 { 376 for( n = 0; n < pFormat->GetCount(); ++n ) 377 { 378 (*pFormat)[n]->GetName(aEntry); 379 if ( aEntry== aFormatName) 380 break; 381 } 382 if( n >= pFormat->GetCount() ) 383 { 384 // Format mit dem Namen noch nicht vorhanden, also 385 // umbenennen 386 387 aLbFormat.RemoveEntry(nIndex ); 388 ScAutoFormatData* p=(*pFormat)[ nIndex ]; 389 ScAutoFormatData* pNewData 390 = new ScAutoFormatData(*p); 391 392 pFormat->AtFree( nIndex ); 393 394 pNewData->SetName( aFormatName ); 395 396 pFormat->Insert( pNewData); 397 398 sal_uInt16 nCount = pFormat->GetCount(); 399 400 aLbFormat.SetUpdateMode(sal_False); 401 aLbFormat.Clear(); 402 for ( sal_uInt16 i = 0; i < nCount; i++ ) 403 { 404 ((*pFormat)[i])->GetName( aEntry ); 405 aLbFormat.InsertEntry( aEntry ); 406 } 407 408 aLbFormat.SetUpdateMode( sal_True); 409 aLbFormat.SelectEntry( aFormatName); 410 411 if ( !bCoreDataChanged ) 412 { 413 aBtnCancel.SetText( aStrClose ); 414 bCoreDataChanged = sal_True; 415 } 416 417 418 SelFmtHdl( 0 ); 419 bOk = sal_True; 420 bFmtRenamed = sal_True; 421 } 422 } 423 if( !bFmtRenamed ) 424 { 425 bOk = RET_CANCEL == ErrorBox( this, 426 WinBits( WB_OK_CANCEL | WB_DEF_OK), 427 ScGlobal::GetRscString(STR_INVALID_AFNAME) 428 ).Execute(); 429 } 430 } 431 else 432 bOk = sal_True; 433 delete pDlg; 434 } 435 436 return 0; 437 } 438 439 //------------------------------------------------------------------------ 440 441 IMPL_LINK( ScAutoFormatDlg, SelFmtHdl, void *, EMPTYARG ) 442 { 443 nIndex = aLbFormat.GetSelectEntryPos(); 444 UpdateChecks(); 445 446 if ( nIndex == 0 ) 447 { 448 aBtnRename.Disable(); 449 aBtnRemove.Disable(); 450 } 451 else 452 { 453 aBtnRename.Enable(); 454 aBtnRemove.Enable(); 455 } 456 457 pWndPreview->NotifyChange( (*pFormat)[nIndex] ); 458 459 return 0; 460 } 461 462 //------------------------------------------------------------------------ 463 464 String __EXPORT ScAutoFormatDlg::GetCurrFormatName() 465 { 466 String aResult; 467 468 ((*pFormat)[nIndex])->GetName( aResult ); 469 470 return aResult; 471 } 472