blob: 9189c0e426c001e5a2818427e7b3cc73b58b23a2 [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"
//------------------------------------------------------------------
#ifdef _MSC_VER
#pragma optimize ("", off)
#endif
// INCLUDE ---------------------------------------------------------------
#include <sfx2/request.hxx>
#include "cellsh.hxx"
#include "tabvwsh.hxx"
#include "global.hxx"
#include "scmod.hxx"
#include "inputhdl.hxx"
#include "inputwin.hxx"
#include "document.hxx"
#include "sc.hrc"
//------------------------------------------------------------------
#define IS_AVAILABLE(WhichId,ppItem) \
(pReqArgs->GetItemState((WhichId), sal_True, ppItem ) == SFX_ITEM_SET)
void ScCellShell::ExecuteCursor( SfxRequest& rReq )
{
ScViewData* pData = GetViewData();
ScTabViewShell* pTabViewShell = pData->GetViewShell();
const SfxItemSet* pReqArgs = rReq.GetArgs();
sal_uInt16 nSlotId = rReq.GetSlot();
SCsCOLROW nRepeat = 1;
sal_Bool bSel = sal_False;
sal_Bool bKeep = sal_False;
if ( pReqArgs != NULL )
{
const SfxPoolItem* pItem;
if( IS_AVAILABLE( FN_PARAM_1, &pItem ) )
nRepeat = static_cast<SCsCOLROW>(((const SfxInt16Item*)pItem)->GetValue());
if( IS_AVAILABLE( FN_PARAM_2, &pItem ) )
bSel = ((const SfxBoolItem*)pItem)->GetValue();
}
else
{
// evaluate locked selection mode
sal_uInt16 nLocked = pTabViewShell->GetLockedModifiers();
if ( nLocked & KEY_SHIFT )
bSel = sal_True; // EXT
else if ( nLocked & KEY_MOD1 )
{
// ADD mode: keep the selection, start a new block when marking with shift again
bKeep = sal_True;
pTabViewShell->SetNewStartIfMarking();
}
}
SCsCOLROW nRTLSign = 1;
if ( pData->GetDocument()->IsLayoutRTL( pData->GetTabNo() ) )
{
//! evaluate cursor movement option?
nRTLSign = -1;
}
// einmal extra, damit der Cursor bei ExecuteInputDirect nicht zuoft gemalt wird:
pTabViewShell->HideAllCursors();
// i123629
if( pTabViewShell->GetCurObjectSelectionType() == OST_Editing )
pTabViewShell->SetForceFocusOnCurCell(sal_True);
else
pTabViewShell->SetForceFocusOnCurCell(sal_False);
//OS: einmal fuer alle wird doch reichen!
pTabViewShell->ExecuteInputDirect();
switch ( nSlotId )
{
case SID_CURSORDOWN:
pTabViewShell->MoveCursorRel( 0, nRepeat, SC_FOLLOW_LINE, bSel, bKeep );
break;
case SID_CURSORBLKDOWN:
pTabViewShell->MoveCursorArea( 0, nRepeat, SC_FOLLOW_JUMP, bSel, bKeep );
break;
case SID_CURSORUP:
pTabViewShell->MoveCursorRel( 0, -nRepeat, SC_FOLLOW_LINE, bSel, bKeep );
break;
case SID_CURSORBLKUP:
pTabViewShell->MoveCursorArea( 0, -nRepeat, SC_FOLLOW_JUMP, bSel, bKeep );
break;
case SID_CURSORLEFT:
pTabViewShell->MoveCursorRel( static_cast<SCsCOL>(-nRepeat * nRTLSign), 0, SC_FOLLOW_LINE, bSel, bKeep );
break;
case SID_CURSORBLKLEFT:
pTabViewShell->MoveCursorArea( static_cast<SCsCOL>(-nRepeat * nRTLSign), 0, SC_FOLLOW_JUMP, bSel, bKeep );
break;
case SID_CURSORRIGHT:
pTabViewShell->MoveCursorRel( static_cast<SCsCOL>(nRepeat * nRTLSign), 0, SC_FOLLOW_LINE, bSel, bKeep );
break;
case SID_CURSORBLKRIGHT:
pTabViewShell->MoveCursorArea( static_cast<SCsCOL>(nRepeat * nRTLSign), 0, SC_FOLLOW_JUMP, bSel, bKeep );
break;
case SID_CURSORPAGEDOWN:
pTabViewShell->MoveCursorPage( 0, nRepeat, SC_FOLLOW_FIX, bSel, bKeep );
break;
case SID_CURSORPAGEUP:
pTabViewShell->MoveCursorPage( 0, -nRepeat, SC_FOLLOW_FIX, bSel, bKeep );
break;
case SID_CURSORPAGERIGHT_: //XXX !!!
pTabViewShell->MoveCursorPage( static_cast<SCsCOL>(nRepeat), 0, SC_FOLLOW_FIX, bSel, bKeep );
break;
case SID_CURSORPAGELEFT_: //XXX !!!
pTabViewShell->MoveCursorPage( static_cast<SCsCOL>(-nRepeat), 0, SC_FOLLOW_FIX, bSel, bKeep );
break;
default:
DBG_ERROR("Unbekannte Message bei ViewShell (Cursor)");
return;
}
pTabViewShell->ShowAllCursors();
rReq.AppendItem( SfxInt16Item(FN_PARAM_1, static_cast<sal_Int16>(nRepeat)) );
rReq.AppendItem( SfxBoolItem(FN_PARAM_2, bSel) );
rReq.Done();
}
void ScCellShell::GetStateCursor( SfxItemSet& /* rSet */ )
{
}
void ScCellShell::ExecuteCursorSel( SfxRequest& rReq )
{
const SfxItemSet* pReqArgs = rReq.GetArgs();
sal_uInt16 nSlotId = rReq.GetSlot();
short nRepeat = 1;
if ( pReqArgs != NULL )
{
const SfxPoolItem* pItem;
if( IS_AVAILABLE( FN_PARAM_1, &pItem ) )
nRepeat = ((const SfxInt16Item*)pItem)->GetValue();
}
switch ( nSlotId )
{
case SID_CURSORDOWN_SEL: rReq.SetSlot( SID_CURSORDOWN ); break;
case SID_CURSORBLKDOWN_SEL: rReq.SetSlot( SID_CURSORBLKDOWN ); break;
case SID_CURSORUP_SEL: rReq.SetSlot( SID_CURSORUP ); break;
case SID_CURSORBLKUP_SEL: rReq.SetSlot( SID_CURSORBLKUP ); break;
case SID_CURSORLEFT_SEL: rReq.SetSlot( SID_CURSORLEFT ); break;
case SID_CURSORBLKLEFT_SEL: rReq.SetSlot( SID_CURSORBLKLEFT ); break;
case SID_CURSORRIGHT_SEL: rReq.SetSlot( SID_CURSORRIGHT ); break;
case SID_CURSORBLKRIGHT_SEL: rReq.SetSlot( SID_CURSORBLKRIGHT ); break;
case SID_CURSORPAGEDOWN_SEL: rReq.SetSlot( SID_CURSORPAGEDOWN ); break;
case SID_CURSORPAGEUP_SEL: rReq.SetSlot( SID_CURSORPAGEUP ); break;
case SID_CURSORPAGERIGHT_SEL: rReq.SetSlot( SID_CURSORPAGERIGHT_ ); break;
case SID_CURSORPAGELEFT_SEL: rReq.SetSlot( SID_CURSORPAGELEFT_ ); break;
default:
DBG_ERROR("Unbekannte Message bei ViewShell (CursorSel)");
return;
}
rReq.AppendItem( SfxInt16Item(FN_PARAM_1, nRepeat ) );
rReq.AppendItem( SfxBoolItem(FN_PARAM_2, sal_True) );
ExecuteSlot( rReq, GetInterface() );
}
void ScCellShell::ExecuteMove( SfxRequest& rReq )
{
ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
sal_uInt16 nSlotId = rReq.GetSlot();
if(nSlotId != SID_CURSORTOPOFSCREEN && nSlotId != SID_CURSORENDOFSCREEN)
pTabViewShell->ExecuteInputDirect();
switch ( nSlotId )
{
case SID_NEXT_TABLE:
case SID_NEXT_TABLE_SEL:
pTabViewShell->SelectNextTab( 1, (nSlotId == SID_NEXT_TABLE_SEL) );
break;
case SID_PREV_TABLE:
case SID_PREV_TABLE_SEL:
pTabViewShell->SelectNextTab( -1, (nSlotId == SID_PREV_TABLE_SEL) );
break;
// Cursorbewegungen in Bloecken gehen nicht von Basic aus,
// weil das ScSbxRange-Objekt bei Eingaben die Markierung veraendert
case SID_NEXT_UNPROTECT:
pTabViewShell->FindNextUnprot( sal_False, !rReq.IsAPI() );
break;
case SID_PREV_UNPROTECT:
pTabViewShell->FindNextUnprot( sal_True, !rReq.IsAPI() );
break;
case SID_CURSORENTERUP:
if (rReq.IsAPI())
pTabViewShell->MoveCursorRel( 0, -1, SC_FOLLOW_LINE, sal_False );
else
pTabViewShell->MoveCursorEnter( sal_True );
break;
case SID_CURSORENTERDOWN:
if (rReq.IsAPI())
pTabViewShell->MoveCursorRel( 0, 1, SC_FOLLOW_LINE, sal_False );
else
pTabViewShell->MoveCursorEnter( sal_False );
break;
case SID_SELECT_COL:
pTabViewShell->MarkColumns();
break;
case SID_SELECT_ROW:
pTabViewShell->MarkRows();
break;
case SID_SELECT_NONE:
pTabViewShell->Unmark();
break;
case SID_ALIGNCURSOR:
pTabViewShell->AlignToCursor( GetViewData()->GetCurX(), GetViewData()->GetCurY(), SC_FOLLOW_JUMP );
break;
case SID_MARKDATAAREA:
pTabViewShell->MarkDataArea();
break;
case SID_MARKARRAYFORMULA:
pTabViewShell->MarkMatrixFormula();
break;
case SID_SETINPUTMODE:
SC_MOD()->SetInputMode( SC_INPUT_TABLE );
break;
case SID_FOCUS_INPUTLINE:
{
ScInputHandler* pHdl = SC_MOD()->GetInputHdl( pTabViewShell );
if (pHdl)
{
ScInputWindow* pWin = pHdl->GetInputWindow();
if (pWin)
pWin->SwitchToTextWin();
}
}
break;
case SID_CURSORTOPOFSCREEN:
pTabViewShell->MoveCursorScreen( 0, -1, SC_FOLLOW_LINE, sal_False );
break;
case SID_CURSORENDOFSCREEN:
pTabViewShell->MoveCursorScreen( 0, 1, SC_FOLLOW_LINE, sal_False );
break;
default:
DBG_ERROR("Unbekannte Message bei ViewShell (Cursor)");
return;
}
rReq.Done();
}
void ScCellShell::ExecutePageSel( SfxRequest& rReq )
{
sal_uInt16 nSlotId = rReq.GetSlot();
switch ( nSlotId )
{
case SID_CURSORHOME_SEL: rReq.SetSlot( SID_CURSORHOME ); break;
case SID_CURSOREND_SEL: rReq.SetSlot( SID_CURSOREND ); break;
case SID_CURSORTOPOFFILE_SEL: rReq.SetSlot( SID_CURSORTOPOFFILE ); break;
case SID_CURSORENDOFFILE_SEL: rReq.SetSlot( SID_CURSORENDOFFILE ); break;
default:
DBG_ERROR("Unbekannte Message bei ViewShell (ExecutePageSel)");
return;
}
rReq.AppendItem( SfxBoolItem(FN_PARAM_2, sal_True) );
ExecuteSlot( rReq, GetInterface() );
}
void ScCellShell::ExecutePage( SfxRequest& rReq )
{
ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
const SfxItemSet* pReqArgs = rReq.GetArgs();
sal_uInt16 nSlotId = rReq.GetSlot();
sal_Bool bSel = sal_False;
sal_Bool bKeep = sal_False;
if ( pReqArgs != NULL )
{
const SfxPoolItem* pItem;
if( IS_AVAILABLE( FN_PARAM_2, &pItem ) )
bSel = ((const SfxBoolItem*)pItem)->GetValue();
}
else
{
// evaluate locked selection mode
sal_uInt16 nLocked = pTabViewShell->GetLockedModifiers();
if ( nLocked & KEY_SHIFT )
bSel = sal_True; // EXT
else if ( nLocked & KEY_MOD1 )
{
// ADD mode: keep the selection, start a new block when marking with shift again
bKeep = sal_True;
pTabViewShell->SetNewStartIfMarking();
}
}
pTabViewShell->ExecuteInputDirect();
switch ( nSlotId )
{
case SID_CURSORHOME:
pTabViewShell->MoveCursorEnd( -1, 0, SC_FOLLOW_LINE, bSel, bKeep );
break;
case SID_CURSOREND:
pTabViewShell->MoveCursorEnd( 1, 0, SC_FOLLOW_JUMP, bSel, bKeep );
break;
case SID_CURSORTOPOFFILE:
pTabViewShell->MoveCursorEnd( -1, -1, SC_FOLLOW_LINE, bSel, bKeep );
break;
case SID_CURSORENDOFFILE:
pTabViewShell->MoveCursorEnd( 1, 1, SC_FOLLOW_JUMP, bSel, bKeep );
break;
default:
DBG_ERROR("Unbekannte Message bei ViewShell (ExecutePage)");
return;
}
rReq.AppendItem( SfxBoolItem(FN_PARAM_2, bSel) );
rReq.Done();
}