diff options
Diffstat (limited to 'sd/source/ui/func/fusel.cxx')
-rw-r--r-- | sd/source/ui/func/fusel.cxx | 1501 |
1 files changed, 0 insertions, 1501 deletions
diff --git a/sd/source/ui/func/fusel.cxx b/sd/source/ui/func/fusel.cxx deleted file mode 100644 index 9e20f9712..000000000 --- a/sd/source/ui/func/fusel.cxx +++ /dev/null @@ -1,1501 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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 "fusel.hxx" -#include <basic/sbstar.hxx> -#include <svx/svdpagv.hxx> -#include <svx/svdogrp.hxx> -#include <svx/polysc3d.hxx> -#include "drawview.hxx" -#include <svtools/imapobj.hxx> -#include <svl/urihelper.hxx> -#include <unotools/localfilehelper.hxx> -#include <svx/svxids.hrc> -#include <svx/xfillit0.hxx> -#include <sfx2/app.hxx> -#include <sfx2/viewfrm.hxx> -#include <svl/aeitem.hxx> -#include <svl/stritem.hxx> -#include <svl/intitem.hxx> -#include <sfx2/dispatch.hxx> -#include <tools/urlobj.hxx> -#include <sfx2/docfile.hxx> -#include <tools/debug.hxx> -#include <editeng/eeitem.hxx> -#include <editeng/flditem.hxx> - -#include <svx/svdotable.hxx> - -#include "app.hrc" -#include "strings.hrc" -#include "res_bmp.hrc" -#include "GraphicDocShell.hxx" -#include "app.hxx" -#include "DrawDocShell.hxx" -#include "stlpool.hxx" -#include "anmdef.hxx" -#include "anminfo.hxx" -#include "fudraw.hxx" -#include "ViewShell.hxx" -#include "ViewShellBase.hxx" -#include "FrameView.hxx" -#include "View.hxx" -#include "Window.hxx" -#include "drawdoc.hxx" -#include "sdpage.hxx" -#include "DrawViewShell.hxx" -#include "ToolBarManager.hxx" -#include "pgjump.hxx" -#include <svx/globl3d.hxx> -#include "Client.hxx" - -#include "slideshow.hxx" - -#include <svx/svdundo.hxx> -#include <avmedia/mediawindow.hxx> - -#include <svx/sdrhittesthelper.hxx> - -using namespace ::com::sun::star; - -namespace sd { - -TYPEINIT1( FuSelection, FuDraw ); - -/************************************************************************* -|* -|* Konstruktor -|* -\************************************************************************/ - -FuSelection::FuSelection ( - ViewShell* pViewSh, - ::sd::Window* pWin, - ::sd::View* pView, - SdDrawDocument* pDoc, - SfxRequest& rReq) - : FuDraw(pViewSh, pWin, pView, pDoc, rReq), - bTempRotation(sal_False), - bSelectionChanged(sal_False), - bHideAndAnimate(sal_False), - pHdl(NULL), - bSuppressChangesOfSelection(sal_False), - bMirrorSide0(sal_False), - nEditMode(SID_BEZIER_MOVE), - pWaterCanCandidate(NULL) -{ -} - -FunctionReference FuSelection::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) -{ - FunctionReference xFunc( new FuSelection( pViewSh, pWin, pView, pDoc, rReq ) ); - xFunc->DoExecute(rReq); - return xFunc; -} - -void FuSelection::DoExecute( SfxRequest& rReq ) -{ - FuDraw::DoExecute( rReq ); - - // Objektbar auswaehlen - SelectionHasChanged(); -} - -/************************************************************************* -|* -|* Destruktor -|* -\************************************************************************/ - -FuSelection::~FuSelection() -{ - mpView->UnmarkAllPoints(); - mpView->ResetCreationActive(); - - if ( mpView->GetDragMode() != SDRDRAG_MOVE ) - { - mpView->SetDragMode(SDRDRAG_MOVE); - } -} - -/************************************************************************* -|* -|* MouseButtonDown-event -|* -\************************************************************************/ - -sal_Bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt) -{ - // Hack fuer #?????# - bHideAndAnimate = sal_False; - - pHdl = NULL; - sal_Bool bReturn = FuDraw::MouseButtonDown(rMEvt); - sal_Bool bWaterCan = SD_MOD()->GetWaterCan(); - const bool bReadOnly = mpDocSh->IsReadOnly(); - // When the right mouse button is pressed then only select objects - // (and deselect others) as a preparation for showing the context - // menu. - const bool bSelectionOnly = rMEvt.IsRight(); - - bMBDown = sal_True; - bSelectionChanged = sal_False; - - if ( mpView->IsAction() ) - { - if ( rMEvt.IsRight() ) - mpView->BckAction(); - return sal_True; - } - - sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); - sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); - - // The following code is executed for right clicks as well as for left - // clicks in order to modify the selection for the right button as a - // preparation for the context menu. The functions BegMarkObject() and - // BegDragObject(), however, are not called for right clicks because a) - // it makes no sense and b) to have IsAction() return sal_False when called - // from Command() which is a prerequisite for the context menu. - if ((rMEvt.IsLeft() || rMEvt.IsRight()) - && !mpView->IsAction() - && (mpView->IsFrameDragSingles() || !mpView->HasMarkablePoints())) - { - /****************************************************************** - * KEIN BEZIER_EDITOR - ******************************************************************/ - mpWindow->CaptureMouse(); - pHdl = mpView->PickHandle(aMDPos); - SdrObject* pObj; - SdrPageView* pPV; - - long nAngle0 = GetAngle(aMDPos - mpView->GetRef1()); - nAngle0 -= 27000; - nAngle0 = NormAngle360(nAngle0); - bMirrorSide0 = sal_Bool (nAngle0 < 18000L); - - if (!pHdl && mpView->Is3DRotationCreationActive()) - { - /****************************************************************** - * Wenn 3D-Rotationskoerper erstellt werden sollen, jetzt - * die Erstellung beenden - ******************************************************************/ - bSuppressChangesOfSelection = sal_True; - if(mpWindow) - mpWindow->EnterWait(); - mpView->End3DCreation(); - bSuppressChangesOfSelection = sal_False; - mpView->ResetCreationActive(); - if(mpWindow) - mpWindow->LeaveWait(); - } - - sal_Bool bTextEdit = sal_False; - SdrViewEvent aVEvt; - SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); - - if ( eHit == SDRHIT_TEXTEDITOBJ && ( mpViewShell->GetFrameView()->IsQuickEdit() || dynamic_cast< sdr::table::SdrTableObj* >( aVEvt.pObj ) != NULL ) ) - { - bTextEdit = sal_True; - } - - if(!bTextEdit - && !mpDocSh->IsReadOnly() - && ((mpView->IsMarkedHit(aMDPos, nHitLog) && !rMEvt.IsShift() && !rMEvt.IsMod2()) || pHdl != NULL) - && (rMEvt.GetClicks() != 2) - ) - { - if (!pHdl && mpView->Is3DRotationCreationActive()) - { - // Wechsel Rotationskoerper -> Selektion - mpView->ResetCreationActive(); - } - else if (bWaterCan) - { - // Remember the selected object for proper handling in - // MouseButtonUp(). - pWaterCanCandidate = pickObject (aMDPos); - } - else - { - // Handle oder markiertes Objekt getroffen - bFirstMouseMove = sal_True; - aDragTimer.Start(); - } - - if ( ! rMEvt.IsRight()) - mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog); - bReturn = sal_True; - } - else - { - if (!rMEvt.IsMod2() && mpView->PickObj(aMDPos, mpView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKMACRO)) - { - mpView->BegMacroObj(aMDPos, nHitLog, pObj, pPV, mpWindow); - bReturn = sal_True; - } - else if ( bTextEdit ) - { - sal_uInt16 nSdrObjKind = aVEvt.pObj->GetObjIdentifier(); - - if (aVEvt.pObj->GetObjInventor() == SdrInventor && - (nSdrObjKind == OBJ_TEXT || - nSdrObjKind == OBJ_TITLETEXT || - nSdrObjKind == OBJ_OUTLINETEXT || - !aVEvt.pObj->IsEmptyPresObj())) - { - // Seamless Editing: Verzweigen zur Texteingabe - if (!rMEvt.IsShift()) - mpView->UnmarkAll(); - - SfxUInt16Item aItem(SID_TEXTEDIT, 1); - mpViewShell->GetViewFrame()->GetDispatcher()-> - Execute(SID_TEXTEDIT, SFX_CALLMODE_SYNCHRON | - SFX_CALLMODE_RECORD, &aItem, 0L); - return bReturn; // VORSICHT, durch den synchronen Slot ist das objekt jetzt geloescht - } - } - else if ( !rMEvt.IsMod2() && rMEvt.GetClicks() == 1 && - aVEvt.eEvent == SDREVENT_EXECUTEURL ) - { - mpWindow->ReleaseMouse(); - SfxStringItem aStrItem(SID_FILE_NAME, aVEvt.pURLField->GetURL()); - SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName()); - SfxBoolItem aBrowseItem( SID_BROWSE, sal_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); - } - - bReturn = sal_True; - } - else if(!rMEvt.IsMod2() - && mpViewShell->ISA(DrawViewShell) - ) - { - if(mpView->PickObj(aMDPos, mpView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER)) - { - // Animate object when not just selecting. - if ( ! bSelectionOnly) - bReturn = AnimateObj(pObj, aMDPos); - - if (!bReturn && (pObj->ISA(SdrObjGroup) || pObj->ISA(E3dPolyScene))) - { - if(rMEvt.GetClicks() == 1) - { - // In die Gruppe hineinschauen - if (mpView->PickObj(aMDPos, mpView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER | SDRSEARCH_DEEP)) - bReturn = AnimateObj(pObj, aMDPos); - } - else if( !bReadOnly && rMEvt.GetClicks() == 2) - { - // Neu: Doppelklick auf selektiertes Gruppenobjekt - // Gruppe betreten - if ( ! bSelectionOnly - && pObj - && pObj->GetPage() == pPV->GetPage()) - bReturn = pPV->EnterGroup(pObj); - } - } - } - - // #i71727# replaced else here with two possibilities, once the original else (!pObj) - // and also ignoring the found object when it's on a masterpage - if(!pObj || (pObj->GetPage() && pObj->GetPage()->IsMasterPage())) - { - if(mpView->IsGroupEntered() && 2 == rMEvt.GetClicks()) - { - // New: double click on empty space/on obj on MasterPage, leave group - mpView->LeaveOneGroup(); - bReturn = sal_True; - } - } - } - - if (!bReturn) - { - if (bWaterCan) - { - if ( ! (rMEvt.IsShift() || rMEvt.IsMod2())) - { - // Find the object under the current mouse position - // and store it for the MouseButtonUp() method to - // evaluate. - pWaterCanCandidate = pickObject (aMDPos); - } - } - else - { - bReturn = sal_True; - sal_Bool bDeactivateOLE = sal_False; - - if ( !rMEvt.IsShift() && !rMEvt.IsMod2() ) - { - OSL_ASSERT (mpViewShell->GetViewShell()!=NULL); - Client* pIPClient = static_cast<Client*>( - mpViewShell->GetViewShell()->GetIPClient()); - - if (pIPClient && pIPClient->IsObjectInPlaceActive()) - { - // OLE-Objekt wird im nachfolgenden UnmarkAll() deaktiviert - bDeactivateOLE = sal_True; - } - - mpView->UnmarkAll(); - } - - sal_Bool bMarked = sal_False; - - if ( !rMEvt.IsMod1() && !bDeactivateOLE) - { - if ( rMEvt.IsMod2() ) - { - bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift() ); - } - else - { - sal_Bool bToggle = sal_False; - - if (rMEvt.IsShift() && mpView->GetMarkedObjectList().GetMarkCount() > 1) - { - // Bei Einfachselektion kein Toggle - bToggle = sal_True; - } - - bMarked = mpView->MarkObj(aMDPos, nHitLog, bToggle, sal_False); - } - } - - if( !bDeactivateOLE ) - { - if ( !bReadOnly && - bMarked && - (!rMEvt.IsShift() || mpView->IsMarkedHit(aMDPos, nHitLog))) - { - /********************************************************** - * Objekt verschieben - **********************************************************/ - aDragTimer.Start(); - - pHdl=mpView->PickHandle(aMDPos); - if ( ! rMEvt.IsRight()) - mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog); - } - else - { - /********************************************************** - * Objekt selektieren - **********************************************************/ - if ( ! rMEvt.IsRight()) - mpView->BegMarkObj(aMDPos); - } - } - - if( bMarked && bTempRotation && (nSlotId == SID_OBJECT_ROTATE) && !rMEvt.IsShift() && (rMEvt.GetClicks() != 2) ) - { - nSlotId = SID_OBJECT_SELECT; - Activate(); - } - } - } - } - } - else if ( !bReadOnly - && (rMEvt.IsLeft() || rMEvt.IsRight()) - && !mpView->IsAction()) - { - /********************************************************************** - * BEZIER-EDITOR - **********************************************************************/ - mpWindow->CaptureMouse(); - SdrViewEvent aVEvt; - SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); - - if (eHit == SDRHIT_HANDLE && aVEvt.pHdl->GetKind() == HDL_BWGT) - { - /****************************************************************** - * Handle draggen - ******************************************************************/ - if ( ! rMEvt.IsRight()) - mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog); - } - else if (eHit == SDRHIT_MARKEDOBJECT && nEditMode == SID_BEZIER_INSERT) - { - /****************************************************************** - * Klebepunkt einfuegen - ******************************************************************/ - mpView->BegInsObjPoint(aMDPos, rMEvt.IsMod1()); - } - else if (eHit == SDRHIT_MARKEDOBJECT && rMEvt.IsMod1()) - { - /****************************************************************** - * Klebepunkt selektieren - ******************************************************************/ - if (!rMEvt.IsShift()) - mpView->UnmarkAllPoints(); - - if ( ! rMEvt.IsRight()) - mpView->BegMarkPoints(aMDPos); - } - else if (eHit == SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() && !rMEvt.IsMod2()) - { - /****************************************************************** - * Objekt verschieben - ******************************************************************/ - if ( ! rMEvt.IsRight()) - mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, NULL, nDrgLog); - } - else if (eHit == SDRHIT_HANDLE) - { - /****************************************************************** - * Klebepunkt selektieren - ******************************************************************/ - if (!mpView->IsPointMarked(*aVEvt.pHdl) || rMEvt.IsShift()) - { - if (!rMEvt.IsShift()) - { - mpView->UnmarkAllPoints(); - pHdl = mpView->PickHandle(aMDPos); - } - else - { - if (mpView->IsPointMarked(*aVEvt.pHdl)) - { - mpView->UnmarkPoint(*aVEvt.pHdl); - pHdl = NULL; - } - else - { - pHdl = mpView->PickHandle(aMDPos); - } - } - - if (pHdl) - { - mpView->MarkPoint(*pHdl); - if ( ! rMEvt.IsRight()) - mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog); - } - } - else - { - // point IS marked and NO shift is pressed. Start - // dragging of selected point(s) - pHdl = mpView->PickHandle(aMDPos); - if(pHdl) - if ( ! rMEvt.IsRight()) - mpView->BegDragObj(aMDPos, (OutputDevice*)NULL, pHdl, nDrgLog); - } - } - else - { - /****************************************************************** - * Objekt selektieren oder draggen - ******************************************************************/ - if (!rMEvt.IsShift() && !rMEvt.IsMod2() && eHit == SDRHIT_UNMARKEDOBJECT) - { - mpView->UnmarkAllObj(); - } - - sal_Bool bMarked = sal_False; - - if (!rMEvt.IsMod1()) - { - if (rMEvt.IsMod2()) - { - bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift()); - } - else - { - bMarked = mpView->MarkObj(aMDPos, nHitLog, rMEvt.IsShift(), sal_False); - } - } - - if (bMarked && - (!rMEvt.IsShift() || eHit == SDRHIT_MARKEDOBJECT)) - { - // Objekt verschieben - if ( ! rMEvt.IsRight()) - mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog); - } - else if (mpView->AreObjectsMarked()) - { - /************************************************************** - * Klebepunkt selektieren - **************************************************************/ - if (!rMEvt.IsShift()) - mpView->UnmarkAllPoints(); - - if ( ! rMEvt.IsRight()) - mpView->BegMarkPoints(aMDPos); - } - else - { - /************************************************************** - * Objekt selektieren - **************************************************************/ - if ( ! rMEvt.IsRight()) - mpView->BegMarkObj(aMDPos); - } - - ForcePointer(&rMEvt); - } - } - - if (!bIsInDragMode) - { - ForcePointer(&rMEvt); - } - - return bReturn; -} - -/************************************************************************* -|* -|* MouseMove-event -|* -\************************************************************************/ - -sal_Bool FuSelection::MouseMove(const MouseEvent& rMEvt) -{ - sal_Bool bReturn = FuDraw::MouseMove(rMEvt); - - if (aDragTimer.IsActive()) - { - if(bFirstMouseMove) - { - bFirstMouseMove = sal_False; - } - else - { - aDragTimer.Stop(); - } - } - - if (mpView->IsAction()) - { - Point aPix(rMEvt.GetPosPixel()); - Point aPnt(mpWindow->PixelToLogic(aPix)); - - ForceScroll(aPix); - - if (mpView->IsInsObjPoint()) - { - mpView->MovInsObjPoint(aPnt); - } - else - { - mpView->MovAction(aPnt); - } - } - - ForcePointer(&rMEvt); - - return (bReturn); -} - -/************************************************************************* -|* -|* MouseButtonUp-event -|* -\************************************************************************/ - -sal_Bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) -{ - sal_Bool bReturn = sal_False; - // When the right mouse button is pressed then only select objects - // (and deselect others) as a preparation for showing the context - // menu. - const bool bSelectionOnly = rMEvt.IsRight(); - - if (bHideAndAnimate) - { - // Animation laeuft noch -> sofort returnieren - bHideAndAnimate = sal_False; - pHdl = NULL; - mpWindow->ReleaseMouse(); - return(sal_True); - } - - if (aDragTimer.IsActive() ) - { - aDragTimer.Stop(); - bIsInDragMode = sal_False; - } - - if( !mpView ) - return (sal_False); - - Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); - sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); - sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); - - if (mpView->IsFrameDragSingles() || !mpView->HasMarkablePoints()) - { - /********************************************************************** - * KEIN BEZIER_EDITOR - **********************************************************************/ - if ( mpView->IsDragObj() ) - { - /****************************************************************** - * Objekt wurde verschoben - ******************************************************************/ - FrameView* pFrameView = mpViewShell->GetFrameView(); - sal_Bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); - - if (bDragWithCopy) - { - bDragWithCopy = !mpView->IsPresObjSelected(sal_False, sal_True); - } - - mpView->SetDragWithCopy(bDragWithCopy); - mpView->EndDragObj( mpView->IsDragWithCopy() ); - - mpView->ForceMarkedToAnotherPage(); - - if (!rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() && - !bSelectionChanged && - Abs(aPnt.X() - aMDPos.X()) < nDrgLog && - Abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) - { - /************************************************************** - * Toggle zw. Selektion und Rotation - **************************************************************/ - SdrObject* pSingleObj = NULL; - sal_uLong nMarkCount = mpView->GetMarkedObjectList().GetMarkCount(); - - if (nMarkCount==1) - { - pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); - } - - if (nSlotId == SID_OBJECT_SELECT - && mpView->IsRotateAllowed() - - && (rMEvt.GetClicks() != 2) - && (mpViewShell->GetFrameView()->IsClickChangeRotation() - || (pSingleObj - && pSingleObj->GetObjInventor()==E3dInventor)) - && ! bSelectionOnly) - - { - bTempRotation = sal_True; - nSlotId = SID_OBJECT_ROTATE; - Activate(); - } - else if (nSlotId == SID_OBJECT_ROTATE) - { - nSlotId = SID_OBJECT_SELECT; - Activate(); - } - } - else if (nSlotId == SID_CONVERT_TO_3D_LATHE) - { - if (!pHdl) - { - bSuppressChangesOfSelection = sal_True; - mpView->Start3DCreation(); - bSuppressChangesOfSelection = sal_False; - } - else if (pHdl->GetKind() != HDL_MIRX && - pHdl->GetKind() != HDL_REF1 && - pHdl->GetKind() != HDL_REF2 && mpView->Is3DRotationCreationActive()) - { - /********************************************************* - * Wenn 3D-Rotationskoerper erstellt werden sollen, jetzt - * die Erstellung beenden - **********************************************************/ - long nAngle1 = GetAngle(aPnt - mpView->GetRef1()); - nAngle1 -= 27000; - nAngle1 = NormAngle360(nAngle1); - sal_Bool bMirrorSide1 = sal_Bool (nAngle1 < 18000L); - - if (bMirrorSide0 != bMirrorSide1) - { - bSuppressChangesOfSelection = sal_True; - if(mpWindow) - mpWindow->EnterWait(); - mpView->End3DCreation(); - bSuppressChangesOfSelection = sal_False; - nSlotId = SID_OBJECT_SELECT; - if(mpWindow) - mpWindow->LeaveWait(); - Activate(); - } - } - } - } - else if (rMEvt.IsMod1() - && !rMEvt.IsMod2() - && Abs(aPnt.X() - aMDPos.X()) < nDrgLog - && Abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) - { - // Gruppe betreten - mpView->MarkObj(aPnt, nHitLog, rMEvt.IsShift(), rMEvt.IsMod1()); - } - - if (mpView->IsAction() ) - { - mpView->EndAction(); - } - - if( SD_MOD()->GetWaterCan() ) - { - if( rMEvt.IsRight() ) - { - // Bei rechter Maustaste wird im Giesskannenmodus ein Undo ausgefuehrt - mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_UNDO, SFX_CALLMODE_ASYNCHRON ); - } - else if (pWaterCanCandidate != NULL) - { - // Is the candiate object still under the mouse? - if (pickObject (aPnt) == pWaterCanCandidate) - { - SdStyleSheetPool* pPool = static_cast<SdStyleSheetPool*>( - mpDocSh->GetStyleSheetPool()); - if (pPool != NULL) - { - SfxStyleSheet* pStyleSheet = static_cast<SfxStyleSheet*>( - pPool->GetActualStyleSheet()); - if (pStyleSheet != NULL && mpView->IsUndoEnabled() ) - { - // Added UNDOs for the WaterCan mode. This was never done in - // the past, thus it was missing all the time. - SdrUndoAction* pUndoAttr = mpDoc->GetSdrUndoFactory().CreateUndoAttrObject(*pWaterCanCandidate, sal_True, sal_True); - mpView->BegUndo(pUndoAttr->GetComment()); - mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoGeoObject(*pWaterCanCandidate)); - mpView->AddUndo(pUndoAttr); - - pWaterCanCandidate->SetStyleSheet (pStyleSheet, sal_False); - - mpView->EndUndo(); - } - } - } - } - // else when there has been no object under the mouse when the - // button was pressed then nothing happens even when there is - // one now. - } - - sal_uInt16 nClicks = rMEvt.GetClicks(); - - if (nClicks == 2 && rMEvt.IsLeft() && bMBDown && - !rMEvt.IsMod1() && !rMEvt.IsShift() ) - { - DoubleClick(rMEvt); - } - - bMBDown = sal_False; - - ForcePointer(&rMEvt); - pHdl = NULL; - mpWindow->ReleaseMouse(); - SdrObject* pSingleObj = NULL; - sal_uLong nMarkCount = mpView->GetMarkedObjectList().GetMarkCount(); - - if (nMarkCount==1) - { - pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); - } - - if ( (nSlotId != SID_OBJECT_SELECT && nMarkCount==0) || - ( mpView->GetDragMode() == SDRDRAG_CROOK && - !mpView->IsCrookAllowed( mpView->IsCrookNoContortion() ) ) || - ( mpView->GetDragMode() == SDRDRAG_SHEAR && - !mpView->IsShearAllowed() && !mpView->IsDistortAllowed() ) || - ( nSlotId==SID_CONVERT_TO_3D_LATHE && pSingleObj && - (pSingleObj->GetObjInventor() != SdrInventor || - pSingleObj->GetObjIdentifier() == OBJ_MEASURE) ) ) - { - bReturn = sal_True; - ForcePointer(&rMEvt); - pHdl = NULL; - mpWindow->ReleaseMouse(); - FuDraw::MouseButtonUp(rMEvt); - mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_SYNCHRON); - return bReturn; // VORSICHT, durch den synchronen Slot ist das objekt jetzt geloescht - } - - FuDraw::MouseButtonUp(rMEvt); - } - else - { - /********************************************************************** - * BEZIER_EDITOR - **********************************************************************/ - if ( mpView->IsAction() ) - { - if ( mpView->IsInsObjPoint() ) - { - mpView->EndInsObjPoint(SDRCREATE_FORCEEND); - } - else if ( mpView->IsDragObj() ) - { - FrameView* pFrameView = mpViewShell->GetFrameView(); - sal_Bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); - - if (bDragWithCopy) - { - bDragWithCopy = !mpView->IsPresObjSelected(sal_False, sal_True); - } - - mpView->SetDragWithCopy(bDragWithCopy); - mpView->EndDragObj( mpView->IsDragWithCopy() ); - } - else - { - mpView->EndAction(); - - sal_uInt16 nDrgLog2 = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); - Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() ); - - if (Abs(aMDPos.X() - aPos.X()) < nDrgLog2 && - Abs(aMDPos.Y() - aPos.Y()) < nDrgLog2 && - !rMEvt.IsShift() && !rMEvt.IsMod2()) - { - SdrViewEvent aVEvt; - SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); - - if (eHit == SDRHIT_NONE) - { - // Klick auf der Stelle: deselektieren - mpView->UnmarkAllObj(); - } - } - } - } - else if (!rMEvt.IsShift() && rMEvt.IsMod1() && !rMEvt.IsMod2() && - Abs(aPnt.X() - aMDPos.X()) < nDrgLog && - Abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) - { - // Gruppe betreten - mpView->MarkObj(aPnt, nHitLog, sal_False, rMEvt.IsMod1()); - } - - - ForcePointer(&rMEvt); - pHdl = NULL; - mpWindow->ReleaseMouse(); - - FuDraw::MouseButtonUp(rMEvt); - } - - return (bReturn); -} - -/************************************************************************* -|* -|* Tastaturereignisse bearbeiten -|* -|* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls -|* sal_False. -|* -\************************************************************************/ - -sal_Bool FuSelection::KeyInput(const KeyEvent& rKEvt) -{ - sal_Bool bReturn = sal_False; - - switch (rKEvt.GetKeyCode().GetCode()) - { - case KEY_ESCAPE: - { - bReturn = FuSelection::cancel(); - } - break; - } - - if (!bReturn) - { - bReturn = FuDraw::KeyInput(rKEvt); - - if(mpView->GetMarkedObjectList().GetMarkCount() == 0) - { - mpView->ResetCreationActive(); - - mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD); - } - } - - return(bReturn); - -} - - -/************************************************************************* -|* -|* Function aktivieren -|* -\************************************************************************/ - -void FuSelection::Activate() -{ - SdrDragMode eMode; - mpView->ResetCreationActive(); - mpView->SetEditMode(SDREDITMODE_EDIT); - - switch( nSlotId ) - { - case SID_OBJECT_ROTATE: - { - // (gemapter) Slot wird explizit auf Rotate gesetzt - if( mpViewShell->ISA(DrawViewShell) ) - { - sal_uInt16* pSlotArray = - static_cast<DrawViewShell*>(mpViewShell)->GetSlotArray(); - pSlotArray[ 1 ] = SID_OBJECT_ROTATE; - } - - eMode = SDRDRAG_ROTATE; - - if ( mpView->GetDragMode() != eMode ) - mpView->SetDragMode(eMode); - } - break; - - case SID_OBJECT_MIRROR: - { - eMode = SDRDRAG_MIRROR; - - if ( mpView->GetDragMode() != eMode ) - mpView->SetDragMode(eMode); - } - break; - - case SID_OBJECT_CROP: - { - eMode = SDRDRAG_CROP; - - if ( mpView->GetDragMode() != eMode ) - mpView->SetDragMode(eMode); - } - break; - - case SID_OBJECT_TRANSPARENCE: - { - eMode = SDRDRAG_TRANSPARENCE; - - if ( mpView->GetDragMode() != eMode ) - mpView->SetDragMode(eMode); - } - break; - - case SID_OBJECT_GRADIENT: - { - eMode = SDRDRAG_GRADIENT; - - if ( mpView->GetDragMode() != eMode ) - mpView->SetDragMode(eMode); - } - break; - - case SID_OBJECT_SHEAR: - { - eMode = SDRDRAG_SHEAR; - - if ( mpView->GetDragMode() != eMode ) - mpView->SetDragMode(eMode); - } - break; - - case SID_OBJECT_CROOK_ROTATE: - { - eMode = SDRDRAG_CROOK; - - if ( mpView->GetDragMode() != eMode ) - { - mpView->SetDragMode(eMode); - mpView->SetCrookMode(SDRCROOK_ROTATE); - } - } - break; - - case SID_OBJECT_CROOK_SLANT: - { - eMode = SDRDRAG_CROOK; - - if ( mpView->GetDragMode() != eMode ) - { - mpView->SetDragMode(eMode); - mpView->SetCrookMode(SDRCROOK_SLANT); - } - } - break; - - case SID_OBJECT_CROOK_STRETCH: - { - eMode = SDRDRAG_CROOK; - - if ( mpView->GetDragMode() != eMode ) - { - mpView->SetDragMode(eMode); - mpView->SetCrookMode(SDRCROOK_STRETCH); - } - } - break; - - case SID_CONVERT_TO_3D_LATHE: - { - eMode = SDRDRAG_MIRROR; - bSuppressChangesOfSelection = sal_True; - - if ( mpView->GetDragMode() != eMode ) - mpView->SetDragMode(eMode); - - if (!mpView->Is3DRotationCreationActive()) - mpView->Start3DCreation(); - - bSuppressChangesOfSelection = sal_False; - } - break; - - default: - { - eMode = SDRDRAG_MOVE; - - if ( mpView->GetDragMode() != eMode ) - mpView->SetDragMode(eMode); - } - break; - } - - if (nSlotId != SID_OBJECT_ROTATE) - { - bTempRotation = sal_False; - } - - FuDraw::Activate(); -} - - - -/************************************************************************* -|* -|* Function deaktivieren -|* -\************************************************************************/ - -void FuSelection::Deactivate() -{ - FuDraw::Deactivate(); -} - - -/************************************************************************* -|* -|* Selektion hat sich geaendert -|* -\************************************************************************/ - -void FuSelection::SelectionHasChanged() -{ - bSelectionChanged = sal_True; - - FuDraw::SelectionHasChanged(); - - if ((mpView->Is3DRotationCreationActive() && !bSuppressChangesOfSelection)) - { - // Wechsel Rotationskoerper -> Selektion - mpView->ResetCreationActive(); - nSlotId = SID_OBJECT_SELECT; - Activate(); - } - - // Activate the right tool bar for the current context of the view. - mpViewShell->GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*mpViewShell, *mpView); -} - - -/************************************************************************* -|* -|* Aktuellen Bezier-Editmodus setzen -|* -\************************************************************************/ - -void FuSelection::SetEditMode(sal_uInt16 nMode) -{ - nEditMode = nMode; - - if (nEditMode == SID_BEZIER_INSERT) - { - mpView->SetInsObjPointMode(sal_True); - } - else - { - mpView->SetInsObjPointMode(sal_False); - } - - ForcePointer(); - - SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings(); - rBindings.Invalidate(SID_BEZIER_MOVE); - rBindings.Invalidate(SID_BEZIER_INSERT); -} - -/************************************************************************* -|* -|* Animation oder Interaktion ausfuehren -|* -\************************************************************************/ - -sal_Bool FuSelection::AnimateObj(SdrObject* pObj, const Point& rPos) -{ - sal_Bool bAnimated = sal_False; - sal_Bool bClosed = pObj->IsClosedObj(); - sal_Bool bFilled = sal_False; - - if (bClosed) - { - SfxItemSet aSet(mpDoc->GetPool()); - - aSet.Put(pObj->GetMergedItemSet()); - - const XFillStyleItem& rFillStyle = (const XFillStyleItem&) aSet.Get(XATTR_FILLSTYLE); - bFilled = rFillStyle.GetValue() != XFILL_NONE; - } - - const SetOfByte* pVisiLayer = &mpView->GetSdrPageView()->GetVisibleLayers(); - sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); - const long n2HitLog = nHitLog * 2; - Point aHitPosR(rPos); - Point aHitPosL(rPos); - Point aHitPosT(rPos); - Point aHitPosB(rPos); - - aHitPosR.X() += n2HitLog; - aHitPosL.X() -= n2HitLog; - aHitPosT.Y() += n2HitLog; - aHitPosB.Y() -= n2HitLog; - - if ( !bClosed || - !bFilled || - (SdrObjectPrimitiveHit(*pObj, aHitPosR, nHitLog, *mpView->GetSdrPageView(), pVisiLayer, false) && - SdrObjectPrimitiveHit(*pObj, aHitPosL, nHitLog, *mpView->GetSdrPageView(), pVisiLayer, false) && - SdrObjectPrimitiveHit(*pObj, aHitPosT, nHitLog, *mpView->GetSdrPageView(), pVisiLayer, false) && - SdrObjectPrimitiveHit(*pObj, aHitPosB, nHitLog, *mpView->GetSdrPageView(), pVisiLayer, false) ) ) - { - if ( mpDoc->GetIMapInfo( pObj ) ) - { - const IMapObject* pIMapObj = mpDoc->GetHitIMapObject( pObj, rPos, *mpWindow ); - - if ( pIMapObj && pIMapObj->GetURL().Len() ) - { - // Sprung zu Dokument - mpWindow->ReleaseMouse(); - SfxStringItem aStrItem(SID_FILE_NAME, pIMapObj->GetURL()); - SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName()); - SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); - SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame); - SfxBoolItem aBrowseItem( SID_BROWSE, sal_True ); - mpWindow->ReleaseMouse(); - pFrame->GetDispatcher()-> - Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, - &aStrItem, &aFrameItem, &aBrowseItem, &aReferer, 0L); - - bAnimated = sal_True; - } - } - else if (!mpDocSh->ISA(GraphicDocShell) && - mpView->ISA(DrawView) && - mpDoc->GetAnimationInfo(pObj)) - { - /********************************************************** - * Animations-Objekt in der Mitte getroffen -> Interaktion - **********************************************************/ - SdAnimationInfo* pInfo = mpDoc->GetAnimationInfo(pObj); - DrawViewShell* pDrViewSh = static_cast<DrawViewShell*>(mpViewShell); - mpWindow->ReleaseMouse(); - - switch (pInfo->meClickAction) - { - case presentation::ClickAction_BOOKMARK: - { - // Sprung zu Bookmark (Seite oder Objekt) - SfxStringItem aItem(SID_NAVIGATOR_OBJECT, pInfo->GetBookmark()); - mpViewShell->GetViewFrame()->GetDispatcher()-> - Execute(SID_NAVIGATOR_OBJECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aItem, 0L); - bAnimated = sal_True; - } - break; - - case presentation::ClickAction_DOCUMENT: - { - String sBookmark( pInfo->GetBookmark() ); - // Sprung zu Dokument - if (sBookmark.Len()) - { - SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName()); - SfxStringItem aStrItem(SID_FILE_NAME, sBookmark); - SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); - SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame); - SfxBoolItem aBrowseItem( SID_BROWSE, sal_True ); - pFrame->GetDispatcher()-> - Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, - &aStrItem, &aFrameItem, &aBrowseItem, &aReferer, 0L); - } - - bAnimated = sal_True; - } - break; - - case presentation::ClickAction_PREVPAGE: - { - // Sprung zur vorherigen Seite - SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_PREVIOUS); - mpViewShell->GetViewFrame()->GetDispatcher()-> - Execute(SID_NAVIGATOR_PAGE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, - &aItem, 0L); - bAnimated = sal_True; - } - break; - - case presentation::ClickAction_NEXTPAGE: - { - // Sprung zur naechsten Seite - SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_NEXT); - mpViewShell->GetViewFrame()->GetDispatcher()-> - Execute(SID_NAVIGATOR_PAGE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, - &aItem, 0L); - bAnimated = sal_True; - } - break; - - case presentation::ClickAction_FIRSTPAGE: - { - // Sprung zu erster Seite - SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_FIRST); - mpViewShell->GetViewFrame()->GetDispatcher()-> - Execute(SID_NAVIGATOR_PAGE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, - &aItem, 0L); - bAnimated = sal_True; - } - break; - - case presentation::ClickAction_LASTPAGE: - { - // Sprung zu letzter Seite - SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_LAST); - mpViewShell->GetViewFrame()->GetDispatcher()-> - Execute(SID_NAVIGATOR_PAGE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, - &aItem, 0L); - bAnimated = sal_True; - } - break; - - case presentation::ClickAction_SOUND: - { - try - { - mxPlayer.set( avmedia::MediaWindow::createPlayer( pInfo->GetBookmark()), uno::UNO_QUERY_THROW ); - mxPlayer->start(); - } - catch( uno::Exception& e ) - { - (void)e; - } - bAnimated = sal_True; - } - break; - - case presentation::ClickAction_VERB: - { - // Verb zuweisen - mpView->UnmarkAll(); - mpView->MarkObj(pObj, mpView->GetSdrPageView(), sal_False, sal_False); - pDrViewSh->DoVerb((sal_Int16)pInfo->mnVerb); - bAnimated = sal_True; - } - break; - - case presentation::ClickAction_PROGRAM: - { - String aBaseURL = GetDocSh()->GetMedium()->GetBaseURL(); - INetURLObject aURL( ::URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), pInfo->GetBookmark(), - URIHelper::GetMaybeFileHdl(), true, false, - INetURLObject::WAS_ENCODED, INetURLObject::DECODE_UNAMBIGUOUS ) ); - - if( INET_PROT_FILE == aURL.GetProtocol() ) - { - SfxStringItem aUrl( SID_FILE_NAME, aURL.GetMainURL( INetURLObject::NO_DECODE ) ); - SfxBoolItem aBrowsing( SID_BROWSE, sal_True ); - - SfxViewFrame* pViewFrm = SfxViewFrame::Current(); - if (pViewFrm) - pViewFrm->GetDispatcher()->Execute( SID_OPENDOC, - SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, - &aUrl, - &aBrowsing, - 0L ); - } - - bAnimated = sal_True; - } - break; - - case presentation::ClickAction_MACRO: - { - // Execute makro - String aMacro = pInfo->GetBookmark(); - - if ( SfxApplication::IsXScriptURL( aMacro ) ) - { - uno::Any aRet; - uno::Sequence< sal_Int16 > aOutArgsIndex; - uno::Sequence< uno::Any > aOutArgs; - uno::Sequence< uno::Any >* pInArgs = - new uno::Sequence< uno::Any >(0); - - ErrCode eErr = mpDocSh->CallXScript( aMacro, - *pInArgs, aRet, aOutArgsIndex, aOutArgs); - - // Check the return value from the script - sal_Bool bTmp = sal_False; - if ( eErr == ERRCODE_NONE && - aRet.getValueType() == getCppuBooleanType() && - sal_True == ( aRet >>= bTmp ) && - bTmp == sal_True ) - { - bAnimated = sal_True; - } - else - { - bAnimated = sal_False; - } - } - else - { - // aMacro has got following format: - // "Macroname.Modulname.Libname.Documentname" or - // "Macroname.Modulname.Libname.Applicationsname" - String aMacroName = - aMacro.GetToken(0, sal_Unicode('.')); - String aModulName = - aMacro.GetToken(1, sal_Unicode('.')); - String aLibName = - aMacro.GetToken(2, sal_Unicode('.')); - String aDocName = - aMacro.GetToken(3, sal_Unicode('.')); - - // In this moment the Call-method only - // resolves modulename+macroname - String aExecMacro(aModulName); - aExecMacro.Append( sal_Unicode('.') ); - aExecMacro.Append( aMacroName ); - bAnimated = mpDocSh->GetBasic()->Call(aExecMacro); - } - } - break; - - default: - { - bAnimated = sal_False; - } - break; - } - } - - if (!bAnimated && - mpView->ISA(DrawView) && - !mpDocSh->ISA(GraphicDocShell) && - SlideShow::IsRunning( mpViewShell->GetViewShellBase() ) && - mpDoc->GetAnimationInfo(pObj)) - { - /********************************************************** - * Effekt-Objekt in der Mitte getroffen -> Effekt abspielen - **********************************************************/ - SdAnimationInfo* pInfo = mpDoc->GetAnimationInfo(pObj); - - switch (pInfo->meClickAction) - { - case presentation::ClickAction_VANISH: - case presentation::ClickAction_INVISIBLE: - break; - - default: - bAnimated = sal_False; - break; - } - } - } - - return bAnimated; -} - - - -/** 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 FuSelection::cancel() -{ - if (mpView->Is3DRotationCreationActive()) - { - mpView->ResetCreationActive(); - mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD); - return true; - } - else - { - return false; - } -} - - - - -SdrObject* FuSelection::pickObject (const Point& rTestPoint) -{ - SdrObject* pObject = NULL; - SdrPageView* pPageView; - sal_uInt16 nHitLog = sal_uInt16 (mpWindow->PixelToLogic(Size(HITPIX,0)).Width()); - mpView->PickObj (rTestPoint, nHitLog, pObject, pPageView, SDRSEARCH_PICKMARKABLE); - return pObject; -} -} // end of namespace sd - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |