Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/LibreOffice/svx/source/dialog/   (Office von Apache Version 25.8.3.2©)  Datei vom 5.10.2025 mit Größe 25 kB image not shown  

Quelle  imapdlg.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 <vcl/errinf.hxx>
#include <tools/urlobj.hxx>
#include <unotools/ucbstreamhelper.hxx>
#include <svl/eitem.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/module.hxx>
#include <sfx2/filedlghelper.hxx>
#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
#include <svl/urihelper.hxx>
#include <svtools/ehdl.hxx>
#include <svtools/inettbc.hxx>
#include <svtools/sfxecode.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/docfile.hxx>
#include <unotools/localedatawrapper.hxx>
#include <vcl/weld.hxx>
#include <svx/imapdlg.hxx>
#include <svx/dialmgr.hxx>
#include <svx/strings.hrc>
#include <svx/svxids.hrc>
#include "imapwnd.hxx"
#include "imapimp.hxx"
#include <svx/svdopath.hxx>
#include <vcl/svapp.hxx>
#include <vcl/settings.hxx>
#include <osl/diagnose.h>
#include "dlgunit.hxx"
#include <memory>

constexpr OUString SELF_TARGET = u"_self"_ustr;
constexpr OUString IMAP_CERN_FILTER = u"MAP - CERN"_ustr;
constexpr OUString IMAP_NCSA_FILTER = u"MAP - NCSA"_ustr;
constexpr OUString IMAP_BINARY_FILTER = u"SIP - StarView ImageMap"_ustr;
constexpr OUStringLiteral IMAP_ALL_TYPE = u"*.*";
constexpr OUString IMAP_BINARY_TYPE = u"*.sip"_ustr;
constexpr OUString IMAP_CERN_TYPE = u"*.map"_ustr;
constexpr OUString IMAP_NCSA_TYPE = u"*.map"_ustr;

SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID( SvxIMapDlgChildWindow, SID_IMAP );

// ControllerItem

SvxIMapDlgItem::SvxIMapDlgItem( SvxIMapDlg& rIMapDlg, SfxBindings& rBindings ) :
            SfxControllerItem   ( SID_IMAP_EXEC, rBindings ),
            rIMap               ( rIMapDlg )
{
}

void SvxIMapDlgItem::StateChangedAtToolBoxControl( sal_uInt16 nSID, SfxItemState /*eState*/,
                                   const SfxPoolItem* pItem )
{
    if ( ( nSID == SID_IMAP_EXEC ) && pItem )
    {
        const SfxBoolItem* pStateItem = dynamic_cast<const SfxBoolItem*>( pItem  );
        assert(pStateItem); //SfxBoolItem expected
        if (pStateItem)
        {
            // Disable Float if possible
            rIMap.SetExecState( !pStateItem->GetValue() );
        }
    }
}

SvxIMapDlgChildWindow::SvxIMapDlgChildWindow(vcl::Window* _pParent, sal_uInt16 nId,
                                             SfxBindings* pBindings,
                                             SfxChildWinInfo const * pInfo)
    : SfxChildWindow( _pParent, nId )
{
    SetController(std::make_shared<SvxIMapDlg>(pBindings, this, _pParent->GetFrameWeld()));
    SvxIMapDlg* pDlg = static_cast<SvxIMapDlg*>(GetController().get());
    pDlg->Initialize( pInfo );
}

void SvxIMapDlgChildWindow::UpdateIMapDlg( const Graphic& rGraphic, const ImageMap* pImageMap,
                                           const TargetList* pTargetList, void* pEditingObj )
{
    SvxIMapDlg* pDlg = GetIMapDlg();
    if (pDlg)
        pDlg->UpdateLink(rGraphic, pImageMap, pTargetList, pEditingObj);
}

