Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/LibreOffice/reportdesign/source/ui/report/   (Office von Apache Version 25.8.3.2©)  Datei vom 5.10.2025 mit Größe 29 kB image not shown  

Quelle  ReportSection.cxx   Sprache: 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 <memory>
#include <ReportSection.hxx>
#include <ReportWindow.hxx>
#include <DesignView.hxx>
#include <strings.hxx>
#include <RptObject.hxx>
#include <RptModel.hxx>
#include <SectionView.hxx>
#include <RptPage.hxx>
#include <ReportController.hxx>
#include <UITools.hxx>
#include <ViewsWindow.hxx>

#include <svx/svdpagv.hxx>
#include <editeng/adjustitem.hxx>
#include <editeng/eeitem.hxx>
#include <svx/sdrpaintwindow.hxx>
#include <svx/gallery.hxx>
#include <svx/svxids.hrc>
#include <svx/svditer.hxx>
#include <svx/dbaexchange.hxx>
#include <svx/sdtagitm.hxx>

#include <com/sun/star/awt/PopupMenuDirection.hpp>
#include <com/sun/star/frame/XPopupMenuController.hpp>
#include <comphelper/propertyvalue.hxx>
#include <toolkit/awt/vclxmenu.hxx>
#include <comphelper/diagnose_ex.hxx>
#include <RptDef.hxx>
#include <SectionWindow.hxx>
#include <helpids.h>
#include <dlgedclip.hxx>
#include <rptui_slotid.hrc>

#include <utility>
#include <vcl/commandevent.hxx>
#include <vcl/unohelp.hxx>
#include <o3tl/safeint.hxx>

#include <svl/itempool.hxx>
#include <svtools/extcolorcfg.hxx>


namespace rptui
{

using namespace ::com::sun::star;


static Color lcl_getOverlappedControlColor(/*const uno::Reference <lang::XMultiServiceFactory> _rxFactory*/)
{
    svtools::ExtendedColorConfig aConfig;
    return aConfig.GetColorValue(CFG_REPORTDESIGNER, DBOVERLAPPEDCONTROL).getColor();
}

OReportSection::OReportSection(OSectionWindow* _pParent,uno::Reference< report::XSection > _xSection)
    : Window(_pParent,WB_DIALOGCONTROL)
    , ::comphelper::OPropertyChangeListener()
    , DropTargetHelper(this)
    , m_pPage(nullptr)
    , m_pView(nullptr)
    , m_pParent(_pParent)
    , m_xSection(std::move(_xSection))
    , m_nPaintEntranceCount(0)
    , m_eMode(DlgEdMode::Select)
{
    //EnableChildTransparentMode();
    SetHelpId(HID_REPORTSECTION);
    SetMapMode(MapMode(MapUnit::Map100thMM));
    SetParentClipMode(ParentClipMode::Clip);
    EnableChildTransparentMode( false );
    SetPaintTransparent( false );

    try
    {
        fill();
    }
    catch(uno::Exception&)
    {
        TOOLS_WARN_EXCEPTION( "reportdesign""");
    }

    m_pFunc.reset(new DlgEdFuncSelect( this ));
    m_pFunc->setOverlappedControlColor(lcl_getOverlappedControlColor() );
}

OReportSection::~OReportSection()
{
    disposeOnce();
}

void OReportSection::dispose()
{
    m_pPage = nullptr;
    if ( m_pMulti.is() )
        m_pMulti->dispose();
    m_pMulti.clear();

    if ( m_pReportListener.is() )
        m_pReportListener->dispose();
    m_pReportListener.clear();
    m_pFunc.reset();

    {
        if ( m_pView )
            m_pView->EndListening( *m_pModel );
        delete m_pView;
        m_pView = nullptr;
    }
    m_pParent.reset();
    vcl::Window::dispose();
}

void OReportSection::Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect )
{
    Window::Paint(rRenderContext, rRect);

    if ( !(m_pView && m_nPaintEntranceCount == 0))
        return;

    ++m_nPaintEntranceCount;
     // repaint, get PageView and prepare Region
    SdrPageView* pPgView = m_pView->GetSdrPageView();
    const vcl::Region aPaintRectRegion(rRect);

    // #i74769#
    SdrPaintWindow* pTargetPaintWindow = nullptr;

    // mark repaint start
    if (pPgView)
    {
        pTargetPaintWindow = pPgView->GetView().BeginDrawLayers(GetOutDev(), aPaintRectRegion);
        assert(pTargetPaintWindow && "BeginDrawLayers: Got no SdrPaintWindow (!)");
        // draw background self using wallpaper
        OutputDevice& rTargetOutDev = pTargetPaintWindow->GetTargetOutputDevice();
        rTargetOutDev.DrawWallpaper(rRect, Wallpaper(pPgView->GetApplicationDocumentColor()));

        // do paint (unbuffered) and mark repaint end
        pPgView->DrawLayer(RPT_LAYER_FRONT, &rRenderContext);
        pPgView->GetView().EndDrawLayers(*pTargetPaintWindow, true);
    }

    m_pView->CompleteRedraw(&rRenderContext, aPaintRectRegion);
    --m_nPaintEntranceCount;
}

