diff options
Diffstat (limited to 'sd/source/ui/func/futext.cxx')
-rwxr-xr-x | sd/source/ui/func/futext.cxx | 1550 |
1 files changed, 1550 insertions, 0 deletions
diff --git a/sd/source/ui/func/futext.cxx b/sd/source/ui/func/futext.cxx new file mode 100755 index 000000000000..2f3111665692 --- /dev/null +++ b/sd/source/ui/func/futext.cxx @@ -0,0 +1,1550 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sd.hxx" + + +#include "futext.hxx" +#include <editeng/eeitem.hxx> +#include <editeng/editerr.hxx> +#include <svx/dlgutil.hxx> +#include <svx/svxerr.hxx> +#include <tools/urlobj.hxx> +#include <vcl/help.hxx> +#include <editeng/editstat.hxx> +#include <svl/aeitem.hxx> +#include <svl/intitem.hxx> +#include <svx/svdotext.hxx> +#include <svx/svdogrp.hxx> +#include <editeng/flditem.hxx> +#include <svl/style.hxx> +#include <svx/svdpagv.hxx> +#include <sfx2/viewfrm.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/request.hxx> +#include <editeng/editeng.hxx> +#include <svx/svdoutl.hxx> +#include <svx/svxids.hrc> +#include <sfx2/docfile.hxx> +#include <comphelper/processfactory.hxx> +#include <editeng/outlobj.hxx> +#include <svtools/langtab.hxx> + +// #104122# +#include <editeng/frmdiritem.hxx> + +#include <svx/svdetc.hxx> +#include <editeng/editview.hxx> + +#include "sdresid.hxx" +#include "app.hrc" +#include "res_bmp.hrc" +#include "ViewShell.hxx" +#include "ViewShellBase.hxx" +#include "View.hxx" +#include "Outliner.hxx" +#include "Window.hxx" +#include "drawdoc.hxx" +#include "sdpage.hxx" +#include "sdmod.hxx" +#include "FrameView.hxx" +#include "ToolBarManager.hxx" +#include "DrawDocShell.hxx" +#include "glob.hrc" +#include "pres.hxx" +#include "optsitem.hxx" + +using ::rtl::OUString; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::linguistic2; + +namespace sd { + +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 + SID_CHARMAP, // 10503 + SID_TEXTDIRECTION_LEFT_TO_RIGHT, // 10907 + SID_TEXTDIRECTION_TOP_TO_BOTTOM, // 10908 + SID_ATTR_PARA_LEFT_TO_RIGHT, // 10950 + SID_ATTR_PARA_RIGHT_TO_LEFT, // 10951 + FN_NUM_BULLET_ON, // 20138 + SID_PARASPACE_INCREASE, // 27346 + SID_PARASPACE_DECREASE, // 27347 + 0 }; + +TYPEINIT1( FuText, FuConstruct ); + + +static BOOL bTestText = 0; + +/************************************************************************* +|* +|* Basisklasse fuer Textfunktionen +|* +\************************************************************************/ + +FuText::FuText( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +: FuConstruct(pViewSh, pWin, pView, pDoc, rReq) +, bFirstObjCreated(FALSE) +, rRequest (rReq) +{ +} + +FunctionReference FuText::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + FunctionReference xFunc( new FuText( pViewSh, pWin, pView, pDoc, rReq ) ); + return xFunc; +} + +/************************************************************************* +|* +|* Destruktor +|* +\************************************************************************/ + +void FuText::disposing() +{ + if(mpView) + { + if(mpView->SdrEndTextEdit(FALSE) == SDRENDTEXTEDIT_DELETED) + mxTextObj.reset( 0 ); + + // die RequestHandler der benutzten Outliner zuruecksetzen auf den + // Handler am Dokument + ::Outliner* pOutliner = mpView->GetTextEditOutliner(); + + if (pOutliner) + pOutliner->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(mpDoc->GetStyleSheetPool())); + } +} + +/************************************************************************* +|* +|* 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( SfxRequest& ) +{ + mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBarShell( + ToolBarManager::TBG_FUNCTION, + RID_DRAW_TEXT_TOOLBOX); + + mpView->SetCurrentObj(OBJ_TEXT); + mpView->SetEditMode(SDREDITMODE_EDIT); + + MouseEvent aMEvt(mpWindow->GetPointerPosPixel()); + + if (nSlotId == SID_TEXTEDIT) + { + // Try to select an object + SdrPageView* pPV = mpView->GetSdrPageView(); + SdrViewEvent aVEvt; + mpView->PickAnything(aMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + mpView->MarkObj(aVEvt.pRootObj, pPV); + + mxTextObj.reset( dynamic_cast< SdrTextObj* >( aVEvt.pObj ) ); + } + else if (mpView->AreObjectsMarked()) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + mxTextObj.reset( dynamic_cast< SdrTextObj* >( pObj ) ); + } + } + + // check for table + if (mpView->AreObjectsMarked()) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + if( pObj && (pObj->GetObjInventor() == SdrInventor ) && (pObj->GetObjIdentifier() == OBJ_TABLE) ) + { + mpViewShell->GetViewShellBase().GetToolBarManager()->AddToolBarShell( ToolBarManager::TBG_FUNCTION, RID_DRAW_TABLE_TOOLBOX ); + } + } + } + + BOOL bQuickDrag = TRUE; + + const SfxItemSet* pArgs = rRequest.GetArgs(); + + if (pArgs + + // #98198# test for type before using + && SID_TEXTEDIT == nSlotId + && SFX_ITEM_SET == pArgs->GetItemState(SID_TEXTEDIT) + + && (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); + + /* af: (de)Select object before showing the context menu. + // Fuer PopupMenu (vorher DrawViewShell) + if ((rMEvt.GetButtons() == MOUSE_RIGHT) && rMEvt.GetClicks() == 1 && + mpView->IsTextEdit()) + { + return (TRUE); + } + */ + + mpView->SetMarkHdlWhenTextEdit(TRUE); + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + + if (eHit == SDRHIT_TEXTEDIT) + { + // Text getroffen -> Event von SdrView auswerten lassen + if (mpView->MouseButtonDown(rMEvt, mpWindow)) + return (TRUE); + } + + if (rMEvt.GetClicks() == 1) + { + if (mpView->IsTextEdit() && eHit != SDRHIT_MARKEDOBJECT && eHit != SDRHIT_HANDLE) + { + // Texteingabe beenden + if(mpView->SdrEndTextEdit() == 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 SdrEndTextEdit 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 SdrEndTextEdit noch einmal eHit ermittelt, + // was dann SDRHIT_NONE liefert. + mxTextObj.reset( NULL ); + eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + } + + mpView->SetCurrentObj(OBJ_TEXT); + mpView->SetEditMode(SDREDITMODE_EDIT); + } + + if (rMEvt.IsLeft() || rMEvt.IsRight()) + { + mpWindow->CaptureMouse(); + SdrObject* pObj; + SdrPageView* pPV = mpView->GetSdrPageView(); + + if (eHit == SDRHIT_TEXTEDIT) + { + SetInEditMode(rMEvt, FALSE); + } + else + { + BOOL bMacro = FALSE; + + if (bMacro && mpView->PickObj(aMDPos,mpView->getHitTolLog(),pObj,pPV,SDRSEARCH_PICKMACRO)) + { + // Makro + USHORT nHitLog = USHORT ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + mpView->BegMacroObj(aMDPos,nHitLog,pObj,pPV,mpWindow); + } + else + { + if (eHit != SDRHIT_HANDLE) + { + // Selektion aufheben + if (!rMEvt.IsShift() && eHit == SDRHIT_TEXTEDITOBJ) + { + mpView->UnmarkAll(); + mpView->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 + ******************************************************/ + mpView->MarkObj(aVEvt.pRootObj, pPV); + + if (aVEvt.pObj && aVEvt.pObj->ISA(SdrTextObj)) + { + mxTextObj.reset( static_cast<SdrTextObj*>(aVEvt.pObj) ); + } + + SetInEditMode(rMEvt, TRUE); + } + else if (aVEvt.eEvent == SDREVENT_EXECUTEURL && !rMEvt.IsMod2()) + { + /****************************************************** + * URL ausfuehren + ******************************************************/ + mpWindow->ReleaseMouse(); + SfxStringItem aStrItem(SID_FILE_NAME, aVEvt.pURLField->GetURL()); + SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName()); + SfxBoolItem aBrowseItem( SID_BROWSE, TRUE ); + SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); + mpWindow->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 + ******************************************************/ + + // #i78748# + // do the EndTextEdit first, it will delete the handles and force a + // recreation. This will make aVEvt.pHdl to point to a deleted handle, + // thus it is necessary to reset it and to get it again. + + // #i112855# + // cl: I'm not sure why we checked here also for mxTextObj->GetOutlinerParaObjet + // this caused SdrEndTextEdit() to be called also when not in text editing and + // this does not make sense and caused troubles. (see issue 112855) + +// ::Outliner* pOutl = mpView->GetTextEditOutliner(); +// +// if (mxTextObj.is() && (mxTextObj->GetOutlinerParaObject() || +// (pOutl && pOutl->GetText(pOutl->GetParagraph( 0 )).Len() != 0))) + if( mpView->IsTextEdit() ) + { + mpView->SdrEndTextEdit(); + + if(aVEvt.pHdl) + { + // force new handle identification, the pointer will be dead here + // since SdrEndTextEdit has resetted (deleted) the handles. + aVEvt.pHdl = 0; + mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + } + } + + if (!aVEvt.pHdl) + { + if( eHit == SDRHIT_UNMARKEDOBJECT ) + { + if ( !rMEvt.IsShift() ) + mpView->UnmarkAll(); + + mpView->MarkObj(aVEvt.pRootObj, pPV); + } + + // Objekt draggen + bFirstMouseMove = TRUE; + aDragTimer.Start(); + } + + + if ( ! rMEvt.IsRight()) + { + // we need to pick again since SdrEndTextEdit can rebuild the handles list + eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + if( (eHit == SDRHIT_HANDLE) || (eHit == SDRHIT_MARKEDOBJECT) ) + { + USHORT nDrgLog = USHORT ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); + mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog); + } + } + bReturn = true; + } + } + else if ( nSlotId != SID_TEXTEDIT && + (bPermanent || !bFirstObjCreated) ) + { + /********************************************************** + * Objekt erzeugen + **********************************************************/ + mpView->SetCurrentObj(OBJ_TEXT); + mpView->SetEditMode(SDREDITMODE_CREATE); + USHORT nDrgLog = USHORT ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); + mpView->BegCreateObj(aMDPos, (OutputDevice*) NULL, nDrgLog); + } + else + { + /********************************************************** + * Selektieren + **********************************************************/ + if( !rMEvt.IsShift() ) + mpView->UnmarkAll(); + + mpView->BegMarkObj( aMDPos ); + } + } + } + } + } + else if ( rMEvt.GetClicks() == 2 && !mpView->IsTextEdit() ) + { + MouseEvent aMEvt( mpWindow->GetPointerPosPixel() ); + SetInEditMode( aMEvt, FALSE ); + } + + if (!bIsInDragMode) + { + ForcePointer(&rMEvt); + mpViewShell->GetViewFrame()->GetBindings().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 && mpView->IsAction() && !mpDocSh->IsReadOnly()) + { + Point aPix(rMEvt.GetPosPixel()); + Point aPnt(mpWindow->PixelToLogic(aPix)); + + ForceScroll(aPix); + mpView->MovAction(aPnt); + } + + ForcePointer(&rMEvt); + + return (bReturn); +} + +/************************************************************************* +|* +|* MouseButtonUp-event +|* +\************************************************************************/ + +// #97016# +void FuText::ImpSetAttributesForNewTextObject(SdrTextObj* pTxtObj) +{ + if(mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) + { + if( nSlotId == SID_ATTR_CHAR ) + { + // 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(mpViewShell->GetPool()); + aSet.Put(SdrTextMinFrameHeightItem(0)); + aSet.Put(SdrTextAutoGrowWidthItem(FALSE)); + aSet.Put(SdrTextAutoGrowHeightItem(TRUE)); + pTxtObj->SetMergedItemSet(aSet); + pTxtObj->AdjustTextFrameWidthAndHeight(); + aSet.Put(SdrTextMaxFrameHeightItem(pTxtObj->GetLogicRect().GetSize().Height())); + pTxtObj->SetMergedItemSet(aSet); + } + else if( nSlotId == SID_ATTR_CHAR_VERTICAL ) + { + SfxItemSet aSet(mpViewShell->GetPool()); + aSet.Put(SdrTextMinFrameWidthItem(0)); + aSet.Put(SdrTextAutoGrowWidthItem(TRUE)); + aSet.Put(SdrTextAutoGrowHeightItem(FALSE)); + + // #91853# Needs to be set since default is SDRTEXTHORZADJUST_BLOCK + aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); + pTxtObj->SetMergedItemSet(aSet); + pTxtObj->AdjustTextFrameWidthAndHeight(); + aSet.Put(SdrTextMaxFrameWidthItem(pTxtObj->GetLogicRect().GetSize().Width())); + pTxtObj->SetMergedItemSet(aSet); + } + } + else + { + if( nSlotId == SID_ATTR_CHAR_VERTICAL ) + { + // draw text object, needs to be initialized when vertical text is used + SfxItemSet aSet(mpViewShell->GetPool()); + + // #91510# + aSet.Put(SdrTextAutoGrowWidthItem(TRUE)); + aSet.Put(SdrTextAutoGrowHeightItem(FALSE)); + + // #91508# + //aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP)); + //aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); + + // #107235# + // Set defaults for vertical klick-n'drag text object, pool defaults are: + // SdrTextVertAdjustItem: SDRTEXTVERTADJUST_TOP + // SdrTextHorzAdjustItem: SDRTEXTHORZADJUST_BLOCK + // Analog to that (thus, #91508# was not completely correct): + aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BLOCK)); + aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); + + pTxtObj->SetMergedItemSet(aSet); + } + } +} + +// #97016# +void FuText::ImpSetAttributesFitToSize(SdrTextObj* pTxtObj) +{ + // FitToSize (An Rahmen anpassen) + SfxItemSet aSet(mpViewShell->GetPool(), SDRATTR_TEXT_AUTOGROWHEIGHT, SDRATTR_TEXT_AUTOGROWWIDTH); + SdrFitToSizeType eFTS = SDRTEXTFIT_PROPORTIONAL; + aSet.Put(SdrTextFitToSizeTypeItem(eFTS)); + aSet.Put(SdrTextAutoGrowHeightItem(FALSE)); + aSet.Put(SdrTextAutoGrowWidthItem(FALSE)); + pTxtObj->SetMergedItemSet(aSet); + pTxtObj->AdjustTextFrameWidthAndHeight(); +} + +// #97016# +void FuText::ImpSetAttributesFitToSizeVertical(SdrTextObj* pTxtObj) +{ + SfxItemSet aSet(mpViewShell->GetPool(), + SDRATTR_TEXT_AUTOGROWHEIGHT, SDRATTR_TEXT_AUTOGROWWIDTH); + SdrFitToSizeType eFTS = SDRTEXTFIT_PROPORTIONAL; + aSet.Put(SdrTextFitToSizeTypeItem(eFTS)); + aSet.Put(SdrTextAutoGrowHeightItem(FALSE)); + aSet.Put(SdrTextAutoGrowWidthItem(FALSE)); + pTxtObj->SetMergedItemSet(aSet); + pTxtObj->AdjustTextFrameWidthAndHeight(); +} + +// #97016# +void FuText::ImpSetAttributesFitCommon(SdrTextObj* pTxtObj) +{ + // Normales Textobjekt + if (mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) + { + if( nSlotId == SID_ATTR_CHAR ) + { + // Impress-Textobjekt (faellt auf Zeilenhoehe zusammen) + SfxItemSet aSet(mpViewShell->GetPool()); + aSet.Put(SdrTextMinFrameHeightItem(0)); + aSet.Put(SdrTextMaxFrameHeightItem(0)); + aSet.Put(SdrTextAutoGrowHeightItem(TRUE)); + aSet.Put(SdrTextAutoGrowWidthItem(FALSE)); + pTxtObj->SetMergedItemSet(aSet); + } + else if( nSlotId == SID_ATTR_CHAR_VERTICAL ) + { + SfxItemSet aSet(mpViewShell->GetPool()); + aSet.Put(SdrTextMinFrameWidthItem(0)); + aSet.Put(SdrTextMaxFrameWidthItem(0)); + aSet.Put(SdrTextAutoGrowWidthItem(TRUE)); + aSet.Put(SdrTextAutoGrowHeightItem(FALSE)); + pTxtObj->SetMergedItemSet(aSet); + } + + pTxtObj->AdjustTextFrameWidthAndHeight(); + } +} + +BOOL FuText::MouseButtonUp(const MouseEvent& rMEvt) +{ + BOOL bReturn = FALSE; + + if (aDragTimer.IsActive()) + { + aDragTimer.Stop(); + bIsInDragMode = FALSE; + } + + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray ); + + Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + + if( (mpView && mpView->MouseButtonUp(rMEvt, mpWindow)) || rMEvt.GetClicks() == 2 ) + return (TRUE); // Event von der SdrView ausgewertet + + BOOL bEmptyTextObj = FALSE; + + if (mxTextObj.is()) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1 + && ( rMarkList.GetMark(0)->GetMarkedSdrObj() == mxTextObj.get()) ) + { + if( mxTextObj.is() && !GetTextObj()->GetOutlinerParaObject() ) + bEmptyTextObj = TRUE; + else + bFirstObjCreated = TRUE; + } + else + { + mxTextObj.reset( 0 ); + } + } + + if( mpView && mpView->IsDragObj()) + { + /********************************************************************** + * Objekt wurde verschoben + **********************************************************************/ + FrameView* pFrameView = mpViewShell->GetFrameView(); + BOOL bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); + + if (bDragWithCopy) + { + bDragWithCopy = !mpView->IsPresObjSelected(FALSE, TRUE); + } + + mpView->SetDragWithCopy(bDragWithCopy); + mpView->EndDragObj( mpView->IsDragWithCopy() ); + mpView->ForceMarkedToAnotherPage(); + mpView->SetCurrentObj(OBJ_TEXT); + } + else if( mpView && mpView->IsCreateObj() && rMEvt.IsLeft()) + { + /********************************************************************** + * Objekt wurde erzeugt + **********************************************************************/ + mxTextObj.reset( dynamic_cast< SdrTextObj* >( mpView->GetCreateObj() ) ); + + if( mxTextObj.is() ) + { + //AW outliner needs to be set to vertical when there is no + // outliner object up to now; also it needs to be set back to not + // vertical when there was a vertical one used last time. + OutlinerParaObject* pOPO = GetTextObj()->GetOutlinerParaObject(); + SdrOutliner& rOutl = mxTextObj->GetModel()->GetDrawOutliner(GetTextObj()); + BOOL bVertical((pOPO && pOPO->IsVertical()) + || nSlotId == SID_ATTR_CHAR_VERTICAL + || nSlotId == SID_TEXT_FITTOSIZE_VERTICAL); + rOutl.SetVertical(bVertical); + + // #107235# + // Before ImpSetAttributesForNewTextObject the vertical writing mode + // needs to be set at the object. This is done here at the OutlinerParaObject + // directly to not mirror the layout text items involved. These items will be set + // from ImpSetAttributesForNewTextObject and below. + OutlinerParaObject* pPara = GetTextObj()->GetOutlinerParaObject(); + + if(!pPara) + { + GetTextObj()->ForceOutlinerParaObject(); + pPara = GetTextObj()->GetOutlinerParaObject(); + } + + if(pPara && (bool)bVertical != pPara->IsVertical()) + { + // set ParaObject orientation accordingly + pPara->SetVertical(bVertical); + } + + // #97016# + ImpSetAttributesForNewTextObject(GetTextObj()); + } + + if (!mpView->EndCreateObj(SDRCREATE_FORCEEND)) + { + // Textobjekt konnte nicht erzeugt werden + mxTextObj.reset(0); + } + else if (nSlotId == SID_TEXT_FITTOSIZE) + { + // #97016# + ImpSetAttributesFitToSize(GetTextObj()); + + SetInEditMode(rMEvt, FALSE); + } + else if ( nSlotId == SID_TEXT_FITTOSIZE_VERTICAL ) + { + // #97016# + ImpSetAttributesFitToSizeVertical(GetTextObj()); + + SetInEditMode(rMEvt, FALSE); + } + else + { + // #97016# + ImpSetAttributesFitCommon(GetTextObj()); + + // Damit die Handles und der graue Rahmen stimmen + mpView->AdjustMarkHdl(); + mpView->PickHandle(aPnt); + SetInEditMode(rMEvt, FALSE); + } + } + else if ( mpView && mpView->IsAction()) + { + mpView->EndAction(); + } + + ForcePointer(&rMEvt); + mpWindow->ReleaseMouse(); + USHORT nDrgLog1 = USHORT ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); + + if ( mpView && !mpView->AreObjectsMarked() && + Abs(aMDPos.X() - aPnt.X()) < nDrgLog1 && + Abs(aMDPos.Y() - aPnt.Y()) < nDrgLog1 && + !rMEvt.IsShift() && !rMEvt.IsMod2() ) + { + SdrPageView* pPV = mpView->GetSdrPageView(); + SdrViewEvent aVEvt; + mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + mpView->MarkObj(aVEvt.pRootObj, pPV); + } + + if ( !mxTextObj.is() && mpView ) + { + if ( ( (!bEmptyTextObj && bPermanent) || + (!bFirstObjCreated && !bPermanent) ) && + !mpDocSh->IsReadOnly() && + nSlotId != SID_TEXTEDIT ) + { + /********************************************************************** + * Mengentext (linksbuendiges AutoGrow) + **********************************************************************/ + mpView->SetCurrentObj(OBJ_TEXT); + mpView->SetEditMode(SDREDITMODE_CREATE); + USHORT nDrgLog = USHORT ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); + mpView->BegCreateObj(aMDPos, (OutputDevice*) NULL, nDrgLog); + + BOOL bSnapEnabled = mpView->IsSnapEnabled(); + + if (bSnapEnabled) + mpView->SetSnapEnabled(FALSE); + + aPnt.X() += nDrgLog + nDrgLog; + aPnt.Y() += nDrgLog + nDrgLog; + mpView->MovAction(aPnt); + + mxTextObj.reset( dynamic_cast< SdrTextObj* >( mpView->GetCreateObj() ) ); + + if(mxTextObj.is()) + { + GetTextObj()->SetDisableAutoWidthOnDragging(TRUE); + } + + if(!mpView->EndCreateObj(SDRCREATE_FORCEEND)) + { + mxTextObj.reset(0); + } + + if(bSnapEnabled) + mpView->SetSnapEnabled(bSnapEnabled); + + if(mxTextObj.is()) + { + SfxItemSet aSet(mpViewShell->GetPool()); + aSet.Put(SdrTextMinFrameHeightItem(0)); + aSet.Put(SdrTextMinFrameWidthItem(0)); + aSet.Put(SdrTextAutoGrowHeightItem(TRUE)); + aSet.Put(SdrTextAutoGrowWidthItem(TRUE)); + + // #91508# + if(nSlotId == SID_ATTR_CHAR_VERTICAL) + { + // #107235# + // + // Here, all items which need to be different from pool default need to be set + // again on the newly created text object. + // Since this is a simple klick text object, it is first created, then SetVertical() + // is used, then ImpSetAttributesForNewTextObject is called and then the object is + // deleted again since not the minimum drag distance was travelled. Then, a new + // klick text object is created and thus all that stuff needs to be set again here. + // + // Before using the new object the vertical writing mode + // needs to be set. This is done here at the OutlinerParaObject + // directly to not mirror the layout text items involved. These items will be set + // below. + OutlinerParaObject* pPara = GetTextObj()->GetOutlinerParaObject(); + + if(!pPara) + { + GetTextObj()->ForceOutlinerParaObject(); + pPara = GetTextObj()->GetOutlinerParaObject(); + } + + if(pPara && sal_True != pPara->IsVertical()) + { + // set ParaObject orientation accordingly + pPara->SetVertical(sal_True); + } + + // #91508# + // aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP)); + aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); + + // #107235# + // Analog to the else case below, for vertical simple click texts + // one of the defaulted setted items from ImpSetAttributesForNewTextObject + // needs to be adapted to non-block mode. This could have been done with the + // #104122#, but was obviously overseen. + const SfxItemSet& rSet = mpView->GetDefaultAttr(); + SvxFrameDirection eDirection = (SvxFrameDirection)((SvxFrameDirectionItem&)rSet.Get(EE_PARA_WRITINGDIR)).GetValue(); + + if(FRMDIR_HORI_RIGHT_TOP == eDirection || FRMDIR_VERT_TOP_RIGHT == eDirection) + { + aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BOTTOM)); + } + else + { + aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP)); + } + } + else + { + // #104122# This is for Format/Page settings. Since this also leads + // to the object defaults to be changed, i think this code can be + // removed. CL. wanted to take a look before adding this. + //const SdrTextHorzAdjust eHA = ( ( pDoc && pDoc->GetDefaultWritingMode() == ::com::sun::star::text::WritingMode_RL_TB ) ? + // SDRTEXTHORZADJUST_RIGHT : SDRTEXTHORZADJUST_LEFT ); + //aSet.Put( SdrTextHorzAdjustItem( eHA ) ); + + // #104122# Look in the object defaults if left-to-right is wanted. If + // yes, set text anchoring to right to let the box grow to left. + const SfxItemSet& rSet = mpView->GetDefaultAttr(); + SvxFrameDirection eDirection = (SvxFrameDirection)((SvxFrameDirectionItem&)rSet.Get(EE_PARA_WRITINGDIR)).GetValue(); + + if(FRMDIR_HORI_RIGHT_TOP == eDirection) + { + aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); + } + else + { + aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_LEFT)); + } + } + + GetTextObj()->SetMergedItemSet(aSet); + GetTextObj()->SetDisableAutoWidthOnDragging(TRUE); + SetInEditMode(rMEvt, FALSE); + } + + bFirstObjCreated = TRUE; + } + else + { + // In die Fkt. Selektion wechseln + if (mpView->SdrEndTextEdit() == SDRENDTEXTEDIT_DELETED) + { + mxTextObj.reset(0); + } + + mpViewShell->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; + mpView->SetMarkHdlWhenTextEdit(TRUE); + + KeyCode nCode = rKEvt.GetKeyCode(); + BOOL bShift = nCode.IsShift(); + + // #97016# IV + if(mxTextObj.is()) + { + // maybe object is deleted, test if it's equal to the selected object + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + SdrObject* pSelectedObj = 0L; + + if(1 == rMarkList.GetMarkCount()) + { + SdrMark* pMark = rMarkList.GetMark(0); + pSelectedObj = pMark->GetMarkedSdrObj(); + } + + if(mxTextObj.get() != pSelectedObj) + { + mxTextObj.reset(0); + } + } + + if ( mxTextObj.is() && mxTextObj->GetObjInventor() == SdrInventor && mxTextObj->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(), nCode.IsMod3() ); + KeyEvent aKEvt(rKEvt.GetCharCode(), aKeyCode); + + BOOL bOK = TRUE; + + if (mpDocSh->IsReadOnly()) + { + bOK = !EditEngine::DoesKeyChangeText(aKEvt); + } + if( aKeyCode.GetCode() == KEY_PAGEUP || aKeyCode.GetCode() == KEY_PAGEDOWN ) + { + bOK = FALSE; // default handling in base class + } + + if (bOK && mpView->KeyInput(aKEvt, mpWindow) ) + { + bReturn = TRUE; + + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray ); + +// if ( pTextObj ) +// pTextObj->SetEmptyPresObj(FALSE); + } + else if (aKeyCode == KEY_ESCAPE) + { + bReturn = cancel(); + } + + if( bPermanent ) + { + mpView->SetCurrentObj(OBJ_TEXT); + mpView->SetEditMode(SDREDITMODE_CREATE); + } + + if (!bReturn) + { + bReturn = FuDraw::KeyInput(aKEvt); + } + + return (bReturn); +} + + + +/************************************************************************* +|* +|* Function aktivieren +|* +\************************************************************************/ + +void FuText::Activate() +{ + mpView->SetQuickTextEditMode(mpViewShell->GetFrameView()->IsQuickEdit()); + + // #i89661# it's no longer necessary to make it so big here, it's fine tuned + // for text objects in SdrMarkView::CheckSingleSdrObjectHit + mpView->SetHitTolerancePixel( 2 * HITPIX ); + + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + if (pOLV) + pOLV->ShowCursor(); + + FuConstruct::Activate(); + + if( pOLV ) + mpView->SetEditMode(SDREDITMODE_EDIT); +} + + +/************************************************************************* +|* +|* Function deaktivieren +|* +\************************************************************************/ + +void FuText::Deactivate() +{ + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + if (pOLV) + pOLV->HideCursor(); + + mpView->SetHitTolerancePixel( HITPIX ); + + FuConstruct::Deactivate(); +} + + +/************************************************************************* +|* +|* Objekt in Edit-Mode setzen +|* +\************************************************************************/ + +void FuText::SetInEditMode(const MouseEvent& rMEvt, BOOL bQuickDrag) +{ + SdrPageView* pPV = mpView->GetSdrPageView(); + if( mxTextObj.is() && (mxTextObj->GetPage() == pPV->GetPage()) ) + { + mpView->SetCurrentObj(OBJ_TEXT); + + if( bPermanent ) + mpView->SetEditMode(SDREDITMODE_CREATE); + else + mpView->SetEditMode(SDREDITMODE_EDIT); + + BOOL bEmptyOutliner = FALSE; + + if (!GetTextObj()->GetOutlinerParaObject() && mpView->GetTextEditOutliner()) + { + ::Outliner* pOutl = mpView->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 (GetTextObj() != mpView->GetTextEditObject() || bEmptyOutliner) + { + UINT32 nInv = mxTextObj->GetObjInventor(); + UINT16 nSdrObjKind = mxTextObj->GetObjIdentifier(); + + if (nInv == SdrInventor && GetTextObj()->HasTextEdit() && + (nSdrObjKind == OBJ_TEXT || + nSdrObjKind == OBJ_TITLETEXT || + nSdrObjKind == OBJ_OUTLINETEXT || !mxTextObj->IsEmptyPresObj() ) ) + { + // Neuen Outliner machen (gehoert der SdrObjEditView) + SdrOutliner* pOutl = SdrMakeOutliner( OUTLINERMODE_OUTLINEOBJECT, mpDoc ); + + if (bEmptyOutliner) + mpView->SdrEndTextEdit(sal_True); + + SdrTextObj* pTextObj = GetTextObj(); + if( pTextObj ) + { + OutlinerParaObject* pOPO = pTextObj->GetOutlinerParaObject(); + if( ( pOPO && pOPO->IsVertical() ) || (nSlotId == SID_ATTR_CHAR_VERTICAL) || (nSlotId == SID_TEXT_FITTOSIZE_VERTICAL) ) + pOutl->SetVertical( TRUE ); + + if( pTextObj->getTextCount() > 1 ) + { + Point aPix(rMEvt.GetPosPixel()); + Point aPnt(mpWindow->PixelToLogic(aPix)); + pTextObj->setActiveText( pTextObj->CheckTextHit(aPnt ) ); + } + + if (mpView->SdrBeginTextEdit(pTextObj, pPV, mpWindow, sal_True, pOutl) && mxTextObj->GetObjInventor() == SdrInventor) + { + bFirstObjCreated = TRUE; + DeleteDefaultText(); + + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + nSdrObjKind = mxTextObj->GetObjIdentifier(); + + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + + if (eHit == SDRHIT_TEXTEDIT) + { + // Text getroffen + if (nSdrObjKind == OBJ_TEXT || + nSdrObjKind == OBJ_TITLETEXT || + nSdrObjKind == OBJ_OUTLINETEXT || + nSdrObjKind == OBJ_TABLE || + nSlotId == SID_TEXTEDIT || + !bQuickDrag) + { + pOLV->MouseButtonDown(rMEvt); + pOLV->MouseMove(rMEvt); + pOLV->MouseButtonUp(rMEvt); + } + + if (mpViewShell->GetFrameView()->IsQuickEdit() && bQuickDrag && GetTextObj()->GetOutlinerParaObject()) + { + pOLV->MouseButtonDown(rMEvt); + } + } + else + { + // #98198# Move cursor to end of text + ESelection aNewSelection(EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND, EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND); + pOLV->SetSelection(aNewSelection); + } + } + else + { + mpView->RestoreDefaultText(dynamic_cast< SdrTextObj* >( mxTextObj.get() )); + } + } + } + } + } + else + { + mxTextObj.reset(0); + } +} + +/************************************************************************* +|* +|* Texteingabe wird gestartet, ggf. Default-Text loeschen +|* +\************************************************************************/ + +BOOL FuText::DeleteDefaultText() +{ + BOOL bDeleted = FALSE; + + if ( mxTextObj.is() && mxTextObj->IsEmptyPresObj() ) + { + String aString; + SdPage* pPage = (SdPage*) mxTextObj->GetPage(); + + if (pPage) + { + PresObjKind ePresObjKind = pPage->GetPresObjKind(mxTextObj.get()); + + if ( (ePresObjKind == PRESOBJ_TITLE || + ePresObjKind == PRESOBJ_OUTLINE || + ePresObjKind == PRESOBJ_NOTES || + ePresObjKind == PRESOBJ_TEXT) && + !pPage->IsMasterPage() ) + { + ::Outliner* pOutliner = mpView->GetTextEditOutliner(); + SfxStyleSheet* pSheet = pOutliner->GetStyleSheet( 0 ); + BOOL bIsUndoEnabled = pOutliner->IsUndoEnabled(); + if( bIsUndoEnabled ) + pOutliner->EnableUndo(FALSE); + + pOutliner->SetText( String(), pOutliner->GetParagraph( 0 ) ); + + if( bIsUndoEnabled ) + pOutliner->EnableUndo(TRUE); + + if (pSheet && + (ePresObjKind == PRESOBJ_NOTES || ePresObjKind == PRESOBJ_TEXT)) + pOutliner->SetStyleSheet(0, pSheet); + + mxTextObj->SetEmptyPresObj(TRUE); + bDeleted = TRUE; + } + } + } + + return(bDeleted); +} + +/************************************************************************* +|* +|* 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 = mpView->GetTextEditOutlinerView(); + + if ((Help::IsBalloonHelpEnabled() || Help::IsQuickHelpEnabled()) && + mxTextObj.is() && pOLV && pOLV->GetFieldUnderMousePointer()) + { + String aHelpText; + const SvxFieldItem* pFieldItem = pOLV->GetFieldUnderMousePointer(); + const SvxFieldData* pField = pFieldItem->GetField(); + + if (pField && pField->ISA(SvxURLField)) + { + /****************************************************************** + * URL-Field + ******************************************************************/ + aHelpText = INetURLObject::decode( ((const SvxURLField*)pField)->GetURL(), '%', INetURLObject::DECODE_WITH_CHARSET ); + } + if (aHelpText.Len()) + { + Rectangle aLogicPix = mpWindow->LogicToPixel(mxTextObj->GetLogicRect()); + Rectangle aScreenRect(mpWindow->OutputToScreenPixel(aLogicPix.TopLeft()), + mpWindow->OutputToScreenPixel(aLogicPix.BottomRight())); + + if (Help::IsBalloonHelpEnabled()) + { + bReturn = Help::ShowBalloon( (Window*)mpWindow, rHEvt.GetMousePosPixel(), aScreenRect, aHelpText); + } + else if (Help::IsQuickHelpEnabled()) + { + bReturn = Help::ShowQuickHelp( (Window*)mpWindow, 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); + + if (nSlotId == SID_TEXTEDIT || mpViewShell->GetFrameView()->IsQuickEdit() || /*#95971#*/ SID_ATTR_CHAR == nSlotId) + { + MouseEvent aMEvt(mpWindow->GetPointerPosPixel()); + + mxTextObj.reset(0); + + if (nSlotId == SID_TEXTEDIT) + { + // Wird gerade editiert? + if(!bTestText) + mxTextObj.reset( dynamic_cast< SdrTextObj* >( mpView->GetTextEditObject() ) ); + + if (!mxTextObj.is()) + { + // Versuchen, ein Obj zu selektieren + SdrPageView* pPV = mpView->GetSdrPageView(); + SdrViewEvent aVEvt; + mpView->PickAnything(aMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + mpView->MarkObj(aVEvt.pRootObj, pPV); + + if (aVEvt.pObj && aVEvt.pObj->ISA(SdrTextObj)) + { + mxTextObj.reset( static_cast< SdrTextObj* >( aVEvt.pObj ) ); + } + } + } + else if (mpView->AreObjectsMarked()) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + + if (pObj->ISA(SdrTextObj)) + { + mxTextObj.reset( static_cast< SdrTextObj* >( pObj ) ); + } + } + } + + BOOL bQuickDrag = TRUE; + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if (pArgs + + // #98198# test for type before using + && SID_TEXTEDIT == nSlotId + && SFX_ITEM_SET == pArgs->GetItemState(SID_TEXTEDIT) + + && (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( SvtLanguageTable::GetLanguageString( (LanguageType)(ULONG)nLang ) ); + ErrorHandler::HandleError(* new StringErrorInfo( + ERRCODE_SVX_LINGU_LANGUAGENOTEXISTS, aError) ); + return 0; +} + + +/************************************************************************* +|* +|* Reaktion auf Doppelklick +|* +\************************************************************************/ +void FuText::DoubleClick(const MouseEvent& ) +{ + // Nichts zu tun +} + +/** #97016# + #105815# Removed the insertion of default text and putting a new text + object directly into edit mode. +*/ +SdrObject* FuText::CreateDefaultObject(const sal_uInt16 nID, const Rectangle& rRectangle) +{ + // case SID_TEXTEDIT: // BASIC ??? + // case SID_ATTR_CHAR: + // case SID_ATTR_CHAR_VERTICAL: + // case SID_TEXT_FITTOSIZE: + // case SID_TEXT_FITTOSIZE_VERTICAL: + + SdrObject* pObj = SdrObjFactory::MakeNewObject( + mpView->GetCurrentObjInventor(), mpView->GetCurrentObjIdentifier(), + 0L, mpDoc); + + if(pObj) + { + if(pObj->ISA(SdrTextObj)) + { + SdrTextObj* pText = (SdrTextObj*)pObj; + pText->SetLogicRect(rRectangle); + + sal_Bool bVertical = (SID_ATTR_CHAR_VERTICAL == nID || SID_TEXT_FITTOSIZE_VERTICAL == nID); + pText->SetVerticalWriting(bVertical); + + // #97016# + ImpSetAttributesForNewTextObject(pText); + + if (nSlotId == SID_TEXT_FITTOSIZE) + { + // #97016# + ImpSetAttributesFitToSize(pText); + } + else if ( nSlotId == SID_TEXT_FITTOSIZE_VERTICAL ) + { + // #97016# + ImpSetAttributesFitToSizeVertical(pText); + } + else + { + // #97016# + ImpSetAttributesFitCommon(pText); + } + + // Put text object into edit mode. + SdrPageView* pPV = mpView->GetSdrPageView(); + mpView->SdrBeginTextEdit(pText, pPV); + } + else + { + DBG_ERROR("Object is NO text object"); + } + } + + return pObj; +} + + + + +/** is called when the currenct function should be aborted. <p> + This is used when a function gets a KEY_ESCAPE but can also + be called directly. + + @returns true if a active function was aborted +*/ +bool FuText::cancel() +{ + if ( mpView->IsTextEdit() ) + { + if(mpView->SdrEndTextEdit() == SDRENDTEXTEDIT_DELETED) + mxTextObj.reset(0); + + mpView->SetCurrentObj(OBJ_TEXT); + mpView->SetEditMode(SDREDITMODE_EDIT); + return true; + } + else + { + return false; + } +} + +void FuText::ChangeFontSize( bool bGrow, OutlinerView* pOLV, const FontList* pFontList, ::sd::View* pView ) +{ + if( !pFontList || !pView ) + return; + + if( pOLV ) + { + pOLV->GetEditView().ChangeFontSize( bGrow, pFontList ); + } + else + { +// SdDrawDocument* pDoc = pView->GetDoc(); + + const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); + for( sal_uInt32 nMark = 0; nMark < rMarkList.GetMarkCount(); nMark++ ) + { + SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( rMarkList.GetMark(nMark)->GetMarkedSdrObj() ); + if( pTextObj ) + { + for( sal_Int32 nText = 0; nText < pTextObj->getTextCount(); nText++ ) + { + pTextObj->setActiveText( nText ); + + // Put text object into edit mode. + SdrPageView* pPV = pView->GetSdrPageView(); + pView->SdrBeginTextEdit(pTextObj, pPV); + + pOLV = pView->GetTextEditOutlinerView(); + if( pOLV ) + { + EditEngine* pEditEngine = pOLV->GetEditView().GetEditEngine(); + if( pEditEngine ) + { + ESelection aSel; + aSel.nEndPara = pEditEngine->GetParagraphCount()-1; + aSel.nEndPos = pEditEngine->GetTextLen(aSel.nEndPara); + pOLV->SetSelection(aSel); + } + + ChangeFontSize( bGrow, pOLV, pFontList, pView ); + } + + pView->SdrEndTextEdit(); + } + + SfxItemSet aShapeSet( pTextObj->GetMergedItemSet() ); + if( EditView::ChangeFontSize( bGrow, aShapeSet, pFontList ) ) + { + pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT ) ); + pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT_CJK ) ); + pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT_CTL ) ); + } + } + } + } +} + +} // end of namespace sd + |