blob: 063f23940c2e8ed550dfb92778722293eac57dda [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_sw.hxx"
#include <sfx2/request.hxx>
#include <svl/eitem.hxx>
#ifndef __SBX_SBXVARIABLE_HXX //autogen
#include <basic/sbxvar.hxx>
#endif
#include <sfx2/viewfrm.hxx>
#include <sfx2/bindings.hxx>
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#include <wrtsh.hxx>
#ifndef _TEXTSH_HXX
#include <textsh.hxx>
#endif
#include <num.hxx>
#include <edtwin.hxx>
#include <crsskip.hxx>
#include <doc.hxx>
#include <docsh.hxx>
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#include <globals.h>
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#include <svx/svdouno.hxx>
#include <svx/fmshell.hxx>
#include <svx/sdrobjectfilter.hxx>
using namespace ::com::sun::star;
void SwTextShell::ExecBasicMove(SfxRequest &rReq)
{
SwWrtShell &rSh = GetShell();
GetView().GetEditWin().FlushInBuffer();
const SfxItemSet *pArgs = rReq.GetArgs();
sal_Bool bSelect = sal_False;
sal_uInt16 nCount = 1;
if(pArgs)
{
const SfxPoolItem *pItem;
if(SFX_ITEM_SET == pArgs->GetItemState(FN_PARAM_MOVE_COUNT, sal_True, &pItem))
nCount = ((const SfxInt16Item *)pItem)->GetValue();
if(SFX_ITEM_SET == pArgs->GetItemState(FN_PARAM_MOVE_SELECTION, sal_True, &pItem))
bSelect = ((const SfxBoolItem *)pItem)->GetValue();
}
switch(rReq.GetSlot())
{
case FN_CHAR_LEFT_SEL: rReq.SetSlot( FN_CHAR_LEFT ); bSelect = sal_True; break;
case FN_CHAR_RIGHT_SEL: rReq.SetSlot( FN_CHAR_RIGHT ); bSelect = sal_True; break;
case FN_LINE_UP_SEL: rReq.SetSlot( FN_LINE_UP ); bSelect = sal_True; break;
case FN_LINE_DOWN_SEL: rReq.SetSlot( FN_LINE_DOWN ); bSelect = sal_True; break;
}
uno::Reference< frame::XDispatchRecorder > xRecorder =
GetView().GetViewFrame()->GetBindings().GetRecorder();
if ( xRecorder.is() )
{
rReq.AppendItem( SfxInt16Item(FN_PARAM_MOVE_COUNT, nCount) );
rReq.AppendItem( SfxBoolItem(FN_PARAM_MOVE_SELECTION, bSelect) );
}
sal_uInt16 nSlot = rReq.GetSlot();
rReq.Done();
// Get EditWin before calling the move functions (shell change may occur!)
SwEditWin& rTmpEditWin = GetView().GetEditWin();
for( sal_uInt16 i = 0; i < nCount; i++ )
{
switch(nSlot)
{
case FN_CHAR_LEFT: rSh.Left( CRSR_SKIP_CELLS, bSelect, 1, sal_False, sal_True ); break;
case FN_CHAR_RIGHT: rSh.Right( CRSR_SKIP_CELLS, bSelect, 1, sal_False, sal_True ); break;
case FN_LINE_UP: rSh.Up ( bSelect, 1 ); break;
case FN_LINE_DOWN: rSh.Down ( bSelect, 1 ); break;
default: ASSERT(sal_False, falscher Dispatcher); return;
}
}
//#i42732# - notify the edit window that from now on we do not use the input language
rTmpEditWin.SetUseInputLanguage( sal_False );
}
void SwTextShell::ExecMove(SfxRequest &rReq)
{
SwWrtShell &rSh = GetShell();
SwEditWin& rTmpEditWin = GetView().GetEditWin();
rTmpEditWin.FlushInBuffer();
sal_uInt16 nSlot = rReq.GetSlot();
sal_Bool bRet = sal_False;
switch ( nSlot )
{
case FN_START_OF_LINE_SEL:
case FN_START_OF_LINE: bRet = rSh.LeftMargin ( FN_START_OF_LINE_SEL == nSlot, sal_False );
break;
case FN_END_OF_LINE_SEL:
case FN_END_OF_LINE: bRet = rSh.RightMargin( FN_END_OF_LINE_SEL == nSlot, sal_False );
break;
case FN_START_OF_DOCUMENT_SEL:
case FN_START_OF_DOCUMENT: bRet = rSh.SttDoc ( FN_START_OF_DOCUMENT_SEL == nSlot);
break;
case FN_END_OF_DOCUMENT_SEL:
case FN_END_OF_DOCUMENT: bRet = rSh.EndDoc( FN_END_OF_DOCUMENT_SEL == nSlot );
break;
case FN_SELECT_WORD: bRet = rSh.SelNearestWrd(); break;
case SID_SELECTALL: bRet = 0 != rSh.SelAll(); break;
default: ASSERT(sal_False, falscher Dispatcher); return;
}
if ( bRet )
rReq.Done();
else
rReq.Ignore();
//#i42732# - notify the edit window that from now on we do not use the input language
rTmpEditWin.SetUseInputLanguage( sal_False );
}
void SwTextShell::ExecMovePage(SfxRequest &rReq)
{
SwWrtShell &rSh = GetShell();
GetView().GetEditWin().FlushInBuffer();
sal_uInt16 nSlot = rReq.GetSlot();
switch( nSlot )
{
case FN_START_OF_NEXT_PAGE_SEL :
case FN_START_OF_NEXT_PAGE: rSh.SttNxtPg( FN_START_OF_NEXT_PAGE_SEL == nSlot ); break;
case FN_END_OF_NEXT_PAGE_SEL:
case FN_END_OF_NEXT_PAGE: rSh.EndNxtPg( FN_END_OF_NEXT_PAGE_SEL == nSlot ); break;
case FN_START_OF_PREV_PAGE_SEL:
case FN_START_OF_PREV_PAGE: rSh.SttPrvPg( FN_START_OF_PREV_PAGE_SEL == nSlot ); break;
case FN_END_OF_PREV_PAGE_SEL:
case FN_END_OF_PREV_PAGE: rSh.EndPrvPg( FN_END_OF_PREV_PAGE_SEL == nSlot ); break;
case FN_START_OF_PAGE_SEL:
case FN_START_OF_PAGE: rSh.SttPg ( FN_START_OF_PAGE_SEL == nSlot ); break;
case FN_END_OF_PAGE_SEL:
case FN_END_OF_PAGE: rSh.EndPg ( FN_END_OF_PAGE_SEL == nSlot ); break;
default: ASSERT(sal_False, falscher Dispatcher); return;
}
rReq.Done();
}
void SwTextShell::ExecMoveCol(SfxRequest &rReq)
{
SwWrtShell &rSh = GetShell();
switch ( rReq.GetSlot() )
{
case FN_START_OF_COLUMN: rSh.StartOfColumn ( sal_False ); break;
case FN_END_OF_COLUMN: rSh.EndOfColumn ( sal_False ); break;
case FN_START_OF_NEXT_COLUMN: rSh.StartOfNextColumn( sal_False ) ; break;
case FN_END_OF_NEXT_COLUMN: rSh.EndOfNextColumn ( sal_False ); break;
case FN_START_OF_PREV_COLUMN: rSh.StartOfPrevColumn( sal_False ); break;
case FN_END_OF_PREV_COLUMN: rSh.EndOfPrevColumn ( sal_False ); break;
default: ASSERT(sal_False, falscher Dispatcher); return;
}
rReq.Done();
}
void SwTextShell::ExecMoveLingu(SfxRequest &rReq)
{
SwWrtShell &rSh = GetShell();
GetView().GetEditWin().FlushInBuffer();
sal_uInt16 nSlot = rReq.GetSlot();
sal_Bool bRet = sal_False;
switch ( nSlot )
{
case FN_NEXT_WORD_SEL:
case FN_NEXT_WORD: bRet = rSh.NxtWrd( FN_NEXT_WORD_SEL == nSlot );
break;
case FN_START_OF_PARA_SEL:
case FN_START_OF_PARA: bRet = rSh.SttPara( FN_START_OF_PARA_SEL == nSlot );
break;
case FN_END_OF_PARA_SEL:
case FN_END_OF_PARA: bRet = rSh.EndPara( FN_END_OF_PARA_SEL == nSlot );
break;
case FN_PREV_WORD_SEL:
case FN_PREV_WORD: bRet = rSh.PrvWrd( FN_PREV_WORD_SEL == nSlot );
break;
case FN_NEXT_SENT_SEL:
case FN_NEXT_SENT: bRet = rSh.FwdSentence( FN_NEXT_SENT_SEL == nSlot );
break;
case FN_PREV_SENT_SEL:
case FN_PREV_SENT: bRet = rSh.BwdSentence( FN_PREV_SENT_SEL == nSlot );
break;
case FN_NEXT_PARA: bRet = rSh.FwdPara ( sal_False );
break;
case FN_PREV_PARA: bRet = rSh.BwdPara ( sal_False );
break;
default: ASSERT(sal_False, falscher Dispatcher); return;
}
rReq.Done();
}
void SwTextShell::ExecMoveMisc(SfxRequest &rReq)
{
SwWrtShell &rSh = GetShell();
sal_uInt16 nSlot = rReq.GetSlot();
sal_Bool bSetRetVal = sal_True, bRet = sal_True;
switch ( nSlot )
{
case SID_FM_TOGGLECONTROLFOCUS:
{
const SwDoc* pDoc = rSh.GetDoc();
const SwDocShell* pDocShell = pDoc ? pDoc->GetDocShell() : NULL;
const SwView* pView = pDocShell ? pDocShell->GetView() : NULL;
const FmFormShell* pFormShell = pView ? pView->GetFormShell() : NULL;
SdrView* pDrawView = pView ? pView->GetDrawView() : NULL;
Window* pWindow = pView ? pView->GetWrtShell().GetWin() : NULL;
OSL_ENSURE( pFormShell && pDrawView && pWindow, "SwXTextView::ExecMoveMisc: no chance!" );
if ( !pFormShell || !pDrawView || !pWindow )
break;
::std::auto_ptr< ::svx::ISdrObjectFilter > pFilter( pFormShell->CreateFocusableControlFilter(
*pDrawView, *pWindow ) );
if ( !pFilter.get() )
break;
const SdrObject* pNearestControl = rSh.GetBestObject( sal_True, GOTOOBJ_DRAW_CONTROL, sal_False, pFilter.get() );
if ( !pNearestControl )
break;
const SdrUnoObj* pUnoObject = dynamic_cast< const SdrUnoObj* >( pNearestControl );
OSL_ENSURE( pUnoObject, "SwTextShell::ExecMoveMisc: GetBestObject returned nonsense!" );
if ( !pUnoObject )
break;
pFormShell->ToggleControlFocus( *pUnoObject, *pDrawView, *pWindow );
}
break;
case FN_CNTNT_TO_NEXT_FRAME:
bRet = rSh.GotoObj(sal_True, GOTOOBJ_GOTO_ANY);
if(bRet)
{
rSh.HideCrsr();
rSh.EnterSelFrmMode();
}
break;
case FN_NEXT_FOOTNOTE:
rSh.MoveCrsr();
bRet = rSh.GotoNextFtnAnchor();
break;
case FN_PREV_FOOTNOTE:
rSh.MoveCrsr();
bRet = rSh.GotoPrevFtnAnchor();
break;
case FN_TO_HEADER:
rSh.MoveCrsr();
if ( FRMTYPE_HEADER & rSh.GetFrmType(0,sal_False) )
rSh.SttPg();
else
rSh.GotoHeaderTxt();
bSetRetVal = sal_False;
break;
case FN_TO_FOOTER:
rSh.MoveCrsr();
if ( FRMTYPE_FOOTER & rSh.GetFrmType(0,sal_False) )
rSh.EndPg();
else
rSh.GotoFooterTxt();
bSetRetVal = sal_False;
break;
case FN_FOOTNOTE_TO_ANCHOR:
rSh.MoveCrsr();
if ( FRMTYPE_FOOTNOTE & rSh.GetFrmType(0,sal_False) )
rSh.GotoFtnAnchor();
else
rSh.GotoFtnTxt();
bSetRetVal = sal_False;
break;
case FN_TO_FOOTNOTE_AREA :
rSh.GotoFtnTxt();
break;
case FN_PREV_TABLE:
bRet = rSh.MoveTable( fnTablePrev, fnTableStart);
break;
case FN_NEXT_TABLE:
bRet = rSh.MoveTable(fnTableNext, fnTableStart);
break;
case FN_GOTO_NEXT_REGION :
bRet = rSh.MoveRegion(fnRegionNext, fnRegionStart);
break;
case FN_GOTO_PREV_REGION :
bRet = rSh.MoveRegion(fnRegionPrev, fnRegionStart);
break;
case FN_NEXT_TOXMARK:
bRet = rSh.GotoNxtPrvTOXMark( sal_True );
break;
case FN_PREV_TOXMARK:
bRet = rSh.GotoNxtPrvTOXMark( sal_False );
break;
case FN_NEXT_TBLFML:
bRet = rSh.GotoNxtPrvTblFormula( sal_True, sal_False );
break;
case FN_PREV_TBLFML:
bRet = rSh.GotoNxtPrvTblFormula( sal_False, sal_False );
break;
case FN_NEXT_TBLFML_ERR:
bRet = rSh.GotoNxtPrvTblFormula( sal_True, sal_True );
break;
case FN_PREV_TBLFML_ERR:
bRet = rSh.GotoNxtPrvTblFormula( sal_False, sal_True );
break;
default:
ASSERT(sal_False, falscher Dispatcher);
return;
}
if( bSetRetVal )
rReq.SetReturnValue(SfxBoolItem( nSlot, bRet ));
rReq.Done();
}