void OReportSection::fill()
{
    if ( !m_xSection.is() )
        return;

    m_pMulti = new comphelper::OPropertyChangeMultiplexer(this,m_xSection);
    m_pMulti->addProperty(PROPERTY_BACKCOLOR);

    m_pReportListener = addStyleListener(m_xSection->getReportDefinition(),this);

    m_pModel = m_pParent->getViewsWindow()->getView()->getReportView()->getController().getSdrModel();
    m_pPage = m_pModel->getPage(m_xSection);

    m_pView = new OSectionView(
        *m_pModel,
        this,
        m_pParent->getViewsWindow()->getView());

    // #i93597# tell SdrPage that only left and right page border is defined
    // instead of the full rectangle definition
    m_pPage->setPageBorderOnlyLeftRight(true);

    // without the following call, no grid is painted
    m_pView->ShowSdrPage( m_pPage );

    m_pView->SetMoveSnapOnlyTopLeft( true );
    ODesignView* pDesignView = m_pParent->getViewsWindow()->getView()->getReportView();

    // #i93595# Adapted grid to a more coarse grid and subdivisions for better visualisation. This
    // is only for visualisation and has nothing to do with the actual snap
    const Size aGridSizeCoarse(pDesignView->getGridSizeCoarse());
    const Size aGridSizeFine(pDesignView->getGridSizeFine());
    m_pView->SetGridCoarse(aGridSizeCoarse);
    m_pView->SetGridFine(aGridSizeFine);

    // #i93595# set snap grid width to snap to all existing subdivisions
    const Fraction aX(aGridSizeFine.Width());
    const Fraction aY(aGridSizeFine.Height());
    m_pView->SetSnapGridWidth(aX, aY);

    m_pView->SetGridSnap( true );
    m_pView->SetGridFront( false );
    m_pView->SetDragStripes( true );
    m_pView->SetPageVisible();
    sal_Int32 nColor = m_xSection->getBackColor();
    if ( nColor == static_cast<sal_Int32>(COL_TRANSPARENT) )
        nColor = getStyleProperty<sal_Int32>(m_xSection->getReportDefinition(),PROPERTY_BACKCOLOR);
    m_pView->SetApplicationDocumentColor(Color(ColorTransparency, nColor));

    uno::Reference<report::XReportDefinition> xReportDefinition = m_xSection->getReportDefinition();
    const sal_Int32 nLeftMargin = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_LEFTMARGIN);
    const sal_Int32 nRightMargin = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_RIGHTMARGIN);
    m_pPage->SetLeftBorder(nLeftMargin);
    m_pPage->SetRightBorder(nRightMargin);

// LLA: TODO
//  m_pPage->SetUpperBorder(-10000);

    m_pView->SetDesignMode();

    m_pPage->SetSize( Size( getStyleProperty<awt::Size>(xReportDefinition,PROPERTY_PAPERSIZE).Width,5*m_xSection->getHeight()) );
    const Size aPageSize = m_pPage->GetSize();
    m_pView->SetWorkArea( tools::Rectangle( Point( nLeftMargin, 0), Size(aPageSize.Width() - nLeftMargin - nRightMargin,aPageSize.Height()) ) );
}

