Как узнать, какие интерфейсы Java поддерживает объект OpenOffice Calc UNO (через queryInterface)

Я разрабатываю «макрос» для OpenOffice Calc. В качестве языка я выбрал Java, чтобы получить помощь по коду в Eclipse. Я даже написал небольшой скрипт сборки ant, который компилирует и встраивает «макрос» в файл *.ods. В целом это работает отлично и на удивление быстро; Я уже довольно успешно использую некоторые простые вещи.

НО

Так часто я застреваю, потому что с UNO мне нужно «запросить» интерфейс для любого заданного нетривиального объекта, чтобы иметь доступ к данным/методам вызова этого объекта. То есть мне буквально нужно угадать, какие интерфейсы может предоставить данный объект. Это совсем не очевидно и даже не заметно во время Java-разработки (посредством какой-то метаинформации, отражения и т.п.), а также скудно документировано (я скачал кучу материала, но не знаю). не могу найти исходный код или, может быть, JavaDoc для интерфейсов, которые я использую, таких как XButton, XPropertySet и т. д. - XButton есть setLabel, но нет getLabel - что??).

Есть онлайн-документация (по самым фундаментальным понятиям, что совсем неплохо!), но в ней не хватает многих деталей, с которыми я сталкивался. Он всегда волшебным образом останавливается именно в той точке, которую мне нужно решить.

Я хочу посмотреть на код C++, чтобы понять, какие интерфейсы может предоставить объект (например, кнопка/событие, с которым я сейчас застрял). Как ни странно, имена классов и файлов C++ не совсем соответствуют интерфейсам Java. Это почти то, что я ищу, но тогда в Java я действительно не нахожу эквивалента, или вызов queryInterface для данного объекта возвращает null. Это становится немного расстраивает.

Как создаются интерфейсы UNO Java? Есть ли какая-то документация в коде, который служит источником для сгенерированного (Java) кода?

Я думаю, что мне действительно нужно знать, какие интерфейсы доступны в какой момент времени, чтобы стать немного более беглым во время разработки Java-UNO-macro.


person SomeDev    schedule 06.09.2017    source источник


Ответы (1)


Для любого серьезного проекта UNO используйте инструмент самоанализа.

В качестве примера я создал кнопку в Calc, а затем использовал Java Инспектор объектов, чтобы перейти к кнопка. Щелчок правой кнопкой мыши и выбор «Добавить в исходный код» привели к следующему.

import com.sun.star.awt.XControlModel;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XIndexAccess;
import com.sun.star.container.XNameAccess;
import com.sun.star.drawing.XControlShape;
import com.sun.star.drawing.XDrawPage;
import com.sun.star.drawing.XDrawPageSupplier;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheets;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;

//...
public void codesnippet(XInterface _oUnoEntryObject){
try{
    XSpreadsheetDocument xSpreadsheetDocument =  (XSpreadsheetDocument) UnoRuntime.queryInterface(XSpreadsheetDocument.class, _oUnoEntryObject);
    XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
    XNameAccess xNameAccess =  (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, xSpreadsheets);
    Object oName = xNameAccess.getByName("Sheet1");
    XDrawPageSupplier xDrawPageSupplier =  (XDrawPageSupplier) UnoRuntime.queryInterface(XDrawPageSupplier.class, oName);
    XDrawPage xDrawPage = xDrawPageSupplier.getDrawPage();
    XIndexAccess xIndexAccess =  (XIndexAccess) UnoRuntime.queryInterface(XIndexAccess.class, xDrawPage);
    Object oIndex = xIndexAccess.getByIndex(0);
    XControlShape xControlShape =  (XControlShape) UnoRuntime.queryInterface(XControlShape.class, oIndex);
    XControlModel xControlModel = xControlShape.getControl();
    XPropertySet xPropertySet =  (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xControlModel);
    String sLabel = AnyConverter.toString(xPropertySet.getPropertyValue("Label"));
}catch (com.sun.star.beans.UnknownPropertyException e){
    e.printStackTrace(System.out);
    //Enter your Code here...
}catch (com.sun.star.lang.WrappedTargetException e2){
    e2.printStackTrace(System.out);
    //Enter your Code here...
}catch (com.sun.star.lang.IllegalArgumentException e3){
    e3.printStackTrace(System.out);
    //Enter your Code here...
}
}
//...

Python-UNO может быть лучше, чем Java, потому что не требует запросов к определенным интерфейсам. Кроме того, XrayTool и MRI проще в использовании, чем Java Object Inspector.

person Jim K    schedule 06.09.2017
comment
Отлично! Большое спасибо. Подсказка Python также хороша, я уже подозревал, что подходы, отличные от Java/-C++, обеспечивают более легкий доступ. Спасибо! - person SomeDev; 09.09.2017