blob: 5ef3b3f8c4ac2fe00e781629a248b36697d4d144 [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_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)
{
sal_Bool bSetPageID=sal_False;
if (rMEvt.IsLeft() && !rMEvt.IsMod1() && !rMEvt.IsMod2())
{
Point aPosPixel = rMEvt.GetPosPixel();
sal_uInt16 aLayerId = GetPageId( PixelToLogic(aPosPixel) );
if (aLayerId == 0)
{
SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
pDispatcher->Execute(SID_INSERTLAYER, SFX_CALLMODE_SYNCHRON);
bSetPageID=sal_True;
}
else if (rMEvt.IsShift())
{
// Toggle zw. Layer sichtbar / unsichtbar
String aName(GetPageText(aLayerId));
SdrPageView* pPV = pDrViewSh->GetView()->GetSdrPageView();
sal_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() )
{
sal_uInt16 nPageId = SDRPAGE_NOTFOUND;
Point aPos( PixelToLogic( rEvt.maPosPixel ) );
sal_uInt16 nLayerId = pDrViewSh->GetView()->GetDoc()->GetLayerAdmin().GetLayerID( GetPageText( GetPageId( aPos ) ), sal_False );
nRet = pDrViewSh->AcceptDrop( rEvt, *this, NULL, nPageId, nLayerId );
SwitchPage( aPos );
}
return nRet;
}
/*************************************************************************
|*
|* ExecuteDrop-Event
|*
\************************************************************************/
sal_Int8 LayerTabBar::ExecuteDrop( const ExecuteDropEvent& rEvt )
{
sal_uInt16 nPageId = SDRPAGE_NOTFOUND;
sal_uInt16 nLayerId = pDrViewSh->GetView()->GetDoc()->GetLayerAdmin().GetLayerID( GetPageText( GetPageId( PixelToLogic( rEvt.maPosPixel ) ) ), sal_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()
{
sal_Bool bOK = sal_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 = sal_False;
}
else
{
::sd::View* pView = pDrViewSh->GetView();
if ( pView->IsTextEdit() )
{
pView->SdrEndTextEdit();
}
}
return(bOK);
}
/*************************************************************************
|*
\************************************************************************/
long LayerTabBar::AllowRenaming()
{
sal_Bool bOK = sal_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, sal_False ) && aLayerName != aNewName) )
{
// Name ist schon vorhanden
WarningBox aWarningBox( &pDrViewSh->GetViewFrame()->GetWindow(), WinBits( WB_OK ),
String(SdResId( STR_WARN_NAME_DUPLICATE ) ) );
aWarningBox.Execute();
bOK = sal_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 = sal_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, sal_False);
if (pLayer)
{
String aNewName( GetEditText() );
DBG_ASSERT( pDrView, "Rename layer undo action is only working with a SdDrawView" );
if( pDrView )
{
::svl::IUndoManager* 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(sal_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