void OReportSection::Paste(const uno::Sequence< beans::NamedValue >& _aAllreadyCopiedObjects,bool _bForce)
{
    OSL_ENSURE(m_xSection.is(),"Why is the section here NULL!");
    if ( !(m_xSection.is() && _aAllreadyCopiedObjects.hasElements()) )
        return;

    // stop all drawing actions
    m_pView->BrkAction();

    // unmark all objects
    m_pView->UnmarkAll();
    const OUString sSectionName = m_xSection->getName();
    for(const beans::NamedValue& rObject : _aAllreadyCopiedObjects)
    {
        if ( _bForce || rObject.Name == sSectionName)
        {
            try
            {
                uno::Sequence< uno::Reference<report::XReportComponent> > aCopies;
                rObject.Value >>= aCopies;
                for (const uno::Reference<report::XReportComponent>& rCopy : aCopies)
                {
                    SdrObject* pObject = SdrObject::getSdrObjectFromXShape( rCopy );
                    if ( pObject )
                    {
                        // Clone to target SdrModel
                        rtl::Reference<SdrObject> pNewObj(pObject->CloneSdrObject(*m_pModel));
                        m_pPage->InsertObject(pNewObj.get(), SAL_MAX_SIZE);
                        tools::Rectangle aRet(vcl::unohelper::ConvertToVCLPoint(rCopy->getPosition()),
                                              vcl::unohelper::ConvertToVCLSize(rCopy->getSize()));
                        aRet.setHeight(aRet.getOpenHeight() + 1);
                        aRet.setWidth(aRet.getOpenWidth() + 1);
                        bool bOverlapping = true;
                        while ( bOverlapping )
                        {
                            bOverlapping = isOver(aRet,*m_pPage,*m_pView,true,pNewObj.get()) != nullptr;
                            if ( bOverlapping )
                            {
                                aRet.Move(0,aRet.getOpenHeight()+1);
                                pNewObj->SetLogicRect(aRet);
                            }
                        }
                        m_pView->AddUndo(m_pView->GetModel().GetSdrUndoFactory().CreateUndoNewObject(*pNewObj));
                        m_pView->MarkObj( pNewObj.get(), m_pView->GetSdrPageView() );
                        if ( m_xSection.is() && (o3tl::make_unsigned(aRet.getOpenHeight() + aRet.Top()) > m_xSection->getHeight()) )
                            m_xSection->setHeight(aRet.getOpenHeight() + aRet.Top());
                    }
                }
            }
            catch(uno::Exception&)
            {
                TOOLS_WARN_EXCEPTION( "reportdesign""Exception caught while pasting a new object!");
            }
            if ( !_bForce )
                break;
        }
    }
}

void OReportSection::Delete()
{
    if( m_pView->GetMarkedObjectList().GetMarkCount() == 0 )
        return;

    m_pView->BrkAction();
    m_pView->DeleteMarked();
}

void OReportSection::SetMode( DlgEdMode eNewMode )
{
    if ( eNewMode == m_eMode )
        return;

    if ( eNewMode == DlgEdMode::Insert )
    {
        m_pFunc.reset(new DlgEdFuncInsert( this ));
    }
    else
    {
        m_pFunc.reset(new DlgEdFuncSelect( this ));
    }
    m_pFunc->setOverlappedControlColor(lcl_getOverlappedControlColor( ) );
    m_pModel->SetReadOnly(false);
    m_eMode = eNewMode;
}

void OReportSection::Copy(uno::Sequence< beans::NamedValue >& _rAllreadyCopiedObjects)
{
    Copy(_rAllreadyCopiedObjects,false);
}

