1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: mgetempl.cxx,v $
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>
39 #include <vcl/field.hxx>
40 #include <svtools/eitem.hxx>
41 #include <svtools/intitem.hxx>
42 #include <svtools/style.hxx>
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>
57 #include "mgetempl.hrc"
59 #ifndef _SFX_STYLE_HRC
60 #include <svtools/style.hrc>
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() ),
90 aName ( pStyle
->GetName() ),
91 aFollow ( pStyle
->GetFollow() ),
92 aParent ( pStyle
->GetParent() ),
93 nFlags ( pStyle
->GetMask() )
97 Konstruktor; initialisiert die ListBoxen mit den Vorlagen
104 if ( IsBackground() )
105 aDescED
.SetBackground( GetBackground() );
106 FixedInfo
* pInfo
= new FixedInfo( this );
107 aDescED
.SetFont( pInfo
->GetFont() );
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();
124 pPool
= pDocShell
->GetStyleSheetPool();
125 DBG_ASSERT( pPool
, "kein Pool oder keine DocShell" );
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
) );
138 String
aNo( aNoName
);
139 aNoName
+= String::CreateFromInt32( nNo
);
140 while ( pPool
->Find( aNoName
) )
144 aNoName
+= String::CreateFromInt32( nNo
);
146 pStyle
->SetName( 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();
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() );
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();
192 const String
aStr( pPoolStyle
->GetName() );
193 // eigener Namen nicht als Basisvorlage
195 aBaseLb
.InsertEntry( aStr
);
196 pPoolStyle
= pPool
->Next();
204 USHORT nCount
= pFamilies
->Count();
207 for ( i
= 0; i
< nCount
; ++i
)
209 pItem
= pFamilies
->GetObject(i
);
211 if ( pItem
->GetFamily() == pStyle
->GetFamily() )
215 USHORT nStyleFilterIdx
= 0xffff;
220 const SfxStyleFilter
& rList
= pItem
->GetFilterList();
221 nCount
= (USHORT
)rList
.Count();
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
;
246 if ( nStyleFilterIdx
!= 0xFFFF )
247 aFilterLb
.SelectEntryPos( nStyleFilterIdx
);
250 if ( !aFilterLb
.GetEntryCount() || !pStyle
->IsUserDefined() )
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();
272 aNameEd
.SetSizePixel(aSize
);
277 //-------------------------------------------------------------------------
279 SfxManageStyleSheetPage::~SfxManageStyleSheetPage()
283 Destruktor; Freigabe der Daten
288 aNameEd
.SetGetFocusHdl( Link() );
289 aNameEd
.SetLoseFocusHdl( Link() );
296 //-------------------------------------------------------------------------
298 void SfxManageStyleSheetPage::UpdateName_Impl( ListBox
* pBox
,
303 Nach der "Anderung eines Vorlagennamens die ListBox pBox
308 ListBox* pBox ListBox, deren Eintr"age aktualisiert
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
);
323 pBox
->SelectEntry( rNew
);
327 //-------------------------------------------------------------------------
329 void SfxManageStyleSheetPage::SetDescriptionText_Impl()
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();
343 const SfxPoolItem
* pPoolItem
= pModule
->GetItem( SID_ATTR_METRIC
);
345 eFieldUnit
= (FieldUnit
)( (SfxUInt16Item
*)pPoolItem
)->GetValue();
348 switch ( eFieldUnit
)
350 case FUNIT_MM
: eUnit
= SFX_MAPUNIT_MM
; break;
354 case FUNIT_KM
: eUnit
= SFX_MAPUNIT_CM
; break;
357 case FUNIT_PICA
: eUnit
= SFX_MAPUNIT_POINT
; break;
361 case FUNIT_MILE
: eUnit
= SFX_MAPUNIT_INCH
; break;
364 DBG_ERRORFILE( "not supported fieldunit" );
366 aDescFt
.SetText( pStyle
->GetDescription( eUnit
) );
369 //-------------------------------------------------------------------------
371 IMPL_LINK_INLINE_START( SfxManageStyleSheetPage
, GetFocusHdl
, Edit
*, pEdit
)
375 StarView Handler; GetFocus-Handler des Edits mit dem Vorlagennamen.
380 aBuf
= pEdit
->GetText().EraseLeadingChars();
383 IMPL_LINK_INLINE_END( SfxManageStyleSheetPage
, GetFocusHdl
, Edit
*, pEdit
)
385 //-------------------------------------------------------------------------
387 IMPL_LINK_INLINE_START( SfxManageStyleSheetPage
, LoseFocusHdl
, Edit
*, pEdit
)
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
403 UpdateName_Impl( &aFollowLb
, aStr
);
406 IMPL_LINK_INLINE_END( SfxManageStyleSheetPage
, LoseFocusHdl
, Edit
*, pEdit
)
408 //-------------------------------------------------------------------------
410 BOOL
SfxManageStyleSheetPage::FillItemSet( SfxItemSet
& rSet
)
415 Handler f"ur das Setzen der (modifizierten) Daten. Wird aus
416 dem Ok des SfxTabDialog gerufen.
420 SfxItemSet &rAttrSet das Set, das die Daten entgegennimmt.
425 BOOL TRUE: es hat eine "Anderung der Daten
427 FALSE: es hat keine "Anderung der Daten
437 const USHORT nFilterIdx
= aFilterLb
.GetSelectEntryPos();
441 if ( LISTBOX_ENTRY_NOTFOUND
!= nFilterIdx
&&
442 nFilterIdx
!= aFilterLb
.GetSavedValue() &&
443 aFilterLb
.IsEnabled() )
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
);
451 p
= pItem
->GetFilterList().GetObject( nIdx
);
453 USHORT nMask
= pItem
->GetFilterList().GetObject(
454 (USHORT
)(long)aFilterLb
.GetEntryData( nFilterIdx
) )->nFlags
|
456 pStyle
->SetMask( nMask
);
458 if(aAutoCB
.IsVisible() &&
459 aAutoCB
.IsChecked() != aAutoCB
.GetSavedValue())
461 rSet
.Put(SfxBoolItem(SID_ATTR_AUTO_STYLE_UPDATE
, aAutoCB
.IsChecked()));
467 //-------------------------------------------------------------------------
469 void SfxManageStyleSheetPage::Reset( const SfxItemSet
& /*rAttrSet*/ )
474 Handler f"ur das Initialisieren der Seite mit den initialen Daten.
478 const SfxItemSet &rAttrSet das Set mit den Daten
489 String
sCmp( pStyle
->GetName() );
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
);
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
) ) );
518 aBaseLb
.SelectEntry( aParent
);
520 if ( String( SfxResId( STR_STANDARD
) ) == aName
)
522 // die Standardvorlage kann nicht verkn"upft werden
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
)
546 Factory f"ur das Erzeugen der Seite
555 return new SfxManageStyleSheetPage( pParent
, rAttrSet
);
558 //-------------------------------------------------------------------------
560 void SfxManageStyleSheetPage::ActivatePage( const SfxItemSet
& rSet
)
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.
570 const SfxItemSet& das Set f"ur den Datenaustausch; wird
571 hier nicht verwendet.
575 <SfxTabDialog::ActivatePage(const SfxItemSet &)>
580 SetDescriptionText_Impl();
582 // ist es ein Style mit automatischem Update? (nur SW)
583 const SfxPoolItem
* pPoolItem
;
586 rSet
.GetItemState( SID_ATTR_AUTO_STYLE_UPDATE
, FALSE
, &pPoolItem
) )
587 aAutoCB
.Check( ( (const SfxBoolItem
*)pPoolItem
)->GetValue() );
591 //-------------------------------------------------------------------------
593 int SfxManageStyleSheetPage::DeactivatePage( SfxItemSet
* pItemSet
)
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.
604 SfxItemSet* das Set f"ur den Datenaustausch; wird hier nicht verwendet.
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
) );
626 aNameEd
.SetSelection( Selection( SELECTION_MIN
, SELECTION_MAX
) );
627 return SfxTabPage::KEEP_PAGE
;
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
) );
642 aFollowLb
.GrabFocus();
643 return SfxTabPage::KEEP_PAGE
;
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
) );
663 return SfxTabPage::KEEP_PAGE
;
666 nRet
|= (int)SfxTabPage::REFRESH_SET
;
671 FillItemSet( *pItemSet
);