diff options
Diffstat (limited to 'sd/source/ui/func/futext.cxx')
-rw-r--r-- | sd/source/ui/func/futext.cxx | 1292 |
1 files changed, 1292 insertions, 0 deletions
diff --git a/sd/source/ui/func/futext.cxx b/sd/source/ui/func/futext.cxx new file mode 100644 index 000000000000..1fc97e061ed7 --- /dev/null +++ b/sd/source/ui/func/futext.cxx @@ -0,0 +1,1292 @@ +/************************************************************************* + * + * $RCSfile: futext.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 16:48:36 $ + * + * 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): _______________________________________ + * + * + ************************************************************************/ + +#pragma hdrstop + +#ifndef _EEITEM_HXX //autogen +#include <svx/eeitem.hxx> +#endif +#include <svx/svdetc.hxx> +#include <svx/dlgutil.hxx> +#ifndef _SVXERR_HXX //autogen +#include <svx/svxerr.hxx> +#endif +#ifndef _OFA_OSPLCFG_HXX //autogen +#include <offmgr/osplcfg.hxx> +#endif +#ifndef _SV_HELP_HXX //autogen +#include <vcl/help.hxx> +#endif +#ifndef _EDITSTAT_HXX //autogen +#include <svx/editstat.hxx> +#endif +#ifndef _OFF_APP_HXX //autogen +#include <offmgr/app.hxx> +#endif +#ifndef _AEITEM_HXX //autogen +#include <svtools/aeitem.hxx> +#endif +#ifndef _SFXINTITEM_HXX //autogen +#include <svtools/intitem.hxx> +#endif +#ifndef _SVDOTEXT_HXX //autogen +#include <svx/svdotext.hxx> +#endif +#ifndef _SVDOGROUP_HXX //autogen +#include <svx/svdogrp.hxx> +#endif +#define ITEMID_FIELD EE_FEATURE_FIELD +#include <svx/flditem.hxx> +#ifndef _SFXSTYLE_HXX //autogen +#include <svtools/style.hxx> +#endif +#ifndef _SVDPAGV_HXX //autogen +#include <svx/svdpagv.hxx> +#endif +#ifndef _SFXVIEWFRM_HXX //autogen +#include <sfx2/viewfrm.hxx> +#endif +#include <basctl/idetemp.hxx> +#ifndef _SFXDISPATCH_HXX //autogen +#include <sfx2/dispatch.hxx> +#endif +#ifndef _SFX_BINDINGS_HXX //autogen +#include <sfx2/bindings.hxx> +#endif +#ifndef _SFXREQUEST_HXX //autogen +#include <sfx2/request.hxx> +#endif +#ifndef _MyEDITENG_HXX //autogen +#include <svx/editeng.hxx> +#endif +#ifndef _SVDOUTL_HXX //autogen +#include <svx/svdoutl.hxx> +#endif +#include <svx/svxids.hrc> +#ifndef _SFXDOCFILE_HXX //autogen +#include <sfx2/docfile.hxx> +#endif +#ifndef _UNO_LINGU_HXX +#include <svx/unolingu.hxx> +#endif + +#include "sdresid.hxx" +#include "app.hrc" +#include "res_bmp.hrc" +#include "futext.hxx" +#include "viewshel.hxx" +#include "sdview.hxx" +#include "sdoutl.hxx" +#include "sdwindow.hxx" +#include "drawdoc.hxx" +#include "sdpage.hxx" +#include "sdmod.hxx" +#include "frmview.hxx" +#include "docshell.hxx" +#include "glob.hrc" +#include "pres.hxx" + +using namespace ::com::sun::star; + +static USHORT SidArray[] = { + SID_STYLE_FAMILY2, // 5542 + SID_STYLE_FAMILY5, // 5545 + SID_CUT, // 5710 + SID_COPY, // 5711 +// SID_ATTR_TABSTOP, // 10002 + SID_ATTR_CHAR_FONT, // 10007 + SID_ATTR_CHAR_POSTURE, // 10008 + SID_ATTR_CHAR_WEIGHT, // 10009 + SID_ATTR_CHAR_UNDERLINE, // 10014 + SID_ATTR_CHAR_FONTHEIGHT, // 10015 + SID_ATTR_CHAR_COLOR, // 10017 + SID_ATTR_PARA_ADJUST_LEFT, // 10028 + SID_ATTR_PARA_ADJUST_RIGHT, // 10029 + SID_ATTR_PARA_ADJUST_CENTER, // 10030 + SID_ATTR_PARA_ADJUST_BLOCK, // 10031 + SID_ATTR_PARA_LINESPACE_10, // 10034 + SID_ATTR_PARA_LINESPACE_15, // 10035 + SID_ATTR_PARA_LINESPACE_20, // 10036 + SID_ATTR_PARA_LRSPACE, // 10043 + SID_OUTLINE_UP, // 10150 + SID_OUTLINE_DOWN, // 10151 + SID_OUTLINE_LEFT, // 10152 + SID_OUTLINE_RIGHT, // 10153 + SID_FORMTEXT_STYLE, // 10257 + SID_SET_SUPER_SCRIPT, // 10294 + SID_SET_SUB_SCRIPT, // 10295 + SID_HYPERLINK_GETLINK, // 10361 + FN_NUM_BULLET_ON, // 20138 + SID_BULLET, // 27019 + SID_PARASPACE_INCREASE, // 27346 + SID_PARASPACE_DECREASE, // 27347 + 0 }; + +TYPEINIT1( FuText, FuConstruct ); + +#include <stdio.h> + +static BOOL bTestText = 0; + +/************************************************************************* +|* +|* Basisklasse fuer Textfunktionen +|* +\************************************************************************/ + +FuText::FuText(SdViewShell* pViewSh, SdWindow* pWin, SdView* pView, + SdDrawDocument* pDoc, SfxRequest& rReq) : + FuConstruct(pViewSh, pWin, pView, pDoc, rReq), + pTextObj(NULL), + bFirstObjCreated(FALSE), + rRequest (rReq) +{} + +/************************************************************************* +|* +|* Destruktor +|* +\************************************************************************/ + +FuText::~FuText() +{ + if (pView->EndTextEdit() == SDRENDTEXTEDIT_DELETED) + { + pTextObj = NULL; + } + + // die RequestHandler der benutzten Outliner zuruecksetzen auf den + // Handler am Dokument + Outliner* pOutliner = pView->GetTextEditOutliner(); + + if (pOutliner) + { + pOutliner->SetStyleSheetPool((SfxStyleSheetPool*) + pDoc->GetStyleSheetPool()); + pOutliner->SetMinDepth(0); + } +} + +/************************************************************************* +|* +|* Execute functionality of this class: +|* +|* #71422: Start the functionality of this class in this method +|* and not in the ctor. +|* If you construct an object of this class and you put the +|* address of this object to pFuActual you've got a problem, +|* because some methods inside DoExecute use the pFuActual-Pointer. +|* If the code inside DoExecute is executed inside the ctor, +|* the value of pFuActual is not right. And the value will not +|* be right until the ctor finished !!! +|* +\************************************************************************/ +void FuText::DoExecute () +{ + pViewShell->SwitchObjectBar(RID_DRAW_TEXT_TOOLBOX); + pView->SetCurrentObj(OBJ_TEXT); + pView->SetEditMode(SDREDITMODE_EDIT); + + SdrViewEvent aVEvt; + + if (nSlotId == SID_TEXTEDIT || pViewShell->GetFrameView()->IsQuickEdit()) + { + MouseEvent aMEvt(pWindow->GetPointerPosPixel()); + + if (nSlotId == SID_TEXTEDIT) + { + // Try to select an object + SdrPageView* pPV = pView->GetPageViewPvNum(0); + SdrViewEvent aVEvt; + SdrHitKind eHit = pView->PickAnything(aMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + pView->MarkObj(aVEvt.pRootObj, pPV); + + if (aVEvt.pObj && aVEvt.pObj->ISA(SdrTextObj)) + { + pTextObj = (SdrTextObj*) aVEvt.pObj; + } + } + else if (pView->HasMarkedObj()) + { + const SdrMarkList& rMarkList = pView->GetMarkList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetObj(); + + if (pObj->ISA(SdrTextObj)) + { + pTextObj = (SdrTextObj*) pObj; + } + } + } + + BOOL bQuickDrag = TRUE; + + const SfxItemSet* pArgs = rRequest.GetArgs(); + + if (pArgs && + (UINT16) ((SfxUInt16Item&) pArgs->Get(SID_TEXTEDIT)).GetValue() == 2) + { + // Selection by doubleclick -> don't allow QuickDrag + bQuickDrag = FALSE; + } + + SetInEditMode(aMEvt, bQuickDrag); + } +} + +/************************************************************************* +|* +|* MouseButtonDown-event +|* +\************************************************************************/ + +BOOL FuText::MouseButtonDown(const MouseEvent& rMEvt) +{ + bMBDown = TRUE; + + BOOL bReturn = FuDraw::MouseButtonDown(rMEvt); + + // Fuer PopupMenu (vorher DrawViewShell) + if ((rMEvt.GetButtons() == MOUSE_RIGHT) && rMEvt.GetClicks() == 1 && + pView->IsTextEdit()) + { + return (TRUE); + } + + pView->SetMarkHdlWhenTextEdit(TRUE); + SdrViewEvent aVEvt; + SdrHitKind eHit = pView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + + if (eHit == SDRHIT_TEXTEDIT) + { + // Text getroffen -> Event von SdrView auswerten lassen + if (pView->MouseButtonDown(rMEvt, pWindow)) + return (TRUE); + } + + if (rMEvt.GetClicks() == 1) + { + if (pView->IsTextEdit() && eHit != SDRHIT_MARKEDOBJECT && eHit != SDRHIT_HANDLE) + { + // Texteingabe beenden + if (pView->EndTextEdit() == SDRENDTEXTEDIT_DELETED) + { + // Bugfix von MBA: bei Doppelclick auf der Wiese im Modus Text wird + // beim zweiten Click eHit = SDRHIT_TEXTEDITOBJ erhalten, weil ja der + // zweite Click auf das im ersten Click angelegte TextObject geht. + // Dieses wird aber in EndTextEdit entfernt, weil es leer ist. Es + // befindet sich aber noch in der Mark-Liste und der Aufruf MarkObj + // weiter unten greift dann auf das tote Object zu. + // Als einfacher Fix wird nach EndTextEdit noch einmal eHit ermittelt, + // was dann SDRHIT_NONE liefert. + pTextObj = NULL; + eHit = pView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + } + + pView->SetCurrentObj(OBJ_TEXT); + pView->SetEditMode(SDREDITMODE_EDIT); + } + + if (rMEvt.IsLeft()) + { + pWindow->CaptureMouse(); + SdrObject* pObj; + SdrPageView* pPV = pView->GetPageViewPvNum(0); + + if (eHit == SDRHIT_TEXTEDIT) + { + SetInEditMode(rMEvt, FALSE); + } + else + { + BOOL bMacro = FALSE; + + if (bMacro && pView->PickObj(aMDPos,pObj,pPV,SDRSEARCH_PICKMACRO)) + { + // Makro + USHORT nHitLog = USHORT ( pWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + pView->BegMacroObj(aMDPos,nHitLog,pObj,pPV,pWindow); + } + else + { + if (eHit != SDRHIT_HANDLE) + { + // Selektion aufheben + if (!rMEvt.IsShift() && eHit == SDRHIT_TEXTEDITOBJ) + { + pView->UnmarkAll(); + pView->SetDragMode(SDRDRAG_MOVE); + } + } + + if ( aVEvt.eEvent == SDREVENT_EXECUTEURL || + eHit == SDRHIT_HANDLE || + eHit == SDRHIT_MARKEDOBJECT || + eHit == SDRHIT_TEXTEDITOBJ || + ( eHit == SDRHIT_UNMARKEDOBJECT && bFirstObjCreated && + !bPermanent ) ) + { + /********************************************************** + * Handle, markiertes oder unmarkiertes Objekt getroffen + **********************************************************/ + if (eHit == SDRHIT_TEXTEDITOBJ) + { + /****************************************************** + * Text eines unmarkierten Objekts getroffen: + * Objekt wird selektiert und in EditMode versetzt + ******************************************************/ + pView->MarkObj(aVEvt.pRootObj, pPV); + + if (aVEvt.pObj && aVEvt.pObj->ISA(SdrTextObj)) + { + pTextObj = (SdrTextObj*) aVEvt.pObj; + } + + SetInEditMode(rMEvt, TRUE); + } + else if (aVEvt.eEvent == SDREVENT_EXECUTEURL && !rMEvt.IsMod2()) + { + /****************************************************** + * URL ausfuehren + ******************************************************/ + pWindow->ReleaseMouse(); + SfxStringItem aStrItem(SID_FILE_NAME, aVEvt.pURLField->GetURL()); + SfxStringItem aReferer(SID_REFERER, pDocSh->GetMedium()->GetName()); + SfxBoolItem aBrowseItem( SID_BROWSING, TRUE ); + SfxViewFrame* pFrame = pViewShell->GetViewFrame(); + pWindow->ReleaseMouse(); + + if (rMEvt.IsMod1()) + { + // Im neuen Frame oeffnen + pFrame->GetDispatcher()->Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, + &aStrItem, &aBrowseItem, &aReferer, 0L); + } + else + { + // Im aktuellen Frame oeffnen + SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame); + pFrame->GetDispatcher()->Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, + &aStrItem, &aFrameItem, &aBrowseItem, &aReferer, 0L); + } + } + else + { + /****************************************************** + * Objekt oder Handle draggen + ******************************************************/ + if (!aVEvt.pHdl) + { + if( eHit == SDRHIT_UNMARKEDOBJECT ) + { + if ( !rMEvt.IsShift() ) + pView->UnmarkAll(); + + pView->MarkObj(aVEvt.pRootObj, pPV); + } + + // Objekt draggen + bFirstMouseMove = TRUE; + aDragTimer.Start(); + } + + Outliner* pOutl = pView->GetTextEditOutliner(); + + if (pTextObj && (pTextObj->GetOutlinerParaObject() || + (pOutl && pOutl->GetText(pOutl->GetParagraph( 0 )).Len() != 0))) + { + pView->EndTextEdit(); + } + + USHORT nDrgLog = USHORT ( pWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); + pView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog); + } + } + else if ( nSlotId != SID_TEXTEDIT && + (bPermanent || !bFirstObjCreated) ) + { + /********************************************************** + * Objekt erzeugen + **********************************************************/ + pView->SetCurrentObj(OBJ_TEXT); + pView->SetEditMode(SDREDITMODE_CREATE); + USHORT nDrgLog = USHORT ( pWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); + pView->BegCreateObj(aMDPos, (OutputDevice*) NULL, nDrgLog); + } + else + { + /********************************************************** + * Selektieren + **********************************************************/ + if( !rMEvt.IsShift() ) + pView->UnmarkAll(); + + pView->BegMarkObj( aMDPos ); + } + } + } + } + } + else if ( rMEvt.GetClicks() == 2 && !pView->IsTextEdit() ) + { + MouseEvent aMEvt( pWindow->GetPointerPosPixel() ); + SetInEditMode( aMEvt, FALSE ); + } + + if (!bIsInDragMode) + { + ForcePointer(&rMEvt); + + SFX_BINDINGS().Invalidate(SidArray); + } + + return (bReturn); +} + +/************************************************************************* +|* +|* MouseMove-event +|* +\************************************************************************/ + +BOOL FuText::MouseMove(const MouseEvent& rMEvt) +{ + BOOL bReturn = FuDraw::MouseMove(rMEvt); + + if (aDragTimer.IsActive() ) + { + if( bFirstMouseMove ) + bFirstMouseMove = FALSE; + else + aDragTimer.Stop(); + } + + if (!bReturn && pView->IsAction()) + { + Point aPix(rMEvt.GetPosPixel()); + Point aPnt(pWindow->PixelToLogic(aPix)); + + ForceScroll(aPix); + pView->MovAction(aPnt); + } + + ForcePointer(&rMEvt); + + return (bReturn); +} + +/************************************************************************* +|* +|* MouseButtonUp-event +|* +\************************************************************************/ + +BOOL FuText::MouseButtonUp(const MouseEvent& rMEvt) +{ + BOOL bReturn = FALSE; + + if (aDragTimer.IsActive()) + { + aDragTimer.Stop(); + bIsInDragMode = FALSE; + } + + SFX_BINDINGS().Invalidate( SidArray ); + + Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + + if (pView->MouseButtonUp(rMEvt, pWindow) || rMEvt.GetClicks() == 2 ) + return (TRUE); // Event von der SdrView ausgewertet + + BOOL bEmptyTextObj = FALSE; + + if (pTextObj) + { + const SdrMarkList& rMarkList = pView->GetMarkList(); + + if (rMarkList.GetMarkCount() == 1 && + ( rMarkList.GetMark(0)->GetObj() == pTextObj || + rMarkList.GetMark(0)->GetObj()->ISA( SdrObjGroup ) ) ) + { + // Ist pTextObj wirklich noch gueltig? + // (Im FontWork wird z.B. das Objekt ausgetauscht!) + if (!pTextObj->GetOutlinerParaObject()) + bEmptyTextObj = TRUE; + else + bFirstObjCreated = TRUE; + } + else + pTextObj = NULL; + } + + if (pView->IsDragObj()) + { + /********************************************************************** + * Objekt wurde verschoben + **********************************************************************/ + FrameView* pFrameView = pViewShell->GetFrameView(); + BOOL bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); + + if (bDragWithCopy) + { + bDragWithCopy = !pView->IsPresObjSelected(FALSE, TRUE); + } + + pView->SetDragWithCopy(bDragWithCopy); + pView->EndDragObj( pView->IsDragWithCopy() ); + pView->ForceMarkedToAnotherPage(); + pView->SetCurrentObj(OBJ_TEXT); + } + else if (pView->IsCreateObj() && rMEvt.IsLeft()) + { + /********************************************************************** + * Objekt wurde erzeugt + **********************************************************************/ + pTextObj = (SdrTextObj*) pView->GetCreateObj(); + + if (pTextObj && nSlotId != SID_TEXT_FITTOSIZE && pDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) + { + // Impress-Textobjekt wird erzeugt (faellt auf Zeilenhoehe zusammen) + // Damit das Objekt beim anschliessenden Erzeugen gleich die richtige + // Hoehe bekommt (sonst wird zuviel gepainted) + SfxItemSet aSet(pViewShell->GetPool()); + SdrTextMinFrameHeightItem aMinHeight(0); + aSet.Put(aMinHeight); + SdrTextAutoGrowHeightItem aAutoGrowHeight(TRUE); + aSet.Put(aAutoGrowHeight); + pTextObj->NbcSetAttributes(aSet, FALSE); + pTextObj->AdjustTextFrameWidthAndHeight(); + SdrTextMaxFrameHeightItem aMaxHeight(pTextObj->GetLogicRect().GetSize().Height()); + aSet.Put(aMaxHeight); + pTextObj->NbcSetAttributes(aSet, FALSE); + } + + if (!pView->EndCreateObj(SDRCREATE_FORCEEND)) + { + // Textobjekt konnte nicht erzeugt werden + pTextObj = NULL; + } + else if (nSlotId == SID_TEXT_FITTOSIZE) + { + // FitToSize (An Rahmen anpassen) + SfxItemSet aSet(pViewShell->GetPool(), SDRATTR_TEXT_AUTOGROWHEIGHT, + SDRATTR_TEXT_AUTOGROWWIDTH, 0L); + SdrFitToSizeType eFTS = SDRTEXTFIT_PROPORTIONAL; + aSet.Put(SdrTextFitToSizeTypeItem(eFTS)); + aSet.Put(SdrTextAutoGrowHeightItem(FALSE)); + aSet.Put(SdrTextAutoGrowWidthItem(FALSE)); + pTextObj->NbcSetAttributes(aSet, FALSE); + pTextObj->AdjustTextFrameWidthAndHeight(); + SetInEditMode(rMEvt, FALSE); + } + else + { + // Normales Textobjekt + if (pDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) + { + // Impress-Textobjekt (faellt auf Zeilenhoehe zusammen) + SfxItemSet aSet(pViewShell->GetPool()); + SdrTextMinFrameHeightItem aMinHeight(0); + aSet.Put(aMinHeight); + SdrTextMaxFrameHeightItem aMaxHeight(0); + aSet.Put(aMaxHeight); + SdrTextAutoGrowHeightItem aAutoGrowHeight(TRUE); + aSet.Put(aAutoGrowHeight); + pTextObj->NbcSetAttributes(aSet, FALSE); + pTextObj->AdjustTextFrameWidthAndHeight(); + } + + // Damit die Handles und der graue Rahmen stimmen + pView->AdjustMarkHdl(); + pView->HitHandle(aPnt, *pWindow); + SetInEditMode(rMEvt, FALSE); + } + } + else if (pView->IsAction()) + { + pView->EndAction(); + } + + ForcePointer(&rMEvt); + pWindow->ReleaseMouse(); + USHORT nDrgLog = USHORT ( pWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); + + if ( !pView->HasMarkedObj() && + Abs(aMDPos.X() - aPnt.X()) < nDrgLog && + Abs(aMDPos.Y() - aPnt.Y()) < nDrgLog && + !rMEvt.IsShift() && !rMEvt.IsMod2() ) + { + SdrPageView* pPV = pView->GetPageViewPvNum(0); + SdrViewEvent aVEvt; + SdrHitKind eHit = pView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + pView->MarkObj(aVEvt.pRootObj, pPV); + } + + if ( !pTextObj ) + { + if ( ( (!bEmptyTextObj && bPermanent) || + (!bFirstObjCreated && !bPermanent) ) && + !pDocSh->IsReadOnly() && + nSlotId != SID_TEXTEDIT ) + { + /********************************************************************** + * Mengentext (linksbuendiges AutoGrow) + **********************************************************************/ + pView->SetCurrentObj(OBJ_TEXT); + pView->SetEditMode(SDREDITMODE_CREATE); + USHORT nDrgLog = USHORT ( pWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); + pView->BegCreateObj(aMDPos, (OutputDevice*) NULL, nDrgLog); + + BOOL bSnapEnabled = pView->IsSnapEnabled(); + + if (bSnapEnabled) + pView->SetSnapEnabled(FALSE); + + aPnt.X() += nDrgLog + nDrgLog; + aPnt.Y() += nDrgLog + nDrgLog; + pView->MovAction(aPnt); + + pTextObj = (SdrTextObj*) pView->GetCreateObj(); + + if (pTextObj) + { + pTextObj->SetDisableAutoWidthOnDragging(TRUE); + } + + if (!pView->EndCreateObj(SDRCREATE_FORCEEND)) + { + pTextObj = NULL; + } + + if (bSnapEnabled) + pView->SetSnapEnabled(bSnapEnabled); + + if (pTextObj) + { + SfxItemSet aSet(pViewShell->GetPool()); + SdrTextMinFrameHeightItem aMinHeight(0); + aSet.Put(aMinHeight); + SdrTextMinFrameWidthItem aMinWidth(0); + aSet.Put(aMinWidth); + SdrTextAutoGrowHeightItem aAutoGrowHeight(TRUE); + aSet.Put(aAutoGrowHeight); + SdrTextAutoGrowWidthItem aAutoGrowWidth(TRUE); + aSet.Put(aAutoGrowWidth); + SdrTextHorzAdjustItem aTextHorzAdjust(SDRTEXTHORZADJUST_LEFT); + aSet.Put(aTextHorzAdjust); + pTextObj->NbcSetAttributes(aSet, FALSE); + pTextObj->SetDisableAutoWidthOnDragging(TRUE); + SetInEditMode(rMEvt, FALSE); + } + + bFirstObjCreated = TRUE; + } + else + { + // In die Fkt. Selektion wechseln + if (pView->EndTextEdit() == SDRENDTEXTEDIT_DELETED) + { + pTextObj = NULL; + } + + pViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_OBJECT_SELECT, + SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD ); + } + } + + bMBDown = FALSE; + FuConstruct::MouseButtonUp(rMEvt); + return (bReturn); +} + +/************************************************************************* +|* +|* Tastaturereignisse bearbeiten +|* +|* Wird ein KeyEvent bearbeitet, so ist der Return-Wert TRUE, andernfalls +|* FALSE. +|* +\************************************************************************/ + +BOOL FuText::KeyInput(const KeyEvent& rKEvt) +{ + BOOL bReturn = FALSE; + pView->SetMarkHdlWhenTextEdit(TRUE); + + KeyCode nCode = rKEvt.GetKeyCode(); + BOOL bShift = nCode.IsShift(); + + if ( pTextObj && pTextObj->GetObjInventor() == SdrInventor && + pTextObj->GetObjIdentifier() == OBJ_TITLETEXT + && rKEvt.GetKeyCode().GetCode() == KEY_RETURN ) + { + // Titeltext-Objekt: immer "weiche" Umbrueche + bShift = TRUE; + } + + USHORT nKey = nCode.GetCode(); + KeyCode aKeyCode (nKey, bShift, nCode.IsMod1(), nCode.IsMod2() ); + KeyEvent aKEvt(rKEvt.GetCharCode(), aKeyCode); + + BOOL bOK = TRUE; + + if (pDocSh->IsReadOnly()) + { + bOK = !EditEngine::DoesKeyChangeText(aKEvt); + } + if( aKeyCode.GetCode() == KEY_PAGEUP || aKeyCode.GetCode() == KEY_PAGEDOWN ) + { + bOK = FALSE; // default handling in base class + } + + if (bOK && pView->KeyInput(aKEvt, pWindow) ) + { + bReturn = TRUE; + + SFX_BINDINGS().Invalidate( SidArray ); + + if ( pTextObj ) + { + pTextObj->SetEmptyPresObj(FALSE); + } + } + else if (aKeyCode == KEY_ESCAPE) + { + if ( pView->IsTextEdit() ) + { + if (pView->EndTextEdit() == SDRENDTEXTEDIT_DELETED) + { + pTextObj = NULL; + } + + pView->SetCurrentObj(OBJ_TEXT); + pView->SetEditMode(SDREDITMODE_EDIT); + bReturn = TRUE; + } + } + + if( bPermanent ) + { + pView->SetCurrentObj(OBJ_TEXT); + pView->SetEditMode(SDREDITMODE_CREATE); + } + + if (!bReturn) + { + bReturn = FuDraw::KeyInput(aKEvt); + } + + return (bReturn); +} + + + +/************************************************************************* +|* +|* Function aktivieren +|* +\************************************************************************/ + +void FuText::Activate() +{ + pView->SetQuickTextEditMode(pViewShell->GetFrameView()->IsQuickEdit()); + + pView->SetHitTolerancePixel( 4 * HITPIX ); + + OutlinerView* pOLV = pView->GetTextEditOutlinerView(); + + if (pOLV) + pOLV->ShowCursor(); + + FuConstruct::Activate(); + + if( pOLV ) + pView->SetEditMode(SDREDITMODE_EDIT); +} + + +/************************************************************************* +|* +|* Function deaktivieren +|* +\************************************************************************/ + +void FuText::Deactivate() +{ + OutlinerView* pOLV = pView->GetTextEditOutlinerView(); + + if (pOLV) + pOLV->HideCursor(); + + pView->SetHitTolerancePixel( HITPIX ); + + FuConstruct::Deactivate(); +} + + +/************************************************************************* +|* +|* Objekt in Edit-Mode setzen +|* +\************************************************************************/ + +void FuText::SetInEditMode(const MouseEvent& rMEvt, BOOL bQuickDrag) +{ + SdrPageView* pPV = pView->GetPageViewPvNum(0); + if( pTextObj && pTextObj->GetPage() == pPV->GetPage() ) + { + pView->SetCurrentObj(OBJ_TEXT); + + if( bPermanent ) + { + pView->SetCurrentObj(OBJ_TEXT); + pView->SetEditMode(SDREDITMODE_CREATE); + } + else + pView->SetEditMode(SDREDITMODE_EDIT); + + BOOL bEmptyOutliner = FALSE; + + if (!pTextObj->GetOutlinerParaObject() && pView->GetTextEditOutliner()) + { + Outliner* pOutl = pView->GetTextEditOutliner(); + ULONG nParaAnz = pOutl->GetParagraphCount(); + Paragraph* p1stPara = pOutl->GetParagraph( 0 ); + + if (nParaAnz==1 && p1stPara) + { + // Bei nur einem Pararaph + if (pOutl->GetText(p1stPara).Len() == 0) + { + bEmptyOutliner = TRUE; + } + } + } + + if (pTextObj != pView->GetTextEditObject() || bEmptyOutliner) + { + UINT32 nInv = pTextObj->GetObjInventor(); + UINT16 nSdrObjKind = pTextObj->GetObjIdentifier(); + + if (nInv == SdrInventor && pTextObj->HasTextEdit() && + (nSdrObjKind == OBJ_TEXT || + nSdrObjKind == OBJ_TITLETEXT || + nSdrObjKind == OBJ_OUTLINETEXT || + (pTextObj->ISA(SdrTextObj) && !pTextObj->IsEmptyPresObj()))) + { + // Neuen Outliner machen (gehoert der SdrObjEditView) + SdrOutliner* pOutl = SdrMakeOutliner( OUTLINERMODE_OUTLINEOBJECT, pDoc ); + pOutl->SetMinDepth(0); + pOutl->SetStyleSheetPool((SfxStyleSheetPool*) pDoc->GetStyleSheetPool()); + pOutl->SetCalcFieldValueHdl(LINK(SFX_APP(), SdModule, CalcFieldValueHdl)); + ULONG nCntrl = pOutl->GetControlWord(); + nCntrl |= EE_CNTRL_ALLOWBIGOBJS; + nCntrl |= EE_CNTRL_URLSFXEXECUTE; + nCntrl |= EE_CNTRL_MARKFIELDS; + nCntrl |= EE_CNTRL_AUTOCORRECT; + SetSpellOptions( nCntrl ); + + pOutl->SetControlWord(nCntrl); + + uno::Reference< linguistic::XSpellChecker1 > xSpellChecker( SvxGetSpellChecker() ); + if ( xSpellChecker.is() ) + pOutl->SetSpeller(xSpellChecker); + + uno::Reference< linguistic::XHyphenator > xHyphenator( OFF_APP()->GetHyphenator() ); + if( xHyphenator.is() ) + pOutl->SetHyphenator( xHyphenator ); + + pOutl->SetDefaultLanguage( pDoc->GetLanguage() ); + + // in einem Gliederungstext darf nicht auf die 0-te + // Ebene ausgerueckt werden + if (pTextObj->GetObjInventor() == SdrInventor && + pTextObj->GetObjIdentifier() == OBJ_OUTLINETEXT) + { + pOutl->SetMinDepth(1); + } + + if (bEmptyOutliner) + { + pView->EndTextEdit(TRUE); + } + + FASTBOOL bNewObj = TRUE; + if (pView->BegTextEdit(pTextObj, pPV, pWindow, bNewObj, pOutl) && + pTextObj->GetObjInventor() == SdrInventor) + { + bFirstObjCreated = TRUE; + DeleteDefaultText(); + + OutlinerView* pOLV = pView->GetTextEditOutlinerView(); + + UINT16 nSdrObjKind = pTextObj->GetObjIdentifier(); + + SdrViewEvent aVEvt; + SdrHitKind eHit = pView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + + if (eHit == SDRHIT_TEXTEDIT) + { + // Text getroffen + if (nSdrObjKind == OBJ_TEXT || + nSdrObjKind == OBJ_TITLETEXT || + nSdrObjKind == OBJ_OUTLINETEXT || + nSlotId == SID_TEXTEDIT || + !bQuickDrag) + { + pOLV->MouseButtonDown(rMEvt); + pOLV->MouseMove(rMEvt); + pOLV->MouseButtonUp(rMEvt); + } + + if (pViewShell->GetFrameView()->IsQuickEdit() && + bQuickDrag && pTextObj->GetOutlinerParaObject()) + { + pOLV->MouseButtonDown(rMEvt); + } + } + } + else + { + RestoreDefaultText(); + } + } + } + } + else + pTextObj = NULL; +} + +/************************************************************************* +|* +|* Texteingabe wird beendet, ggf. Default-Text setzen +|* +\************************************************************************/ + +BOOL FuText::RestoreDefaultText() +{ + BOOL bRestored = FALSE; + + if ( pTextObj && !pTextObj->HasText() && (pTextObj == pView->GetTextEditObject()) ) + { + SdPage* pPage = (SdPage*) pTextObj->GetPage(); + + if (pPage) + { + PresObjKind ePresObjKind = pPage->GetPresObjKind(pTextObj); + + if (ePresObjKind == PRESOBJ_TITLE || + ePresObjKind == PRESOBJ_OUTLINE || + ePresObjKind == PRESOBJ_NOTES || + ePresObjKind == PRESOBJ_TEXT) + { + String aString = pPage->GetPresObjText(ePresObjKind); + + if (aString.Len()) + { + SdOutliner* pInternalOutl = pDoc->GetInternalOutliner(); + pInternalOutl->SetMinDepth(0); + pPage->SetObjText( pTextObj, pInternalOutl, ePresObjKind, aString ); + + SdrOutliner* pOutliner = pView->GetTextEditOutliner(); + pTextObj->SetTextEditOutliner( NULL ); // to make stylesheet settings work + pTextObj->NbcSetStyleSheet( pPage->GetStyleSheetForPresObj(ePresObjKind), TRUE ); + pTextObj->SetTextEditOutliner( pOutliner ); + + pInternalOutl->Clear(); + OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject(); + + if (pOutliner) + pOutliner->SetText(*pParaObj); + + pTextObj->SetEmptyPresObj(TRUE); + bRestored = TRUE; + } + } + } + } + + return(bRestored); +} + +/************************************************************************* +|* +|* Texteingabe wird gestartet, ggf. Default-Text loeschen +|* +\************************************************************************/ + +BOOL FuText::DeleteDefaultText() +{ + BOOL bDeleted = FALSE; + + if ( pTextObj && pTextObj->IsEmptyPresObj() ) + { + String aString; + SdPage* pPage = (SdPage*) pTextObj->GetPage(); + + if (pPage) + { + PresObjKind ePresObjKind = pPage->GetPresObjKind(pTextObj); + + if ( (ePresObjKind == PRESOBJ_TITLE || + ePresObjKind == PRESOBJ_OUTLINE || + ePresObjKind == PRESOBJ_NOTES || + ePresObjKind == PRESOBJ_TEXT) && + !pPage->IsMasterPage() ) + { + Outliner* pOutliner = pView->GetTextEditOutliner(); + SfxStyleSheet* pSheet = pOutliner->GetStyleSheet( 0 ); + pOutliner->SetText( String(), pOutliner->GetParagraph( 0 ) ); + + if (pSheet && + (ePresObjKind == PRESOBJ_NOTES || ePresObjKind == PRESOBJ_TEXT)) + pOutliner->SetStyleSheet(0, pSheet); + + pTextObj->SetEmptyPresObj(TRUE); + bDeleted = TRUE; + } + } + } + + return(bDeleted); +} + +/************************************************************************* +|* +|* Objekt wurde veraendert +|* +\************************************************************************/ + +void FuText::ObjectChanged() +{ + if (pTextObj) + pTextObj->SetEmptyPresObj(FALSE); +} + +/************************************************************************* +|* +|* Command-event +|* +\************************************************************************/ + +BOOL FuText::Command(const CommandEvent& rCEvt) +{ + return( FuPoor::Command(rCEvt) ); +} + +/************************************************************************* +|* +|* Help-event +|* +\************************************************************************/ + +BOOL FuText::RequestHelp(const HelpEvent& rHEvt) +{ + BOOL bReturn = FALSE; + + OutlinerView* pOLV = pView->GetTextEditOutlinerView(); + + if ((Help::IsBalloonHelpEnabled() || Help::IsQuickHelpEnabled()) && + pTextObj && pOLV && pOLV->GetFieldUnderMousePointer()) + { + String aHelpText; + const SvxFieldItem* pFieldItem = pOLV->GetFieldUnderMousePointer(); + const SvxFieldData* pField = pFieldItem->GetField(); + + if (pField && pField->ISA(SvxURLField)) + { + /****************************************************************** + * URL-Field + ******************************************************************/ + aHelpText = ((const SvxURLField*) pField)->GetURL(); + } + + if (aHelpText.Len()) + { + Rectangle aLogicPix = pWindow->LogicToPixel(pTextObj->GetLogicRect()); + Rectangle aScreenRect(pWindow->OutputToScreenPixel(aLogicPix.TopLeft()), + pWindow->OutputToScreenPixel(aLogicPix.BottomRight())); + +#ifdef OS2 + aScreenRect = Rectangle(rHEvt.GetMousePosPixel(), Size(5, 5)); +#endif + + if (Help::IsBalloonHelpEnabled()) + { + bReturn = Help::ShowBalloon( (Window*)pWindow, rHEvt.GetMousePosPixel(), aScreenRect, aHelpText); + } + else if (Help::IsQuickHelpEnabled()) + { + bReturn = Help::ShowQuickHelp( (Window*)pWindow, aScreenRect, aHelpText); + } + } + } + + if (!bReturn) + { + bReturn = FuConstruct::RequestHelp(rHEvt); + } + + return(bReturn); +} + +/************************************************************************* +|* +|* Request verarbeiten +|* +\************************************************************************/ + +void FuText::ReceiveRequest(SfxRequest& rReq) +{ + nSlotId = rReq.GetSlot(); + + // Dann Basisklasse rufen (dort wird u.a. nSlotId NICHT gesetzt) + FuPoor::ReceiveRequest(rReq); + + SdrViewEvent aVEvt; + + if (nSlotId == SID_TEXTEDIT || pViewShell->GetFrameView()->IsQuickEdit()) + { + MouseEvent aMEvt(pWindow->GetPointerPosPixel()); + + pTextObj = NULL; + + if (nSlotId == SID_TEXTEDIT) + { + // Wird gerade editiert? + if(!bTestText) + pTextObj = (SdrTextObj*) pView->GetTextEditObject(); + + if (!pTextObj) + { + // Versuchen, ein Obj zu selektieren + SdrPageView* pPV = pView->GetPageViewPvNum(0); + SdrViewEvent aVEvt; + SdrHitKind eHit = pView->PickAnything(aMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + pView->MarkObj(aVEvt.pRootObj, pPV); + + if (aVEvt.pObj && aVEvt.pObj->ISA(SdrTextObj)) + { + pTextObj = (SdrTextObj*) aVEvt.pObj; + } + } + } + else if (pView->HasMarkedObj()) + { + const SdrMarkList& rMarkList = pView->GetMarkList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetObj(); + + if (pObj->ISA(SdrTextObj)) + { + pTextObj = (SdrTextObj*) pObj; + } + } + } + + BOOL bQuickDrag = TRUE; + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if (pArgs && + (UINT16) ((SfxUInt16Item&) pArgs->Get(SID_TEXTEDIT)).GetValue() == 2) + { + // Anwahl per Doppelklick -> kein QuickDrag zulassen + bQuickDrag = FALSE; + } + + SetInEditMode(aMEvt, bQuickDrag); + } +} + + + +/************************************************************************* +|* +|* SpellChecker: Error-LinkHdl +|* +\************************************************************************/ + +IMPL_LINK( FuText, SpellError, void *, nLang ) +{ + String aError( ::GetLanguageString( (LanguageType)(ULONG)nLang ) ); + ErrorHandler::HandleError(* new StringErrorInfo( + ERRCODE_SVX_LINGU_LANGUAGENOTEXISTS, aError) ); + return 0; +} + + +/************************************************************************* +|* +|* Reaktion auf Doppelklick +|* +\************************************************************************/ +void FuText::DoubleClick(const MouseEvent& rMEvt) +{ + // Nichts zu tun +} + + + |