void OReportSection::Copy(uno::Sequence< beans::NamedValue >& _rAllreadyCopiedObjects,bool _bEraseAnddNoClone)
{
    OSL_ENSURE(m_xSection.is(),"Why is the section here NULL!");
    if( m_pView->GetMarkedObjectList().GetMarkCount() == 0 || !m_xSection.is() )
        return;

    // insert control models of marked objects into clipboard dialog model
    const SdrMarkList& rMarkedList = m_pView->GetMarkedObjectList();
    const size_t nMark = rMarkedList.GetMarkCount();

    ::std::vector< uno::Reference<report::XReportComponent> > aCopies;
    aCopies.reserve(nMark);

    SdrUndoFactory& rUndo = m_pView->GetModel().GetSdrUndoFactory();

    for( size_t i = nMark; i > 0; )
    {
        --i;
        SdrObject* pSdrObject = rMarkedList.GetMark(i)->GetMarkedSdrObj();
        OObjectBase* pObj = dynamic_cast<OObjectBase*>(pSdrObject);
        if ( pObj  )
        {
            try
            {
                rtl::Reference<SdrObject> pNewObj(pSdrObject->CloneSdrObject(pSdrObject->getSdrModelFromSdrObject()));
                aCopies.emplace_back(pNewObj->getUnoShape(),uno::UNO_QUERY);
                if ( _bEraseAnddNoClone )
                {
                    m_pView->AddUndo( rUndo.CreateUndoDeleteObject( *pSdrObject ) );
                    m_pPage->RemoveObject(pSdrObject->GetOrdNum());
                }

            }
            catch(uno::Exception&)
            {
                OSL_FAIL("Can't copy report elements!");
            }
        }
    }

    if ( !aCopies.empty() )
    {
        ::std::reverse(aCopies.begin(),aCopies.end());
        const sal_Int32 nLength = _rAllreadyCopiedObjects.getLength();
        _rAllreadyCopiedObjects.realloc( nLength + 1);
        beans::NamedValue* pNewValue = _rAllreadyCopiedObjects.getArray() + nLength;
        pNewValue->Name = m_xSection->getName();
        pNewValue->Value <<= uno::Sequence< uno::Reference<report::XReportComponent> >(&(*aCopies.begin()),aCopies.size());
    }
}

void OReportSection::MouseButtonDown( const MouseEvent& rMEvt )
{
    m_pParent->getViewsWindow()->getView()->setMarked(m_pView, true); // mark the section in which is clicked
    m_pFunc->MouseButtonDown( rMEvt );
    Window::MouseButtonDown(rMEvt);
}

void OReportSection::MouseButtonUp( const MouseEvent& rMEvt )
{
    if ( !m_pFunc->MouseButtonUp( rMEvt ) )
        m_pParent->getViewsWindow()->getView()->getReportView()->getController().executeUnChecked(SID_OBJECT_SELECT,uno::Sequence< beans::PropertyValue>());
}


void OReportSection::MouseMove( const MouseEvent& rMEvt )
{
    m_pFunc->MouseMove( rMEvt );

}

void OReportSection::SetGridVisible(bool _bVisible)
{
    m_pView->SetGridVisible( _bVisible );
}

void OReportSection::SelectAll(const SdrObjKind _nObjectType)
{
    if ( !m_pView )
        return;

    if ( _nObjectType == SdrObjKind::NONE )
        m_pView->MarkAllObj();
    else
    {
        m_pView->UnmarkAll();
        SdrObjListIter aIter(m_pPage,SdrIterMode::DeepNoGroups);
        SdrObject* pObjIter = nullptr;
        while( (pObjIter = aIter.Next()) != nullptr )
        {
            if ( pObjIter->GetObjIdentifier() == _nObjectType )
                m_pView->MarkObj( pObjIter, m_pView->GetSdrPageView() );
        }
    }
}

