merge the formfield patch from ooo-build
[ooovba.git] / sfx2 / source / dialog / mgetempl.cxx
blob24d08ee3e4c66a74425ef5a97150d7e57e2f2da8
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: mgetempl.cxx,v $
10 * $Revision: 1.15 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sfx2.hxx"
34 // include ---------------------------------------------------------------
36 #ifndef _MSGBOX_HXX //autogen
37 #include <vcl/msgbox.hxx>
38 #endif
39 #include <vcl/field.hxx>
40 #include <svtools/eitem.hxx>
41 #include <svtools/intitem.hxx>
42 #include <svtools/style.hxx>
43 #ifndef GCC
44 #endif
46 #include <sfx2/styfitem.hxx>
47 #include <sfx2/styledlg.hxx>
48 #include <sfx2/app.hxx>
49 #include <sfx2/mgetempl.hxx>
50 #include <sfx2/objsh.hxx>
51 #include "sfxtypes.hxx"
52 #include "sfxresid.hxx"
53 #include <sfx2/module.hxx>
55 #include <sfx2/sfx.hrc>
56 #include "dialog.hrc"
57 #include "mgetempl.hrc"
59 #ifndef _SFX_STYLE_HRC
60 #include <svtools/style.hrc>
61 #endif
63 // SfxManageStyleSheetPage -----------------------------------------------
65 SfxManageStyleSheetPage::SfxManageStyleSheetPage( Window* pParent, const SfxItemSet& rAttrSet ) :
67 SfxTabPage( pParent, SfxResId( TP_MANAGE_STYLES ), rAttrSet ),
69 aNameFt ( this, SfxResId( FT_NAME ) ),
70 aNameEd ( this, SfxResId( ED_NAME ) ),
71 aAutoCB ( this, SfxResId( CB_AUTO ) ),
73 aFollowFt ( this, SfxResId( FT_NEXT ) ),
74 aFollowLb ( this, SfxResId( LB_NEXT ) ),
76 aBaseFt ( this, SfxResId( FT_BASE ) ),
77 aBaseLb ( this, SfxResId( LB_BASE ) ),
79 aFilterFt ( this, SfxResId( FT_REGION ) ),
80 aFilterLb ( this, SfxResId( LB_REGION ) ),
82 aDescFt ( this, SfxResId( FT_DESC ) ),
83 aDescED ( this, SfxResId( ED_DESC ) ),
84 aDescGb ( this, SfxResId( GB_DESC ) ),
86 pStyle( &( (SfxStyleDialog*)pParent->GetParent() )->GetStyleSheet() ),
88 pItem ( 0 ),
89 bModified ( FALSE ),
90 aName ( pStyle->GetName() ),
91 aFollow ( pStyle->GetFollow() ),
92 aParent ( pStyle->GetParent() ),
93 nFlags ( pStyle->GetMask() )
95 /* [Beschreibung]
97 Konstruktor; initialisiert die ListBoxen mit den Vorlagen
102 FreeResource();
104 if ( IsBackground() )
105 aDescED.SetBackground( GetBackground() );
106 FixedInfo* pInfo = new FixedInfo( this );
107 aDescED.SetFont( pInfo->GetFont() );
108 delete pInfo;
110 aDescED.Hide();
111 aDescFt.Show();
113 // diese Page braucht ExchangeSupport
114 SetExchangeSupport();
116 ResMgr* pResMgr = SFX_APP()->GetModule_Impl()->GetResMgr();
117 DBG_ASSERT( pResMgr, "kein ResMgr am Modul" );
118 pFamilies = new SfxStyleFamilies( ResId( DLG_STYLE_DESIGNER, *pResMgr ) );
120 SfxStyleSheetBasePool* pPool = 0;
121 SfxObjectShell* pDocShell = SfxObjectShell::Current();
123 if ( pDocShell )
124 pPool = pDocShell->GetStyleSheetPool();
125 DBG_ASSERT( pPool, "kein Pool oder keine DocShell" );
127 if ( pPool )
129 pPool->SetSearchMask( pStyle->GetFamily() );
130 pPool->First(); // fuer SW - interne Liste updaten
133 if ( !pStyle->GetName().Len() && pPool )
135 // NullString als Name -> Name generieren
136 String aNoName( SfxResId( STR_NONAME ) );
137 USHORT nNo = 1;
138 String aNo( aNoName );
139 aNoName += String::CreateFromInt32( nNo );
140 while ( pPool->Find( aNoName ) )
142 ++nNo;
143 aNoName = aNo;
144 aNoName += String::CreateFromInt32( nNo );
146 pStyle->SetName( aNoName );
147 aName = aNoName;
148 aFollow = pStyle->GetFollow();
149 aParent = pStyle->GetParent();
151 aNameEd.SetText(pStyle->GetName());
153 if ( !pStyle->IsUserDefined() )
154 aNameEd.SetReadOnly();
156 if ( pStyle->HasFollowSupport() && pPool )
158 SfxStyleSheetBase* pPoolStyle = pPool->First();
160 while ( pPoolStyle )
162 aFollowLb.InsertEntry( pPoolStyle->GetName() );
163 pPoolStyle = pPool->Next();
166 // eine neue Vorlage ist noch nicht im Pool
167 if ( LISTBOX_ENTRY_NOTFOUND == aFollowLb.GetEntryPos( pStyle->GetName() ) )
168 aFollowLb.InsertEntry( pStyle->GetName() );
170 else
172 aFollowFt.Hide();
173 aFollowLb.Hide();
175 aFilterFt.SetPosPixel( aBaseFt.GetPosPixel() );
176 aFilterLb.SetPosPixel( aBaseLb.GetPosPixel() );
178 aBaseFt.SetPosPixel( aFollowFt.GetPosPixel() );
179 aBaseLb.SetPosPixel( aFollowLb.GetPosPixel() );
182 if ( pStyle->HasParentSupport() && pPool )
184 if ( pStyle->HasClearParentSupport() )
185 // die Basisvorlage darf auf NULL gesetzt werden
186 aBaseLb.InsertEntry( String( SfxResId( STR_NONE ) ) );
188 SfxStyleSheetBase* pPoolStyle = pPool->First();
190 while ( pPoolStyle )
192 const String aStr( pPoolStyle->GetName() );
193 // eigener Namen nicht als Basisvorlage
194 if ( aStr != aName )
195 aBaseLb.InsertEntry( aStr );
196 pPoolStyle = pPool->Next();
199 else
201 aBaseFt.Disable();
202 aBaseLb.Disable();
204 USHORT nCount = pFamilies->Count();
206 USHORT i;
207 for ( i = 0; i < nCount; ++i )
209 pItem = pFamilies->GetObject(i);
211 if ( pItem->GetFamily() == pStyle->GetFamily() )
212 break;
215 USHORT nStyleFilterIdx = 0xffff;
217 if ( i < nCount )
219 // Filterflags
220 const SfxStyleFilter& rList = pItem->GetFilterList();
221 nCount = (USHORT)rList.Count();
222 USHORT nIdx = 0;
223 USHORT nMask = pStyle->GetMask() & ~SFXSTYLEBIT_USERDEF;
225 if ( !nMask ) // Benutzervorlage?
226 nMask = pStyle->GetMask();
228 for ( i = 0; i < nCount; ++i )
230 SfxFilterTupel* pTupel = rList.GetObject(i);
232 if ( pTupel->nFlags != SFXSTYLEBIT_AUTO &&
233 pTupel->nFlags != SFXSTYLEBIT_USED &&
234 // pTupel->nFlags != SFXSTYLEBIT_USERDEF &&
235 pTupel->nFlags != SFXSTYLEBIT_ALL )
237 aFilterLb.InsertEntry( pTupel->aName, nIdx );
238 aFilterLb.SetEntryData(nIdx, (void*)(long)i);
240 if ( ( pTupel->nFlags & nMask ) == nMask )
241 nStyleFilterIdx = nIdx;
242 ++nIdx;
246 if ( nStyleFilterIdx != 0xFFFF )
247 aFilterLb.SelectEntryPos( nStyleFilterIdx );
250 if ( !aFilterLb.GetEntryCount() || !pStyle->IsUserDefined() )
252 pItem = 0;
253 aFilterFt.Disable();
254 aFilterLb.Disable();
256 else
257 aFilterLb.SaveValue();
258 SetDescriptionText_Impl();
260 if ( aFollowLb.IsEnabled() || aBaseLb.IsEnabled() )
262 aNameEd.SetGetFocusHdl(
263 LINK( this, SfxManageStyleSheetPage, GetFocusHdl ) );
264 aNameEd.SetLoseFocusHdl(
265 LINK( this, SfxManageStyleSheetPage, LoseFocusHdl ) );
267 // ist es ein Style mit automatischem Update? (nur SW)
268 if(SFX_ITEM_SET == rAttrSet.GetItemState(SID_ATTR_AUTO_STYLE_UPDATE))
270 Size aSize = aNameEd.GetSizePixel();
271 aSize.Width() /= 2;
272 aNameEd.SetSizePixel(aSize);
273 aAutoCB.Show();
277 //-------------------------------------------------------------------------
279 SfxManageStyleSheetPage::~SfxManageStyleSheetPage()
281 /* [Beschreibung]
283 Destruktor; Freigabe der Daten
288 aNameEd.SetGetFocusHdl( Link() );
289 aNameEd.SetLoseFocusHdl( Link() );
290 delete pFamilies;
291 pItem = 0;
292 pStyle = 0;
296 //-------------------------------------------------------------------------
298 void SfxManageStyleSheetPage::UpdateName_Impl( ListBox* pBox,
299 const String& rNew )
301 /* [Beschreibung]
303 Nach der "Anderung eines Vorlagennamens die ListBox pBox
304 aktualisieren
306 [Parameter]
308 ListBox* pBox ListBox, deren Eintr"age aktualisiert
309 werden sollen
310 const String& rNew der neue Name
315 if ( pBox->IsEnabled() )
317 // ist der aktuelle Eintrag, dessen Namen modifizieren wurde
318 const BOOL bSelect = pBox->GetSelectEntry() == aBuf;
319 pBox->RemoveEntry( aBuf );
320 pBox->InsertEntry( rNew );
322 if ( bSelect )
323 pBox->SelectEntry( rNew );
327 //-------------------------------------------------------------------------
329 void SfxManageStyleSheetPage::SetDescriptionText_Impl()
331 /* [Beschreibung]
333 Attributbeschreibung setzen. daf"ur die eingestellte Metrik besorgen.
337 SfxMapUnit eUnit = SFX_MAPUNIT_CM;
338 // FieldUnit eFieldUnit = pSfxApp->GetOptions().GetMetric();
339 FieldUnit eFieldUnit( FUNIT_CM );
340 SfxModule* pModule = SfxModule::GetActiveModule();
341 if ( pModule )
343 const SfxPoolItem* pPoolItem = pModule->GetItem( SID_ATTR_METRIC );
344 if ( pPoolItem )
345 eFieldUnit = (FieldUnit)( (SfxUInt16Item*)pPoolItem )->GetValue();
348 switch ( eFieldUnit )
350 case FUNIT_MM: eUnit = SFX_MAPUNIT_MM; break;
352 case FUNIT_CM:
353 case FUNIT_M:
354 case FUNIT_KM: eUnit = SFX_MAPUNIT_CM; break;
356 case FUNIT_POINT:
357 case FUNIT_PICA: eUnit = SFX_MAPUNIT_POINT; break;
359 case FUNIT_INCH:
360 case FUNIT_FOOT:
361 case FUNIT_MILE: eUnit = SFX_MAPUNIT_INCH; break;
363 default:
364 DBG_ERRORFILE( "not supported fieldunit" );
366 aDescFt.SetText( pStyle->GetDescription( eUnit ) );
369 //-------------------------------------------------------------------------
371 IMPL_LINK_INLINE_START( SfxManageStyleSheetPage, GetFocusHdl, Edit *, pEdit )
373 /* [Beschreibung]
375 StarView Handler; GetFocus-Handler des Edits mit dem Vorlagennamen.
380 aBuf = pEdit->GetText().EraseLeadingChars();
381 return 0;
383 IMPL_LINK_INLINE_END( SfxManageStyleSheetPage, GetFocusHdl, Edit *, pEdit )
385 //-------------------------------------------------------------------------
387 IMPL_LINK_INLINE_START( SfxManageStyleSheetPage, LoseFocusHdl, Edit *, pEdit )
389 /* [Beschreibung]
391 StarView Handler; LoseFocus-Handler des Edits mit dem Vorlagennamen.
392 Dieser aktualisiert ggf. die Listbox mit den Folgevorlagen.
393 In der Listbox mit den Basisvorlagen ist die aktuelle Vorlage
394 selbst nicht enthalten.
399 const String aStr( pEdit->GetText().EraseLeadingChars() );
400 pEdit->SetText( aStr );
401 // ggf. Listbox der Basisvorlagen aktualisieren
402 if ( aStr != aBuf )
403 UpdateName_Impl( &aFollowLb, aStr );
404 return 0;
406 IMPL_LINK_INLINE_END( SfxManageStyleSheetPage, LoseFocusHdl, Edit *, pEdit )
408 //-------------------------------------------------------------------------
410 BOOL SfxManageStyleSheetPage::FillItemSet( SfxItemSet& rSet )
412 /* [Beschreibung]
415 Handler f"ur das Setzen der (modifizierten) Daten. Wird aus
416 dem Ok des SfxTabDialog gerufen.
418 [Parameter]
420 SfxItemSet &rAttrSet das Set, das die Daten entgegennimmt.
423 [R"uckgabewert]
425 BOOL TRUE: es hat eine "Anderung der Daten
426 stattgefunden
427 FALSE: es hat keine "Anderung der Daten
428 stattgefunden
430 [Querverweise]
432 <class SfxTabDialog>
437 const USHORT nFilterIdx = aFilterLb.GetSelectEntryPos();
439 // Filter setzen
441 if ( LISTBOX_ENTRY_NOTFOUND != nFilterIdx &&
442 nFilterIdx != aFilterLb.GetSavedValue() &&
443 aFilterLb.IsEnabled() )
445 bModified = TRUE;
446 DBG_ASSERT( pItem, "kein Item" );
447 // geht nur bei Benutzervorlagen
448 #if OSL_DEBUG_LEVEL > 1
449 USHORT nIdx = (USHORT)(long)aFilterLb.GetEntryData( nFilterIdx );
450 SfxFilterTupel* p;
451 p = pItem->GetFilterList().GetObject( nIdx );
452 #endif
453 USHORT nMask = pItem->GetFilterList().GetObject(
454 (USHORT)(long)aFilterLb.GetEntryData( nFilterIdx ) )->nFlags |
455 SFXSTYLEBIT_USERDEF;
456 pStyle->SetMask( nMask );
458 if(aAutoCB.IsVisible() &&
459 aAutoCB.IsChecked() != aAutoCB.GetSavedValue())
461 rSet.Put(SfxBoolItem(SID_ATTR_AUTO_STYLE_UPDATE, aAutoCB.IsChecked()));
464 return bModified;
467 //-------------------------------------------------------------------------
469 void SfxManageStyleSheetPage::Reset( const SfxItemSet& /*rAttrSet*/ )
471 /* [Beschreibung]
474 Handler f"ur das Initialisieren der Seite mit den initialen Daten.
476 [Parameter]
478 const SfxItemSet &rAttrSet das Set mit den Daten
481 [Querverweise]
483 <class SfxTabDialog>
488 bModified = FALSE;
489 String sCmp( pStyle->GetName() );
491 if ( sCmp != aName )
492 pStyle->SetName( aName );
493 aNameEd.SetText( aName );
495 if ( aFollowLb.IsEnabled() )
497 sCmp = pStyle->GetFollow();
499 if ( sCmp != aFollow )
500 pStyle->SetFollow( aFollow );
502 if ( !aFollow.Len() )
503 aFollowLb.SelectEntry( aName );
504 else
505 aFollowLb.SelectEntry( aFollow );
508 if ( aBaseLb.IsEnabled() )
510 sCmp = pStyle->GetParent();
512 if ( sCmp != aParent )
513 pStyle->SetParent( aParent );
515 if ( !aParent.Len() )
516 aBaseLb.SelectEntry( String( SfxResId( STR_NONE ) ) );
517 else
518 aBaseLb.SelectEntry( aParent );
520 if ( String( SfxResId( STR_STANDARD ) ) == aName )
522 // die Standardvorlage kann nicht verkn"upft werden
523 aBaseFt.Disable();
524 aBaseLb.Disable();
528 if ( aFilterLb.IsEnabled() )
530 USHORT nCmp = pStyle->GetMask();
532 if ( nCmp != nFlags )
533 pStyle->SetMask( nFlags );
534 aFilterLb.SelectEntryPos( aFilterLb.GetSavedValue() );
538 //-------------------------------------------------------------------------
540 SfxTabPage* SfxManageStyleSheetPage::Create( Window* pParent,
541 const SfxItemSet &rAttrSet )
543 /* [Beschreibung]
546 Factory f"ur das Erzeugen der Seite
548 [Querverweise]
550 <class SfxTabDialog>
555 return new SfxManageStyleSheetPage( pParent, rAttrSet );
558 //-------------------------------------------------------------------------
560 void SfxManageStyleSheetPage::ActivatePage( const SfxItemSet& rSet)
562 /* [Beschreibung]
564 ActivatePage- Handler des SfxTabDialog; wird f"ur die Aktualisierung
565 des beschreibenden Textes verwendet, da sich dieser durch "Anderungen
566 der Daten anderer Seiten ge"andert haben kann.
568 [Parameter]
570 const SfxItemSet& das Set f"ur den Datenaustausch; wird
571 hier nicht verwendet.
573 [Querverweise]
575 <SfxTabDialog::ActivatePage(const SfxItemSet &)>
580 SetDescriptionText_Impl();
582 // ist es ein Style mit automatischem Update? (nur SW)
583 const SfxPoolItem* pPoolItem;
585 if ( SFX_ITEM_SET ==
586 rSet.GetItemState( SID_ATTR_AUTO_STYLE_UPDATE, FALSE, &pPoolItem ) )
587 aAutoCB.Check( ( (const SfxBoolItem*)pPoolItem )->GetValue() );
588 aAutoCB.SaveValue();
591 //-------------------------------------------------------------------------
593 int SfxManageStyleSheetPage::DeactivatePage( SfxItemSet* pItemSet )
595 /* [Beschreibung]
597 DeactivatePage- Handler des SfxTabDialog; die Daten werden
598 an der Vorlage eingestellt, damit die richtige Vererbung
599 f"ur die anderen Seiten des Dialoges vorliegt.
600 Im Fehlerfall wird das Verlassen der Seite unterbunden.
602 [Parameter]
604 SfxItemSet* das Set f"ur den Datenaustausch; wird hier nicht verwendet.
606 [Querverweise]
608 <SfxTabDialog::DeactivatePage(SfxItemSet*)>
613 int nRet = SfxTabPage::LEAVE_PAGE;
615 if ( aNameEd.IsModified() )
617 // bei <Enter> wird kein LoseFocus() durch StarView ausgel"ost
618 if ( aNameEd.HasFocus() )
619 LoseFocusHdl( &aNameEd );
621 if ( !pStyle->SetName( aNameEd.GetText().EraseLeadingChars() ) )
623 InfoBox aBox( this, SfxResId( MSG_TABPAGE_INVALIDNAME ) );
624 aBox.Execute();
625 aNameEd.GrabFocus();
626 aNameEd.SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) );
627 return SfxTabPage::KEEP_PAGE;
629 bModified = TRUE;
632 if ( pStyle->HasFollowSupport() && aFollowLb.IsEnabled() )
634 const String aFollowEntry( aFollowLb.GetSelectEntry() );
636 if ( pStyle->GetFollow() != aFollowEntry )
638 if ( !pStyle->SetFollow( aFollowEntry ) )
640 InfoBox aBox( this, SfxResId( MSG_TABPAGE_INVALIDSTYLE ) );
641 aBox.Execute();
642 aFollowLb.GrabFocus();
643 return SfxTabPage::KEEP_PAGE;
645 bModified = TRUE;
649 if ( aBaseLb.IsEnabled() )
651 String aParentEntry( aBaseLb.GetSelectEntry() );
653 if ( String( SfxResId( STR_NONE ) ) == aParentEntry || aParentEntry == pStyle->GetName() )
654 aParentEntry.Erase();
656 if ( pStyle->GetParent() != aParentEntry )
658 if ( !pStyle->SetParent( aParentEntry ) )
660 InfoBox aBox( this, SfxResId( MSG_TABPAGE_INVALIDPARENT ) );
661 aBox.Execute();
662 aBaseLb.GrabFocus();
663 return SfxTabPage::KEEP_PAGE;
665 bModified = TRUE;
666 nRet |= (int)SfxTabPage::REFRESH_SET;
670 if ( pItemSet )
671 FillItemSet( *pItemSet );
673 return nRet;