SvxIMapDlg::SvxIMapDlg(SfxBindings *_pBindings, SfxChildWindow *pCW, weld::Window* _pParent)
    : SfxModelessDialogController(_pBindings, pCW, _pParent, u"svx/ui/imapdialog.ui"_ustr, u"ImapDialog"_ustr)
    , pCheckObj(nullptr)
    , aIMapItem(*this, *_pBindings)
    , m_xIMapWnd(new IMapWindow(_pBindings->GetActiveFrame(), m_xDialog.get()))
    , m_xTbxIMapDlg1(m_xBuilder->weld_toolbar(u"toolbar"_ustr))
    , m_xFtURL(m_xBuilder->weld_label(u"urlft"_ustr))
    , m_xURLBox(new SvtURLBox(m_xBuilder->weld_combo_box(u"url"_ustr)))
    , m_xFtText(m_xBuilder->weld_label(u"textft"_ustr))
    , m_xEdtText(m_xBuilder->weld_entry(u"text"_ustr))
    , m_xFtTarget(m_xBuilder->weld_label(u"targetft"_ustr))
    , m_xCbbTarget(m_xBuilder->weld_combo_box(u"target"_ustr))
    , m_xCancelBtn(m_xBuilder->weld_button(u"cancel"_ustr))
    , m_xStbStatus1(m_xBuilder->weld_label(u"statusurl"_ustr))
    , m_xStbStatus2(m_xBuilder->weld_label(u"statuspos"_ustr))
    , m_xStbStatus3(m_xBuilder->weld_label(u"statussize"_ustr))
    , m_xIMapWndWeld(new weld::CustomWeld(*m_xBuilder, u"container"_ustr, *m_xIMapWnd))

{
    m_xTbxIMapDlg1->insert_separator(4, u"sep1"_ustr);
    m_xTbxIMapDlg1->insert_separator(10, u"sep2"_ustr);
    m_xTbxIMapDlg1->insert_separator(15, u"sep3"_ustr);
    m_xTbxIMapDlg1->insert_separator(18, u"sel4"_ustr);

    //lock this down so it doesn't jump around in size
    //as entries are added later on
    TargetList aTmpList;
    SfxFrame::GetDefaultTargetList(aTmpList);
    for (const OUString & s : aTmpList)
        m_xCbbTarget->append_text(s);
    Size aPrefSize(m_xCbbTarget->get_preferred_size());
    m_xCbbTarget->set_size_request(aPrefSize.Width(), -1);
    m_xCbbTarget->clear();

    m_xIMapWnd->Show();

    pOwnData.reset(new IMapOwnData);

    m_xIMapWnd->SetInfoLink( LINK( this, SvxIMapDlg, InfoHdl ) );
    m_xIMapWnd->SetMousePosLink( LINK( this, SvxIMapDlg, MousePosHdl ) );
    m_xIMapWnd->SetGraphSizeLink( LINK( this, SvxIMapDlg, GraphSizeHdl ) );
    m_xIMapWnd->SetUpdateLink( LINK( this, SvxIMapDlg, StateHdl ) );

    m_xURLBox->connect_changed( LINK( this, SvxIMapDlg, URLModifyHdl ) );
    m_xURLBox->connect_focus_out( LINK( this, SvxIMapDlg, URLLoseFocusHdl ) );
    m_xEdtText->connect_changed( LINK( this, SvxIMapDlg, EntryModifyHdl ) );
    m_xCbbTarget->connect_focus_out( LINK( this, SvxIMapDlg, URLLoseFocusHdl ) );

    m_xTbxIMapDlg1->connect_clicked( LINK( this, SvxIMapDlg, TbxClickHdl ) );
    OUString sSelect(u"TBI_SELECT"_ustr);
    m_xTbxIMapDlg1->set_item_active(sSelect, true);
    TbxClickHdl(sSelect);

    m_xStbStatus1->set_size_request(120, -1);
    const int nWidth = m_xStbStatus1->get_pixel_size(u" 9999,99 cm / 9999,99 cm "_ustr).Width();
    m_xStbStatus2->set_size_request(nWidth, -1);
    m_xStbStatus3->set_size_request(nWidth, -1);

    m_xFtURL->set_sensitive(false);
    m_xURLBox->set_sensitive(false);
    m_xFtText->set_sensitive(false);
    m_xEdtText->set_sensitive(false);
    m_xFtTarget->set_sensitive(false);
    m_xCbbTarget->set_sensitive(false);
    pOwnData->bExecState = false;

    pOwnData->aIdle.SetInvokeHandler( LINK( this, SvxIMapDlg, UpdateHdl ) );

    m_xTbxIMapDlg1->set_item_sensitive(u"TBI_ACTIVE"_ustr, false);
    m_xTbxIMapDlg1->set_item_sensitive(u"TBI_MACRO"_ustr, false );
    m_xTbxIMapDlg1->set_item_sensitive(u"TBI_PROPERTY"_ustr, false );

    m_xCancelBtn->connect_clicked(LINK(this, SvxIMapDlg, CancelHdl));
}