void OReportSection::Command( const CommandEvent& _rCEvt )
{
    Window::Command(_rCEvt);
    if (_rCEvt.GetCommand() != CommandEventId::ContextMenu)
        return;

    OReportController& rController = m_pParent->getViewsWindow()->getView()->getReportView()->getController();
    uno::Reference<frame::XFrame> xFrame = rController.getFrame();
    css::uno::Sequence<css::uno::Any> aArgs {
        css::uno::Any(comphelper::makePropertyValue(u"Value"_ustr, u"report"_ustr)),
        css::uno::Any(comphelper::makePropertyValue(u"Frame"_ustr, xFrame)),
        css::uno::Any(comphelper::makePropertyValue(u"IsContextMenu"_ustr, true))
    };

    css::uno::Reference<css::uno::XComponentContext> xContext(rController.getORB());
    css::uno::Reference<css::frame::XPopupMenuController> xMenuController(
        xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
        u"com.sun.star.comp.framework.ResourceMenuController"_ustr, aArgs, xContext), css::uno::UNO_QUERY);

    if (!xMenuController.is())
        return;

    rtl::Reference<VCLXPopupMenu> xPopupMenu = new VCLXPopupMenu();

    if (!xPopupMenu.is())
        return;

    xMenuController->setPopupMenu(xPopupMenu);

    Point aPos = _rCEvt.GetMousePosPixel();
    m_pView->EndAction();

    xPopupMenu->execute(GetComponentInterface(),
                        css::awt::Rectangle(aPos.X(), aPos.Y(), 1, 1),
                        css::awt::PopupMenuDirection::EXECUTE_DOWN);

    css::uno::Reference<css::lang::XComponent> xComponent(xMenuController, css::uno::UNO_QUERY);
    xComponent->dispose();
}

void OReportSection::_propertyChanged(const beans::PropertyChangeEvent& _rEvent)
{
    if ( !m_xSection.is() )
        return;

    if ( _rEvent.Source == m_xSection || PROPERTY_BACKCOLOR == _rEvent.PropertyName )
    {
        sal_Int32 nColor = m_xSection->getBackColor();
        if ( nColor == static_cast<sal_Int32>(COL_TRANSPARENT) )
            nColor = getStyleProperty<sal_Int32>(m_xSection->getReportDefinition(),PROPERTY_BACKCOLOR);
        m_pView->SetApplicationDocumentColor(Color(ColorTransparency, nColor));
        Invalidate(InvalidateFlags::NoChildren|InvalidateFlags::NoErase);
    }
    else
    {
        uno::Reference<report::XReportDefinition> xReportDefinition = m_xSection->getReportDefinition();
        const sal_Int32 nLeftMargin  = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_LEFTMARGIN);
        const sal_Int32 nRightMargin = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_RIGHTMARGIN);
        const sal_Int32 nPaperWidth  = getStyleProperty<awt::Size>(xReportDefinition,PROPERTY_PAPERSIZE).Width;

        if ( _rEvent.PropertyName == PROPERTY_LEFTMARGIN )
        {
            m_pPage->SetLeftBorder(nLeftMargin);
        }
        else if ( _rEvent.PropertyName == PROPERTY_RIGHTMARGIN )
        {
            m_pPage->SetRightBorder(nRightMargin);
        }
        const Size aOldPageSize = m_pPage->GetSize();
        sal_Int32 nNewHeight = 5*m_xSection->getHeight();
        if ( aOldPageSize.Height() != nNewHeight || nPaperWidth != aOldPageSize.Width() )
        {
            m_pPage->SetSize( Size( nPaperWidth,nNewHeight) );
            const Size aPageSize = m_pPage->GetSize();
            m_pView->SetWorkArea( tools::Rectangle( Point( nLeftMargin, 0), Size(aPageSize.Width() - nLeftMargin - nRightMargin,aPageSize.Height()) ) );
        }
        impl_adjustObjectSizePosition(nPaperWidth,nLeftMargin,nRightMargin);
        m_pParent->Invalidate(InvalidateFlags::Update | InvalidateFlags::Transparent);
    }
}
void OReportSection::impl_adjustObjectSizePosition(sal_Int32 i_nPaperWidth,sal_Int32 i_nLeftMargin,sal_Int32 i_nRightMargin)
{
    try
    {
        sal_Int32 nRightBorder = i_nPaperWidth - i_nRightMargin;
        const sal_Int32 nCount = m_xSection->getCount();
        for (sal_Int32 i = 0; i < nCount; ++i)
        {
            uno::Reference< report::XReportComponent> xReportComponent(m_xSection->getByIndex(i),uno::UNO_QUERY_THROW);
            awt::Point aPos = xReportComponent->getPosition();
            awt::Size aSize = xReportComponent->getSize();
            SdrObject* pObject = SdrObject::getSdrObjectFromXShape( xReportComponent );
            if ( pObject )
            {
                bool bChanged = false;

                OObjectBase& rBase = dynamic_cast<OObjectBase&>(*pObject);
                rBase.EndListening();
                if ( aPos.X < i_nLeftMargin )
                {
                    aPos.X  = i_nLeftMargin;
                    bChanged = true;
                }
                if ( (aPos.X + aSize.Width) > nRightBorder )
                {
                    aPos.X = nRightBorder - aSize.Width;
                    if ( aPos.X < i_nLeftMargin )
                    {
                        aSize.Width += aPos.X - i_nLeftMargin;
                        aPos.X = i_nLeftMargin;
                        // add listener around
                        rBase.StartListening();
                        xReportComponent->setSize(aSize);
                        rBase.EndListening();
                    }
                    bChanged = true;
                }
                if ( aPos.Y < 0 )
                    aPos.Y = 0;
                if ( bChanged )
                {
                    xReportComponent->setPosition(aPos);
                    correctOverlapping(pObject,*this,false);
                    tools::Rectangle aRet(
                        vcl::unohelper::ConvertToVCLPoint(xReportComponent->getPosition()),
                        vcl::unohelper::ConvertToVCLSize(xReportComponent->getSize()));
                    aRet.setHeight(aRet.getOpenHeight() + 1);
                    aRet.setWidth(aRet.getOpenWidth() + 1);
                    if ( m_xSection.is() && (o3tl::make_unsigned(aRet.getOpenHeight() + aRet.Top()) > m_xSection->getHeight()) )
                        m_xSection->setHeight(aRet.getOpenHeight() + aRet.Top());

                    pObject->RecalcBoundRect();
                }
                rBase.StartListening();
            }
        }
    }
    catch(const uno::Exception &)
    {
        TOOLS_WARN_EXCEPTION( "reportdesign""OReportSection::impl_adjustObjectSizePosition()");
    }
}

