On 10/09/14 04:58, Noel Power wrote:
On 09/09/14 15:55, Justin Luth wrote:
I have identified that the vbahelper function getCurrentDoc() is
broken, causing bug 71248
I'm still going to try to figure out how to properly fix
"getCurrentDoc" but so far I don't really understand what it is doing.
I haven't looked at that code in a long time so feel free to dive in
there, iirc basically 'THIS' is tracked in the uno context (VBA has a
custom uno context), CURRENT should be accessible as a UNO global
variable inserted in to 'application' StarBasic. It sounds like
somehow somewhere getCurrentDoc either is no longer searching for the
correct variable, or its no longer getting updated (used to be updated
somewhere in sfx2/.../objxstor.cxx (try searching for 'ThisComponent',
it's bound to be handled somewhere close to that)
There used to be some confusing (but necessary) indirection to
handling this e.g. because Libreoffice is a single application (and
VBA support was trying to support both Word & Excel) the code in
objxstor.cxx needs to find out which variable in StartBasic to update,
in the case of a Word document it would need to update StarBasic
variable named 'ThisWordDoc' & for Excel 'ThisExcelDoc' variable (both
can exist simulateously if multiple documents xls/doc are open). That
is my recollection how this used to work, it is possible imports from
AOO code have trampled/changed this possibly in an incompatible way
Noel, Thanks for that information. I've attached a diff that seems to
fix the problem of the GlobalUNOConstant/Standard library names
'ThisWordDoc' and 'ThisExcelDoc' not being updated when the active
document changes.
Are you willing to review this and enter it into master/4.3 if it is
good? I spent two weeks just trying to understand what is going on
here, so I don't feel competent to try and submit the patch myself.
Thanks,
Justin
https://bugs.freedesktop.org/show_bug.cgi?id=71248
99a100,101
#include <com/sun/star/frame/XModel2.hpp>
#include <com/sun/star/frame/ModuleManager.hpp>
978a981,994
uno::Reference< uno::XComponentContext > xContext(
::comphelper::getProcessComponentContext(), uno::UNO_QUERY_THROW );
uno::Reference< frame::XModuleManager2 > xModuleManager(
frame::ModuleManager::create(xContext) );
OUString aIdentifier = xModuleManager->identify( _rxComponent );
if (aIdentifier == (OUString)"com.sun.star.sheet.SpreadsheetDocument")
{
//set "ThisExcelDoc" to mark the last active Excel document for VBA
pAppMgr->SetGlobalUNOConstant( "ThisExcelDoc", Any( _rxComponent ) );
}
else if (aIdentifier == (OUString)"com.sun.star.text.TextDocument")
{
//set "ThisExcelDoc" to mark the last active Word document for VBA
pAppMgr->SetGlobalUNOConstant( "ThisWordDoc", Any( _rxComponent ) );
}
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.