SvxIMapDlg::~SvxIMapDlg()
{
    m_xIMapWnd->SetUpdateLink( Link<GraphCtrl*,void>() );
    m_xIMapWnd.reset();
}

IMPL_LINK_NOARG(SvxIMapDlg, CancelHdl, weld::Button&, void)
{
    bool bRet = true;

    if ( m_xTbxIMapDlg1->get_item_sensitive(u"TBI_APPLY"_ustr) )
    {
        std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(m_xDialog.get(), u"svx/ui/querymodifyimagemapchangesdialog.ui"_ustr));
        std::unique_ptr<weld::MessageDialog> xQBox(xBuilder->weld_message_dialog(u"QueryModifyImageMapChangesDialog"_ustr));
        const tools::Long nRet = xQBox->run();

        if( nRet == RET_YES )
        {
            SfxBoolItem aBoolItem( SID_IMAP_EXEC, true );
            GetBindings().GetDispatcher()->ExecuteList(SID_IMAP_EXEC,
                SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
                { &aBoolItem });
        }
        else if( nRet == RET_CANCEL )
            bRet = false;
    }
    else if( m_xIMapWnd->IsChanged() )
    {
        std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(m_xDialog.get(), u"svx/ui/querysaveimagemapchangesdialog.ui"_ustr));
        std::unique_ptr<weld::MessageDialog> xQBox(xBuilder->weld_message_dialog(u"QuerySaveImageMapChangesDialog"_ustr));
        const tools::Long nRet = xQBox->run();

        if( nRet == RET_YES )
            bRet = DoSave();
        else if( nRet == RET_CANCEL )
            bRet = false;
    }

    if (bRet)
        m_xDialog->response(RET_CANCEL);
}

// Enabled or disable all Controls

void SvxIMapDlg::SetExecState( bool bEnable )
{
    pOwnData->bExecState = bEnable;
}

const ImageMap& SvxIMapDlg::GetImageMap() const
{
    return m_xIMapWnd->GetImageMap();
}

void SvxIMapDlg::SetTargetList( const TargetList& rTargetList )
{
    m_xIMapWnd->SetTargetList( rTargetList );

    m_xCbbTarget->clear();

    for (const OUString & s : rTargetList)
        m_xCbbTarget->append_text(s);
}

void SvxIMapDlg::UpdateLink( const Graphic& rGraphic, const ImageMap* pImageMap,
                         const TargetList* pTargetList, void* pEditingObj )
{
    pOwnData->aUpdateGraphic = rGraphic;

    if ( pImageMap )
        pOwnData->aUpdateImageMap = *pImageMap;
    else
        pOwnData->aUpdateImageMap.ClearImageMap();

    pOwnData->pUpdateEditingObject = pEditingObj;

    // Delete UpdateTargetList, because this method can still be called several
    // times before the update timer is turned on

    // TargetList must be copied, since it is owned by the caller and can be
    // deleted immediately after this call the copied list will be deleted
    // again in the handler
    if( pTargetList )
        pOwnData->aUpdateTargetList = *pTargetList;
    else
        pOwnData->aUpdateTargetList.clear();

    pOwnData->aIdle.Start();
}


// Click-handler for ToolBox

IMPL_LINK(SvxIMapDlg, TbxClickHdl, const OUString&, rNewItemId, void)
{
    if (rNewItemId == "TBI_APPLY")
    {
        URLLoseFocusHdl(*m_xCbbTarget);
        SfxBoolItem aBoolItem( SID_IMAP_EXEC, true );
        GetBindings().GetDispatcher()->ExecuteList(SID_IMAP_EXEC,
            SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
            { &aBoolItem });
    }
    else if (rNewItemId == "TBI_OPEN")
        DoOpen();
    else if (rNewItemId == "TBI_SAVEAS")
        DoSave();
    else if (rNewItemId == "TBI_CLOSE")
        CancelHdl(*m_xCancelBtn);
    else if (rNewItemId == "TBI_SELECT")
    {
        SetActiveTool( rNewItemId );
        m_xIMapWnd->SetEditMode( true );
    }
    else if (rNewItemId == "TBI_RECT")
    {
        SetActiveTool( rNewItemId );
        m_xIMapWnd->SetObjKind( SdrObjKind::Rectangle );
    }
    else if (rNewItemId == "TBI_CIRCLE")
    {
        SetActiveTool( rNewItemId );
        m_xIMapWnd->SetObjKind( SdrObjKind::CircleOrEllipse );
    }
    else if (rNewItemId == "TBI_POLY")
    {
        SetActiveTool( rNewItemId );
        m_xIMapWnd->SetObjKind( SdrObjKind::Polygon );
    }
    else if (rNewItemId == "TBI_FREEPOLY")
    {
        SetActiveTool( rNewItemId );
        m_xIMapWnd->SetObjKind( SdrObjKind::FreehandFill );
    }
    else if (rNewItemId == "TBI_ACTIVE")
    {
        URLLoseFocusHdl(*m_xCbbTarget);
        bool bNewState = !m_xTbxIMapDlg1->get_item_active(rNewItemId);
        m_xTbxIMapDlg1->set_item_active(rNewItemId, bNewState);
        m_xIMapWnd->SetCurrentObjState( !bNewState );
    }
    else if (rNewItemId == "TBI_MACRO")
        m_xIMapWnd->DoMacroAssign();
    else if (rNewItemId == "TBI_PROPERTY")
        m_xIMapWnd->DoPropertyDialog();
    else if (rNewItemId == "TBI_POLYEDIT")
    {
        SetActiveTool( rNewItemId );
        m_xIMapWnd->SetPolyEditMode( m_xTbxIMapDlg1->get_item_active(rNewItemId) ? SID_BEZIER_MOVE : 0 );
    }
    else if (rNewItemId == "TBI_POLYMOVE")
    {
        SetActiveTool( rNewItemId );
        m_xIMapWnd->SetPolyEditMode( SID_BEZIER_MOVE );
    }
    else if (rNewItemId == "TBI_POLYINSERT")
    {
        SetActiveTool( rNewItemId );
        m_xIMapWnd->SetPolyEditMode( SID_BEZIER_INSERT );
    }
    else if (rNewItemId == "TBI_POLYDELETE")
    {
        SetActiveTool( rNewItemId );
        m_xIMapWnd->GetSdrView()->DeleteMarkedPoints();
    }
    else if (rNewItemId == "TBI_UNDO")
    {
        URLLoseFocusHdl(*m_xCbbTarget);
        m_xIMapWnd->GetSdrModel()->Undo();
    }
    else if (rNewItemId == "TBI_REDO")
    {
        URLLoseFocusHdl(*m_xCbbTarget);
        m_xIMapWnd->GetSdrModel()->Redo();
    }
}

void SvxIMapDlg::DoOpen()
{
    ::sfx2::FileDialogHelper aDlg(
        css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
        FileDialogFlags::NONE, m_xDialog.get());

    ImageMap        aLoadIMap;
    const OUString  aFilter(SvxResId(RID_SVXSTR_IMAP_ALL_FILTER));

    aDlg.AddFilter( aFilter, IMAP_ALL_TYPE );
    aDlg.AddFilter( IMAP_CERN_FILTER, IMAP_CERN_TYPE );
    aDlg.AddFilter( IMAP_NCSA_FILTER, IMAP_NCSA_TYPE );
    aDlg.AddFilter( IMAP_BINARY_FILTER, IMAP_BINARY_TYPE );

    aDlg.SetCurrentFilter( aFilter );
    aDlg.SetContext(sfx2::FileDialogHelper::ImageMap);

    if( aDlg.Execute() != ERRCODE_NONE )
        return;

    INetURLObject aURL( aDlg.GetPath() );
    DBG_ASSERT( aURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
    std::unique_ptr<SvStream> pIStm(::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), StreamMode::READ ));

    if( pIStm )
    {
        aLoadIMap.Read( *pIStm, IMapFormat::Detect );

        if( pIStm->GetError() )
        {
            SfxErrorContext eEC(ERRCTX_ERROR, m_xDialog.get());
            ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
        }
        else
            m_xIMapWnd->SetImageMap( aLoadIMap );
    }

    m_xIMapWnd->Invalidate();
}

