blob: 890e76eaa8984301d0c368375e42b630ef3f630c [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_sc.hxx"
#include <sfx2/dispatch.hxx>
#include <sfx2/viewfrm.hxx>
#include "fumark.hxx"
#include "sc.hrc"
#include "tabvwsh.hxx"
#include "scmod.hxx"
#include "reffact.hxx"
#include "document.hxx"
#include "scresid.hxx"
#include "drawview.hxx"
//------------------------------------------------------------------
/*************************************************************************
|*
|* Funktion zum Aufziehen eines Rechtecks
|*
\************************************************************************/
FuMarkRect::FuMarkRect(ScTabViewShell* pViewSh, Window* pWin, ScDrawView* pViewP,
SdrModel* pDoc, SfxRequest& rReq) :
FuPoor(pViewSh, pWin, pViewP, pDoc, rReq),
bVisible(sal_False),
bStartDrag(sal_False)
{
}
/*************************************************************************
|*
|* Destruktor
|*
\************************************************************************/
FuMarkRect::~FuMarkRect()
{
}
/*************************************************************************
|*
|* MouseButtonDown-event
|*
\************************************************************************/
sal_Bool FuMarkRect::MouseButtonDown(const MouseEvent& rMEvt)
{
// #95491# remember button state for creation of own MouseEvents
SetMouseButtonCode(rMEvt.GetButtons());
pWindow->CaptureMouse();
pView->UnmarkAll(); // der Einheitlichkeit halber und wegen #50558#
bStartDrag = sal_True;
aBeginPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() );
aZoomRect = Rectangle( aBeginPos, Size() );
return sal_True;
}
/*************************************************************************
|*
|* MouseMove-event
|*
\************************************************************************/
sal_Bool FuMarkRect::MouseMove(const MouseEvent& rMEvt)
{
if ( bStartDrag )
{
if ( bVisible )
pViewShell->DrawMarkRect(aZoomRect);
Point aPixPos= rMEvt.GetPosPixel();
ForceScroll(aPixPos);
Point aEndPos = pWindow->PixelToLogic(aPixPos);
Rectangle aRect(aBeginPos, aEndPos);
aZoomRect = aRect;
aZoomRect.Justify();
pViewShell->DrawMarkRect(aZoomRect);
bVisible = sal_True;
}
ForcePointer(&rMEvt);
return bStartDrag;
}
/*************************************************************************
|*
|* MouseButtonUp-event
|*
\************************************************************************/
sal_Bool FuMarkRect::MouseButtonUp(const MouseEvent& rMEvt)
{
// #95491# remember button state for creation of own MouseEvents
SetMouseButtonCode(rMEvt.GetButtons());
if ( bVisible )
{
// Hide ZoomRect
pViewShell->DrawMarkRect(aZoomRect);
bVisible = sal_False;
}
Size aZoomSizePixel = pWindow->LogicToPixel(aZoomRect).GetSize();
sal_uInt16 nMinMove = pView->GetMinMoveDistancePixel();
if ( aZoomSizePixel.Width() < nMinMove || aZoomSizePixel.Height() < nMinMove )
{
// Klick auf der Stelle
aZoomRect.SetSize(Size()); // dann ganz leer
}
bStartDrag = sal_False;
pWindow->ReleaseMouse();
pViewShell->GetViewData()->GetDispatcher().
Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD);
// Daten an der View merken
pViewShell->SetChartArea( aSourceRange, aZoomRect );
// Chart-Dialog starten:
// sal_uInt16 nId = ScChartDlgWrapper::GetChildWindowId();
// SfxChildWindow* pWnd = pViewShell->GetViewFrame()->GetChildWindow( nId );
// SC_MOD()->SetRefDialog( nId, pWnd ? sal_False : sal_True );
return sal_True;
}
/*************************************************************************
|*
|* Command-event
|*
\************************************************************************/
sal_uInt8 FuMarkRect::Command(const CommandEvent& rCEvt)
{
if ( COMMAND_STARTDRAG == rCEvt.GetCommand() )
{
// #29877# nicht anfangen, auf der Tabelle rumzudraggen,
// aber Maus-Status nicht zuruecksetzen
return SC_CMD_IGNORE;
}
else
return FuPoor::Command(rCEvt);
}
/*************************************************************************
|*
|* Tastaturereignisse bearbeiten
|*
|* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
|* FALSE.
|*
\************************************************************************/
sal_Bool FuMarkRect::KeyInput(const KeyEvent& rKEvt)
{
sal_Bool bReturn = sal_False;
switch ( rKEvt.GetKeyCode().GetCode() )
{
case KEY_ESCAPE:
// beenden
pViewShell->GetViewData()->GetDispatcher().
Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
bReturn = sal_True;
break;
}
if (!bReturn)
{
bReturn = FuPoor::KeyInput(rKEvt);
}
return (bReturn);
}
/*************************************************************************
|*
|* Vor dem Scrollen Selektionsdarstellung ausblenden
|*
\************************************************************************/
void FuMarkRect::ScrollStart()
{
}
/*************************************************************************
|*
|* Nach dem Scrollen Selektionsdarstellung wieder anzeigen
|*
\************************************************************************/
void FuMarkRect::ScrollEnd()
{
}
/*************************************************************************
|*
|* Function aktivieren
|*
\************************************************************************/
void FuMarkRect::Activate()
{
FuPoor::Activate();
// Markierung merken, bevor evtl. Tabelle umgeschaltet wird
ScViewData* pViewData = pViewShell->GetViewData();
ScMarkData& rMark = pViewData->GetMarkData();
if ( !rMark.IsMultiMarked() && !rMark.IsMarked() )
pViewShell->MarkDataArea( sal_True );
pViewData->GetMultiArea( aSourceRange ); // Mehrfachselektion erlaubt
// pViewShell->Unmark();
ForcePointer(NULL);
}
/*************************************************************************
|*
|* Function deaktivieren
|*
\************************************************************************/
void FuMarkRect::Deactivate()
{
FuPoor::Deactivate();
if (bVisible)
{
// Hide ZoomRect
pViewShell->DrawMarkRect(aZoomRect);
bVisible = sal_False;
bStartDrag = sal_False;
}
}
/*************************************************************************
|*
|* Maus-Pointer umschalten
|*
\************************************************************************/
void FuMarkRect::ForcePointer(const MouseEvent* /* pMEvt */)
{
pViewShell->SetActivePointer( Pointer( POINTER_CHART ) );
}