bool OReportSection::handleKeyEvent(const KeyEvent& _rEvent)
{
    return m_pFunc && m_pFunc->handleKeyEvent(_rEvent);
}

void OReportSection::deactivateOle()
{
    if (m_pFunc)
        m_pFunc->deactivateOle(true);
}

void OReportSection::createDefault(const OUString& _sType)
{
    SdrObject* pObj = m_pView->GetCreateObj();
    if ( !pObj )
        return;
    createDefault(_sType,pObj);
}

void OReportSection::createDefault(const OUString& _sType,SdrObject* _pObj)
{
    bool bAttributesAppliedFromGallery = false;

    if ( GalleryExplorer::GetSdrObjCount( GALLERY_THEME_POWERPOINT ) )
    {
        std::vector< OUString > aObjList;
        if ( GalleryExplorer::FillObjListTitle( GALLERY_THEME_POWERPOINT, aObjList ) )
        {
            auto aIter = std::find_if(aObjList.begin(), aObjList.end(),
                [&_sType](const OUString& rObj) { return rObj.equalsIgnoreAsciiCase(_sType); });
            if (aIter != aObjList.end())
            {
                auto i = static_cast<sal_uInt32>(std::distance(aObjList.begin(), aIter));
                OReportModel aReportModel(nullptr);

                if ( GalleryExplorer::GetSdrObj( GALLERY_THEME_POWERPOINT, i, &aReportModel ) )
                {
                    const SdrObject* pSourceObj = aReportModel.GetPage( 0 )->GetObj( 0 );
                    if( pSourceObj )
                    {
                        const SfxItemSet& rSource = pSourceObj->GetMergedItemSet();
                        SfxItemSet aDest(SfxItemSet::makeFixedSfxItemSet<
                            // Ranges from SdrAttrObj:
                            SDRATTR_START, SDRATTR_SHADOW_LAST,
                            SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST,
                            SDRATTR_TEXTDIRECTION, SDRATTR_TEXTDIRECTION,
                            // Graphic attributes, 3D properties,
                            // CustomShape properties:
                            SDRATTR_GRAF_FIRST, SDRATTR_CUSTOMSHAPE_LAST,
                            // Range from SdrTextObj:
                            EE_ITEMS_START, EE_ITEMS_END>(_pObj->getSdrModelFromSdrObject().GetItemPool()));
                        aDest.Set( rSource );
                        _pObj->SetMergedItemSet( aDest );
                        Degree100 nAngle = pSourceObj->GetRotateAngle();
                        if ( nAngle )
                            _pObj->NbcRotate( _pObj->GetSnapRect().Center(), nAngle );
                        bAttributesAppliedFromGallery = true;
                    }
                }
            }
        }
    }
    if ( !bAttributesAppliedFromGallery )
    {
        _pObj->SetMergedItem( SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST) );
        _pObj->SetMergedItem( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) );
        _pObj->SetMergedItem( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) );
        _pObj->SetMergedItem( makeSdrTextAutoGrowHeightItem( false ) );
        static_cast<SdrObjCustomShape*>(_pObj)->MergeDefaultAttributes( &_sType );
    }
}