bool SvxIMapDlg::DoSave()
{
    ::sfx2::FileDialogHelper aDlg(
        css::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE,
        FileDialogFlags::NONE, m_xDialog.get());

    const OUString    aBinFilter( IMAP_BINARY_FILTER );
    const OUString    aCERNFilter( IMAP_CERN_FILTER );
    const OUString    aNCSAFilter( IMAP_NCSA_FILTER );
    SdrModel*       pModel = m_xIMapWnd->GetSdrModel();
    const bool bChanged = pModel->IsChanged();
    bool            bRet = false;

    aDlg.AddFilter( aCERNFilter, IMAP_CERN_TYPE );
    aDlg.AddFilter( aNCSAFilter, IMAP_NCSA_TYPE );
    aDlg.AddFilter( aBinFilter, IMAP_BINARY_TYPE );

    aDlg.SetCurrentFilter( aCERNFilter );
    aDlg.SetContext(sfx2::FileDialogHelper::ImageMap);

    if( aDlg.Execute() == ERRCODE_NONE )
    {
        const OUString    aFilter( aDlg.GetCurrentFilter() );
        OUString          aExt;
        IMapFormat        nFormat;

        if ( aFilter == aBinFilter )
        {
            nFormat = IMapFormat::Binary;
            aExt = "sip";
        }
        else if ( aFilter == aCERNFilter )
        {
            nFormat = IMapFormat::CERN;
            aExt = "map";
        }
        else if ( aFilter == aNCSAFilter )
        {
            nFormat = IMapFormat::NCSA;
            aExt = "map";
        }
        else
        {
            return false;
        }

        INetURLObject aURL( aDlg.GetPath() );

        if( aURL.GetProtocol() == INetProtocol::NotValid )
        {
            OSL_FAIL( "invalid URL" );
        }
        else
        {
            if( aURL.getExtension().isEmpty() )
                aURL.setExtension( aExt );

            std::unique_ptr<SvStream> pOStm(::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), StreamMode::WRITE | StreamMode::TRUNC ));
            if( pOStm )
            {
                m_xIMapWnd->GetImageMap().Write( *pOStm, nFormat );

                if( pOStm->GetError() )
                    ErrorHandler::HandleError( ERRCODE_IO_GENERAL );

                pOStm.reset();
                pModel->SetChanged( bChanged );
                bRet = true;
            }
        }
    }

    return bRet;
}

void SvxIMapDlg::SetActiveTool(std::u16string_view rId)
{
    m_xTbxIMapDlg1->set_item_active(u"TBI_SELECT"_ustr, rId == u"TBI_SELECT");
    m_xTbxIMapDlg1->set_item_active(u"TBI_RECT"_ustr, rId == u"TBI_RECT");
    m_xTbxIMapDlg1->set_item_active(u"TBI_CIRCLE"_ustr, rId == u"TBI_CIRCLE");
    m_xTbxIMapDlg1->set_item_active(u"TBI_POLY"_ustr, rId == u"TBI_POLY");
    m_xTbxIMapDlg1->set_item_active(u"TBI_FREEPOLY"_ustr, rId == u"TBI_FREEPOLY");

    m_xTbxIMapDlg1->set_item_active(u"TBI_POLYINSERT"_ustr, rId == u"TBI_POLYINSERT");
    m_xTbxIMapDlg1->set_item_active(u"TBI_POLYDELETE"_ustr, false);

    bool bMove = rId == u"TBI_POLYMOVE"
                || ( rId == u"TBI_POLYEDIT"
                && !m_xTbxIMapDlg1->get_item_active(u"TBI_POLYINSERT"_ustr)
                && !m_xTbxIMapDlg1->get_item_active(u"TBI_POLYDELETE"_ustr) );

    m_xTbxIMapDlg1->set_item_active(u"TBI_POLYMOVE"_ustr, bMove );

    bool bEditMode = ( rId == u"TBI_POLYEDIT" )
                    || ( rId == u"TBI_POLYMOVE")
                    || ( rId == u"TBI_POLYINSERT")
                    || ( rId == u"TBI_POLYDELETE" );

    m_xTbxIMapDlg1->set_item_active(u"TBI_POLYEDIT"_ustr, bEditMode);
}

