summaryrefslogtreecommitdiff
path: root/sd/source/ui/func/futempl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/func/futempl.cxx')
-rw-r--r--sd/source/ui/func/futempl.cxx555
1 files changed, 555 insertions, 0 deletions
diff --git a/sd/source/ui/func/futempl.cxx b/sd/source/ui/func/futempl.cxx
new file mode 100644
index 000000000000..cebedcad6359
--- /dev/null
+++ b/sd/source/ui/func/futempl.cxx
@@ -0,0 +1,555 @@
+/*************************************************************************
+ *
+ * $RCSfile: futempl.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:48:36 $
+ *
+ * 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 <svx/editdata.hxx>
+#include <svx/bulitem.hxx>
+#include <svx/svxids.hrc> // fuer SID_OBJECT_SELECT
+#include <basctl/idetemp.hxx>
+#ifndef _SFX_BINDINGS_HXX //autogen
+#include <sfx2/bindings.hxx>
+#endif
+#ifndef _AEITEM_HXX //autogen
+#include <svtools/aeitem.hxx>
+#endif
+#ifndef _SFXDISPATCH_HXX //autogen
+#include <sfx2/dispatch.hxx>
+#endif
+#ifndef _SV_MSGBOX_HXX //autogen
+#include <vcl/msgbox.hxx>
+#endif
+#ifndef _EEITEM_HXX //autogen
+#include <svx/eeitem.hxx>
+#endif
+#ifndef _SFXREQUEST_HXX //autogen
+#include <sfx2/request.hxx>
+#endif
+#ifndef _SVX_NUMITEM_HXX //autogen
+#include <svx/numitem.hxx>
+#endif
+#ifndef _MyEDITENG_HXX //autogen
+#include <svx/editeng.hxx>
+#endif
+#define ITEMID_LRSPACE EE_PARA_LRSPACE
+#ifndef _SVX_LRSPITEM_HXX //autogen
+#include <svx/lrspitem.hxx>
+#endif
+
+#include "stlsheet.hxx"
+#include "stlpool.hxx"
+#include "app.hxx"
+#include "sdview.hxx"
+#include "sdwindow.hxx"
+#include "drawview.hxx"
+#include "drawdoc.hxx"
+#include "docshell.hxx"
+#include "drviewsh.hxx"
+#include "tabtempl.hxx"
+#include "viewshel.hxx"
+#include "futempl.hxx"
+#include "res_bmp.hrc"
+#include "glob.hrc"
+#include "prlayout.hxx" // enum PresentationObjects
+#include "prltempl.hrc" // TAB_PRES_LAYOUT_TEMPLATE_x
+#include "prltempl.hxx"
+#include "sdresid.hxx"
+#include "outlview.hxx" // class SdOutlineView
+#include "strings.hrc"
+#include "helpids.h"
+
+
+TYPEINIT1( FuTemplate, FuPoor );
+
+/*************************************************************************
+|*
+|* Konstruktor
+|*
+\************************************************************************/
+
+FuTemplate::FuTemplate( SdViewShell* pViewSh, SdWindow* pWin, SdView* pView,
+ SdDrawDocument* pDoc, SfxRequest& rReq )
+ : FuPoor( pViewSh, pWin, pView, pDoc, rReq )
+{
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ USHORT nSlotId = rReq.GetSlot();
+
+ // StyleSheet-Parameter holen
+ SfxStyleSheetBasePool* pSSPool = pDoc->GetDocSh()->GetStyleSheetPool();
+ SfxStyleSheetBase* pStyleSheet = NULL;
+
+ USHORT nFamily = ( (const SfxUInt16Item &) pArgs->Get( SID_STYLE_FAMILY ) ).GetValue();
+ String aStyleName;
+ USHORT nRetMask = 0xffff;
+
+ switch( nSlotId )
+ {
+ case SID_STYLE_APPLY:
+ case SID_STYLE_EDIT:
+ case SID_STYLE_DELETE:
+ case SID_STYLE_FAMILY:
+ case SID_STYLE_NEW_BY_EXAMPLE:
+ {
+ if (pArgs->GetItemState(nSlotId) == SFX_ITEM_SET)
+ aStyleName = ( ( (const SfxStringItem &) pArgs->Get( nSlotId ) ).GetValue() );
+ }
+ }
+
+ switch( nSlotId )
+ {
+ case SID_STYLE_NEW:
+ {
+ SfxStyleSheetBase *p = pSSPool->Find(aStyleName, (SfxStyleFamily) nFamily,
+ SFXSTYLEBIT_ALL );
+ if(p)
+ {
+ pSSPool->Erase(p);
+ p = 0;
+ }
+ pStyleSheet = &pSSPool->Make( aStyleName, (SfxStyleFamily) nFamily,
+ SFXSTYLEBIT_USERDEF );
+
+ if (pArgs->GetItemState(SID_STYLE_REFERENCE) == SFX_ITEM_ON)
+ {
+ String aParentName(((const SfxStringItem&) pArgs->Get(SID_STYLE_REFERENCE)).GetValue());
+ pStyleSheet->SetParent(aParentName);
+ }
+ else
+ {
+ pStyleSheet->SetParent(String(SdResId(STR_STANDARD_STYLESHEET_NAME)));
+ }
+ }
+ break;
+
+ case SID_STYLE_NEW_BY_EXAMPLE:
+ {
+ // Z.Z. geht immer noch der Dialog auf, um den Namen
+ // der Vorlage einzugeben.
+ if( pView->HasMarkedObj() || TRUE )
+ {
+ SfxStyleSheetBase *p = pSSPool->Find(aStyleName, (SfxStyleFamily) nFamily,
+ SFXSTYLEBIT_ALL );
+ if(p) {
+ pSSPool->Erase(p);
+ p = 0;
+ }
+ pStyleSheet = &pSSPool->Make( aStyleName, (SfxStyleFamily) nFamily,
+ SFXSTYLEBIT_USERDEF );
+ pStyleSheet->SetParent(String(SdResId(STR_STANDARD_STYLESHEET_NAME)));
+ }
+ }
+ break;
+
+ case SID_STYLE_EDIT:
+ pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);
+ break;
+
+ case SID_STYLE_DELETE:
+ pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);
+ if( pStyleSheet )
+ {
+ pSSPool->Erase( pStyleSheet );
+ nRetMask = TRUE;
+ pDoc->SetChanged(TRUE);
+ }
+ nRetMask = FALSE;
+ break;
+
+ case SID_STYLE_APPLY:
+ // Anwenden der Vorlage auf das Dokument
+ pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);
+
+ // keine Praesentationsobjektvorlagen, die werden nur
+ // implizit zugewiesen
+ if (pStyleSheet && pStyleSheet->GetFamily() != SFX_STYLE_FAMILY_PSEUDO )
+ {
+ // Es darf auch keinen Praesentationsobjekten Vorlagen zugewiesen werden
+ // Ausnahme: Hintergrundobjekte
+ SfxStyleSheet* pOldStyleSheet = pView->GetStyleSheet();
+ if( !pOldStyleSheet ||
+ pOldStyleSheet->GetFamily() == SFX_STYLE_FAMILY_PARA ||
+ pOldStyleSheet->GetHelpId( String() ) == HID_PSEUDOSHEET_BACKGROUNDOBJECTS )
+ {
+ pView->SetStyleSheet( (SfxStyleSheet*) pStyleSheet);
+ pDoc->SetChanged(TRUE);
+ SFX_BINDINGS().Invalidate( SID_STYLE_FAMILY2 );
+ }
+ }
+ pWin->GrabFocus();
+ break;
+
+ case SID_STYLE_WATERCAN:
+ {
+ if( !SD_MOD()->GetWaterCan() )
+ {
+ if( pArgs->GetItemState( nSlotId ) == SFX_ITEM_SET )
+ {
+ aStyleName = ( ( (const SfxStringItem &) pArgs->Get( nSlotId ) ).GetValue() );
+ SD_MOD()->SetWaterCan( TRUE );
+ pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);
+ }
+ // keine Praesentationsobjektvorlagen, die werden nur
+ // implizit zugewiesen
+ if( pStyleSheet && pStyleSheet->GetFamily() != SFX_STYLE_FAMILY_PSEUDO )
+ {
+ ( (SdStyleSheetPool*) pSSPool )->SetActualStyleSheet( pStyleSheet );
+
+ // Es wird explizit in den Selektionsmodus geschaltet
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_OBJECT_SELECT,
+ SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
+
+ }
+ else
+ SD_MOD()->SetWaterCan( FALSE );
+ }
+ else
+ {
+ SD_MOD()->SetWaterCan( FALSE );
+ // Werkzeugleiste muss wieder enabled werden
+ pViewSh->Invalidate();
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ switch( nSlotId )
+ {
+ case SID_STYLE_NEW:
+ case SID_STYLE_EDIT:
+ {
+ if( pStyleSheet )
+ {
+ SdTabTemplateDlg* pStdDlg = NULL;
+ SdPresLayoutTemplateDlg * pPresDlg = NULL;
+ BOOL bOldDocInOtherLanguage = FALSE;
+ SfxItemSet aOriSet( pStyleSheet->GetItemSet() );
+
+ SfxStyleFamily eFamily = pStyleSheet->GetFamily();
+
+ if (eFamily == SFX_STYLE_FAMILY_PARA)
+ {
+ pStdDlg = new SdTabTemplateDlg( 0, pDoc->GetDocSh(),
+ *pStyleSheet, pDoc,
+ pView );
+ }
+ else if (eFamily == SFX_STYLE_FAMILY_PSEUDO)
+ {
+ String aStyleName(pStyleSheet->GetName());
+ USHORT nDlgId = 0;
+ PresentationObjects ePO;
+
+ if (aStyleName == String(SdResId(STR_PSEUDOSHEET_TITLE)))
+ {
+ nDlgId = TAB_PRES_LAYOUT_TEMPLATE_3;
+ ePO = PO_TITLE;
+ }
+ else if (aStyleName == String(SdResId(STR_PSEUDOSHEET_SUBTITLE)))
+ {
+ nDlgId = TAB_PRES_LAYOUT_TEMPLATE_3;
+ ePO = PO_SUBTITLE;
+ }
+ else if (aStyleName ==
+ String(SdResId(STR_PSEUDOSHEET_BACKGROUND)))
+ {
+ nDlgId = TAB_PRES_LAYOUT_TEMPLATE_2;
+ ePO = PO_BACKGROUND;
+ }
+ else if (aStyleName ==
+ String(SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS)))
+ {
+ nDlgId = TAB_PRES_LAYOUT_TEMPLATE;
+ ePO = PO_BACKGROUNDOBJECTS;
+ }
+ else if (aStyleName ==
+ String(SdResId(STR_PSEUDOSHEET_NOTES)))
+ {
+ nDlgId = TAB_PRES_LAYOUT_TEMPLATE_3;
+ ePO = PO_NOTES;
+ }
+ else if(aStyleName.Search(String(SdResId(STR_PSEUDOSHEET_OUTLINE))) !=
+ STRING_NOTFOUND)
+ {
+ nDlgId = TAB_PRES_LAYOUT_TEMPLATE_3;
+
+ String aOutlineStr((SdResId(STR_PSEUDOSHEET_OUTLINE)));
+ SdStyleSheet* pRealStyle =
+ ((SdStyleSheet*)pStyleSheet)->GetRealStyleSheet();
+ // die Nummer ermitteln; ein Leerzeichen zwischen
+ // Name und Nummer beachten
+ String aNumStr(aStyleName.Copy(aOutlineStr.Len() + 1));
+ USHORT nLevel = (USHORT)aNumStr.ToInt32();
+ switch (nLevel)
+ {
+ case 1: ePO = PO_OUTLINE_1; break;
+ case 2: ePO = PO_OUTLINE_2; break;
+ case 3: ePO = PO_OUTLINE_3; break;
+ case 4: ePO = PO_OUTLINE_4; break;
+ case 5: ePO = PO_OUTLINE_5; break;
+ case 6: ePO = PO_OUTLINE_6; break;
+ case 7: ePO = PO_OUTLINE_7; break;
+ case 8: ePO = PO_OUTLINE_8; break;
+ case 9: ePO = PO_OUTLINE_9; break;
+ }
+ }
+ else
+ {
+ DBG_ERROR("Vorlage aus aelterer anderssprachiger Version");
+ bOldDocInOtherLanguage = TRUE;
+ }
+
+ if( !bOldDocInOtherLanguage )
+ pPresDlg = new SdPresLayoutTemplateDlg( pDocSh, NULL, SdResId(nDlgId), *pStyleSheet, ePO, pSSPool);
+ }
+
+ USHORT nResult = RET_CANCEL;
+ const SfxItemSet* pOutSet = NULL;
+ if (pStdDlg)
+ {
+ nResult = pStdDlg->Execute();
+ pOutSet = pStdDlg->GetOutputItemSet();
+ }
+ else if( pPresDlg )
+ {
+ nResult = pPresDlg->Execute();
+ pOutSet = pPresDlg->GetOutputItemSet();
+ }
+
+ switch( nResult )
+ {
+ case RET_OK:
+ {
+ /* muss Req mit Done abgeschlossen werden?
+ wenn ja, mit welchem Set (es kann ja nur
+ Family und Name
+
+ rReq.Done( *( pDlg->GetOutputItemSet() ) );
+ pArgs = rReq.GetArgs();
+ */
+ nRetMask = pStyleSheet->GetMask();
+
+ if (eFamily == SFX_STYLE_FAMILY_PSEUDO)
+ {
+ SfxItemSet aTempSet(*pOutSet);
+ ((SdStyleSheet*)pStyleSheet)->AdjustToFontHeight(aTempSet);
+
+ // Sonderbehandlung: die INVALIDS auf NULL-Pointer
+ // zurueckgesetzen (sonst landen INVALIDs oder
+ // Pointer auf die DefaultItems in der Vorlage;
+ // beides wuerde die Attribut-Vererbung unterbinden)
+ aTempSet.ClearInvalidItems();
+
+/* altes Bullet ist rausgeflogen
+ // Sonderbehandlung: nur die gueltigen Anteile des
+ // BulletItems
+ if (aTempSet.GetItemState(EE_PARA_BULLET) == SFX_ITEM_SET)
+ {
+ SvxBulletItem aOldBulItem((SvxBulletItem&)pStyleSheet->GetItemSet().Get(EE_PARA_BULLET));
+ SvxBulletItem& rNewBulItem = (SvxBulletItem&)aTempSet.Get(EE_PARA_BULLET);
+ aOldBulItem.CopyValidProperties(rNewBulItem);
+ aTempSet.Put(aOldBulItem);
+ }
+ */
+ if (aTempSet.GetItemState(EE_PARA_NUMBULLET) == SFX_ITEM_SET)
+ {
+ SvxNumRule aRule(*((SvxNumBulletItem*)aTempSet.GetItem(EE_PARA_NUMBULLET))->GetNumRule());
+
+ String aStyleName((SdResId(STR_PSEUDOSHEET_OUTLINE)));
+ aStyleName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " 1" ) );
+ SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( aStyleName, SFX_STYLE_FAMILY_PSEUDO);
+
+ if(pFirstStyleSheet)
+ {
+ pFirstStyleSheet->GetItemSet().Put( SvxNumBulletItem( aRule, EE_PARA_NUMBULLET ));
+ SdStyleSheet* pRealSheet = ((SdStyleSheet*)pFirstStyleSheet)->GetRealStyleSheet();
+ pRealSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
+ }
+
+ aTempSet.ClearItem( EE_PARA_NUMBULLET );
+ }
+
+ pStyleSheet->GetItemSet().Put(aTempSet);
+ SdStyleSheet* pRealSheet =
+ ((SdStyleSheet*)pStyleSheet)->GetRealStyleSheet();
+ pRealSheet->
+ Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
+ }
+ else
+ {
+ // Das ehemals eingebaute PutExtended kann entfernt werden,
+ // da im Vorlagendialog direkt auf dem Set gearbeitet wird
+ //pStyleSheet->GetItemSet().PutExtended(
+ // *pOutSet, SFX_ITEM_DEFAULT, SFX_ITEM_DEFAULT );
+
+ SfxItemSet& rAttr = pStyleSheet->GetItemSet();
+ if ( rAttr.GetItemState( EE_PARA_LRSPACE ) == SFX_ITEM_ON )
+ {
+ // SvxLRSpaceItem hart gesetzt: NumBulletItem anpassen
+
+ if ( aOriSet.GetItemState( EE_PARA_LRSPACE ) != SFX_ITEM_ON ||
+ (const SvxLRSpaceItem&) aOriSet.Get( EE_PARA_LRSPACE ) !=
+ (const SvxLRSpaceItem&) rAttr.Get( EE_PARA_LRSPACE ) )
+ {
+ SvxNumBulletItem aNumBullet( (const SvxNumBulletItem&) rAttr.Get(EE_PARA_NUMBULLET) );
+
+ EditEngine::ImportBulletItem( aNumBullet, 0, NULL,
+ &(const SvxLRSpaceItem&) rAttr.Get( EE_PARA_LRSPACE ) );
+
+ ( (SfxItemSet&) rAttr).Put( aNumBullet );
+ }
+ }
+
+ ( (SfxStyleSheet*) pStyleSheet )->Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
+ }
+ pDoc->SetChanged(TRUE);
+ }
+ break;
+
+ default:
+ {
+ if( nSlotId == SID_STYLE_NEW )
+ pSSPool->Erase( pStyleSheet );
+ delete pStdDlg;
+ delete pPresDlg;
+ }
+ return; // Abbruch
+ }
+ delete pStdDlg;
+ delete pPresDlg;
+ }
+ }
+ break;
+
+ case SID_STYLE_NEW_BY_EXAMPLE:
+ {
+ if( pStyleSheet )
+ {
+ nRetMask = pStyleSheet->GetMask();
+ SfxItemSet aCoreSet( pDoc->GetPool() );
+ pView->GetAttributes( aCoreSet, TRUE );
+
+ // wenn das Objekt eine Vorlage hatte, wird diese Parent
+ // der neuen Vorlage
+ SfxStyleSheet* pOldStyle = pView->GetStyleSheet();
+
+ // Wenn pOldStyle == pStyleSheet -> Rekursion
+ if( pOldStyle != pStyleSheet )
+ {
+ if (pOldStyle)
+ {
+ pStyleSheet->SetParent(pOldStyle->GetName());
+ }
+
+ SfxItemSet* pStyleSet = &pStyleSheet->GetItemSet();
+ pStyleSet->Put(aCoreSet);
+
+ // Vorlage anwenden (Aber nicht, wenn gerade ein Text
+ // editiert wird, denn dazu muesste die Edit Engine
+ // Vorlagen auf Zeichenebene beherrschen.)
+ if (!pView->GetTextEditObject())
+ {
+ pView->SetStyleSheet( (SfxStyleSheet*) pStyleSheet);
+ }
+
+ ( (SfxStyleSheet*) pStyleSheet )->Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
+ pDoc->SetChanged(TRUE);
+
+ SFX_BINDINGS().Invalidate( SID_STYLE_FAMILY2 );
+ }
+ }
+ }
+ break;
+
+ case SID_STYLE_UPDATE_BY_EXAMPLE:
+ {
+ if (pView->HasMarkedObj() &&
+ pView->GetMarkList().GetMarkCount() == 1 ||
+ pView->ISA(SdOutlineView))
+ {
+ pStyleSheet = pView->GetStyleSheet();
+
+ if( pStyleSheet )
+ {
+ nRetMask = pStyleSheet->GetMask();
+ SfxItemSet aCoreSet( pDoc->GetPool() );
+ pView->GetAttributes( aCoreSet );
+
+ SfxItemSet* pStyleSet = &pStyleSheet->GetItemSet();
+ pStyleSet->Put( aCoreSet );
+
+ pView->SetStyleSheet( (SfxStyleSheet*) pStyleSheet);
+
+ ( (SfxStyleSheet*) pStyleSheet )->Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
+ pDoc->SetChanged(TRUE);
+ SFX_BINDINGS().Invalidate( SID_STYLE_FAMILY2 );
+ }
+ }
+ }
+ break;
+
+ }
+ if( nRetMask != 0xffff )
+ rReq.SetReturnValue( SfxUInt16Item( nSlotId, nRetMask ) );
+}
+
+