renames the most annoying abbreviations in Writer (and partially in the shared code too). Change-Id: I9a62759138126c1537cc5c985ba05cf54d6132d9
979 lines
25 KiB
C++
979 lines
25 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* 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 .
|
|
*/
|
|
|
|
#include <limits.h>
|
|
#include <hintids.hxx>
|
|
#include <sfx2/bindings.hxx>
|
|
#include <svl/eitem.hxx>
|
|
#include <svl/macitem.hxx>
|
|
#include <unotools/charclass.hxx>
|
|
#include <editeng/scripttypeitem.hxx>
|
|
#include <cmdid.h>
|
|
#include <view.hxx>
|
|
#include <basesh.hxx>
|
|
#include <wrtsh.hxx>
|
|
#include <frmatr.hxx>
|
|
#include <initui.hxx>
|
|
#include <mdiexp.hxx>
|
|
#include <fmtcol.hxx>
|
|
#include <frmfmt.hxx>
|
|
#include <swundo.hxx>
|
|
#include <swevent.hxx>
|
|
#include <swdtflvr.hxx>
|
|
#include <crsskip.hxx>
|
|
#include <doc.hxx>
|
|
#include <wordcountdialog.hxx>
|
|
#include <boost/scoped_ptr.hpp>
|
|
|
|
namespace com { namespace sun { namespace star { namespace util {
|
|
struct SearchOptions;
|
|
} } } }
|
|
|
|
using namespace ::com::sun::star::util;
|
|
|
|
static long nStartDragX = 0, nStartDragY = 0;
|
|
static bool bStartDrag = false;
|
|
|
|
void SwWrtShell::Invalidate()
|
|
{
|
|
// to avoid making the slot volatile, invalidate it every time if something could have been changed
|
|
// this is still much cheaper than asking for the state every 200 ms (and avoid background processing)
|
|
GetView().GetViewFrame()->GetBindings().Invalidate( FN_STAT_SELMODE );
|
|
SwWordCountWrapper *pWrdCnt = static_cast<SwWordCountWrapper*>(GetView().GetViewFrame()->GetChildWindow(SwWordCountWrapper::GetChildWindowId()));
|
|
if (pWrdCnt)
|
|
pWrdCnt->UpdateCounts();
|
|
}
|
|
|
|
bool SwWrtShell::SelNearestWrd()
|
|
{
|
|
SwMvContext aMvContext(this);
|
|
if( !IsInWrd() && !IsEndWrd() && !IsSttWrd() )
|
|
PrvWrd();
|
|
if( IsEndWrd() )
|
|
Left(CRSR_SKIP_CELLS, false, 1, false );
|
|
return SelWrd();
|
|
}
|
|
|
|
bool SwWrtShell::SelWrd(const Point *pPt, bool )
|
|
{
|
|
bool bRet;
|
|
{
|
|
SwMvContext aMvContext(this);
|
|
SttSelect();
|
|
bRet = SwCrsrShell::SelectWord( pPt );
|
|
}
|
|
EndSelect();
|
|
if( bRet )
|
|
{
|
|
m_bSelWrd = true;
|
|
if(pPt)
|
|
m_aStart = *pPt;
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
void SwWrtShell::SelSentence(const Point *pPt, bool )
|
|
{
|
|
{
|
|
SwMvContext aMvContext(this);
|
|
ClearMark();
|
|
SwCrsrShell::GoStartSentence();
|
|
SttSelect();
|
|
SwCrsrShell::GoEndSentence();
|
|
}
|
|
EndSelect();
|
|
if(pPt)
|
|
m_aStart = *pPt;
|
|
m_bSelLn = true;
|
|
m_bSelWrd = false; // disable SelWord, otherwise no SelLine goes on
|
|
}
|
|
|
|
void SwWrtShell::SelPara(const Point *pPt, bool )
|
|
{
|
|
{
|
|
SwMvContext aMvContext(this);
|
|
ClearMark();
|
|
SwCrsrShell::MovePara( fnParaCurr, fnParaStart );
|
|
SttSelect();
|
|
SwCrsrShell::MovePara( fnParaCurr, fnParaEnd );
|
|
}
|
|
EndSelect();
|
|
if(pPt)
|
|
m_aStart = *pPt;
|
|
m_bSelLn = false;
|
|
m_bSelWrd = false; // disable SelWord, otherwise no SelLine goes on
|
|
}
|
|
|
|
long SwWrtShell::SelAll()
|
|
{
|
|
const bool bLockedView = IsViewLocked();
|
|
LockView( true );
|
|
{
|
|
if(m_bBlockMode)
|
|
LeaveBlockMode();
|
|
SwMvContext aMvContext(this);
|
|
bool bMoveTable = false;
|
|
boost::scoped_ptr<SwPosition> pStartPos;
|
|
boost::scoped_ptr<SwPosition> pEndPos;
|
|
SwShellCrsr* pTmpCrsr = 0;
|
|
|
|
// Query these early, before we move the cursor.
|
|
bool bHasWholeTabSelection = HasWholeTabSelection();
|
|
bool bIsCursorInTable = IsCrsrInTable();
|
|
|
|
if (!bHasWholeTabSelection)
|
|
{
|
|
if ( IsSelection() && IsCrsrPtAtEnd() )
|
|
SwapPam();
|
|
pTmpCrsr = getShellCrsr( false );
|
|
if( pTmpCrsr )
|
|
{
|
|
pStartPos.reset(new SwPosition( *pTmpCrsr->GetPoint() ));
|
|
pEndPos.reset(new SwPosition( *pTmpCrsr->GetMark() ));
|
|
}
|
|
Push();
|
|
bool bIsFullSel = !MoveSection( fnSectionCurr, fnSectionStart);
|
|
SwapPam();
|
|
bIsFullSel &= !MoveSection( fnSectionCurr, fnSectionEnd);
|
|
Pop(false);
|
|
GoStart(true, &bMoveTable, false, !bIsFullSel);
|
|
}
|
|
else
|
|
{
|
|
EnterStdMode();
|
|
SttEndDoc(true);
|
|
}
|
|
SttSelect();
|
|
GoEnd(true, &bMoveTable);
|
|
|
|
bool bNeedsExtendedSelectAll = StartsWithTable();
|
|
|
|
// If the cursor was in a table, then we only need the extended select
|
|
// all if the whole table is already selected, to still allow selecting
|
|
// only a single cell or a single table before selecting the whole
|
|
// document.
|
|
if (bNeedsExtendedSelectAll && bIsCursorInTable)
|
|
bNeedsExtendedSelectAll = bHasWholeTabSelection;
|
|
|
|
if (bNeedsExtendedSelectAll)
|
|
{
|
|
// Disable table cursor to make sure getShellCrsr() returns m_pCurCrsr, not m_pTableCrsr.
|
|
if (IsTableMode())
|
|
TableCrsrToCursor();
|
|
// Do the extended select all on m_pCurCrsr.
|
|
ExtendedSelectAll(/*bFootnotes =*/ false);
|
|
}
|
|
|
|
SwDoc *pDoc = GetDoc();
|
|
if ( pDoc )
|
|
{
|
|
pDoc->SetPrepareSelAll();
|
|
}
|
|
|
|
if( pStartPos )
|
|
{
|
|
pTmpCrsr = getShellCrsr( false );
|
|
if( pTmpCrsr )
|
|
{
|
|
// Some special handling for sections (e.g. TOC) at the beginning of the document body
|
|
// to avoid the selection of the first section
|
|
// if the last selection was behind the first section or
|
|
// if the last selection was already the first section
|
|
// In this both cases we select to the end of document
|
|
if( ( *pTmpCrsr->GetPoint() < *pEndPos ||
|
|
( *pStartPos == *pTmpCrsr->GetMark() &&
|
|
*pEndPos == *pTmpCrsr->GetPoint() ) ) && !bNeedsExtendedSelectAll)
|
|
SwCrsrShell::SttEndDoc(false);
|
|
}
|
|
}
|
|
}
|
|
EndSelect();
|
|
LockView( bLockedView );
|
|
return 1;
|
|
}
|
|
|
|
// Description: Text search
|
|
|
|
sal_uLong SwWrtShell::SearchPattern( const SearchOptions& rSearchOpt, bool bSearchInNotes,
|
|
SwDocPositions eStt, SwDocPositions eEnd,
|
|
FindRanges eFlags, bool bReplace )
|
|
{
|
|
// no enhancement of existing selections
|
|
if(!(eFlags & FND_IN_SEL))
|
|
ClearMark();
|
|
bool bCancel = false;
|
|
sal_uLong nRet = Find( rSearchOpt, bSearchInNotes, eStt, eEnd, bCancel, eFlags, bReplace );
|
|
if(bCancel)
|
|
{
|
|
Undo(1);
|
|
nRet = ULONG_MAX;
|
|
}
|
|
return nRet;
|
|
}
|
|
|
|
// Description: search for templates
|
|
|
|
sal_uLong SwWrtShell::SearchTempl( const OUString &rTempl,
|
|
SwDocPositions eStt, SwDocPositions eEnd,
|
|
FindRanges eFlags, const OUString* pReplTempl )
|
|
{
|
|
// no enhancement of existing selections
|
|
if(!(eFlags & FND_IN_SEL))
|
|
ClearMark();
|
|
SwTextFormatColl *pColl = GetParaStyle(rTempl, SwWrtShell::GETSTYLE_CREATESOME);
|
|
SwTextFormatColl *pReplaceColl = 0;
|
|
if( pReplTempl )
|
|
pReplaceColl = GetParaStyle(*pReplTempl, SwWrtShell::GETSTYLE_CREATESOME );
|
|
|
|
bool bCancel = false;
|
|
sal_uLong nRet = Find(pColl? *pColl: GetDfltTextFormatColl(),
|
|
eStt,eEnd, bCancel, eFlags, pReplaceColl);
|
|
if(bCancel)
|
|
{
|
|
Undo(1);
|
|
nRet = ULONG_MAX;
|
|
}
|
|
return nRet;
|
|
}
|
|
|
|
// search for attributes
|
|
|
|
sal_uLong SwWrtShell::SearchAttr( const SfxItemSet& rFindSet, bool bNoColls,
|
|
SwDocPositions eStart, SwDocPositions eEnd,
|
|
FindRanges eFlags, const SearchOptions* pSearchOpt,
|
|
const SfxItemSet* pReplaceSet )
|
|
{
|
|
// no enhancement of existing selections
|
|
if (!(eFlags & FND_IN_SEL))
|
|
ClearMark();
|
|
|
|
// Searching
|
|
bool bCancel = false;
|
|
sal_uLong nRet = Find( rFindSet, bNoColls, eStart, eEnd, bCancel, eFlags, pSearchOpt, pReplaceSet);
|
|
|
|
if(bCancel)
|
|
{
|
|
Undo(1);
|
|
nRet = ULONG_MAX;
|
|
}
|
|
return nRet;
|
|
}
|
|
|
|
// Selection modes
|
|
|
|
void SwWrtShell::PushMode()
|
|
{
|
|
m_pModeStack = new ModeStack( m_pModeStack, m_bIns, m_bExtMode, m_bAddMode, m_bBlockMode );
|
|
}
|
|
|
|
void SwWrtShell::PopMode()
|
|
{
|
|
if ( 0 == m_pModeStack )
|
|
return;
|
|
|
|
if ( m_bExtMode && !m_pModeStack->bExt )
|
|
LeaveExtMode();
|
|
if ( m_bAddMode && !m_pModeStack->bAdd )
|
|
LeaveAddMode();
|
|
if ( m_bBlockMode && !m_pModeStack->bBlock )
|
|
LeaveBlockMode();
|
|
m_bIns = m_pModeStack->bIns;
|
|
|
|
ModeStack *pTmp = m_pModeStack->pNext;
|
|
delete m_pModeStack;
|
|
m_pModeStack = pTmp;
|
|
}
|
|
|
|
// Two methodes for setting cursors: the first maps at the
|
|
// eponymous methodes in the CursorShell, the second removes
|
|
// all selections at first.
|
|
|
|
long SwWrtShell::SetCrsr(const Point *pPt, bool bTextOnly)
|
|
{
|
|
// Remove a possibly present selection at the position
|
|
// of the mouseclick
|
|
|
|
if(!IsInSelect() && ChgCurrPam(*pPt)) {
|
|
ClearMark();
|
|
}
|
|
|
|
return SwCrsrShell::SetCrsr(*pPt, bTextOnly);
|
|
}
|
|
|
|
long SwWrtShell::SetCrsrKillSel(const Point *pPt, bool bTextOnly )
|
|
{
|
|
SwActContext aActContext(this);
|
|
ResetSelect(pPt,false);
|
|
return SwCrsrShell::SetCrsr(*pPt, bTextOnly);
|
|
}
|
|
|
|
void SwWrtShell::UnSelectFrm()
|
|
{
|
|
// Remove Frame selection with guaranteed invalid position
|
|
Point aPt(LONG_MIN, LONG_MIN);
|
|
SelectObj(aPt, 0);
|
|
SwTransferable::ClearSelection( *this );
|
|
}
|
|
|
|
// Remove of all selections
|
|
|
|
long SwWrtShell::ResetSelect(const Point *,bool)
|
|
{
|
|
if(IsSelFrmMode())
|
|
{
|
|
UnSelectFrm();
|
|
LeaveSelFrmMode();
|
|
}
|
|
else
|
|
{
|
|
// SwActContext opens an Action -
|
|
// to avoid problems in the basic process with the
|
|
// shell switching, GetChgLnk().Call() may be called
|
|
// after EndAction().
|
|
{
|
|
SwActContext aActContext(this);
|
|
m_bSelWrd = m_bSelLn = false;
|
|
KillPams();
|
|
ClearMark();
|
|
m_fnKillSel = &SwWrtShell::Ignore;
|
|
m_fnSetCrsr = &SwWrtShell::SetCrsr;
|
|
}
|
|
|
|
// After canceling of all selections an update of Attr-Controls
|
|
// could be necessary.
|
|
GetChgLnk().Call(this);
|
|
}
|
|
Invalidate();
|
|
SwTransferable::ClearSelection( *this );
|
|
return 1;
|
|
}
|
|
|
|
// Do nothing
|
|
|
|
long SwWrtShell::Ignore(const Point *, bool ) {
|
|
return 1;
|
|
}
|
|
|
|
// Begin of a selection process.
|
|
|
|
void SwWrtShell::SttSelect()
|
|
{
|
|
if(m_bInSelect)
|
|
return;
|
|
if(!HasMark())
|
|
SetMark();
|
|
if( m_bBlockMode )
|
|
{
|
|
SwShellCrsr* pTmp = getShellCrsr( true );
|
|
if( !pTmp->HasMark() )
|
|
pTmp->SetMark();
|
|
}
|
|
m_fnKillSel = &SwWrtShell::Ignore;
|
|
m_fnSetCrsr = &SwWrtShell::SetCrsr;
|
|
m_bInSelect = true;
|
|
Invalidate();
|
|
SwTransferable::CreateSelection( *this );
|
|
}
|
|
|
|
// End of a selection process.
|
|
|
|
void SwWrtShell::EndSelect()
|
|
{
|
|
if(m_bInSelect && !m_bExtMode)
|
|
{
|
|
m_bInSelect = false;
|
|
if (m_bAddMode)
|
|
{
|
|
AddLeaveSelect(0, false);
|
|
}
|
|
else
|
|
{
|
|
SttLeaveSelect(0, false);
|
|
m_fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
|
|
m_fnKillSel = &SwWrtShell::ResetSelect;
|
|
}
|
|
}
|
|
SwWordCountWrapper *pWrdCnt = static_cast<SwWordCountWrapper*>(GetView().GetViewFrame()->GetChildWindow(SwWordCountWrapper::GetChildWindowId()));
|
|
if (pWrdCnt)
|
|
pWrdCnt->UpdateCounts();
|
|
}
|
|
|
|
long SwWrtShell::ExtSelWrd(const Point *pPt, bool )
|
|
{
|
|
SwMvContext aMvContext(this);
|
|
if( IsTableMode() )
|
|
return 1;
|
|
|
|
// Bug 66823: actual crsr has in additional mode no selection?
|
|
// Then destroy the actual an go to prev, this will be expand
|
|
if( !HasMark() && GoPrevCrsr() )
|
|
{
|
|
bool bHasMark = HasMark(); // thats wrong!
|
|
GoNextCrsr();
|
|
if( bHasMark )
|
|
{
|
|
DestroyCrsr();
|
|
GoPrevCrsr();
|
|
}
|
|
}
|
|
|
|
// check the direction of the selection with the new point
|
|
bool bRet = false, bMoveCrsr = true, bToTop = false;
|
|
SwCrsrShell::SelectWord( &m_aStart ); // select the startword
|
|
SwCrsrShell::Push(); // save the cursor
|
|
SwCrsrShell::SetCrsr( *pPt ); // and check the direction
|
|
|
|
switch( SwCrsrShell::CompareCursor( StackMkCurrPt ))
|
|
{
|
|
case -1: bToTop = false; break;
|
|
case 1: bToTop = true; break;
|
|
default: bMoveCrsr = false; break;
|
|
}
|
|
|
|
SwCrsrShell::Pop( false ); // retore the saved cursor
|
|
|
|
if( bMoveCrsr )
|
|
{
|
|
// select to Top but cursor select to Bottom? or
|
|
// select to Bottom but cursor select to Top? --> swap the cursor
|
|
if( bToTop )
|
|
SwapPam();
|
|
|
|
SwCrsrShell::Push(); // save cur cursor
|
|
if( SwCrsrShell::SelectWord( pPt )) // select the current word
|
|
{
|
|
if( bToTop )
|
|
SwapPam();
|
|
Combine();
|
|
bRet = true;
|
|
}
|
|
else
|
|
{
|
|
SwCrsrShell::Pop( false );
|
|
if( bToTop )
|
|
SwapPam();
|
|
}
|
|
}
|
|
else
|
|
bRet = true;
|
|
return bRet ? 1 : 0;
|
|
}
|
|
|
|
long SwWrtShell::ExtSelLn(const Point *pPt, bool )
|
|
{
|
|
SwMvContext aMvContext(this);
|
|
SwCrsrShell::SetCrsr(*pPt);
|
|
if( IsTableMode() )
|
|
return 1;
|
|
|
|
// Bug 66823: actual crsr has in additional mode no selection?
|
|
// Then destroy the actual an go to prev, this will be expand
|
|
if( !HasMark() && GoPrevCrsr() )
|
|
{
|
|
bool bHasMark = HasMark(); // thats wrong!
|
|
GoNextCrsr();
|
|
if( bHasMark )
|
|
{
|
|
DestroyCrsr();
|
|
GoPrevCrsr();
|
|
}
|
|
}
|
|
|
|
// if applicable fit the selection to the "Mark"
|
|
bool bToTop = !IsCrsrPtAtEnd();
|
|
SwapPam();
|
|
|
|
// The "Mark" has to be at the end or the beginning of the line.
|
|
if( bToTop ? !IsEndSentence() : !IsStartSentence() )
|
|
{
|
|
if( bToTop )
|
|
{
|
|
if( !IsEndPara() )
|
|
SwCrsrShell::Right(1,CRSR_SKIP_CHARS);
|
|
SwCrsrShell::GoEndSentence();
|
|
}
|
|
else
|
|
SwCrsrShell::GoStartSentence();
|
|
}
|
|
SwapPam();
|
|
|
|
return (bToTop ? SwCrsrShell::GoStartSentence() : SwCrsrShell::GoEndSentence()) ? 1 : 0;
|
|
}
|
|
|
|
// Back into the standard mode: no mode, no selections.
|
|
|
|
void SwWrtShell::EnterStdMode()
|
|
{
|
|
if(m_bAddMode)
|
|
LeaveAddMode();
|
|
if(m_bBlockMode)
|
|
LeaveBlockMode();
|
|
m_bBlockMode = false;
|
|
m_bExtMode = false;
|
|
m_bInSelect = false;
|
|
if(IsSelFrmMode())
|
|
{
|
|
UnSelectFrm();
|
|
LeaveSelFrmMode();
|
|
}
|
|
else
|
|
{
|
|
// SwActContext opens and action which has to be
|
|
// closed prior to the call of
|
|
// GetChgLnk().Call()
|
|
{
|
|
SwActContext aActContext(this);
|
|
m_bSelWrd = m_bSelLn = false;
|
|
if( !IsRetainSelection() )
|
|
KillPams();
|
|
ClearMark();
|
|
m_fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
|
|
m_fnKillSel = &SwWrtShell::ResetSelect;
|
|
}
|
|
}
|
|
Invalidate();
|
|
SwTransferable::ClearSelection( *this );
|
|
}
|
|
|
|
// Extended Mode
|
|
|
|
void SwWrtShell::EnterExtMode()
|
|
{
|
|
if(m_bBlockMode)
|
|
{
|
|
LeaveBlockMode();
|
|
KillPams();
|
|
ClearMark();
|
|
}
|
|
m_bExtMode = true;
|
|
m_bAddMode = false;
|
|
m_bBlockMode = false;
|
|
SttSelect();
|
|
}
|
|
|
|
void SwWrtShell::LeaveExtMode()
|
|
{
|
|
m_bExtMode = false;
|
|
EndSelect();
|
|
}
|
|
|
|
// End of a selection; if the selection is empty,
|
|
// ClearMark().
|
|
|
|
long SwWrtShell::SttLeaveSelect(const Point *, bool )
|
|
{
|
|
if(SwCrsrShell::HasSelection() && !IsSelTableCells() && m_bClearMark) {
|
|
return 0;
|
|
}
|
|
ClearMark();
|
|
return 1;
|
|
}
|
|
|
|
// Leaving of the selection mode in additional mode
|
|
|
|
long SwWrtShell::AddLeaveSelect(const Point *, bool )
|
|
{
|
|
if(IsTableMode()) LeaveAddMode();
|
|
else if(SwCrsrShell::HasSelection())
|
|
CreateCrsr();
|
|
return 1;
|
|
}
|
|
|
|
// Additional Mode
|
|
|
|
void SwWrtShell::EnterAddMode()
|
|
{
|
|
if(IsTableMode()) return;
|
|
if(m_bBlockMode)
|
|
LeaveBlockMode();
|
|
m_fnKillSel = &SwWrtShell::Ignore;
|
|
m_fnSetCrsr = &SwWrtShell::SetCrsr;
|
|
m_bAddMode = true;
|
|
m_bBlockMode = false;
|
|
m_bExtMode = false;
|
|
if(SwCrsrShell::HasSelection())
|
|
CreateCrsr();
|
|
Invalidate();
|
|
}
|
|
|
|
void SwWrtShell::LeaveAddMode()
|
|
{
|
|
m_fnKillSel = &SwWrtShell::ResetSelect;
|
|
m_fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
|
|
m_bAddMode = false;
|
|
Invalidate();
|
|
}
|
|
|
|
// Block Mode
|
|
|
|
void SwWrtShell::EnterBlockMode()
|
|
{
|
|
m_bBlockMode = false;
|
|
EnterStdMode();
|
|
m_bBlockMode = true;
|
|
CrsrToBlockCrsr();
|
|
Invalidate();
|
|
}
|
|
|
|
void SwWrtShell::LeaveBlockMode()
|
|
{
|
|
m_bBlockMode = false;
|
|
BlockCrsrToCrsr();
|
|
EndSelect();
|
|
Invalidate();
|
|
}
|
|
|
|
// Insert mode
|
|
|
|
void SwWrtShell::SetInsMode( bool bOn )
|
|
{
|
|
m_bIns = bOn;
|
|
SwCrsrShell::SetOverwriteCrsr( !m_bIns );
|
|
const SfxBoolItem aTmp( SID_ATTR_INSERT, m_bIns );
|
|
GetView().GetViewFrame()->GetBindings().SetState( aTmp );
|
|
StartAction();
|
|
EndAction();
|
|
Invalidate();
|
|
}
|
|
//Overwrite mode is incompatible with red-lining
|
|
void SwWrtShell::SetRedlineModeAndCheckInsMode( sal_uInt16 eMode )
|
|
{
|
|
SetRedlineMode( eMode );
|
|
if (IsRedlineOn())
|
|
SetInsMode( true );
|
|
}
|
|
|
|
// Edit frame
|
|
|
|
long SwWrtShell::BeginFrmDrag(const Point *pPt, bool bIsShift)
|
|
{
|
|
m_fnDrag = &SwFEShell::Drag;
|
|
if(bStartDrag)
|
|
{
|
|
Point aTmp( nStartDragX, nStartDragY );
|
|
SwFEShell::BeginDrag( &aTmp, bIsShift );
|
|
}
|
|
else
|
|
SwFEShell::BeginDrag( pPt, bIsShift );
|
|
return 1;
|
|
}
|
|
|
|
void SwWrtShell::EnterSelFrmMode(const Point *pPos)
|
|
{
|
|
if(pPos)
|
|
{
|
|
nStartDragX = pPos->X();
|
|
nStartDragY = pPos->Y();
|
|
bStartDrag = true;
|
|
}
|
|
m_bLayoutMode = true;
|
|
HideCrsr();
|
|
|
|
// equal call of BeginDrag in the SwFEShell
|
|
m_fnDrag = &SwWrtShell::BeginFrmDrag;
|
|
m_fnEndDrag = &SwWrtShell::UpdateLayoutFrm;
|
|
SwBaseShell::SetFrmMode( FLY_DRAG_START, this );
|
|
Invalidate();
|
|
}
|
|
|
|
void SwWrtShell::LeaveSelFrmMode()
|
|
{
|
|
m_fnDrag = &SwWrtShell::BeginDrag;
|
|
m_fnEndDrag = &SwWrtShell::DefaultEndDrag;
|
|
m_bLayoutMode = false;
|
|
bStartDrag = false;
|
|
Edit();
|
|
SwBaseShell::SetFrmMode( FLY_DRAG_END, this );
|
|
Invalidate();
|
|
}
|
|
|
|
// Description: execute framebound macro
|
|
|
|
IMPL_LINK( SwWrtShell, ExecFlyMac, void *, pFlyFormat )
|
|
{
|
|
const SwFrameFormat *pFormat = pFlyFormat ? static_cast<SwFrameFormat*>(pFlyFormat) : GetFlyFrameFormat();
|
|
OSL_ENSURE(pFormat, "no frame format");
|
|
const SvxMacroItem &rFormatMac = pFormat->GetMacro();
|
|
|
|
if(rFormatMac.HasMacro(SW_EVENT_OBJECT_SELECT))
|
|
{
|
|
const SvxMacro &rMac = rFormatMac.GetMacro(SW_EVENT_OBJECT_SELECT);
|
|
if( IsFrmSelected() )
|
|
m_bLayoutMode = true;
|
|
CallChgLnk();
|
|
ExecMacro( rMac );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
long SwWrtShell::UpdateLayoutFrm(const Point *pPt, bool )
|
|
{
|
|
// still a dummy
|
|
SwFEShell::EndDrag( pPt, false );
|
|
m_fnDrag = &SwWrtShell::BeginFrmDrag;
|
|
return 1;
|
|
}
|
|
|
|
// Handler for toggling the modes. Returns back the old mode.
|
|
|
|
bool SwWrtShell::ToggleAddMode()
|
|
{
|
|
m_bAddMode ? LeaveAddMode(): EnterAddMode();
|
|
Invalidate();
|
|
return !m_bAddMode;
|
|
}
|
|
|
|
bool SwWrtShell::ToggleBlockMode()
|
|
{
|
|
m_bBlockMode ? LeaveBlockMode(): EnterBlockMode();
|
|
Invalidate();
|
|
return !m_bBlockMode;
|
|
}
|
|
|
|
bool SwWrtShell::ToggleExtMode()
|
|
{
|
|
m_bExtMode ? LeaveExtMode() : EnterExtMode();
|
|
Invalidate();
|
|
return !m_bExtMode;
|
|
}
|
|
|
|
// Dragging in standard mode (Selecting of content)
|
|
|
|
long SwWrtShell::BeginDrag(const Point * /*pPt*/, bool )
|
|
{
|
|
if(m_bSelWrd)
|
|
{
|
|
m_bInSelect = true;
|
|
if( !IsCrsrPtAtEnd() )
|
|
SwapPam();
|
|
|
|
m_fnDrag = &SwWrtShell::ExtSelWrd;
|
|
m_fnSetCrsr = &SwWrtShell::Ignore;
|
|
}
|
|
else if(m_bSelLn)
|
|
{
|
|
m_bInSelect = true;
|
|
m_fnDrag = &SwWrtShell::ExtSelLn;
|
|
m_fnSetCrsr = &SwWrtShell::Ignore;
|
|
}
|
|
else
|
|
{
|
|
m_fnDrag = &SwWrtShell::DefaultDrag;
|
|
SttSelect();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
long SwWrtShell::DefaultDrag(const Point *, bool )
|
|
{
|
|
if( IsSelTableCells() )
|
|
m_aSelTableLink.Call(this);
|
|
|
|
return 1;
|
|
}
|
|
|
|
long SwWrtShell::DefaultEndDrag(const Point * /*pPt*/, bool )
|
|
{
|
|
m_fnDrag = &SwWrtShell::BeginDrag;
|
|
if( IsExtSel() )
|
|
LeaveExtSel();
|
|
|
|
if( IsSelTableCells() )
|
|
m_aSelTableLink.Call(this);
|
|
EndSelect();
|
|
return 1;
|
|
}
|
|
|
|
// #i32329# Enhanced table selection
|
|
bool SwWrtShell::SelectTableRowCol( const Point& rPt, const Point* pEnd, bool bRowDrag )
|
|
{
|
|
SwMvContext aMvContext(this);
|
|
SttSelect();
|
|
if(SelTableRowCol( rPt, pEnd, bRowDrag ))
|
|
{
|
|
m_fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
|
|
m_fnKillSel = &SwWrtShell::ResetSelect;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Description: Selection of a table line or column
|
|
|
|
bool SwWrtShell::SelectTableRow()
|
|
{
|
|
if ( SelTableRow() )
|
|
{
|
|
m_fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
|
|
m_fnKillSel = &SwWrtShell::ResetSelect;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool SwWrtShell::SelectTableCol()
|
|
{
|
|
if ( SelTableCol() )
|
|
{
|
|
m_fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
|
|
m_fnKillSel = &SwWrtShell::ResetSelect;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool SwWrtShell::SelectTableCell()
|
|
{
|
|
if ( SelTableBox() )
|
|
{
|
|
m_fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
|
|
m_fnKillSel = &SwWrtShell::ResetSelect;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Description: Check if a word selection is present.
|
|
// According to the rules for intelligent cut / paste
|
|
// surrounding spaces are cut out.
|
|
// Return: Delivers the type of the word selection.
|
|
|
|
int SwWrtShell::IntelligentCut(int nSelection, bool bCut)
|
|
{
|
|
// On multiple selection no intelligent drag and drop
|
|
// there are multiple cursors, since a second was placed
|
|
// already at the target position.
|
|
if( IsAddMode() || !(nSelection & nsSelectionType::SEL_TXT) )
|
|
return NO_WORD;
|
|
|
|
OUString sText;
|
|
CharClass& rCC = GetAppCharClass();
|
|
|
|
// If the first character is no word character,
|
|
// no word selected.
|
|
sal_Unicode cPrev = GetChar(false);
|
|
sal_Unicode cNext = GetChar(true, -1);
|
|
if( !cPrev || !cNext ||
|
|
!rCC.isLetterNumeric( ( sText = OUString(cPrev) ), 0 ) ||
|
|
!rCC.isLetterNumeric( ( sText = OUString(cNext) ), 0 ) )
|
|
return NO_WORD;
|
|
|
|
cPrev = GetChar(false, -1);
|
|
cNext = GetChar(true);
|
|
|
|
int cWord = NO_WORD;
|
|
// is a word seleced?
|
|
if(!cWord && cPrev && cNext &&
|
|
CH_TXTATR_BREAKWORD != cPrev && CH_TXTATR_INWORD != cPrev &&
|
|
CH_TXTATR_BREAKWORD != cNext && CH_TXTATR_INWORD != cNext &&
|
|
!rCC.isLetterNumeric( ( sText = OUString(cPrev) ), 0 ) &&
|
|
!rCC.isLetterNumeric( ( sText = OUString(cNext) ), 0 ) )
|
|
cWord = WORD_NO_SPACE;
|
|
|
|
if(cWord == WORD_NO_SPACE && ' ' == cPrev )
|
|
{
|
|
cWord = WORD_SPACE_BEFORE;
|
|
// delete the space before
|
|
if(bCut)
|
|
{
|
|
Push();
|
|
if(IsCrsrPtAtEnd())
|
|
SwapPam();
|
|
ClearMark();
|
|
SetMark();
|
|
SwCrsrShell::Left(1,CRSR_SKIP_CHARS);
|
|
SwFEShell::Delete();
|
|
Pop( false );
|
|
}
|
|
}
|
|
else if(cWord == WORD_NO_SPACE && cNext == ' ')
|
|
{
|
|
cWord = WORD_SPACE_AFTER;
|
|
// delete the space behind
|
|
if(bCut) {
|
|
Push();
|
|
if(!IsCrsrPtAtEnd()) SwapPam();
|
|
ClearMark();
|
|
SetMark();
|
|
SwCrsrShell::Right(1,CRSR_SKIP_CHARS);
|
|
SwFEShell::Delete();
|
|
Pop( false );
|
|
}
|
|
}
|
|
return cWord;
|
|
}
|
|
|
|
// jump to the next / previous hyperlink - inside text and also
|
|
// on graphics
|
|
bool SwWrtShell::SelectNextPrevHyperlink( bool bNext )
|
|
{
|
|
StartAction();
|
|
bool bRet = SwCrsrShell::SelectNxtPrvHyperlink( bNext );
|
|
if( !bRet )
|
|
{
|
|
// will we have this feature?
|
|
EnterStdMode();
|
|
if( bNext )
|
|
SttEndDoc(true);
|
|
else
|
|
SttEndDoc(false);
|
|
bRet = SwCrsrShell::SelectNxtPrvHyperlink( bNext );
|
|
}
|
|
EndAction();
|
|
|
|
bool bCreateXSelection = false;
|
|
const bool bFrmSelected = IsFrmSelected() || IsObjSelected();
|
|
if( IsSelection() )
|
|
{
|
|
if ( bFrmSelected )
|
|
UnSelectFrm();
|
|
|
|
// Set the function pointer for the canceling of the selection
|
|
// set at cursor
|
|
m_fnKillSel = &SwWrtShell::ResetSelect;
|
|
m_fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
|
|
bCreateXSelection = true;
|
|
}
|
|
else if( bFrmSelected )
|
|
{
|
|
EnterSelFrmMode();
|
|
bCreateXSelection = true;
|
|
}
|
|
else if( (CNT_GRF | CNT_OLE ) & GetCntType() )
|
|
{
|
|
SelectObj( GetCharRect().Pos() );
|
|
EnterSelFrmMode();
|
|
bCreateXSelection = true;
|
|
}
|
|
|
|
if( bCreateXSelection )
|
|
SwTransferable::CreateSelection( *this );
|
|
|
|
return bRet;
|
|
}
|
|
|
|
// For the preservation of the selection the cursor will be moved left
|
|
// after SetMark(), so that the cursor is not moved by inserting text.
|
|
// Because a present selection at the CORE page is cleared at the
|
|
// current cursor position, the cursor will be pushed on the stack.
|
|
// After moving, they will again resummarized.
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|