uno::Reference< report::XReportComponent > OReportSection::getCurrentControlModel() const
{
    uno::Reference< report::XReportComponent > xModel;
    if ( m_pView )
    {
        const SdrMarkList& rMarkList = m_pView->GetMarkedObjectList();

        if ( rMarkList.GetMarkCount() == 1 )
        {
            SdrObject* pDlgEdObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
            OObjectBase* pObj = dynamic_cast<OObjectBase*>(pDlgEdObj);
            if ( pObj )
                xModel = pObj->getReportComponent().get();
        }
    }
    return xModel;
}

void OReportSection::fillControlModelSelection(::std::vector< uno::Reference< uno::XInterface > >& _rSelection) const
{
    if ( !m_pView )
        return;

    const SdrMarkList& rMarkList = m_pView->GetMarkedObjectList();
    const size_t nMarkCount = rMarkList.GetMarkCount();

    for (size_t i=0; i < nMarkCount; ++i)
    {
        const SdrObject* pDlgEdObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
        const OObjectBase* pObj = dynamic_cast<const OObjectBase*>(pDlgEdObj);
        if ( pObj )
        {
            uno::Reference<uno::XInterface> xInterface(pObj->getReportComponent());
            _rSelection.push_back(xInterface);
        }
    }
}

sal_Int8 OReportSection::AcceptDrop( const AcceptDropEvent& _rEvt )
{
    ::Point aDropPos(_rEvt.maPosPixel);
    const MouseEvent aMouseEvt(aDropPos);
    if ( m_pFunc->isOverlapping(aMouseEvt) )
        return DND_ACTION_NONE;

    if ( _rEvt.mnAction == DND_ACTION_COPY ||
         _rEvt.mnAction == DND_ACTION_LINK
         )
    {
        if (!m_pParent) return DND_ACTION_NONE;
        sal_uInt16 nCurrentPosition = m_pParent->getViewsWindow()->getPosition(m_pParent);
        if (_rEvt.mnAction == DND_ACTION_COPY )
        {
            // we must assure, we can't drop in the top section
            if (nCurrentPosition < 1)
            {
                return DND_ACTION_NONE;
            }
            return DND_ACTION_LINK;
        }
        if (_rEvt.mnAction == DND_ACTION_LINK)
        {
            // we must assure, we can't drop in the bottom section
            if (m_pParent->getViewsWindow()->getSectionCount() > (nCurrentPosition + 1)  )
            {
                return DND_ACTION_COPY;
            }
            return DND_ACTION_NONE;
        }
    }
    else
    {
        const DataFlavorExVector& rFlavors = GetDataFlavorExVector();
        if (   svx::OMultiColumnTransferable::canExtractDescriptor(rFlavors)
            || svx::OColumnTransferable::canExtractColumnDescriptor(rFlavors, ColumnTransferFormatFlags::FIELD_DESCRIPTOR | ColumnTransferFormatFlags::CONTROL_EXCHANGE | ColumnTransferFormatFlags::COLUMN_DESCRIPTOR) )
            return _rEvt.mnAction;

        const sal_Int8 nDropOption = ( OReportExchange::canExtract(rFlavors) ) ? DND_ACTION_COPYMOVE : DND_ACTION_NONE;

        return nDropOption;
    }
    return DND_ACTION_NONE;
}


