/************************************************************************* * * $RCSfile: stlsheet.cxx,v $ * * $Revision: 1.10 $ * * last change: $Author: vg $ $Date: 2005-02-17 09:41:10 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (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.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #pragma hdrstop #include "eetext.hxx" // definiert ITEMID_... fuer frmitems und textitem #ifndef _EEITEMID_HXX //autogen #include #endif #ifndef _SVX_FHGTITEM_HXX //autogen #include #endif #ifndef _SVDOATTR_HXX //autogen #include #endif #ifndef _SVX_ULSPITEM_HXX //autogen #include #endif #ifndef _SFXSMPLHINT_HXX //autogen #include #endif #include #include #include "stlsheet.hxx" #include "sdresid.hxx" #include "sdpage.hxx" #include "drawdoc.hxx" #include "stlpool.hxx" #include "glob.hrc" #include "app.hrc" #include "glob.hxx" #ifndef SVX_LIGHT #ifndef MAC #ifndef SD_VIEW_SHELL_HXX #include "../ui/inc/ViewShell.hxx" #endif #ifndef SD_VIEW_HXX #include "../ui/inc/View.hxx" #endif #ifndef SD_TAB_CONTROL_HXX #include "../ui/inc/TabControl.hxx" #endif #ifndef SD_LAYER_TAB_BAR_HXX #include "../ui/inc/LayerTabBar.hxx" #endif #ifndef SD_DRAW_VIEW_HXX #include "../ui/inc/drawview.hxx" #endif #ifndef SD_DRAW_VIEW_SHELL_HXX #include "../ui/inc/DrawViewShell.hxx" #endif #ifndef SD_DRAW_DOC_SHELL_HXX #include "../ui/inc/DrawDocShell.hxx" #endif #ifndef SD_OUTLINE_VIEW_HXX #include "../ui/inc/OutlineView.hxx" #endif #ifndef SD_OUTLINE_VIEW_SHELL_HXX #include "../ui/inc/OutlineViewShell.hxx" #endif #ifndef SD_VIEW_SHELL_BASE_HXX #include "../ui/inc/ViewShellBase.hxx" #endif #else #ifndef SD_VIEW_SHELL_BASE_HXX #include "ViewShellBase.hxx" #endif #ifndef SD_DRAW_VIEW_SHELL_HXX #include "DrawViewShell.hxx" #endif #ifndef SD_OUTLINE_VIEW_SHELL_HXX #include "OutlineViewShell.hxx" #endif #endif #endif // !SVX_LIGHT TYPEINIT1(SdStyleSheet, SfxStyleSheet); /************************************************************************* |* |* Ctor |* \************************************************************************/ SdStyleSheet::SdStyleSheet(const String& rName, SfxStyleSheetBasePool& rPool, SfxStyleFamily eFamily, USHORT nMask) : SfxStyleSheet(rName, rPool, eFamily, nMask) { } /************************************************************************* |* |* Dtor |* \************************************************************************/ SdStyleSheet::~SdStyleSheet() { delete pSet; pSet = NULL; // damit nachfolgende Destruktoren eine Chance haben } /************************************************************************* |* |* Load |* \************************************************************************/ void SdStyleSheet::Load (SvStream& rIn, USHORT nVersion) { SfxStyleSheetBase::Load(rIn, nVersion); // Die Default-Maske war frueher 0xAFFE. // Aus dieser Default-Maske wurden die benoetigten Flags ausmaskiert. // Nun wurde das Flag SFXSTYLEBIT_READONLY eingefuehrt, was dazu // das alle StyleSheets read-only waren. // Da im Draw kein StyleSheet read-only sein soll, wird an dieser Stelle // das Flag zurueckgesetzt. nMask &= ~SFXSTYLEBIT_READONLY; } /************************************************************************* |* |* Store |* \************************************************************************/ void SdStyleSheet::Store(SvStream& rOut) { SfxStyleSheetBase::Store(rOut); } /************************************************************************* |* |* Parent setzen |* \************************************************************************/ BOOL SdStyleSheet::SetParent(const String& rParentName) { BOOL bResult = FALSE; if (SfxStyleSheet::SetParent(rParentName)) { // PseudoStyleSheets haben keine eigenen ItemSets if (nFamily != SFX_STYLE_FAMILY_PSEUDO) { if( rParentName.Len() ) { SfxStyleSheetBase* pStyle = rPool.Find(rParentName, nFamily); if (pStyle) { bResult = TRUE; SfxItemSet& rParentSet = pStyle->GetItemSet(); GetItemSet().SetParent(&rParentSet); Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) ); } } else { bResult = TRUE; GetItemSet().SetParent(NULL); Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) ); } } else { bResult = TRUE; } } return bResult; } /************************************************************************* |* |* ItemSet ggfs. erzeugen und herausreichen |* \************************************************************************/ SfxItemSet& SdStyleSheet::GetItemSet() { if (nFamily == SFX_STYLE_FAMILY_PARA || nFamily == SD_LT_FAMILY) { // ggfs. das ItemSet 'on demand' anlegen if (!pSet) { USHORT nWhichPairTable[] = { XATTR_LINE_FIRST, XATTR_LINE_LAST, XATTR_FILL_FIRST, XATTR_FILL_LAST, SDRATTR_SHADOW_FIRST, SDRATTR_SHADOW_LAST, SDRATTR_TEXT_MINFRAMEHEIGHT, SDRATTR_TEXT_HORZADJUST, SDRATTR_TEXT_ANIKIND, SDRATTR_TEXT_CONTOURFRAME, SDRATTR_EDGE_FIRST, SDRATTR_EDGE_LAST, SDRATTR_MEASURE_FIRST, SDRATTR_MEASURE_LAST, EE_PARA_START, EE_CHAR_END, SDRATTR_XMLATTRIBUTES, SDRATTR_XMLATTRIBUTES, SDRATTR_3D_FIRST, SDRATTR_3D_LAST, 0, 0 }; pSet = new SfxItemSet(GetPool().GetPool(), nWhichPairTable); } return *pSet; } // dies ist eine Stellvertretervorlage fuer die interne Vorlage des // aktuellen Praesentationslayouts: dessen ItemSet returnieren else { // return (GetRealStyleSheet()->GetItemSet()); SdStyleSheet* pSdSheet = GetRealStyleSheet(); if (pSdSheet) { return(pSdSheet->GetItemSet()); } else { if (!pSet) { USHORT nWhichPairTable[] = { XATTR_LINE_FIRST, XATTR_LINE_LAST, XATTR_FILL_FIRST, XATTR_FILL_LAST, SDRATTR_SHADOW_FIRST, SDRATTR_SHADOW_LAST, SDRATTR_TEXT_MINFRAMEHEIGHT, SDRATTR_TEXT_HORZADJUST, SDRATTR_TEXT_ANIKIND, SDRATTR_TEXT_CONTOURFRAME, SDRATTR_EDGE_FIRST, SDRATTR_EDGE_LAST, SDRATTR_MEASURE_FIRST, SDRATTR_MEASURE_LAST, EE_PARA_START, EE_CHAR_END, SDRATTR_XMLATTRIBUTES, SDRATTR_XMLATTRIBUTES, SDRATTR_3D_FIRST, SDRATTR_3D_LAST, 0, 0 }; pSet = new SfxItemSet(GetPool().GetPool(), nWhichPairTable); } return(*pSet); } } } /************************************************************************* |* |* IsUsed(), eine Vorlage gilt als benutzt, wenn sie von eingefuegten Objekten |* oder von benutzten Vorlagen referenziert wird |* \************************************************************************/ BOOL SdStyleSheet::IsUsed() const { BOOL bResult = FALSE; USHORT nListenerCount = GetListenerCount(); if (nListenerCount > 0) { for (USHORT n = 0; n < nListenerCount; n++) { SfxListener* pListener = GetListener(n); // NULL-Pointer ist im Listener-Array erlaubt if (pListener && pListener->ISA(SdrAttrObj)) { bResult = ((SdrAttrObj*)pListener)->IsInserted(); } else if (pListener && pListener->ISA(SfxStyleSheet)) { bResult = ((SfxStyleSheet*)pListener)->IsUsed(); } if (bResult) break; } } return bResult; } /************************************************************************* |* |* CreateChildList, erstellt eine Liste der unmittelbaren Kinder dieser |* Vorlage; die Liste gehoert dem Caller! |* \************************************************************************/ List* SdStyleSheet::CreateChildList() const { List* pResult = new List; USHORT nListenerCount = GetListenerCount(); if (nListenerCount > 0) { for (USHORT n = 0; n < nListenerCount; n++) { SfxListener* pListener = GetListener(n); // NULL-Pointer ist im Listener-Array erlaubt if (pListener && pListener->ISA(SdStyleSheet) && ((SdStyleSheet*)pListener)->GetParent() == aName) { pResult->Insert((SdStyleSheet*)pListener, LIST_APPEND); } } } return pResult; } /************************************************************************* |* |* das StyleSheet ermitteln, fuer das dieses StyleSheet steht |* \************************************************************************/ SdStyleSheet* SdStyleSheet::GetRealStyleSheet() const { String aRealStyle; String aSep( RTL_CONSTASCII_USTRINGPARAM( SD_LT_SEPARATOR )); SdStyleSheet* pRealStyle = NULL; SdDrawDocument* pDoc = ((SdStyleSheetPool&) rPool).GetDoc(); SfxViewShell* pViewShellBase = SfxViewShell::Current(); if (pViewShellBase!=NULL && pViewShellBase->ISA(::sd::ViewShellBase)) { ::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( pViewShellBase->GetViewFrame()); DBG_ASSERT(pBase!=NULL, "ViewShellBase not valid"); ::sd::ViewShell* pViewShell = pBase->GetMainViewShell(); if (pViewShell != NULL && pViewShell->GetDoc() == pDoc) { SdPage* pPage = static_cast< ::sd::DrawViewShell*>(pViewShell)->GetActualPage(); DBG_ASSERT(pPage, "aktuelle Seite nicht gefunden"); aRealStyle = pPage->GetLayoutName(); // hinter dem Separator abschneiden aRealStyle.Erase(aRealStyle.Search(aSep) + aSep.Len()); } } if (aRealStyle.Len() == 0) { SdPage* pPage = pDoc->GetSdPage(0, PK_STANDARD); if (pPage) { aRealStyle = pDoc->GetSdPage(0, PK_STANDARD)->GetLayoutName(); } else { // Noch keine Seite vorhanden // Dieses kann beim Aktualisieren vonDokumentvorlagen vorkommen SfxStyleSheetIterator aIter(&rPool, SD_LT_FAMILY); SfxStyleSheetBase* pSheet = aIter.First(); if( pSheet ) aRealStyle = pSheet->GetName(); } aRealStyle.Erase(aRealStyle.Search(aSep) + aSep.Len()); } // jetzt vom Namen (landessprachlich angepasst) auf den internen // Namen (unabhaengig von der Landessprache) mappen String aInternalName; if (aName == String(SdResId(STR_PSEUDOSHEET_TITLE))) { aInternalName = String(SdResId(STR_LAYOUT_TITLE)); } else if (aName == String(SdResId(STR_PSEUDOSHEET_SUBTITLE))) { aInternalName = String(SdResId(STR_LAYOUT_SUBTITLE)); } else if (aName == String(SdResId(STR_PSEUDOSHEET_BACKGROUND))) { aInternalName = String(SdResId(STR_LAYOUT_BACKGROUND)); } else if (aName == String(SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS))) { aInternalName = String(SdResId(STR_LAYOUT_BACKGROUNDOBJECTS)); } else if (aName == String(SdResId(STR_PSEUDOSHEET_NOTES))) { aInternalName = String(SdResId(STR_LAYOUT_NOTES)); } else { String aOutlineStr(SdResId(STR_PSEUDOSHEET_OUTLINE)); USHORT nPos = aName.Search(aOutlineStr); if (nPos != STRING_NOTFOUND) { String aNumStr(aName.Copy(aOutlineStr.Len())); aInternalName = String(SdResId(STR_LAYOUT_OUTLINE)); aInternalName += aNumStr; } } aRealStyle += aInternalName; pRealStyle = (SdStyleSheet*)rPool.Find(aRealStyle, SD_LT_FAMILY); if( !pRealStyle ) { SfxStyleSheetIterator aIter(&rPool, SD_LT_FAMILY); if( aIter.Count() > 0 ) // StyleSheet not found, but pool already loaded DBG_ASSERT(pRealStyle, "Internal StyleSheet not found"); } return pRealStyle; } /************************************************************************* |* |* das PseudoStyleSheet ermitteln, durch das dieses StyleSheet vertreten wird |* \************************************************************************/ SdStyleSheet* SdStyleSheet::GetPseudoStyleSheet() const { SdStyleSheet* pPseudoStyle = NULL; String aSep( RTL_CONSTASCII_USTRINGPARAM( SD_LT_SEPARATOR )); String aStyleName(aName); // ohne Layoutnamen und Separator aStyleName.Erase(0, aStyleName.Search(aSep) + aSep.Len()); if (aStyleName == String(SdResId(STR_LAYOUT_TITLE))) { aStyleName = String(SdResId(STR_PSEUDOSHEET_TITLE)); } else if (aStyleName == String(SdResId(STR_LAYOUT_SUBTITLE))) { aStyleName = String(SdResId(STR_PSEUDOSHEET_SUBTITLE)); } else if (aStyleName == String(SdResId(STR_LAYOUT_BACKGROUND))) { aStyleName = String(SdResId(STR_PSEUDOSHEET_BACKGROUND)); } else if (aStyleName == String(SdResId(STR_LAYOUT_BACKGROUNDOBJECTS))) { aStyleName = String(SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS)); } else if (aStyleName == String(SdResId(STR_LAYOUT_NOTES))) { aStyleName = String(SdResId(STR_PSEUDOSHEET_NOTES)); } else { String aOutlineStr((SdResId(STR_LAYOUT_OUTLINE))); USHORT nPos = aStyleName.Search(aOutlineStr); if (nPos != STRING_NOTFOUND) { String aNumStr(aStyleName.Copy(aOutlineStr.Len())); aStyleName = String(SdResId(STR_PSEUDOSHEET_OUTLINE)); aStyleName += aNumStr; } } pPseudoStyle = (SdStyleSheet*)rPool.Find(aStyleName, (SfxStyleFamily)SFX_STYLE_FAMILY_PSEUDO); DBG_ASSERT(pPseudoStyle, "PseudoStyleSheet nicht gefunden"); return pPseudoStyle; } /************************************************************************* |* |* Notify |* \************************************************************************/ void SdStyleSheet::SFX_NOTIFY(SfxBroadcaster& rBC, const TypeId& rBCType, const SfxHint& rHint, const TypeId& rHintType) { // erstmal die Basisklassenfunktionalitaet SfxStyleSheet::Notify(rBC, rHint); // wenn der Stellvertreter ein Notify bezueglich geaenderter Attribute // bekommt, sorgt er dafuer, dass das eigentlich gemeinte StyleSheet // broadcastet SfxSimpleHint* pSimple = PTR_CAST(SfxSimpleHint, &rHint); ULONG nId = pSimple == NULL ? 0 : pSimple->GetId(); if (nId == SFX_HINT_DATACHANGED && nFamily == SFX_STYLE_FAMILY_PSEUDO) { SdStyleSheet* pRealStyle = GetRealStyleSheet(); if (pRealStyle) pRealStyle->Broadcast(rHint); } } /************************************************************************* |* AdjustToFontHeight passt die Bulletbreite und den linken Texteinzug |* des uebergebenen ItemSets dessen Fonthoehe an. Die neuen Werte werden so |* berechnet, dass das Verhaeltnis zur Fonthoehe so ist wie im StyleSheet. |* |* bOnlyMissingItems legt fest, ob lediglich nicht gesetzte Items ergaenzt |* (TRUE) oder explizit gesetzte Items ueberschreiben werden sollen (FALSE) |* \************************************************************************/ void SdStyleSheet::AdjustToFontHeight(SfxItemSet& rSet, BOOL bOnlyMissingItems) { // Bulletbreite und Texteinzug an neue Fonthoehe // anpassen, wenn sie nicht explizit gesetzt wurden SfxStyleFamily eFamily = nFamily; String aStyleName(aName); if (eFamily == SFX_STYLE_FAMILY_PSEUDO) { SfxStyleSheet* pRealStyle = GetRealStyleSheet(); eFamily = pRealStyle->GetFamily(); aStyleName = pRealStyle->GetName(); } if (eFamily == SD_LT_FAMILY && aStyleName.Search(String(SdResId(STR_LAYOUT_OUTLINE))) != STRING_NOTFOUND && rSet.GetItemState(EE_CHAR_FONTHEIGHT) == SFX_ITEM_SET) { const SfxItemSet* pCurSet = &GetItemSet(); UINT32 nNewHeight = ((SvxFontHeightItem&)rSet.Get(EE_CHAR_FONTHEIGHT)).GetHeight(); UINT32 nOldHeight = ((SvxFontHeightItem&)pCurSet->Get(EE_CHAR_FONTHEIGHT)).GetHeight(); if (rSet.GetItemState(EE_PARA_BULLET) != SFX_ITEM_SET || !bOnlyMissingItems) { const SvxBulletItem& rBItem = (const SvxBulletItem&)pCurSet->Get(EE_PARA_BULLET); double fBulletFraction = double(rBItem.GetWidth()) / nOldHeight; SvxBulletItem aNewBItem(rBItem); aNewBItem.SetWidth((UINT32)(fBulletFraction * nNewHeight)); rSet.Put(aNewBItem); } if (rSet.GetItemState(EE_PARA_LRSPACE) != SFX_ITEM_SET || !bOnlyMissingItems) { const SvxLRSpaceItem& rLRItem = (const SvxLRSpaceItem&)pCurSet->Get(EE_PARA_LRSPACE); double fIndentFraction = double(rLRItem.GetTxtLeft()) / nOldHeight; SvxLRSpaceItem aNewLRItem(rLRItem); aNewLRItem.SetTxtLeft((USHORT)(fIndentFraction * nNewHeight)); double fFirstIndentFraction = double(rLRItem.GetTxtFirstLineOfst()) / nOldHeight; aNewLRItem.SetTxtFirstLineOfst((short)(fFirstIndentFraction * nNewHeight)); rSet.Put(aNewLRItem); } if (rSet.GetItemState(EE_PARA_ULSPACE) != SFX_ITEM_SET || !bOnlyMissingItems) { const SvxULSpaceItem& rULItem = (const SvxULSpaceItem&)pCurSet->Get(EE_PARA_ULSPACE); SvxULSpaceItem aNewULItem(rULItem); double fLowerFraction = double(rULItem.GetLower()) / nOldHeight; aNewULItem.SetLower((USHORT)(fLowerFraction * nNewHeight)); double fUpperFraction = double(rULItem.GetUpper()) / nOldHeight; aNewULItem.SetUpper((USHORT)(fUpperFraction * nNewHeight)); rSet.Put(aNewULItem); } } } BOOL SdStyleSheet::HasFollowSupport() const { return FALSE; } BOOL SdStyleSheet::HasParentSupport() const { return TRUE; } BOOL SdStyleSheet::HasClearParentSupport() const { return TRUE; }