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_cui.hxx"
26
27 #include <sfx2/app.hxx>
28 #include <tools/rc.h>
29 #include <tools/shl.hxx>
30
31 #define _SVSTDARR_USHORTS
32 #include <svl/svstdarr.hxx>
33 #include <dialmgr.hxx>
34
35 #include "iconcdlg.hxx"
36
37 #include "helpid.hrc"
38 #include <cuires.hrc>
39 #include <unotools/viewoptions.hxx>
40 #include <svtools/apearcfg.hxx>
41 #include <vcl/mnemonic.hxx>
42 #include <vcl/i18nhelp.hxx>
43
44 #ifdef WNT
IconcDlgCmpUS_Impl(const void * p1,const void * p2)45 int __cdecl IconcDlgCmpUS_Impl( const void* p1, const void* p2 )
46 #else
47 #if defined(OS2) && defined(ICC)
48 int _Optlink IconcDlgCmpUS_Impl( const void* p1, const void* p2 )
49 #else
50 int IconcDlgCmpUS_Impl( const void* p1, const void* p2 )
51 #endif
52 #endif
53 {
54 return *(sal_uInt16*)p1 - *(sal_uInt16*)p2;
55 }
56
57 // some stuff for easier changes for SvtViewOptions
58 static const sal_Char* pViewOptDataName = "dialog data";
59 #define VIEWOPT_DATANAME ::rtl::OUString::createFromAscii( pViewOptDataName )
60
SetViewOptUserItem(SvtViewOptions & rOpt,const String & rData)61 static inline void SetViewOptUserItem( SvtViewOptions& rOpt, const String& rData )
62 {
63 rOpt.SetUserItem( VIEWOPT_DATANAME, ::com::sun::star::uno::makeAny( ::rtl::OUString( rData ) ) );
64 }
65
GetViewOptUserItem(const SvtViewOptions & rOpt)66 static inline String GetViewOptUserItem( const SvtViewOptions& rOpt )
67 {
68 ::com::sun::star::uno::Any aAny( rOpt.GetUserItem( VIEWOPT_DATANAME ) );
69 ::rtl::OUString aUserData;
70 aAny >>= aUserData;
71
72 return String( aUserData );
73 }
74
75
76 //#####################################################################
77 //
78 // Class IconChoicePage
79 //
80 //#####################################################################
81
82 /**********************************************************************
83 |
84 | Ctor / Dtor
85 |
86 \**********************************************************************/
87
IconChoicePage(Window * pParent,const ResId & rResId,const SfxItemSet & rAttrSet)88 IconChoicePage::IconChoicePage( Window *pParent, const ResId &rResId,
89 const SfxItemSet &rAttrSet )
90 : TabPage ( pParent, rResId ),
91 pSet ( &rAttrSet ),
92 bHasExchangeSupport ( sal_False ),
93 pDialog ( NULL ),
94 bStandard ( sal_False )
95 {
96 SetStyle ( GetStyle() | WB_DIALOGCONTROL | WB_HIDE );
97 }
98
99 // -----------------------------------------------------------------------
100
~IconChoicePage()101 IconChoicePage::~IconChoicePage()
102 {
103 }
104
105 /**********************************************************************
106 |
107 | Activate / Deaktivate
108 |
109 \**********************************************************************/
110
ActivatePage(const SfxItemSet &)111 void IconChoicePage::ActivatePage( const SfxItemSet& )
112 {
113 }
114
115 // -----------------------------------------------------------------------
116
DeactivatePage(SfxItemSet *)117 int IconChoicePage::DeactivatePage( SfxItemSet* )
118 {
119 return LEAVE_PAGE;
120 }
121
122 /**********************************************************************
123 |
124 | ...
125 |
126 \**********************************************************************/
127
FillUserData()128 void IconChoicePage::FillUserData()
129 {
130 }
131
132 // -----------------------------------------------------------------------
133
IsReadOnly() const134 sal_Bool IconChoicePage::IsReadOnly() const
135 {
136 return sal_False;
137 }
138
139 // -----------------------------------------------------------------------
140
QueryClose()141 sal_Bool IconChoicePage::QueryClose()
142 {
143 return sal_True;
144 }
145
146 /**********************************************************************
147 |
148 | window-methods
149 |
150 \**********************************************************************/
151
ImplInitSettings()152 void IconChoicePage::ImplInitSettings()
153 {
154 Window* pParent = GetParent();
155 if ( pParent->IsChildTransparentModeEnabled() && !IsControlBackground() )
156 {
157 EnableChildTransparentMode( sal_True );
158 SetParentClipMode( PARENTCLIPMODE_NOCLIP );
159 SetPaintTransparent( sal_True );
160 SetBackground();
161 }
162 else
163 {
164 EnableChildTransparentMode( sal_False );
165 SetParentClipMode( 0 );
166 SetPaintTransparent( sal_False );
167
168 if ( IsControlBackground() )
169 SetBackground( GetControlBackground() );
170 else
171 SetBackground( pParent->GetBackground() );
172 }
173 }
174
175 // -----------------------------------------------------------------------
176
StateChanged(StateChangedType nType)177 void IconChoicePage::StateChanged( StateChangedType nType )
178 {
179 Window::StateChanged( nType );
180
181 if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
182 {
183 ImplInitSettings();
184 Invalidate();
185 }
186 }
187
188 // -----------------------------------------------------------------------
189
DataChanged(const DataChangedEvent & rDCEvt)190 void IconChoicePage::DataChanged( const DataChangedEvent& rDCEvt )
191 {
192 Window::DataChanged( rDCEvt );
193
194 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
195 (rDCEvt.GetFlags() & SETTINGS_STYLE) )
196 {
197 ImplInitSettings();
198 Invalidate();
199 }
200 }
201
202 //#####################################################################
203 //
204 // Class IconChoiceDialog
205 //
206 //#####################################################################
207
208 /**********************************************************************
209 |
210 | Ctor / Dtor
211 |
212 \**********************************************************************/
213
IconChoiceDialog(Window * pParent,const ResId & rResId,const EIconChoicePos ePos,const SfxItemSet * pItemSet)214 IconChoiceDialog::IconChoiceDialog ( Window* pParent, const ResId &rResId,
215 const EIconChoicePos ePos,
216 const SfxItemSet *pItemSet )//, sal_Bool bEditFmt, const String *pUserButtonText = 0 )
217 : ModalDialog ( pParent, rResId ),
218 meChoicePos ( ePos ),
219 maIconCtrl ( this, WB_3DLOOK | WB_ICON | WB_BORDER |
220 WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME |
221 /* WB_NOSELECTION | */ WB_NODRAGSELECTION | WB_TABSTOP ),
222 mnCurrentPageId ( USHRT_MAX ),
223
224 aOKBtn ( this, WB_DEFBUTTON ),
225 aCancelBtn ( this, WB_DEFBUTTON ),
226 aHelpBtn ( this ),
227 aResetBtn ( this ),
228 pSet ( pItemSet ),
229 pOutSet ( NULL ),
230 pExampleSet ( NULL ),
231 pRanges ( NULL ),
232 nResId ( rResId.GetId() ),
233
234 bHideResetBtn ( sal_False ),
235 bModal ( sal_False ),
236 bInOK ( sal_False ),
237 bModified ( sal_False ),
238 bItemsReset ( sal_False )
239 {
240 // IconChoiceCtrl-Settings
241 //maIconCtrl.SetBackground ( Wallpaper( Color (146, 146, 186) ) );
242
243 maIconCtrl.SetStyle (WB_3DLOOK | WB_ICON | WB_BORDER | WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME | /* WB_NOSELECTION | */ WB_NODRAGSELECTION | WB_TABSTOP | WB_CLIPCHILDREN );
244 SetCtrlPos ( meChoicePos );
245 maIconCtrl.SetClickHdl ( LINK ( this, IconChoiceDialog , ChosePageHdl_Impl ) );
246 maIconCtrl.Show();
247 maIconCtrl.SetChoiceWithCursor ( sal_True );
248 maIconCtrl.SetSelectionMode( SINGLE_SELECTION );
249 maIconCtrl.SetHelpId( HID_ICCDIALOG_CHOICECTRL );
250
251 // ItemSet
252 if ( pSet )
253 {
254 pExampleSet = new SfxItemSet( *pSet );
255 pOutSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
256 }
257
258 // Buttons
259 aOKBtn.SetClickHdl ( LINK( this, IconChoiceDialog, OkHdl ) );
260 aOKBtn.SetHelpId( HID_ICCDIALOG_OK_BTN );
261 aCancelBtn.SetHelpId( HID_ICCDIALOG_CANCEL_BTN );
262 aResetBtn.SetClickHdl( LINK( this, IconChoiceDialog, ResetHdl ) );
263 aResetBtn.SetText( CUI_RESSTR(RID_SVXSTR_ICONCHOICEDLG_RESETBUT) );
264 aResetBtn.SetHelpId( HID_ICCDIALOG_RESET_BTN );
265 aOKBtn.Show();
266 aCancelBtn.Show();
267 aHelpBtn.Show();
268 aResetBtn.Show();
269
270 SetPosSizeCtrls ( sal_True );
271 }
272
273 // -----------------------------------------------------------------------
274
275 /*
276 IconChoiceDialog ::IconChoiceDialog ( SfxViewFrame *pViewFrame, Window* pParent, const ResId &rResId,
277 const SfxItemSet * = 0, sal_Bool bEditFmt = sal_False,
278 const String *pUserButtonText = 0 )
279 : meChoicePos ( PosLeft ), // Default erst ma Links
280 maIconCtrl ( this, Die_Winbits ),
281 aOKBtn ( this ),
282 pUserBtn ( pUserButtonText? new PushButton(this): 0 ),
283 aCancelBtn ( this ),
284 aHelpBtn ( this ),
285 aResetBtn ( this ),
286 aBaseFmtBtn ( this ),
287 mnCurrentPageId ( 0 )
288 {
289 FreeResource();
290 }
291 */
292
293 // -----------------------------------------------------------------------
294
~IconChoiceDialog()295 IconChoiceDialog ::~IconChoiceDialog ()
296 {
297 sal_uLong i;
298
299 // save configuration at INI-Manager
300 // and remove pages
301 SvtViewOptions aTabDlgOpt( E_TABDIALOG, String::CreateFromInt32( nResId ) );
302 aTabDlgOpt.SetWindowState( ::rtl::OUString::createFromAscii( GetWindowState((WINDOWSTATE_MASK_X | WINDOWSTATE_MASK_Y | WINDOWSTATE_MASK_STATE | WINDOWSTATE_MASK_MINIMIZED)).GetBuffer() ) );
303 aTabDlgOpt.SetPageID( mnCurrentPageId );
304
305 const sal_uLong nCount = maPageList.Count();
306
307 for ( i = 0; i < nCount; ++i )
308 {
309 IconChoicePageData* pData = maPageList.GetObject(i);
310
311 if ( pData->pPage )
312 {
313 pData->pPage->FillUserData();
314 String aPageData(pData->pPage->GetUserData());
315 if ( aPageData.Len() )
316 {
317 SvtViewOptions aTabPageOpt( E_TABPAGE, String::CreateFromInt32( pData->nId ) );
318
319 SetViewOptUserItem( aTabPageOpt, aPageData );
320 }
321
322 if ( pData->bOnDemand )
323 delete (SfxItemSet*)&pData->pPage->GetItemSet();
324 delete pData->pPage;
325 }
326 delete pData;
327 }
328
329 // remove Userdata from Icons
330 for ( i=0; i<maIconCtrl.GetEntryCount(); i++)
331 {
332 SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.GetEntry ( i );
333 sal_uInt16* pUserData = (sal_uInt16*) pEntry->GetUserData();
334 delete pUserData;
335 }
336
337 //
338 if ( pRanges )
339 delete pRanges;
340 if ( pOutSet )
341 delete pOutSet;
342 }
343
344 /**********************************************************************
345 |
346 | add new page
347 |
348 \**********************************************************************/
349
AddTabPage(sal_uInt16 nId,const String & rIconText,const Image & rChoiceIcon,const Image & rChoiceIconHC,CreatePage pCreateFunc,GetPageRanges pRangesFunc,sal_Bool bItemsOnDemand,sal_uLong)350 SvxIconChoiceCtrlEntry* IconChoiceDialog::AddTabPage( sal_uInt16 nId, const String& rIconText,
351 const Image& rChoiceIcon,
352 const Image& rChoiceIconHC,
353 CreatePage pCreateFunc /* != 0 */,
354 GetPageRanges pRangesFunc /* darf 0 sein */,
355 sal_Bool bItemsOnDemand, sal_uLong /*nPos*/ )
356 {
357 IconChoicePageData* pData = new IconChoicePageData ( nId, pCreateFunc,
358 pRangesFunc,
359 bItemsOnDemand );
360 maPageList.Insert ( pData, LIST_APPEND );
361
362 pData->fnGetRanges = pRangesFunc;
363 pData->bOnDemand = bItemsOnDemand;
364
365 sal_uInt16 *pId = new sal_uInt16 ( nId );
366 SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.InsertEntry( rIconText, rChoiceIcon, rChoiceIconHC );
367 pEntry->SetUserData ( (void*) pId );
368 return pEntry;
369 }
370
371 /**********************************************************************
372 |
373 | Paint-method
374 |
375 \**********************************************************************/
376
Paint(const Rectangle & rRect)377 void IconChoiceDialog::Paint( const Rectangle& rRect )
378 {
379 Dialog::Paint ( rRect );
380
381 for ( sal_uLong i=0; i<maPageList.Count(); i++ )
382 {
383 IconChoicePageData* pData = (IconChoicePageData*)maPageList.GetObject ( i );
384
385 if ( pData->nId == mnCurrentPageId )
386 {
387 ShowPageImpl ( pData );
388 }
389 else
390 {
391 HidePageImpl ( pData );
392 }
393 }
394 }
395
SetCtrlPos(const EIconChoicePos & rPos)396 EIconChoicePos IconChoiceDialog::SetCtrlPos( const EIconChoicePos& rPos )
397 {
398 WinBits aWinBits = maIconCtrl.GetStyle ();
399
400 switch ( meChoicePos )
401 {
402 case PosLeft :
403 aWinBits &= ~WB_ALIGN_TOP & ~WB_NOVSCROLL;
404 aWinBits |= WB_ALIGN_LEFT | WB_NOHSCROLL;
405 break;
406 case PosRight :
407 aWinBits &= ~WB_ALIGN_TOP & ~WB_NOVSCROLL;
408 aWinBits |= WB_ALIGN_LEFT | WB_NOHSCROLL;
409 break;
410 case PosTop :
411 aWinBits &= ~WB_ALIGN_LEFT & ~WB_NOHSCROLL;
412 aWinBits |= WB_ALIGN_TOP | WB_NOVSCROLL;
413 break;
414 case PosBottom :
415 aWinBits &= ~WB_ALIGN_LEFT & ~WB_NOHSCROLL;
416 aWinBits |= WB_ALIGN_TOP | WB_NOVSCROLL;
417 break;
418 };
419 maIconCtrl.SetStyle ( aWinBits );
420
421 SetPosSizeCtrls();
422
423
424 EIconChoicePos eOldPos = meChoicePos;
425 meChoicePos = rPos;
426
427 return eOldPos;
428 }
429
430 /**********************************************************************
431 |
432 | Show / Hide page or button
433 |
434 \**********************************************************************/
435
ShowPageImpl(IconChoicePageData * pData)436 void IconChoiceDialog::ShowPageImpl ( IconChoicePageData* pData )
437 {
438 if ( pData->pPage )
439 pData->pPage->Show();
440 }
441
442 // -----------------------------------------------------------------------
443
HidePageImpl(IconChoicePageData * pData)444 void IconChoiceDialog::HidePageImpl ( IconChoicePageData* pData )
445 {
446 if ( pData->pPage )
447 pData->pPage->Hide();
448 }
449
450 // -----------------------------------------------------------------------
451
ShowPage(sal_uInt16 nId)452 void IconChoiceDialog::ShowPage( sal_uInt16 nId )
453 {
454 bool bInvalidate = GetCurPageId() != nId;
455 SetCurPageId( nId );
456 ActivatePageImpl( );
457 if(bInvalidate)
458 Invalidate();
459
460 // IA2 CWS. MT: I guess we want the event now, and not in Paint()?
461 IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
462 if(pData)
463 ShowPageImpl ( pData );
464 }
465
466 /**********************************************************************
467 |
468 | Resize Dialog
469 |
470 \**********************************************************************/
471
472 #define ICONCTRL_WIDTH_PIXEL 110
473 #define ICONCTRL_HEIGHT_PIXEL 75
474 #define MINSIZE_BUTTON_WIDTH 70
475 #define MINSIZE_BUTTON_HEIGHT 22
476
Resize()477 void IconChoiceDialog::Resize()
478 {
479 Dialog::Resize ();
480
481 if ( IsReallyVisible() )
482 {
483 SetPosSizeCtrls ();
484 }
485 }
486
SetPosSizeCtrls(sal_Bool bInit)487 void IconChoiceDialog::SetPosSizeCtrls ( sal_Bool bInit )
488 {
489 const Point aCtrlOffset ( LogicToPixel( Point( CTRLS_OFFSET, CTRLS_OFFSET ), MAP_APPFONT ) );
490 Size aOutSize ( GetOutputSizePixel() );
491
492 ////////////////////////////////////////
493 // Button-Defaults
494 //
495 Size aDefaultButtonSize = LogicToPixel( Size( 50, 14 ), MAP_APPFONT );
496
497 // Reset-Button
498 Size aResetButtonSize ( bInit ? aDefaultButtonSize :
499 aResetBtn.GetSizePixel () );
500
501 ////////////////////////////////////////
502 // IconChoiceCtrl resizen & positionieren
503 //
504 SvtTabAppearanceCfg aCfg;
505 const long nDefaultWidth = (aCfg.GetScaleFactor() * ICONCTRL_WIDTH_PIXEL) / 100;
506 const long nDefaultHeight = (aCfg.GetScaleFactor() * ICONCTRL_HEIGHT_PIXEL) / 100;
507
508 Size aNewIconCtrlSize ( nDefaultWidth,
509 aOutSize.Height()-(2*aCtrlOffset.X()) );
510 Point aIconCtrlPos;
511 switch ( meChoicePos )
512 {
513 case PosLeft :
514 aIconCtrlPos = aCtrlOffset;
515 aNewIconCtrlSize = Size ( nDefaultWidth,
516 aOutSize.Height()-(2*aCtrlOffset.X()) );
517 break;
518 case PosRight :
519 aIconCtrlPos = Point ( aOutSize.Width() - nDefaultWidth -
520 aCtrlOffset.X(), aCtrlOffset.X() );
521 aNewIconCtrlSize = Size ( nDefaultWidth,
522 aOutSize.Height()-(2*aCtrlOffset.X()) );
523 break;
524 case PosTop :
525 aIconCtrlPos = aCtrlOffset;
526 aNewIconCtrlSize = Size ( aOutSize.Width()-(2*aCtrlOffset.X()),
527 nDefaultHeight );
528 break;
529 case PosBottom :
530 aIconCtrlPos = Point ( aCtrlOffset.X(), aOutSize.Height() -
531 aResetButtonSize.Height() - (2*aCtrlOffset.X()) -
532 nDefaultHeight );
533 aNewIconCtrlSize = Size ( aOutSize.Width()-(2*aCtrlOffset.X()),
534 nDefaultHeight );
535 break;
536 };
537 maIconCtrl.SetPosSizePixel ( aIconCtrlPos, aNewIconCtrlSize );
538 maIconCtrl.ArrangeIcons();
539
540 ////////////////////////////////////////
541 // Pages resizen & positionieren
542 //
543 for ( sal_uLong i=0; i<maPageList.Count(); i++ )
544 {
545 IconChoicePageData* pData = (IconChoicePageData*)maPageList.GetObject ( i );
546
547 Point aNewPagePos;
548 Size aNewPageSize;
549 switch ( meChoicePos )
550 {
551 case PosLeft :
552 aNewPagePos = Point ( aNewIconCtrlSize.Width() + (2*CTRLS_OFFSET),
553 CTRLS_OFFSET );
554 aNewPageSize = Size ( aOutSize.Width() - aNewIconCtrlSize.Width() -
555 (3*CTRLS_OFFSET),
556 aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
557 (3*CTRLS_OFFSET) );
558 break;
559 case PosRight :
560 aNewPagePos = aCtrlOffset;
561 aNewPageSize = Size ( aOutSize.Width() - aNewIconCtrlSize.Width() -
562 (3*aCtrlOffset.X()),
563 aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
564 (3*aCtrlOffset.X()) );
565 break;
566 case PosTop :
567 aNewPagePos = Point ( aCtrlOffset.X(), aNewIconCtrlSize.Height() +
568 (2*aCtrlOffset.X()) );
569 aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()),
570 aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
571 aNewIconCtrlSize.Height() - (4*aCtrlOffset.X()) );
572 break;
573 case PosBottom :
574 aNewPagePos = aCtrlOffset;
575 aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()),
576 aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
577 aNewIconCtrlSize.Height() - (4*aCtrlOffset.X()) );
578 break;
579 };
580
581 if ( pData->pPage )
582 pData->pPage->SetPosSizePixel ( aNewPagePos, aNewPageSize );
583 }
584
585 ////////////////////////////////////////
586 // Buttons positionieren
587 //
588 sal_uLong nXOffset=0;
589 if ( meChoicePos == PosRight )
590 nXOffset = aNewIconCtrlSize.Width()+(2*aCtrlOffset.X());
591
592 aResetBtn.SetPosSizePixel ( Point( aOutSize.Width() - nXOffset -
593 aResetButtonSize.Width()-aCtrlOffset.X(),
594 aOutSize.Height()-aResetButtonSize.Height()-
595 aCtrlOffset.X() ),
596 aResetButtonSize );
597 // Help-Button
598 Size aHelpButtonSize ( bInit ? aDefaultButtonSize :
599 aHelpBtn.GetSizePixel () );
600 aHelpBtn.SetPosSizePixel ( Point( aOutSize.Width()-aResetButtonSize.Width()-
601 aHelpButtonSize.Width()- nXOffset -
602 (2*aCtrlOffset.X()),
603 aOutSize.Height()-aHelpButtonSize.Height()-
604 aCtrlOffset.X() ),
605 aHelpButtonSize );
606 // Cancel-Button
607 Size aCancelButtonSize ( bInit ? aDefaultButtonSize :
608 aCancelBtn.GetSizePixel () );
609 aCancelBtn.SetPosSizePixel ( Point( aOutSize.Width()-aCancelButtonSize.Width()-
610 aResetButtonSize.Width()-aHelpButtonSize.Width()-
611 (3*aCtrlOffset.X()) - nXOffset,
612 aOutSize.Height()-aCancelButtonSize.Height()-
613 aCtrlOffset.X() ),
614 aCancelButtonSize );
615 // OK-Button
616 Size aOKButtonSize ( bInit ? aDefaultButtonSize : aOKBtn.GetSizePixel () );
617 aOKBtn.SetPosSizePixel ( Point( aOutSize.Width()-aOKButtonSize.Width()-
618 aCancelButtonSize.Width()-aResetButtonSize.Width()-
619 aHelpButtonSize.Width()-(4*aCtrlOffset.X())- nXOffset,
620 aOutSize.Height()-aOKButtonSize.Height()-aCtrlOffset.X() ),
621 aOKButtonSize );
622
623 Invalidate();
624 }
625
SetPosSizePages(sal_uInt16 nId)626 void IconChoiceDialog::SetPosSizePages ( sal_uInt16 nId )
627 {
628 const Point aCtrlOffset ( LogicToPixel( Point( CTRLS_OFFSET, CTRLS_OFFSET ), MAP_APPFONT ) );
629 IconChoicePageData* pData = GetPageData ( nId );
630
631 if ( pData->pPage )
632 {
633 Size aOutSize ( GetOutputSizePixel() );
634 Size aIconCtrlSize ( maIconCtrl.GetSizePixel() );
635
636 Point aNewPagePos;
637 Size aNewPageSize;
638 switch ( meChoicePos )
639 {
640 case PosLeft :
641 aNewPagePos = Point ( aIconCtrlSize.Width() + (2*aCtrlOffset.X()),
642 aCtrlOffset.X() );
643 aNewPageSize = Size ( aOutSize.Width() - maIconCtrl.GetSizePixel().Width() -
644 (3*aCtrlOffset.X()),
645 aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
646 (3*aCtrlOffset.X()) );
647 break;
648 case PosRight :
649 aNewPagePos = aCtrlOffset;
650 aNewPageSize = Size ( aOutSize.Width() - maIconCtrl.GetSizePixel().Width() -
651 (3*aCtrlOffset.X()),
652 aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
653 (3*aCtrlOffset.X()) );
654 break;
655 case PosTop :
656 aNewPagePos = Point ( aCtrlOffset.X(), aIconCtrlSize.Height() +
657 (2*aCtrlOffset.X()) );
658 aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()),
659 aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
660 maIconCtrl.GetSizePixel().Height() - (4*aCtrlOffset.X()) );
661 break;
662 case PosBottom :
663 aNewPagePos = aCtrlOffset;
664 aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()),
665 aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
666 maIconCtrl.GetSizePixel().Height() - (4*aCtrlOffset.X()) );
667 break;
668 };
669
670 pData->pPage->SetPosSizePixel ( aNewPagePos, aNewPageSize );
671 }
672 }
673
674 /**********************************************************************
675 |
676 | select a page
677 |
678 \**********************************************************************/
679
IMPL_LINK(IconChoiceDialog,ChosePageHdl_Impl,void *,EMPTYARG)680 IMPL_LINK ( IconChoiceDialog , ChosePageHdl_Impl, void *, EMPTYARG )
681 {
682 sal_uLong nPos;
683
684 SvxIconChoiceCtrlEntry *pEntry = maIconCtrl.GetSelectedEntry ( nPos );
685 if ( !pEntry )
686 pEntry = maIconCtrl.GetCursor( );
687
688 sal_uInt16 *pId = (sal_uInt16*)pEntry->GetUserData ();
689
690 if( *pId != mnCurrentPageId )
691 {
692 IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
693 if ( pData->pPage )
694 DeActivatePageImpl();
695
696 SetCurPageId ( *pId );
697
698 ActivatePageImpl();
699 Invalidate();
700 }
701
702 return 0L;
703 }
704
705 /**********************************************************************
706 |
707 | Button-handler
708 |
709 \**********************************************************************/
710
IMPL_LINK(IconChoiceDialog,OkHdl,Button *,EMPTYARG)711 IMPL_LINK( IconChoiceDialog, OkHdl, Button *, EMPTYARG )
712 {
713 bInOK = sal_True;
714
715 if ( OK_Impl() )
716 {
717 if ( bModal )
718 EndDialog( Ok() );
719 else
720 {
721 Ok();
722 Close();
723 }
724 }
725 return 0;
726 }
727
728 // -----------------------------------------------------------------------
729
IMPL_LINK(IconChoiceDialog,ResetHdl,Button *,EMPTYARG)730 IMPL_LINK( IconChoiceDialog, ResetHdl, Button *, EMPTYARG )
731 {
732 ResetPageImpl ();
733
734 IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
735 DBG_ASSERT( pData, "Id nicht bekannt" );
736
737 if ( pData->bOnDemand )
738 {
739 // CSet auf AIS hat hier Probleme, daher getrennt
740 const SfxItemSet* _pSet = &( pData->pPage->GetItemSet() );
741 pData->pPage->Reset( *(SfxItemSet*)_pSet );
742 }
743 else
744 pData->pPage->Reset( *pSet );
745
746
747 return 0;
748 }
749
750 // -----------------------------------------------------------------------
751
IMPL_LINK(IconChoiceDialog,CancelHdl,Button *,EMPTYARG)752 IMPL_LINK( IconChoiceDialog, CancelHdl, Button*, EMPTYARG )
753 {
754 Close();
755
756 return 0;
757 }
758
759 /**********************************************************************
760 |
761 | call page
762 |
763 \**********************************************************************/
764
ActivatePageImpl()765 void IconChoiceDialog::ActivatePageImpl ()
766 {
767 DBG_ASSERT( maPageList.Count(), "keine Pages angemeldet" );
768 IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
769 DBG_ASSERT( pData, "Id nicht bekannt" );
770 if ( pData )
771 {
772 if ( !pData->pPage )
773 {
774 const SfxItemSet* pTmpSet = 0;
775
776 if ( pSet )
777 {
778 if ( bItemsReset && pSet->GetParent() )
779 pTmpSet = pSet->GetParent();
780 else
781 pTmpSet = pSet;
782 }
783
784 if ( pTmpSet && !pData->bOnDemand )
785 pData->pPage = (pData->fnCreatePage)( this, *pTmpSet );
786 else
787 pData->pPage = (pData->fnCreatePage)( this, *CreateInputItemSet( mnCurrentPageId ) );
788
789 SvtViewOptions aTabPageOpt( E_TABPAGE, String::CreateFromInt32( pData->nId ) );
790 pData->pPage->SetUserData( GetViewOptUserItem( aTabPageOpt ) );
791 SetPosSizePages ( pData->nId );
792
793 if ( pData->bOnDemand )
794 pData->pPage->Reset( (SfxItemSet &)pData->pPage->GetItemSet() );
795 else
796 pData->pPage->Reset( *pSet );
797
798 PageCreated( mnCurrentPageId, *pData->pPage );
799 }
800 else if ( pData->bRefresh )
801 {
802 pData->pPage->Reset( *pSet );
803 }
804
805 pData->bRefresh = sal_False;
806
807 if ( pExampleSet )
808 pData->pPage->ActivatePage( *pExampleSet );
809 }
810
811 SetHelpId( pData->pPage->GetHelpId() );
812
813 sal_Bool bReadOnly = pData->pPage->IsReadOnly();
814 if ( bReadOnly || bHideResetBtn )
815 aResetBtn.Hide();
816 else
817 aResetBtn.Show();
818
819 }
820
821 // -----------------------------------------------------------------------
822
DeActivatePageImpl()823 sal_Bool IconChoiceDialog::DeActivatePageImpl ()
824 {
825 IconChoicePageData *pData = GetPageData ( mnCurrentPageId );
826
827 int nRet = IconChoicePage::LEAVE_PAGE;
828
829 if ( pData )
830 {
831 IconChoicePage * pPage = pData->pPage;
832
833 if ( !pExampleSet && pPage->HasExchangeSupport() && pSet )
834 pExampleSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
835
836 if ( pSet )
837 {
838 SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
839
840 if ( pPage->HasExchangeSupport() )
841 nRet = pPage->DeactivatePage( &aTmp );
842
843 if ( ( IconChoicePage::LEAVE_PAGE & nRet ) == IconChoicePage::LEAVE_PAGE &&
844 aTmp.Count() )
845 {
846 pExampleSet->Put( aTmp );
847 pOutSet->Put( aTmp );
848 }
849 }
850 else
851 {
852 if ( pPage->HasExchangeSupport() ) //!!!
853 {
854 if ( !pExampleSet )
855 {
856 SfxItemPool* pPool = pPage->GetItemSet().GetPool();
857 pExampleSet =
858 new SfxItemSet( *pPool, GetInputRanges( *pPool ) );
859 }
860 nRet = pPage->DeactivatePage( pExampleSet );
861 }
862 else
863 nRet = pPage->DeactivatePage( NULL );
864 }
865
866 if ( nRet & IconChoicePage::REFRESH_SET )
867 {
868 pSet = GetRefreshedSet();
869 DBG_ASSERT( pSet, "GetRefreshedSet() liefert NULL" );
870 // alle Pages als neu zu initialsieren flaggen
871 const sal_uLong nCount = maPageList.Count();
872
873 for ( sal_uInt16 i = 0; i < nCount; ++i )
874 {
875 IconChoicePageData* pObj = (IconChoicePageData*)maPageList.GetObject(i);
876
877 if ( pObj->pPage != pPage ) // eigene Page nicht mehr refreshen
878 pObj->bRefresh = sal_True;
879 else
880 pObj->bRefresh = sal_False;
881 }
882 }
883 }
884
885 if ( nRet & IconChoicePage::LEAVE_PAGE )
886 return sal_True;
887 else
888 return sal_False;
889 }
890
891 // -----------------------------------------------------------------------
892
ResetPageImpl()893 void IconChoiceDialog::ResetPageImpl ()
894 {
895 IconChoicePageData *pData = GetPageData ( mnCurrentPageId );
896
897 DBG_ASSERT( pData, "Id nicht bekannt" );
898
899 if ( pData->bOnDemand )
900 {
901 // CSet auf AIS hat hier Probleme, daher getrennt
902 const SfxItemSet* _pSet = &pData->pPage->GetItemSet();
903 pData->pPage->Reset( *(SfxItemSet*)_pSet );
904 }
905 else
906 pData->pPage->Reset( *pSet );
907 }
908
909 /**********************************************************************
910 |
911 | handling itemsets
912 |
913 \**********************************************************************/
914
GetInputRanges(const SfxItemPool & rPool)915 const sal_uInt16* IconChoiceDialog::GetInputRanges( const SfxItemPool& rPool )
916 {
917 if ( pSet )
918 {
919 DBG_ERRORFILE( "Set bereits vorhanden!" );
920 return pSet->GetRanges();
921 }
922
923 if ( pRanges )
924 return pRanges;
925 SvUShorts aUS( 16, 16 );
926 sal_uLong nCount = maPageList.Count();
927
928 sal_uInt16 i;
929 for ( i = 0; i < nCount; ++i )
930 {
931 IconChoicePageData* pData = maPageList.GetObject (i);
932
933 if ( pData->fnGetRanges )
934 {
935 const sal_uInt16* pTmpRanges = (pData->fnGetRanges)();
936 const sal_uInt16* pIter = pTmpRanges;
937
938 sal_uInt16 nLen;
939 for( nLen = 0; *pIter; ++nLen, ++pIter )
940 ;
941 aUS.Insert( pTmpRanges, nLen, aUS.Count() );
942 }
943 }
944
945 // remove double Id's
946 #ifndef TF_POOLABLE
947 if ( rPool.HasMap() )
948 #endif
949 {
950 nCount = aUS.Count();
951
952 for ( i = 0; i < nCount; ++i )
953 aUS[i] = rPool.GetWhich( aUS[i] );
954 }
955
956 // sortieren
957 if ( aUS.Count() > 1 )
958 {
959 #if defined __SUNPRO_CC
960 #pragma disable_warn
961 #endif
962 qsort( (void*)aUS.GetData(), aUS.Count(), sizeof(sal_uInt16), IconcDlgCmpUS_Impl );
963 #if defined __SUNPRO_CC
964 #pragma enable_warn
965 #endif
966 }
967
968 pRanges = new sal_uInt16[aUS.Count() + 1];
969 memcpy(pRanges, aUS.GetData(), sizeof(sal_uInt16) * aUS.Count());
970 pRanges[aUS.Count()] = 0;
971
972 return pRanges;
973 }
974
975 // -----------------------------------------------------------------------
976
SetInputSet(const SfxItemSet * pInSet)977 void IconChoiceDialog::SetInputSet( const SfxItemSet* pInSet )
978 {
979 FASTBOOL bSet = ( pSet != NULL );
980
981 pSet = pInSet;
982
983 if ( !bSet && !pExampleSet && !pOutSet )
984 {
985 pExampleSet = new SfxItemSet( *pSet );
986 pOutSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
987 }
988 }
989
990 // -----------------------------------------------------------------------
991
PageCreated(sal_uInt16,IconChoicePage &)992 void IconChoiceDialog::PageCreated( sal_uInt16 /*nId*/, IconChoicePage& /*rPage*/ )
993 {
994 // not interested in
995 }
996
997 // -----------------------------------------------------------------------
998
CreateInputItemSet(sal_uInt16)999 SfxItemSet* IconChoiceDialog::CreateInputItemSet( sal_uInt16 )
1000 {
1001 DBG_WARNINGFILE( "CreateInputItemSet nicht implementiert" );
1002
1003 return 0;
1004 }
1005
1006 /**********************************************************************
1007 |
1008 | start dialog
1009 |
1010 \**********************************************************************/
1011
Execute()1012 short IconChoiceDialog::Execute()
1013 {
1014 if ( !maPageList.Count() )
1015 return RET_CANCEL;
1016
1017 Start_Impl();
1018
1019 return Dialog::Execute();
1020 }
1021
1022 // -----------------------------------------------------------------------
1023
Start(sal_Bool bShow)1024 void IconChoiceDialog::Start( sal_Bool bShow )
1025 {
1026
1027 aCancelBtn.SetClickHdl( LINK( this, IconChoiceDialog, CancelHdl ) );
1028 bModal = sal_False;
1029
1030 Start_Impl();
1031
1032 if ( bShow )
1033 Window::Show();
1034
1035 }
1036
1037 // -----------------------------------------------------------------------
1038
QueryClose()1039 sal_Bool IconChoiceDialog::QueryClose()
1040 {
1041 sal_Bool bRet = sal_True;
1042 const sal_uLong nCount = maPageList.Count();
1043 for ( sal_uLong i = 0; i < nCount; ++i )
1044 {
1045 IconChoicePageData* pData = maPageList.GetObject(i);
1046 if ( pData->pPage && !pData->pPage->QueryClose() )
1047 {
1048 bRet = sal_False;
1049 break;
1050 }
1051 }
1052 return bRet;
1053 }
1054
1055 // -----------------------------------------------------------------------
1056
Start_Impl()1057 void IconChoiceDialog::Start_Impl()
1058 {
1059 Point aPos;
1060 sal_uInt16 nActPage;
1061
1062 if ( mnCurrentPageId == 0 || mnCurrentPageId == USHRT_MAX )
1063 nActPage = maPageList.GetObject(0)->nId;//First()->nId;
1064 else
1065 nActPage = mnCurrentPageId;
1066
1067 // Konfiguration vorhanden?
1068 SvtViewOptions aTabDlgOpt( E_TABDIALOG, String::CreateFromInt32( nResId ) );
1069
1070 if ( aTabDlgOpt.Exists() )
1071 {
1072 // ggf. Position aus Konfig
1073 SetWindowState( ByteString( aTabDlgOpt.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US ) );
1074
1075 // initiale TabPage aus Programm/Hilfe/Konfig
1076 nActPage = (sal_uInt16)aTabDlgOpt.GetPageID();
1077
1078 if ( USHRT_MAX != mnCurrentPageId )
1079 nActPage = mnCurrentPageId;
1080
1081 if ( GetPageData ( nActPage ) == NULL )
1082 nActPage = ( (IconChoicePageData*)maPageList.GetObject(0) )->nId;
1083 }
1084 else if ( USHRT_MAX != mnCurrentPageId && GetPageData ( mnCurrentPageId ) != NULL )
1085 nActPage = mnCurrentPageId;
1086
1087 mnCurrentPageId = nActPage;
1088
1089 FocusOnIcon( mnCurrentPageId );
1090
1091 ActivatePageImpl();
1092 }
1093
1094 // -----------------------------------------------------------------------
1095
GetRefreshedSet()1096 const SfxItemSet* IconChoiceDialog::GetRefreshedSet()
1097 {
1098 DBG_ERRORFILE( "GetRefreshedSet nicht implementiert" );
1099 return 0;
1100 }
1101
1102 /**********************************************************************
1103 |
1104 | tool-methods
1105 |
1106 \**********************************************************************/
1107
GetPageData(sal_uInt16 nId)1108 IconChoicePageData* IconChoiceDialog::GetPageData ( sal_uInt16 nId )
1109 {
1110 IconChoicePageData *pRet = NULL;
1111 sal_Bool bFound = sal_False;
1112
1113 for ( sal_uLong i=0; i<maPageList.Count() && !bFound; i++ )
1114 {
1115 IconChoicePageData* pData = (IconChoicePageData*)maPageList.GetObject ( i );
1116
1117 if ( pData->nId == nId )
1118 {
1119 pRet = pData;
1120 }
1121 }
1122
1123 return pRet;
1124 }
1125
1126 /**********************************************************************
1127 |
1128 | OK-Status
1129 |
1130 \**********************************************************************/
1131
OK_Impl()1132 sal_Bool IconChoiceDialog::OK_Impl()
1133 {
1134 IconChoicePage* pPage = GetPageData ( mnCurrentPageId )->pPage;
1135
1136 bool bEnd = !pPage;
1137 if ( pPage )
1138 {
1139 int nRet = IconChoicePage::LEAVE_PAGE;
1140 if ( pSet )
1141 {
1142 SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
1143 sal_Bool bRet = sal_False;
1144
1145 if ( pPage->HasExchangeSupport() )
1146 nRet = pPage->DeactivatePage( &aTmp );
1147
1148 if ( ( IconChoicePage::LEAVE_PAGE & nRet ) == IconChoicePage::LEAVE_PAGE
1149 && aTmp.Count() )
1150 {
1151 pExampleSet->Put( aTmp );
1152 pOutSet->Put( aTmp );
1153 }
1154 else if ( bRet )
1155 bModified |= sal_True;
1156 }
1157 else
1158 nRet = pPage->DeactivatePage( NULL );
1159 bEnd = nRet;
1160 }
1161
1162 return bEnd;
1163 }
1164
1165 // -----------------------------------------------------------------------
1166
Ok()1167 short IconChoiceDialog::Ok()
1168 {
1169 bInOK = sal_True;
1170
1171 if ( !pOutSet )
1172 {
1173 if ( !pExampleSet && pSet )
1174 pOutSet = pSet->Clone( sal_False ); // ohne Items
1175 else if ( pExampleSet )
1176 pOutSet = new SfxItemSet( *pExampleSet );
1177 }
1178 sal_Bool _bModified = sal_False;
1179
1180 const sal_uLong nCount = maPageList.Count();
1181
1182 for ( sal_uInt16 i = 0; i < nCount; ++i )
1183 {
1184 IconChoicePageData* pData = GetPageData ( i );
1185
1186 IconChoicePage* pPage = pData->pPage;
1187
1188 if ( pPage )
1189 {
1190 if ( pData->bOnDemand )
1191 {
1192 SfxItemSet& rSet = (SfxItemSet&)pPage->GetItemSet();
1193 rSet.ClearItem();
1194 _bModified |= pPage->FillItemSet( rSet );
1195 }
1196 else if ( pSet && !pPage->HasExchangeSupport() )
1197 {
1198 SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
1199
1200 if ( pPage->FillItemSet( aTmp ) )
1201 {
1202 _bModified |= sal_True;
1203 pExampleSet->Put( aTmp );
1204 pOutSet->Put( aTmp );
1205 }
1206 }
1207 }
1208 }
1209
1210 if ( _bModified || ( pOutSet && pOutSet->Count() > 0 ) )
1211 _bModified |= sal_True;
1212
1213 return _bModified ? RET_OK : RET_CANCEL;
1214 }
1215
1216 // -----------------------------------------------------------------------
1217
FocusOnIcon(sal_uInt16 nId)1218 void IconChoiceDialog::FocusOnIcon( sal_uInt16 nId )
1219 {
1220 // set focus to icon for the current visible page
1221 for ( sal_uInt16 i=0; i<maIconCtrl.GetEntryCount(); i++)
1222 {
1223 SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.GetEntry ( i );
1224 sal_uInt16* pUserData = (sal_uInt16*) pEntry->GetUserData();
1225
1226 if ( pUserData && *pUserData == nId )
1227 {
1228 maIconCtrl.SetCursor( pEntry );
1229 break;
1230 }
1231 }
1232 }
1233