8332d6d820
Change-Id: I8ba1214500dddaf413c506a4b82f43d63cda804b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106559 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
733 lines
25 KiB
C++
733 lines
25 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 <vcl/errinf.hxx>
|
|
#include <tools/urlobj.hxx>
|
|
#include <unotools/ucbstreamhelper.hxx>
|
|
#include <svl/eitem.hxx>
|
|
#include <unotools/pathoptions.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 "dlgunit.hxx"
|
|
#include <memory>
|
|
|
|
#define SELF_TARGET "_self"
|
|
#define IMAP_CERN_FILTER "MAP - CERN"
|
|
#define IMAP_NCSA_FILTER "MAP - NCSA"
|
|
#define IMAP_BINARY_FILTER "SIP - StarView ImageMap"
|
|
#define IMAP_ALL_TYPE "*.*"
|
|
#define IMAP_BINARY_TYPE "*.sip"
|
|
#define IMAP_CERN_TYPE "*.map"
|
|
#define IMAP_NCSA_TYPE "*.map"
|
|
|
|
SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID( SvxIMapDlgChildWindow, SID_IMAP );
|
|
|
|
// ControllerItem
|
|
|
|
SvxIMapDlgItem::SvxIMapDlgItem( SvxIMapDlg& rIMapDlg, SfxBindings& rBindings ) :
|
|
SfxControllerItem ( SID_IMAP_EXEC, rBindings ),
|
|
rIMap ( rIMapDlg )
|
|
{
|
|
}
|
|
|
|
void SvxIMapDlgItem::StateChanged( 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, "svx/ui/imapdialog.ui", "ImapDialog")
|
|
, pCheckObj(nullptr)
|
|
, aIMapItem(*this, *_pBindings)
|
|
, m_xIMapWnd(new IMapWindow(_pBindings->GetActiveFrame(), m_xDialog.get()))
|
|
, m_xTbxIMapDlg1(m_xBuilder->weld_toolbar("toolbar"))
|
|
, m_xFtURL(m_xBuilder->weld_label("urlft"))
|
|
, m_xURLBox(new SvtURLBox(m_xBuilder->weld_combo_box("url")))
|
|
, m_xFtText(m_xBuilder->weld_label("textft"))
|
|
, m_xEdtText(m_xBuilder->weld_entry("text"))
|
|
, m_xFtTarget(m_xBuilder->weld_label("targetft"))
|
|
, m_xCbbTarget(m_xBuilder->weld_combo_box("target"))
|
|
, m_xCancelBtn(m_xBuilder->weld_button("cancel"))
|
|
, m_xStbStatus1(m_xBuilder->weld_label("statusurl"))
|
|
, m_xStbStatus2(m_xBuilder->weld_label("statuspos"))
|
|
, m_xStbStatus3(m_xBuilder->weld_label("statussize"))
|
|
, m_xIMapWndWeld(new weld::CustomWeld(*m_xBuilder, "container", *m_xIMapWnd))
|
|
|
|
{
|
|
m_xTbxIMapDlg1->insert_separator(4, "sep1");
|
|
m_xTbxIMapDlg1->insert_separator(10, "sep2");
|
|
m_xTbxIMapDlg1->insert_separator(15, "sep3");
|
|
m_xTbxIMapDlg1->insert_separator(18, "sel4");
|
|
|
|
//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 ) );
|
|
OString sSelect("TBI_SELECT");
|
|
m_xTbxIMapDlg1->set_item_active(sSelect, true);
|
|
TbxClickHdl(sSelect);
|
|
|
|
m_xStbStatus1->set_size_request(120, -1);
|
|
const int nWidth = m_xStbStatus1->get_pixel_size(" 9999,99 cm / 9999,99 cm ").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("TBI_ACTIVE", false);
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_MACRO", false );
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_PROPERTY", 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("TBI_APPLY") )
|
|
{
|
|
std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(m_xDialog.get(), "svx/ui/querymodifyimagemapchangesdialog.ui"));
|
|
std::unique_ptr<weld::MessageDialog> xQBox(xBuilder->weld_message_dialog("QueryModifyImageMapChangesDialog"));
|
|
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(), "svx/ui/querysaveimagemapchangesdialog.ui"));
|
|
std::unique_ptr<weld::MessageDialog> xQBox(xBuilder->weld_message_dialog("QuerySaveImageMapChangesDialog"));
|
|
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 )
|
|
{
|
|
TargetList aNewList( rTargetList );
|
|
|
|
m_xIMapWnd->SetTargetList( aNewList );
|
|
|
|
m_xCbbTarget->clear();
|
|
|
|
for (const OUString & s : aNewList)
|
|
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
|
|
pOwnData->aUpdateTargetList.clear();
|
|
|
|
// 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 )
|
|
{
|
|
TargetList aTargetList( *pTargetList );
|
|
|
|
for (const OUString & s : aTargetList)
|
|
pOwnData->aUpdateTargetList.push_back( s );
|
|
}
|
|
|
|
pOwnData->aIdle.Start();
|
|
}
|
|
|
|
|
|
// Click-handler for ToolBox
|
|
|
|
IMPL_LINK(SvxIMapDlg, TbxClickHdl, const OString&, 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( OBJ_RECT );
|
|
}
|
|
else if (rNewItemId == "TBI_CIRCLE")
|
|
{
|
|
SetActiveTool( rNewItemId );
|
|
m_xIMapWnd->SetObjKind( OBJ_CIRC );
|
|
}
|
|
else if (rNewItemId == "TBI_POLY")
|
|
{
|
|
SetActiveTool( rNewItemId );
|
|
m_xIMapWnd->SetObjKind( OBJ_POLY );
|
|
}
|
|
else if (rNewItemId == "TBI_FREEPOLY")
|
|
{
|
|
SetActiveTool( rNewItemId );
|
|
m_xIMapWnd->SetObjKind( OBJ_FREEFILL );
|
|
}
|
|
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.SetDisplayDirectory( SvtPathOptions().GetWorkPath() );
|
|
|
|
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.SetDisplayDirectory( SvtPathOptions().GetWorkPath() );
|
|
|
|
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::string_view rId)
|
|
{
|
|
m_xTbxIMapDlg1->set_item_active("TBI_SELECT", rId == "TBI_SELECT");
|
|
m_xTbxIMapDlg1->set_item_active("TBI_RECT", rId == "TBI_RECT");
|
|
m_xTbxIMapDlg1->set_item_active("TBI_CIRCLE", rId == "TBI_CIRCLE");
|
|
m_xTbxIMapDlg1->set_item_active("TBI_POLY", rId == "TBI_POLY");
|
|
m_xTbxIMapDlg1->set_item_active("TBI_FREEPOLY", rId == "TBI_FREEPOLY");
|
|
|
|
m_xTbxIMapDlg1->set_item_active("TBI_POLYINSERT", rId == "TBI_POLYINSERT");
|
|
m_xTbxIMapDlg1->set_item_active("TBI_POLYDELETE", false);
|
|
|
|
bool bMove = rId == "TBI_POLYMOVE"
|
|
|| ( rId == "TBI_POLYEDIT"
|
|
&& !m_xTbxIMapDlg1->get_item_active("TBI_POLYINSERT")
|
|
&& !m_xTbxIMapDlg1->get_item_active("TBI_POLYDELETE") );
|
|
|
|
m_xTbxIMapDlg1->set_item_active("TBI_POLYMOVE", bMove );
|
|
|
|
bool bEditMode = ( rId == "TBI_POLYEDIT" )
|
|
|| ( rId == "TBI_POLYMOVE")
|
|
|| ( rId == "TBI_POLYINSERT")
|
|
|| ( rId == "TBI_POLYDELETE" );
|
|
|
|
m_xTbxIMapDlg1->set_item_active("TBI_POLYEDIT", 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("TBI_ACTIVE", false);
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_ACTIVE", false);
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_MACRO", false);
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_PROPERTY", 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( "" );
|
|
m_xEdtText->set_text( "" );
|
|
}
|
|
else
|
|
{
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_ACTIVE", true);
|
|
m_xTbxIMapDlg1->set_item_active("TBI_ACTIVE", !rInfo.bActivated );
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_MACRO", true);
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_PROPERTY", 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(), true, false,
|
|
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(), "svx/ui/querysaveimagemapchangesdialog.ui"));
|
|
std::unique_ptr<weld::MessageDialog> xQBox(xBuilder->weld_message_dialog("QuerySaveImageMapChangesDialog"));
|
|
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("TBI_SELECT", 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("TBI_POLYEDIT") );
|
|
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_APPLY", pOwnData->bExecState && pWnd->IsChanged() );
|
|
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_SELECT", bDrawEnabled);
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_RECT", bDrawEnabled);
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_CIRCLE", bDrawEnabled);
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_POLY", bDrawEnabled);
|
|
m_xTbxIMapDlg1->set_item_sensitive("TBI_FREEPOLY", bDrawEnabled);
|
|
|
|
// BezierEditor State
|
|
m_xTbxIMapDlg1->set_item_sensitive( "TBI_POLYEDIT", bPolyEdit );
|
|
m_xTbxIMapDlg1->set_item_sensitive( "TBI_POLYMOVE", !bDrawEnabled );
|
|
m_xTbxIMapDlg1->set_item_sensitive( "TBI_POLYINSERT", !bDrawEnabled );
|
|
m_xTbxIMapDlg1->set_item_sensitive( "TBI_POLYDELETE", !bDrawEnabled && pView->IsDeleteMarkedPointsPossible() );
|
|
|
|
// Undo/Redo
|
|
m_xTbxIMapDlg1->set_item_sensitive( "TBI_UNDO", pModel->HasUndoActions() );
|
|
m_xTbxIMapDlg1->set_item_sensitive( "TBI_REDO", pModel->HasRedoActions() );
|
|
|
|
if ( bPolyEdit )
|
|
{
|
|
switch( pWnd->GetPolyEditMode() )
|
|
{
|
|
case SID_BEZIER_MOVE:
|
|
m_xTbxIMapDlg1->set_item_active("TBI_POLYMOVE", true);
|
|
m_xTbxIMapDlg1->set_item_active("TBI_POLYINSERT", false);
|
|
break;
|
|
case SID_BEZIER_INSERT:
|
|
m_xTbxIMapDlg1->set_item_active("TBI_POLYINSERT", true);
|
|
m_xTbxIMapDlg1->set_item_active("TBI_POLYMOVE", false);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_xTbxIMapDlg1->set_item_active( "TBI_POLYEDIT", false );
|
|
m_xTbxIMapDlg1->set_item_active( "TBI_POLYMOVE", true);
|
|
m_xTbxIMapDlg1->set_item_active( "TBI_POLYINSERT", false );
|
|
pWnd->SetPolyEditMode( 0 );
|
|
}
|
|
|
|
m_xIMapWnd->QueueIdleUpdate();
|
|
}
|
|
|
|
SvxIMapDlg* GetIMapDlg()
|
|
{
|
|
SfxChildWindow* pWnd = nullptr;
|
|
if (SfxViewFrame::Current() && SfxViewFrame::Current()->HasChildWindow(SvxIMapDlgChildWindow::GetChildWindowId()))
|
|
pWnd = SfxViewFrame::Current()->GetChildWindow(SvxIMapDlgChildWindow::GetChildWindowId());
|
|
return pWnd ? static_cast<SvxIMapDlg*>(pWnd->GetController().get()) : nullptr;
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|