/************************************************************** * * 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 #include #include #include #include #include "fuconstr.hxx" #include "fudraw.hxx" #include "tabvwsh.hxx" #include "futext.hxx" #include "sc.hrc" #include "drawview.hxx" // Maximal erlaubte Mausbewegung um noch Drag&Drop zu starten //! fusel,fuconstr,futext - zusammenfassen! #define SC_MAXDRAGMOVE 3 //------------------------------------------------------------------------ /************************************************************************* |* |* Konstruktor |* \************************************************************************/ FuConstruct::FuConstruct(ScTabViewShell* pViewSh, Window* pWin, ScDrawView* pViewP, SdrModel* pDoc, SfxRequest& rReq) : FuDraw(pViewSh, pWin, pViewP, pDoc, rReq) { } /************************************************************************* |* |* Destruktor |* \************************************************************************/ FuConstruct::~FuConstruct() { } sal_uInt8 FuConstruct::Command(const CommandEvent& rCEvt) { // special code for non-VCL OS2/UNX removed return FuDraw::Command( rCEvt ); } /************************************************************************* |* |* MouseButtonDown-event |* \************************************************************************/ sal_Bool __EXPORT FuConstruct::MouseButtonDown(const MouseEvent& rMEvt) { // #95491# remember button state for creation of own MouseEvents SetMouseButtonCode(rMEvt.GetButtons()); sal_Bool bReturn = FuDraw::MouseButtonDown(rMEvt); if ( pView->IsAction() ) { if ( rMEvt.IsRight() ) pView->BckAction(); return sal_True; } aDragTimer.Start(); aMDPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() ); if ( rMEvt.IsLeft() ) { pWindow->CaptureMouse(); SdrHdl* pHdl = pView->PickHandle(aMDPos); if ( pHdl != NULL || pView->IsMarkedHit(aMDPos) ) { pView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, 1); bReturn = sal_True; } else if ( pView->AreObjectsMarked() ) { pView->UnmarkAll(); bReturn = sal_True; } } bIsInDragMode = sal_False; return bReturn; } /************************************************************************* |* |* MouseMove-event |* \************************************************************************/ sal_Bool __EXPORT FuConstruct::MouseMove(const MouseEvent& rMEvt) { FuDraw::MouseMove(rMEvt); 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(); } Point aPix(rMEvt.GetPosPixel()); Point aPnt( pWindow->PixelToLogic(aPix) ); if ( pView->IsAction() ) { ForceScroll(aPix); pView->MovAction(aPnt); } else { SdrHdl* pHdl=pView->PickHandle(aPnt); if ( pHdl != NULL ) { pViewShell->SetActivePointer(pHdl->GetPointer()); } else if ( pView->IsMarkedHit(aPnt) ) { pViewShell->SetActivePointer(Pointer(POINTER_MOVE)); } else { pViewShell->SetActivePointer( aNewPointer ); } } return sal_True; } /************************************************************************* |* |* MouseButtonUp-event |* \************************************************************************/ sal_Bool __EXPORT FuConstruct::MouseButtonUp(const MouseEvent& rMEvt) { // #95491# remember button state for creation of own MouseEvents SetMouseButtonCode(rMEvt.GetButtons()); sal_Bool bReturn = SimpleMouseButtonUp( rMEvt ); // Doppelklick auf Textobjekt? (->fusel) sal_uInt16 nClicks = rMEvt.GetClicks(); if ( nClicks == 2 && rMEvt.IsLeft() ) { if ( pView->AreObjectsMarked() ) { const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); if (rMarkList.GetMarkCount() == 1) { SdrMark* pMark = rMarkList.GetMark(0); SdrObject* pObj = pMark->GetMarkedSdrObj(); // #49458# bei Uno-Controls nicht in Textmodus if ( pObj->ISA(SdrTextObj) && !pObj->ISA(SdrUnoObj) ) { OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject(); sal_Bool bVertical = ( pOPO && pOPO->IsVertical() ); sal_uInt16 nTextSlotId = bVertical ? SID_DRAW_TEXT_VERTICAL : SID_DRAW_TEXT; pViewShell->GetViewData()->GetDispatcher(). Execute(nTextSlotId, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); // jetzt den erzeugten FuText holen und in den EditModus setzen FuPoor* pPoor = pViewShell->GetViewData()->GetView()->GetDrawFuncPtr(); if ( pPoor && pPoor->GetSlotID() == nTextSlotId ) // hat keine RTTI { FuText* pText = (FuText*)pPoor; Point aMousePixel = rMEvt.GetPosPixel(); pText->SetInEditMode( pObj, &aMousePixel ); } bReturn = sal_True; } } } } FuDraw::MouseButtonUp(rMEvt); return bReturn; } // SimpleMouseButtonUp - ohne Test auf Doppelklick sal_Bool FuConstruct::SimpleMouseButtonUp(const MouseEvent& rMEvt) { sal_Bool bReturn = sal_True; if (aDragTimer.IsActive() ) { aDragTimer.Stop(); } Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); if ( pView->IsDragObj() ) pView->EndDragObj( rMEvt.IsMod1() ); else if ( pView->IsMarkObj() ) pView->EndMarkObj(); else bReturn = sal_False; 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; } /************************************************************************* |* |* Tastaturereignisse bearbeiten |* |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls |* FALSE. |* \************************************************************************/ sal_Bool __EXPORT FuConstruct::KeyInput(const KeyEvent& rKEvt) { sal_Bool bReturn = sal_False; switch ( rKEvt.GetKeyCode().GetCode() ) { case KEY_ESCAPE: if ( pView->IsAction() ) { pView->BrkAction(); pWindow->ReleaseMouse(); bReturn = sal_True; } else // Zeichenmodus beenden { pViewShell->GetViewData()->GetDispatcher(). Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); } break; case KEY_DELETE: pView->DeleteMarked(); bReturn = sal_True; break; } if ( !bReturn ) { bReturn = FuDraw::KeyInput(rKEvt); } return(bReturn); } /************************************************************************* |* |* Function aktivieren |* \************************************************************************/ void FuConstruct::Activate() { FuDraw::Activate(); } /************************************************************************* |* |* Function deaktivieren |* \************************************************************************/ void FuConstruct::Deactivate() { FuDraw::Deactivate(); }