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