Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <sfx2/app.hxx>
21 : #include <tools/rc.h>
22 :
23 : #include <dialmgr.hxx>
24 :
25 : #include "iconcdlg.hxx"
26 :
27 : #include "helpid.hrc"
28 : #include <cuires.hrc>
29 : #include <unotools/viewoptions.hxx>
30 : #include <svtools/apearcfg.hxx>
31 : #include <vcl/mnemonic.hxx>
32 : #include <vcl/i18nhelp.hxx>
33 : #include <vcl/settings.hxx>
34 :
35 : using ::std::vector;
36 :
37 : /**********************************************************************
38 : |
39 : | Ctor / Dtor
40 : |
41 : \**********************************************************************/
42 :
43 0 : IconChoicePage::IconChoicePage( vcl::Window *pParent, const OString& rID,
44 : const OUString& rUIXMLDescription,
45 : const SfxItemSet &rAttrSet )
46 : : TabPage ( pParent, rID, rUIXMLDescription ),
47 : pSet ( &rAttrSet ),
48 : bHasExchangeSupport ( false ),
49 0 : pDialog ( NULL )
50 : {
51 0 : SetStyle ( GetStyle() | WB_DIALOGCONTROL | WB_HIDE );
52 0 : }
53 :
54 :
55 :
56 0 : IconChoicePage::~IconChoicePage()
57 : {
58 0 : }
59 :
60 : /**********************************************************************
61 : |
62 : | Activate / Deaktivate
63 : |
64 : \**********************************************************************/
65 :
66 0 : void IconChoicePage::ActivatePage( const SfxItemSet& )
67 : {
68 0 : }
69 :
70 :
71 :
72 0 : int IconChoicePage::DeactivatePage( SfxItemSet* )
73 : {
74 0 : return LEAVE_PAGE;
75 : }
76 :
77 : /**********************************************************************
78 : |
79 : | ...
80 : |
81 : \**********************************************************************/
82 :
83 0 : void IconChoicePage::FillUserData()
84 : {
85 0 : }
86 :
87 :
88 :
89 0 : bool IconChoicePage::IsReadOnly() const
90 : {
91 0 : return false;
92 : }
93 :
94 :
95 :
96 0 : bool IconChoicePage::QueryClose()
97 : {
98 0 : return true;
99 : }
100 :
101 : /**********************************************************************
102 : |
103 : | window-methods
104 : |
105 : \**********************************************************************/
106 :
107 0 : void IconChoicePage::ImplInitSettings()
108 : {
109 0 : vcl::Window* pParent = GetParent();
110 0 : if ( pParent->IsChildTransparentModeEnabled() && !IsControlBackground() )
111 : {
112 0 : EnableChildTransparentMode( true );
113 0 : SetParentClipMode( PARENTCLIPMODE_NOCLIP );
114 0 : SetPaintTransparent( true );
115 0 : SetBackground();
116 : }
117 : else
118 : {
119 0 : EnableChildTransparentMode( false );
120 0 : SetParentClipMode( 0 );
121 0 : SetPaintTransparent( false );
122 :
123 0 : if ( IsControlBackground() )
124 0 : SetBackground( GetControlBackground() );
125 : else
126 0 : SetBackground( pParent->GetBackground() );
127 : }
128 0 : }
129 :
130 :
131 :
132 0 : void IconChoicePage::StateChanged( StateChangedType nType )
133 : {
134 0 : Window::StateChanged( nType );
135 :
136 0 : if ( nType == StateChangedType::CONTROLBACKGROUND )
137 : {
138 0 : ImplInitSettings();
139 0 : Invalidate();
140 : }
141 0 : }
142 :
143 :
144 :
145 0 : void IconChoicePage::DataChanged( const DataChangedEvent& rDCEvt )
146 : {
147 0 : Window::DataChanged( rDCEvt );
148 :
149 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
150 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
151 : {
152 0 : ImplInitSettings();
153 0 : Invalidate();
154 : }
155 0 : }
156 :
157 :
158 :
159 : // Class IconChoiceDialog
160 :
161 :
162 :
163 : /**********************************************************************
164 : |
165 : | Ctor / Dtor
166 : |
167 : \**********************************************************************/
168 :
169 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSvtIconChoiceCtrl(vcl::Window *pParent, VclBuilder::stringmap &)
170 : {
171 : return new SvtIconChoiceCtrl(pParent, WB_3DLOOK | WB_ICON | WB_BORDER |
172 : WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME |
173 0 : WB_NODRAGSELECTION | WB_TABSTOP);
174 : }
175 :
176 0 : IconChoiceDialog::IconChoiceDialog ( vcl::Window* pParent, const OString& rID,
177 : const OUString& rUIXMLDescription,
178 : const SfxItemSet *pItemSet )
179 : : ModalDialog ( pParent, rID, rUIXMLDescription ),
180 : mnCurrentPageId ( USHRT_MAX ),
181 :
182 : pSet ( pItemSet ),
183 : pOutSet ( NULL ),
184 : pExampleSet ( NULL ),
185 : pRanges ( NULL ),
186 :
187 : bHideResetBtn ( false ),
188 : bModal ( false ),
189 : bInOK ( false ),
190 0 : bItemsReset ( false )
191 : {
192 0 : get(m_pOKBtn, "ok");
193 0 : get(m_pApplyBtn, "apply");
194 0 : get(m_pCancelBtn, "cancel");
195 0 : get(m_pHelpBtn, "help");
196 0 : get(m_pResetBtn, "reset");
197 0 : get(m_pIconCtrl, "icon_control");
198 0 : get(m_pTabContainer, "tab");
199 :
200 0 : SetCtrlStyle();
201 0 : m_pIconCtrl->SetClickHdl ( LINK ( this, IconChoiceDialog , ChosePageHdl_Impl ) );
202 0 : m_pIconCtrl->Show();
203 0 : m_pIconCtrl->SetChoiceWithCursor ( true );
204 0 : m_pIconCtrl->SetSelectionMode( SINGLE_SELECTION );
205 0 : m_pIconCtrl->SetHelpId( HID_ICCDIALOG_CHOICECTRL );
206 :
207 : // ItemSet
208 0 : if ( pSet )
209 : {
210 0 : pExampleSet = new SfxItemSet( *pSet );
211 0 : pOutSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
212 : }
213 :
214 : // Buttons
215 0 : m_pOKBtn->SetClickHdl ( LINK( this, IconChoiceDialog, OkHdl ) );
216 0 : m_pOKBtn->SetHelpId( HID_ICCDIALOG_OK_BTN );
217 0 : m_pApplyBtn->SetClickHdl ( LINK( this, IconChoiceDialog, ApplyHdl ) );
218 : //m_pApplyBtn->SetHelpId( HID_ICCDIALOG_APPLY_BTN );
219 0 : m_pCancelBtn->SetHelpId( HID_ICCDIALOG_CANCEL_BTN );
220 0 : m_pResetBtn->SetClickHdl( LINK( this, IconChoiceDialog, ResetHdl ) );
221 0 : m_pResetBtn->SetHelpId( HID_ICCDIALOG_RESET_BTN );
222 0 : m_pOKBtn->Show();
223 0 : m_pApplyBtn->Show();
224 0 : m_pCancelBtn->Show();
225 0 : m_pHelpBtn->Show();
226 0 : m_pResetBtn->Show();
227 0 : }
228 :
229 0 : IconChoiceDialog ::~IconChoiceDialog ()
230 : {
231 : // save configuration at INI-Manager
232 : // and remove pages
233 : //SvtViewOptions aTabDlgOpt( E_TABDIALOG, rId );
234 : //aTabDlgOpt.SetWindowState(OStringToOUString(GetWindowState((WINDOWSTATE_MASK_X | WINDOWSTATE_MASK_Y | WINDOWSTATE_MASK_STATE | WINDOWSTATE_MASK_MINIMIZED)), RTL_TEXTENCODING_ASCII_US));
235 : //aTabDlgOpt.SetPageID( mnCurrentPageId );
236 :
237 0 : for ( size_t i = 0, nCount = maPageList.size(); i < nCount; ++i )
238 : {
239 0 : IconChoicePageData* pData = maPageList[ i ];
240 :
241 0 : if ( pData->pPage )
242 : {
243 0 : pData->pPage->FillUserData();
244 0 : OUString aPageData(pData->pPage->GetUserData());
245 0 : if ( !aPageData.isEmpty() )
246 : {
247 : //SvtViewOptions aTabPageOpt( E_TABPAGE, OUString::number(pData->nId) );
248 :
249 : //SetViewOptUserItem( aTabPageOpt, aPageData );
250 : }
251 :
252 0 : if ( pData->bOnDemand )
253 0 : delete (SfxItemSet*)&pData->pPage->GetItemSet();
254 0 : delete pData->pPage;
255 : }
256 0 : delete pData;
257 : }
258 :
259 : // remove Userdata from Icons
260 0 : for ( sal_uLong i=0; i < m_pIconCtrl->GetEntryCount(); i++)
261 : {
262 0 : SvxIconChoiceCtrlEntry* pEntry = m_pIconCtrl->GetEntry ( i );
263 0 : sal_uInt16* pUserData = (sal_uInt16*) pEntry->GetUserData();
264 0 : delete pUserData;
265 : }
266 :
267 :
268 0 : delete pRanges;
269 0 : delete pOutSet;
270 0 : }
271 :
272 : /**********************************************************************
273 : |
274 : | add new page
275 : |
276 : \**********************************************************************/
277 :
278 0 : SvxIconChoiceCtrlEntry* IconChoiceDialog::AddTabPage(
279 : sal_uInt16 nId,
280 : const OUString& rIconText,
281 : const Image& rChoiceIcon,
282 : CreatePage pCreateFunc /* != 0 */,
283 : GetPageRanges pRangesFunc /* darf 0 sein */,
284 : bool bItemsOnDemand,
285 : sal_uLong /*nPos*/
286 : )
287 : {
288 : IconChoicePageData* pData = new IconChoicePageData ( nId, pCreateFunc,
289 : pRangesFunc,
290 0 : bItemsOnDemand );
291 0 : maPageList.push_back( pData );
292 :
293 0 : pData->fnGetRanges = pRangesFunc;
294 0 : pData->bOnDemand = bItemsOnDemand;
295 :
296 0 : sal_uInt16 *pId = new sal_uInt16 ( nId );
297 0 : SvxIconChoiceCtrlEntry* pEntry = m_pIconCtrl->InsertEntry( rIconText, rChoiceIcon );
298 0 : pEntry->SetUserData ( (void*) pId );
299 0 : return pEntry;
300 : }
301 :
302 0 : void IconChoiceDialog::SetCtrlStyle()
303 : {
304 0 : WinBits aWinBits = WB_3DLOOK | WB_ICON | WB_BORDER | WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME | WB_NODRAGSELECTION | WB_TABSTOP | WB_CLIPCHILDREN | WB_ALIGN_LEFT | WB_NOHSCROLL;
305 0 : m_pIconCtrl->SetStyle(aWinBits);
306 0 : m_pIconCtrl->ArrangeIcons();
307 0 : }
308 :
309 : /**********************************************************************
310 : |
311 : | Show / Hide page or button
312 : |
313 : \**********************************************************************/
314 :
315 0 : void IconChoiceDialog::ShowPageImpl ( IconChoicePageData* pData )
316 : {
317 0 : if ( pData->pPage )
318 0 : pData->pPage->Show();
319 0 : }
320 :
321 :
322 :
323 0 : void IconChoiceDialog::HidePageImpl ( IconChoicePageData* pData )
324 : {
325 0 : if ( pData->pPage )
326 0 : pData->pPage->Hide();
327 0 : }
328 :
329 0 : void IconChoiceDialog::ShowPage(sal_uInt16 nId)
330 : {
331 0 : sal_uInt16 nOldPageId = GetCurPageId();
332 0 : bool bInvalidate = nOldPageId != nId;
333 0 : SetCurPageId(nId);
334 0 : ActivatePageImpl();
335 0 : if (bInvalidate)
336 : {
337 0 : IconChoicePageData* pOldData = GetPageData(nOldPageId);
338 0 : if (pOldData && pOldData->pPage)
339 : {
340 0 : DeActivatePageImpl();
341 0 : HidePageImpl(pOldData);
342 : }
343 :
344 0 : Invalidate();
345 : }
346 0 : IconChoicePageData* pNewData = GetPageData(nId);
347 0 : if (pNewData && pNewData->pPage)
348 0 : ShowPageImpl(pNewData);
349 0 : }
350 :
351 : /**********************************************************************
352 : |
353 : | select a page
354 : |
355 : \**********************************************************************/
356 0 : IMPL_LINK_NOARG(IconChoiceDialog , ChosePageHdl_Impl)
357 : {
358 : sal_uLong nPos;
359 :
360 0 : SvxIconChoiceCtrlEntry *pEntry = m_pIconCtrl->GetSelectedEntry ( nPos );
361 0 : if ( !pEntry )
362 0 : pEntry = m_pIconCtrl->GetCursor( );
363 :
364 0 : sal_uInt16 *pId = (sal_uInt16*)pEntry->GetUserData ();
365 :
366 0 : if( *pId != mnCurrentPageId )
367 : {
368 0 : ShowPage(*pId);
369 : }
370 :
371 0 : return 0L;
372 : }
373 :
374 : /**********************************************************************
375 : |
376 : | Button-handler
377 : |
378 : \**********************************************************************/
379 :
380 0 : IMPL_LINK_NOARG(IconChoiceDialog, OkHdl)
381 : {
382 0 : bInOK = true;
383 :
384 0 : if ( OK_Impl() )
385 : {
386 0 : if ( bModal )
387 0 : EndDialog( Ok() );
388 : else
389 : {
390 0 : Ok();
391 0 : Close();
392 : }
393 : }
394 0 : return 0;
395 : }
396 :
397 :
398 0 : IMPL_LINK_NOARG(IconChoiceDialog, ApplyHdl)
399 : {
400 0 : bInOK = true;
401 :
402 0 : if ( OK_Impl() )
403 : {
404 0 : if ( bModal )
405 0 : EndDialog( Ok() );
406 : else
407 : {
408 0 : Ok();
409 0 : Close();
410 : }
411 : }
412 0 : return 0;
413 : }
414 :
415 0 : IMPL_LINK_NOARG(IconChoiceDialog, ResetHdl)
416 : {
417 0 : ResetPageImpl ();
418 :
419 0 : IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
420 : DBG_ASSERT( pData, "Id nicht bekannt" );
421 :
422 0 : if ( pData->bOnDemand )
423 : {
424 : // CSet on AIS has problems here, therefore separated
425 0 : const SfxItemSet* _pSet = &( pData->pPage->GetItemSet() );
426 0 : pData->pPage->Reset( *(SfxItemSet*)_pSet );
427 : }
428 : else
429 0 : pData->pPage->Reset( *pSet );
430 :
431 :
432 0 : return 0;
433 : }
434 :
435 :
436 :
437 0 : IMPL_LINK_NOARG(IconChoiceDialog, CancelHdl)
438 : {
439 0 : Close();
440 :
441 0 : return 0;
442 : }
443 :
444 : /**********************************************************************
445 : |
446 : | call page
447 : |
448 : \**********************************************************************/
449 :
450 0 : void IconChoiceDialog::ActivatePageImpl ()
451 : {
452 : DBG_ASSERT( !maPageList.empty(), "keine Pages angemeldet" );
453 0 : IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
454 : DBG_ASSERT( pData, "Id nicht bekannt" );
455 0 : bool bReadOnly = false;
456 0 : if ( pData )
457 : {
458 0 : if ( !pData->pPage )
459 : {
460 0 : const SfxItemSet* pTmpSet = 0;
461 :
462 0 : if ( pSet )
463 : {
464 0 : if ( bItemsReset && pSet->GetParent() )
465 0 : pTmpSet = pSet->GetParent();
466 : else
467 0 : pTmpSet = pSet;
468 : }
469 :
470 0 : if ( pTmpSet && !pData->bOnDemand )
471 0 : pData->pPage = (pData->fnCreatePage)( m_pTabContainer, this, *pTmpSet );
472 : else
473 0 : pData->pPage = (pData->fnCreatePage)( m_pTabContainer, this, *CreateInputItemSet( mnCurrentPageId ) );
474 :
475 0 : if ( pData->bOnDemand )
476 0 : pData->pPage->Reset( (SfxItemSet &)pData->pPage->GetItemSet() );
477 : else
478 0 : pData->pPage->Reset( *pSet );
479 :
480 0 : PageCreated( mnCurrentPageId, *pData->pPage );
481 : }
482 0 : else if ( pData->bRefresh )
483 : {
484 0 : pData->pPage->Reset( *pSet );
485 : }
486 :
487 0 : pData->bRefresh = false;
488 :
489 0 : if ( pExampleSet )
490 0 : pData->pPage->ActivatePage( *pExampleSet );
491 0 : SetHelpId( pData->pPage->GetHelpId() );
492 0 : bReadOnly = pData->pPage->IsReadOnly();
493 : }
494 :
495 :
496 0 : if ( bReadOnly || bHideResetBtn )
497 0 : m_pResetBtn->Hide();
498 : else
499 0 : m_pResetBtn->Show();
500 :
501 0 : }
502 :
503 :
504 :
505 0 : bool IconChoiceDialog::DeActivatePageImpl ()
506 : {
507 0 : IconChoicePageData *pData = GetPageData ( mnCurrentPageId );
508 :
509 0 : int nRet = IconChoicePage::LEAVE_PAGE;
510 :
511 0 : if ( pData )
512 : {
513 0 : IconChoicePage * pPage = pData->pPage;
514 :
515 0 : if ( !pExampleSet && pPage->HasExchangeSupport() && pSet )
516 0 : pExampleSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
517 :
518 0 : if ( pSet )
519 : {
520 0 : SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
521 :
522 0 : if ( pPage->HasExchangeSupport() )
523 0 : nRet = pPage->DeactivatePage( &aTmp );
524 :
525 0 : if ( ( IconChoicePage::LEAVE_PAGE & nRet ) == IconChoicePage::LEAVE_PAGE &&
526 0 : aTmp.Count() )
527 : {
528 0 : pExampleSet->Put( aTmp );
529 0 : pOutSet->Put( aTmp );
530 0 : }
531 : }
532 : else
533 : {
534 0 : if ( pPage->HasExchangeSupport() ) //!!!
535 : {
536 0 : if ( !pExampleSet )
537 : {
538 0 : SfxItemPool* pPool = pPage->GetItemSet().GetPool();
539 : pExampleSet =
540 0 : new SfxItemSet( *pPool, GetInputRanges( *pPool ) );
541 : }
542 0 : nRet = pPage->DeactivatePage( pExampleSet );
543 : }
544 : else
545 0 : nRet = pPage->DeactivatePage( NULL );
546 : }
547 :
548 0 : if ( nRet & IconChoicePage::REFRESH_SET )
549 : {
550 0 : pSet = GetRefreshedSet();
551 : DBG_ASSERT( pSet, "GetRefreshedSet() liefert NULL" );
552 : // flag all pages to be newly initialized
553 0 : for ( size_t i = 0, nCount = maPageList.size(); i < nCount; ++i )
554 : {
555 0 : IconChoicePageData* pObj = maPageList[ i ];
556 0 : if ( pObj->pPage != pPage )
557 0 : pObj->bRefresh = true;
558 : else
559 0 : pObj->bRefresh = false;
560 : }
561 : }
562 : }
563 :
564 0 : if ( nRet & IconChoicePage::LEAVE_PAGE )
565 0 : return true;
566 : else
567 0 : return false;
568 : }
569 :
570 :
571 :
572 0 : void IconChoiceDialog::ResetPageImpl ()
573 : {
574 0 : IconChoicePageData *pData = GetPageData ( mnCurrentPageId );
575 :
576 : DBG_ASSERT( pData, "Id nicht bekannt" );
577 :
578 0 : if ( pData->bOnDemand )
579 : {
580 : // CSet on AIS has problems here, therefore separated
581 0 : const SfxItemSet* _pSet = &pData->pPage->GetItemSet();
582 0 : pData->pPage->Reset( *(SfxItemSet*)_pSet );
583 : }
584 : else
585 0 : pData->pPage->Reset( *pSet );
586 0 : }
587 :
588 : /**********************************************************************
589 : |
590 : | handling itemsets
591 : |
592 : \**********************************************************************/
593 :
594 0 : const sal_uInt16* IconChoiceDialog::GetInputRanges( const SfxItemPool& rPool )
595 : {
596 0 : if ( pSet )
597 : {
598 : SAL_WARN( "cui.dialogs", "Set does already exist!" );
599 0 : return pSet->GetRanges();
600 : }
601 :
602 0 : if ( pRanges )
603 0 : return pRanges;
604 0 : std::vector<sal_uInt16> aUS;
605 :
606 0 : size_t nCount = maPageList.size();
607 0 : for ( size_t i = 0; i < nCount; ++i )
608 : {
609 0 : IconChoicePageData* pData = maPageList[ i ];
610 0 : if ( pData->fnGetRanges )
611 : {
612 0 : const sal_uInt16* pTmpRanges = (pData->fnGetRanges)();
613 0 : const sal_uInt16* pIter = pTmpRanges;
614 :
615 : sal_uInt16 nLen;
616 0 : for( nLen = 0; *pIter; ++nLen, ++pIter )
617 : ;
618 0 : aUS.insert( aUS.end(), pTmpRanges, pTmpRanges + nLen );
619 : }
620 : }
621 :
622 : // remove double Id's
623 : {
624 0 : nCount = aUS.size();
625 0 : for ( size_t i = 0; i < nCount; ++i )
626 0 : aUS[i] = rPool.GetWhich( aUS[i] );
627 : }
628 :
629 0 : if ( aUS.size() > 1 )
630 : {
631 0 : std::sort( aUS.begin(), aUS.end() );
632 : }
633 :
634 0 : pRanges = new sal_uInt16[aUS.size() + 1];
635 0 : std::copy( aUS.begin(), aUS.end(), pRanges );
636 0 : pRanges[aUS.size()] = 0;
637 :
638 0 : return pRanges;
639 : }
640 :
641 :
642 :
643 0 : void IconChoiceDialog::SetInputSet( const SfxItemSet* pInSet )
644 : {
645 0 : bool bSet = ( pSet != NULL );
646 :
647 0 : pSet = pInSet;
648 :
649 0 : if ( !bSet && !pExampleSet && !pOutSet )
650 : {
651 0 : pExampleSet = new SfxItemSet( *pSet );
652 0 : pOutSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
653 : }
654 0 : }
655 :
656 :
657 :
658 0 : void IconChoiceDialog::PageCreated( sal_uInt16 /*nId*/, IconChoicePage& /*rPage*/ )
659 : {
660 : // not interested in
661 0 : }
662 :
663 :
664 :
665 0 : SfxItemSet* IconChoiceDialog::CreateInputItemSet( sal_uInt16 )
666 : {
667 : SAL_INFO( "cui.dialogs", "CreateInputItemSet not implemented" );
668 :
669 0 : return 0;
670 : }
671 :
672 : /**********************************************************************
673 : |
674 : | start dialog
675 : |
676 : \**********************************************************************/
677 :
678 0 : short IconChoiceDialog::Execute()
679 : {
680 0 : if ( maPageList.empty() )
681 0 : return RET_CANCEL;
682 :
683 0 : Start_Impl();
684 :
685 0 : return Dialog::Execute();
686 : }
687 :
688 :
689 :
690 0 : void IconChoiceDialog::Start( bool bShow )
691 : {
692 :
693 0 : m_pCancelBtn->SetClickHdl( LINK( this, IconChoiceDialog, CancelHdl ) );
694 0 : bModal = false;
695 :
696 0 : Start_Impl();
697 :
698 0 : if ( bShow )
699 0 : Window::Show();
700 :
701 0 : }
702 :
703 :
704 :
705 0 : bool IconChoiceDialog::QueryClose()
706 : {
707 0 : bool bRet = true;
708 0 : for ( size_t i = 0, nCount = maPageList.size(); i < nCount; ++i )
709 : {
710 0 : IconChoicePageData* pData = maPageList[i ];
711 0 : if ( pData->pPage && !pData->pPage->QueryClose() )
712 : {
713 0 : bRet = false;
714 0 : break;
715 : }
716 : }
717 0 : return bRet;
718 : }
719 :
720 0 : void IconChoiceDialog::Start_Impl()
721 : {
722 0 : FocusOnIcon( mnCurrentPageId );
723 0 : ActivatePageImpl();
724 0 : }
725 :
726 0 : const SfxItemSet* IconChoiceDialog::GetRefreshedSet()
727 : {
728 : SAL_WARN( "cui.dialogs", "GetRefreshedSet not implemented" );
729 0 : return 0;
730 : }
731 :
732 : /**********************************************************************
733 : |
734 : | tool-methods
735 : |
736 : \**********************************************************************/
737 :
738 0 : IconChoicePageData* IconChoiceDialog::GetPageData ( sal_uInt16 nId )
739 : {
740 0 : IconChoicePageData *pRet = NULL;
741 0 : for ( size_t i=0; i < maPageList.size(); i++ )
742 : {
743 0 : IconChoicePageData* pData = maPageList[ i ];
744 0 : if ( pData->nId == nId )
745 : {
746 0 : pRet = pData;
747 0 : break;
748 : }
749 : }
750 0 : return pRet;
751 : }
752 :
753 : /**********************************************************************
754 : |
755 : | OK-Status
756 : |
757 : \**********************************************************************/
758 :
759 0 : bool IconChoiceDialog::OK_Impl()
760 : {
761 0 : IconChoicePage* pPage = GetPageData ( mnCurrentPageId )->pPage;
762 :
763 0 : bool bEnd = !pPage;
764 0 : if ( pPage )
765 : {
766 0 : int nRet = IconChoicePage::LEAVE_PAGE;
767 0 : if ( pSet )
768 : {
769 0 : SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
770 :
771 0 : if ( pPage->HasExchangeSupport() )
772 0 : nRet = pPage->DeactivatePage( &aTmp );
773 :
774 0 : if ( ( IconChoicePage::LEAVE_PAGE & nRet ) == IconChoicePage::LEAVE_PAGE
775 0 : && aTmp.Count() )
776 : {
777 0 : pExampleSet->Put( aTmp );
778 0 : pOutSet->Put( aTmp );
779 0 : }
780 : }
781 : else
782 0 : nRet = pPage->DeactivatePage( NULL );
783 0 : bEnd = nRet;
784 : }
785 :
786 0 : return bEnd;
787 : }
788 :
789 :
790 :
791 0 : short IconChoiceDialog::Ok()
792 : {
793 0 : bInOK = true;
794 :
795 0 : if ( !pOutSet )
796 : {
797 0 : if ( !pExampleSet && pSet )
798 0 : pOutSet = pSet->Clone( false ); // without items
799 0 : else if ( pExampleSet )
800 0 : pOutSet = new SfxItemSet( *pExampleSet );
801 : }
802 0 : bool _bModified = false;
803 :
804 0 : for ( size_t i = 0, nCount = maPageList.size(); i < nCount; ++i )
805 : {
806 0 : IconChoicePageData* pData = GetPageData ( i );
807 :
808 0 : IconChoicePage* pPage = pData->pPage;
809 :
810 0 : if ( pPage )
811 : {
812 0 : if ( pData->bOnDemand )
813 : {
814 0 : SfxItemSet& rSet = (SfxItemSet&)pPage->GetItemSet();
815 0 : rSet.ClearItem();
816 0 : _bModified |= pPage->FillItemSet( &rSet );
817 : }
818 0 : else if ( pSet && !pPage->HasExchangeSupport() )
819 : {
820 0 : SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
821 :
822 0 : if ( pPage->FillItemSet( &aTmp ) )
823 : {
824 0 : _bModified |= true;
825 0 : pExampleSet->Put( aTmp );
826 0 : pOutSet->Put( aTmp );
827 0 : }
828 : }
829 : }
830 : }
831 :
832 0 : if ( _bModified || ( pOutSet && pOutSet->Count() > 0 ) )
833 0 : _bModified |= true;
834 :
835 0 : return _bModified ? RET_OK : RET_CANCEL;
836 : }
837 :
838 :
839 :
840 0 : void IconChoiceDialog::FocusOnIcon( sal_uInt16 nId )
841 : {
842 : // set focus to icon for the current visible page
843 0 : for ( sal_uInt16 i=0; i<m_pIconCtrl->GetEntryCount(); i++)
844 : {
845 0 : SvxIconChoiceCtrlEntry* pEntry = m_pIconCtrl->GetEntry ( i );
846 0 : sal_uInt16* pUserData = (sal_uInt16*) pEntry->GetUserData();
847 :
848 0 : if ( pUserData && *pUserData == nId )
849 : {
850 0 : m_pIconCtrl->SetCursor( pEntry );
851 0 : break;
852 : }
853 : }
854 0 : }
855 :
856 :
857 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|