Доступ к com.sun.star.text.textfield.Annotation в {Libre,Open}Office Writer с использованием Java
Я использую Java для перебора всех абзацев и TextPortions внутри объекта XText.
Когда я проверяю TextPortionType:
XPropertySet props= UnoRuntime.queryInferface(XPropertySet.class, portion);
String portionType= (String)props.getPropertyValue("TextPortionType");
if(portionType.equals("Annotation"))
{
// get com.sun.star.text.textfield.Annotation
}
и встретить Annotation
или же AnnotationEnd
Я хотел бы получить доступ к соответствующей аннотации (и позже создать некоторые самостоятельно).
Я знаю об услуге com.sun.star.text.textfield.Annotation, однако Annotation
указывает через XServiceInfo
что это не поддерживает. Как получить ссылку на Annotation
из аннотации, с которой я сталкиваюсь в TextPortion?
Как я могу создавать аннотации самостоятельно?
Я использую OpenOffice 4.1.1.
1 ответ
Документы API LibreOffice показывают, что сервис com.sun.star.text.textfield.Annotation
обеспечивает единый интерфейс: XTextField
, Хотя "Аннотация" не документируется как возможное значение для TextPortionType
, значение свойства "TextField" является службой аннотации.
Чтобы получить доступ к свойствам аннотации, выполните:
XPropertySet portionProps= UnoRuntime.queryInferface(XPropertySet.class, portion);
String portionType= (String)portionProps.getPropertyValue("TextPortionType");
if(portionType.equals("Annotation"))
{
// get com.sun.star.text.textfield.Annotation
Object textField= portionProps.getPropertyValue("TextField");
XPropertySet annotProps= UnoRuntime.queryInterface(XPropertySet.class, textField);
String author= (String)annotProps.getPropertyValue("Author");
// ...
}
Атрибутами сервиса Аннотации являются:
- автор
- содержание
- название
- INITIALIS
- DateTimeValue
- Дата
- TextRange
- IsFieldUsed
- IsFieldDisplayed
- TextWrap
- AnchorTypes
- AnchorType
PropertyValue "TextField" не установлено для TextPortionType "AnnotationEnd". Там тоже нет сервиса AnnotationEnd
,
Аннотации могут быть созданы следующим образом:
public static void createAnnotation( XComponentContext xContext, XTextRange xTextRange )
{
// per-document stuff
XMultiComponentFactory xServiceManager= xContext.getServiceManager();
Object desktop= xServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
XComponent xComponent= xDesktop.getCurrentComponent();
XTextDocument xTextDocument= UnoRunime.queryInterface(XTextDocument.class, xComponent);
XText xText= xTextDocument.getText();
XMultiServiceFactory xWriterFactory= UnoRuntime.queryInterface(XMultiServiceFactory.class, xComponent);
// per-annotation stuff
Object annotation= xWriterFactory.createInstance("com.sun.star.text.textfield.nnotation");
XPropertySet annotProps= UnoRuntime.queryInterface(XPropertySet.class, annotation);
annotProps.setValue("Content", "It's a me!")
annotProps.setValue("Author", "Mario");
XTextField annotTextField= UnoRuntime.queryInterface(XTextfield.class, annotation);
xText.insertTextContent( xTextRange, annotTextField, true ); // "true" spans the range
}
Аннотации тоже можно удалить. Будьте осторожны при попытке удалить аннотации с включенным отслеживанием изменений: getPropertyValue("TextPortionType")
может вызвать RuntimeException на ApacheOO 4.1.1. Также по какой-то причине я еще не отладил, удаление ничего не делает на моем LibreOffice 4.2.7.2
public static void removeAnnotations( XText xText ) throws Exception
{
// follow https://wiki.openoffice.org/wiki/Documentation/DevGuide/Text/Iterating_over_Text
final XEnumerationAccess xParaAccess= UnoRuntime.queryInterface(XEnumerationAccess.class, xText);
final XEnumeration xParaEnum= xParaAccess.createEnumeration();
for( int par_i=0; xParaEnum.hasMoreElements(); par_i++ )
{
final Object para= xParaEnum.nextElement();
final XServiceInfo xParaInfo= UnoRuntime.queryInterface(XServiceInfo.class, para);
final XEnumerationAccess xParamPortionsAccess= UnoRuntime.queryInterface(XEnumerationAccess.class, para);
final XEnumeration xParamPortionsEnum= xParamPortionsAccess.createEnumeration();
for( int port_i=0; xParamPortionsEnum.hasMoreElements(); port_i++ )
{
final Object portion= xParamPortionsEnum.nextElement();
final XPropertySet portProps= UnoRuntime.queryInterface(XPropertySet.class, portion);
// will cause RuntimeException when called with Change Tracking enabled
final String xTextPortionType= (String)portProps.getPropertyValue("TextPortionType");
if( xTextPortionType.equals("Annotation") )
{
final Object annotation= portProps.getPropertyValue("TextField");
final XPropertySet annotProps= UnoRuntime.queryInterface(XPropertySet.class, annotation);
final String annotAuthor= (String)annotProps.getPropertyValue("Author");
if( annotAuthor.equals("Mario")
{
final XTextField xTextField= UnoRuntime.queryInterface(XTextField.class, annotation);
xText.removeTextContent( xTextField );
}
}
// AnnotationEnd has no associated TextField, can't call removeTextContent on anything
}
}
}