IMPL_LINK( SvxIMapDlg, InfoHdl, IMapWindow&, rWnd, void )
{
    const NotifyInfo&   rInfo = rWnd.GetInfo();

    if ( rInfo.bNewObj )
    {
        if (!rInfo.aMarkURL.isEmpty() && ( m_xURLBox->find_text(rInfo.aMarkURL) == -1))
            m_xURLBox->append_text(rInfo.aMarkURL);

        m_xURLBox->set_entry_text(rInfo.aMarkURL);
        m_xEdtText->set_text(rInfo.aMarkAltText);

        if ( rInfo.aMarkTarget.isEmpty() )
            m_xCbbTarget->set_entry_text( SELF_TARGET );
        else
            m_xCbbTarget->set_entry_text( rInfo.aMarkTarget );
    }

    if ( !rInfo.bOneMarked )
    {
        m_xTbxIMapDlg1->set_item_active(u"TBI_ACTIVE"_ustr, false);
        m_xTbxIMapDlg1->set_item_sensitive(u"TBI_ACTIVE"_ustr, false);
        m_xTbxIMapDlg1->set_item_sensitive(u"TBI_MACRO"_ustr, false);
        m_xTbxIMapDlg1->set_item_sensitive(u"TBI_PROPERTY"_ustr, false);
        m_xStbStatus1->set_label(OUString());

        m_xFtURL->set_sensitive(false);
        m_xURLBox->set_sensitive(false);
        m_xFtText->set_sensitive(false);
        m_xEdtText->set_sensitive(false);
        m_xFtTarget->set_sensitive(false);
        m_xCbbTarget->set_sensitive(false);

        m_xURLBox->set_entry_text( u""_ustr );
        m_xEdtText->set_text( u""_ustr );
    }
    else
    {
        m_xTbxIMapDlg1->set_item_sensitive(u"TBI_ACTIVE"_ustr, true);
        m_xTbxIMapDlg1->set_item_active(u"TBI_ACTIVE"_ustr, !rInfo.bActivated );
        m_xTbxIMapDlg1->set_item_sensitive(u"TBI_MACRO"_ustr, true);
        m_xTbxIMapDlg1->set_item_sensitive(u"TBI_PROPERTY"_ustr, true);

        m_xFtURL->set_sensitive(true);
        m_xURLBox->set_sensitive(true);
        m_xFtText->set_sensitive(true);
        m_xEdtText->set_sensitive(true);
        m_xFtTarget->set_sensitive(true);
        m_xCbbTarget->set_sensitive(true);

        m_xStbStatus1->set_label(rInfo.aMarkURL);

        if ( m_xURLBox->get_active_text() != rInfo.aMarkURL )
            m_xURLBox->set_entry_text( rInfo.aMarkURL );

        if ( m_xEdtText->get_text() != rInfo.aMarkAltText )
            m_xEdtText->set_text( rInfo.aMarkAltText );

        if ( rInfo.aMarkTarget.isEmpty() )
            m_xCbbTarget->set_entry_text( SELF_TARGET );
        else
            m_xCbbTarget->set_entry_text(  rInfo.aMarkTarget );
    }
}

IMPL_LINK( SvxIMapDlg, MousePosHdl, GraphCtrl*, pWnd, void )
{
    const FieldUnit eFieldUnit = GetBindings().GetDispatcher()->GetModule()->GetFieldUnit();
    const Point& rMousePos = pWnd->GetMousePos();
    const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
    const sal_Unicode cSep = rLocaleWrapper.getNumDecimalSep()[0];

    OUString aStr = GetUnitString( rMousePos.X(), eFieldUnit, cSep ) +
                    " / " + GetUnitString( rMousePos.Y(), eFieldUnit, cSep );

    m_xStbStatus2->set_label(aStr);
}

