[Libreoffice-bugs] [Bug 46579] Form fields 'Image Button' do not work in Forms

bugzilla-daemon at bugs.documentfoundation.org bugzilla-daemon at bugs.documentfoundation.org
Wed Dec 2 12:21:35 UTC 2020


https://bugs.documentfoundation.org/show_bug.cgi?id=46579

--- Comment #21 from Julien Nabet <serval2412 at yahoo.fr> ---
(In reply to Julien Nabet from comment #20)
> Lionel: I finally found the missing element for clickable image.
> dispatch/interceptor part was difficult to track down.
> I submitted https://gerrit.libreoffice.org/c/core/+/107037

Sorry Lionel the comment of my patch didn't explain anything, I was quite tired
yesterday and eager to submit the patch :-)

Let's start with non image button which work.
When entering the form, the specific dispatch mechanism for these urls is
prepared:
Thread 1 "soffice.bin" hit Breakpoint 1,
frm::OFormNavigationHelper::queryDispatch (this=0x7781dc8, _rURL=...) at
forms/source/helper/formnavigation.cxx:263
263             return m_pFeatureInterception->queryDispatch( _rURL );
(gdb) p _rURL
$1 = (const com::sun::star::util::URL &) @0x7783208: {Complete =
".uno:FormController/moveToFirst", Main = ".uno:FormController/moveToFirst",
Protocol = ".uno:", User = "", Password = "", Server = "", 
  Port = 0, Path = "FormController/moveToFirst", Name = "", Arguments = "",
Mark = ""}
(gdb) bt
#0  frm::OFormNavigationHelper::queryDispatch(com::sun::star::util::URL const&)
(this=0x7781dc8, _rURL=...) at forms/source/helper/formnavigation.cxx:263
#1  0x00007f85f9087ec1 in frm::OFormNavigationHelper::connectDispatchers()
(this=0x7781dc8) at forms/source/helper/formnavigation.cxx:200
#2  0x00007f85f9087353 in frm::OFormNavigationHelper::updateDispatches()
(this=0x7781dc8) at forms/source/helper/formnavigation.cxx:146
#3  0x00007f85f8eef7ee in
frm::OButtonControl::modelFeatureUrlPotentiallyChanged() (this=0x7781c80) at
forms/source/component/Button.cxx:623
#4  0x00007f85f8eef701 in
frm::OButtonControl::setModel(com::sun::star::uno::Reference<com::sun::star::awt::XControlModel>
const&) (this=0x7781c80, _rxModel=
    uno::Reference to (UnoControlButtonModel *) 0x393af28) at
forms/source/component/Button.cxx:607
#5  0x00007f864a52ac26 in sdr::contact::(anonymous
namespace)::ControlHolder::setModel(com::sun::star::uno::Reference<com::sun::star::awt::XControlModel>
const&) const
    (this=0x7fffa2d6e700, _m=uno::Reference to (UnoControlButtonModel *)
0x393af28) at svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx:187

Notice URL:
{Complete = ".uno:FormController/moveToFirst", Main =
".uno:FormController/moveToFirst", Protocol = ".uno:", User = "", Password =
"", Server = "", 
  Port = 0, Path = "FormController/moveToFirst", Name = "", Arguments = "",
Mark = ""}

It's also during form opening that the method "getModelUrlFeatureId" you quoted
in your previous comment is called:
#0  frm::OButtonControl::getModelUrlFeatureId() const (this=0x73d2820) at
forms/source/component/Button.cxx:655
#1  0x00007f85f8eef787 in
frm::OButtonControl::modelFeatureUrlPotentiallyChanged() (this=0x73d2820) at
forms/source/component/Button.cxx:618
#2  0x00007f85f8eef701 in
frm::OButtonControl::setModel(com::sun::star::uno::Reference<com::sun::star::awt::XControlModel>
const&)
    (this=0x73d2820, _rxModel=uno::Reference to (UnoControlButtonModel *)
0x3e49c88) at forms/source/component/Button.cxx:607
#3  0x00007f864a52ac26 in sdr::contact::(anonymous
namespace)::ControlHolder::setModel(com::sun::star::uno::Reference<com::sun::star::awt::XControlModel>
const&) const
    (this=0x7fffa2d6e700, _m=uno::Reference to (UnoControlButtonModel *)
0x3e49c88) at svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx:187

Then once in the form, each click on one of these button calls:
#0  frm::OFormNavigationHelper::dispatch(short) const (this=0x7784578,
_nFeatureId=5) at forms/source/helper/formnavigation.cxx:287
#1  0x00007f85f8eeeef3 in frm::OButtonControl::actionPerformed_Impl(bool,
com::sun::star::awt::MouseEvent const&) (this=0x7784430,
_bNotifyListener=false, _rEvt=...) at forms/source/component/Button.cxx:498
#2  0x00007f85f8eeed58 in frm::OButtonControl::OnClick(void*) (this=0x7784430)
at forms/source/component/Button.cxx:478
#3  0x00007f85f8eee5c0 in frm::OButtonControl::LinkStubOnClick(void*, void*)
(instance=0x7784430, data=0x0) at forms/source/component/Button.cxx:429
#4  0x00007f864739e9e8 in Link<void*, void>::Call(void*) const (this=0x6e1ec78,
data=0x0) at include/tools/link.hxx:111
#5  0x00007f864739abee in ImplHandleUserEvent(ImplSVEvent*)
(pSVEvent=0x6e1ec70) at vcl/source/window/winproc.cxx:1990


