blob: ded0fa633ee257e9887eb267d05be3d1257692ab [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sfx2.hxx"
// include ---------------------------------------------------------------
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#include <vcl/field.hxx>
#include <svl/eitem.hxx>
#include <svl/intitem.hxx>
#include <svl/style.hxx>
#ifndef GCC
#endif
#include <sfx2/styfitem.hxx>
#include <sfx2/styledlg.hxx>
#include <sfx2/app.hxx>
#include <sfx2/mgetempl.hxx>
#include <sfx2/objsh.hxx>
#include "sfxtypes.hxx"
#include "sfx2/sfxresid.hxx"
#include <sfx2/module.hxx>
#include <sfx2/sfx.hrc>
#include "dialog.hrc"
#include "mgetempl.hrc"
#ifndef _SFX_STYLE_HRC
#include <svl/style.hrc>
#endif
// SfxManageStyleSheetPage -----------------------------------------------
SfxManageStyleSheetPage::SfxManageStyleSheetPage( Window* pParent, const SfxItemSet& rAttrSet ) :
SfxTabPage( pParent, SfxResId( TP_MANAGE_STYLES ), rAttrSet ),
aNameFt ( this, SfxResId( FT_NAME ) ),
aNameEd ( this, SfxResId( ED_NAME ) ),
aNameMLE ( this, SfxResId( MLE_NAME ) ),
aAutoCB ( this, SfxResId( CB_AUTO ) ),
aFollowFt ( this, SfxResId( FT_NEXT ) ),
aFollowLb ( this, SfxResId( LB_NEXT ) ),
aBaseFt ( this, SfxResId( FT_BASE ) ),
aBaseLb ( this, SfxResId( LB_BASE ) ),
aFilterFt ( this, SfxResId( FT_REGION ) ),
aFilterLb ( this, SfxResId( LB_REGION ) ),
aDescGb ( this, SfxResId( GB_DESC ) ),
aDescFt ( this, SfxResId( FT_DESC ) ),
aDescED ( this, SfxResId( ED_DESC ) ),
pStyle( &( (SfxStyleDialog*)pParent->GetParent() )->GetStyleSheet() ),
pItem ( 0 ),
bModified ( sal_False ),
aName ( pStyle->GetName() ),
aFollow ( pStyle->GetFollow() ),
aParent ( pStyle->GetParent() ),
nFlags ( pStyle->GetMask() )
/* [Beschreibung]
Konstruktor; initialisiert die ListBoxen mit den Vorlagen
*/
{
FreeResource();
if ( IsBackground() )
aDescED.SetBackground( GetBackground() );
FixedInfo* pInfo = new FixedInfo( this );
aDescED.SetFont( pInfo->GetFont() );
delete pInfo;
aDescED.Hide();
aDescFt.Show();
// diese Page braucht ExchangeSupport
SetExchangeSupport();
ResMgr* pResMgr = SFX_APP()->GetModule_Impl()->GetResMgr();
DBG_ASSERT( pResMgr, "kein ResMgr am Modul" );
pFamilies = new SfxStyleFamilies( ResId( DLG_STYLE_DESIGNER, *pResMgr ) );
SfxStyleSheetBasePool* pPool = 0;
SfxObjectShell* pDocShell = SfxObjectShell::Current();
if ( pDocShell )
pPool = pDocShell->GetStyleSheetPool();
DBG_ASSERT( pPool, "kein Pool oder keine DocShell" );
if ( pPool )
{
pPool->SetSearchMask( pStyle->GetFamily() );
pPool->First(); // fuer SW - interne Liste updaten
}
if ( !pStyle->GetName().Len() && pPool )
{
// NullString als Name -> Name generieren
String aNoName( SfxResId( STR_NONAME ) );
sal_uInt16 nNo = 1;
String aNo( aNoName );
aNoName += String::CreateFromInt32( nNo );
while ( pPool->Find( aNoName ) )
{
++nNo;
aNoName = aNo;
aNoName += String::CreateFromInt32( nNo );
}
pStyle->SetName( aNoName );
aName = aNoName;
aFollow = pStyle->GetFollow();
aParent = pStyle->GetParent();
}
aNameEd.SetText(pStyle->GetName());
// Set the field read-only if it is NOT an user-defined style
// but allow selecting and copying
if ( !pStyle->IsUserDefined() ) {
aNameEd.SetReadOnly();
aNameEd.Hide();
aNameMLE.SetControlBackground( GetSettings().GetStyleSettings().GetDialogColor() );
aNameMLE.SetText( pStyle->GetName() );
aNameMLE.EnableCursor( sal_False );
aNameMLE.Show();
}
if ( pStyle->HasFollowSupport() && pPool )
{
SfxStyleSheetBase* pPoolStyle = pPool->First();
while ( pPoolStyle )
{
aFollowLb.InsertEntry( pPoolStyle->GetName() );
pPoolStyle = pPool->Next();
}
// eine neue Vorlage ist noch nicht im Pool
if ( LISTBOX_ENTRY_NOTFOUND == aFollowLb.GetEntryPos( pStyle->GetName() ) )
aFollowLb.InsertEntry( pStyle->GetName() );
}
else
{
aFollowFt.Hide();
aFollowLb.Hide();
aFilterFt.SetPosPixel( aBaseFt.GetPosPixel() );
aFilterLb.SetPosPixel( aBaseLb.GetPosPixel() );
aBaseFt.SetPosPixel( aFollowFt.GetPosPixel() );
aBaseLb.SetPosPixel( aFollowLb.GetPosPixel() );
}
if ( pStyle->HasParentSupport() && pPool )
{
if ( pStyle->HasClearParentSupport() )
// die Basisvorlage darf auf NULL gesetzt werden
aBaseLb.InsertEntry( String( SfxResId( STR_NONE ) ) );
SfxStyleSheetBase* pPoolStyle = pPool->First();
while ( pPoolStyle )
{
const String aStr( pPoolStyle->GetName() );
// eigener Namen nicht als Basisvorlage
if ( aStr != aName )
aBaseLb.InsertEntry( aStr );
pPoolStyle = pPool->Next();
}
}
else
{
aBaseFt.Disable();
aBaseLb.Disable();
}
sal_uInt16 nCount = pFamilies->Count();
sal_uInt16 i;
for ( i = 0; i < nCount; ++i )
{
pItem = pFamilies->GetObject(i);
if ( pItem->GetFamily() == pStyle->GetFamily() )
break;
}
sal_uInt16 nStyleFilterIdx = 0xffff;
if ( i < nCount )
{
// Filterflags
const SfxStyleFilter& rList = pItem->GetFilterList();
nCount = (sal_uInt16)rList.Count();
sal_uInt16 nIdx = 0;
sal_uInt16 nMask = pStyle->GetMask() & ~SFXSTYLEBIT_USERDEF;
if ( !nMask ) // Benutzervorlage?
nMask = pStyle->GetMask();
for ( i = 0; i < nCount; ++i )
{
SfxFilterTupel* pTupel = rList.GetObject(i);
if ( pTupel->nFlags != SFXSTYLEBIT_AUTO &&
pTupel->nFlags != SFXSTYLEBIT_USED &&
// pTupel->nFlags != SFXSTYLEBIT_USERDEF &&
pTupel->nFlags != SFXSTYLEBIT_ALL )
{
aFilterLb.InsertEntry( pTupel->aName, nIdx );
aFilterLb.SetEntryData(nIdx, (void*)(long)i);
if ( ( pTupel->nFlags & nMask ) == nMask )
nStyleFilterIdx = nIdx;
++nIdx;
}
}
if ( nStyleFilterIdx != 0xFFFF )
aFilterLb.SelectEntryPos( nStyleFilterIdx );
}
if ( !aFilterLb.GetEntryCount() || !pStyle->IsUserDefined() )
{
pItem = 0;
aFilterFt.Disable();
aFilterLb.Disable();
}
else
aFilterLb.SaveValue();
SetDescriptionText_Impl();
if ( aFollowLb.IsEnabled() || aBaseLb.IsEnabled() )
{
aNameEd.SetGetFocusHdl(
LINK( this, SfxManageStyleSheetPage, GetFocusHdl ) );
aNameEd.SetLoseFocusHdl(
LINK( this, SfxManageStyleSheetPage, LoseFocusHdl ) );
}
// ist es ein Style mit automatischem Update? (nur SW)
if(SFX_ITEM_SET == rAttrSet.GetItemState(SID_ATTR_AUTO_STYLE_UPDATE))
{
Size aSize = aNameEd.GetSizePixel();
aSize.Width() /= 2;
aNameEd.SetSizePixel(aSize);
aAutoCB.Show();
}
}
//-------------------------------------------------------------------------
SfxManageStyleSheetPage::~SfxManageStyleSheetPage()
/* [Beschreibung]
Destruktor; Freigabe der Daten
*/
{
aNameEd.SetGetFocusHdl( Link() );
aNameEd.SetLoseFocusHdl( Link() );
delete pFamilies;
pItem = 0;
pStyle = 0;
}
//-------------------------------------------------------------------------
void SfxManageStyleSheetPage::UpdateName_Impl( ListBox* pBox,
const String& rNew )
/* [Beschreibung]
Nach der "Anderung eines Vorlagennamens die ListBox pBox
aktualisieren
[Parameter]
ListBox* pBox ListBox, deren Eintr"age aktualisiert
werden sollen
const String& rNew der neue Name
*/
{
if ( pBox->IsEnabled() )
{
// ist der aktuelle Eintrag, dessen Namen modifizieren wurde
const sal_Bool bSelect = pBox->GetSelectEntry() == aBuf;
pBox->RemoveEntry( aBuf );
pBox->InsertEntry( rNew );
if ( bSelect )
pBox->SelectEntry( rNew );
}
}
//-------------------------------------------------------------------------
void SfxManageStyleSheetPage::SetDescriptionText_Impl()
/* [Beschreibung]
Attributbeschreibung setzen. daf"ur die eingestellte Metrik besorgen.
*/
{
SfxMapUnit eUnit = SFX_MAPUNIT_CM;
// FieldUnit eFieldUnit = pSfxApp->GetOptions().GetMetric();
FieldUnit eFieldUnit( FUNIT_CM );
SfxModule* pModule = SfxModule::GetActiveModule();
if ( pModule )
{
const SfxPoolItem* pPoolItem = pModule->GetItem( SID_ATTR_METRIC );
if ( pPoolItem )
eFieldUnit = (FieldUnit)( (SfxUInt16Item*)pPoolItem )->GetValue();
}
switch ( eFieldUnit )
{
case FUNIT_MM: eUnit = SFX_MAPUNIT_MM; break;
case FUNIT_CM:
case FUNIT_M:
case FUNIT_KM: eUnit = SFX_MAPUNIT_CM; break;
case FUNIT_POINT:
case FUNIT_PICA: eUnit = SFX_MAPUNIT_POINT; break;
case FUNIT_INCH:
case FUNIT_FOOT:
case FUNIT_MILE: eUnit = SFX_MAPUNIT_INCH; break;
default:
DBG_ERRORFILE( "not supported fieldunit" );
}
aDescFt.SetText( pStyle->GetDescription( eUnit ) );
}
//-------------------------------------------------------------------------
IMPL_LINK_INLINE_START( SfxManageStyleSheetPage, GetFocusHdl, Edit *, pEdit )
/* [Beschreibung]
StarView Handler; GetFocus-Handler des Edits mit dem Vorlagennamen.
*/
{
aBuf = pEdit->GetText().EraseLeadingChars();
return 0;
}
IMPL_LINK_INLINE_END( SfxManageStyleSheetPage, GetFocusHdl, Edit *, pEdit )
//-------------------------------------------------------------------------
IMPL_LINK_INLINE_START( SfxManageStyleSheetPage, LoseFocusHdl, Edit *, pEdit )
/* [Beschreibung]
StarView Handler; LoseFocus-Handler des Edits mit dem Vorlagennamen.
Dieser aktualisiert ggf. die Listbox mit den Folgevorlagen.
In der Listbox mit den Basisvorlagen ist die aktuelle Vorlage
selbst nicht enthalten.
*/
{
const String aStr( pEdit->GetText().EraseLeadingChars() );
pEdit->SetText( aStr );
// ggf. Listbox der Basisvorlagen aktualisieren
if ( aStr != aBuf )
UpdateName_Impl( &aFollowLb, aStr );
return 0;
}
IMPL_LINK_INLINE_END( SfxManageStyleSheetPage, LoseFocusHdl, Edit *, pEdit )
//-------------------------------------------------------------------------
sal_Bool SfxManageStyleSheetPage::FillItemSet( SfxItemSet& rSet )
/* [Beschreibung]
Handler f"ur das Setzen der (modifizierten) Daten. Wird aus
dem Ok des SfxTabDialog gerufen.
[Parameter]
SfxItemSet &rAttrSet das Set, das die Daten entgegennimmt.
[R"uckgabewert]
sal_Bool sal_True: es hat eine "Anderung der Daten
stattgefunden
sal_False: es hat keine "Anderung der Daten
stattgefunden
[Querverweise]
<class SfxTabDialog>
*/
{
const sal_uInt16 nFilterIdx = aFilterLb.GetSelectEntryPos();
// Filter setzen
if ( LISTBOX_ENTRY_NOTFOUND != nFilterIdx &&
nFilterIdx != aFilterLb.GetSavedValue() &&
aFilterLb.IsEnabled() )
{
bModified = sal_True;
DBG_ASSERT( pItem, "kein Item" );
// geht nur bei Benutzervorlagen
#if OSL_DEBUG_LEVEL > 1
sal_uInt16 nIdx = (sal_uInt16)(long)aFilterLb.GetEntryData( nFilterIdx );
SfxFilterTupel* p;
p = pItem->GetFilterList().GetObject( nIdx );
#endif
sal_uInt16 nMask = pItem->GetFilterList().GetObject(
(sal_uInt16)(long)aFilterLb.GetEntryData( nFilterIdx ) )->nFlags |
SFXSTYLEBIT_USERDEF;
pStyle->SetMask( nMask );
}
if(aAutoCB.IsVisible() &&
aAutoCB.IsChecked() != aAutoCB.GetSavedValue())
{
rSet.Put(SfxBoolItem(SID_ATTR_AUTO_STYLE_UPDATE, aAutoCB.IsChecked()));
}
return bModified;
}
//-------------------------------------------------------------------------
void SfxManageStyleSheetPage::Reset( const SfxItemSet& /*rAttrSet*/ )
/* [Beschreibung]
Handler f"ur das Initialisieren der Seite mit den initialen Daten.
[Parameter]
const SfxItemSet &rAttrSet das Set mit den Daten
[Querverweise]
<class SfxTabDialog>
*/
{
bModified = sal_False;
String sCmp( pStyle->GetName() );
if ( sCmp != aName )
pStyle->SetName( aName );
aNameEd.SetText( aName );
aNameEd.SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) );
if ( aFollowLb.IsEnabled() )
{
sCmp = pStyle->GetFollow();
if ( sCmp != aFollow )
pStyle->SetFollow( aFollow );
if ( !aFollow.Len() )
aFollowLb.SelectEntry( aName );
else
aFollowLb.SelectEntry( aFollow );
}
if ( aBaseLb.IsEnabled() )
{
sCmp = pStyle->GetParent();
if ( sCmp != aParent )
pStyle->SetParent( aParent );
if ( !aParent.Len() )
aBaseLb.SelectEntry( String( SfxResId( STR_NONE ) ) );
else
aBaseLb.SelectEntry( aParent );
if ( String( SfxResId( STR_STANDARD ) ) == aName )
{
// die Standardvorlage kann nicht verkn"upft werden
aBaseFt.Disable();
aBaseLb.Disable();
}
}
if ( aFilterLb.IsEnabled() )
{
sal_uInt16 nCmp = pStyle->GetMask();
if ( nCmp != nFlags )
pStyle->SetMask( nFlags );
aFilterLb.SelectEntryPos( aFilterLb.GetSavedValue() );
}
}
//-------------------------------------------------------------------------
SfxTabPage* SfxManageStyleSheetPage::Create( Window* pParent,
const SfxItemSet &rAttrSet )
/* [Beschreibung]
Factory f"ur das Erzeugen der Seite
[Querverweise]
<class SfxTabDialog>
*/
{
return new SfxManageStyleSheetPage( pParent, rAttrSet );
}
//-------------------------------------------------------------------------
void SfxManageStyleSheetPage::ActivatePage( const SfxItemSet& rSet)
/* [Beschreibung]
ActivatePage- Handler des SfxTabDialog; wird f"ur die Aktualisierung
des beschreibenden Textes verwendet, da sich dieser durch "Anderungen
der Daten anderer Seiten ge"andert haben kann.
[Parameter]
const SfxItemSet& das Set f"ur den Datenaustausch; wird
hier nicht verwendet.
[Querverweise]
<SfxTabDialog::ActivatePage(const SfxItemSet &)>
*/
{
SetDescriptionText_Impl();
// ist es ein Style mit automatischem Update? (nur SW)
const SfxPoolItem* pPoolItem;
if ( SFX_ITEM_SET ==
rSet.GetItemState( SID_ATTR_AUTO_STYLE_UPDATE, sal_False, &pPoolItem ) )
aAutoCB.Check( ( (const SfxBoolItem*)pPoolItem )->GetValue() );
aAutoCB.SaveValue();
}
//-------------------------------------------------------------------------
int SfxManageStyleSheetPage::DeactivatePage( SfxItemSet* pItemSet )
/* [Beschreibung]
DeactivatePage- Handler des SfxTabDialog; die Daten werden
an der Vorlage eingestellt, damit die richtige Vererbung
f"ur die anderen Seiten des Dialoges vorliegt.
Im Fehlerfall wird das Verlassen der Seite unterbunden.
[Parameter]
SfxItemSet* das Set f"ur den Datenaustausch; wird hier nicht verwendet.
[Querverweise]
<SfxTabDialog::DeactivatePage(SfxItemSet*)>
*/
{
int nRet = SfxTabPage::LEAVE_PAGE;
if ( aNameEd.IsModified() )
{
// bei <Enter> wird kein LoseFocus() durch StarView ausgel"ost
if ( aNameEd.HasFocus() )
LoseFocusHdl( &aNameEd );
if ( !pStyle->SetName( aNameEd.GetText().EraseLeadingChars() ) )
{
InfoBox aBox( this, SfxResId( MSG_TABPAGE_INVALIDNAME ) );
aBox.Execute();
aNameEd.GrabFocus();
aNameEd.SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) );
return SfxTabPage::KEEP_PAGE;
}
bModified = sal_True;
}
if ( pStyle->HasFollowSupport() && aFollowLb.IsEnabled() )
{
const String aFollowEntry( aFollowLb.GetSelectEntry() );
if ( pStyle->GetFollow() != aFollowEntry )
{
if ( !pStyle->SetFollow( aFollowEntry ) )
{
InfoBox aBox( this, SfxResId( MSG_TABPAGE_INVALIDSTYLE ) );
aBox.Execute();
aFollowLb.GrabFocus();
return SfxTabPage::KEEP_PAGE;
}
bModified = sal_True;
}
}
if ( aBaseLb.IsEnabled() )
{
String aParentEntry( aBaseLb.GetSelectEntry() );
if ( String( SfxResId( STR_NONE ) ) == aParentEntry || aParentEntry == pStyle->GetName() )
aParentEntry.Erase();
if ( pStyle->GetParent() != aParentEntry )
{
if ( !pStyle->SetParent( aParentEntry ) )
{
InfoBox aBox( this, SfxResId( MSG_TABPAGE_INVALIDPARENT ) );
aBox.Execute();
aBaseLb.GrabFocus();
return SfxTabPage::KEEP_PAGE;
}
bModified = sal_True;
nRet |= (int)SfxTabPage::REFRESH_SET;
}
}
if ( pItemSet )
FillItemSet( *pItemSet );
return nRet;
}