IMPL_LINK( SvxIMapDlg, GraphSizeHdl, GraphCtrl*, pWnd, void )
{
    const FieldUnit eFieldUnit = GetBindings().GetDispatcher()->GetModule()->GetFieldUnit();
    const Size& rSize = pWnd->GetGraphicSize();
    const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
    const sal_Unicode cSep = rLocaleWrapper.getNumDecimalSep()[0];

    OUString aStr = GetUnitString( rSize.Width(), eFieldUnit, cSep ) +
                    " x " + GetUnitString( rSize.Height(), eFieldUnit, cSep );

    m_xStbStatus3->set_label(aStr);
}

void SvxIMapDlg::URLModify()
{
    NotifyInfo  aNewInfo;

    aNewInfo.aMarkURL = m_xURLBox->get_active_text();
    aNewInfo.aMarkAltText = m_xEdtText->get_text();
    aNewInfo.aMarkTarget = m_xCbbTarget->get_active_text();

    m_xIMapWnd->ReplaceActualIMapInfo( aNewInfo );
}

IMPL_LINK_NOARG(SvxIMapDlg, URLModifyHdl, weld::ComboBox&, void)
{
    URLModify();
}

IMPL_LINK_NOARG(SvxIMapDlg, EntryModifyHdl, weld::Entry&, void)
{
    URLModify();
}

IMPL_LINK_NOARG(SvxIMapDlg, URLLoseFocusHdl, weld::Widget&, void)
{
    NotifyInfo        aNewInfo;
    const OUString    aURLText( m_xURLBox->get_active_text() );
    const OUString    aTargetText( m_xCbbTarget->get_active_text() );

    if ( !aURLText.isEmpty() )
    {
        OUString aBase = GetBindings().GetDispatcher()->GetFrame()->GetObjectShell()->GetMedium()->GetBaseURL();
        aNewInfo.aMarkURL = ::URIHelper::SmartRel2Abs( INetURLObject(aBase), aURLText, URIHelper::GetMaybeFileHdl(), truefalse,
                                                        INetURLObject::EncodeMechanism::WasEncoded,
                                                        INetURLObject::DecodeMechanism::Unambiguous );
    }
    else
        aNewInfo.aMarkURL = aURLText;

    aNewInfo.aMarkAltText = m_xEdtText->get_text();

    if ( aTargetText.isEmpty() )
        aNewInfo.aMarkTarget = SELF_TARGET;
    else
        aNewInfo.aMarkTarget = aTargetText;

    m_xIMapWnd->ReplaceActualIMapInfo( aNewInfo );
}

IMPL_LINK_NOARG(SvxIMapDlg, UpdateHdl, Timer *, void)
{
    pOwnData->aIdle.Stop();

    if ( pOwnData->pUpdateEditingObject != pCheckObj )
    {
        if (m_xIMapWnd->IsChanged())
        {
            std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(m_xDialog.get(), u"svx/ui/querysaveimagemapchangesdialog.ui"_ustr));
            std::unique_ptr<weld::MessageDialog> xQBox(xBuilder->weld_message_dialog(u"QuerySaveImageMapChangesDialog"_ustr));
            if (xQBox->run() == RET_YES)
            {
                DoSave();
            }
        }

        m_xIMapWnd->SetGraphic( pOwnData->aUpdateGraphic );
        m_xIMapWnd->SetImageMap( pOwnData->aUpdateImageMap );
        SetTargetList( pOwnData->aUpdateTargetList );
        pCheckObj = pOwnData->pUpdateEditingObject;

        // After changes => default selection
        m_xTbxIMapDlg1->set_item_active(u"TBI_SELECT"_ustr, true);
        m_xIMapWnd->SetEditMode( true );
    }

    // Delete the copied list again in the Update method
    pOwnData->aUpdateTargetList.clear();

    GetBindings().Invalidate( SID_IMAP_EXEC );
    m_xIMapWnd->QueueIdleUpdate();
}