Now, let's take a look at image button which doesn't work.
When opening form there's some preparation with:
#0 
frm::OImageButtonModel::describeFixedProperties(com::sun::star::uno::Sequence<com::sun::star::beans::Property>&)
const (this=0x6f92d40, _rProps=empty uno::Sequence)
    at forms/source/component/ImageButton.cxx:78
#1  0x00007f85f8fd2c7c in
frm::OControlModel::describeFixedAndAggregateProperties(com::sun::star::uno::Sequence<com::sun::star::beans::Property>&,
com::sun::star::uno::Sequence<com::sun::star::beans::Property>&) const
(this=0x6f92d60, _out_rFixedProperties=empty uno::Sequence,
_out_rAggregateProperties=empty uno::Sequence) at
forms/source/component/FormComponent.cxx:1040
#2  0x00007f85f9070f4c in frm::PropertyBagHelper::impl_ts_getArrayHelper()
const (this=0x6f92ec8) at forms/source/component/propertybaghelper.cxx:154
#3  0x00007f85f8f6e7a5 in frm::PropertyBagHelper::getInfoHelper() const
(this=0x6f92ec8) at forms/source/inc/propertybaghelper.hxx:112
#4  0x00007f85f8fd2e9e in frm::OControlModel::getInfoHelper() (this=0x6f92d60)
at forms/source/component/FormComponent.cxx:1056
#5  0x00007f85f8fd2dde in frm::OControlModel::getPropertySetInfo()
(this=0x6f92d60) at forms/source/component/FormComponent.cxx:1051
#6  0x00007f85f8fd2e6d in non-virtual thunk to
frm::OControlModel::getPropertySetInfo() () at
forms/source/component/FormComponent.cxx:1051
#7  0x00007f8643d7efc2 in xmloff::OControlImport::createElement()
(this=0x3e6e210) at xmloff/source/forms/elementimport.cxx:1039

and each click on image button is done here:
Thread 1 "soffice.bin" hit Breakpoint 5,
frm::OClickableImageBaseControl::actionPerformed_Impl (this=0x6e27910,
bNotifyListener=false, rEvt=...) at
forms/source/component/clickableimage.cxx:330
330                             xDisp->dispatch( aHyperLink, aProps );
(gdb) bt
#0  frm::OClickableImageBaseControl::actionPerformed_Impl(bool,
com::sun::star::awt::MouseEvent const&) (this=0x6e27910, bNotifyListener=false,
rEvt=...) at forms/source/component/clickableimage.cxx:330
#1  0x00007f85f9027245 in
frm::OImageButtonControl::mousePressed(com::sun::star::awt::MouseEvent const&)
(this=0x6e27910, e=...) at forms/source/component/ImageButton.cxx:207
#2  0x00007f8649721097 in
MouseListenerMultiplexer::mousePressed(com::sun::star::awt::MouseEvent const&)
(this=0x783b738, evt=...) at toolkit/source/helper/listenermultiplexer.cxx:106
#3  0x00007f8649721097 in
MouseListenerMultiplexer::mousePressed(com::sun::star::awt::MouseEvent const&)
(this=0x6e2ebc8, evt=...) at toolkit/source/helper/listenermultiplexer.cxx:106
#4  0x00007f86494cda84 in VCLXWindow::ProcessWindowEvent(VclWindowEvent
const&)::$_2::operator()() const (this=0x79f44c0) at
toolkit/source/awt/vclxwindow.cxx:726

let's take a look at URL:
(gdb) p aHyperLink
$3 = {Complete = ".uno:OpenHyperlink", Main = ".uno:OpenHyperlink", Protocol =
".uno:", User = "", Password = "", Server = "", Port = 0, Path =
"OpenHyperlink", Name = "", Arguments = "", Mark = ""}

all the info are in the second arg of "dispatch", "aProps":
(gdb) p aProps
$4 = uno::Sequence of length 3 = {{Name = "URL", Handle = 0, Value =
uno::Any("string": ".uno:FormController/moveToNext"), State =
com::sun::star::beans::PropertyState::PropertyState_DIRECT_VALUE}, {
    Name = "FrameName", Handle = 0, Value = uno::Any("string": "_blank"), State
= com::sun::star::beans::PropertyState::PropertyState_DIRECT_VALUE}, {Name =
"Referer", Handle = 0, 
    Value = uno::Any("string": ""), State =
com::sun::star::beans::PropertyState::PropertyState_DIRECT_VALUE}}

Now let's take a look at m_pFeatureInterception declared the same way as
::std::unique_ptr< ControlFeatureInterception > in
forms/source/inc/formnavigation.hxx and
forms/source/component/clickableimage.hxx

ControlFeatureInterception is a "helper class for controls which allow some of
their features to be intercepted"  (see
https://opengrok.libreoffice.org/xref/core/forms/source/inc/controlfeatureinterception.hxx?r=f0c8312b#48)

(Argh, I must go back to work, I'll keep on later)

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/libreoffice-bugs/attachments/20201202/d2c70dc2/attachment.htm>


More information about the Libreoffice-bugs mailing list