office-gobmx/sd/source/ui/dlg/LayerTabBar.cxx
2010-04-13 12:10:03 +02:00

383 lines
12 KiB
C++

/*************************************************************************
*
* 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