| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sc.hxx" |
| |
| #include <svx/svddef.hxx> |
| #include <svx/svdoutl.hxx> |
| #include <editeng/outlobj.hxx> |
| #include <svx/sdtaaitm.hxx> |
| #include <svx/sdtacitm.hxx> |
| #include <svx/svdotext.hxx> |
| #include <editeng/unolingu.hxx> |
| #include <svx/svdocapt.hxx> |
| #include <sfx2/bindings.hxx> |
| #include <sfx2/dispatch.hxx> |
| #include <sfx2/viewfrm.hxx> |
| #include <svx/svxids.hrc> |
| #include <editeng/eeitem.hxx> |
| #include <svl/itemset.hxx> |
| |
| #include "futext.hxx" |
| #include "drwlayer.hxx" |
| #include "sc.hrc" |
| #include "tabvwsh.hxx" |
| #include "drawview.hxx" |
| |
| // #98185# Create default drawing objects via keyboard |
| #include "scresid.hxx" |
| |
| // Maximal erlaubte Mausbewegung um noch Drag&Drop zu starten |
| //! fusel,fuconstr,futext - zusammenfassen! |
| #define SC_MAXDRAGMOVE 3 |
| |
| //------------------------------------------------------------------ |
| |
| void lcl_InvalidateAttribs( SfxBindings& rBindings ) |
| { |
| rBindings.Invalidate( SID_ATTR_CHAR_WEIGHT ); |
| rBindings.Invalidate( SID_ATTR_CHAR_POSTURE ); |
| rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE ); |
| rBindings.Invalidate( SID_ULINE_VAL_NONE ); |
| rBindings.Invalidate( SID_ULINE_VAL_SINGLE ); |
| rBindings.Invalidate( SID_ULINE_VAL_DOUBLE ); |
| rBindings.Invalidate( SID_ULINE_VAL_DOTTED ); |
| rBindings.Invalidate( SID_ATTR_CHAR_OVERLINE ); |
| rBindings.Invalidate( SID_ATTR_CHAR_COLOR ); |
| rBindings.Invalidate( SID_ATTR_CHAR_FONT ); |
| rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT ); |
| rBindings.Invalidate( SID_ATTR_PARA_ADJUST_LEFT ); |
| rBindings.Invalidate( SID_ATTR_PARA_ADJUST_RIGHT ); |
| rBindings.Invalidate( SID_ATTR_PARA_ADJUST_BLOCK ); |
| rBindings.Invalidate( SID_ATTR_PARA_ADJUST_CENTER); |
| rBindings.Invalidate( SID_ALIGNLEFT ); |
| rBindings.Invalidate( SID_ALIGNCENTERHOR ); |
| rBindings.Invalidate( SID_ALIGNRIGHT ); |
| rBindings.Invalidate( SID_ALIGNBLOCK ); |
| rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_10 ); |
| rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_15 ); |
| rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_20 ); |
| rBindings.Invalidate( SID_SET_SUPER_SCRIPT ); |
| rBindings.Invalidate( SID_SET_SUB_SCRIPT ); |
| rBindings.Invalidate( SID_HYPERLINK_GETLINK ); |
| rBindings.Invalidate( SID_TEXTDIRECTION_LEFT_TO_RIGHT ); |
| rBindings.Invalidate( SID_TEXTDIRECTION_TOP_TO_BOTTOM ); |
| rBindings.Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT ); |
| rBindings.Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT ); |
| // pseudo slots for Format menu |
| rBindings.Invalidate( SID_ALIGN_ANY_LEFT ); |
| rBindings.Invalidate( SID_ALIGN_ANY_HCENTER ); |
| rBindings.Invalidate( SID_ALIGN_ANY_RIGHT ); |
| rBindings.Invalidate( SID_ALIGN_ANY_JUSTIFIED ); |
| rBindings.Invalidate( SID_ATTR_CHAR_KERNING ); |
| rBindings.Invalidate( SID_SET_SUPER_SCRIPT ); |
| rBindings.Invalidate( SID_SET_SUB_SCRIPT ); |
| rBindings.Invalidate( SID_ATTR_CHAR_STRIKEOUT ); |
| rBindings.Invalidate( SID_ATTR_CHAR_SHADOWED ); |
| } |
| |
| void lcl_UpdateHyphenator( Outliner& rOutliner, SdrObject* pObj ) |
| { |
| // use hyphenator only if hyphenation attribute is set |
| if ( pObj && ((const SfxBoolItem&)pObj->GetMergedItem(EE_PARA_HYPHENATE)).GetValue() ) { |
| com::sun::star::uno::Reference<com::sun::star::linguistic2::XHyphenator> xHyphenator( LinguMgr::GetHyphenator() ); |
| rOutliner.SetHyphenator( xHyphenator ); |
| } |
| } |
| |
| /************************************************************************* |
| |* |
| |* Basisklasse fuer Textfunktionen |
| |* |
| \************************************************************************/ |
| |
| FuText::FuText(ScTabViewShell* pViewSh, Window* pWin, ScDrawView* pViewP, |
| SdrModel* pDoc, SfxRequest& rReq) : |
| FuConstruct(pViewSh, pWin, pViewP, pDoc, rReq), |
| pTextObj(NULL) |
| { |
| } |
| |
| /************************************************************************* |
| |* |
| |* Destruktor |
| |* |
| \************************************************************************/ |
| |
| FuText::~FuText() |
| { |
| // StopEditMode(); // in Deactivate ! |
| } |
| |
| /************************************************************************* |
| |* |
| |* MouseButtonDown-event |
| |* |
| \************************************************************************/ |
| |
| sal_Bool __EXPORT FuText::MouseButtonDown(const MouseEvent& rMEvt) |
| { |
| // #95491# remember button state for creation of own MouseEvents |
| SetMouseButtonCode(rMEvt.GetButtons()); |
| |
| if ( pView->MouseButtonDown(rMEvt, pWindow) ) |
| return (sal_True); // Event von der SdrView ausgewertet |
| |
| if ( pView->IsTextEdit() ) |
| { |
| if( !IsSizingOrMovingNote(rMEvt) ) |
| StopEditMode(); // Danebengeklickt, Ende mit Edit |
| pView->SetCreateMode(); |
| } |
| |
| aMDPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() ); |
| |
| if ( rMEvt.IsLeft() ) |
| { |
| SdrHdl* pHdl = pView->PickHandle(aMDPos); |
| |
| sal_uLong nHdlNum = pView->GetHdlNum(pHdl); |
| |
| if (pHdl != NULL) |
| { |
| if (pView->HasMarkablePoints() && pView->IsPointMarkable(*pHdl)) |
| { |
| sal_Bool bPointMarked=pView->IsPointMarked(*pHdl); |
| |
| if ( rMEvt.IsShift() ) |
| { |
| if (!bPointMarked) |
| { |
| pView->MarkPoint(*pHdl); |
| } |
| else |
| { |
| pView->UnmarkPoint(*pHdl); |
| } |
| } |
| else |
| { |
| if (!bPointMarked) |
| { |
| pView->UnmarkAllPoints(); |
| pView->MarkPoint(*pHdl); |
| } |
| } |
| pHdl=pView->GetHdl(nHdlNum); |
| } |
| } |
| |
| SdrObject* pObj; |
| SdrPageView* pPV; |
| |
| if ( pHdl != NULL || pView->IsMarkedHit(aMDPos) ) |
| { |
| if (pHdl == NULL && |
| // pView->TakeTextEditObject(aMDPos, pObj, pPV) ) |
| pView->PickObj(aMDPos, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKTEXTEDIT) ) |
| { |
| SdrOutliner* pO = MakeOutliner(); |
| lcl_UpdateHyphenator( *pO, pObj ); |
| |
| // vertical flag: |
| // deduced from slot ids only if text object has no content |
| |
| sal_uInt16 nSlotID = aSfxRequest.GetSlot(); |
| sal_Bool bVertical = ( nSlotID == SID_DRAW_TEXT_VERTICAL ); |
| OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject(); |
| if ( pOPO ) |
| bVertical = pOPO->IsVertical(); // content wins |
| pO->SetVertical( bVertical ); |
| |
| //!?? ohne uebergebenen Outliner stimmen die Defaults nicht ???!? |
| if ( pView->SdrBeginTextEdit(pObj, pPV, pWindow, sal_True, pO) ) |
| { |
| // EditEngine-UndoManager anmelden |
| pViewShell->SetDrawTextUndo( &pO->GetUndoManager() ); |
| |
| OutlinerView* pOLV = pView->GetTextEditOutlinerView(); |
| if ( pOLV->MouseButtonDown(rMEvt) ) |
| return (sal_True); // Event an den Outliner |
| } |
| } |
| else |
| { |
| // disable tail & circular move for caption objects. |
| bool bDrag = false; |
| const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); |
| if( rMarkList.GetMarkCount() == 1 ) |
| { |
| SdrObject* pMarkedObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); |
| if( ScDrawLayer::IsNoteCaption( pMarkedObj ) ) |
| { |
| if(pHdl->GetKind() != HDL_POLY && pHdl->GetKind() != HDL_CIRC) |
| bDrag = true; |
| } |
| else |
| bDrag = true; // different object |
| } |
| else |
| bDrag = true; // several objects |
| |
| if ( bDrag ) |
| { |
| aDragTimer.Start(); |
| pView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl); |
| } |
| } |
| } |
| else |
| { |
| sal_Bool bMacro = sal_False; |
| |
| // if (bMacro && pView->TakeMacroObject(aMDPos,pObj,pPV)) |
| if (bMacro && pView->PickObj(aMDPos, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKMACRO) ) |
| |
| { |
| pView->BegMacroObj(aMDPos,pObj,pPV,pWindow); |
| } |
| else |
| { |
| if (pView->IsEditMode()) |
| { |
| sal_Bool bPointMode=pView->HasMarkablePoints(); |
| |
| if (!rMEvt.IsShift()) |
| { |
| if (bPointMode) |
| { |
| pView->UnmarkAllPoints(); |
| } |
| else |
| { |
| pView->UnmarkAll(); |
| } |
| |
| pView->SetDragMode(SDRDRAG_MOVE); |
| SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings(); |
| rBindings.Invalidate( SID_OBJECT_ROTATE ); |
| rBindings.Invalidate( SID_OBJECT_MIRROR ); |
| pHdl=pView->GetHdl(nHdlNum); |
| } |
| |
| if ( pView->MarkObj(aMDPos, -2, sal_False, rMEvt.IsMod1()) ) |
| { |
| aDragTimer.Start(); |
| |
| pHdl=pView->PickHandle(aMDPos); |
| |
| if (pHdl!=NULL) |
| { |
| pView->MarkPoint(*pHdl); |
| pHdl=pView->GetHdl(nHdlNum); |
| } |
| |
| pView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl); |
| } |
| else |
| { |
| if (bPointMode) |
| { |
| pView->BegMarkPoints(aMDPos); |
| } |
| else |
| { |
| pView->BegMarkObj(aMDPos); |
| } |
| } |
| } |
| else if (aSfxRequest.GetSlot() == SID_DRAW_NOTEEDIT ) |
| { |
| // Notizen editieren -> keine neuen Textobjekte erzeugen, |
| // stattdessen Textmodus verlassen |
| |
| pViewShell->GetViewData()->GetDispatcher(). |
| Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); |
| } |
| else |
| { |
| /********************************************************** |
| * Objekt erzeugen |
| **********************************************************/ |
| pView->BegCreateObj(aMDPos, (OutputDevice*) NULL); |
| } |
| } |
| } |
| } |
| |
| |
| if (!bIsInDragMode) |
| { |
| pWindow->CaptureMouse(); |
| // ForcePointer(&rMEvt); |
| lcl_InvalidateAttribs( pViewShell->GetViewFrame()->GetBindings() ); |
| } |
| |
| pViewShell->SetActivePointer(pView->GetPreferedPointer( |
| pWindow->PixelToLogic(rMEvt.GetPosPixel()), pWindow )); |
| |
| // return (bReturn); |
| return sal_True; |
| } |
| |
| /************************************************************************* |
| |* |
| |* MouseMove-event |
| |* |
| \************************************************************************/ |
| |
| sal_Bool __EXPORT FuText::MouseMove(const MouseEvent& rMEvt) |
| { |
| sal_Bool bReturn = sal_False; |
| |
| // pViewShell->SetActivePointer(aNewPointer); |
| |
| pViewShell->SetActivePointer(pView->GetPreferedPointer( |
| pWindow->PixelToLogic(rMEvt.GetPosPixel()), pWindow )); |
| |
| if (aDragTimer.IsActive() ) |
| { |
| Point aOldPixel = pWindow->LogicToPixel( aMDPos ); |
| Point aNewPixel = rMEvt.GetPosPixel(); |
| if ( Abs( aOldPixel.X() - aNewPixel.X() ) > SC_MAXDRAGMOVE || |
| Abs( aOldPixel.Y() - aNewPixel.Y() ) > SC_MAXDRAGMOVE ) |
| aDragTimer.Stop(); |
| } |
| |
| if ( pView->MouseMove(rMEvt, pWindow) ) |
| return (sal_True); // Event von der SdrView ausgewertet |
| |
| if ( pView->IsAction() ) |
| { |
| /* aNewPointer = Pointer(POINTER_TEXT); |
| pViewShell->SetActivePointer(aNewPointer); |
| */ |
| Point aPix(rMEvt.GetPosPixel()); |
| Point aPnt(pWindow->PixelToLogic(aPix)); |
| |
| ForceScroll(aPix); |
| pView->MovAction(aPnt); |
| } |
| |
| // ForcePointer(&rMEvt); |
| |
| return (bReturn); |
| } |
| |
| /************************************************************************* |
| |* |
| |* MouseButtonUp-event |
| |* |
| \************************************************************************/ |
| |
| sal_Bool __EXPORT FuText::MouseButtonUp(const MouseEvent& rMEvt) |
| { |
| // #95491# remember button state for creation of own MouseEvents |
| SetMouseButtonCode(rMEvt.GetButtons()); |
| |
| sal_Bool bReturn = sal_False; |
| |
| if (aDragTimer.IsActive() ) |
| { |
| aDragTimer.Stop(); |
| } |
| |
| lcl_InvalidateAttribs( pViewShell->GetViewFrame()->GetBindings() ); |
| |
| Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); |
| |
| if ( pView->MouseButtonUp(rMEvt, pWindow) ) |
| return (sal_True); // Event von der SdrView ausgewertet |
| |
| if ( pView->IsDragObj() ) |
| { |
| pView->EndDragObj( rMEvt.IsShift() ); |
| const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); |
| if (rMarkList.GetMarkCount() == 1) |
| { |
| SdrMark* pMark = rMarkList.GetMark(0); |
| SdrObject* pObj = pMark->GetMarkedSdrObj(); |
| FuPoor* pPoor = pViewShell->GetViewData()->GetView()->GetDrawFuncPtr(); |
| FuText* pText = static_cast<FuText*>(pPoor); |
| pText->StopDragMode(pObj ); |
| } |
| pView->ForceMarkedToAnotherPage(); |
| } |
| else if ( pView->IsCreateObj() ) |
| { |
| if (rMEvt.IsLeft()) |
| { |
| pView->EndCreateObj(SDRCREATE_FORCEEND); |
| if (aSfxRequest.GetSlot() == SID_DRAW_TEXT_MARQUEE) |
| { |
| // Lauftext-Objekt erzeugen? |
| |
| const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); |
| if (rMarkList.GetMark(0)) |
| { |
| SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); |
| |
| // die fuer das Scrollen benoetigten Attribute setzen |
| SfxItemSet aItemSet( pDrDoc->GetItemPool(), |
| SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST); |
| |
| aItemSet.Put( SdrTextAutoGrowWidthItem( sal_False ) ); |
| aItemSet.Put( SdrTextAutoGrowHeightItem( sal_False ) ); |
| aItemSet.Put( SdrTextAniKindItem( SDRTEXTANI_SLIDE ) ); |
| aItemSet.Put( SdrTextAniDirectionItem( SDRTEXTANI_LEFT ) ); |
| aItemSet.Put( SdrTextAniCountItem( 1 ) ); |
| aItemSet.Put( SdrTextAniAmountItem( |
| (sal_Int16)pWindow->PixelToLogic(Size(2,1)).Width()) ); |
| pObj->SetMergedItemSetAndBroadcast(aItemSet); |
| } |
| } |
| |
| // #93382# init object different when vertical writing |
| sal_uInt16 nSlotID(aSfxRequest.GetSlot()); |
| sal_Bool bVertical = (SID_DRAW_TEXT_VERTICAL == nSlotID); |
| if(bVertical) |
| { |
| const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); |
| if(rMarkList.GetMark(0)) |
| { |
| SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); |
| if(pObj && pObj->ISA(SdrTextObj)) |
| { |
| SdrTextObj* pText = (SdrTextObj*)pObj; |
| SfxItemSet aSet(pDrDoc->GetItemPool()); |
| |
| pText->SetVerticalWriting(sal_True); |
| |
| aSet.Put(SdrTextAutoGrowWidthItem(sal_True)); |
| aSet.Put(SdrTextAutoGrowHeightItem(sal_False)); |
| aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP)); |
| aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); |
| |
| pText->SetMergedItemSet(aSet); |
| } |
| } |
| } |
| |
| SetInEditMode(); |
| |
| // Modus verlassen bei einzelnem Klick |
| // (-> fuconstr) |
| |
| if ( !pView->AreObjectsMarked() ) |
| { |
| pView->MarkObj(aPnt, -2, sal_False, rMEvt.IsMod1()); |
| |
| SfxDispatcher& rDisp = pViewShell->GetViewData()->GetDispatcher(); |
| if ( pView->AreObjectsMarked() ) |
| rDisp.Execute(SID_OBJECT_SELECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); |
| else |
| rDisp.Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); |
| } |
| } |
| } |
| else if ( pView->IsAction() ) |
| { |
| pView->EndAction(); |
| } |
| else if( !pView->IsAction() ) |
| { |
| pWindow->ReleaseMouse(); |
| |
| if ( !pView->AreObjectsMarked() && rMEvt.GetClicks() < 2 ) |
| { |
| pView->MarkObj(aPnt, -2, sal_False, rMEvt.IsMod1()); |
| |
| SfxDispatcher& rDisp = pViewShell->GetViewData()->GetDispatcher(); |
| if ( pView->AreObjectsMarked() ) |
| rDisp.Execute(SID_OBJECT_SELECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); |
| else |
| rDisp.Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); |
| } |
| } |
| |
| return (bReturn); |
| } |
| |
| /************************************************************************* |
| |* |
| |* Maus-Pointer umschalten |
| |* |
| \************************************************************************/ |
| |
| void FuText::ForcePointer(const MouseEvent* /* pMEvt */) |
| { |
| pViewShell->SetActivePointer( aNewPointer ); |
| |
| /* |
| if ( !pView->IsAction() ) |
| { |
| Point aPnt(pWindow->PixelToLogic( pWindow->ScreenToOutputPixel( |
| Pointer::GetPosPixel() ) ) ); |
| SdrHdl* pHdl=pView->HitHandle(aPnt, *pWindow); |
| |
| if (pHdl!=NULL) |
| { |
| pViewShell->SetActivePointer(pHdl->GetPointer() ); |
| } |
| else |
| { |
| SdrObject* pObj; |
| SdrPageView* pPV; |
| |
| if ( pView->IsMarkedHit(aPnt) ) |
| { |
| if ( pView->TakeTextEditObject(aPnt, pObj, pPV) ) |
| { |
| pViewShell->SetActivePointer(Pointer(POINTER_TEXT)); |
| } |
| else |
| { |
| pViewShell->SetActivePointer(Pointer(POINTER_MOVE)); |
| } |
| } |
| else |
| { |
| // if ( pView->TakeMacroObject(aPnt, pObj, pPV) ) |
| if ( pView->PickObj(aPnt, pObj, pPV, SDRSEARCH_PICKMACRO) ) |
| { |
| pViewShell->SetActivePointer( pObj->GetMacroPointer() ); |
| } |
| else |
| { |
| pViewShell->SetActivePointer( aNewPointer ); |
| } |
| } |
| } |
| } |
| */ |
| } |
| |
| |
| |
| /************************************************************************* |
| |* |
| |* Tastaturereignisse bearbeiten |
| |* |
| |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls |
| |* FALSE. |
| |* |
| \************************************************************************/ |
| |
| sal_Bool __EXPORT FuText::KeyInput(const KeyEvent& rKEvt) |
| { |
| sal_Bool bReturn = sal_False; |
| |
| if ( pView->KeyInput(rKEvt, pWindow) ) |
| { |
| bReturn = sal_True; |
| lcl_InvalidateAttribs( pViewShell->GetViewFrame()->GetBindings() ); |
| } |
| else |
| { |
| bReturn = FuDraw::KeyInput(rKEvt); |
| } |
| |
| return (bReturn); |
| } |
| |
| |
| |
| /************************************************************************* |
| |* |
| |* Function aktivieren |
| |* |
| \************************************************************************/ |
| |
| void FuText::Activate() |
| { |
| pView->SetDragMode(SDRDRAG_MOVE); |
| SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings(); |
| rBindings.Invalidate( SID_OBJECT_ROTATE ); |
| rBindings.Invalidate( SID_OBJECT_MIRROR ); |
| |
| // Sofort in den Edit Mode setzen |
| // SetInEditMode(); |
| |
| // if (!pTextObj) |
| { |
| /********************************************************************** |
| * Kein Textobjekt im EditMode, daher CreateMode setzen |
| **********************************************************************/ |
| sal_uInt16 nObj = OBJ_TEXT; |
| |
| /* sal_uInt16 nIdent; |
| sal_uInt32 nInvent; |
| pView->TakeCurrentObj(nIdent, nInvent); |
| */ |
| pView->SetCurrentObj(nObj); |
| |
| pView->SetCreateMode(); |
| } |
| |
| aNewPointer = Pointer(POINTER_TEXT); |
| // aNewPointer = Pointer(POINTER_CROSS); //! ??? |
| |
| aOldPointer = pWindow->GetPointer(); |
| pViewShell->SetActivePointer( aNewPointer ); |
| |
| FuConstruct::Activate(); |
| } |
| |
| |
| /************************************************************************* |
| |* |
| |* Function deaktivieren |
| |* |
| \************************************************************************/ |
| |
| void FuText::Deactivate() |
| { |
| FuConstruct::Deactivate(); |
| pViewShell->SetActivePointer( aOldPointer ); |
| StopEditMode(); |
| } |
| |
| |
| /************************************************************************* |
| |* |
| |* Selektion hat sich geaendert |
| |* |
| \************************************************************************/ |
| |
| void FuText::SelectionHasChanged() |
| { |
| pView->SetDragMode(SDRDRAG_MOVE); |
| SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings(); |
| rBindings.Invalidate( SID_OBJECT_ROTATE ); |
| rBindings.Invalidate( SID_OBJECT_MIRROR ); |
| |
| pTextObj = NULL; |
| |
| if ( pView->AreObjectsMarked() ) |
| { |
| const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); |
| |
| if (rMarkList.GetMarkCount() == 1) |
| { |
| SdrMark* pMark = rMarkList.GetMark(0); |
| SdrObject* pObj = pMark->GetMarkedSdrObj(); |
| |
| sal_uInt16 nSdrObjKind = pObj->GetObjIdentifier(); |
| |
| if (nSdrObjKind == OBJ_TEXT || |
| nSdrObjKind == OBJ_TITLETEXT || |
| nSdrObjKind == OBJ_OUTLINETEXT /* || |
| pObj->ISA(SdrTextObj) */ ) |
| { |
| pTextObj = (SdrTextObj*) pObj; |
| } |
| } |
| } |
| |
| if (!pTextObj) |
| { |
| /********************************************************************** |
| * Kein Textobjekt im EditMode, daher CreateMode setzen |
| **********************************************************************/ |
| sal_uInt16 nObj = OBJ_TEXT; |
| sal_uInt16 nIdent; |
| sal_uInt32 nInvent; |
| pView->TakeCurrentObj(nIdent, nInvent); |
| |
| // if (! pView->IsEditMode() ) |
| // { |
| // if (nIdent == OBJ_TEXT) |
| // { |
| // nObj = OBJ_TEXT; |
| // } |
| // else if (nIdent == OBJ_OUTLINETEXT) |
| // { |
| // nObj = OBJ_OUTLINETEXT; |
| // } |
| // else if (nIdent == OBJ_TITLETEXT) |
| // { |
| // nObj = OBJ_TITLETEXT; |
| // } |
| // } |
| |
| pView->SetCurrentObj(nObj); |
| |
| pView->SetCreateMode(); |
| } |
| } |
| |
| /************************************************************************* |
| |* |
| |* Objekt in Edit-Mode setzen |
| |* |
| \************************************************************************/ |
| |
| void FuText::SetInEditMode(SdrObject* pObj, const Point* pMousePixel, |
| sal_Bool bCursorToEnd, const KeyEvent* pInitialKey) |
| { |
| /* It is possible to pass a special (unselected) object in pObj, e.g. the |
| caption object of a cell note. If pObj is 0, then the selected object |
| is used. The layer will be relocked in FuText::StopEditMode(). */ |
| if ( pObj && (pObj->GetLayer() == SC_LAYER_INTERN) ) |
| pView->UnlockInternalLayer(); |
| |
| if ( !pObj && pView->AreObjectsMarked() ) |
| { |
| const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); |
| if (rMarkList.GetMarkCount() == 1) |
| { |
| SdrMark* pMark = rMarkList.GetMark(0); |
| pObj = pMark->GetMarkedSdrObj(); |
| } |
| } |
| |
| pTextObj = NULL; |
| |
| if ( pObj ) |
| { |
| sal_uInt16 nSdrObjKind = pObj->GetObjIdentifier(); |
| |
| if (nSdrObjKind == OBJ_TEXT || |
| nSdrObjKind == OBJ_TITLETEXT || |
| nSdrObjKind == OBJ_OUTLINETEXT || |
| pObj->ISA(SdrTextObj)) |
| { |
| SdrPageView* pPV = pView->GetSdrPageView(); |
| Rectangle aRect = pObj->GetLogicRect(); |
| Point aPnt = aRect.Center(); |
| |
| if ( pObj->HasTextEdit() ) |
| { |
| SdrOutliner* pO = MakeOutliner(); |
| lcl_UpdateHyphenator( *pO, pObj ); |
| |
| // vertical flag: |
| // deduced from slot ids only if text object has no content |
| |
| sal_uInt16 nSlotID = aSfxRequest.GetSlot(); |
| sal_Bool bVertical = ( nSlotID == SID_DRAW_TEXT_VERTICAL ); |
| OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject(); |
| if ( pOPO ) |
| bVertical = pOPO->IsVertical(); // content wins |
| pO->SetVertical( bVertical ); |
| |
| //!?? ohne uebergebenen Outliner stimmen die Defaults nicht ???!? |
| if ( pView->SdrBeginTextEdit(pObj, pPV, pWindow, sal_True, pO) ) |
| { |
| // EditEngine-UndoManager anmelden |
| pViewShell->SetDrawTextUndo( &pO->GetUndoManager() ); |
| |
| pTextObj = (SdrTextObj*) pObj; |
| pView->SetEditMode(); |
| |
| // set text cursor to click position or to end, |
| // pass initial key event to outliner view |
| if ( pMousePixel || bCursorToEnd || pInitialKey ) |
| { |
| OutlinerView* pOLV = pView->GetTextEditOutlinerView(); |
| if (pOLV) |
| { |
| if ( pMousePixel ) |
| { |
| MouseEvent aEditEvt( *pMousePixel, 1, MOUSE_SYNTHETIC, MOUSE_LEFT, 0 ); |
| pOLV->MouseButtonDown(aEditEvt); |
| pOLV->MouseButtonUp(aEditEvt); |
| } |
| else if ( bCursorToEnd ) |
| { |
| ESelection aNewSelection(EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND, EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND); |
| pOLV->SetSelection(aNewSelection); |
| } |
| |
| if ( pInitialKey ) |
| pOLV->PostKeyEvent( *pInitialKey ); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| // #98185# Create default drawing objects via keyboard |
| SdrObject* FuText::CreateDefaultObject(const sal_uInt16 nID, const Rectangle& rRectangle) |
| { |
| // case SID_DRAW_TEXT: |
| // case SID_DRAW_TEXT_VERTICAL: |
| // case SID_DRAW_TEXT_MARQUEE: |
| // case SID_DRAW_NOTEEDIT: |
| |
| SdrObject* pObj = SdrObjFactory::MakeNewObject( |
| pView->GetCurrentObjInventor(), pView->GetCurrentObjIdentifier(), |
| 0L, pDrDoc); |
| |
| if(pObj) |
| { |
| if(pObj->ISA(SdrTextObj)) |
| { |
| SdrTextObj* pText = (SdrTextObj*)pObj; |
| pText->SetLogicRect(rRectangle); |
| |
| // #105815# don't set default text, start edit mode instead |
| // String aText(ScResId(STR_CAPTION_DEFAULT_TEXT)); |
| // pText->SetText(aText); |
| |
| sal_Bool bVertical = (SID_DRAW_TEXT_VERTICAL == nID); |
| sal_Bool bMarquee = (SID_DRAW_TEXT_MARQUEE == nID); |
| |
| pText->SetVerticalWriting(bVertical); |
| |
| if(bVertical) |
| { |
| SfxItemSet aSet(pDrDoc->GetItemPool()); |
| |
| aSet.Put(SdrTextAutoGrowWidthItem(sal_True)); |
| aSet.Put(SdrTextAutoGrowHeightItem(sal_False)); |
| aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP)); |
| aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); |
| |
| pText->SetMergedItemSet(aSet); |
| } |
| |
| if(bMarquee) |
| { |
| SfxItemSet aSet(pDrDoc->GetItemPool(), SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST); |
| |
| aSet.Put( SdrTextAutoGrowWidthItem( sal_False ) ); |
| aSet.Put( SdrTextAutoGrowHeightItem( sal_False ) ); |
| aSet.Put( SdrTextAniKindItem( SDRTEXTANI_SLIDE ) ); |
| aSet.Put( SdrTextAniDirectionItem( SDRTEXTANI_LEFT ) ); |
| aSet.Put( SdrTextAniCountItem( 1 ) ); |
| aSet.Put( SdrTextAniAmountItem( (sal_Int16)pWindow->PixelToLogic(Size(2,1)).Width()) ); |
| |
| pObj->SetMergedItemSetAndBroadcast(aSet); |
| } |
| |
| SetInEditMode( pObj ); // #105815# start edit mode |
| } |
| else |
| { |
| DBG_ERROR("Object is NO text object"); |
| } |
| } |
| |
| return pObj; |
| } |
| |