sal_Int8 OReportSection::ExecuteDrop( const ExecuteDropEvent& _rEvt )
{
    ::Point aDropPos(PixelToLogic(_rEvt.maPosPixel));
    const MouseEvent aMouseEvt(aDropPos);
    if ( m_pFunc->isOverlapping(aMouseEvt) )
        return DND_ACTION_NONE;

    sal_Int8 nDropOption = DND_ACTION_NONE;
    const TransferableDataHelper aDropped(_rEvt.maDropEvent.Transferable);
    const DataFlavorExVector& rFlavors = aDropped.GetDataFlavorExVector();
    bool bMultipleFormat = svx::OMultiColumnTransferable::canExtractDescriptor(rFlavors);
    if ( OReportExchange::canExtract(rFlavors) )
    {
        OReportExchange::TSectionElements aCopies = OReportExchange::extractCopies(aDropped);
        Paste(aCopies,true);
        nDropOption = DND_ACTION_COPYMOVE;
        m_pParent->getViewsWindow()->BrkAction();
        m_pParent->getViewsWindow()->unmarkAllObjects(m_pView);
    }
    else if ( bMultipleFormat
        || svx::OColumnTransferable::canExtractColumnDescriptor(rFlavors, ColumnTransferFormatFlags::FIELD_DESCRIPTOR | ColumnTransferFormatFlags::CONTROL_EXCHANGE | ColumnTransferFormatFlags::COLUMN_DESCRIPTOR) )
    {
        m_pParent->getViewsWindow()->getView()->setMarked(m_pView, true);
        m_pView->UnmarkAll();
        const tools::Rectangle& rRect = m_pView->GetWorkArea();
        if ( aDropPos.X() < rRect.Left() )
            aDropPos.setX( rRect.Left() );
        else if ( aDropPos.X() > rRect.Right() )
            aDropPos.setX( rRect.Right() );

        if ( aDropPos.Y() > rRect.Bottom() )
            aDropPos.setY( rRect.Bottom() );

        uno::Sequence<beans::PropertyValue> aValues;
        if ( !bMultipleFormat )
        {
            svx::ODataAccessDescriptor aDescriptor = svx::OColumnTransferable::extractColumnDescriptor(aDropped);

            aValues.realloc(1);
            aValues.getArray()[0].Value <<= aDescriptor.createPropertyValueSequence();
        }
        else
            aValues = svx::OMultiColumnTransferable::extractDescriptor(aDropped);

        for(beans::PropertyValue & propVal : asNonConstRange(aValues))
        {
            uno::Sequence<beans::PropertyValue> aCurrent;
            propVal.Value >>= aCurrent;
            sal_Int32 nLength = aCurrent.getLength();
            if ( nLength )
            {
                aCurrent.realloc(nLength + 3);
                auto pCurrent = aCurrent.getArray();
                pCurrent[nLength].Name = PROPERTY_POSITION;
                pCurrent[nLength++].Value <<= vcl::unohelper::ConvertToAWTPoint(aDropPos);
                // give also the DND Action (Shift|Ctrl) Key to really say what we want
                pCurrent[nLength].Name = "DNDAction";
                pCurrent[nLength++].Value <<= _rEvt.mnAction;

                pCurrent[nLength].Name = "Section";
                pCurrent[nLength++].Value <<= getSection();
                propVal.Value <<= aCurrent;
            }
        }

        // we use this way to create undo actions
        OReportController& rController = m_pParent->getViewsWindow()->getView()->getReportView()->getController();
        rController.executeChecked(SID_ADD_CONTROL_PAIR,aValues);
        nDropOption = DND_ACTION_COPY;
    }
    return nDropOption;
}

void OReportSection::stopScrollTimer()
{
    m_pFunc->stopScrollTimer();
}

bool OReportSection::isUiActive() const
{
    return m_pFunc->isUiActive();
}


}


/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Messung V0.5
C=97 H=93 G=94

¤ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.