mirror of
https://github.com/LibreOffice/core.git
synced 2025-08-04 07:36:15 +00:00

For the gtk3 VCL plugin, calling weld::DrawingArea::set_size_request
can trigger the creation of the corresponding a11y object,
which wants to access the drawing area to determine its states.
Therefore, call the base class implementation to set the
drawing area right at the start of IMapWindow::SetDrawingArea,
as is done elsewhere (e.g. in CuiGraphicPreviewWindow::SetDrawingArea).
This fixes a crash with the below backtrace seen after
commit 62b8ebe343
Author: Michael Weghorn <m.weghorn@posteo.de>
Date: Wed Feb 12 13:15:52 2025 +0100
GraphCtrl a11y: Use comphelper::OAccessibleComponentHelper
when opening the "Tools" -> "ImageMap" dialog in Impress or Writer
with the gtk3 VCL plugin.
Thread 1 "soffice.bin" received signal SIGSEGV, Segmentation fault.
0x00007ffff24b0634 in weld::CustomWidgetController::HasFocus (this=0x55555d7068e0) at include/vcl/customweld.hxx:67
67 bool HasFocus() const { return m_pDrawingArea->has_focus(); }
(gdb) bt
#0 0x00007ffff24b0634 in weld::CustomWidgetController::HasFocus (this=0x55555d7068e0) at include/vcl/customweld.hxx:67
#1 0x00007ffff24ada4a in SvxGraphCtrlAccessibleContext::getAccessibleStateSet (this=0x555558db29c0) at /home/michi/development/git/libreoffice/svx/source/accessibility/GraphCtlAccessibleContext.cxx:256
#2 0x00007fffe62582d8 in atk_object_wrapper_new (rxAccessible=uno::Reference to (SvxGraphCtrlAccessibleContext *) 0x555558db2a10, parent=0x5555598c69a0, orig=0x555558dd9210)
at /home/michi/development/git/libreoffice/vcl/unx/gtk3/a11y/atkwrapper.cxx:974
#3 0x00007fffe62b15c4 in (anonymous namespace)::GtkInstanceDrawingArea::GetAtkObject (this=0x555558f99f60, pDefaultAccessible=0x555558dd9210) at /home/michi/development/git/libreoffice/vcl/unx/gtk3/gtkinst.cxx:18964
#4 0x00007fffe62b14ea in (anonymous namespace)::drawing_area_get_accessible (pWidget=0x55555d7192f0) at /home/michi/development/git/libreoffice/vcl/unx/gtk3/gtkinst.cxx:23966
#5 0x00007fffe5c131b5 in ??? () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#6 0x00007ffff09b4950 in g_closure_invoke () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#7 0x00007ffff09c8d43 in ??? () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#8 0x00007ffff09ca769 in ??? () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#9 0x00007ffff09d05a6 in g_signal_emit_valist () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#10 0x00007ffff09d0663 in g_signal_emit () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#11 0x00007ffff09b8b14 in ??? () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#12 0x00007ffff09ba767 in ??? () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#13 0x00007fffe62985f3 in (anonymous namespace)::GtkInstanceWidget::set_size_request (this=0x555558f99f60, nWidth=608, nHeight=383) at /home/michi/development/git/libreoffice/vcl/unx/gtk3/gtkinst.cxx:3625
#14 0x00007ffff2617c53 in IMapWindow::SetDrawingArea (this=0x55555d7068e0, pDrawingArea=0x555558f9a210) at /home/michi/development/git/libreoffice/svx/source/dialog/imapwnd.cxx:92
#15 0x00007fffee96f280 in weld::CustomWeld::CustomWeld (this=0x5555598c6520, rBuilder=..., rDrawingId="container", rWidgetController=...) at /home/michi/development/git/libreoffice/vcl/source/app/customweld.cxx:28
#16 0x00007ffff260c4b7 in SvxIMapDlg::SvxIMapDlg (this=0x555558838180, _pBindings=0x555556aadbd0, pCW=0x55555d6f5530, _pParent=0x55555d723e28) at /home/michi/development/git/libreoffice/svx/source/dialog/imapdlg.cxx:118
#17 0x00007ffff2616b46 in std::_Construct<SvxIMapDlg, SfxBindings*&, SvxIMapDlgChildWindow*, weld::Window*>
(__p=0x555558838180, __args=@0x7fffffff4170: 0x555556aadbd0, __args=@0x7fffffff4148: 0x55555d6f5530, __args=@0x7fffffff4140: 0x55555d723e28) at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/stl_construct.h:119
#18 0x00007ffff2616775 in std::allocator_traits<std::allocator<void> >::construct<SvxIMapDlg, SfxBindings*&, SvxIMapDlgChildWindow*, weld::Window*>
(__p=0x555558838180, __args=@0x7fffffff4170: 0x555556aadbd0, __args=@0x7fffffff4148: 0x55555d6f5530, __args=@0x7fffffff4140: 0x55555d723e28) at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/alloc_traits.h:706
#19 std::_Sp_counted_ptr_inplace<SvxIMapDlg, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<SfxBindings*&, SvxIMapDlgChildWindow*, weld::Window*>
(this=0x555558838170, __a=..., __args=@0x7fffffff4170: 0x555556aadbd0, __args=@0x7fffffff4148: 0x55555d6f5530, __args=@0x7fffffff4140: 0x55555d723e28)
at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/shared_ptr_base.h:607
#20 0x00007ffff26164ff in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<SvxIMapDlg, std::allocator<void>, SfxBindings*&, SvxIMapDlgChildWindow*, weld::Window*>
(this=0x7fffffff4158, __p=@0x7fffffff4150: 0x0, __a=..., __args=@0x7fffffff4170: 0x555556aadbd0, __args=@0x7fffffff4148: 0x55555d6f5530, __args=@0x7fffffff4140: 0x55555d723e28)
at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/shared_ptr_base.h:970
#21 0x00007ffff261642c in std::__shared_ptr<SvxIMapDlg, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<void>, SfxBindings*&, SvxIMapDlgChildWindow*, weld::Window*>
(this=0x7fffffff4150, __tag=..., __args=@0x7fffffff4170: 0x555556aadbd0, __args=@0x7fffffff4148: 0x55555d6f5530, __args=@0x7fffffff4140: 0x55555d723e28)
at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/shared_ptr_base.h:1713
#22 0x00007ffff26163aa in std::shared_ptr<SvxIMapDlg>::shared_ptr<std::allocator<void>, SfxBindings*&, SvxIMapDlgChildWindow*, weld::Window*>
(this=0x7fffffff4150, __tag=..., __args=@0x7fffffff4170: 0x555556aadbd0, __args=@0x7fffffff4148: 0x55555d6f5530, __args=@0x7fffffff4140: 0x55555d723e28)
at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/shared_ptr.h:463
#23 0x00007ffff2612a49 in std::make_shared<SvxIMapDlg, SfxBindings*&, SvxIMapDlgChildWindow*, weld::Window*> (__args=@0x7fffffff4170: 0x555556aadbd0, __args=@0x7fffffff4148: 0x55555d6f5530, __args=@0x7fffffff4140: 0x55555d723e28)
at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/shared_ptr.h:1007
#24 0x00007ffff260bb7c in SvxIMapDlgChildWindow::SvxIMapDlgChildWindow (this=0x55555d6f5530, _pParent=0x5555576ad680, nId=10371, pBindings=0x555556aadbd0, pInfo=0x7fffffff43e8)
at /home/michi/development/git/libreoffice/svx/source/dialog/imapdlg.cxx:89
#25 0x00007ffff261290c in std::make_unique<SvxIMapDlgChildWindow, vcl::Window*&, unsigned short&, SfxBindings*&, SfxChildWinInfo*&>
(__args=@0x7fffffff4230: 0x5555576ad680, __args=@0x7fffffff422e: 10371, __args=@0x7fffffff4220: 0x555556aadbd0, __args=@0x7fffffff4218: 0x7fffffff43e8)
at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:1077
#26 0x00007ffff260b704 in SvxIMapDlgChildWindow::CreateImpl (pParent=0x5555576ad680, nId=10371, pBindings=0x555556aadbd0, pInfo=0x7fffffff43e8) at /home/michi/development/git/libreoffice/svx/source/dialog/imapdlg.cxx:59
#27 0x00007ffff38c3b6f in SfxChildWindow::CreateChildWindow (nId=10371, pParent=0x5555576ad680, pBindings=0x555556aadbd0, rInfo=...) at /home/michi/development/git/libreoffice/sfx2/source/appl/childwin.cxx:242
#28 0x00007ffff395f5bd in SfxWorkWindow::CreateChildWin_Impl (this=0x5555571433b0, pCW=0x55555864a020, bSetFocus=true) at /home/michi/development/git/libreoffice/sfx2/source/appl/workwin.cxx:1350
#29 0x00007ffff3961853 in SfxWorkWindow::ToggleChildWindow_Impl (this=0x5555571433b0, nId=10371, bSetFocus=true) at /home/michi/development/git/libreoffice/sfx2/source/appl/workwin.cxx:1835
#30 0x00007ffff403ba89 in SfxViewFrame::ToggleChildWindow (this=0x555557128f90, nId=10371) at /home/michi/development/git/libreoffice/sfx2/source/view/viewfrm.cxx:3695
#31 0x00007fffbb6290d4 in sd::DrawViewShell::FuTemporary (this=0x55555728c010, rReq=...) at /home/michi/development/git/libreoffice/sd/source/ui/view/drviews2.cxx:3893
#32 0x00007fffbb6949b5 in SfxStubDrawViewShellFuTemporary (pShell=0x55555728c010, rReq=...) at workdir/SdiTarget/sd/sdi/sdslots.hxx:1551
#33 0x00007ffff39c8d1e in SfxDispatcher::Call_Impl (this=0x555556af3f30, rShell=..., rSlot=..., rReq=..., bRecord=true) at /home/michi/development/git/libreoffice/sfx2/source/control/dispatch.cxx:256
#34 0x00007ffff39cd5d6 in SfxDispatcher::Execute_ (this=0x555556af3f30, rShell=..., rSlot=..., rReq=..., eCallMode=SfxCallMode::RECORD) at /home/michi/development/git/libreoffice/sfx2/source/control/dispatch.cxx:755
#35 0x00007ffff39b59ee in SfxBindings::Execute_Impl (this=0x555556aadbd0, aReq=..., pSlot=0x7fffbb7c6270 <aDrawViewShellSlots_Impl+14400>, pShell=0x55555728c010)
at /home/michi/development/git/libreoffice/sfx2/source/control/bindings.cxx:1046
#36 0x00007ffff3a95e2d in SfxDispatchController_Impl::dispatch (this=0x555557e27950, aURL=..., aArgs=empty uno::Sequence, rListener=empty uno::Reference) at /home/michi/development/git/libreoffice/sfx2/source/control/unoctitm.cxx:736
#37 0x00007ffff3a948e4 in SfxOfficeDispatch::dispatch (this=0x555557e278b0, aURL=..., aArgs=empty uno::Sequence) at /home/michi/development/git/libreoffice/sfx2/source/control/unoctitm.cxx:255
#38 0x00007ffff4f0bd04 in framework::(anonymous namespace)::AsyncMenuExecute (data=0x5555588c6000) at /home/michi/development/git/libreoffice/framework/source/uielement/menubarmanager.cxx:790
#39 0x00007fffee275a41 in Link<void*, void>::Call (this=0x55555d70f598, data=0x5555588c6000) at include/tools/link.hxx:105
#40 0x00007fffee271c71 in ImplHandleUserEvent (pSVEvent=0x55555d70f590) at /home/michi/development/git/libreoffice/vcl/source/window/winproc.cxx:2285
#41 0x00007fffee26eb9f in ImplWindowFrameProc (_pWindow=0x555556ba6530, nEvent=SalEvent::UserEvent, pEvent=0x55555d70f590) at /home/michi/development/git/libreoffice/vcl/source/window/winproc.cxx:2849
#42 0x00007fffeee4638c in SalFrame::CallCallback (this=0x5555569908a0, nEvent=SalEvent::UserEvent, pEvent=0x55555d70f590) at vcl/inc/salframe.hxx:310
#43 0x00007fffeee6ed1f in SalGenericDisplay::ProcessEvent (this=0x5555568f8ef0, aEvent=...) at /home/michi/development/git/libreoffice/vcl/unx/generic/app/gendisp.cxx:66
#44 0x00007fffee97966d in SalUserEventList::DispatchUserEvents(bool)::$_0::operator()() const (this=0x7fffffffb920) at /home/michi/development/git/libreoffice/vcl/source/app/salusereventlist.cxx:119
#45 0x00007fffee97953b in SalUserEventList::DispatchUserEvents (this=0x5555568f8ef0, bHandleAllCurrentEvents=false) at /home/michi/development/git/libreoffice/vcl/source/app/salusereventlist.cxx:120
#46 0x00007fffeee6ec75 in SalGenericDisplay::DispatchInternalEvent (this=0x5555568f8ef0, bHandleAllCurrentEvent=false) at /home/michi/development/git/libreoffice/vcl/unx/generic/app/gendisp.cxx:51
#47 0x00007fffe62891ef in call_userEventFn (data=0x5555555b3ab0) at /home/michi/development/git/libreoffice/vcl/unx/gtk3/gtkdata.cxx:827
#48 0x00007fffe99043c5 in ??? () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#49 0x00007fffe99065f7 in ??? () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#50 0x00007fffe9906d60 in g_main_context_iteration () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#51 0x00007fffe6287e6c in GtkSalData::Yield (this=0x5555555b3ab0, bWait=true, bHandleAllCurrentEvents=false) at /home/michi/development/git/libreoffice/vcl/unx/gtk3/gtkdata.cxx:405
#52 0x00007fffe628cf13 in GtkInstance::DoYield (this=0x5555555b3960, bWait=true, bHandleAllCurrentEvents=false) at /home/michi/development/git/libreoffice/vcl/unx/gtk3/gtkinst.cxx:439
#53 0x00007fffeea45406 in ImplYield (i_bWait=true, i_bAllEvents=false) at /home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:385
#54 0x00007fffeea44d1f in Application::Yield () at /home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:488
#55 0x00007fffeea44b00 in Application::Execute () at /home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:360
#56 0x00007ffff7b29455 in desktop::Desktop::Main (this=0x7fffffffd660) at /home/michi/development/git/libreoffice/desktop/source/app/app.cxx:1678
#57 0x00007fffeea6f1b6 in ImplSVMain () at /home/michi/development/git/libreoffice/vcl/source/app/svmain.cxx:230
#58 0x00007fffeea70ca9 in SVMain () at /home/michi/development/git/libreoffice/vcl/source/app/svmain.cxx:248
#59 0x00007ffff7ba387a in soffice_main () at /home/michi/development/git/libreoffice/desktop/source/app/sofficemain.cxx:122
#60 0x00005555555559fd in sal_main () at /home/michi/development/git/libreoffice/desktop/source/app/main.c:51
#61 0x00005555555559d7 in main (argc=2, argv=0x7fffffffd868) at /home/michi/development/git/libreoffice/desktop/source/app/main.c:49
Change-Id: I9488a66c1512e41b37bcea0d4bb25a6733884976
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/187162
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Tested-by: Jenkins
767 lines
23 KiB
C++
767 lines
23 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 <tools/urlobj.hxx>
|
|
#include <vcl/commandevent.hxx>
|
|
#include <vcl/imaprect.hxx>
|
|
#include <vcl/imapcirc.hxx>
|
|
#include <vcl/imappoly.hxx>
|
|
#include <vcl/svapp.hxx>
|
|
#include <svl/urlbmk.hxx>
|
|
|
|
#include <svx/svxids.hrc>
|
|
#include "imapwnd.hxx"
|
|
#include <svx/svdpage.hxx>
|
|
#include <svx/svdorect.hxx>
|
|
#include <svx/svdocirc.hxx>
|
|
#include <svx/svdopath.hxx>
|
|
#include <svx/xfltrit.hxx>
|
|
#include <svx/svdpagv.hxx>
|
|
#include <svx/xfillit0.hxx>
|
|
#include <svx/xflclit.hxx>
|
|
#include <svx/xlnclit.hxx>
|
|
|
|
#include <sfx2/evntconf.hxx>
|
|
|
|
#include <sot/formats.hxx>
|
|
|
|
#include <svx/svxdlg.hxx>
|
|
#include <basegfx/polygon/b2dpolygon.hxx>
|
|
#include <memory>
|
|
|
|
using namespace com::sun::star;
|
|
using ::com::sun::star::frame::XFrame;
|
|
using ::com::sun::star::uno::Reference;
|
|
|
|
#define TRANSCOL COL_WHITE
|
|
|
|
static ItemInfoPackage& getItemInfoPackageIMapWindow()
|
|
{
|
|
class ItemInfoPackageIMapWindow : public ItemInfoPackage
|
|
{
|
|
typedef std::array<ItemInfoStatic, 1> ItemInfoArrayIMapWindow;
|
|
ItemInfoArrayIMapWindow maItemInfos {{
|
|
// m_nWhich, m_pItem, m_nSlotID, m_nItemInfoFlags
|
|
{ SID_ATTR_MACROITEM, new SvxMacroItem(SID_ATTR_MACROITEM), 0, SFX_ITEMINFOFLAG_NONE }
|
|
}};
|
|
|
|
virtual const ItemInfoStatic& getItemInfoStatic(size_t nIndex) const override { return maItemInfos[nIndex]; }
|
|
|
|
public:
|
|
virtual size_t size() const override { return maItemInfos.size(); }
|
|
virtual const ItemInfo& getItemInfo(size_t nIndex, SfxItemPool& /*rPool*/) override { return maItemInfos[nIndex]; }
|
|
};
|
|
|
|
static std::unique_ptr<ItemInfoPackageIMapWindow> g_aItemInfoPackageIMapWindow;
|
|
if (!g_aItemInfoPackageIMapWindow)
|
|
g_aItemInfoPackageIMapWindow.reset(new ItemInfoPackageIMapWindow);
|
|
return *g_aItemInfoPackageIMapWindow;
|
|
}
|
|
|
|
IMapWindow::IMapWindow(const Reference< XFrame >& rxDocumentFrame, weld::Dialog* pDialog)
|
|
: GraphCtrl(pDialog)
|
|
, mxDocumentFrame(rxDocumentFrame)
|
|
{
|
|
pIMapPool = new SfxItemPool(u"IMapItemPool"_ustr);
|
|
pIMapPool->registerItemInfoPackage(getItemInfoPackageIMapWindow());
|
|
}
|
|
|
|
IMapWindow::~IMapWindow()
|
|
{
|
|
}
|
|
|
|
void IMapWindow::SetDrawingArea(weld::DrawingArea* pDrawingArea)
|
|
{
|
|
weld::CustomWidgetController::SetDrawingArea(pDrawingArea);
|
|
Size aSize(pDrawingArea->get_ref_device().LogicToPixel(Size(270, 170), MapMode(MapUnit::MapAppFont)));
|
|
pDrawingArea->set_size_request(aSize.Width(), aSize.Height());
|
|
SetOutputSizePixel(aSize);
|
|
|
|
SetSdrMode(true);
|
|
|
|
mxDropTargetHelper.reset(new IMapDropTargetHelper(*this));
|
|
}
|
|
|
|
void IMapWindow::SetImageMap( const ImageMap& rImageMap )
|
|
{
|
|
ReplaceImageMap( rImageMap );
|
|
}
|
|
|
|
void IMapWindow::ReplaceImageMap( const ImageMap& rImageMap )
|
|
{
|
|
SdrPage* pPage = nullptr;
|
|
aIMap = rImageMap;
|
|
|
|
if(GetSdrModel())
|
|
{
|
|
// try to access page
|
|
pPage = GetSdrModel()->GetPage(0);
|
|
}
|
|
|
|
if(pPage)
|
|
{
|
|
// clear SdrObjects with broadcasting
|
|
pPage->ClearSdrObjList();
|
|
}
|
|
|
|
if(GetSdrView())
|
|
{
|
|
// #i63762# reset selection at view
|
|
GetSdrView()->UnmarkAllObj();
|
|
}
|
|
|
|
// create new drawing objects
|
|
const sal_uInt16 nCount(rImageMap.GetIMapObjectCount());
|
|
|
|
for ( sal_uInt16 i(nCount); i > 0; i-- )
|
|
{
|
|
rtl::Reference<SdrObject> pNewObj = CreateObj( rImageMap.GetIMapObject( i - 1 ) );
|
|
|
|
if (pNewObj && pPage)
|
|
{
|
|
pPage->InsertObject( pNewObj.get() );
|
|
}
|
|
}
|
|
}
|
|
|
|
void IMapWindow::ReplaceActualIMapInfo( const NotifyInfo& rNewInfo )
|
|
{
|
|
const SdrObject* pSdrObj = GetSelectedSdrObject();
|
|
|
|
if ( pSdrObj )
|
|
{
|
|
IMapObject* pIMapObj = GetIMapObj( pSdrObj );
|
|
if (pIMapObj)
|
|
{
|
|
pIMapObj->SetURL( rNewInfo.aMarkURL );
|
|
pIMapObj->SetAltText( rNewInfo.aMarkAltText );
|
|
pIMapObj->SetTarget( rNewInfo.aMarkTarget );
|
|
pModel->SetChanged();
|
|
UpdateInfo( false );
|
|
}
|
|
}
|
|
}
|
|
|
|
const ImageMap& IMapWindow::GetImageMap()
|
|
{
|
|
if ( pModel->IsChanged() )
|
|
{
|
|
SdrPage* pPage = pModel->GetPage( 0 );
|
|
|
|
if ( pPage )
|
|
{
|
|
const size_t nCount = pPage->GetObjCount();
|
|
|
|
aIMap.ClearImageMap();
|
|
|
|
for ( size_t i = nCount; i; )
|
|
{
|
|
--i;
|
|
aIMap.InsertIMapObject( *( static_cast<IMapUserData*>( pPage->GetObj( i )->GetUserData( 0 ) )->GetObject() ) );
|
|
}
|
|
}
|
|
|
|
pModel->SetChanged( false );
|
|
}
|
|
|
|
return aIMap;
|
|
}
|
|
|
|
void IMapWindow::SetTargetList( const TargetList& rTargetList )
|
|
{
|
|
// Delete old List
|
|
// Fill with the provided list
|
|
aTargetList = rTargetList;
|
|
|
|
pModel->SetChanged( false );
|
|
}
|
|
|
|
rtl::Reference<SdrObject> IMapWindow::CreateObj( const IMapObject* pIMapObj )
|
|
{
|
|
tools::Rectangle aClipRect( Point(), GetGraphicSize() );
|
|
rtl::Reference<SdrObject> pSdrObj;
|
|
IMapObjectPtr pCloneIMapObj;
|
|
|
|
switch( pIMapObj->GetType() )
|
|
{
|
|
case IMapObjectType::Rectangle:
|
|
{
|
|
const IMapRectangleObject* pIMapRectObj = static_cast<const IMapRectangleObject*>(pIMapObj);
|
|
tools::Rectangle aDrawRect( pIMapRectObj->GetRectangle( false ) );
|
|
|
|
// clipped on CanvasPane
|
|
aDrawRect.Intersection( aClipRect );
|
|
|
|
pSdrObj = new SdrRectObj(*pModel, aDrawRect);
|
|
pCloneIMapObj.reset(static_cast<IMapObject*>(new IMapRectangleObject( *pIMapRectObj )));
|
|
}
|
|
break;
|
|
|
|
case IMapObjectType::Circle:
|
|
{
|
|
const IMapCircleObject* pIMapCircleObj = static_cast<const IMapCircleObject*>(pIMapObj);
|
|
const Point aCenter( pIMapCircleObj->GetCenter( false ) );
|
|
const tools::Long nRadius = pIMapCircleObj->GetRadius( false );
|
|
const Point aOffset( nRadius, nRadius );
|
|
tools::Rectangle aCircle( aCenter - aOffset, aCenter + aOffset );
|
|
|
|
// limited to CanvasPane
|
|
aCircle.Intersection( aClipRect );
|
|
|
|
pSdrObj = new SdrCircObj(
|
|
*pModel,
|
|
SdrCircKind::Full,
|
|
aCircle,
|
|
0_deg100,
|
|
36000_deg100);
|
|
pCloneIMapObj.reset(static_cast<IMapObject*>(new IMapCircleObject( *pIMapCircleObj )));
|
|
}
|
|
break;
|
|
|
|
case IMapObjectType::Polygon:
|
|
{
|
|
const IMapPolygonObject* pIMapPolyObj = static_cast<const IMapPolygonObject*>(pIMapObj);
|
|
|
|
// If it actually is an ellipse, then another ellipse is created again
|
|
if ( pIMapPolyObj->HasExtraEllipse() )
|
|
{
|
|
tools::Rectangle aDrawRect( pIMapPolyObj->GetExtraEllipse() );
|
|
|
|
// clipped on CanvasPane
|
|
aDrawRect.Intersection( aClipRect );
|
|
|
|
pSdrObj = new SdrCircObj(
|
|
*pModel,
|
|
SdrCircKind::Full,
|
|
aDrawRect,
|
|
0_deg100,
|
|
36000_deg100);
|
|
}
|
|
else
|
|
{
|
|
const tools::Polygon aPoly = pIMapPolyObj->GetPolygon( false );
|
|
tools::Polygon aDrawPoly( aPoly );
|
|
|
|
// clipped on CanvasPane
|
|
aDrawPoly.Clip( aClipRect );
|
|
|
|
basegfx::B2DPolygon aPolygon;
|
|
aPolygon.append(aDrawPoly.getB2DPolygon());
|
|
pSdrObj = new SdrPathObj(
|
|
*pModel,
|
|
SdrObjKind::Polygon,
|
|
basegfx::B2DPolyPolygon(aPolygon));
|
|
}
|
|
|
|
pCloneIMapObj.reset(static_cast<IMapObject*>(new IMapPolygonObject( *pIMapPolyObj )));
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ( pSdrObj )
|
|
{
|
|
SfxItemSet aSet( pModel->GetItemPool() );
|
|
|
|
aSet.Put( XFillStyleItem( drawing::FillStyle_SOLID ) );
|
|
aSet.Put( XFillColorItem( u""_ustr, TRANSCOL ) );
|
|
|
|
if ( !pIMapObj->IsActive() )
|
|
{
|
|
aSet.Put( XFillTransparenceItem( 100 ) );
|
|
aSet.Put( XLineColorItem( u""_ustr, COL_RED ) );
|
|
}
|
|
else
|
|
{
|
|
aSet.Put( XFillTransparenceItem( 50 ) );
|
|
aSet.Put( XLineColorItem( u""_ustr, COL_BLACK ) );
|
|
}
|
|
|
|
pSdrObj->SetMergedItemSetAndBroadcast(aSet);
|
|
|
|
pSdrObj->AppendUserData( std::unique_ptr<SdrObjUserData>(new IMapUserData( std::move(pCloneIMapObj) )) );
|
|
pSdrObj->SetUserCall( GetSdrUserCall() );
|
|
}
|
|
|
|
return pSdrObj;
|
|
}
|
|
|
|
void IMapWindow::InitSdrModel()
|
|
{
|
|
GraphCtrl::InitSdrModel();
|
|
|
|
SfxItemSet aSet( pModel->GetItemPool() );
|
|
|
|
aSet.Put( XFillColorItem( u""_ustr, TRANSCOL ) );
|
|
aSet.Put( XFillTransparenceItem( 50 ) );
|
|
pView->SetAttributes( aSet );
|
|
pView->SetFrameDragSingles();
|
|
}
|
|
|
|
void IMapWindow::SdrObjCreated( const SdrObject& rObj )
|
|
{
|
|
switch( rObj.GetObjIdentifier() )
|
|
{
|
|
case SdrObjKind::Rectangle:
|
|
{
|
|
SdrRectObj* pRectObj = const_cast<SdrRectObj*>(static_cast<const SdrRectObj*>(&rObj));
|
|
auto pObj = std::make_shared<IMapRectangleObject>( pRectObj->GetLogicRect(), "", "", "", "", "", true, false );
|
|
|
|
pRectObj->AppendUserData( std::unique_ptr<SdrObjUserData>(new IMapUserData( pObj )) );
|
|
}
|
|
break;
|
|
|
|
case SdrObjKind::CircleOrEllipse:
|
|
{
|
|
SdrCircObj* pCircObj = const_cast<SdrCircObj*>( static_cast<const SdrCircObj*>(&rObj) );
|
|
rtl::Reference<SdrPathObj> pPathObj = static_cast<SdrPathObj*>( pCircObj->ConvertToPolyObj( false, false ).get() );
|
|
tools::Polygon aPoly(pPathObj->GetPathPoly().getB2DPolygon(0));
|
|
|
|
pPathObj.clear();
|
|
|
|
auto pObj = std::make_shared<IMapPolygonObject>( aPoly, "", "", "", "", "", true, false );
|
|
pObj->SetExtraEllipse( aPoly.GetBoundRect() );
|
|
pCircObj->AppendUserData( std::unique_ptr<SdrObjUserData>(new IMapUserData( pObj )) );
|
|
}
|
|
break;
|
|
|
|
case SdrObjKind::Polygon:
|
|
case SdrObjKind::FreehandFill:
|
|
case SdrObjKind::PathPoly:
|
|
case SdrObjKind::PathFill:
|
|
{
|
|
SdrPathObj* pPathObj = const_cast<SdrPathObj*>( static_cast<const SdrPathObj*>(&rObj) );
|
|
const basegfx::B2DPolyPolygon& rXPolyPoly = pPathObj->GetPathPoly();
|
|
|
|
if ( rXPolyPoly.count() )
|
|
{
|
|
tools::Polygon aPoly(rXPolyPoly.getB2DPolygon(0));
|
|
auto pObj = std::make_shared<IMapPolygonObject>( aPoly, "", "", "", "", "", true, false );
|
|
pPathObj->AppendUserData( std::unique_ptr<SdrObjUserData>(new IMapUserData( pObj )) );
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void IMapWindow::SdrObjChanged( const SdrObject& rObj )
|
|
{
|
|
IMapUserData* pUserData = static_cast<IMapUserData*>( rObj.GetUserData( 0 ) );
|
|
|
|
if ( !pUserData )
|
|
return;
|
|
|
|
OUString aURL;
|
|
OUString aAltText;
|
|
OUString aDesc;
|
|
OUString aTarget;
|
|
IMapObjectPtr pIMapObj = pUserData->GetObject();
|
|
bool bActive = true;
|
|
|
|
if ( pIMapObj )
|
|
{
|
|
aURL = pIMapObj->GetURL();
|
|
aAltText = pIMapObj->GetAltText();
|
|
aDesc = pIMapObj->GetDesc();
|
|
aTarget = pIMapObj->GetTarget();
|
|
bActive = pIMapObj->IsActive();
|
|
}
|
|
|
|
switch( rObj.GetObjIdentifier() )
|
|
{
|
|
case SdrObjKind::Rectangle:
|
|
{
|
|
pUserData->ReplaceObject( std::make_shared<IMapRectangleObject>( static_cast<const SdrRectObj&>(rObj).GetLogicRect(),
|
|
aURL, aAltText, aDesc, aTarget, "", bActive, false ) );
|
|
}
|
|
break;
|
|
|
|
case SdrObjKind::CircleOrEllipse:
|
|
{
|
|
const SdrCircObj& rCircObj = static_cast<const SdrCircObj&>(rObj);
|
|
rtl::Reference<SdrPathObj> pPathObj = static_cast<SdrPathObj*>( rCircObj.ConvertToPolyObj( false, false ).get() );
|
|
tools::Polygon aPoly(pPathObj->GetPathPoly().getB2DPolygon(0));
|
|
|
|
auto pObj = std::make_shared<IMapPolygonObject>( aPoly, aURL, aAltText, aDesc, aTarget, "", bActive, false );
|
|
pObj->SetExtraEllipse( aPoly.GetBoundRect() );
|
|
|
|
pPathObj.clear();
|
|
|
|
pUserData->ReplaceObject( pObj );
|
|
}
|
|
break;
|
|
|
|
case SdrObjKind::Polygon:
|
|
case SdrObjKind::FreehandFill:
|
|
case SdrObjKind::PathPoly:
|
|
case SdrObjKind::PathFill:
|
|
{
|
|
const SdrPathObj& rPathObj = static_cast<const SdrPathObj&>(rObj);
|
|
const basegfx::B2DPolyPolygon& rXPolyPoly = rPathObj.GetPathPoly();
|
|
|
|
if ( rXPolyPoly.count() )
|
|
{
|
|
tools::Polygon aPoly(rPathObj.GetPathPoly().getB2DPolygon(0));
|
|
auto pObj = std::make_shared<IMapPolygonObject>( aPoly, aURL, aAltText, aDesc, aTarget, "", bActive, false );
|
|
pUserData->ReplaceObject( pObj );
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool IMapWindow::MouseButtonUp(const MouseEvent& rMEvt)
|
|
{
|
|
bool bRet = GraphCtrl::MouseButtonUp( rMEvt );
|
|
UpdateInfo( true );
|
|
return bRet;
|
|
}
|
|
|
|
void IMapWindow::MarkListHasChanged()
|
|
{
|
|
GraphCtrl::MarkListHasChanged();
|
|
UpdateInfo( false );
|
|
}
|
|
|
|
SdrObject* IMapWindow::GetHitSdrObj( const Point& rPosPixel ) const
|
|
{
|
|
OutputDevice& rDevice = GetDrawingArea()->get_ref_device();
|
|
|
|
SdrObject* pObj = nullptr;
|
|
Point aPt = rDevice.PixelToLogic( rPosPixel );
|
|
|
|
if ( tools::Rectangle( Point(), GetGraphicSize() ).Contains( aPt ) )
|
|
{
|
|
SdrPage* pPage = pModel->GetPage( 0 );
|
|
if ( pPage )
|
|
{
|
|
for ( size_t i = pPage->GetObjCount(); i > 0; )
|
|
{
|
|
--i;
|
|
SdrObject* pTestObj = pPage->GetObj( i );
|
|
IMapObject* pIMapObj = GetIMapObj( pTestObj );
|
|
|
|
if ( pIMapObj && pIMapObj->IsHit( aPt ) )
|
|
{
|
|
pObj = pTestObj;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return pObj;
|
|
}
|
|
|
|
IMapObject* IMapWindow::GetIMapObj( const SdrObject* pSdrObj )
|
|
{
|
|
IMapObject* pIMapObj = nullptr;
|
|
|
|
if ( pSdrObj )
|
|
{
|
|
IMapUserData* pUserData = static_cast<IMapUserData*>( pSdrObj->GetUserData( 0 ) );
|
|
|
|
if ( pUserData )
|
|
pIMapObj = pUserData->GetObject().get();
|
|
}
|
|
|
|
return pIMapObj;
|
|
}
|
|
|
|
bool IMapWindow::Command(const CommandEvent& rCEvt)
|
|
{
|
|
if ( rCEvt.GetCommand() == CommandEventId::ContextMenu )
|
|
{
|
|
std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(GetDrawingArea(), u"svx/ui/imapmenu.ui"_ustr));
|
|
mxPopupMenu = xBuilder->weld_menu(u"menu"_ustr);
|
|
const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
|
|
const size_t nMarked = rMarkList.GetMarkCount();
|
|
|
|
mxPopupMenu->set_sensitive(u"url"_ustr, false);
|
|
mxPopupMenu->set_sensitive(u"active"_ustr, false);
|
|
mxPopupMenu->set_sensitive(u"macro"_ustr, false);
|
|
mxPopupMenu->set_sensitive(u"selectall"_ustr, pModel->GetPage(0)->GetObjCount() != rMarkList.GetMarkCount());
|
|
|
|
if ( !nMarked )
|
|
{
|
|
mxPopupMenu->set_sensitive(u"arrange"_ustr, false);
|
|
mxPopupMenu->set_sensitive(u"delete"_ustr, false);
|
|
}
|
|
else
|
|
{
|
|
if ( nMarked == 1 )
|
|
{
|
|
SdrObject* pSdrObj = GetSelectedSdrObject();
|
|
|
|
mxPopupMenu->set_sensitive(u"url"_ustr, true);
|
|
mxPopupMenu->set_sensitive(u"active"_ustr, true);
|
|
mxPopupMenu->set_sensitive(u"macro"_ustr, true);
|
|
mxPopupMenu->set_active(u"active"_ustr, GetIMapObj(pSdrObj)->IsActive());
|
|
}
|
|
|
|
mxPopupMenu->set_sensitive(u"arrange"_ustr, true);
|
|
mxPopupMenu->set_sensitive(u"delete"_ustr, true);
|
|
}
|
|
|
|
MenuSelectHdl(mxPopupMenu->popup_at_rect(GetDrawingArea(), tools::Rectangle(rCEvt.GetMousePosPixel(), Size(1,1))));
|
|
|
|
mxPopupMenu.reset();
|
|
|
|
return true;
|
|
}
|
|
return CustomWidgetController::Command(rCEvt);
|
|
}
|
|
|
|
IMapDropTargetHelper::IMapDropTargetHelper(IMapWindow& rImapWindow)
|
|
: DropTargetHelper(rImapWindow.GetDrawingArea()->get_drop_target())
|
|
, m_rImapWindow(rImapWindow)
|
|
{
|
|
}
|
|
|
|
sal_Int8 IMapDropTargetHelper::AcceptDrop( const AcceptDropEvent& rEvt )
|
|
{
|
|
return m_rImapWindow.AcceptDrop(rEvt);
|
|
}
|
|
|
|
sal_Int8 IMapDropTargetHelper::ExecuteDrop( const ExecuteDropEvent& rEvt )
|
|
{
|
|
return m_rImapWindow.ExecuteDrop(rEvt);
|
|
}
|
|
|
|
sal_Int8 IMapWindow::AcceptDrop( const AcceptDropEvent& rEvt )
|
|
{
|
|
return( ( GetHitSdrObj( rEvt.maPosPixel ) != nullptr ) ? rEvt.mnAction : DND_ACTION_NONE );
|
|
}
|
|
|
|
sal_Int8 IMapWindow::ExecuteDrop( const ExecuteDropEvent& rEvt )
|
|
{
|
|
sal_Int8 nRet = DND_ACTION_NONE;
|
|
|
|
if (mxDropTargetHelper->IsDropFormatSupported(SotClipboardFormatId::NETSCAPE_BOOKMARK))
|
|
{
|
|
INetBookmark aBookMark( u""_ustr, u""_ustr );
|
|
SdrObject* pSdrObj = GetHitSdrObj( rEvt.maPosPixel );
|
|
|
|
if( pSdrObj && TransferableDataHelper( rEvt.maDropEvent.Transferable ).GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aBookMark ) )
|
|
{
|
|
IMapObject* pIMapObj = GetIMapObj( pSdrObj );
|
|
|
|
pIMapObj->SetURL( aBookMark.GetURL() );
|
|
pIMapObj->SetAltText( aBookMark.GetDescription() );
|
|
pModel->SetChanged();
|
|
pView->UnmarkAll();
|
|
pView->MarkObj( pSdrObj, pView->GetSdrPageView() );
|
|
UpdateInfo( true );
|
|
nRet = rEvt.mnAction;
|
|
}
|
|
}
|
|
|
|
return nRet;
|
|
}
|
|
|
|
OUString IMapWindow::RequestHelp(tools::Rectangle& rHelpArea)
|
|
{
|
|
OutputDevice& rDevice = GetDrawingArea()->get_ref_device();
|
|
|
|
Point aPos = rDevice.PixelToLogic(rHelpArea.TopLeft());
|
|
|
|
SdrPageView* pPageView = nullptr;
|
|
SdrObject* pSdrObj = pView->PickObj(aPos, pView->getHitTolLog(), pPageView);
|
|
if (pSdrObj)
|
|
{
|
|
const IMapObject* pIMapObj = GetIMapObj( pSdrObj );
|
|
if ( pIMapObj )
|
|
{
|
|
OUString aStr = pIMapObj->GetURL();
|
|
if ( !aStr.isEmpty() )
|
|
{
|
|
rHelpArea = rDevice.LogicToPixel(tools::Rectangle( Point(), GetGraphicSize()));
|
|
return aStr;
|
|
}
|
|
}
|
|
}
|
|
|
|
return OUString();
|
|
}
|
|
|
|
void IMapWindow::SetCurrentObjState( bool bActive )
|
|
{
|
|
SdrObject* pObj = GetSelectedSdrObject();
|
|
|
|
if ( !pObj )
|
|
return;
|
|
|
|
SfxItemSet aSet( pModel->GetItemPool() );
|
|
|
|
GetIMapObj( pObj )->SetActive( bActive );
|
|
|
|
aSet.Put( XFillColorItem( u""_ustr, TRANSCOL ) );
|
|
|
|
if ( !bActive )
|
|
{
|
|
aSet.Put( XFillTransparenceItem( 100 ) );
|
|
aSet.Put( XLineColorItem( u""_ustr, COL_RED ) );
|
|
}
|
|
else
|
|
{
|
|
aSet.Put( XFillTransparenceItem( 50 ) );
|
|
aSet.Put( XLineColorItem( u""_ustr, COL_BLACK ) );
|
|
}
|
|
|
|
pView->SetAttributes( aSet );
|
|
}
|
|
|
|
void IMapWindow::UpdateInfo( bool bNewObj )
|
|
{
|
|
if ( !aInfoLink.IsSet() )
|
|
return;
|
|
|
|
const SdrObject* pSdrObj = GetSelectedSdrObject();
|
|
const IMapObject* pIMapObj = pSdrObj ? GetIMapObj( pSdrObj ) : nullptr;
|
|
|
|
aInfo.bNewObj = bNewObj;
|
|
|
|
if ( pIMapObj )
|
|
{
|
|
aInfo.bOneMarked = true;
|
|
aInfo.aMarkURL = pIMapObj->GetURL();
|
|
aInfo.aMarkAltText = pIMapObj->GetAltText();
|
|
aInfo.aMarkTarget = pIMapObj->GetTarget();
|
|
aInfo.bActivated = pIMapObj->IsActive();
|
|
aInfoLink.Call( *this );
|
|
}
|
|
else
|
|
{
|
|
aInfo.aMarkURL.clear();
|
|
aInfo.aMarkAltText.clear();
|
|
aInfo.aMarkTarget.clear();
|
|
aInfo.bOneMarked = false;
|
|
aInfo.bActivated = false;
|
|
}
|
|
|
|
aInfoLink.Call( *this );
|
|
}
|
|
|
|
void IMapWindow::DoMacroAssign()
|
|
{
|
|
SdrObject* pSdrObj = GetSelectedSdrObject();
|
|
|
|
if ( !pSdrObj )
|
|
return;
|
|
|
|
auto xSet = std::make_unique<SfxItemSetFixed<SID_ATTR_MACROITEM, SID_ATTR_MACROITEM, SID_EVENTCONFIG, SID_EVENTCONFIG>>
|
|
(*pIMapPool);
|
|
|
|
SfxEventNamesItem aNamesItem(SID_EVENTCONFIG);
|
|
aNamesItem.AddEvent( u"MouseOver"_ustr, u""_ustr, SvMacroItemId::OnMouseOver );
|
|
aNamesItem.AddEvent( u"MouseOut"_ustr, u""_ustr, SvMacroItemId::OnMouseOut );
|
|
xSet->Put( aNamesItem );
|
|
|
|
SvxMacroItem aMacroItem(SID_ATTR_MACROITEM);
|
|
IMapObject* pIMapObj = GetIMapObj( pSdrObj );
|
|
aMacroItem.SetMacroTable( pIMapObj->GetMacroTable() );
|
|
xSet->Put( aMacroItem );
|
|
|
|
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
|
|
VclPtr<SfxAbstractDialog> pMacroDlg(pFact->CreateEventConfigDialog(GetDrawingArea(), std::move(xSet), mxDocumentFrame));
|
|
|
|
pMacroDlg->StartExecuteAsync(
|
|
[this, pMacroDlg, pIMapObj] (sal_Int32 nResult)->void
|
|
{
|
|
if (nResult == RET_OK)
|
|
{
|
|
const SfxItemSet* pOutSet = pMacroDlg->GetOutputItemSet();
|
|
pIMapObj->SetMacroTable( pOutSet->Get( SID_ATTR_MACROITEM ).GetMacroTable() );
|
|
pModel->SetChanged();
|
|
UpdateInfo( false );
|
|
}
|
|
pMacroDlg->disposeOnce();
|
|
}
|
|
);
|
|
}
|
|
|
|
void IMapWindow::DoPropertyDialog()
|
|
{
|
|
SdrObject* pSdrObj = GetSelectedSdrObject();
|
|
|
|
if ( !pSdrObj )
|
|
return;
|
|
|
|
IMapObject* pIMapObj = GetIMapObj( pSdrObj );
|
|
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
|
|
ScopedVclPtr<AbstractURLDlg> aDlg(pFact->CreateURLDialog(GetDrawingArea(), pIMapObj->GetURL(), pIMapObj->GetAltText(), pIMapObj->GetDesc(),
|
|
pIMapObj->GetTarget(), pIMapObj->GetName(), aTargetList));
|
|
if ( aDlg->Execute() != RET_OK )
|
|
return;
|
|
|
|
const OUString aURLText( aDlg->GetURL() );
|
|
|
|
if ( !aURLText.isEmpty() )
|
|
{
|
|
INetURLObject aObj( aURLText, INetProtocol::File );
|
|
DBG_ASSERT( aObj.GetProtocol() != INetProtocol::NotValid, "Invalid URL" );
|
|
pIMapObj->SetURL( aObj.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
|
|
}
|
|
else
|
|
pIMapObj->SetURL( aURLText );
|
|
|
|
pIMapObj->SetAltText( aDlg->GetAltText() );
|
|
pIMapObj->SetDesc( aDlg->GetDesc() );
|
|
pIMapObj->SetTarget( aDlg->GetTarget() );
|
|
pIMapObj->SetName( aDlg->GetName() );
|
|
pModel->SetChanged();
|
|
UpdateInfo( true );
|
|
}
|
|
|
|
void IMapWindow::MenuSelectHdl(const OUString& rId)
|
|
{
|
|
if (rId == "url")
|
|
DoPropertyDialog();
|
|
else if (rId == "macro")
|
|
DoMacroAssign();
|
|
else if (rId == "active")
|
|
{
|
|
const bool bNewState = !mxPopupMenu->get_active(rId);
|
|
SetCurrentObjState(bNewState);
|
|
UpdateInfo( false );
|
|
}
|
|
else if (rId == "front")
|
|
pView->PutMarkedToTop();
|
|
else if (rId == "forward")
|
|
pView->MovMarkedToTop();
|
|
else if (rId == "backward")
|
|
pView->MovMarkedToBtm();
|
|
else if (rId == "back")
|
|
pView->PutMarkedToBtm();
|
|
else if (rId == "selectall")
|
|
pView->MarkAll();
|
|
else if (rId == "delete")
|
|
pView->DeleteMarked();
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|