1
0
Fork 0
libreoffice/sc/source/ui/drawfunc/fusel2.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

148 lines
5.3 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#include <svx/svditer.hxx>
#include <svx/svdpagv.hxx>
#include <fusel.hxx>
#include <tabvwsh.hxx>
#include <document.hxx>
#include <detfunc.hxx>
#include <attrib.hxx>
#include <scitems.hxx>
#include <userdat.hxx>
#include <drwlayer.hxx>
#include <docsh.hxx>
#include <drawview.hxx>
#include <svx/sdrhittesthelper.hxx>
static tools::Long Diff( const Point& rP1, const Point& rP2 )
{
tools::Long nX = rP1.X() - rP2.X();
if (nX<0) nX = -nX;
tools::Long nY = rP1.Y() - rP2.Y();
if (nY<0) nY = -nY;
return nX+nY;
}
bool FuSelection::TestDetective( const SdrPageView* pPV, const Point& rPos )
{
if (!pPV)
return false;
bool bFound = false;
SdrObjListIter aIter( pPV->GetObjList(), SdrIterMode::Flat );
SdrObject* pObject = aIter.Next();
while (pObject && !bFound)
{
if (ScDetectiveFunc::IsNonAlienArrow( pObject ))
{
double fHitLog = pWindow->PixelToLogic(Size(pView->GetHitTolerancePixel(),0)).Width();
if (SdrObjectPrimitiveHit(*pObject, rPos, {fHitLog, fHitLog}, *pPV, nullptr, false))
{
ScViewData& rViewData = rViewShell.GetViewData();
ScSplitPos ePos = rViewShell.FindWindow( pWindow );
Point aLineStart = pObject->GetPoint(0);
Point aLineEnd = pObject->GetPoint(1);
Point aPixel = pWindow->LogicToPixel( aLineStart );
SCCOL nStartCol;
SCROW nStartRow;
rViewData.GetPosFromPixel( aPixel.X(), aPixel.Y(), ePos, nStartCol, nStartRow );
aPixel = pWindow->LogicToPixel( aLineEnd );
SCCOL nEndCol;
SCROW nEndRow;
rViewData.GetPosFromPixel( aPixel.X(), aPixel.Y(), ePos, nEndCol, nEndRow );
SCCOL nCurX = rViewData.GetCurX();
SCROW nCurY = rViewData.GetCurY();
bool bStart = ( Diff( rPos,aLineStart ) > Diff( rPos,aLineEnd ) );
if ( nCurX == nStartCol && nCurY == nStartRow )
bStart = false;
else if ( nCurX == nEndCol && nCurY == nEndRow )
bStart = true;
SCCOL nDifX;
SCROW nDifY;
if ( bStart )
{
nDifX = nStartCol - nCurX;
nDifY = nStartRow - nCurY;
}
else
{
nDifX = nEndCol - nCurX;
nDifY = nEndRow - nCurY;
}
rViewShell.MoveCursorRel( nDifX, nDifY, SC_FOLLOW_JUMP, false );
bFound = true;
}
}
pObject = aIter.Next();
}
return bFound;
}
bool FuSelection::IsNoteCaptionMarked() const
{
if( pView )
{
const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
if( rMarkList.GetMarkCount() == 1 )
{
SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
return ScDrawLayer::IsNoteCaption( pObj );
}
}
return false;
}
bool FuSelection::IsNoteCaptionClicked( const Point& rPos ) const
{
SdrPageView* pPageView = pView ? pView->GetSdrPageView() : nullptr;
if( pPageView )
{
const ScViewData& rViewData = rViewShell.GetViewData();
ScDocument& rDoc = rViewData.GetDocument();
SCTAB nTab = rViewData.GetTabNo();
ScDocShell* pDocSh = rViewData.GetDocShell();
bool bProtectDoc = rDoc.IsTabProtected( nTab ) || (pDocSh && pDocSh->IsReadOnly());
// search the last object (on top) in the object list
SdrObjListIter aIter( pPageView->GetObjList(), SdrIterMode::DeepNoGroups, true );
for( SdrObject* pObj = aIter.Next(); pObj; pObj = aIter.Next() )
{
if( pObj->GetLogicRect().Contains( rPos ) )
{
if( const ScDrawObjData* pCaptData = ScDrawLayer::GetNoteCaptionData( pObj, nTab ) )
{
const ScAddress& rNotePos = pCaptData->maStart;
// skip caption objects of notes in protected cells
const ScProtectionAttr* pProtAttr = rDoc.GetAttr( rNotePos.Col(), rNotePos.Row(), nTab, ATTR_PROTECTION );
bool bProtectAttr = pProtAttr->GetProtection() || pProtAttr->GetHideCell();
if( !bProtectAttr || !bProtectDoc )
return true;
}
}
}
}
return false;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */