diff options
Diffstat (limited to 'sd/source/ui/dlg/LayerTabBar.cxx')
-rw-r--r-- | sd/source/ui/dlg/LayerTabBar.cxx | 383 |
1 files changed, 383 insertions, 0 deletions
diff --git a/sd/source/ui/dlg/LayerTabBar.cxx b/sd/source/ui/dlg/LayerTabBar.cxx new file mode 100644 index 000000000000..29425a3bda71 --- /dev/null +++ b/sd/source/ui/dlg/LayerTabBar.cxx @@ -0,0 +1,383 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sd.hxx" + +#include "LayerTabBar.hxx" +#include <svx/svdlayer.hxx> +#include <svx/svdpagv.hxx> +#include <vcl/msgbox.hxx> +#include <sfx2/dispatch.hxx> + + +#include "sdattr.hxx" +#include "app.hxx" +#include "helpids.h" +#include "app.hrc" +#include "glob.hrc" +#include "strings.hrc" +#include "res_bmp.hrc" +#include "DrawViewShell.hxx" +#include "Window.hxx" +#include "View.hxx" +#include "drawdoc.hxx" +#include "sdresid.hxx" +#include "DrawDocShell.hxx" +#include "drawview.hxx" +#include "undolayer.hxx" + + +namespace sd { + +#define SWITCH_TIMEOUT 20 + + +/************************************************************************* +|* +|* Standard-Konstruktor +|* +\************************************************************************/ + +LayerTabBar::LayerTabBar(DrawViewShell* pViewSh, Window* pParent) + : TabBar( pParent, WinBits( WB_BORDER | WB_3DLOOK | WB_SCROLL | WB_SIZEABLE ) ), + DropTargetHelper( this ), + pDrViewSh(pViewSh) +{ + EnableEditMode(); + SetSizePixel(Size(0, 0)); + SetMaxPageWidth( 150 ); + SetHelpId( HID_SD_TABBAR_LAYERS ); +} + + +LayerTabBar::LayerTabBar ( + DrawViewShell* pViewSh, + Window* pParent, + const ResId& rResId) + : TabBar (pParent, rResId.GetWinBits()), + DropTargetHelper( this ), + pDrViewSh(pViewSh) +{ + EnableEditMode(); +} + +/************************************************************************* +|* +|* Destruktor +|* +\************************************************************************/ + +LayerTabBar::~LayerTabBar() +{ +} + +/************************************************************************* +|* +\************************************************************************/ + +void LayerTabBar::Select() +{ + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute(SID_SWITCHLAYER, SFX_CALLMODE_ASYNCHRON); +} + +/************************************************************************* +|* +\************************************************************************/ + +void LayerTabBar::MouseButtonDown(const MouseEvent& rMEvt) +{ + BOOL bSetPageID=FALSE; + + if (rMEvt.IsLeft() && !rMEvt.IsMod1() && !rMEvt.IsMod2()) + { + Point aPosPixel = rMEvt.GetPosPixel(); + USHORT aLayerId = GetPageId( PixelToLogic(aPosPixel) ); + + if (aLayerId == 0) + { + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute(SID_INSERTLAYER, SFX_CALLMODE_SYNCHRON); + + bSetPageID=TRUE; + } + else if (rMEvt.IsShift()) + { + // Toggle zw. Layer sichtbar / unsichtbar + String aName(GetPageText(aLayerId)); + SdrPageView* pPV = pDrViewSh->GetView()->GetSdrPageView(); + BOOL bVisible = pPV->IsLayerVisible(aName); + pPV->SetLayerVisible(aName, !bVisible); + pDrViewSh->ResetActualLayer(); + } + } + + // If you insert a new layer you must not call TabBar::MouseButtonDown(rMEvt); + // because you want to activate the new layer + if( !bSetPageID ) + TabBar::MouseButtonDown(rMEvt); +} + +/************************************************************************* +|* +\************************************************************************/ + +void LayerTabBar::DoubleClick() +{ + if (GetCurPageId() != 0) + { + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute( SID_MODIFYLAYER, SFX_CALLMODE_SYNCHRON ); + } +} + + +/************************************************************************* +|* +|* AcceptDrop-Event +|* +\************************************************************************/ + +sal_Int8 LayerTabBar::AcceptDrop( const AcceptDropEvent& rEvt ) +{ + sal_Int8 nRet = DND_ACTION_NONE; + + if( rEvt.mbLeaving ) + EndSwitchPage(); + + if( !pDrViewSh->GetDocSh()->IsReadOnly() ) + { + USHORT nPageId = SDRPAGE_NOTFOUND; + Point aPos( PixelToLogic( rEvt.maPosPixel ) ); + USHORT nLayerId = pDrViewSh->GetView()->GetDoc()->GetLayerAdmin().GetLayerID( GetPageText( GetPageId( aPos ) ), FALSE ); + + nRet = pDrViewSh->AcceptDrop( rEvt, *this, NULL, nPageId, nLayerId ); + + SwitchPage( aPos ); + } + + return nRet; +} + +/************************************************************************* +|* +|* ExecuteDrop-Event +|* +\************************************************************************/ + +sal_Int8 LayerTabBar::ExecuteDrop( const ExecuteDropEvent& rEvt ) +{ + USHORT nPageId = SDRPAGE_NOTFOUND; + USHORT nLayerId = pDrViewSh->GetView()->GetDoc()->GetLayerAdmin().GetLayerID( GetPageText( GetPageId( PixelToLogic( rEvt.maPosPixel ) ) ), FALSE ); + sal_Int8 nRet = pDrViewSh->ExecuteDrop( rEvt, *this, NULL, nPageId, nLayerId ); + + EndSwitchPage(); + + return nRet; + +} + +/************************************************************************* +|* +\************************************************************************/ + +void LayerTabBar::Command(const CommandEvent& rCEvt) +{ + if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU ) + { + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->ExecutePopup(SdResId(RID_LAYERTAB_POPUP)); + } +} + + +/************************************************************************* +|* +\************************************************************************/ +long LayerTabBar::StartRenaming() +{ + BOOL bOK = TRUE; + String aLayerName = GetPageText( GetEditPageId() ); + String aLayoutLayer ( SdResId(STR_LAYER_LAYOUT) ); + String aControlsLayer ( SdResId(STR_LAYER_CONTROLS) ); + String aMeasureLinesLayer ( SdResId(STR_LAYER_MEASURELINES) ); + String aBackgroundLayer( SdResId(STR_LAYER_BCKGRND) ); + String aBackgroundObjLayer( SdResId(STR_LAYER_BCKGRNDOBJ) ); + + if ( aLayerName == aLayoutLayer || aLayerName == aControlsLayer || + aLayerName == aMeasureLinesLayer || + aLayerName == aBackgroundLayer || aLayerName == aBackgroundObjLayer ) + { + // Diese Namen duerfen nicht veraendert werden + bOK = FALSE; + } + else + { + ::sd::View* pView = pDrViewSh->GetView(); + + if ( pView->IsTextEdit() ) + { + pView->SdrEndTextEdit(); + } + } + + return(bOK); +} + +/************************************************************************* +|* +\************************************************************************/ + +long LayerTabBar::AllowRenaming() +{ + BOOL bOK = TRUE; + + // Ueberpruefung auf schon vorhandene Namen + ::sd::View* pView = pDrViewSh->GetView(); + SdDrawDocument* pDoc = pView->GetDoc(); + String aLayerName = pView->GetActiveLayer(); + SdrLayerAdmin& rLayerAdmin = pDoc->GetLayerAdmin(); + String aNewName( GetEditText() ); + + if ( aNewName.Len() == 0 || + (rLayerAdmin.GetLayer( aNewName, FALSE ) && aLayerName != aNewName) ) + { + // Name ist schon vorhanden + WarningBox aWarningBox( &pDrViewSh->GetViewFrame()->GetWindow(), WinBits( WB_OK ), + String(SdResId( STR_WARN_NAME_DUPLICATE ) ) ); + aWarningBox.Execute(); + bOK = FALSE; + } + + if (bOK) + { + String aLayoutLayer ( SdResId(STR_LAYER_LAYOUT) ); + String aControlsLayer ( SdResId(STR_LAYER_CONTROLS) ); + String aMeasureLinesLayer ( SdResId(STR_LAYER_MEASURELINES) ); + String aBackgroundLayer( SdResId(STR_LAYER_BCKGRND) ); + String aBackgroundObjLayer( SdResId(STR_LAYER_BCKGRNDOBJ) ); + + if ( aNewName == aLayoutLayer || aNewName == aControlsLayer || + aNewName == aMeasureLinesLayer || + aNewName == aBackgroundLayer || aNewName == aBackgroundObjLayer ) + { + // Diese Namen duerfen nicht vergeben werden + bOK = FALSE; + } + } + + return(bOK); +} + +/************************************************************************* +|* +\************************************************************************/ + +void LayerTabBar::EndRenaming() +{ + if( !IsEditModeCanceled() ) + { + ::sd::View* pView = pDrViewSh->GetView(); + DrawView* pDrView = PTR_CAST( DrawView, pView ); + + SdDrawDocument* pDoc = pView->GetDoc(); + String aLayerName = pView->GetActiveLayer(); + SdrLayerAdmin& rLayerAdmin = pDoc->GetLayerAdmin(); + SdrLayer* pLayer = rLayerAdmin.GetLayer(aLayerName, FALSE); + + if (pLayer) + { + String aNewName( GetEditText() ); + + DBG_ASSERT( pDrView, "Rename layer undo action is only working with a SdDrawView" ); + if( pDrView ) + { + SfxUndoManager* pManager = pDoc->GetDocSh()->GetUndoManager(); + SdLayerModifyUndoAction* pAction = new SdLayerModifyUndoAction( + pDoc, + pLayer, + aLayerName, + pLayer->GetTitle(), + pLayer->GetDescription(), + pDrView->IsLayerVisible(aLayerName), + pDrView->IsLayerLocked(aLayerName), + pDrView->IsLayerPrintable(aLayerName), + aNewName, + pLayer->GetTitle(), + pLayer->GetDescription(), + pDrView->IsLayerVisible(aLayerName), + pDrView->IsLayerLocked(aLayerName), + pDrView->IsLayerPrintable(aLayerName) + ); + pManager->AddUndoAction( pAction ); + } + + // Zuerst View benachrichtigen, da innerhalb von SetName() schon + // ResetActualLayer() gerufen wird und an der View der Layer dann + // schon bekannt sein muss. + pView->SetActiveLayer(aNewName); + pLayer->SetName(aNewName); + pDoc->SetChanged(TRUE); + } + } +} + + +/************************************************************************* +|* +\************************************************************************/ + +void LayerTabBar::ActivatePage() +{ + if ( /*IsInSwitching*/ 1 && pDrViewSh!=NULL) + { + + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute(SID_SWITCHLAYER, SFX_CALLMODE_ASYNCHRON); + } +} + + + + +void LayerTabBar::SendActivatePageEvent (void) +{ + CallEventListeners (VCLEVENT_TABBAR_PAGEACTIVATED, + reinterpret_cast<void*>(GetCurPageId())); +} + + + + +void LayerTabBar::SendDeactivatePageEvent (void) +{ + CallEventListeners (VCLEVENT_TABBAR_PAGEDEACTIVATED, + reinterpret_cast<void*>(GetCurPageId())); +} + +} // end of namespace sd |