1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sw.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #include <limits.h> 33*cdf0e10cSrcweir #include <hintids.hxx> 34*cdf0e10cSrcweir #include <sfx2/bindings.hxx> 35*cdf0e10cSrcweir #include <svl/eitem.hxx> 36*cdf0e10cSrcweir #include <svl/macitem.hxx> 37*cdf0e10cSrcweir #include <unotools/charclass.hxx> 38*cdf0e10cSrcweir #include <editeng/scripttypeitem.hxx> 39*cdf0e10cSrcweir #include <cmdid.h> 40*cdf0e10cSrcweir #include <view.hxx> 41*cdf0e10cSrcweir #include <basesh.hxx> 42*cdf0e10cSrcweir #include <wrtsh.hxx> 43*cdf0e10cSrcweir #include <frmatr.hxx> 44*cdf0e10cSrcweir #include <initui.hxx> 45*cdf0e10cSrcweir #include <mdiexp.hxx> 46*cdf0e10cSrcweir #include <fmtcol.hxx> 47*cdf0e10cSrcweir #include <frmfmt.hxx> 48*cdf0e10cSrcweir #include <swundo.hxx> // fuer Undo-Ids 49*cdf0e10cSrcweir #include <swevent.hxx> 50*cdf0e10cSrcweir #include <swdtflvr.hxx> 51*cdf0e10cSrcweir #include <crsskip.hxx> 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 54*cdf0e10cSrcweir #include <pam.hxx> 55*cdf0e10cSrcweir #endif 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir namespace com { namespace sun { namespace star { namespace util { 58*cdf0e10cSrcweir struct SearchOptions; 59*cdf0e10cSrcweir } } } } 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir using namespace ::com::sun::star::util; 62*cdf0e10cSrcweir 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir static long nStartDragX = 0, nStartDragY = 0; 65*cdf0e10cSrcweir static sal_Bool bStartDrag = sal_False; 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir void SwWrtShell::Invalidate() 68*cdf0e10cSrcweir { 69*cdf0e10cSrcweir // to avoid making the slot volatile, invalidate it everytime if something could have been changed 70*cdf0e10cSrcweir // this is still much cheaper than asking for the state every 200 ms (and avoid background processing) 71*cdf0e10cSrcweir GetView().GetViewFrame()->GetBindings().Invalidate( FN_STAT_SELMODE ); 72*cdf0e10cSrcweir } 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir sal_Bool SwWrtShell::SelNearestWrd() 75*cdf0e10cSrcweir { 76*cdf0e10cSrcweir MV_KONTEXT(this); 77*cdf0e10cSrcweir if( !IsInWrd() && !IsEndWrd() && !IsSttWrd() ) 78*cdf0e10cSrcweir PrvWrd(); 79*cdf0e10cSrcweir if( IsEndWrd() ) 80*cdf0e10cSrcweir Left(CRSR_SKIP_CELLS, sal_False, 1, sal_False ); 81*cdf0e10cSrcweir return SelWrd(); 82*cdf0e10cSrcweir } 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir sal_Bool SwWrtShell::SelWrd(const Point *pPt, sal_Bool ) 87*cdf0e10cSrcweir { 88*cdf0e10cSrcweir sal_Bool bRet; 89*cdf0e10cSrcweir { 90*cdf0e10cSrcweir MV_KONTEXT(this); 91*cdf0e10cSrcweir SttSelect(); 92*cdf0e10cSrcweir bRet = SwCrsrShell::SelectWord( pPt ); 93*cdf0e10cSrcweir } 94*cdf0e10cSrcweir EndSelect(); 95*cdf0e10cSrcweir if( bRet ) 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir bSelWrd = sal_True; 98*cdf0e10cSrcweir if(pPt) 99*cdf0e10cSrcweir aStart = *pPt; 100*cdf0e10cSrcweir } 101*cdf0e10cSrcweir return bRet; 102*cdf0e10cSrcweir } 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir void SwWrtShell::SelSentence(const Point *pPt, sal_Bool ) 105*cdf0e10cSrcweir { 106*cdf0e10cSrcweir { 107*cdf0e10cSrcweir MV_KONTEXT(this); 108*cdf0e10cSrcweir ClearMark(); 109*cdf0e10cSrcweir SwCrsrShell::GoStartSentence(); 110*cdf0e10cSrcweir SttSelect(); 111*cdf0e10cSrcweir SwCrsrShell::GoEndSentence(); 112*cdf0e10cSrcweir } 113*cdf0e10cSrcweir EndSelect(); 114*cdf0e10cSrcweir if(pPt) 115*cdf0e10cSrcweir aStart = *pPt; 116*cdf0e10cSrcweir bSelLn = sal_True; 117*cdf0e10cSrcweir bSelWrd = sal_False; // SelWord abschalten, sonst geht kein SelLine weiter 118*cdf0e10cSrcweir } 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir void SwWrtShell::SelPara(const Point *pPt, sal_Bool ) 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir { 123*cdf0e10cSrcweir MV_KONTEXT(this); 124*cdf0e10cSrcweir ClearMark(); 125*cdf0e10cSrcweir SwCrsrShell::MovePara( fnParaCurr, fnParaStart ); 126*cdf0e10cSrcweir SttSelect(); 127*cdf0e10cSrcweir SwCrsrShell::MovePara( fnParaCurr, fnParaEnd ); 128*cdf0e10cSrcweir } 129*cdf0e10cSrcweir EndSelect(); 130*cdf0e10cSrcweir if(pPt) 131*cdf0e10cSrcweir aStart = *pPt; 132*cdf0e10cSrcweir bSelLn = sal_False; 133*cdf0e10cSrcweir bSelWrd = sal_False; // SelWord abschalten, sonst geht kein SelLine weiter 134*cdf0e10cSrcweir } 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir long SwWrtShell::SelAll() 138*cdf0e10cSrcweir { 139*cdf0e10cSrcweir const sal_Bool bLockedView = IsViewLocked(); 140*cdf0e10cSrcweir LockView( sal_True ); 141*cdf0e10cSrcweir { 142*cdf0e10cSrcweir if(bBlockMode) 143*cdf0e10cSrcweir LeaveBlockMode(); 144*cdf0e10cSrcweir MV_KONTEXT(this); 145*cdf0e10cSrcweir sal_Bool bMoveTable = sal_False; 146*cdf0e10cSrcweir SwPosition *pStartPos = 0; 147*cdf0e10cSrcweir SwPosition *pEndPos = 0; 148*cdf0e10cSrcweir SwShellCrsr* pTmpCrsr = 0; 149*cdf0e10cSrcweir if( !HasWholeTabSelection() ) 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir if ( IsSelection() && IsCrsrPtAtEnd() ) 152*cdf0e10cSrcweir SwapPam(); 153*cdf0e10cSrcweir pTmpCrsr = getShellCrsr( false ); 154*cdf0e10cSrcweir if( pTmpCrsr ) 155*cdf0e10cSrcweir { 156*cdf0e10cSrcweir pStartPos = new SwPosition( *pTmpCrsr->GetPoint() ); 157*cdf0e10cSrcweir pEndPos = new SwPosition( *pTmpCrsr->GetMark() ); 158*cdf0e10cSrcweir } 159*cdf0e10cSrcweir Push(); 160*cdf0e10cSrcweir sal_Bool bIsFullSel = !MoveSection( fnSectionCurr, fnSectionStart); 161*cdf0e10cSrcweir SwapPam(); 162*cdf0e10cSrcweir bIsFullSel &= !MoveSection( fnSectionCurr, fnSectionEnd); 163*cdf0e10cSrcweir Pop(sal_False); 164*cdf0e10cSrcweir GoStart(sal_True, &bMoveTable, sal_False, !bIsFullSel); 165*cdf0e10cSrcweir } 166*cdf0e10cSrcweir else 167*cdf0e10cSrcweir { 168*cdf0e10cSrcweir EnterStdMode(); 169*cdf0e10cSrcweir SttEndDoc(sal_True); 170*cdf0e10cSrcweir } 171*cdf0e10cSrcweir SttSelect(); 172*cdf0e10cSrcweir GoEnd(sal_True, &bMoveTable); 173*cdf0e10cSrcweir if( pStartPos ) 174*cdf0e10cSrcweir { 175*cdf0e10cSrcweir pTmpCrsr = getShellCrsr( false ); 176*cdf0e10cSrcweir if( pTmpCrsr ) 177*cdf0e10cSrcweir { 178*cdf0e10cSrcweir // Some special handling for sections (e.g. TOC) at the beginning of the document body 179*cdf0e10cSrcweir // to avoid the selection of the first section 180*cdf0e10cSrcweir // if the last selection was behind the first section or 181*cdf0e10cSrcweir // if the last selection was already the first section 182*cdf0e10cSrcweir // In this both cases we select to the end of document 183*cdf0e10cSrcweir if( *pTmpCrsr->GetPoint() < *pEndPos || 184*cdf0e10cSrcweir ( *pStartPos == *pTmpCrsr->GetMark() && 185*cdf0e10cSrcweir *pEndPos == *pTmpCrsr->GetPoint() ) ) 186*cdf0e10cSrcweir SwCrsrShell::SttEndDoc(sal_False); 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir delete pStartPos; 189*cdf0e10cSrcweir delete pEndPos; 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir } 192*cdf0e10cSrcweir EndSelect(); 193*cdf0e10cSrcweir LockView( bLockedView ); 194*cdf0e10cSrcweir return 1; 195*cdf0e10cSrcweir } 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir /*------------------------------------------------------------------------ 198*cdf0e10cSrcweir Beschreibung: Textsuche 199*cdf0e10cSrcweir ------------------------------------------------------------------------*/ 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir 202*cdf0e10cSrcweir sal_uLong SwWrtShell::SearchPattern( const SearchOptions& rSearchOpt, sal_Bool bSearchInNotes, 203*cdf0e10cSrcweir SwDocPositions eStt, SwDocPositions eEnd, 204*cdf0e10cSrcweir FindRanges eFlags, int bReplace ) 205*cdf0e10cSrcweir { 206*cdf0e10cSrcweir // keine Erweiterung bestehender Selektionen 207*cdf0e10cSrcweir if(!(eFlags & FND_IN_SEL)) 208*cdf0e10cSrcweir ClearMark(); 209*cdf0e10cSrcweir sal_Bool bCancel = sal_False; 210*cdf0e10cSrcweir sal_uLong nRet = Find( rSearchOpt, bSearchInNotes, eStt, eEnd, bCancel, eFlags, bReplace ); 211*cdf0e10cSrcweir if(bCancel) 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir Undo(1); 214*cdf0e10cSrcweir nRet = ULONG_MAX; 215*cdf0e10cSrcweir } 216*cdf0e10cSrcweir return nRet; 217*cdf0e10cSrcweir } 218*cdf0e10cSrcweir /*------------------------------------------------------------------------ 219*cdf0e10cSrcweir Beschreibung: Suche nach Vorlagen 220*cdf0e10cSrcweir ------------------------------------------------------------------------*/ 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir 224*cdf0e10cSrcweir sal_uLong SwWrtShell::SearchTempl( const String &rTempl, 225*cdf0e10cSrcweir SwDocPositions eStt, SwDocPositions eEnd, 226*cdf0e10cSrcweir FindRanges eFlags, const String* pReplTempl ) 227*cdf0e10cSrcweir { 228*cdf0e10cSrcweir // keine Erweiterung bestehender Selektionen 229*cdf0e10cSrcweir if(!(eFlags & FND_IN_SEL)) 230*cdf0e10cSrcweir ClearMark(); 231*cdf0e10cSrcweir SwTxtFmtColl *pColl = GetParaStyle(rTempl, SwWrtShell::GETSTYLE_CREATESOME); 232*cdf0e10cSrcweir SwTxtFmtColl *pReplaceColl = 0; 233*cdf0e10cSrcweir if( pReplTempl ) 234*cdf0e10cSrcweir pReplaceColl = GetParaStyle(*pReplTempl, SwWrtShell::GETSTYLE_CREATESOME ); 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir sal_Bool bCancel = sal_False; 237*cdf0e10cSrcweir sal_uLong nRet = Find(pColl? *pColl: GetDfltTxtFmtColl(), 238*cdf0e10cSrcweir eStt,eEnd, bCancel, eFlags, pReplaceColl); 239*cdf0e10cSrcweir if(bCancel) 240*cdf0e10cSrcweir { 241*cdf0e10cSrcweir Undo(1); 242*cdf0e10cSrcweir nRet = ULONG_MAX; 243*cdf0e10cSrcweir } 244*cdf0e10cSrcweir return nRet; 245*cdf0e10cSrcweir } 246*cdf0e10cSrcweir 247*cdf0e10cSrcweir // Suche nach Attributen ---------------------------------------------------- 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir sal_uLong SwWrtShell::SearchAttr( const SfxItemSet& rFindSet, sal_Bool bNoColls, 252*cdf0e10cSrcweir SwDocPositions eStart, SwDocPositions eEnde, 253*cdf0e10cSrcweir FindRanges eFlags, const SearchOptions* pSearchOpt, 254*cdf0e10cSrcweir const SfxItemSet* pReplaceSet ) 255*cdf0e10cSrcweir { 256*cdf0e10cSrcweir // Keine Erweiterung bestehender Selektionen 257*cdf0e10cSrcweir if (!(eFlags & FND_IN_SEL)) 258*cdf0e10cSrcweir ClearMark(); 259*cdf0e10cSrcweir 260*cdf0e10cSrcweir // Suchen 261*cdf0e10cSrcweir sal_Bool bCancel = sal_False; 262*cdf0e10cSrcweir sal_uLong nRet = Find( rFindSet, bNoColls, eStart, eEnde, bCancel, eFlags, pSearchOpt, pReplaceSet); 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir if(bCancel) 265*cdf0e10cSrcweir { 266*cdf0e10cSrcweir Undo(1); 267*cdf0e10cSrcweir nRet = ULONG_MAX; 268*cdf0e10cSrcweir } 269*cdf0e10cSrcweir return nRet; 270*cdf0e10cSrcweir } 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir // ---------- Selektionsmodi ---------- 273*cdf0e10cSrcweir 274*cdf0e10cSrcweir 275*cdf0e10cSrcweir 276*cdf0e10cSrcweir void SwWrtShell::PushMode() 277*cdf0e10cSrcweir { 278*cdf0e10cSrcweir pModeStack = new ModeStack( pModeStack, bIns, bExtMode, bAddMode, bBlockMode ); 279*cdf0e10cSrcweir } 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir 282*cdf0e10cSrcweir 283*cdf0e10cSrcweir void SwWrtShell::PopMode() 284*cdf0e10cSrcweir { 285*cdf0e10cSrcweir if ( 0 == pModeStack ) 286*cdf0e10cSrcweir return; 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir if ( bExtMode && !pModeStack->bExt ) 289*cdf0e10cSrcweir LeaveExtMode(); 290*cdf0e10cSrcweir if ( bAddMode && !pModeStack->bAdd ) 291*cdf0e10cSrcweir LeaveAddMode(); 292*cdf0e10cSrcweir if ( bBlockMode && !pModeStack->bBlock ) 293*cdf0e10cSrcweir LeaveBlockMode(); 294*cdf0e10cSrcweir bIns = pModeStack->bIns; 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir ModeStack *pTmp = pModeStack->pNext; 297*cdf0e10cSrcweir delete pModeStack; 298*cdf0e10cSrcweir pModeStack = pTmp; 299*cdf0e10cSrcweir } 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir /* 302*cdf0e10cSrcweir * Zwei Methoden fuer das Cursorsetzen; die erste mappt auf die 303*cdf0e10cSrcweir * gleichnamige Methoden an der CursorShell, die zweite hebt 304*cdf0e10cSrcweir * zuerst alle Selektionen auf. 305*cdf0e10cSrcweir */ 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir long SwWrtShell::SetCrsr(const Point *pPt, sal_Bool bTextOnly) 310*cdf0e10cSrcweir { 311*cdf0e10cSrcweir /* 312*cdf0e10cSrcweir * eine gfs. bestehende Selektion an der Position des 313*cdf0e10cSrcweir * Mausklicks aufheben 314*cdf0e10cSrcweir */ 315*cdf0e10cSrcweir if(!IsInSelect() && ChgCurrPam(*pPt)) { 316*cdf0e10cSrcweir ClearMark(); 317*cdf0e10cSrcweir } 318*cdf0e10cSrcweir 319*cdf0e10cSrcweir return SwCrsrShell::SetCrsr(*pPt, bTextOnly); 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir long SwWrtShell::SetCrsrKillSel(const Point *pPt, sal_Bool bTextOnly ) 324*cdf0e10cSrcweir { 325*cdf0e10cSrcweir ACT_KONTEXT(this); 326*cdf0e10cSrcweir ResetSelect(pPt,sal_False); 327*cdf0e10cSrcweir return SwCrsrShell::SetCrsr(*pPt, bTextOnly); 328*cdf0e10cSrcweir } 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir void SwWrtShell::UnSelectFrm() 333*cdf0e10cSrcweir { 334*cdf0e10cSrcweir // Rahmenselektion aufheben mit garantiert ungueltiger Position 335*cdf0e10cSrcweir Point aPt(LONG_MIN, LONG_MIN); 336*cdf0e10cSrcweir SelectObj(aPt, 0); 337*cdf0e10cSrcweir SwTransferable::ClearSelection( *this ); 338*cdf0e10cSrcweir } 339*cdf0e10cSrcweir 340*cdf0e10cSrcweir /* 341*cdf0e10cSrcweir * Aufheben aller Selektionen 342*cdf0e10cSrcweir */ 343*cdf0e10cSrcweir 344*cdf0e10cSrcweir 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir long SwWrtShell::ResetSelect(const Point *,sal_Bool) 347*cdf0e10cSrcweir { 348*cdf0e10cSrcweir if(IsSelFrmMode()) 349*cdf0e10cSrcweir { 350*cdf0e10cSrcweir UnSelectFrm(); 351*cdf0e10cSrcweir LeaveSelFrmMode(); 352*cdf0e10cSrcweir } 353*cdf0e10cSrcweir else 354*cdf0e10cSrcweir { 355*cdf0e10cSrcweir /* ACT_KONTEXT() macht eine Action auf - 356*cdf0e10cSrcweir um im Basicablauf keine Probleme mit der 357*cdf0e10cSrcweir Shellumschaltung zu bekommen, darf 358*cdf0e10cSrcweir GetChgLnk().Call() erst nach 359*cdf0e10cSrcweir EndAction() gerufen werden. 360*cdf0e10cSrcweir */ 361*cdf0e10cSrcweir { 362*cdf0e10cSrcweir ACT_KONTEXT(this); 363*cdf0e10cSrcweir bSelWrd = bSelLn = sal_False; 364*cdf0e10cSrcweir KillPams(); 365*cdf0e10cSrcweir ClearMark(); 366*cdf0e10cSrcweir fnKillSel = &SwWrtShell::Ignore; 367*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::SetCrsr; 368*cdf0e10cSrcweir } 369*cdf0e10cSrcweir /* 370*cdf0e10cSrcweir * nach dem Aufheben aller Selektionen koennte ein Update der 371*cdf0e10cSrcweir * Attr-Controls notwendig sein. 372*cdf0e10cSrcweir */ 373*cdf0e10cSrcweir GetChgLnk().Call(this); 374*cdf0e10cSrcweir } 375*cdf0e10cSrcweir Invalidate(); 376*cdf0e10cSrcweir SwTransferable::ClearSelection( *this ); 377*cdf0e10cSrcweir return 1; 378*cdf0e10cSrcweir } 379*cdf0e10cSrcweir 380*cdf0e10cSrcweir 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir /* 383*cdf0e10cSrcweir * tue nichts 384*cdf0e10cSrcweir */ 385*cdf0e10cSrcweir long SwWrtShell::Ignore(const Point *, sal_Bool ) { 386*cdf0e10cSrcweir return 1; 387*cdf0e10cSrcweir } 388*cdf0e10cSrcweir 389*cdf0e10cSrcweir /* 390*cdf0e10cSrcweir * Start eines Selektionsvorganges. 391*cdf0e10cSrcweir */ 392*cdf0e10cSrcweir 393*cdf0e10cSrcweir 394*cdf0e10cSrcweir 395*cdf0e10cSrcweir void SwWrtShell::SttSelect() 396*cdf0e10cSrcweir { 397*cdf0e10cSrcweir if(bInSelect) 398*cdf0e10cSrcweir return; 399*cdf0e10cSrcweir if(!HasMark()) 400*cdf0e10cSrcweir SetMark(); 401*cdf0e10cSrcweir if( bBlockMode ) 402*cdf0e10cSrcweir { 403*cdf0e10cSrcweir SwShellCrsr* pTmp = getShellCrsr( true ); 404*cdf0e10cSrcweir if( !pTmp->HasMark() ) 405*cdf0e10cSrcweir pTmp->SetMark(); 406*cdf0e10cSrcweir } 407*cdf0e10cSrcweir fnKillSel = &SwWrtShell::Ignore; 408*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::SetCrsr; 409*cdf0e10cSrcweir bInSelect = sal_True; 410*cdf0e10cSrcweir Invalidate(); 411*cdf0e10cSrcweir SwTransferable::CreateSelection( *this ); 412*cdf0e10cSrcweir } 413*cdf0e10cSrcweir /* 414*cdf0e10cSrcweir * Ende eines Selektionsvorganges. 415*cdf0e10cSrcweir */ 416*cdf0e10cSrcweir 417*cdf0e10cSrcweir 418*cdf0e10cSrcweir 419*cdf0e10cSrcweir void SwWrtShell::EndSelect() 420*cdf0e10cSrcweir { 421*cdf0e10cSrcweir if(!bInSelect || bExtMode) 422*cdf0e10cSrcweir return; 423*cdf0e10cSrcweir bInSelect = sal_False; 424*cdf0e10cSrcweir (this->*fnLeaveSelect)(0,sal_False); 425*cdf0e10cSrcweir if(!bAddMode) { 426*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::SetCrsrKillSel; 427*cdf0e10cSrcweir fnKillSel = &SwWrtShell::ResetSelect; 428*cdf0e10cSrcweir } 429*cdf0e10cSrcweir } 430*cdf0e10cSrcweir /* Methode, um eine bestehende wortweise oder zeilenweise Selektion 431*cdf0e10cSrcweir * zu erweitern. 432*cdf0e10cSrcweir */ 433*cdf0e10cSrcweir 434*cdf0e10cSrcweir inline sal_Bool operator<(const Point &rP1,const Point &rP2) 435*cdf0e10cSrcweir { 436*cdf0e10cSrcweir return rP1.Y() < rP2.Y() || (rP1.Y() == rP2.Y() && rP1.X() < rP2.X()); 437*cdf0e10cSrcweir } 438*cdf0e10cSrcweir 439*cdf0e10cSrcweir 440*cdf0e10cSrcweir 441*cdf0e10cSrcweir long SwWrtShell::ExtSelWrd(const Point *pPt, sal_Bool ) 442*cdf0e10cSrcweir { 443*cdf0e10cSrcweir MV_KONTEXT(this); 444*cdf0e10cSrcweir if( IsTableMode() ) 445*cdf0e10cSrcweir return 1; 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir // Bug 66823: actual crsr has in additional mode no selection? 448*cdf0e10cSrcweir // Then destroy the actual an go to prev, this will be expand 449*cdf0e10cSrcweir if( !HasMark() && GoPrevCrsr() ) 450*cdf0e10cSrcweir { 451*cdf0e10cSrcweir sal_Bool bHasMark = HasMark(); // thats wrong! 452*cdf0e10cSrcweir GoNextCrsr(); 453*cdf0e10cSrcweir if( bHasMark ) 454*cdf0e10cSrcweir { 455*cdf0e10cSrcweir DestroyCrsr(); 456*cdf0e10cSrcweir GoPrevCrsr(); 457*cdf0e10cSrcweir } 458*cdf0e10cSrcweir } 459*cdf0e10cSrcweir 460*cdf0e10cSrcweir // check the direction of the selection with the new point 461*cdf0e10cSrcweir sal_Bool bRet = sal_False, bMoveCrsr = sal_True, bToTop = sal_False; 462*cdf0e10cSrcweir SwCrsrShell::SelectWord( &aStart ); // select the startword 463*cdf0e10cSrcweir SwCrsrShell::Push(); // save the cursor 464*cdf0e10cSrcweir SwCrsrShell::SetCrsr( *pPt ); // and check the direction 465*cdf0e10cSrcweir 466*cdf0e10cSrcweir switch( SwCrsrShell::CompareCursor( StackMkCurrPt )) 467*cdf0e10cSrcweir { 468*cdf0e10cSrcweir case -1: bToTop = sal_False; break; 469*cdf0e10cSrcweir case 1: bToTop = sal_True; break; 470*cdf0e10cSrcweir default: bMoveCrsr = sal_False; break; 471*cdf0e10cSrcweir } 472*cdf0e10cSrcweir 473*cdf0e10cSrcweir SwCrsrShell::Pop( sal_False ); // retore the saved cursor 474*cdf0e10cSrcweir 475*cdf0e10cSrcweir if( bMoveCrsr ) 476*cdf0e10cSrcweir { 477*cdf0e10cSrcweir // select to Top but cursor select to Bottom? or 478*cdf0e10cSrcweir // select to Bottom but cursor select to Top? --> swap the cursor 479*cdf0e10cSrcweir if( bToTop ) 480*cdf0e10cSrcweir SwapPam(); 481*cdf0e10cSrcweir 482*cdf0e10cSrcweir SwCrsrShell::Push(); // save cur cursor 483*cdf0e10cSrcweir if( SwCrsrShell::SelectWord( pPt )) // select the current word 484*cdf0e10cSrcweir { 485*cdf0e10cSrcweir if( bToTop ) 486*cdf0e10cSrcweir SwapPam(); 487*cdf0e10cSrcweir Combine(); 488*cdf0e10cSrcweir bRet = sal_True; 489*cdf0e10cSrcweir } 490*cdf0e10cSrcweir else 491*cdf0e10cSrcweir { 492*cdf0e10cSrcweir SwCrsrShell::Pop( sal_False ); 493*cdf0e10cSrcweir if( bToTop ) 494*cdf0e10cSrcweir SwapPam(); 495*cdf0e10cSrcweir } 496*cdf0e10cSrcweir } 497*cdf0e10cSrcweir else 498*cdf0e10cSrcweir bRet = sal_True; 499*cdf0e10cSrcweir return bRet; 500*cdf0e10cSrcweir } 501*cdf0e10cSrcweir 502*cdf0e10cSrcweir 503*cdf0e10cSrcweir long SwWrtShell::ExtSelLn(const Point *pPt, sal_Bool ) 504*cdf0e10cSrcweir { 505*cdf0e10cSrcweir MV_KONTEXT(this); 506*cdf0e10cSrcweir SwCrsrShell::SetCrsr(*pPt); 507*cdf0e10cSrcweir if( IsTableMode() ) 508*cdf0e10cSrcweir return 1; 509*cdf0e10cSrcweir 510*cdf0e10cSrcweir // Bug 66823: actual crsr has in additional mode no selection? 511*cdf0e10cSrcweir // Then destroy the actual an go to prev, this will be expand 512*cdf0e10cSrcweir if( !HasMark() && GoPrevCrsr() ) 513*cdf0e10cSrcweir { 514*cdf0e10cSrcweir sal_Bool bHasMark = HasMark(); // thats wrong! 515*cdf0e10cSrcweir GoNextCrsr(); 516*cdf0e10cSrcweir if( bHasMark ) 517*cdf0e10cSrcweir { 518*cdf0e10cSrcweir DestroyCrsr(); 519*cdf0e10cSrcweir GoPrevCrsr(); 520*cdf0e10cSrcweir } 521*cdf0e10cSrcweir } 522*cdf0e10cSrcweir 523*cdf0e10cSrcweir // ggfs. den Mark der Selektion anpassen 524*cdf0e10cSrcweir sal_Bool bToTop = !IsCrsrPtAtEnd(); 525*cdf0e10cSrcweir SwapPam(); 526*cdf0e10cSrcweir 527*cdf0e10cSrcweir // der "Mark" muss am Zeilenende/-anfang stehen 528*cdf0e10cSrcweir if( bToTop ? !IsEndSentence() : !IsStartSentence() ) 529*cdf0e10cSrcweir { 530*cdf0e10cSrcweir if( bToTop ) 531*cdf0e10cSrcweir { 532*cdf0e10cSrcweir if( !IsEndPara() ) 533*cdf0e10cSrcweir SwCrsrShell::Right(1,CRSR_SKIP_CHARS); 534*cdf0e10cSrcweir SwCrsrShell::GoEndSentence(); 535*cdf0e10cSrcweir } 536*cdf0e10cSrcweir else 537*cdf0e10cSrcweir SwCrsrShell::GoStartSentence(); 538*cdf0e10cSrcweir } 539*cdf0e10cSrcweir SwapPam(); 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir return bToTop ? SwCrsrShell::GoStartSentence() : SwCrsrShell::GoEndSentence(); 542*cdf0e10cSrcweir } 543*cdf0e10cSrcweir 544*cdf0e10cSrcweir 545*cdf0e10cSrcweir /* 546*cdf0e10cSrcweir * zurueck in den Standard Mode: kein Mode, keine Selektionen. 547*cdf0e10cSrcweir */ 548*cdf0e10cSrcweir 549*cdf0e10cSrcweir void SwWrtShell::EnterStdMode() 550*cdf0e10cSrcweir { 551*cdf0e10cSrcweir if(bAddMode) 552*cdf0e10cSrcweir LeaveAddMode(); 553*cdf0e10cSrcweir if(bBlockMode) 554*cdf0e10cSrcweir LeaveBlockMode(); 555*cdf0e10cSrcweir bBlockMode = sal_False; 556*cdf0e10cSrcweir bExtMode = sal_False; 557*cdf0e10cSrcweir bInSelect = sal_False; 558*cdf0e10cSrcweir if(IsSelFrmMode()) 559*cdf0e10cSrcweir { 560*cdf0e10cSrcweir UnSelectFrm(); 561*cdf0e10cSrcweir LeaveSelFrmMode(); 562*cdf0e10cSrcweir } 563*cdf0e10cSrcweir else 564*cdf0e10cSrcweir { 565*cdf0e10cSrcweir /* ACT_KONTEXT() opens and action which has to be 566*cdf0e10cSrcweir closed prior to the call of 567*cdf0e10cSrcweir GetChgLnk().Call() 568*cdf0e10cSrcweir */ 569*cdf0e10cSrcweir { 570*cdf0e10cSrcweir ACT_KONTEXT(this); 571*cdf0e10cSrcweir bSelWrd = bSelLn = sal_False; 572*cdf0e10cSrcweir if( !IsRetainSelection() ) 573*cdf0e10cSrcweir KillPams(); 574*cdf0e10cSrcweir ClearMark(); 575*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::SetCrsrKillSel; 576*cdf0e10cSrcweir fnKillSel = &SwWrtShell::ResetSelect; 577*cdf0e10cSrcweir } 578*cdf0e10cSrcweir } 579*cdf0e10cSrcweir Invalidate(); 580*cdf0e10cSrcweir SwTransferable::ClearSelection( *this ); 581*cdf0e10cSrcweir } 582*cdf0e10cSrcweir 583*cdf0e10cSrcweir /* 584*cdf0e10cSrcweir * Extended Mode 585*cdf0e10cSrcweir */ 586*cdf0e10cSrcweir 587*cdf0e10cSrcweir 588*cdf0e10cSrcweir 589*cdf0e10cSrcweir void SwWrtShell::EnterExtMode() 590*cdf0e10cSrcweir { 591*cdf0e10cSrcweir if(bBlockMode) 592*cdf0e10cSrcweir { 593*cdf0e10cSrcweir LeaveBlockMode(); 594*cdf0e10cSrcweir KillPams(); 595*cdf0e10cSrcweir ClearMark(); 596*cdf0e10cSrcweir } 597*cdf0e10cSrcweir bExtMode = sal_True; 598*cdf0e10cSrcweir bAddMode = sal_False; 599*cdf0e10cSrcweir bBlockMode = sal_False; 600*cdf0e10cSrcweir SttSelect(); 601*cdf0e10cSrcweir } 602*cdf0e10cSrcweir 603*cdf0e10cSrcweir 604*cdf0e10cSrcweir 605*cdf0e10cSrcweir void SwWrtShell::LeaveExtMode() 606*cdf0e10cSrcweir { 607*cdf0e10cSrcweir bExtMode = sal_False; 608*cdf0e10cSrcweir EndSelect(); 609*cdf0e10cSrcweir } 610*cdf0e10cSrcweir /* 611*cdf0e10cSrcweir * Ende einer Selektion; falls die Selektion leer ist, 612*cdf0e10cSrcweir * ClearMark(). 613*cdf0e10cSrcweir */ 614*cdf0e10cSrcweir 615*cdf0e10cSrcweir 616*cdf0e10cSrcweir 617*cdf0e10cSrcweir long SwWrtShell::SttLeaveSelect(const Point *, sal_Bool ) 618*cdf0e10cSrcweir { 619*cdf0e10cSrcweir if(SwCrsrShell::HasSelection() && !IsSelTblCells() && bClearMark) { 620*cdf0e10cSrcweir return 0; 621*cdf0e10cSrcweir } 622*cdf0e10cSrcweir // if( IsSelTblCells() ) aSelTblLink.Call(this); 623*cdf0e10cSrcweir ClearMark(); 624*cdf0e10cSrcweir return 1; 625*cdf0e10cSrcweir } 626*cdf0e10cSrcweir /* 627*cdf0e10cSrcweir * Verlassen des Selektionsmodus in Additional Mode 628*cdf0e10cSrcweir */ 629*cdf0e10cSrcweir 630*cdf0e10cSrcweir 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir long SwWrtShell::AddLeaveSelect(const Point *, sal_Bool ) 633*cdf0e10cSrcweir { 634*cdf0e10cSrcweir if(IsTableMode()) LeaveAddMode(); 635*cdf0e10cSrcweir else if(SwCrsrShell::HasSelection()) 636*cdf0e10cSrcweir CreateCrsr(); 637*cdf0e10cSrcweir return 1; 638*cdf0e10cSrcweir } 639*cdf0e10cSrcweir /* 640*cdf0e10cSrcweir * Additional Mode 641*cdf0e10cSrcweir */ 642*cdf0e10cSrcweir 643*cdf0e10cSrcweir 644*cdf0e10cSrcweir 645*cdf0e10cSrcweir void SwWrtShell::EnterAddMode() 646*cdf0e10cSrcweir { 647*cdf0e10cSrcweir if(IsTableMode()) return; 648*cdf0e10cSrcweir if(bBlockMode) 649*cdf0e10cSrcweir LeaveBlockMode(); 650*cdf0e10cSrcweir fnLeaveSelect = &SwWrtShell::AddLeaveSelect; 651*cdf0e10cSrcweir fnKillSel = &SwWrtShell::Ignore; 652*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::SetCrsr; 653*cdf0e10cSrcweir bAddMode = sal_True; 654*cdf0e10cSrcweir bBlockMode = sal_False; 655*cdf0e10cSrcweir bExtMode = sal_False; 656*cdf0e10cSrcweir if(SwCrsrShell::HasSelection()) 657*cdf0e10cSrcweir CreateCrsr(); 658*cdf0e10cSrcweir Invalidate(); 659*cdf0e10cSrcweir } 660*cdf0e10cSrcweir 661*cdf0e10cSrcweir 662*cdf0e10cSrcweir 663*cdf0e10cSrcweir void SwWrtShell::LeaveAddMode() 664*cdf0e10cSrcweir { 665*cdf0e10cSrcweir fnLeaveSelect = &SwWrtShell::SttLeaveSelect; 666*cdf0e10cSrcweir fnKillSel = &SwWrtShell::ResetSelect; 667*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::SetCrsrKillSel; 668*cdf0e10cSrcweir bAddMode = sal_False; 669*cdf0e10cSrcweir Invalidate(); 670*cdf0e10cSrcweir } 671*cdf0e10cSrcweir 672*cdf0e10cSrcweir /* 673*cdf0e10cSrcweir * Block Mode 674*cdf0e10cSrcweir */ 675*cdf0e10cSrcweir 676*cdf0e10cSrcweir void SwWrtShell::EnterBlockMode() 677*cdf0e10cSrcweir { 678*cdf0e10cSrcweir bBlockMode = sal_False; 679*cdf0e10cSrcweir EnterStdMode(); 680*cdf0e10cSrcweir bBlockMode = sal_True; 681*cdf0e10cSrcweir CrsrToBlockCrsr(); 682*cdf0e10cSrcweir Invalidate(); 683*cdf0e10cSrcweir } 684*cdf0e10cSrcweir 685*cdf0e10cSrcweir 686*cdf0e10cSrcweir 687*cdf0e10cSrcweir void SwWrtShell::LeaveBlockMode() 688*cdf0e10cSrcweir { 689*cdf0e10cSrcweir bBlockMode = sal_False; 690*cdf0e10cSrcweir BlockCrsrToCrsr(); 691*cdf0e10cSrcweir EndSelect(); 692*cdf0e10cSrcweir Invalidate(); 693*cdf0e10cSrcweir } 694*cdf0e10cSrcweir 695*cdf0e10cSrcweir // Einfuegemodus 696*cdf0e10cSrcweir 697*cdf0e10cSrcweir 698*cdf0e10cSrcweir 699*cdf0e10cSrcweir void SwWrtShell::SetInsMode( sal_Bool bOn ) 700*cdf0e10cSrcweir { 701*cdf0e10cSrcweir bIns = bOn; 702*cdf0e10cSrcweir SwCrsrShell::SetOverwriteCrsr( !bIns ); 703*cdf0e10cSrcweir const SfxBoolItem aTmp( SID_ATTR_INSERT, bIns ); 704*cdf0e10cSrcweir GetView().GetViewFrame()->GetBindings().SetState( aTmp ); 705*cdf0e10cSrcweir StartAction(); 706*cdf0e10cSrcweir EndAction(); 707*cdf0e10cSrcweir Invalidate(); 708*cdf0e10cSrcweir } 709*cdf0e10cSrcweir //Overwrite mode is incompatible with red-lining 710*cdf0e10cSrcweir void SwWrtShell::SetRedlineModeAndCheckInsMode( sal_uInt16 eMode ) 711*cdf0e10cSrcweir { 712*cdf0e10cSrcweir SetRedlineMode( eMode ); 713*cdf0e10cSrcweir if (IsRedlineOn()) 714*cdf0e10cSrcweir SetInsMode( true ); 715*cdf0e10cSrcweir } 716*cdf0e10cSrcweir 717*cdf0e10cSrcweir /* 718*cdf0e10cSrcweir * Rahmen bearbeiten 719*cdf0e10cSrcweir */ 720*cdf0e10cSrcweir 721*cdf0e10cSrcweir 722*cdf0e10cSrcweir long SwWrtShell::BeginFrmDrag(const Point *pPt, sal_Bool) 723*cdf0e10cSrcweir { 724*cdf0e10cSrcweir fnDrag = &SwFEShell::Drag; 725*cdf0e10cSrcweir if(bStartDrag) 726*cdf0e10cSrcweir { 727*cdf0e10cSrcweir Point aTmp( nStartDragX, nStartDragY ); 728*cdf0e10cSrcweir SwFEShell::BeginDrag( &aTmp, sal_False ); 729*cdf0e10cSrcweir } 730*cdf0e10cSrcweir else 731*cdf0e10cSrcweir SwFEShell::BeginDrag( pPt, sal_False ); 732*cdf0e10cSrcweir return 1; 733*cdf0e10cSrcweir } 734*cdf0e10cSrcweir 735*cdf0e10cSrcweir 736*cdf0e10cSrcweir 737*cdf0e10cSrcweir void SwWrtShell::EnterSelFrmMode(const Point *pPos) 738*cdf0e10cSrcweir { 739*cdf0e10cSrcweir if(pPos) 740*cdf0e10cSrcweir { 741*cdf0e10cSrcweir nStartDragX = pPos->X(); 742*cdf0e10cSrcweir nStartDragY = pPos->Y(); 743*cdf0e10cSrcweir bStartDrag = sal_True; 744*cdf0e10cSrcweir } 745*cdf0e10cSrcweir bNoEdit = bLayoutMode = sal_True; 746*cdf0e10cSrcweir HideCrsr(); 747*cdf0e10cSrcweir 748*cdf0e10cSrcweir // gleicher Aufruf von BeginDrag an der SwFEShell 749*cdf0e10cSrcweir fnDrag = &SwWrtShell::BeginFrmDrag; 750*cdf0e10cSrcweir fnEndDrag = &SwWrtShell::UpdateLayoutFrm; 751*cdf0e10cSrcweir SwBaseShell::SetFrmMode( FLY_DRAG_START, this ); 752*cdf0e10cSrcweir Invalidate(); 753*cdf0e10cSrcweir } 754*cdf0e10cSrcweir 755*cdf0e10cSrcweir 756*cdf0e10cSrcweir 757*cdf0e10cSrcweir void SwWrtShell::LeaveSelFrmMode() 758*cdf0e10cSrcweir { 759*cdf0e10cSrcweir fnDrag = &SwWrtShell::BeginDrag; 760*cdf0e10cSrcweir fnEndDrag = &SwWrtShell::EndDrag; 761*cdf0e10cSrcweir bLayoutMode = sal_False; 762*cdf0e10cSrcweir bStartDrag = sal_False; 763*cdf0e10cSrcweir Edit(); 764*cdf0e10cSrcweir SwBaseShell::SetFrmMode( FLY_DRAG_END, this ); 765*cdf0e10cSrcweir Invalidate(); 766*cdf0e10cSrcweir } 767*cdf0e10cSrcweir /*------------------------------------------------------------------------ 768*cdf0e10cSrcweir Beschreibung: Rahmengebundenes Macro ausfuehren 769*cdf0e10cSrcweir ------------------------------------------------------------------------*/ 770*cdf0e10cSrcweir 771*cdf0e10cSrcweir 772*cdf0e10cSrcweir 773*cdf0e10cSrcweir IMPL_LINK( SwWrtShell, ExecFlyMac, void *, pFlyFmt ) 774*cdf0e10cSrcweir { 775*cdf0e10cSrcweir const SwFrmFmt *pFmt = pFlyFmt ? (SwFrmFmt*)pFlyFmt : GetFlyFrmFmt(); 776*cdf0e10cSrcweir ASSERT(pFmt, kein FrameFormat.); 777*cdf0e10cSrcweir const SvxMacroItem &rFmtMac = pFmt->GetMacro(); 778*cdf0e10cSrcweir 779*cdf0e10cSrcweir if(rFmtMac.HasMacro(SW_EVENT_OBJECT_SELECT)) 780*cdf0e10cSrcweir { 781*cdf0e10cSrcweir const SvxMacro &rMac = rFmtMac.GetMacro(SW_EVENT_OBJECT_SELECT); 782*cdf0e10cSrcweir if( IsFrmSelected() ) 783*cdf0e10cSrcweir bLayoutMode = sal_True; 784*cdf0e10cSrcweir CallChgLnk(); 785*cdf0e10cSrcweir ExecMacro( rMac ); 786*cdf0e10cSrcweir } 787*cdf0e10cSrcweir return 0; 788*cdf0e10cSrcweir } 789*cdf0e10cSrcweir 790*cdf0e10cSrcweir 791*cdf0e10cSrcweir 792*cdf0e10cSrcweir long SwWrtShell::UpdateLayoutFrm(const Point *pPt, sal_Bool ) 793*cdf0e10cSrcweir { 794*cdf0e10cSrcweir // voerst Dummy 795*cdf0e10cSrcweir SwFEShell::EndDrag( pPt, sal_False ); 796*cdf0e10cSrcweir fnDrag = &SwWrtShell::BeginFrmDrag; 797*cdf0e10cSrcweir return 1; 798*cdf0e10cSrcweir } 799*cdf0e10cSrcweir 800*cdf0e10cSrcweir /* 801*cdf0e10cSrcweir * Handler fuer das Togglen der Modi. Liefern alten Mode zurueck. 802*cdf0e10cSrcweir */ 803*cdf0e10cSrcweir 804*cdf0e10cSrcweir 805*cdf0e10cSrcweir 806*cdf0e10cSrcweir long SwWrtShell::ToggleAddMode() 807*cdf0e10cSrcweir { 808*cdf0e10cSrcweir bAddMode ? LeaveAddMode(): EnterAddMode(); 809*cdf0e10cSrcweir Invalidate(); 810*cdf0e10cSrcweir return !bAddMode; 811*cdf0e10cSrcweir } 812*cdf0e10cSrcweir 813*cdf0e10cSrcweir 814*cdf0e10cSrcweir long SwWrtShell::ToggleBlockMode() 815*cdf0e10cSrcweir { 816*cdf0e10cSrcweir bBlockMode ? LeaveBlockMode(): EnterBlockMode(); 817*cdf0e10cSrcweir Invalidate(); 818*cdf0e10cSrcweir return !bBlockMode; 819*cdf0e10cSrcweir } 820*cdf0e10cSrcweir 821*cdf0e10cSrcweir 822*cdf0e10cSrcweir long SwWrtShell::ToggleExtMode() 823*cdf0e10cSrcweir { 824*cdf0e10cSrcweir bExtMode ? LeaveExtMode() : EnterExtMode(); 825*cdf0e10cSrcweir Invalidate(); 826*cdf0e10cSrcweir return !bExtMode; 827*cdf0e10cSrcweir } 828*cdf0e10cSrcweir /* 829*cdf0e10cSrcweir * Draggen im Standard Modus (Selektieren von Inhalt) 830*cdf0e10cSrcweir */ 831*cdf0e10cSrcweir 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir 834*cdf0e10cSrcweir long SwWrtShell::BeginDrag(const Point * /*pPt*/, sal_Bool ) 835*cdf0e10cSrcweir { 836*cdf0e10cSrcweir if(bSelWrd) 837*cdf0e10cSrcweir { 838*cdf0e10cSrcweir bInSelect = sal_True; 839*cdf0e10cSrcweir if( !IsCrsrPtAtEnd() ) 840*cdf0e10cSrcweir SwapPam(); 841*cdf0e10cSrcweir 842*cdf0e10cSrcweir fnDrag = &SwWrtShell::ExtSelWrd; 843*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::Ignore; 844*cdf0e10cSrcweir } 845*cdf0e10cSrcweir else if(bSelLn) 846*cdf0e10cSrcweir { 847*cdf0e10cSrcweir bInSelect = sal_True; 848*cdf0e10cSrcweir fnDrag = &SwWrtShell::ExtSelLn; 849*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::Ignore; 850*cdf0e10cSrcweir } 851*cdf0e10cSrcweir else 852*cdf0e10cSrcweir { 853*cdf0e10cSrcweir fnDrag = &SwWrtShell::Drag; 854*cdf0e10cSrcweir SttSelect(); 855*cdf0e10cSrcweir } 856*cdf0e10cSrcweir 857*cdf0e10cSrcweir return 1; 858*cdf0e10cSrcweir } 859*cdf0e10cSrcweir 860*cdf0e10cSrcweir 861*cdf0e10cSrcweir 862*cdf0e10cSrcweir long SwWrtShell::Drag(const Point *, sal_Bool ) 863*cdf0e10cSrcweir { 864*cdf0e10cSrcweir if( IsSelTblCells() ) 865*cdf0e10cSrcweir aSelTblLink.Call(this); 866*cdf0e10cSrcweir 867*cdf0e10cSrcweir return 1; 868*cdf0e10cSrcweir } 869*cdf0e10cSrcweir 870*cdf0e10cSrcweir 871*cdf0e10cSrcweir 872*cdf0e10cSrcweir long SwWrtShell::EndDrag(const Point * /*pPt*/, sal_Bool ) 873*cdf0e10cSrcweir { 874*cdf0e10cSrcweir fnDrag = &SwWrtShell::BeginDrag; 875*cdf0e10cSrcweir if( IsExtSel() ) 876*cdf0e10cSrcweir LeaveExtSel(); 877*cdf0e10cSrcweir 878*cdf0e10cSrcweir if( IsSelTblCells() ) 879*cdf0e10cSrcweir aSelTblLink.Call(this); 880*cdf0e10cSrcweir EndSelect(); 881*cdf0e10cSrcweir return 1; 882*cdf0e10cSrcweir } 883*cdf0e10cSrcweir 884*cdf0e10cSrcweir // --> FME 2004-07-30 #i32329# Enhanced table selection 885*cdf0e10cSrcweir sal_Bool SwWrtShell::SelectTableRowCol( const Point& rPt, const Point* pEnd, bool bRowDrag ) 886*cdf0e10cSrcweir { 887*cdf0e10cSrcweir MV_KONTEXT(this); 888*cdf0e10cSrcweir SttSelect(); 889*cdf0e10cSrcweir if(SelTblRowCol( rPt, pEnd, bRowDrag )) 890*cdf0e10cSrcweir { 891*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::SetCrsrKillSel; 892*cdf0e10cSrcweir fnKillSel = &SwWrtShell::ResetSelect; 893*cdf0e10cSrcweir return sal_True; 894*cdf0e10cSrcweir } 895*cdf0e10cSrcweir return sal_False; 896*cdf0e10cSrcweir } 897*cdf0e10cSrcweir // <-- 898*cdf0e10cSrcweir 899*cdf0e10cSrcweir /*------------------------------------------------------------------------ 900*cdf0e10cSrcweir Beschreibung: Selektion einer Tabellenzeile / Spalte 901*cdf0e10cSrcweir ------------------------------------------------------------------------*/ 902*cdf0e10cSrcweir 903*cdf0e10cSrcweir sal_Bool SwWrtShell::SelectTableRow() 904*cdf0e10cSrcweir { 905*cdf0e10cSrcweir if ( SelTblRow() ) 906*cdf0e10cSrcweir { 907*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::SetCrsrKillSel; 908*cdf0e10cSrcweir fnKillSel = &SwWrtShell::ResetSelect; 909*cdf0e10cSrcweir return sal_True; 910*cdf0e10cSrcweir } 911*cdf0e10cSrcweir return sal_False; 912*cdf0e10cSrcweir } 913*cdf0e10cSrcweir 914*cdf0e10cSrcweir 915*cdf0e10cSrcweir 916*cdf0e10cSrcweir sal_Bool SwWrtShell::SelectTableCol() 917*cdf0e10cSrcweir { 918*cdf0e10cSrcweir if ( SelTblCol() ) 919*cdf0e10cSrcweir { 920*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::SetCrsrKillSel; 921*cdf0e10cSrcweir fnKillSel = &SwWrtShell::ResetSelect; 922*cdf0e10cSrcweir return sal_True; 923*cdf0e10cSrcweir } 924*cdf0e10cSrcweir return sal_False; 925*cdf0e10cSrcweir } 926*cdf0e10cSrcweir 927*cdf0e10cSrcweir sal_Bool SwWrtShell::SelectTableCell() 928*cdf0e10cSrcweir { 929*cdf0e10cSrcweir if ( SelTblBox() ) 930*cdf0e10cSrcweir { 931*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::SetCrsrKillSel; 932*cdf0e10cSrcweir fnKillSel = &SwWrtShell::ResetSelect; 933*cdf0e10cSrcweir return sal_True; 934*cdf0e10cSrcweir } 935*cdf0e10cSrcweir return sal_False; 936*cdf0e10cSrcweir } 937*cdf0e10cSrcweir /*------------------------------------------------------------------------ 938*cdf0e10cSrcweir Beschreibung: Prueft, ob eine Wortselektion vorliegt. 939*cdf0e10cSrcweir Gemaess den Regeln fuer intelligentes Cut / Paste 940*cdf0e10cSrcweir werden umgebende Spaces rausgeschnitten. 941*cdf0e10cSrcweir Return: Liefert Art der Wortselektion zurueck. 942*cdf0e10cSrcweir ------------------------------------------------------------------------*/ 943*cdf0e10cSrcweir 944*cdf0e10cSrcweir 945*cdf0e10cSrcweir 946*cdf0e10cSrcweir int SwWrtShell::IntelligentCut(int nSelection, sal_Bool bCut) 947*cdf0e10cSrcweir { 948*cdf0e10cSrcweir // kein intelligentes Drag and Drop bei Mehrfachselektion 949*cdf0e10cSrcweir // es existieren mehrere Cursor, da ein zweiter bereits 950*cdf0e10cSrcweir // an die Zielposition gesetzt wurde 951*cdf0e10cSrcweir if( IsAddMode() || !(nSelection & nsSelectionType::SEL_TXT) ) 952*cdf0e10cSrcweir return sal_False; 953*cdf0e10cSrcweir 954*cdf0e10cSrcweir String sTxt; 955*cdf0e10cSrcweir CharClass& rCC = GetAppCharClass(); 956*cdf0e10cSrcweir 957*cdf0e10cSrcweir // wenn das erste und das letzte Zeichen kein Wortzeichen ist, 958*cdf0e10cSrcweir // ist kein Wort selektiert. 959*cdf0e10cSrcweir sal_Unicode cPrev = GetChar(sal_False); 960*cdf0e10cSrcweir sal_Unicode cNext = GetChar(sal_True, -1); 961*cdf0e10cSrcweir if( !cPrev || !cNext || 962*cdf0e10cSrcweir !rCC.isLetterNumeric( ( sTxt = cPrev), 0 ) || 963*cdf0e10cSrcweir !rCC.isLetterNumeric( ( sTxt = cNext), 0 ) ) 964*cdf0e10cSrcweir return NO_WORD; 965*cdf0e10cSrcweir 966*cdf0e10cSrcweir cPrev = GetChar(sal_False, -1); 967*cdf0e10cSrcweir cNext = GetChar(sal_True); 968*cdf0e10cSrcweir 969*cdf0e10cSrcweir int cWord = NO_WORD; 970*cdf0e10cSrcweir // ist ein Wort selektiert? 971*cdf0e10cSrcweir if(!cWord && cPrev && cNext && 972*cdf0e10cSrcweir CH_TXTATR_BREAKWORD != cPrev && CH_TXTATR_INWORD != cPrev && 973*cdf0e10cSrcweir CH_TXTATR_BREAKWORD != cNext && CH_TXTATR_INWORD != cNext && 974*cdf0e10cSrcweir !rCC.isLetterNumeric( ( sTxt = cPrev), 0 ) && 975*cdf0e10cSrcweir !rCC.isLetterNumeric( ( sTxt = cNext), 0 ) ) 976*cdf0e10cSrcweir cWord = WORD_NO_SPACE; 977*cdf0e10cSrcweir 978*cdf0e10cSrcweir if(cWord == WORD_NO_SPACE && ' ' == cPrev ) 979*cdf0e10cSrcweir { 980*cdf0e10cSrcweir cWord = WORD_SPACE_BEFORE; 981*cdf0e10cSrcweir // Space davor loeschen 982*cdf0e10cSrcweir if(bCut) 983*cdf0e10cSrcweir { 984*cdf0e10cSrcweir Push(); 985*cdf0e10cSrcweir if(IsCrsrPtAtEnd()) 986*cdf0e10cSrcweir SwapPam(); 987*cdf0e10cSrcweir ClearMark(); 988*cdf0e10cSrcweir SetMark(); 989*cdf0e10cSrcweir SwCrsrShell::Left(1,CRSR_SKIP_CHARS); 990*cdf0e10cSrcweir SwFEShell::Delete(); 991*cdf0e10cSrcweir Pop( sal_False ); 992*cdf0e10cSrcweir } 993*cdf0e10cSrcweir } 994*cdf0e10cSrcweir else if(cWord == WORD_NO_SPACE && cNext == ' ') 995*cdf0e10cSrcweir { 996*cdf0e10cSrcweir cWord = WORD_SPACE_AFTER; 997*cdf0e10cSrcweir // Space dahinter loeschen 998*cdf0e10cSrcweir if(bCut) { 999*cdf0e10cSrcweir Push(); 1000*cdf0e10cSrcweir if(!IsCrsrPtAtEnd()) SwapPam(); 1001*cdf0e10cSrcweir ClearMark(); 1002*cdf0e10cSrcweir SetMark(); 1003*cdf0e10cSrcweir SwCrsrShell::Right(1,CRSR_SKIP_CHARS); 1004*cdf0e10cSrcweir SwFEShell::Delete(); 1005*cdf0e10cSrcweir Pop( sal_False ); 1006*cdf0e10cSrcweir } 1007*cdf0e10cSrcweir } 1008*cdf0e10cSrcweir return cWord; 1009*cdf0e10cSrcweir } 1010*cdf0e10cSrcweir 1011*cdf0e10cSrcweir 1012*cdf0e10cSrcweir 1013*cdf0e10cSrcweir // jump to the next / previous hyperlink - inside text and also 1014*cdf0e10cSrcweir // on graphics 1015*cdf0e10cSrcweir sal_Bool SwWrtShell::SelectNextPrevHyperlink( sal_Bool bNext ) 1016*cdf0e10cSrcweir { 1017*cdf0e10cSrcweir StartAction(); 1018*cdf0e10cSrcweir sal_Bool bRet = SwCrsrShell::SelectNxtPrvHyperlink( bNext ); 1019*cdf0e10cSrcweir if( !bRet ) 1020*cdf0e10cSrcweir { 1021*cdf0e10cSrcweir // will we have this feature? 1022*cdf0e10cSrcweir EnterStdMode(); 1023*cdf0e10cSrcweir if( bNext ) 1024*cdf0e10cSrcweir SttEndDoc(sal_True); 1025*cdf0e10cSrcweir else 1026*cdf0e10cSrcweir SttEndDoc(sal_False); 1027*cdf0e10cSrcweir bRet = SwCrsrShell::SelectNxtPrvHyperlink( bNext ); 1028*cdf0e10cSrcweir } 1029*cdf0e10cSrcweir EndAction(); 1030*cdf0e10cSrcweir 1031*cdf0e10cSrcweir sal_Bool bCreateXSelection = sal_False; 1032*cdf0e10cSrcweir const sal_Bool bFrmSelected = IsFrmSelected() || IsObjSelected(); 1033*cdf0e10cSrcweir if( IsSelection() ) 1034*cdf0e10cSrcweir { 1035*cdf0e10cSrcweir if ( bFrmSelected ) 1036*cdf0e10cSrcweir UnSelectFrm(); 1037*cdf0e10cSrcweir 1038*cdf0e10cSrcweir // Funktionspointer fuer das Aufheben der Selektion setzen 1039*cdf0e10cSrcweir // bei Cursor setzen 1040*cdf0e10cSrcweir fnKillSel = &SwWrtShell::ResetSelect; 1041*cdf0e10cSrcweir fnSetCrsr = &SwWrtShell::SetCrsrKillSel; 1042*cdf0e10cSrcweir bCreateXSelection = sal_True; 1043*cdf0e10cSrcweir } 1044*cdf0e10cSrcweir else if( bFrmSelected ) 1045*cdf0e10cSrcweir { 1046*cdf0e10cSrcweir EnterSelFrmMode(); 1047*cdf0e10cSrcweir bCreateXSelection = sal_True; 1048*cdf0e10cSrcweir } 1049*cdf0e10cSrcweir else if( (CNT_GRF | CNT_OLE ) & GetCntType() ) 1050*cdf0e10cSrcweir { 1051*cdf0e10cSrcweir SelectObj( GetCharRect().Pos() ); 1052*cdf0e10cSrcweir EnterSelFrmMode(); 1053*cdf0e10cSrcweir bCreateXSelection = sal_True; 1054*cdf0e10cSrcweir } 1055*cdf0e10cSrcweir 1056*cdf0e10cSrcweir if( bCreateXSelection ) 1057*cdf0e10cSrcweir SwTransferable::CreateSelection( *this ); 1058*cdf0e10cSrcweir 1059*cdf0e10cSrcweir return bRet; 1060*cdf0e10cSrcweir } 1061*cdf0e10cSrcweir 1062*cdf0e10cSrcweir 1063*cdf0e10cSrcweir /* fuer den Erhalt der Selektion wird nach SetMark() der Cursor 1064*cdf0e10cSrcweir * nach links bewegt, damit er durch das Einfuegen von Text nicht 1065*cdf0e10cSrcweir * verschoben wird. Da auf der CORE-Seite am aktuellen Cursor 1066*cdf0e10cSrcweir * eine bestehende Selektion aufgehoben wird, wird der Cursor auf 1067*cdf0e10cSrcweir * den Stack gepushed. Nach dem Verschieben werden sie wieder 1068*cdf0e10cSrcweir * zusammengefasst. */ 1069*cdf0e10cSrcweir 1070*cdf0e10cSrcweir 1071*cdf0e10cSrcweir 1072*cdf0e10cSrcweir 1073