IMPL_LINK( SvxIMapDlg, StateHdl, GraphCtrl*, pWnd, void )
{
    const SdrObject*    pObj = pWnd->GetSelectedSdrObject();
    const SdrModel*     pModel = pWnd->GetSdrModel();
    const SdrView*      pView = pWnd->GetSdrView();
    const bool          bPolyEdit = ( pObj != nullptr ) && dynamic_cast<const SdrPathObj*>( pObj) !=  nullptr;
    const bool          bDrawEnabled = !( bPolyEdit && m_xTbxIMapDlg1->get_item_active(u"TBI_POLYEDIT"_ustr) );

    m_xTbxIMapDlg1->set_item_sensitive(u"TBI_APPLY"_ustr, pOwnData->bExecState && pWnd->IsChanged() );

    m_xTbxIMapDlg1->set_item_sensitive(u"TBI_SELECT"_ustr, bDrawEnabled);
    m_xTbxIMapDlg1->set_item_sensitive(u"TBI_RECT"_ustr, bDrawEnabled);
    m_xTbxIMapDlg1->set_item_sensitive(u"TBI_CIRCLE"_ustr, bDrawEnabled);
    m_xTbxIMapDlg1->set_item_sensitive(u"TBI_POLY"_ustr, bDrawEnabled);
    m_xTbxIMapDlg1->set_item_sensitive(u"TBI_FREEPOLY"_ustr, bDrawEnabled);

    // BezierEditor State
    m_xTbxIMapDlg1->set_item_sensitive( u"TBI_POLYEDIT"_ustr, bPolyEdit );
    m_xTbxIMapDlg1->set_item_sensitive( u"TBI_POLYMOVE"_ustr, !bDrawEnabled );
    m_xTbxIMapDlg1->set_item_sensitive( u"TBI_POLYINSERT"_ustr, !bDrawEnabled );
    m_xTbxIMapDlg1->set_item_sensitive( u"TBI_POLYDELETE"_ustr, !bDrawEnabled && pView->IsDeleteMarkedPointsPossible() );

    // Undo/Redo
    m_xTbxIMapDlg1->set_item_sensitive( u"TBI_UNDO"_ustr, pModel->HasUndoActions() );
    m_xTbxIMapDlg1->set_item_sensitive( u"TBI_REDO"_ustr, pModel->HasRedoActions() );

    if ( bPolyEdit )
    {
        switch( pWnd->GetPolyEditMode() )
        {
            case SID_BEZIER_MOVE:
                m_xTbxIMapDlg1->set_item_active(u"TBI_POLYMOVE"_ustr, true);
                m_xTbxIMapDlg1->set_item_active(u"TBI_POLYINSERT"_ustr, false);
                break;
            case SID_BEZIER_INSERT:
                m_xTbxIMapDlg1->set_item_active(u"TBI_POLYINSERT"_ustr, true);
                m_xTbxIMapDlg1->set_item_active(u"TBI_POLYMOVE"_ustr, false);
                break;
            default:
                break;
        }
    }
    else
    {
        m_xTbxIMapDlg1->set_item_active( u"TBI_POLYEDIT"_ustr, false );
        m_xTbxIMapDlg1->set_item_active( u"TBI_POLYMOVE"_ustr, true);
        m_xTbxIMapDlg1->set_item_active( u"TBI_POLYINSERT"_ustr, false );
        pWnd->SetPolyEditMode( 0 );
    }

    m_xIMapWnd->QueueIdleUpdate();
}

SvxIMapDlg* GetIMapDlg()
{
    SfxChildWindow* pWnd = nullptr;
    SfxViewFrame* pViewFrm = SfxViewFrame::Current();
    if (pViewFrm && pViewFrm->HasChildWindow(SvxIMapDlgChildWindow::GetChildWindowId()))
        pWnd = pViewFrm->GetChildWindow(SvxIMapDlgChildWindow::GetChildWindowId());
    return pWnd ? static_cast<SvxIMapDlg*>(pWnd->GetController().get()) : nullptr;
}

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

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

¤ Dauer der Verarbeitung: 0.16 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.