Files
libreoffice/sw/source/ui/docvw/edtwin.cxx
2001-05-08 18:13:33 +00:00

4114 lines
148 KiB
C++

/*************************************************************************
*
* $RCSfile: edtwin.cxx,v $
*
* $Revision: 1.9 $
*
* last change: $Author: jp $ $Date: 2001-05-08 19:13:33 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif
#pragma hdrstop
#include <tools/list.hxx>
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _SV_HELP_HXX //autogen
#include <vcl/help.hxx>
#endif
#ifndef _SV_GRAPH_HXX //autogen
#include <vcl/graph.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SV_KEYCODES_HXX //autogen
#include <vcl/keycodes.hxx>
#endif
#ifndef _VCL_CMDEVT_HXX //autogen
#include <vcl/cmdevt.hxx>
#endif
#ifndef _VCL_CMDEVT_HXX //autogen
#include <vcl/cmdevt.hxx>
#endif
#ifndef _VCL_CMDEVT_H //autogen
#include <vcl/cmdevt.h>
#endif
#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif
#ifndef _ARGS_HXX //autogen
#include <svtools/args.hxx>
#endif
#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif
#ifndef __SBX_SBXVARIABLE_HXX //autogen
#include <svtools/sbxvar.hxx>
#endif
#ifndef _SBXCLASS_HXX //autogen
#include <svtools/sbx.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVDVMARK_HXX //autogen
#include <svx/svdvmark.hxx>
#endif
#ifndef _SVDHDL_HXX //autogen
#include <svx/svdhdl.hxx>
#endif
#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif
#ifndef _MySVXACORR_HXX //autogen
#include <svx/svxacorr.hxx>
#endif
#ifndef _SVX_FLDITEM_HXX
# ifndef ITEMID_FIELD
# ifndef _EEITEM_HXX //autogen
# include <svx/eeitem.hxx>
# endif
# define ITEMID_FIELD EE_FEATURE_FIELD // wird fuer #include <flditem.hxx> benoetigt
# endif
# ifndef _SVX_FLDITEM_HXX //autogen
# include <svx/flditem.hxx>
# endif
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _OUTLINER_HXX //autogen
#include <svx/outliner.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _OFAACCFG_HXX //autogen
#include <offmgr/ofaaccfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _UNOTOOLS_CHARCLASS_HXX
#include <unotools/charclass.hxx>
#endif
#ifndef _EDTWIN_HXX //autogen
#include <edtwin.hxx>
#endif
#ifndef _SWVIEW_HXX //autogen
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX //autogen
#include <wrtsh.hxx>
#endif
#ifndef _FLDBAS_HXX //autogen
#include <fldbas.hxx>
#endif
#ifndef _SWMODULE_HXX //autogen
#include <swmodule.hxx>
#endif
#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif
#ifndef _VIEWOPT_HXX //autogen
#include <viewopt.hxx>
#endif
#ifndef _SW_DRAWBASE_HXX //autogen
#include <drawbase.hxx>
#endif
#ifndef _SW_DSELECT_HXX //autogen
#include <dselect.hxx>
#endif
#ifndef _SWTEXTSH_HXX //autogen
#include <textsh.hxx>
#endif
#ifndef _SHDWCRSR_HXX
#include <shdwcrsr.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _MODOPT_HXX //autogen
#include <modcfg.hxx>
#endif
#ifndef _FMTCOL_HXX //autogen
#include <fmtcol.hxx>
#endif
#ifndef _SWWVIEW_HXX //autogen
#include <wview.hxx>
#endif
#ifndef _SWLISTSH_HXX //autogen
#include <listsh.hxx>
#endif
#ifndef _GLOSLST_HXX //autogen
#include <gloslst.hxx>
#endif
#ifndef SW_INPUTWIN_HXX //autogen
#include <inputwin.hxx>
#endif
#ifndef _GLOSHDL_HXX //autogen
#include <gloshdl.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>
#endif
#ifndef _SWDRWTXTSH_HXX //autogen
#include <drwtxtsh.hxx>
#endif
#ifndef _FCHRFMT_HXX //autogen
#include <fchrfmt.hxx>
#endif
#ifndef _ROMENU_HXX
#include <romenu.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _EXTINPUT_HXX
#include <extinput.hxx>
#endif
#ifndef _ACMPLWRD_HXX
#include <acmplwrd.hxx>
#endif
#ifndef _SWCALWRP_HXX
#include <swcalwrp.hxx>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _DOCVW_HRC
#include <docvw.hrc>
#endif
/*--------------------------------------------------------------------
Beschreibung: Globals
--------------------------------------------------------------------*/
extern BOOL bNoInterrupt; // in mainwn.cxx
//Normalerweise wird im MouseButtonUp eine Selektion aufgehoben wenn die
//Selektion nicht gerade aufgezogen wird. Leider wird im MouseButtonDown
//bei doppel-/dreifach-Klick Selektiert, diese Selektion wird in dem Handler
//komplett abgeschlossen und kann deshalb im Up nicht mehr unterschieden
//werden. Um dies Aufzuloese wird bHoldSelection im Down gesetzt und im
//Up ausgewertet.
static BOOL bHoldSelection = FALSE;
BOOL bFrmDrag = FALSE;
BOOL bValidCrsrPos = FALSE;
BOOL bModePushed = FALSE;
BOOL bDDTimerStarted = FALSE;
BOOL bFlushCharBuffer = FALSE;
BOOL SwEditWin::bReplaceQuote = FALSE;
BOOL bDDINetAttr = FALSE;
SdrHdlKind eSdrMoveHdl = HDL_USER;
QuickHelpData* SwEditWin::pQuickHlpData = 0;
long SwEditWin::nDDStartPosY = 0;
long SwEditWin::nDDStartPosX = 0;
Color SwEditWin::aTextBackColor(COL_YELLOW);
Color SwEditWin::aTextColor(COL_RED);
BOOL SwEditWin::bTransparentBackColor = FALSE; // Hintergrund nicht transparent
extern BOOL bExecuteDrag;
SfxShell* lcl_GetShellFromDispatcher( SwView& rView, TypeId nType );
DBG_NAME(edithdl);
class SwAnchorMarker
{
SdrHdl* pHdl;
Point aHdlPos;
Point aLastPos;
public:
SwAnchorMarker( SdrHdl* pH ) :
pHdl( pH ), aHdlPos( pH->GetPos() ), aLastPos( pH->GetPos() ) {}
const Point& GetLastPos() const { return aLastPos; }
void SetLastPos( const Point& rNew ) { aLastPos = rNew; }
void SetPos( const Point& rNew ) { pHdl->SetPos( rNew ); }
const Point& GetPos() { return pHdl->GetPos(); }
const Point& GetHdlPos() { return aHdlPos; }
void ChgHdl( SdrHdl* pNew ) { pHdl = pNew; }
};
struct QuickHelpData
{
SvStringsISortDtor aArr;
USHORT* pAttrs;
CommandExtTextInputData* pCETID;
ULONG nTipId;
USHORT nLen, nCurArrPos;
BOOL bClear : 1, bChkInsBlank : 1, bIsTip : 1, bIsAutoText : 1;
QuickHelpData() : pCETID( 0 ), pAttrs( 0 ) { ClearCntnt(); }
void Move( QuickHelpData& rCpy );
void ClearCntnt();
void Start( SwWrtShell& rSh, USHORT nWrdLen );
void Stop( SwWrtShell& rSh );
BOOL HasCntnt() const { return aArr.Count() && 0 != nLen; }
void Inc( BOOL bEndLess )
{
if( ++nCurArrPos >= aArr.Count() )
nCurArrPos = (bEndLess && !bIsAutoText )? 0 : nCurArrPos-1;
}
void Dec( BOOL bEndLess )
{
if( 0 == nCurArrPos-- )
nCurArrPos = (bEndLess && !bIsAutoText ) ? aArr.Count()-1 : 0;
}
void FillStrArr( SwWrtShell& rSh, const String& rWord );
};
/*--------------------------------------------------------------------
Beschreibung: Minimale Bewegung Zittern vermeiden
--------------------------------------------------------------------*/
#define HIT_PIX 2 /* Hit-Toleranz in Pixel */
#define MIN_MOVE 4
inline BOOL IsMinMove(const Point &rStartPos, const Point &rLPt)
{
return Abs(rStartPos.X() - rLPt.X()) > MIN_MOVE ||
Abs(rStartPos.Y() - rLPt.Y()) > MIN_MOVE;
}
/*--------------------------------------------------------------------
JP 30.07.98: fuer MouseButtonDown - feststellen, ob ein DrawObject
und KEIN SwgFrame getroffen wurde! Shift/Ctrl sollen
nur bei DrawObjecte zum Selektieren fuehren, bei SwgFlys
ggfs zum ausloesen von Hyperlinks (DownLoad/NewWindow!)
--------------------------------------------------------------------*/
inline BOOL IsDrawObjSelectable( const SwWrtShell& rSh, const Point& rPt )
{
BOOL bRet = TRUE;
SdrObject* pObj;
switch( rSh.GetObjCntType( rPt, pObj ))
{
case OBJCNT_NONE:
case OBJCNT_FLY:
case OBJCNT_GRF:
case OBJCNT_OLE:
bRet = FALSE;
break;
}
return bRet;
}
/*--------------------------------------------------------------------
Beschreibung: Pointer umschalten
--------------------------------------------------------------------*/
void SwEditWin::UpdatePointer(const Point &rLPt, USHORT nModifier )
{
SwWrtShell &rSh = rView.GetWrtShell();
if( pApplyTempl )
{
PointerStyle eStyle = POINTER_FILL;
if( rSh.IsOverReadOnlyPos( rLPt ))
{
if( pUserMarker )
DELETEZ( pUserMarker );
// rSh.SwCrsrShell::UnSetVisCrsr( rLPt );
eStyle = POINTER_NOTALLOWED;
}
else
{
SwRect aRect;
SwRect* pRect = &aRect;
const SwFrmFmt* pFmt = 0;
if(!pApplyTempl->nColor &&
pApplyTempl->eType == SFX_STYLE_FAMILY_FRAME &&
0 !=(pFmt = rSh.GetFmtFromObj( rLPt, &pRect )) &&
PTR_CAST(SwFlyFrmFmt, pFmt))
{
//Highlight fuer Rahmen anwerfen
Rectangle aTmp( pRect->SVRect() );
if ( !pUserMarker )
pUserMarker = new SdrViewUserMarker( rSh.GetDrawView() );
pUserMarker->SetRectangle( aTmp );
pUserMarker->Show();
}
else if(pUserMarker)
DELETEZ(pUserMarker);
rSh.SwCrsrShell::SetVisCrsr( rLPt );
}
SetPointer( eStyle );
return;
}
if( !rSh.VisArea().Width() )
return;
SET_CURR_SHELL(&rSh);
if ( IsChainMode() )
{
SwRect aRect;
int nChainable = rSh.Chainable( aRect, *rSh.GetFlyFrmFmt(), rLPt );
PointerStyle eStyle = nChainable
? POINTER_CHAIN_NOTALLOWED : POINTER_CHAIN;
if ( !nChainable )
{
Rectangle aTmp( aRect.SVRect() );
if ( !pUserMarker )
pUserMarker = new SdrViewUserMarker( rSh.GetDrawView() );
pUserMarker->SetRectangle( aTmp );
pUserMarker->Show();
}
else
{
DELETEZ( pUserMarker );
}
rView.GetViewFrame()->ShowStatusText(
SW_RESSTR(STR_CHAIN_OK+nChainable));
SetPointer( eStyle );
return;
}
BOOL bExecHyperlinks = rSh.GetViewOptions()->IsExecHyperlinks() ^
(nModifier == KEY_MOD2 ? TRUE : FALSE);
SdrView *pSdrView = rSh.GetDrawView();
BOOL bPrefSdrPointer = FALSE;
BOOL bHitHandle = FALSE;
BOOL bCntAtPos = FALSE;
BOOL bIsDocReadOnly = rView.GetDocShell()->IsReadOnly() &&
rSh.IsCrsrReadonly();
aActHitType = SDRHIT_NONE;
PointerStyle eStyle = POINTER_TEXT;
if ( !pSdrView )
bCntAtPos = TRUE;
else if ( bHitHandle = pSdrView->HitHandle( rLPt, *(rSh.GetOut())) != 0 )
{
aActHitType = SDRHIT_OBJECT;
bPrefSdrPointer = TRUE;
}
else
{
const BOOL bNotInSelObj = !rSh.IsInsideSelectedObj( rLPt );
if ( rView.GetDrawFuncPtr() && !bInsDraw && bNotInSelObj )
{
aActHitType = SDRHIT_OBJECT;
if (GetDrawMode() == SID_OBJECT_SELECT)
eStyle = POINTER_ARROW;
else
bPrefSdrPointer = TRUE;
}
else
{
SdrObject* pObj; SdrPageView* pPV;
pSdrView->SetHitTolerancePixel( HIT_PIX );
if ( bNotInSelObj && bExecHyperlinks &&
pSdrView->PickObj( rLPt, pObj, pPV, SDRSEARCH_PICKMACRO ))
{
SdrObjMacroHitRec aTmp;
aTmp.aPos = rLPt;
aTmp.pPageView = pPV;
SetPointer( pObj->GetMacroPointer( aTmp ) );
return;
}
else
{
if ( rSh.IsObjSelectable( rLPt ) )
{
if (pSdrView->IsTextEdit())
{
aActHitType = SDRHIT_NONE;
bPrefSdrPointer = TRUE;
}
else
{
SdrViewEvent aVEvt;
SdrHitKind eHit = pSdrView->PickAnything(rLPt, aVEvt);
if (eHit == SDRHIT_URLFIELD && bExecHyperlinks)
{
aActHitType = SDRHIT_OBJECT;
bPrefSdrPointer = TRUE;
}
else
{
eStyle = POINTER_MOVE;
if (!bNotInSelObj)
{
if (rSh.IsObjSelected() || rSh.IsFrmSelected())
{
if (rSh.IsSelObjProtected(FLYPROTECT_POS))
eStyle = POINTER_NOTALLOWED;
}
}
aActHitType = SDRHIT_OBJECT;
}
}
}
else
{
if ( rSh.IsFrmSelected() && !bNotInSelObj )
{
if (rSh.IsSelObjProtected(FLYPROTECT_SIZE))
eStyle = POINTER_NOTALLOWED;
else
eStyle = POINTER_MOVE;
aActHitType = SDRHIT_OBJECT;
}
else
{
if ( rView.GetDrawFuncPtr() )
bPrefSdrPointer = TRUE;
else
bCntAtPos = TRUE;
}
}
}
}
}
if ( bPrefSdrPointer )
{
if (bIsDocReadOnly || (rSh.IsObjSelected() && rSh.IsSelObjProtected(FLYPROTECT_CONTENT)))
SetPointer( POINTER_NOTALLOWED );
else
{
if (rView.GetDrawFuncPtr() && rView.GetDrawFuncPtr()->IsInsertForm() && !bHitHandle)
SetPointer( POINTER_DRAW_RECT );
else
SetPointer( pSdrView->GetPreferedPointer( rLPt, rSh.GetOut() ) );
}
}
else
{
if( pAnchorMarker )
eStyle = POINTER_ARROW;
else if( bCntAtPos && bExecHyperlinks )
{
// sollten wir ueber einem InternetAttr/ClickFeld/Fussnote stehen?
SwContentAtPos aSwContentAtPos(
SwContentAtPos::SW_CLICKFIELD|
SwContentAtPos::SW_INETATTR|
SwContentAtPos::SW_FTN );
if( rSh.GetContentAtPos( rLPt, aSwContentAtPos) )
eStyle = POINTER_REFHAND;
}
SetPointer( eStyle );
}
}
/*--------------------------------------------------------------------
Beschreibung: Timer fuer Selektion vergroessern
--------------------------------------------------------------------*/
IMPL_LINK( SwEditWin, TimerHandler, Timer *, EMPTYARG )
{
DBG_PROFSTART(edithdl);
SwWrtShell &rSh = rView.GetWrtShell();
Point aModPt( aMovePos );
const SwRect aOldVis( rSh.VisArea() );
FASTBOOL bDone = FALSE;
if ( !rSh.VisArea().IsInside( aModPt ) )
{
if ( bInsDraw )
{
const int nMaxScroll = 40;
rView.Scroll( Rectangle(aModPt,Size(1,1)), nMaxScroll, nMaxScroll);
bDone = TRUE;
}
else if ( bFrmDrag )
{
(rSh.*rSh.fnDrag)(&aModPt,FALSE);
bDone = TRUE;
}
if ( !bDone )
aModPt = rSh.GetCntntPos( aModPt,aModPt.Y() > rSh.VisArea().Bottom() );
}
if ( !bDone && !(bFrmDrag || bInsDraw) )
{
(rSh.*rSh.fnSetCrsr)( &aModPt, FALSE );
//fix(24138): Es kann sein, dass der "Sprung" ueber eine Tabelle so
//nicht geschafft wird. Deshalb wir hier eben per Up/Down ueber die
//Tabelle gesprungen.
if ( aOldVis == rSh.VisArea() &&
!rSh.IsStartOfDoc() && !rSh.IsEndOfDoc() && !rSh.IsTableMode())
{
if ( aModPt.Y() < rSh.VisArea().Top() )
rSh.Up( TRUE );
else
rSh.Down( TRUE );
}
}
aMovePos += rSh.VisArea().Pos() - aOldVis.Pos();
JustifyAreaTimer();
DBG_PROFSTOP(edithdl);
return 0;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void SwEditWin::JustifyAreaTimer()
{
const Rectangle &rVisArea = GetView().GetVisArea();
long nTimeout = 800,
nDiff = Max(
Max( aMovePos.Y() - rVisArea.Bottom(), rVisArea.Top() - aMovePos.Y() ),
Max( aMovePos.X() - rVisArea.Right(), rVisArea.Left() - aMovePos.X()));
aTimer.SetTimeout( Max( 0L, nTimeout - nDiff*2L) );
}
void SwEditWin::LeaveArea(const Point &rPos)
{
aMovePos = rPos;
JustifyAreaTimer();
if ( !aTimer.IsActive() )
aTimer.Start();
if( pShadCrsr )
delete pShadCrsr, pShadCrsr = 0;
}
inline void SwEditWin::EnterArea()
{
aTimer.Stop();
}
/*------------------------------------------------------------------------
Beschreibung: Modus fuer Rahmen einfuegen
------------------------------------------------------------------------*/
void SwEditWin::InsFrm(USHORT nCols)
{
StdDrawMode(OBJ_NONE);
bInsFrm = TRUE;
nInsFrmColCount = nCols;
}
void SwEditWin::StdDrawMode(USHORT nSlotId)
{
SetDrawMode( nSlotId );
/* if (GetDrawFuncPtr())
GetDrawFuncPtr()->Deactivate();*/
if (nSlotId == OBJ_NONE)
rView.SetDrawFuncPtr(new SwDrawBase( &rView.GetWrtShell(), this, &rView ));
else
rView.SetDrawFuncPtr(new DrawSelection( &rView.GetWrtShell(), this, &rView ));
rView.SetSelDrawSlot();
SetDrawMode(nSlotId);
rView.GetDrawFuncPtr()->Activate( nSlotId );
bInsFrm = FALSE;
nInsFrmColCount = 1;
}
void SwEditWin::StopInsFrm()
{
if (rView.GetDrawFuncPtr())
{
rView.GetDrawFuncPtr()->Deactivate();
rView.SetDrawFuncPtr(NULL);
}
rView.LeaveDrawCreate(); // Konstruktionsmode verlassen
bInsFrm = FALSE;
nInsFrmColCount = 1;
}
/*--------------------------------------------------------------------
Beschreibung: Der Character Buffer wird in das Dokument eingefuegt
--------------------------------------------------------------------*/
void SwEditWin::FlushInBuffer( SwWrtShell *pSh )
{
if ( aInBuffer.Len() )
{
pSh->Insert( aInBuffer );
aInBuffer.Erase();
bFlushCharBuffer = FALSE;
}
}
void SwEditWin::ChangeFly( BYTE nDir, BOOL bWeb )
{
SwWrtShell &rSh = rView.GetWrtShell();
SwRect aTmp = rSh.GetFlyRect();
if( aTmp.HasArea() )
{
SfxItemSet aSet(rSh.GetAttrPool(),
RES_FRM_SIZE, RES_FRM_SIZE,
RES_VERT_ORIENT, RES_ANCHOR,
RES_COL, RES_COL, 0);
rSh.GetFlyFrmAttr( aSet );
RndStdIds eAnchorId = ((SwFmtAnchor&)aSet.Get(RES_ANCHOR)).GetAnchorId();
Size aSnap( rSh.GetViewOptions()->GetSnapSize() );
short nDiv = rSh.GetViewOptions()->GetDivisionX();
if ( nDiv > 0 )
aSnap.Width() = Max( (ULONG)1, (ULONG)aSnap.Width() / nDiv );
nDiv = rSh.GetViewOptions()->GetDivisionY();
if ( nDiv > 0 )
aSnap.Height() = Max( (ULONG)1, (ULONG)aSnap.Height() / nDiv );
SwRect aBoundRect;
Point aRefPoint;
rSh.CalcBoundRect( aBoundRect, eAnchorId, FRAME, FALSE, &aRefPoint );
long nLeft = Min( aTmp.Left() - aBoundRect.Left(), aSnap.Width() );
long nRight = Min( aBoundRect.Right() - aTmp.Right(), aSnap.Width() );
long nUp = Min( aTmp.Top() - aBoundRect.Top(), aSnap.Height() );
long nDown = Min( aBoundRect.Bottom() - aTmp.Bottom(), aSnap.Height() );
switch ( nDir )
{
case 4:
case 0: aTmp.Left( aTmp.Left() - nLeft ); break;
case 5:
case 1: aTmp.Top( aTmp.Top() - nUp ); break;
case 6: if( aTmp.Width() < aSnap.Width() + MINFLY ) break;
nRight = aSnap.Width(); // kein break
case 2: aTmp.Left( aTmp.Left() + nRight ); break;
case 7: if( aTmp.Height() < aSnap.Height() + MINFLY ) break;
nDown = aSnap.Height(); // kein break
case 3: aTmp.Top( aTmp.Top() + nDown ); break;
case 8: if( aTmp.Width() >= aSnap.Width() + MINFLY )
aTmp.Right( aTmp.Right() - aSnap.Width() );
break;
case 9: if( aTmp.Height() >= aSnap.Height() + MINFLY )
aTmp.Height( aTmp.Height() - aSnap.Height() );
break;
case 10: aTmp.Width( aTmp.Width() + nRight ); break;
case 11: aTmp.Height( aTmp.Height() + nDown ); break;
default: ASSERT( TRUE, "ChangeFly: Unknown direction." );
}
BOOL bSet = FALSE;
if( nDir < 8 && FLY_IN_CNTNT == eAnchorId && ( nDir % 2 ) )
{
long aDiff = aTmp.Top() - aRefPoint.Y();
if( aDiff > 0 )
aDiff = 0;
else if ( aDiff < -aTmp.Height() )
aDiff = -aTmp.Height();
SwFmtVertOrient aVert( (SwFmtVertOrient&)aSet.Get(RES_VERT_ORIENT) );
SwVertOrient eNew;
if( bWeb )
{
eNew = aVert.GetVertOrient();
BOOL bDown = 0 != ( nDir & 0x02 );
switch( eNew )
{
case VERT_CHAR_TOP:
if( bDown ) eNew = VERT_CENTER; break;
case VERT_CENTER:
eNew = bDown ? VERT_TOP : VERT_CHAR_TOP; break;
case VERT_TOP:
if( !bDown ) eNew = VERT_CENTER; break;
case VERT_LINE_TOP:
if( bDown ) eNew = VERT_LINE_CENTER; break;
case VERT_LINE_CENTER:
eNew = bDown ? VERT_LINE_BOTTOM : VERT_LINE_TOP; break;
case VERT_LINE_BOTTOM:
if( !bDown ) eNew = VERT_LINE_CENTER; break;
}
}
else
{
aVert.SetPos( aDiff );
eNew = VERT_NONE;
}
aVert.SetVertOrient( eNew );
aSet.Put( aVert );
bSet = TRUE;
}
if( bWeb && FLY_AT_CNTNT == eAnchorId && ( nDir==0 || nDir==2 ) )
{
SwFmtHoriOrient aHori( (SwFmtHoriOrient&)aSet.Get(RES_HORI_ORIENT) );
SwHoriOrient eNew;
eNew = aHori.GetHoriOrient();
switch( eNew )
{
case HORI_RIGHT:
if( !nDir ) eNew = HORI_LEFT; break;
case HORI_LEFT:
if( nDir ) eNew = HORI_RIGHT; break;
}
if( eNew != aHori.GetHoriOrient() )
{
aHori.SetHoriOrient( eNew );
aSet.Put( aHori );
bSet = TRUE;
}
}
if( nDir > 3 )
{
SwFmtFrmSize aSize( (SwFmtFrmSize&)aSet.Get(RES_FRM_SIZE) );
long nMinWidth = MINFLY;
// alle Spalten muessen passen
if (SFX_ITEM_DEFAULT <= aSet.GetItemState(RES_COL))
{
const SwFmtCol& rCol = (const SwFmtCol&)aSet.Get(RES_COL);
if ( rCol.GetColumns().Count() > 1 )
{
for ( USHORT i = 0; i < rCol.GetColumns().Count(); ++i )
{
nMinWidth += rCol.GetColumns()[i]->GetLeft() +
rCol.GetColumns()[i]->GetRight() +
MINFLY;
}
nMinWidth -= MINFLY;//einen hatten wir schon mit drin!
}
}
aSize.SetSize(Size(Max(aTmp.Width(), nMinWidth), Max(aTmp.Height(), long(MINFLY))));
aSet.Put( aSize );
bSet = TRUE;
}
rSh.StartAllAction();
if( bSet )
rSh.SetFlyFrmAttr( aSet );
if( !bWeb && nDir < 8 && FLY_IN_CNTNT != eAnchorId )
rSh.SetFlyPos( aTmp.Pos() );
rSh.EndAllAction();
}
}
/*--------------------------------------------------------------------
Beschreibung: KeyEvents
--------------------------------------------------------------------*/
void SwEditWin::KeyInput(const KeyEvent &rKEvt)
{
SfxObjectShell *pObjSh = (SfxObjectShell*)rView.GetViewFrame()->GetObjectShell();
if ( bLockInput || pObjSh && pObjSh->GetProgress() )
// Wenn die Rechenleiste aktiv ist oder
// auf dem Document ein Progress laeuft wird keine
// Bestellungen angenommen.
return;
if( pShadCrsr )
delete pShadCrsr, pShadCrsr = 0;
aKeyInputFlushTimer.Stop();
SwWrtShell &rSh = rView.GetWrtShell();
BOOL bIsDocReadOnly = rView.GetDocShell()->IsReadOnly() &&
rSh.IsCrsrReadonly();
QuickHelpData aTmpQHD;
if( pQuickHlpData->bClear )
{
aTmpQHD.Move( *pQuickHlpData );
pQuickHlpData->Stop( rSh );
}
// OS:auch die DrawView braucht noch ein readonly-Flag
if ( !bIsDocReadOnly && rSh.GetDrawView() && rSh.GetDrawView()->KeyInput( rKEvt, this ) )
{
rSh.GetView().GetViewFrame()->GetBindings().InvalidateAll( FALSE );
rSh.SetModified();
return; // Event von der SdrView ausgewertet
}
if ( rView.GetDrawFuncPtr() && bInsFrm )
{
StopInsFrm();
rSh.Edit();
}
BOOL bFlushBuffer = FALSE;
BOOL bNormalChar = FALSE;
BOOL bChkInsBlank = pQuickHlpData->bChkInsBlank;
pQuickHlpData->bChkInsBlank = FALSE;
const KeyCode& rKeyCode = rKEvt.GetKeyCode();
sal_Unicode aCh = rKEvt.GetCharCode();
const SwFrmFmt* pFlyFmt = rSh.GetFlyFrmFmt();
if( pFlyFmt )
{
USHORT nEvent;
if( 32 <= aCh &&
0 == (( KEY_MOD1 | KEY_MOD2 ) & rKeyCode.GetModifier() ))
nEvent = SW_EVENT_FRM_KEYINPUT_ALPHA;
else
nEvent = SW_EVENT_FRM_KEYINPUT_NOALPHA;
const SvxMacro* pMacro = pFlyFmt->GetMacro().GetMacroTable().Get( nEvent );
if( pMacro )
{
String sRet;
SbxArrayRef xArgs = new SbxArray;
SbxVariableRef xVar = new SbxVariable;
xVar->PutString( pFlyFmt->GetName() );
xArgs->Put( &xVar, 1 );
xVar = new SbxVariable;
if( SW_EVENT_FRM_KEYINPUT_ALPHA == nEvent )
xVar->PutChar( aCh );
else
xVar->PutUShort( rKeyCode.GetModifier() | rKeyCode.GetCode() );
xArgs->Put( &xVar, 2 );
rSh.ExecMacro( *pMacro, &sRet, &xArgs );
if( sRet.Len() && 0 != sRet.ToInt32() )
return ;
}
}
OfaAutoCorrCfg* pACfg = OFF_APP()->GetAutoCorrConfig();
SvxAutoCorrect* pACorr = pACfg->GetAutoCorrect();
SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
/*TblChgWidthHeightType*/int eTblChgMode;
USHORT nTblChgSize = 0;
BOOL bStopKeyInputTimer = TRUE;
String sFmlEntry;
enum SW_KeyState { KS_Start,
KS_CheckKey, KS_InsChar, KS_InsTab,
KS_NoNum, KS_NumOff, KS_NumOrNoNum, KS_NumDown, KS_NumUp,
KS_NextCell, KS_PrevCell, KS_OutlineUp, KS_OutlineDown,
KS_GlossaryExpand, KS_NextPrevGlossary,
KS_AutoFmtByInput, KS_DontExpand,
KS_KeyToView,
KS_CheckAutoCorrect, KS_EditFormula,
KS_ColLeftBig, KS_ColRightBig,
KS_ColLeftSmall, KS_ColRightSmall,
KS_ColTopBig, KS_ColBottomBig,
KS_ColTopSmall, KS_ColBottomSmall,
KS_CellLeftBig, KS_CellRightBig,
KS_CellLeftSmall, KS_CellRightSmall,
KS_CellTopBig, KS_CellBottomBig,
KS_CellTopSmall, KS_CellBottomSmall,
//-----
KS_InsDel_ColLeftBig, KS_InsDel_ColRightBig,
KS_InsDel_ColLeftSmall, KS_InsDel_ColRightSmall,
KS_InsDel_ColTopBig, KS_InsDel_ColBottomBig,
KS_InsDel_ColTopSmall, KS_InsDel_ColBottomSmall,
KS_InsDel_CellLeftBig, KS_InsDel_CellRightBig,
KS_InsDel_CellLeftSmall, KS_InsDel_CellRightSmall,
KS_InsDel_CellTopBig, KS_InsDel_CellBottomBig,
KS_InsDel_CellTopSmall, KS_InsDel_CellBottomSmall,
KS_TblColCellInsDel,
//-----
KS_Fly_Change,
KS_AppendNodeInSection,
KS_Ende };
SW_KeyState eKeyState = bIsDocReadOnly ? KS_KeyToView : KS_CheckKey,
eNextKeyState = KS_Ende;
while( KS_Ende != eKeyState )
{
SW_KeyState eFlyState = KS_KeyToView;
BYTE nDir;
switch( eKeyState )
{
case KS_CheckKey:
eKeyState = KS_KeyToView; // default weiter zur View
#ifndef PRODUCT
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// JP 19.01.99: zum Umschalten des Cursor Verhaltens in ReadOnly
// Bereichen
if( 0x7210 == rKeyCode.GetFullCode() )
rSh.SetReadOnlyAvailable( !rSh.IsReadOnlyAvailable() );
else
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#endif
if( !rKeyCode.IsControlMod() && '=' == aCh &&
!rSh.IsTableMode() && rSh.GetTableFmt() &&
rSh.IsSttPara() /*&& rSh.IsEndPara()*/ &&
!rSh.HasReadonlySel() )
{
// in der Tabelle am Anfang der Zelle ein '=' ->
// EditZeile aufrufen (F2-Funktionalitaet)
rSh.Push();
if( !rSh.MoveSection( fnSectionCurr, fnSectionStart) &&
!rSh.IsTableBoxTextFormat() )
{
// steht also am Anfang der Box
eKeyState = KS_EditFormula;
if( rSh.HasMark() )
rSh.SwapPam();
else
rSh.SttSelect();
rSh.MoveSection( fnSectionCurr, fnSectionEnd );
rSh.Pop( TRUE );
rSh.EndSelect();
sFmlEntry = '=';
}
else
rSh.Pop( FALSE );
}
else
{
if( pACorr && aTmpQHD.HasCntnt() && !rSh.HasSelection() &&
!rSh.HasReadonlySel() && !aTmpQHD.bIsAutoText &&
pACorr->GetSwFlags().nAutoCmpltExpandKey ==
(rKeyCode.GetModifier() | rKeyCode.GetCode()) )
{
eKeyState = KS_GlossaryExpand;
break;
}
switch( rKeyCode.GetModifier() | rKeyCode.GetCode() )
{
case KEY_RIGHT | KEY_MOD2:
eKeyState = KS_ColRightBig;
eFlyState = KS_Fly_Change;
nDir = 2;
goto KEYINPUT_CHECKTABLE;
case KEY_LEFT | KEY_MOD2:
eKeyState = KS_ColRightSmall;
eFlyState = KS_Fly_Change;
nDir = 0;
goto KEYINPUT_CHECKTABLE;
case KEY_RIGHT | KEY_MOD2 | KEY_SHIFT:
eKeyState = KS_ColLeftSmall;
goto KEYINPUT_CHECKTABLE;
case KEY_LEFT | KEY_MOD2 | KEY_SHIFT:
eKeyState = KS_ColLeftBig;
goto KEYINPUT_CHECKTABLE;
case KEY_RIGHT | KEY_MOD2 | KEY_MOD1:
eKeyState = KS_CellRightBig;
eFlyState = KS_Fly_Change;
nDir = 10;
goto KEYINPUT_CHECKTABLE;
case KEY_LEFT | KEY_MOD2 | KEY_MOD1:
eKeyState = KS_CellRightSmall;
eFlyState = KS_Fly_Change;
nDir = 8;
goto KEYINPUT_CHECKTABLE;
case KEY_RIGHT | KEY_MOD2 | KEY_SHIFT | KEY_MOD1:
eKeyState = KS_CellLeftSmall;
eFlyState = KS_Fly_Change;
nDir = 6;
goto KEYINPUT_CHECKTABLE;
case KEY_LEFT | KEY_MOD2 | KEY_SHIFT | KEY_MOD1:
eKeyState = KS_CellLeftBig;
eFlyState = KS_Fly_Change;
nDir = 4;
goto KEYINPUT_CHECKTABLE;
case KEY_UP | KEY_MOD2:
eKeyState = KS_ColBottomSmall;
eFlyState = KS_Fly_Change;
nDir = 1;
goto KEYINPUT_CHECKTABLE;
case KEY_DOWN | KEY_MOD2:
eKeyState = KS_ColBottomBig;
eFlyState = KS_Fly_Change;
nDir = 3;
goto KEYINPUT_CHECKTABLE;
case KEY_UP | KEY_MOD2 | KEY_SHIFT:
eKeyState = KS_ColTopBig;
goto KEYINPUT_CHECKTABLE;
case KEY_DOWN | KEY_MOD2 | KEY_SHIFT:
eKeyState = KS_ColTopSmall;
goto KEYINPUT_CHECKTABLE;
case KEY_UP | KEY_MOD2 | KEY_MOD1:
eKeyState = KS_CellBottomSmall;
eFlyState = KS_Fly_Change;
nDir = 9;
goto KEYINPUT_CHECKTABLE;
case KEY_DOWN | KEY_MOD2 | KEY_MOD1:
eKeyState = KS_CellBottomBig;
eFlyState = KS_Fly_Change;
nDir = 11;
goto KEYINPUT_CHECKTABLE;
case KEY_UP | KEY_MOD2 | KEY_SHIFT | KEY_MOD1:
eKeyState = KS_CellTopBig;
eFlyState = KS_Fly_Change;
nDir = 5;
goto KEYINPUT_CHECKTABLE;
case KEY_DOWN | KEY_MOD2 | KEY_SHIFT | KEY_MOD1:
eKeyState = KS_CellTopSmall;
eFlyState = KS_Fly_Change;
nDir = 7;
goto KEYINPUT_CHECKTABLE;
KEYINPUT_CHECKTABLE:
if( rSh.IsTableMode() || !rSh.GetTableFmt() )
{
if( pFlyFmt && KS_KeyToView != eFlyState )
{
const SfxPoolItem* pItem;
if( SFX_ITEM_SET == pFlyFmt->GetItemState(
RES_PROTECT, TRUE, &pItem ) && (
((SvxProtectItem*)pItem)->IsSizeProtected() ||
((SvxProtectItem*)pItem)->IsPosProtected() ))
{
//JP 18.01.99: man koennte es noch feiner
// ermitteln (nDir auswerten)
pFlyFmt = 0;
}
}
if( pFlyFmt )
eKeyState = eFlyState;
else
eKeyState = KS_KeyToView;
}
break;
//-------
// Insert/Delete
case KEY_LEFT:
case KEY_LEFT | KEY_MOD1:
eTblChgMode = WH_FLAG_INSDEL |
( rKeyCode.GetModifier() & KEY_MOD1
? WH_CELL_LEFT
: WH_COL_LEFT );
nTblChgSize = pModOpt->GetTblVInsert();
goto KEYINPUT_CHECKTABLE_INSDEL;
// case KEY_RIGHT:
case KEY_RIGHT | KEY_MOD1:
eTblChgMode = WH_FLAG_INSDEL | WH_CELL_RIGHT;
nTblChgSize = pModOpt->GetTblVInsert();
goto KEYINPUT_CHECKTABLE_INSDEL;
case KEY_UP:
case KEY_UP | KEY_MOD1:
eTblChgMode = WH_FLAG_INSDEL |
( rKeyCode.GetModifier() & KEY_MOD1
? WH_CELL_TOP
: WH_ROW_TOP );
nTblChgSize = pModOpt->GetTblHInsert();
goto KEYINPUT_CHECKTABLE_INSDEL;
case KEY_DOWN:
case KEY_DOWN | KEY_MOD1:
eTblChgMode = WH_FLAG_INSDEL |
( rKeyCode.GetModifier() & KEY_MOD1
? WH_CELL_BOTTOM
: WH_ROW_BOTTOM );
nTblChgSize = pModOpt->GetTblHInsert();
goto KEYINPUT_CHECKTABLE_INSDEL;
KEYINPUT_CHECKTABLE_INSDEL:
if( rSh.IsTableMode() || !rSh.GetTableFmt() ||
!bTblInsDelMode ||
FALSE /* Tabelle geschuetzt */
)
eKeyState = KS_KeyToView;
else
{
if( !bTblIsInsMode )
eTblChgMode = eTblChgMode | WH_FLAG_BIGGER;
eKeyState = KS_TblColCellInsDel;
}
break;
case KEY_DELETE | KEY_MOD2:
if( !rSh.IsTableMode() && rSh.GetTableFmt() )
{
eKeyState = KS_Ende;
bTblInsDelMode = TRUE;
bTblIsInsMode = FALSE;
bTblIsColMode = TRUE;
aKeyInputTimer.Start();
bStopKeyInputTimer = FALSE;
}
break;
case KEY_INSERT | KEY_MOD2:
if( !rSh.IsTableMode() && rSh.GetTableFmt() )
{
eKeyState = KS_Ende;
bTblInsDelMode = TRUE;
bTblIsInsMode = TRUE;
bTblIsColMode = TRUE;
aKeyInputTimer.Start();
bStopKeyInputTimer = FALSE;
}
break;
case KEY_RETURN: // Return
if( !rSh.HasReadonlySel() )
{
if( aTmpQHD.HasCntnt() && !rSh.HasSelection() &&
aTmpQHD.bIsAutoText )
eKeyState = KS_GlossaryExpand;
//RETURN und leerer Absatz in Numerierung -> Num. beenden
else if( rSh.GetCurNumRule() && !rSh.HasSelection() &&
rSh.IsSttPara() && rSh.IsEndPara() )
eKeyState = KS_NumOff;
//RETURN fuer neuen Absatz mit AutoFormatierung
else if( pACfg && pACfg->IsAutoFmtByInput() &&
!(rSh.GetSelectionType() & (SwWrtShell::SEL_GRF |
SwWrtShell::SEL_OLE | SwWrtShell::SEL_FRM |
SwWrtShell::SEL_TBL_CELLS | SwWrtShell::SEL_DRW |
SwWrtShell::SEL_DRW_TXT)) )
eKeyState = KS_CheckAutoCorrect, eNextKeyState = KS_AutoFmtByInput;
else
eNextKeyState = eKeyState, eKeyState = KS_CheckAutoCorrect;
}
break;
case KEY_RETURN | KEY_MOD2: // ALT-Return
if( !rSh.HasReadonlySel() && rSh.GetCurNumRule() )
eKeyState = KS_NoNum;
else if( rSh.CanInsertNodeAtEndOfSection() )
eKeyState = KS_AppendNodeInSection;
break;
case KEY_BACKSPACE:
case KEY_BACKSPACE | KEY_SHIFT:
if( !rSh.HasReadonlySel() )
{
BOOL bOutline = FALSE;
#ifdef TASK_59308
const SwTxtFmtColl* pColl;
if( !rSh.SwCrsrShell::HasSelection() &&
0 != ( pColl = rSh.GetCurTxtFmtColl() ) &&
NO_NUMBERING != pColl->GetOutlineLevel() &&
NO_NUMBERING == rSh.GetNumLevel( FALSE ) )
bOutline = TRUE;
#endif
if( rSh.NumOrNoNum(
KEY_BACKSPACE != rKeyCode.GetFullCode(),
TRUE, bOutline ))
eKeyState = KS_NumOrNoNum;
}
break;
case KEY_END:
if( !rSh.HasReadonlySel() && rSh.IsEndPara() &&
rSh.DontExpandFmt() )
eKeyState = KS_DontExpand;
break;
case KEY_RIGHT:
if( !rSh.HasReadonlySel() )
{
if( rSh.IsEndPara() && rSh.DontExpandFmt() )
eKeyState = KS_DontExpand;
else
{
eTblChgMode = WH_FLAG_INSDEL | WH_COL_RIGHT;
nTblChgSize = pModOpt->GetTblVInsert();
goto KEYINPUT_CHECKTABLE_INSDEL;
}
}
break;
case KEY_TAB:
{
#ifdef SW_CRSR_TIMER
BOOL bOld = rSh.ChgCrsrTimerFlag( FALSE );
#endif
if( rSh.GetCurNumRule() && rSh.IsSttOfPara() &&
!rSh.HasReadonlySel() )
eKeyState = KS_NumDown;
else if ( rSh.GetTableFmt() )
{
if( rSh.HasSelection() || rSh.HasReadonlySel() )
eKeyState = KS_NextCell;
else
eKeyState = KS_CheckAutoCorrect, eNextKeyState = KS_NextCell;
}
else
{
eKeyState = KS_InsTab;
if( rSh.IsSttOfPara() && !rSh.HasReadonlySel() )
{
SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
if( pColl && 0 <= pColl->GetOutlineLevel() &&
MAXLEVEL - 1 > pColl->GetOutlineLevel() )
eKeyState = KS_OutlineDown;
}
}
#ifdef SW_CRSR_TIMER
rSh.ChgCrsrTimerFlag( bOld );
#endif
}
break;
case KEY_TAB | KEY_SHIFT:
{
#ifdef SW_CRSR_TIMER
BOOL bOld = rSh.ChgCrsrTimerFlag( FALSE );
#endif
if( rSh.GetCurNumRule() && rSh.IsSttOfPara() &&
!rSh.HasReadonlySel() )
eKeyState = KS_NumUp;
else if ( rSh.GetTableFmt() )
{
if( rSh.HasSelection() || rSh.HasReadonlySel() )
eKeyState = KS_PrevCell;
else
eKeyState = KS_CheckAutoCorrect, eNextKeyState = KS_PrevCell;
}
else
{
eKeyState = KS_Ende;
if( rSh.IsSttOfPara() && !rSh.HasReadonlySel() )
{
SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
if( pColl && 0 < pColl->GetOutlineLevel() &&
MAXLEVEL - 1 >= pColl->GetOutlineLevel() )
eKeyState = KS_OutlineUp;
}
}
#ifdef SW_CRSR_TIMER
rSh.ChgCrsrTimerFlag( bOld );
#endif
}
break;
case KEY_TAB | KEY_MOD1:
if( !rSh.HasReadonlySel() )
{
if( aTmpQHD.HasCntnt() && !rSh.HasSelection() )
{
// zum naechsten Tip
aTmpQHD.Inc( pACorr && pACorr->GetSwFlags().
bAutoCmpltEndless );
eKeyState = KS_NextPrevGlossary;
}
else if( rSh.GetTableFmt() )
eKeyState = KS_InsTab;
else if( rSh.IsSttOfPara() )
{
if( rSh.GetCurNumRule() )
eKeyState = KS_InsTab;
else
{
SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
if( pColl && 0 <= pColl->GetOutlineLevel() &&
MAXLEVEL - 1 > pColl->GetOutlineLevel() )
eKeyState = KS_InsTab;
}
}
}
break;
case KEY_TAB | KEY_MOD1 | KEY_SHIFT:
if( aTmpQHD.HasCntnt() && !rSh.HasSelection() &&
!rSh.HasReadonlySel() )
{
// zum vorherigen Tip
aTmpQHD.Dec( pACorr && pACorr->GetSwFlags().
bAutoCmpltEndless );
eKeyState = KS_NextPrevGlossary;
}
break;
}
}
break;
case KS_KeyToView:
{
eKeyState = KS_Ende;
bNormalChar = !rKeyCode.IsControlMod() &&
SW_ISPRINTABLE( aCh );
if( aInBuffer.Len() && ( !bNormalChar || bIsDocReadOnly ))
FlushInBuffer( &rSh );
if( rView.KeyInput( rKEvt ) )
bFlushBuffer = TRUE, bNormalChar = FALSE;
else
{
// OS 22.09.95: Da der Sfx Acceleratoren nur aufruft, wenn sie beim letzten
// Statusupdate enabled wurden, muss copy ggf. von uns
// 'gewaltsam' gerufen werden.
if( rKeyCode.GetFunction() == KEYFUNC_COPY )
GetView().GetViewFrame()->GetDispatcher()->Execute(SID_COPY);
if( !bIsDocReadOnly && bNormalChar )
eKeyState = KS_InsChar;
else
{
bNormalChar = FALSE;
Window::KeyInput( rKEvt );
}
}
}
break;
case KS_InsTab:
if( rView.ISA( SwWebView )) //Kein Tabulator fuer Web!
{
// Bug 56196 - dann sollte der weiter gereicht werden.
Window::KeyInput( rKEvt );
eKeyState = KS_Ende;
break;
}
aCh = '\t';
// kein break!
case KS_InsChar:
if( !rSh.HasReadonlySel() )
{
BOOL bIsNormalChar = GetAppCharClass().isLetterNumeric(
String( aCh ), 0 );
if( bChkInsBlank && bIsNormalChar &&
(aInBuffer.Len() || !rSh.IsSttPara() || !rSh.IsEndPara() ))
{
// vor dem Zeichen noch ein Blank einfuegen. Dieses
// kommt zwischen den Expandierten Text und dem neuen
// "nicht Worttrenner".
aInBuffer.Expand( aInBuffer.Len() + 1, ' ' );
}
if( !rKEvt.GetRepeat() && pACorr &&
(( pACorr->IsAutoCorrFlag( ChgWeightUnderl ) &&
( '*' == aCh || '_' == aCh ) ) ||
( pACorr->IsAutoCorrFlag( ChgQuotes ) && ('\"' == aCh ))||
( pACorr->IsAutoCorrFlag( ChgSglQuotes ) && ( '\'' == aCh))))
{
FlushInBuffer( &rSh );
rSh.AutoCorrect( *pACorr, aCh );
if( '\"' != aCh && '\'' != aCh ) // nur bei "*_" rufen!
rSh.UpdateAttr();
}
else if( !rKEvt.GetRepeat() && pACorr &&
pACorr->IsAutoCorrFlag( CptlSttSntnc | CptlSttWrd |
ChgFractionSymbol | ChgOrdinalNumber |
ChgToEnEmDash | SetINetAttr |
Autocorrect ) &&
'\"' != aCh && '\'' != aCh && '*' != aCh && '_' != aCh &&
!bIsNormalChar
)
{
FlushInBuffer( &rSh );
rSh.AutoCorrect( *pACorr, aCh );
}
else
{
aInBuffer.Expand( aInBuffer.Len() + rKEvt.GetRepeat() + 1,aCh );
bFlushCharBuffer = Application::AnyInput( INPUT_KEYBOARD );
bFlushBuffer = !bFlushCharBuffer;
if( bFlushCharBuffer )
aKeyInputFlushTimer.Start();
}
eKeyState = KS_Ende;
}
else
{
InfoBox( this, SW_RES( MSG_READONLY_CONTENT )).Execute();
// ??? Window::KeyInput( rKEvt );
eKeyState = KS_Ende;
}
break;
case KS_CheckAutoCorrect:
{
if( pACorr &&
pACorr->IsAutoCorrFlag( CptlSttSntnc | CptlSttWrd |
ChgFractionSymbol | ChgOrdinalNumber |
ChgToEnEmDash | SetINetAttr |
Autocorrect ) &&
!rSh.HasReadonlySel() )
{
FlushInBuffer( &rSh );
rSh.AutoCorrect( *pACorr, 0 );
}
eKeyState = eNextKeyState;
}
break;
default:
{
TypeId pTypeId = 0;
FlushInBuffer( &rSh );
//??? if( bFlushCharBuffer )
//??? FlushInBuffer( &rSh );
switch( eKeyState )
{
case KS_AppendNodeInSection:
{
rSh.AppendNodeInSection();
}
break;
case KS_NoNum:
{
rSh.NoNum();
pTypeId = TYPE(SwListShell);
}
break;
case KS_NumOff:
{
// Shellwechsel - also vorher aufzeichnen
rSh.DelNumRules();
}
break;
case KS_NumDown:
{
rSh.NumUpDown( TRUE );
}
break;
case KS_NumUp:
{
rSh.NumUpDown( FALSE );
}
break;
case KS_NumOrNoNum:
{
//Backspace in Numerierung und Nummer -> Nummer auschalten
//SHIFT-Backspace in Numerierung und NoNum -> Nummer wieder einschalten
pTypeId = TYPE(SwListShell);
}
break;
case KS_OutlineDown:
rSh.OutlineUpDown( 1 );
break;
case KS_OutlineUp:
rSh.OutlineUpDown( -1 );
break;
case KS_NextCell:
{
//In Tabelle immer 'flushen'
rSh.GoNextCell();
}
break;
case KS_PrevCell:
{
rSh.GoPrevCell();
}
break;
case KS_AutoFmtByInput:
{
rSh.SplitNode( TRUE );
pTypeId = TYPE(SwTextShell);
}
break;
case KS_DontExpand:
break;
case KS_GlossaryExpand:
{
// ersetze das Wort oder Kuerzel durch den den Textbaustein
rSh.StartUndo( UNDO_START );
String sFnd( *aTmpQHD.aArr[ aTmpQHD.nCurArrPos ] );
if( aTmpQHD.bIsAutoText )
{
SwGlossaryList* pList = ::GetGlossaryList();
String sShrtNm;
String sGroup;
if(pList->GetShortName( sFnd, sShrtNm, sGroup))
{
rSh.SttSelect();
rSh.ExtendSelection( FALSE, aTmpQHD.nLen );
SwGlossaryHdl* pGlosHdl = GetView().GetGlosHdl();
pGlosHdl->SetCurGroup(sGroup, TRUE);
pGlosHdl->InsertGlossary( sShrtNm);
pQuickHlpData->bChkInsBlank = TRUE;
}
}
else
{
rSh.Insert( sFnd.Erase( 0, aTmpQHD.nLen ));
pQuickHlpData->bChkInsBlank = !pACorr ||
pACorr->GetSwFlags().bAutoCmpltAppendBlanc;
}
rSh.EndUndo( UNDO_END );
}
break;
case KS_NextPrevGlossary:
pQuickHlpData->Move( aTmpQHD );
pQuickHlpData->Start( rSh, USHRT_MAX );
break;
case KS_EditFormula:
{
pTypeId = TYPE(SwTextShell);
const USHORT nId = SwInputChild::GetChildWindowId();
SfxViewFrame* pVFrame = GetView().GetViewFrame();
pVFrame->ToggleChildWindow( nId );
SwInputChild* pChildWin = (SwInputChild*)pVFrame->
GetChildWindow( nId );
if( pChildWin )
pChildWin->SetFormula( sFmlEntry );
}
break;
case KS_ColLeftBig: rSh.SetColRowWidthHeight( WH_COL_LEFT|WH_FLAG_BIGGER, pModOpt->GetTblHMove() ); break;
case KS_ColRightBig: rSh.SetColRowWidthHeight( WH_COL_RIGHT|WH_FLAG_BIGGER, pModOpt->GetTblHMove() ); break;
case KS_ColLeftSmall: rSh.SetColRowWidthHeight( WH_COL_LEFT, pModOpt->GetTblHMove() ); break;
case KS_ColRightSmall: rSh.SetColRowWidthHeight( WH_COL_RIGHT, pModOpt->GetTblHMove() ); break;
case KS_ColTopBig: rSh.SetColRowWidthHeight( WH_ROW_TOP|WH_FLAG_BIGGER, pModOpt->GetTblVMove() ); break;
case KS_ColBottomBig: rSh.SetColRowWidthHeight( WH_ROW_BOTTOM|WH_FLAG_BIGGER, pModOpt->GetTblVMove() ); break;
case KS_ColTopSmall: rSh.SetColRowWidthHeight( WH_ROW_TOP, pModOpt->GetTblVMove() ); break;
case KS_ColBottomSmall: rSh.SetColRowWidthHeight( WH_ROW_BOTTOM, pModOpt->GetTblVMove() ); break;
case KS_CellLeftBig: rSh.SetColRowWidthHeight( WH_CELL_LEFT|WH_FLAG_BIGGER, pModOpt->GetTblHMove() ); break;
case KS_CellRightBig: rSh.SetColRowWidthHeight( WH_CELL_RIGHT|WH_FLAG_BIGGER, pModOpt->GetTblHMove() ); break;
case KS_CellLeftSmall: rSh.SetColRowWidthHeight( WH_CELL_LEFT, pModOpt->GetTblHMove() ); break;
case KS_CellRightSmall: rSh.SetColRowWidthHeight( WH_CELL_RIGHT, pModOpt->GetTblHMove() ); break;
case KS_CellTopBig: rSh.SetColRowWidthHeight( WH_CELL_TOP|WH_FLAG_BIGGER, pModOpt->GetTblVMove() ); break;
case KS_CellBottomBig: rSh.SetColRowWidthHeight( WH_CELL_BOTTOM|WH_FLAG_BIGGER, pModOpt->GetTblVMove() ); break;
case KS_CellTopSmall: rSh.SetColRowWidthHeight( WH_CELL_TOP, pModOpt->GetTblVMove() ); break;
case KS_CellBottomSmall: rSh.SetColRowWidthHeight( WH_CELL_BOTTOM, pModOpt->GetTblVMove() ); break;
//---------------
case KS_InsDel_ColLeftBig: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_COL_LEFT|WH_FLAG_BIGGER, pModOpt->GetTblHInsert() ); break;
case KS_InsDel_ColRightBig: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_COL_RIGHT|WH_FLAG_BIGGER, pModOpt->GetTblHInsert() ); break;
case KS_InsDel_ColLeftSmall: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_COL_LEFT, pModOpt->GetTblHInsert() ); break;
case KS_InsDel_ColRightSmall: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_COL_RIGHT, pModOpt->GetTblHInsert() ); break;
case KS_InsDel_ColTopBig: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_ROW_TOP|WH_FLAG_BIGGER, pModOpt->GetTblVInsert() ); break;
case KS_InsDel_ColBottomBig: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_ROW_BOTTOM|WH_FLAG_BIGGER, pModOpt->GetTblVInsert() ); break;
case KS_InsDel_ColTopSmall: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_ROW_TOP, pModOpt->GetTblVInsert() ); break;
case KS_InsDel_ColBottomSmall: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_ROW_BOTTOM, pModOpt->GetTblVInsert() ); break;
case KS_InsDel_CellLeftBig: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_LEFT|WH_FLAG_BIGGER, pModOpt->GetTblHInsert() ); break;
case KS_InsDel_CellRightBig: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_RIGHT|WH_FLAG_BIGGER, pModOpt->GetTblHInsert() ); break;
case KS_InsDel_CellLeftSmall: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_LEFT, pModOpt->GetTblHInsert() ); break;
case KS_InsDel_CellRightSmall: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_RIGHT, pModOpt->GetTblHInsert() ); break;
case KS_InsDel_CellTopBig: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_TOP|WH_FLAG_BIGGER, pModOpt->GetTblVInsert() ); break;
case KS_InsDel_CellBottomBig: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_BOTTOM|WH_FLAG_BIGGER, pModOpt->GetTblVInsert() ); break;
case KS_InsDel_CellTopSmall: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_TOP, pModOpt->GetTblVInsert() ); break;
case KS_InsDel_CellBottomSmall: rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_BOTTOM, pModOpt->GetTblVInsert() ); break;
//---------------
case KS_TblColCellInsDel:
rSh.SetColRowWidthHeight( eTblChgMode, nTblChgSize );
break;
case KS_Fly_Change:
ChangeFly( nDir, rView.ISA( SwWebView ) );
break;
}
eKeyState = KS_Ende;
}
}
}
if( bStopKeyInputTimer )
{
aKeyInputTimer.Stop();
bTblInsDelMode = FALSE;
}
// falls die gepufferten Zeichen eingefuegt werden sollen
if( bFlushBuffer && aInBuffer.Len() )
{
//OS 16.02.96 11.04: bFlushCharBuffer wurde hier nicht zurueckgesetzt
// warum nicht?
BOOL bSave = bFlushCharBuffer;
FlushInBuffer(&rSh);
bFlushCharBuffer = bSave;
// evt. Tip-Hilfe anzeigen
String sWord;
if( bNormalChar && pACfg && pACorr &&
( pACfg->IsAutoTextTip() ||
pACorr->GetSwFlags().bAutoCompleteWords ) &&
rSh.GetPrevAutoCorrWord( *pACorr, sWord ) )
{
pQuickHlpData->ClearCntnt();
if( pACfg->IsAutoTextTip() )
{
SwGlossaryList* pList = ::GetGlossaryList();
pList->HasLongName( sWord, &pQuickHlpData->aArr );
}
if( pQuickHlpData->aArr.Count() )
{
pQuickHlpData->bIsTip = TRUE;
pQuickHlpData->bIsAutoText = TRUE;
}
else if( pACorr->GetSwFlags().bAutoCompleteWords )
{
pQuickHlpData->bIsAutoText = FALSE;
pQuickHlpData->bIsTip = !pACorr ||
pACorr->GetSwFlags().bAutoCmpltShowAsTip;
pQuickHlpData->FillStrArr( rSh, sWord );
}
if( pQuickHlpData->aArr.Count() )
pQuickHlpData->Start( rSh, sWord.Len() );
}
}
}
/*--------------------------------------------------------------------
Beschreibung: MouseEvents
--------------------------------------------------------------------*/
void SwEditWin::RstMBDownFlags()
{
//Nicht auf allen Systemen kommt vor dem modalen
//Dialog noch ein MouseButton Up (wie unter WINDOWS).
//Daher hier die Stati zuruecksetzen und die Maus
//fuer den Dialog freigeben.
bMBPressed = bNoInterrupt = FALSE;
EnterArea();
ReleaseMouse();
}
void SwEditWin::MouseButtonDown(const MouseEvent& rMEvt)
{
GrabFocus();
bWasShdwCrsr = 0 != pShadCrsr;
if( bWasShdwCrsr )
delete pShadCrsr, pShadCrsr = 0;
SwWrtShell &rSh = rView.GetWrtShell();
const Point aDocPos( PixelToLogic( rMEvt.GetPosPixel() ) );
if ( IsChainMode() )
{
SetChainMode( FALSE );
SwRect aDummy;
SwFlyFrmFmt *pFmt = (SwFlyFrmFmt*)rSh.GetFlyFrmFmt();
if ( !rSh.Chainable( aDummy, *pFmt, aDocPos ) )
rSh.Chain( *pFmt, aDocPos );
UpdatePointer( aDocPos, rMEvt.GetModifier() );
return;
}
//Nach GrabFocus sollte eine Shell gepusht sein. Das muss eigentlich
//klappen aber in der Praxis ...
lcl_SelectShellForDrop( rView );
BOOL bIsDocReadOnly = rView.GetDocShell()->IsReadOnly();
BOOL bCallBase = TRUE;
if( pQuickHlpData->bClear )
pQuickHlpData->Stop( rSh );
pQuickHlpData->bChkInsBlank = FALSE;
if( rSh.FinishOLEObj() )
return; //InPlace beenden und der Klick zaehlt nicht mehr
SET_CURR_SHELL( &rSh );
SdrView *pSdrView = rSh.GetDrawView();
if ( pSdrView )
{
if (pSdrView->MouseButtonDown( rMEvt, this ) )
{
rSh.GetView().GetViewFrame()->GetBindings().InvalidateAll(FALSE);
return; // Event von der SdrView ausgewertet
}
}
#ifdef MAC
if (rMEvt.IsMod1() && rMEvt.IsMod2())
return;
#endif
bIsInMove = FALSE;
aStartPos = rMEvt.GetPosPixel();
aRszMvHdlPt.X() = 0, aRszMvHdlPt.Y() = 0;
if ( !rSh.IsDrawCreate() && !pApplyTempl && !rSh.IsInSelect() &&
rMEvt.GetClicks() == 1 && MOUSE_LEFT == rMEvt.GetButtons() &&
!rSh.IsTableMode() &&
rSh.IsMouseTabCol( aDocPos ) )
{
//Zuppeln von Tabellenspalten aus dem Dokument heraus.
rView.SetTabColFromDoc( TRUE );
rView.SetTabColFromDocPos( aDocPos );
rView.InvalidateRulerPos();
SfxBindings& rBind = rView.GetViewFrame()->GetBindings();
rBind.Update();
if ( RulerClook( rView , rMEvt ) )
{
rView.SetTabColFromDoc( FALSE );
rView.InvalidateRulerPos();
rBind.Update();
bCallBase = FALSE;
}
else
{
return;
}
}
//Man kann sich in einem Selektionszustand befinden, wenn zuletzt
//mit dem Keyboard selektiert wurde, aber noch kein CURSOR_KEY
//anschliessend bewegt worden ist. In diesem Fall muss die vorher-
//gehende Selektion zuerst beendet werden.
//MA 07. Oct. 95: Und zwar nicht nur bei Linker Maustaste sondern immer.
//siehe auch Bug: 19263
if ( rSh.IsInSelect() )
rSh.EndSelect();
//Abfrage auf LEFT, da sonst auch bei einem Click mit der rechten Taste
//beispielsweise die Selektion aufgehoben wird.
if ( MOUSE_LEFT == rMEvt.GetButtons() )
{
BOOL bOnlyText = FALSE;
bMBPressed = bNoInterrupt = TRUE;
CaptureMouse();
//ggf. Cursorpositionen zuruecksetzen
rSh.ResetCursorStack();
switch ( rMEvt.GetModifier() + rMEvt.GetButtons() )
{
case MOUSE_LEFT:
case MOUSE_LEFT + KEY_SHIFT:
case MOUSE_LEFT + KEY_MOD2:
if( rSh.IsObjSelected() )
{
SdrHdl* pHdl;
if( !bIsDocReadOnly && !pAnchorMarker && 0 !=
( pHdl = pSdrView->HitHandle(aDocPos, *(rSh.GetOut())) )
&& pHdl->GetKind() == HDL_ANCHOR )
{
pAnchorMarker = new SwAnchorMarker( pHdl );
UpdatePointer( aDocPos, rMEvt.GetModifier() );
return;
}
}
if ( EnterDrawMode( rMEvt, aDocPos ) )
{
bNoInterrupt = FALSE;
return;
}
else if ( rView.GetDrawFuncPtr() && bInsFrm )
{
StopInsFrm();
rSh.Edit();
}
// Ohne SHIFT, da sonst Toggle bei Selektion nicht funktioniert
if (rMEvt.GetClicks() == 1)
{
if ( rSh.IsSelFrmMode())
{
SdrHdl* pHdl = rSh.GetDrawView()->HitHandle
(aDocPos, *(rSh.GetOut()));
BOOL bHitHandle = pHdl && pHdl->GetKind() != HDL_ANCHOR;
if ((rSh.IsInsideSelectedObj(aDocPos) || bHitHandle) &&
!(rMEvt.GetModifier() == KEY_SHIFT && !bHitHandle))
{
rSh.EnterSelFrmMode( &aDocPos );
if ( !pApplyTempl )
{
//nur, wenn keine Position zum Sizen getroffen ist.
if (!bHitHandle)
{
StartDDTimer();
SwEditWin::nDDStartPosY = aDocPos.Y();
SwEditWin::nDDStartPosX = aDocPos.X();
}
bFrmDrag = TRUE;
}
bNoInterrupt = FALSE;
return;
}
}
}
}
BOOL bExecHyperlinks = rSh.GetViewOptions()->IsExecHyperlinks()^
(rMEvt.GetModifier() == KEY_MOD2 ? TRUE : FALSE);
switch ( rMEvt.GetModifier() + rMEvt.GetButtons() )
{
case MOUSE_LEFT:
case MOUSE_LEFT + KEY_MOD1:
case MOUSE_LEFT + KEY_MOD2:
switch ( rMEvt.GetClicks() )
{
case 1:
{
UpdatePointer( aDocPos, rMEvt.GetModifier() );
SwEditWin::nDDStartPosY = aDocPos.Y();
SwEditWin::nDDStartPosX = aDocPos.X();
// URL in DrawText-Objekt getroffen?
BOOL bExecDrawTextLink = FALSE;
if (bExecHyperlinks && pSdrView)
{
SdrViewEvent aVEvt;
SdrHitKind eHit = pSdrView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
if (aVEvt.eEvent == SDREVENT_EXECUTEURL)
bExecDrawTextLink = TRUE;
}
//Rahmen nur zu selektieren versuchen, wenn
//der Pointer bereits entsprechend geschaltet wurde
if ( aActHitType != SDRHIT_NONE && !rSh.IsSelFrmMode() &&
!SFX_APP()->IsDispatcherLocked() &&
!bExecDrawTextLink)
{
rView.NoRotate();
rSh.HideCrsr();
if( rSh.SelectObj( aDocPos, FALSE, rMEvt.IsMod1() ) )
{
// falls im Macro der Rahmen deselektiert
// wurde, muss nur noch der Cursor
// wieder angezeigt werden.
if( FRMTYPE_NONE == rSh.GetSelFrmType() )
rSh.ShowCrsr();
else
{
if (rSh.IsFrmSelected() && rView.GetDrawFuncPtr())
{
rView.GetDrawFuncPtr()->Deactivate();
rView.SetDrawFuncPtr(NULL);
rView.LeaveDrawCreate();
rView.AttrChangedNotify( &rSh );
}
rSh.EnterSelFrmMode( &aDocPos );
bFrmDrag = TRUE;
UpdatePointer( aDocPos, rMEvt.GetModifier() );
}
return;
}
else
bOnlyText = rSh.IsObjSelectable( aDocPos );
if (!rView.GetDrawFuncPtr())
rSh.ShowCrsr();
}
else if ( rSh.IsSelFrmMode() &&
(aActHitType == SDRHIT_NONE ||
!rSh.IsInsideSelectedObj( aDocPos )))
{
rView.NoRotate();
SdrHdl *pHdl;
if( !bIsDocReadOnly && !pAnchorMarker && 0 !=
( pHdl = pSdrView->HitHandle(aDocPos, *(rSh.GetOut())) )
&& pHdl->GetKind() == HDL_ANCHOR )
{
pAnchorMarker = new SwAnchorMarker( pHdl );
UpdatePointer( aDocPos, rMEvt.GetModifier() );
return;
}
else
{
BOOL bUnLockView = !rSh.IsViewLocked();
rSh.LockView( TRUE );
BOOL bSelObj = rSh.SelectObj( aDocPos,
rMEvt.IsShift(), rMEvt.IsMod1() );
if( bUnLockView )
rSh.LockView( FALSE );
if( !bSelObj )
{
// Cursor hier umsetzen, damit er nicht zuerst
// im Rahmen gezeichnet wird; ShowCrsr() geschieht
// in LeaveSelFrmMode()
bValidCrsrPos = !(CRSR_POSCHG & (rSh.*rSh.fnSetCrsr)(&aDocPos,FALSE));
rSh.LeaveSelFrmMode();
rView.AttrChangedNotify( &rSh );
bCallBase = FALSE;
}
else
{
rSh.HideCrsr();
rSh.EnterSelFrmMode( &aDocPos );
rSh.SelFlyGrabCrsr();
rSh.MakeSelVisible();
bFrmDrag = TRUE;
if( rSh.IsFrmSelected() &&
rView.GetDrawFuncPtr() )
{
rView.GetDrawFuncPtr()->Deactivate();
rView.SetDrawFuncPtr(NULL);
rView.LeaveDrawCreate();
rView.AttrChangedNotify( &rSh );
}
UpdatePointer( aDocPos, rMEvt.GetModifier() );
return;
}
}
}
break;
}
case 2:
{
bFrmDrag = FALSE;
if ( !bIsDocReadOnly && rSh.IsInsideSelectedObj(aDocPos) &&
0 == rSh.IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) )
switch ( rSh.GetSelectionType() )
{
case SwWrtShell::SEL_GRF:
RstMBDownFlags();
GetView().GetViewFrame()->GetDispatcher()->Execute(
FN_FORMAT_GRAFIC_DLG, SFX_CALLMODE_RECORD|SFX_CALLMODE_SLOT);
return;
// Doppelklick auf OLE-Objekt --> OLE-InPlace
case SwWrtShell::SEL_OLE:
if (!rSh.IsSelObjProtected(FLYPROTECT_CONTENT))
{
RstMBDownFlags();
rSh.LaunchOLEObj();
}
return;
case SwWrtShell::SEL_FRM:
RstMBDownFlags();
GetView().GetViewFrame()->GetDispatcher()->Execute(
FN_FORMAT_FRAME_DLG, SFX_CALLMODE_RECORD|SFX_CALLMODE_SLOT);
return;
case SwWrtShell::SEL_DRW:
RstMBDownFlags();
EnterDrawTextMode(aDocPos);
if ( rView.GetCurShell()->ISA(SwDrawTextShell) )
((SwDrawTextShell*)rView.GetCurShell())->Init();
return;
}
//falls die Cursorposition korrigiert wurde oder
// ein Fly im ReadOnlyModus selektiert ist,
//keine Wortselektion.
if ( !bValidCrsrPos ||
(rSh.IsFrmSelected() && rSh.IsFrmSelected() ))
return;
SwField *pFld;
BOOL bFtn = FALSE;
if( !bIsDocReadOnly &&
( 0 != ( pFld = rSh.GetCurFld() ) ||
0 != ( bFtn = rSh.GetCurFtn() )) )
{
RstMBDownFlags();
if( bFtn )
GetView().GetViewFrame()->GetDispatcher()->Execute( FN_EDIT_FOOTNOTE );
else
{
USHORT nTypeId = pFld->GetTypeId();
SfxViewFrame* pVFrame = GetView().GetViewFrame();
switch( nTypeId )
{
case TYP_POSTITFLD:
case TYP_SCRIPTFLD:
{
//falls es ein Readonly-Bereich ist, dann muss der Status
//enabled werden
USHORT nSlot = TYP_POSTITFLD == nTypeId ? FN_POSTIT : FN_JAVAEDIT;
SfxBoolItem aItem(nSlot, TRUE);
pVFrame->GetBindings().SetState(aItem);
pVFrame->GetDispatcher()->Execute(nSlot);
break;
}
case TYP_AUTHORITY :
pVFrame->GetDispatcher()->Execute(FN_EDIT_AUTH_ENTRY_DLG);
break;
default:
pVFrame->GetBindings().Execute(FN_EDIT_FIELD);
}
}
return;
}
//im Extended Mode hat Doppel- und
//Dreifachklick keine Auswirkungen.
if ( rSh.IsExtMode() )
return;
//Wort selektieren, gfs. Additional Mode
if ( KEY_MOD1 == rMEvt.GetModifier() && !rSh.IsAddMode() )
{
rSh.EnterAddMode();
rSh.SelWrd( &aDocPos );
rSh.LeaveAddMode();
}
else
rSh.SelWrd( &aDocPos );
bHoldSelection = TRUE;
return;
}
case 3:
bFrmDrag = FALSE;
//im Extended Mode hat Doppel- und
//Dreifachklick keine Auswirkungen.
if ( rSh.IsExtMode() )
return;
//falls die Cursorposition korrigiert wurde oder
// ein Fly im ReadOnlyModus selektiert ist,
//keine Wortselektion.
if ( !bValidCrsrPos || rSh.IsFrmSelected() )
return;
//Zeile selektieren, gfs. Additional Mode
if ( KEY_MOD1 == rMEvt.GetModifier() && !rSh.IsAddMode())
{
rSh.EnterAddMode();
rSh.SelLine( &aDocPos );
rSh.LeaveAddMode();
}
else
rSh.SelLine( &aDocPos );
bHoldSelection = TRUE;
return;
default:
return;
}
/* no break */
case MOUSE_LEFT + KEY_SHIFT:
case MOUSE_LEFT + KEY_SHIFT + KEY_MOD1:
{
BOOL bLockView = bWasShdwCrsr;
switch ( rMEvt.GetModifier() )
{
case KEY_MOD1 + KEY_SHIFT:
{
if ( !bInsDraw && IsDrawObjSelectable( rSh, aDocPos ) )
{
rView.NoRotate();
rSh.HideCrsr();
if ( rSh.IsSelFrmMode() )
rSh.SelectObj(aDocPos, TRUE, TRUE);
else
{ if ( rSh.SelectObj( aDocPos, TRUE, TRUE ) )
{
rSh.EnterSelFrmMode( &aDocPos );
SwEditWin::nDDStartPosY = aDocPos.Y();
SwEditWin::nDDStartPosX = aDocPos.X();
bFrmDrag = TRUE;
return;
}
}
}
else if( rSh.IsSelFrmMode() &&
rSh.GetDrawView()->HitHandle( aDocPos,
*rSh.GetOut() ))
{
bFrmDrag = TRUE;
bNoInterrupt = FALSE;
return;
}
}
break;
case KEY_MOD1:
{
if ( !bInsDraw && IsDrawObjSelectable( rSh, aDocPos ) )
{
rView.NoRotate();
rSh.HideCrsr();
if ( rSh.IsSelFrmMode() )
rSh.SelectObj(aDocPos, FALSE, TRUE);
else
{ if ( rSh.SelectObj( aDocPos, FALSE, TRUE ) )
{
rSh.EnterSelFrmMode( &aDocPos );
SwEditWin::nDDStartPosY = aDocPos.Y();
SwEditWin::nDDStartPosX = aDocPos.X();
bFrmDrag = TRUE;
return;
}
}
}
else if( rSh.IsSelFrmMode() &&
rSh.GetDrawView()->HitHandle( aDocPos,
*rSh.GetOut() ))
{
bFrmDrag = TRUE;
bNoInterrupt = FALSE;
return;
}
else
{
if ( !rSh.IsAddMode() && !rSh.IsExtMode())
{
rSh.PushMode();
bModePushed = TRUE;
rSh.EnterAddMode();
}
bCallBase = FALSE;
}
}
break;
case KEY_SHIFT:
{
if ( !bInsDraw && IsDrawObjSelectable( rSh, aDocPos ) )
{
rView.NoRotate();
rSh.HideCrsr();
if ( rSh.IsSelFrmMode() )
{
rSh.SelectObj(aDocPos, TRUE);
const SdrMarkList& rMarkList = pSdrView->GetMarkList();
if (rMarkList.GetMark(0) == NULL)
{
rSh.LeaveSelFrmMode();
rView.AttrChangedNotify(&rSh);
bFrmDrag = FALSE;
}
}
else
{ if ( rSh.SelectObj( aDocPos ) )
{
rSh.EnterSelFrmMode( &aDocPos );
SwEditWin::nDDStartPosY = aDocPos.Y();
SwEditWin::nDDStartPosX = aDocPos.X();
bFrmDrag = TRUE;
return;
}
}
}
else
{
if ( rSh.IsSelFrmMode() &&
rSh.IsInsideSelectedObj( aDocPos ) )
{
rSh.EnterSelFrmMode( &aDocPos );
SwEditWin::nDDStartPosY = aDocPos.Y();
SwEditWin::nDDStartPosX = aDocPos.X();
bFrmDrag = TRUE;
return;
}
if ( rSh.IsSelFrmMode() )
{
rSh.UnSelectFrm();
rSh.LeaveSelFrmMode();
rView.AttrChangedNotify(&rSh);
bFrmDrag = FALSE;
}
if ( !rSh.IsExtMode() )
{
// keine Selection anfangen, wenn in ein URL-
// Feld oder eine -Grafik geklickt wird
BOOL bSttSelect = rSh.HasSelection() ||
Pointer(POINTER_REFHAND) != GetPointer();
if( !bSttSelect )
{
bSttSelect = TRUE;
if( bExecHyperlinks )
{
SwContentAtPos aCntntAtPos(
SwContentAtPos::SW_FTN |
SwContentAtPos::SW_INETATTR );
if( rSh.GetContentAtPos( aDocPos, aCntntAtPos ) )
{
if( !rSh.IsViewLocked() &&
!rSh.IsReadOnlyAvailable() &&
aCntntAtPos.IsInProtectSect() )
bLockView = TRUE;
bSttSelect = FALSE;
}
else if( rSh.IsURLGrfAtPos( aDocPos ))
bSttSelect = FALSE;
}
}
if( bSttSelect )
rSh.SttSelect();
}
}
bCallBase = FALSE;
break;
}
default:
if( !rSh.IsViewLocked() )
{
SwContentAtPos aCntntAtPos( SwContentAtPos::SW_CLICKFIELD |
SwContentAtPos::SW_INETATTR );
if( rSh.GetContentAtPos( aDocPos, aCntntAtPos, FALSE ) &&
!rSh.IsReadOnlyAvailable() &&
aCntntAtPos.IsInProtectSect() )
bLockView = TRUE;
}
}
if ( rSh.IsGCAttr() )
{
rSh.GCAttr();
rSh.ClearGCAttr();
}
BOOL bOverSelect = rSh.ChgCurrPam( aDocPos ), bOverURLGrf = FALSE;
if( !bOverSelect )
bOverURLGrf = bOverSelect = 0 != rSh.IsURLGrfAtPos( aDocPos );
if ( !bOverSelect )
{
const BOOL bTmp = bNoInterrupt;
bNoInterrupt = FALSE;
if( !rSh.IsViewLocked() && bLockView )
rSh.LockView( TRUE );
else
bLockView = FALSE;
{ // nur temp. Move-Kontext aufspannen, da sonst die
// Abfrage auf die Inhaltsform nicht funktioniert!!!
MV_KONTEXT( &rSh );
bValidCrsrPos = !(CRSR_POSCHG & (rSh.*rSh.fnSetCrsr)(&aDocPos,bOnlyText));
bCallBase = FALSE;
}
if( bLockView )
rSh.LockView( FALSE );
bNoInterrupt = bTmp;
}
if( !bOverURLGrf )
{
const int nSelType = rSh.GetSelectionType();
if( nSelType == SwWrtShell::SEL_OLE ||
nSelType == SwWrtShell::SEL_GRF )
{
MV_KONTEXT( &rSh );
if( !rSh.IsFrmSelected() )
rSh.GotoNextFly();
rSh.EnterSelFrmMode();
bCallBase = FALSE;
}
}
// nicht mehr hier zuruecksetzen, damit -- falls durch MouseMove
// bei gedrueckter Ctrl-Taste eine Mehrfachselektion erfolgen soll,
// im Drag nicht die vorherige Selektion aufgehoben wird.
// if(bModePushed)
// rSh.PopMode(FALSE);
break;
}
}
}
if (bCallBase)
Window::MouseButtonDown(rMEvt);
}
#pragma optimize("",off)
/*--------------------------------------------------------------------
Beschreibung: MouseMove
--------------------------------------------------------------------*/
void SwEditWin::MouseMove(const MouseEvent& rMEvt)
{
// solange eine Action laeuft sollte das MouseMove abgeklemmt sein
// Ansonsten gibt es den Bug 40102
SwWrtShell &rSh = rView.GetWrtShell();
if( rSh.ActionPend() )
return ;
if( pShadCrsr && 0 != (rMEvt.GetModifier() + rMEvt.GetButtons() ) )
delete pShadCrsr, pShadCrsr = 0;
BOOL bIsDocReadOnly = rView.GetDocShell()->IsReadOnly();
SET_CURR_SHELL( &rSh );
//aPixPt == Point in Pixel, rel. zu ChildWin
//aDocPt == Point in Twips, Dokumentkoordinaten
const Point aPixPt( rMEvt.GetPosPixel() );
const Point aDocPt( PixelToLogic( aPixPt ) );
if ( IsChainMode() )
{
UpdatePointer( aDocPt, rMEvt.GetModifier() );
if ( rMEvt.IsLeaveWindow() )
rView.GetViewFrame()->HideStatusText();
return;
}
SdrView *pSdrView = rSh.GetDrawView();
const SwCallMouseEvent aLastCallEvent( aSaveCallEvent );
aSaveCallEvent.Clear();
if ( !bIsDocReadOnly && pSdrView && pSdrView->MouseMove(rMEvt,this) )
{
SetPointer( POINTER_TEXT );
return; // Event von der SdrView ausgewertet
}
const Point aOldPt( rSh.VisArea().Pos() );
const BOOL bInsWin = rSh.VisArea().IsInside( aDocPt );
if( pShadCrsr && !bInsWin )
delete pShadCrsr, pShadCrsr = 0;
// Position ist noetig fuer OS/2, da dort nach einem MB-Down
// offensichtlich sofort ein MB-Move gerufen wird.
if( bDDTimerStarted )
{
Point aDD( SwEditWin::nDDStartPosX, SwEditWin::nDDStartPosY );
aDD = LogicToPixel( aDD );
Rectangle aRect( aDD.X()-3, aDD.Y()-3, aDD.X()+3, aDD.Y()+3 );
if ( !aRect.IsInside( aPixPt ) ) // MA 23. May. 95: Tatterschutz.
StopDDTimer( &rSh, aDocPt );
}
if ( bInsDraw && rView.GetDrawFuncPtr() )
{
rView.GetDrawFuncPtr()->MouseMove( rMEvt );
if ( !bInsWin )
{
Point aTmp( aDocPt );
aTmp += rSh.VisArea().Pos() - aOldPt;
LeaveArea( aTmp );
}
else
EnterArea();
return;
}
if( !bIsDocReadOnly && bInsWin && !pApplyTempl && !rSh.IsInSelect() &&
rSh.IsMouseTabCol( aDocPt ) && !rSh.IsTableMode())
{
//Zuppeln von Tabellenspalten aus dem Dokument heraus.
SetPointer( POINTER_HSIZEBAR );
return;
}
BOOL bDelShadCrsr = TRUE;
switch ( rMEvt.GetModifier() + rMEvt.GetButtons() )
{
case MOUSE_LEFT:
if( pAnchorMarker )
{
// Now we need to refresh the SdrHdl pointer of pAnchorMarker.
// This looks a little bit tricky, but it solves the following
// problem: the pAnchorMarker contains a pointer to an SdrHdl,
// if the FindAnchorPos-call cause a scrolling of the visible
// area, it's possible that the SdrHdl will be destroyed and a
// new one will initialized at the original position(GetHdlPos).
// So the pAnchorMarker has to find the right SdrHdl, if it's
// the old one, it will find it with position aOld, if this one
// is destroyed, it will find a new one at position GetHdlPos().
Point aOld = pAnchorMarker->GetPos();
Point aNew = rSh.FindAnchorPos( aDocPt );
SdrHdl* pHdl;
if( (0!=( pHdl = pSdrView->HitHandle( aOld, *(rSh.GetOut())) )||
0 !=(pHdl = pSdrView->HitHandle( pAnchorMarker->GetHdlPos(),
*(rSh.GetOut())) ) ) && pHdl->GetKind() == HDL_ANCHOR )
{
pAnchorMarker->ChgHdl( pHdl );
if( aNew.X() || aNew.Y() )
{
pAnchorMarker->SetPos( aNew );
pAnchorMarker->SetLastPos( aDocPt );
pSdrView->RefreshAllIAOManagers();
}
}
else
{
delete pAnchorMarker;
pAnchorMarker = NULL;
}
}
if ( bInsDraw )
{
if ( !bMBPressed )
break;
if ( bIsInMove || IsMinMove( aStartPos, aPixPt ) )
{
if ( !bInsWin )
LeaveArea( aDocPt );
else
EnterArea();
if ( rView.GetDrawFuncPtr() )
{
pSdrView->SetOrtho(FALSE);
rView.GetDrawFuncPtr()->MouseMove( rMEvt );
}
bIsInMove = TRUE;
}
return;
}
case MOUSE_LEFT + KEY_SHIFT:
case MOUSE_LEFT + KEY_SHIFT + KEY_MOD1:
if ( !bMBPressed )
break;
case MOUSE_LEFT + KEY_MOD1:
if ( bFrmDrag && rSh.IsSelFrmMode() )
{
if( !bMBPressed )
break;
if ( bIsInMove || IsMinMove( aStartPos, aPixPt ) )
{
// Event-Verarbeitung fuers Resizen
if( pSdrView->HasMarkedObj() )
{
const SwFrmFmt* pFlyFmt;
const SvxMacro* pMacro;
const Point aSttPt( PixelToLogic( aStartPos ) );
// geht es los?
if( HDL_USER == eSdrMoveHdl )
{
SdrHdl* pHdl = pSdrView->HitHandle( aSttPt, *this );
eSdrMoveHdl = pHdl ? pHdl->GetKind() : HDL_MOVE;
}
USHORT nEvent = HDL_MOVE == eSdrMoveHdl
? SW_EVENT_FRM_MOVE
: SW_EVENT_FRM_RESIZE;
if( 0 != ( pFlyFmt = rSh.GetFlyFrmFmt() ) &&
0 != ( pMacro = pFlyFmt->GetMacro().GetMacroTable().
Get( nEvent )) &&
// oder nur z.B. alle 20 Twip bescheid sagen?
// ( 20 > Abs( aRszMvHdlPt.X() - aDocPt.X() ) ||
// 20 > Abs( aRszMvHdlPt.Y() - aDocPt.Y() ) )
aRszMvHdlPt != aDocPt )
{
aRszMvHdlPt = aDocPt;
USHORT nPos = 0;
String sRet;
SbxArrayRef xArgs = new SbxArray;
SbxVariableRef xVar = new SbxVariable;
xVar->PutString( pFlyFmt->GetName() );
xArgs->Put( &xVar, ++nPos );
if( SW_EVENT_FRM_RESIZE == nEvent )
{
xVar = new SbxVariable;
xVar->PutUShort( eSdrMoveHdl );
xArgs->Put( &xVar, ++nPos );
}
xVar = new SbxVariable;
xVar->PutLong( aDocPt.X() - aSttPt.X() );
xArgs->Put( &xVar, ++nPos );
xVar = new SbxVariable;
xVar->PutLong( aDocPt.Y() - aSttPt.Y() );
xArgs->Put( &xVar, ++nPos );
ReleaseMouse();
rSh.ExecMacro( *pMacro, &sRet, &xArgs );
CaptureMouse();
if( sRet.Len() && 0 != sRet.ToInt32() )
return ;
}
}
// Event-Verarbeitung fuers Resizen
if( bIsDocReadOnly )
break;
if ( rMEvt.IsShift() )
{
pSdrView->SetOrtho(TRUE);
pSdrView->SetAngleSnapEnabled(TRUE);
}
else
{
pSdrView->SetOrtho(FALSE);
pSdrView->SetAngleSnapEnabled(FALSE);
}
(rSh.*rSh.fnDrag)( &aDocPt, rMEvt.IsShift() );
bIsInMove = TRUE;
}
else if( bIsDocReadOnly )
break;
if ( !bInsWin )
{
Point aTmp( aDocPt );
aTmp += rSh.VisArea().Pos() - aOldPt;
LeaveArea( aTmp );
}
else if(bIsInMove)
EnterArea();
return;
}
if ( !rSh.IsSelFrmMode() && !bDDINetAttr &&
(IsMinMove( aStartPos,aPixPt ) || bIsInMove) &&
(rSh.IsInSelect() || !rSh.ChgCurrPam( aDocPt )) )
{
if ( pSdrView )
{
if ( rMEvt.IsShift() )
pSdrView->SetOrtho(TRUE);
else
pSdrView->SetOrtho(FALSE);
}
if ( !bInsWin )
{
Point aTmp( aDocPt );
aTmp += rSh.VisArea().Pos() - aOldPt;
LeaveArea( aTmp );
}
else
{
//JP 24.09.98: Fix fuer die Bugs 55592 / 55931
//JP 23.04.99: Fix fuer den Bugs 65289
//JP 06.07.99: Fix fuer den Bugs 67360
if( !rMEvt.IsSynthetic() &&
!(( MOUSE_LEFT + KEY_MOD1 ==
rMEvt.GetModifier() + rMEvt.GetButtons() ) &&
rSh.Is_FnDragEQBeginDrag() && !rSh.IsAddMode() ))
{
(rSh.*rSh.fnDrag)( &aDocPt,FALSE );
bValidCrsrPos = !(CRSR_POSCHG & (rSh.*rSh.fnSetCrsr)(&aDocPt,FALSE));
EnterArea();
}
}
}
bDDINetAttr = FALSE;
break;
case 0:
if ( pApplyTempl )
{
UpdatePointer(aDocPt, 0); // evtl. muss hier ein Rahmen markiert werden
break;
}
case KEY_SHIFT:
case KEY_MOD2:
case KEY_MOD1:
if ( !bInsDraw )
{
BOOL bTstShdwCrsr = TRUE;
UpdatePointer( aDocPt, rMEvt.GetModifier() );
const SwFrmFmt* pFmt;
const SwFmtINetFmt* pINet = 0;
SwContentAtPos aCntntAtPos( SwContentAtPos::SW_INETATTR );
if( rSh.GetContentAtPos( aDocPt, aCntntAtPos ) )
pINet = (SwFmtINetFmt*)aCntntAtPos.aFnd.pAttr;
const void* pTmp = pINet;
if( pINet ||
0 != ( pTmp = pFmt = rSh.GetFmtFromAnyObj( aDocPt )))
{
bTstShdwCrsr = FALSE;
if( pTmp == pINet )
aSaveCallEvent.Set( pINet );
else
{
IMapObject* pIMapObj = pFmt->GetIMapObject( aDocPt );
if( pIMapObj )
aSaveCallEvent.Set( pFmt, pIMapObj );
else
aSaveCallEvent.Set( EVENT_OBJECT_URLITEM, pFmt );
}
// sollte wir ueber einem InternetFeld mit einem
// gebundenen Macro stehen?
if( aSaveCallEvent != aLastCallEvent )
{
if( aLastCallEvent.HasEvent() )
rSh.CallEvent( SFX_EVENT_MOUSEOUT_OBJECT,
aLastCallEvent, TRUE );
// 0 besagt, das das Object gar keine Tabelle hat
if( !rSh.CallEvent( SFX_EVENT_MOUSEOVER_OBJECT,
aSaveCallEvent ))
aSaveCallEvent.Clear();
}
}
else if( aLastCallEvent.HasEvent() )
{
// Cursor stand auf einem Object
rSh.CallEvent( SFX_EVENT_MOUSEOUT_OBJECT,
aLastCallEvent, TRUE );
}
if( bTstShdwCrsr && bInsWin && !bIsDocReadOnly &&
!bInsFrm && !rSh.IsBrowseMode() &&
rSh.GetViewOptions()->IsShadowCursor() &&
!(rMEvt.GetModifier() + rMEvt.GetButtons()) &&
!rSh.HasSelection() && !GetConnectMetaFile() )
{
SwRect aRect;
SwHoriOrient eOrient;
SwFillMode eMode = (SwFillMode)rSh.GetViewOptions()->GetShdwCrsrFillMode();
if( rSh.GetShadowCrsrPos( aDocPt, eMode, aRect, eOrient ))
{
if( !pShadCrsr )
pShadCrsr = new SwShadowCursor( *this,
rSh.GetViewOptions()->GetShdwCrsrColor() );
if( HORI_RIGHT != eOrient && HORI_CENTER != eOrient )
eOrient = HORI_LEFT;
pShadCrsr->SetPos( aRect.Pos(), aRect.Height(), eOrient );
bDelShadCrsr = FALSE;
}
}
}
break;
}
if( bDelShadCrsr && pShadCrsr )
delete pShadCrsr, pShadCrsr = 0;
bWasShdwCrsr = FALSE;
}
/*--------------------------------------------------------------------
Beschreibung: Button Up
--------------------------------------------------------------------*/
void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
{
BOOL bCallBase = TRUE;
BOOL bCallShadowCrsr = bWasShdwCrsr;
bWasShdwCrsr = FALSE;
if( pShadCrsr )
delete pShadCrsr, pShadCrsr = 0;
SdrHdlKind eOldSdrMoveHdl = eSdrMoveHdl;
eSdrMoveHdl = HDL_USER; // fuer die MoveEvents - wieder zuruecksetzen
// sicherheitshalber zuruecksetzen Bug 27900
rView.SetTabColFromDoc( FALSE );
SwWrtShell &rSh = rView.GetWrtShell();
SET_CURR_SHELL( &rSh );
SdrView *pSdrView = rSh.GetDrawView();
if ( pSdrView )
{
pSdrView->SetOrtho(FALSE);
if ( pSdrView->MouseButtonUp( rMEvt,this ) )
{
rSh.GetView().GetViewFrame()->GetBindings().InvalidateAll(FALSE);
return; // Event von der SdrView ausgewertet
}
}
//MouseButtonUp nur bearbeiten, wenn auch das Down an dieses Fenster ging.
if ( !bMBPressed )
{
// OS 25.02.97 Undo fuer die Giesskann ist bereits im CommandHdl
//JP 29.09.95: so sollte es sein!!! if(pApplyTempl->bUndo)
// if( pApplyTempl && MOUSE_RIGHT == rMEvt.GetModifier() + rMEvt.GetButtons() )
// rSh.Do( SwWrtShell::UNDO );
return;
}
Point aDocPt( PixelToLogic( rMEvt.GetPosPixel() ) );
if ( bDDTimerStarted )
{
StopDDTimer( &rSh, aDocPt );
bMBPressed = FALSE;
if ( rSh.IsSelFrmMode() )
{
(rSh.*rSh.fnEndDrag)( &aDocPt, FALSE );
bFrmDrag = FALSE;
}
bNoInterrupt = FALSE;
ReleaseMouse();
return;
}
if( pAnchorMarker )
{
Point aPnt( pAnchorMarker->GetLastPos() );
pSdrView->RefreshAllIAOManagers();
DELETEZ( pAnchorMarker );
if( aPnt.X() || aPnt.Y() )
rSh.FindAnchorPos( aPnt, TRUE );
}
if ( bInsDraw && rView.GetDrawFuncPtr() )
{
if ( rView.GetDrawFuncPtr()->MouseButtonUp( rMEvt ) )
{
if (rView.GetDrawFuncPtr()) // Koennte im MouseButtonUp zerstoert worden sein
{
rView.GetDrawFuncPtr()->Deactivate();
if (!rView.IsDrawMode())
rView.SetDrawFuncPtr(NULL);
}
if ( rSh.IsObjSelected() )
{
rSh.EnterSelFrmMode();
if (!rView.GetDrawFuncPtr())
StdDrawMode(SID_OBJECT_SELECT);
}
else if ( rSh.IsFrmSelected() )
{
rSh.EnterSelFrmMode();
StopInsFrm();
}
else
{
const Point aDocPos( PixelToLogic( aStartPos ) );
bValidCrsrPos = !(CRSR_POSCHG & (rSh.*rSh.fnSetCrsr)(&aDocPos,FALSE));
rSh.Edit();
}
rView.AttrChangedNotify( &rSh );
}
else if (rMEvt.GetButtons() == MOUSE_RIGHT && rSh.IsDrawCreate())
rView.GetDrawFuncPtr()->BreakCreate(); // Zeichnen abbrechen
bNoInterrupt = FALSE;
ReleaseMouse();
return;
}
BOOL bPopMode = FALSE;
switch ( rMEvt.GetModifier() + rMEvt.GetButtons() )
{
case MOUSE_LEFT:
if ( bInsDraw && rSh.IsDrawCreate() )
{
if ( rView.GetDrawFuncPtr() && rView.GetDrawFuncPtr()->MouseButtonUp(rMEvt) == TRUE )
{
rView.GetDrawFuncPtr()->Deactivate();
rView.AttrChangedNotify( &rSh );
if ( rSh.IsObjSelected() )
rSh.EnterSelFrmMode();
if ( rView.GetDrawFuncPtr() && bInsFrm )
StopInsFrm();
}
bCallBase = FALSE;
break;
}
case MOUSE_LEFT + KEY_MOD1:
case MOUSE_LEFT + KEY_MOD2:
case MOUSE_LEFT + KEY_SHIFT + KEY_MOD1:
if ( bFrmDrag && rSh.IsSelFrmMode() )
{
if ( rMEvt.IsMod1() ) //Kopieren und nicht moven.
{
//Drag abbrechen, statt dessen internes Copy verwenden
Rectangle aRect;
rSh.GetDrawView()->TakeActionRect( aRect );
if (!aRect.IsEmpty())
{
rSh.BreakDrag();
Point aEndPt, aSttPt;
if ( rSh.GetSelFrmType() & FRMTYPE_FLY_ATCNT )
{
aEndPt = aRect.TopLeft();
aSttPt = rSh.GetDrawView()->GetAllMarkedRect().TopLeft();
}
else
{
aEndPt = aRect.Center();
aSttPt = rSh.GetDrawView()->GetAllMarkedRect().Center();
}
if ( aSttPt != aEndPt )
{
rSh.StartUndo( UIUNDO_DRAG_AND_COPY );
rSh.Copy(&rSh, aSttPt, aEndPt, FALSE);
rSh.EndUndo( UIUNDO_DRAG_AND_COPY );
}
}
else
(rSh.*rSh.fnEndDrag)( &aDocPt,FALSE );
}
else
{
{
const SwFrmFmt* pFlyFmt;
const SvxMacro* pMacro;
USHORT nEvent = HDL_MOVE == eOldSdrMoveHdl
? SW_EVENT_FRM_MOVE
: SW_EVENT_FRM_RESIZE;
if( 0 != ( pFlyFmt = rSh.GetFlyFrmFmt() ) &&
0 != ( pMacro = pFlyFmt->GetMacro().GetMacroTable().
Get( nEvent )) )
{
const Point aSttPt( PixelToLogic( aStartPos ) );
aRszMvHdlPt = aDocPt;
USHORT nPos = 0;
SbxArrayRef xArgs = new SbxArray;
SbxVariableRef xVar = new SbxVariable;
xVar->PutString( pFlyFmt->GetName() );
xArgs->Put( &xVar, ++nPos );
if( SW_EVENT_FRM_RESIZE == nEvent )
{
xVar = new SbxVariable;
xVar->PutUShort( eOldSdrMoveHdl );
xArgs->Put( &xVar, ++nPos );
}
xVar = new SbxVariable;
xVar->PutLong( aDocPt.X() - aSttPt.X() );
xArgs->Put( &xVar, ++nPos );
xVar = new SbxVariable;
xVar->PutLong( aDocPt.Y() - aSttPt.Y() );
xArgs->Put( &xVar, ++nPos );
xVar = new SbxVariable;
xVar->PutUShort( 1 );
xArgs->Put( &xVar, ++nPos );
ReleaseMouse();
rSh.ExecMacro( *pMacro, 0, &xArgs );
CaptureMouse();
}
}
(rSh.*rSh.fnEndDrag)( &aDocPt,FALSE );
}
bFrmDrag = FALSE;
bCallBase = FALSE;
break;
}
bPopMode = TRUE;
// no break
case MOUSE_LEFT + KEY_SHIFT:
if (rSh.IsSelFrmMode())
{
(rSh.*rSh.fnEndDrag)( &aDocPt, FALSE );
bFrmDrag = FALSE;
bCallBase = FALSE;
break;
}
if( bHoldSelection )
{
//JP 27.04.99: Bug 65389 - das EndDrag sollte auf jedenfall
// gerufen werden.
bHoldSelection = FALSE;
(rSh.*rSh.fnEndDrag)( &aDocPt, FALSE );
}
else
{
if ( !rSh.IsInSelect() && rSh.ChgCurrPam( aDocPt ) )
{
const BOOL bTmp = bNoInterrupt;
bNoInterrupt = FALSE;
{ // nur temp. Move-Kontext aufspannen, da sonst die
// Abfrage auf die Inhaltsform nicht funktioniert!!!
MV_KONTEXT( &rSh );
const Point aDocPos( PixelToLogic( aStartPos ) );
bValidCrsrPos = !(CRSR_POSCHG & (rSh.*rSh.fnSetCrsr)(&aDocPos,FALSE));
}
bNoInterrupt = bTmp;
}
else
{
BOOL bInSel = rSh.IsInSelect();
(rSh.*rSh.fnEndDrag)( &aDocPt, FALSE );
// Internetfield? --> Link-Callen (DocLaden!!)
//JP 18.10.96: Bug 32437 -
// if( !rSh.HasSelection() )
if( !bInSel )
{
USHORT nFilter = URLLOAD_NOFILTER;
if( KEY_MOD1 == rMEvt.GetModifier() )
nFilter |= URLLOAD_NEWVIEW;
BOOL bExecHyperlinks = rSh.GetViewOptions()->IsExecHyperlinks()^
(rMEvt.GetModifier() == KEY_MOD2 ? TRUE : FALSE);
if(pApplyTempl)
bExecHyperlinks = FALSE;
SwContentAtPos aCntntAtPos( SwContentAtPos::SW_CLICKFIELD |
SwContentAtPos::SW_INETATTR );
if( rSh.GetContentAtPos( aDocPt, aCntntAtPos, TRUE ) )
{
BOOL bViewLocked = rSh.IsViewLocked();
if( !bViewLocked && !rSh.IsReadOnlyAvailable() &&
aCntntAtPos.IsInProtectSect() )
rSh.LockView( TRUE );
ReleaseMouse();
if( SwContentAtPos::SW_FIELD == aCntntAtPos.eCntntAtPos )
{
if( bExecHyperlinks )
rSh.ClickToField( *aCntntAtPos.aFnd.pFld, nFilter );
}
else if( bExecHyperlinks )
{
rSh.ClickToINetAttr( *(SwFmtINetFmt*)
aCntntAtPos.aFnd.pAttr, nFilter );
}
rSh.LockView( bViewLocked );
bCallShadowCrsr = FALSE;
}
else if( bExecHyperlinks )
{
aCntntAtPos = SwContentAtPos( SwContentAtPos::SW_FTN );
if( !rSh.GetContentAtPos( aDocPt, aCntntAtPos, TRUE ) )
{
SdrViewEvent aVEvt;
if (pSdrView)
pSdrView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
if (pSdrView && aVEvt.eEvent == SDREVENT_EXECUTEURL)
{
// URL-Feld getroffen
const SvxURLField *pField = aVEvt.pURLField;
if (pField)
{
String sURL(pField->GetURL());
String sTarget(pField->GetTargetFrame());
::LoadURL( sURL, &rSh, nFilter, &sTarget);
}
bCallShadowCrsr = FALSE;
}
else
{
// Grafik getroffen
ReleaseMouse();
if( rSh.ClickToINetGrf( aDocPt, nFilter ))
bCallShadowCrsr = FALSE;
}
}
}
if( bCallShadowCrsr &&
rSh.GetViewOptions()->IsShadowCursor() &&
MOUSE_LEFT == (rMEvt.GetModifier() + rMEvt.GetButtons()) &&
!rSh.HasSelection() &&
!GetConnectMetaFile() &&
rSh.VisArea().IsInside( aDocPt ))
{
if( UNDO_INS_FROM_SHADOWCRSR == rSh.GetUndoIds() )
rSh.Undo();
SwFillMode eMode = (SwFillMode)rSh.GetViewOptions()->GetShdwCrsrFillMode();
rSh.SetShadowCrsrPos( aDocPt, eMode );
}
}
}
bCallBase = FALSE;
}
// gfs. im Down gepushten Mode wieder zuruecksetzen
if ( bPopMode && bModePushed )
{
rSh.PopMode();
bModePushed = FALSE;
bCallBase = FALSE;
}
break;
default:
ReleaseMouse();
return;
}
if( pApplyTempl )
{
int eSelection = rSh.GetSelectionType();
if( pApplyTempl->nColor )
{
USHORT nId = 0;
switch( pApplyTempl->nColor )
{
case SID_ATTR_CHAR_COLOR_EXT:
nId = RES_CHRATR_COLOR;
break;
case SID_ATTR_CHAR_COLOR_BACKGROUND_EXT:
nId = RES_CHRATR_BACKGROUND;
break;
}
if( nId && (SwWrtShell::SEL_TXT|SwWrtShell::SEL_TBL) & eSelection)
{
if( rSh.IsSelection() && !rSh.HasReadonlySel() )
{
if(nId == RES_CHRATR_BACKGROUND)
{
Color aColor( COL_TRANSPARENT );
if( !SwEditWin::bTransparentBackColor )
aColor = SwEditWin::aTextBackColor;
rSh.SetAttr( SvxBrushItem( aColor, nId ) );
}
else
rSh.SetAttr( SvxColorItem(SwEditWin::aTextColor, nId) );
rSh.UnSetVisCrsr();
rSh.EnterStdMode();
rSh.SetVisCrsr(aDocPt);
pApplyTempl->bUndo = TRUE;
bCallBase = FALSE;
aTemplateTimer.Stop();
}
else if(rMEvt.GetClicks() == 1)
{
// keine Selektion -> also Giesskanne abschalten
aTemplateTimer.Start();
}
}
}
else
{
switch ( pApplyTempl->eType )
{
case SFX_STYLE_FAMILY_PARA:
if( (( SwWrtShell::SEL_TXT | SwWrtShell::SEL_TBL )
& eSelection ) && !rSh.HasReadonlySel() )
{
rSh.SetTxtFmtColl( pApplyTempl->aColl.pTxtColl );
pApplyTempl->bUndo = TRUE;
bCallBase = FALSE;
}
break;
case SFX_STYLE_FAMILY_CHAR:
if( (( SwWrtShell::SEL_TXT | SwWrtShell::SEL_TBL )
& eSelection ) && !rSh.HasReadonlySel() )
{
rSh.SetAttr( SwFmtCharFmt(pApplyTempl->aColl.pCharFmt) );
rSh.UnSetVisCrsr();
rSh.EnterStdMode();
rSh.SetVisCrsr(aDocPt);
pApplyTempl->bUndo = TRUE;
bCallBase = FALSE;
}
break;
case SFX_STYLE_FAMILY_FRAME :
{
const SwFrmFmt* pFmt = rSh.GetFmtFromObj( aDocPt );
if(PTR_CAST(SwFlyFrmFmt, pFmt))
{
rSh.SetFrmFmt( pApplyTempl->aColl.pFrmFmt, FALSE, &aDocPt );
pApplyTempl->bUndo = TRUE;
bCallBase = FALSE;
}
break;
}
case SFX_STYLE_FAMILY_PAGE:
// Kein Undo bei Seitenvorlagen
rSh.ChgCurPageDesc( *pApplyTempl->aColl.pPageDesc );
bCallBase = FALSE;
break;
case SFX_STYLE_FAMILY_PSEUDO:
if( !rSh.HasReadonlySel() )
{
rSh.SetCurNumRule( *pApplyTempl->aColl.pNumRule );
bCallBase = FALSE;
pApplyTempl->bUndo = TRUE;
}
break;
}
}
}
ReleaseMouse();
// Hier kommen nur verarbeitete MouseEvents an; nur bei diesen duerfen
// die Modi zurueckgesetzt werden.
bMBPressed = FALSE;
//sicherheitshalber aufrufen, da jetzt das Selektieren bestimmt zu Ende ist.
//Andernfalls koennte der Timeout des Timers Kummer machen.
EnterArea();
bNoInterrupt = FALSE;
if (bCallBase)
Window::MouseButtonUp(rMEvt);
}
/*--------------------------------------------------------------------
Beschreibung: Vorlage anwenden
--------------------------------------------------------------------*/
void SwEditWin::SetApplyTemplate(const SwApplyTemplate &rTempl)
{
static BOOL bIdle = FALSE;
DELETEZ(pApplyTempl);
SwWrtShell &rSh = rView.GetWrtShell();
if(rTempl.nColor)
{
pApplyTempl = new SwApplyTemplate( rTempl );
SetPointer( POINTER_FILL );
rSh.NoEdit( FALSE );
bIdle = rSh.GetViewOptions()->IsIdle();
((SwViewOption *)rSh.GetViewOptions())->SetIdle( FALSE );
}
else if( rTempl.eType )
{
pApplyTempl = new SwApplyTemplate( rTempl );
SetPointer( POINTER_FILL );
rSh.NoEdit( FALSE );
bIdle = rSh.GetViewOptions()->IsIdle();
((SwViewOption *)rSh.GetViewOptions())->SetIdle( FALSE );
}
else
{
SetPointer( POINTER_TEXT );
rSh.UnSetVisCrsr();
((SwViewOption *)rSh.GetViewOptions())->SetIdle( bIdle );
if ( !rSh.IsSelFrmMode() )
rSh.Edit();
}
static USHORT __READONLY_DATA aInva[] =
{
SID_STYLE_WATERCAN,
SID_ATTR_CHAR_COLOR_EXT,
SID_ATTR_CHAR_COLOR_BACKGROUND_EXT,
0
};
rView.GetViewFrame()->GetBindings().Invalidate(aInva);
}
/*--------------------------------------------------------------------
Beschreibung: ctor
--------------------------------------------------------------------*/
SwEditWin::SwEditWin(Window *pParent, SwView &rMyView):
Window(pParent, WinBits(WB_CLIPCHILDREN | WB_DIALOGCONTROL)),
DropTargetHelper( this ),
DragSourceHelper( this ),
aActHitType(SDRHIT_NONE),
eDrawMode(OBJ_NONE),
pApplyTempl(0),
rView( rMyView ),
pAnchorMarker( 0 ),
pUserMarker( 0 ),
pUserMarkerObj( 0 ),
pShadCrsr( 0 ),
nDropAction( 0 ),
nDropFormat( 0 ),
nDropDestination( 0 ),
nInsFrmColCount( 1 ),
bLockInput(FALSE)
{
SetHelpId(HID_EDIT_WIN);
EnableChildTransparentMode();
SetDialogControlFlags( WINDOW_DLGCTRL_RETURN | WINDOW_DLGCTRL_WANTFOCUS );
bLinkRemoved = bMBPressed = bInsDraw = bInsFrm =
bIsInDrag = bOldIdle = bOldIdleSet = bChainMode = bWasShdwCrsr = FALSE;
SetMapMode(MapMode(MAP_TWIP));
SetPointer( POINTER_TEXT );
aTimer.SetTimeoutHdl(LINK(this, SwEditWin, TimerHandler));
bTblInsDelMode = FALSE;
aKeyInputTimer.SetTimeout( 3000 );
aKeyInputTimer.SetTimeoutHdl(LINK(this, SwEditWin, KeyInputTimerHandler));
aKeyInputFlushTimer.SetTimeout( 200 );
aKeyInputFlushTimer.SetTimeoutHdl(LINK(this, SwEditWin, KeyInputFlushHandler));
// TemplatePointer fuer Farben soll nach Einfachclick
// ohne Selektion zurueckgesetzt werden
aTemplateTimer.SetTimeout(400);
aTemplateTimer.SetTimeoutHdl(LINK(this, SwEditWin, TemplateTimerHdl));
//JP 16.12.98: temporaere Loesung!!! Sollte bei jeder Cursorbewegung
// den Font von der akt. einfuege Position setzen!
if( !rMyView.GetDocShell()->IsReadOnly() )
{
Font aFont;
SetInputContext( InputContext( aFont, INPUTCONTEXT_TEXT |
INPUTCONTEXT_EXTTEXTINPUT ) );
}
}
SwEditWin::~SwEditWin()
{
aKeyInputTimer.Stop();
delete pShadCrsr;
if( pQuickHlpData->bClear && rView.GetWrtShellPtr() )
pQuickHlpData->Stop( rView.GetWrtShell() );
bExecuteDrag = FALSE;
delete pApplyTempl;
rView.SetDrawFuncPtr(NULL);
delete pUserMarker;
delete pAnchorMarker;
}
/******************************************************************************
* Beschreibung: DrawTextEditMode einschalten
******************************************************************************/
void SwEditWin::EnterDrawTextMode( const Point& aDocPos )
{
if ( rView.EnterDrawTextMode(aDocPos) == TRUE )
{
if (rView.GetDrawFuncPtr())
{
rView.GetDrawFuncPtr()->Deactivate();
rView.SetDrawFuncPtr(NULL);
rView.LeaveDrawCreate();
}
rView.NoRotate();
rView.AttrChangedNotify( &rView.GetWrtShell() );
}
}
/******************************************************************************
* Beschreibung: DrawMode einschalten
******************************************************************************/
BOOL SwEditWin::EnterDrawMode(const MouseEvent& rMEvt, const Point& aDocPos)
{
SwWrtShell &rSh = rView.GetWrtShell();
SdrView *pSdrView = rSh.GetDrawView();
// if ( GetDrawFuncPtr() && (aActHitType == SDRHIT_NONE || rSh.IsDrawCreate()) )
if ( rView.GetDrawFuncPtr() )
{
if (rSh.IsDrawCreate())
return TRUE;
BOOL bRet = rView.GetDrawFuncPtr()->MouseButtonDown( rMEvt );
rView.AttrChangedNotify( &rSh );
return bRet;
}
if ( pSdrView && pSdrView->IsTextEdit() )
{
rSh.EndTextEdit(); // Danebengeklickt, Ende mit Edit
rSh.SelectObj( aDocPos );
if ( !rSh.IsObjSelected() && !rSh.IsFrmSelected() )
rSh.LeaveSelFrmMode();
else
{
SwEditWin::nDDStartPosY = aDocPos.Y();
SwEditWin::nDDStartPosX = aDocPos.X();
bFrmDrag = TRUE;
}
rView.AttrChangedNotify( &rSh );
return TRUE;
}
return FALSE;
}
/******************************************************************************
* Beschreibung:
******************************************************************************/
BOOL SwEditWin::IsDrawSelMode()
{
// return (IsFrmAction() == FALSE && GetDrawMode() == OBJ_NONE);
return (GetDrawMode() == SID_OBJECT_SELECT);
}
/******************************************************************************
* Beschreibung:
******************************************************************************/
void SwEditWin::GetFocus()
{
rView.GotFocus();
Window::GetFocus();
}
/******************************************************************************
* Beschreibung:
******************************************************************************/
void SwEditWin::LoseFocus()
{
Window::LoseFocus();
if( pQuickHlpData->bClear )
pQuickHlpData->Stop( rView.GetWrtShell() );
rView.LostFocus();
}
/******************************************************************************
* Beschreibung:
******************************************************************************/
void SwEditWin::Command( const CommandEvent& rCEvt )
{
if ( !rView.GetViewFrame() || !rView.GetViewFrame()->GetFrame() ||
rView.GetViewFrame()->GetFrame()->TransferForReplaceInProgress())
{
//Wenn der ViewFrame in Kuerze stirbt kein Popup mehr!
Window::Command(rCEvt);
return;
}
BOOL bCallBase = TRUE;
SwWrtShell &rSh = rView.GetWrtShell();
switch ( rCEvt.GetCommand() )
{
case COMMAND_CONTEXTMENU:
{
const USHORT nId = SwInputChild::GetChildWindowId();
SwInputChild* pChildWin = (SwInputChild*)GetView().GetViewFrame()->
GetChildWindow( nId );
if((!pChildWin || pChildWin->GetView() != &rView) &&
!rSh.IsDrawCreate() && !IsDrawAction())
{
SET_CURR_SHELL( &rSh );
if (!pApplyTempl)
{
if (bNoInterrupt == TRUE)
{
ReleaseMouse();
bNoInterrupt = FALSE;
bMBPressed = FALSE;
}
Point aDocPos( PixelToLogic( rCEvt.GetMousePosPixel() ) );
if ( !rCEvt.IsMouseEvent() )
aDocPos = rSh.GetCharRect().Center();
const Point aPixPos = LogicToPixel( aDocPos );
if ( rView.GetDocShell()->IsReadOnly() )
SwReadOnlyPopup( aDocPos, rView ).Execute( this, aPixPos );
else if ( !rView.ExecSpellPopup( aDocPos ) )
GetView().GetViewFrame()->GetDispatcher()->ExecutePopup( 0, this, &aPixPos);
}
else if (pApplyTempl->bUndo)
rSh.Do(SwWrtShell::UNDO);
bCallBase = FALSE;
}
}
break;
case COMMAND_WHEEL:
case COMMAND_STARTAUTOSCROLL:
case COMMAND_AUTOSCROLL:
if( pShadCrsr )
delete pShadCrsr, pShadCrsr = 0;
bCallBase = !rView.HandleWheelCommands( rCEvt );
break;
case COMMAND_VOICE:
{
//ggf. an Outliner weiterleiten
if ( rSh.HasDrawView() && rSh.GetDrawView()->IsTextEdit() )
{
bCallBase = FALSE;
rSh.GetDrawView()->GetTextEditOutlinerView()->Command( rCEvt );
break;
}
const CommandVoiceData *pCData = rCEvt.GetVoiceData();
if ( VOICECOMMANDTYPE_CONTROL == pCData->GetType() )
break;
USHORT nSlotId = 0;
SfxPoolItem *pItem = 0;
switch ( pCData->GetCommand() )
{
case DICTATIONCOMMAND_NEWPARAGRAPH: nSlotId = FN_INSERT_BREAK; break;
case DICTATIONCOMMAND_NEWLINE: nSlotId = FN_INSERT_LINEBREAK; break;
case DICTATIONCOMMAND_LEFT: nSlotId = FN_PREV_WORD; break;
case DICTATIONCOMMAND_RIGHT: nSlotId = FN_NEXT_WORD; break;
case DICTATIONCOMMAND_UP: nSlotId = FN_LINE_UP; break;
case DICTATIONCOMMAND_DOWN: nSlotId = FN_LINE_DOWN; break;
case DICTATIONCOMMAND_UNDO: nSlotId = SID_UNDO; break;
case DICTATIONCOMMAND_REPEAT: nSlotId = SID_REPEAT; break;
case DICTATIONCOMMAND_DEL: nSlotId = FN_DELETE_BACK_WORD; break;
case DICTATIONCOMMAND_BOLD_ON: nSlotId = SID_ATTR_CHAR_WEIGHT;
pItem = new SvxWeightItem( WEIGHT_BOLD );
break;
case DICTATIONCOMMAND_BOLD_OFF: nSlotId = SID_ATTR_CHAR_WEIGHT;
pItem = new SvxWeightItem( WEIGHT_NORMAL );
break;
case DICTATIONCOMMAND_UNDERLINE_ON: nSlotId = SID_ATTR_CHAR_UNDERLINE;
pItem = new SvxUnderlineItem( UNDERLINE_SINGLE );
break;
case DICTATIONCOMMAND_UNDERLINE_OFF:nSlotId = SID_ATTR_CHAR_UNDERLINE;
pItem = new SvxUnderlineItem( UNDERLINE_NONE );
break;
case DICTATIONCOMMAND_ITALIC_ON: nSlotId = SID_ATTR_CHAR_POSTURE;
pItem = new SvxPostureItem( ITALIC_NORMAL );
break;
case DICTATIONCOMMAND_ITALIC_OFF: nSlotId = SID_ATTR_CHAR_POSTURE;
pItem = new SvxPostureItem( ITALIC_NONE );
break;
case DICTATIONCOMMAND_NUMBERING_ON:
if ( !rSh.GetCurNumRule() )
nSlotId = FN_NUM_NUMBERING_ON;
break;
case DICTATIONCOMMAND_NUMBERING_OFF:
if ( rSh.GetCurNumRule() )
nSlotId = FN_NUM_NUMBERING_ON;
break;
case DICTATIONCOMMAND_TAB:
{
rSh.Insert( '\t' );
}
break;
case DICTATIONCOMMAND_UNKNOWN:
{
rView.GetWrtShell().Insert( pCData->GetText() );
}
break;
#ifdef DBG_UTIL
default:
ASSERT( !this, "unknown speech command." );
#endif
}
if ( nSlotId )
{
bCallBase = FALSE;
if ( pItem )
{
//Eigentumsuebergang des Items
GetView().GetViewFrame()->GetDispatcher()->Execute( nSlotId, SFX_CALLMODE_STANDARD,
pItem, 0 );
}
else
GetView().GetViewFrame()->GetDispatcher()->Execute( nSlotId );
}
}
break;
case COMMAND_STARTEXTTEXTINPUT:
if( rSh.HasDrawView() && rSh.GetDrawView()->IsTextEdit() )
{
bCallBase = FALSE;
rSh.GetDrawView()->GetTextEditOutlinerView()->Command( rCEvt );
}
else
{
if( rSh.HasSelection() )
rSh.DelRight();
bCallBase = FALSE;
rSh.CreateExtTextInput();
}
break;
case COMMAND_ENDEXTTEXTINPUT:
if( rSh.HasDrawView() && rSh.GetDrawView()->IsTextEdit() )
{
bCallBase = FALSE;
rSh.GetDrawView()->GetTextEditOutlinerView()->Command( rCEvt );
}
else
{
bCallBase = FALSE;
rSh.DeleteExtTextInput();
}
break;
case COMMAND_EXTTEXTINPUT:
if( rSh.HasDrawView() && rSh.GetDrawView()->IsTextEdit() )
{
bCallBase = FALSE;
rSh.GetDrawView()->GetTextEditOutlinerView()->Command( rCEvt );
}
else
{
const CommandExtTextInputData* pData = rCEvt.GetExtTextInputData();
if( pData )
{
bCallBase = FALSE;
rSh.SetExtTextInputData( *pData );
}
}
break;
case COMMAND_CURSORPOS:
// will be handled by the base class
break;
#ifdef DBG_UTIL
default:
ASSERT( !this, "unknown command." );
#endif
}
if (bCallBase)
Window::Command(rCEvt);
}
SfxShell* lcl_GetShellFromDispatcher( SwView& rView, TypeId nType )
{
//Shell ermitteln
SfxShell* pShell;
SfxDispatcher* pDispatcher = rView.GetViewFrame()->GetDispatcher();
for(int i = 0; TRUE; ++i )
{
pShell = pDispatcher->GetShell( i );
if( !pShell || pShell->IsA( nType ) )
break;
}
return pShell;
}
void SwEditWin::ClearTip()
{
}
IMPL_LINK( SwEditWin, KeyInputFlushHandler, Timer *, EMPTYARG )
{
FlushInBuffer( &rView.GetWrtShell() );
return 0;
}
IMPL_LINK( SwEditWin, KeyInputTimerHandler, Timer *, EMPTYARG )
{
bTblInsDelMode = FALSE;
return 0;
}
void SwEditWin::_InitStaticData()
{
pQuickHlpData = new QuickHelpData();
}
void SwEditWin::_FinitStaticData()
{
delete pQuickHlpData;
}
/*-----------------23.02.97 18:39-------------------
--------------------------------------------------*/
IMPL_LINK(SwEditWin, TemplateTimerHdl, Timer*, EMPTYARG)
{
SetApplyTemplate(SwApplyTemplate());
return 0;
}
void SwEditWin::SetChainMode( BOOL bOn )
{
if ( !bChainMode )
StopInsFrm();
if ( pUserMarker )
{
DELETEZ( pUserMarker );
}
bChainMode = bOn;
if ( !bChainMode )
rView.GetViewFrame()->HideStatusText();
static USHORT __READONLY_DATA aInva[] =
{
FN_FRAME_CHAIN, FN_FRAME_UNCHAIN, 0
};
rView.GetViewFrame()->GetBindings().Invalidate(aInva);
}
//-------------------------------------------------------------
void QuickHelpData::Move( QuickHelpData& rCpy )
{
// Pointer verschieben
aArr.Insert( &rCpy.aArr );
rCpy.aArr.Remove( (USHORT)0, rCpy.aArr.Count() );
// nTipId = rCpy.nTipId;
bClear = rCpy.bClear;
nLen = rCpy.nLen;
nCurArrPos = rCpy.nCurArrPos;
bChkInsBlank = rCpy.bChkInsBlank;
bIsTip = rCpy.bIsTip;
bIsAutoText = rCpy.bIsAutoText;
if( pCETID ) delete pCETID;
pCETID = rCpy.pCETID;
rCpy.pCETID = 0;
if( pAttrs ) delete pAttrs;
pAttrs = rCpy.pAttrs;
rCpy.pAttrs = 0;
}
void QuickHelpData::ClearCntnt()
{
nLen = nCurArrPos = 0;
bClear = bChkInsBlank = FALSE;
nTipId = 0;
aArr.DeleteAndDestroy( 0 , aArr.Count() );
bIsTip = TRUE;
bIsAutoText = TRUE;
delete pCETID, pCETID = 0;
delete pAttrs, pAttrs = 0;
}
void QuickHelpData::Start( SwWrtShell& rSh, USHORT nWrdLen )
{
if( pCETID ) delete pCETID, pCETID = 0;
if( pAttrs ) delete pAttrs, pAttrs = 0;
if( USHRT_MAX != nWrdLen )
{
nLen = nWrdLen;
nCurArrPos = 0;
}
bClear = TRUE;
if( bIsTip )
{
Window& rWin = rSh.GetView().GetEditWin();
Point aPt( rWin.OutputToScreenPixel( rWin.LogicToPixel(
rSh.GetCharRect().Pos() )));
aPt.Y() -= 3;
nTipId = Help::ShowTip( &rWin, Rectangle( aPt, Size( 1, 1 )),
*aArr[ nCurArrPos ],
QUICKHELP_LEFT | QUICKHELP_BOTTOM );
}
else
{
String sStr( *aArr[ nCurArrPos ] );
sStr.Erase( 0, nLen );
USHORT nL = sStr.Len();
pAttrs = new USHORT[ nL ];
for( USHORT n = nL; n; )
*(pAttrs + --n ) = EXTTEXTINPUT_ATTR_DOTTEDUNDERLINE |
EXTTEXTINPUT_ATTR_HIGHLIGHT;
pCETID = new CommandExtTextInputData( sStr, pAttrs, nL,
0, 0, 0, FALSE );
rSh.CreateExtTextInput();
rSh.SetExtTextInputData( *pCETID );
}
}
void QuickHelpData::Stop( SwWrtShell& rSh )
{
if( !bIsTip )
rSh.DeleteExtTextInput( 0, FALSE );
else if( nTipId )
Help::HideTip( nTipId );
ClearCntnt();
}
void QuickHelpData::FillStrArr( SwWrtShell& rSh, const String& rWord )
{
pCalendarWrapper->LoadDefaultCalendar( rSh.GetCurLang() );
using namespace ::com::sun::star;
{
uno::Sequence< i18n::CalendarItem > aNames(
pCalendarWrapper->getMonths() );
for( int n = 0; n < 2; ++n )
{
for( long nPos = 0, nEnd = aNames.getLength(); nPos < nEnd; ++nPos )
{
String sStr( aNames[ nPos ].FullName );
if( rWord.Len() + 1 < sStr.Len() &&
//!!! UNICODE: fehlendes interface
// pIntl->CompareEqual( rWord, sStr.Copy( 0, rWord.Len() ),
// INTN_COMPARE_IGNORECASE ) )
COMPARE_EQUAL == rWord.CompareIgnoreCaseToAscii(
sStr, rWord.Len() ))
{
String* pNew = new String( sStr );
if( !aArr.Insert( pNew ) )
delete pNew;
}
}
if( !n ) // get data for the second loop
aNames = pCalendarWrapper->getDays();
}
}
// and than add all words from the AutoCompleteWord-List
const SwAutoCompleteWord& rACLst = rSh.GetAutoCompleteWords();
USHORT nStt, nEnd;
if( rACLst.GetRange( rWord, nStt, nEnd ) )
{
while( nStt < nEnd )
{
const String& rS = rACLst[ nStt ];
//JP 16.06.99: Bug 66927 - only if the count of chars
// from the suggest greater as the
// actual word
if( rS.Len() > rWord.Len() )
{
String* pNew = new String( rS );
if( !aArr.Insert( pNew ) )
delete pNew;
}
++nStt;
}
}
}
/***********************************************************************
$Log: not supported by cvs2svn $
Revision 1.8 2001/04/18 07:49:09 ama
Fix #78807#: Anchor dragging with page scrolling
Revision 1.7 2001/03/23 15:55:45 jp
use new Drag&Drop / Clipboard API
Revision 1.6 2001/01/25 20:02:32 jp
use calendarwrapper instead of international
Revision 1.5 2000/11/29 14:52:48 jp
Bug #80898#: Start QuickHelp - set correct cursor flags
Revision 1.4 2000/11/13 12:12:22 jp
must/should changes in Command handler
Revision 1.3 2000/10/25 15:35:11 jp
use CharClass/BreakIt instead of old WordSelection
Revision 1.2 2000/10/05 12:13:21 jp
should change: remove image
Revision 1.1.1.1 2000/09/18 17:14:35 hr
initial import
Revision 1.776 2000/09/18 16:05:23 willem.vandorp
OpenOffice header added.
Revision 1.775 2000/09/08 08:12:50 os
Change: Set/Toggle/Has/Knows/Show/GetChildWindow
Revision 1.774 2000/09/07 16:06:14 os
change: SFX_DISPATCHER/SFX_BINDINGS removed
Revision 1.773 2000/09/07 15:59:21 os
change: SFX_DISPATCHER/SFX_BINDINGS removed
Revision 1.772 2000/07/18 18:30:46 jp
KeyInput: start a timer if AnyInput don't call the KeyInput again, for flush the data
Revision 1.771 2000/06/28 09:40:29 os
#76471# call FN_EDIT_FIELD via SfxBindings instead of SfxDispatcher
Revision 1.770 2000/06/13 14:56:20 os
#76167# character background color assignment corrected
Revision 1.769 2000/06/13 10:00:15 os
using UCB
Revision 1.768 2000/06/09 13:35:02 ama
Fix: No assert for COMMAND_CURSORPOS
Revision 1.767 2000/05/26 07:21:29 os
old SW Basic API Slots removed
Revision 1.766 2000/05/24 10:39:15 jp
Fix for solaris compiler
Revision 1.765 2000/05/19 13:12:42 jp
Changes for Unicode
Revision 1.764 2000/05/19 11:04:59 jp
Changes for Unicode
Revision 1.763 2000/05/10 11:54:57 os
Basic API removed
Revision 1.762 2000/05/09 14:46:33 os
BASIC interface partially removed
Revision 1.761 2000/05/03 09:04:35 os
#75368# prevent hyperlink execution if watercan mode is activated
Revision 1.760 2000/04/20 12:55:18 os
GetName() returns String&
Revision 1.759 2000/04/18 15:18:16 os
UNICODE
Revision 1.758 2000/03/03 15:16:59 os
StarView remainders removed
Revision 1.757 2000/02/11 14:44:59 hr
#70473# changes for unicode ( patched by automated patchtool )
Revision 1.756 2000/02/09 12:02:37 jp
Task #72684#: AutoText expand only with return-Key
Revision 1.755 2000/01/13 21:28:12 jp
Task #71894#: new Options for SW-AutoComplete
Revision 1.754 1999/12/06 18:19:55 jp
Bug #70535#: Wheelcommands - hide ShadowCursor
Revision 1.753 1999/11/10 09:38:34 ama
Fix #69089#: HitHandle and hit anchor
Revision 1.752 1999/10/19 12:24:44 os
call authority-entry dialog on double click
Revision 1.751 1999/10/12 14:33:19 jp
Bug #69139#: DTOR - stop QuickHelpData only if the WrtShell exist
Revision 1.750 1999/10/12 13:39:17 ama
Fix #69089#: Use sdr-anchor-handle
Revision 1.749 1999/10/11 20:10:29 jp
Bug #68496#: append paragraph behind a section
Revision 1.748 1999/10/08 09:42:58 os
#69059# last cast from GetpApp to SfxApplication* removed
Revision 1.747 1999/10/06 08:41:11 jp
Bug #68761#: MouseMove - use new function GetFmtFromAnyObj
Revision 1.746 1999/08/27 09:34:38 JP
no cast from GetpApp to SfxApp
Rev 1.745 27 Aug 1999 11:34:38 JP
no cast from GetpApp to SfxApp
Rev 1.744 06 Aug 1999 16:48:18 JP
Bug #68113#: MouseButtonDown - lockview before call SelectObject
Rev 1.743 06 Jul 1999 20:06:50 JP
Bug #67360#: MouseMove - check for aditional mode
Rev 1.742 17 Jun 1999 09:36:30 JP
Bug #66927#: KeyInput - fill AutoCompleteList only with words which has lower count of characters
Rev 1.741 27 May 1999 13:00:40 OS
Einf?gen/Bearbeiten von Spalten ueberarbeitet
Rev 1.740 11 May 1999 20:09:22 HJS
includes
Rev 1.739 27 Apr 1999 14:50:20 JP
Bug #65389#: MouseButtonUp - im HoldSelection auf jedenfall das EndDrag rufen
Rev 1.738 26 Apr 1999 12:20:14 KZ
#include <svtools/args.hxx> eingefuegt
Rev 1.737 23 Apr 1999 17:02:32 JP
Bug #65289#: MouseMove: synthetische Moves/ButtonDowns ignorieren
Rev 1.736 22 Apr 1999 12:33:40 JP
Bug #65171#: UpdatePointer - bei ApplyStyle den richtigen MousePointer setzen
Rev 1.735 19 Apr 1999 13:38:44 OS
#64780# Notizen und Scripts in geschuetzten Bereichen
Rev 1.734 01 Apr 1999 15:26:38 JP
Bug #64154#: KeyInput - beim AutoComplete die schon eingegebenen Buchstaben nicht entfernen
Rev 1.733 17 Mar 1999 11:31:40 JP
Task #63576#: KeyInput - das AutoComplete-Flag von der OffApp erfragen
Rev 1.732 10 Mar 1999 09:40:30 JP
Task #61405#: AutoCompletion von Woertern
Rev 1.731 09 Mar 1999 19:38:14 JP
Task #61405#: AutoCompletion von Woertern
Rev 1.730 08 Mar 1999 11:52:14 JP
Bug #62920#: aus readonly Docs Grafiken einfacher herausdraggen
Rev 1.729 01 Mar 1999 23:01:24 JP
Bug #62582#: InInProtectCntnt nur noch auswerten, wenn Cursor nicht im Readonly zugelassen ist
Rev 1.728 03 Feb 1999 13:59:58 JP
Bug #61399#: MouseButtonDown - CTRL auf Handels behandeln
Rev 1.727 28 Jan 1999 20:46:08 JP
Bug #61264#: MouseButtonDown - SHIFT-CTRL auf Handels behandeln
Rev 1.726 26 Jan 1999 11:01:24 AWO
Syntax
Rev 1.725 22 Jan 1999 16:56:44 JP
Bug Task #58677#: Crsr in Readonly Bereichen zulassen
Rev 1.724 20 Jan 1999 14:17:30 JP
Task #58677#: Crsr in Readonly Bereichen zulassen
Rev 1.723 19 Jan 1999 22:58:12 JP
Task #58677#: Crsr in Readonly Bereichen zulassen
Rev 1.722 17 Dec 1998 19:19:54 JP
Task #59490# ExtTextInput fuer japan./chine. Version
Rev 1.721 11 Dec 1998 12:47:42 MT
#59490# IME
Rev 1.720 11 Nov 1998 15:04:26 JP
Task #59308#: NoNum auch bei Outlines setzen
Rev 1.719 06 Nov 1998 14:43:04 OS
#57903# NumOff kann weg
Rev 1.718 03 Nov 1998 11:51:40 JP
Task #57916#: Vorbereitungen fuer den Selektionshandler vom Chart
Rev 1.717 25 Sep 1998 13:21:00 JP
Bug #56196#: KeyInput - Tab in der WebView ans Window weiterleiten, damit der SFX ggfs. was tun kann
Rev 1.716 24 Sep 1998 13:33:22 JP
Bug #55592#/#55931#: synthetische MouseMoves mit Ctrl-Taste sollten keine Selektion anfangen
Rev 1.715 10 Sep 1998 10:39:28 OS
#56290# Rahmenvorlage per Giesskanne auch ohne Selektion
**********************************************************************/