Works for document properties.

This commit is contained in:
Georgy Litvinov 2020-04-08 13:42:49 +02:00
parent f9a9aefc72
commit 425bd82592
3 changed files with 126 additions and 22 deletions

View file

@ -0,0 +1,7 @@
package org.libreoffice.example.comp;
public class MetadataInaccessableException extends Exception {
public MetadataInaccessableException(String errorMessage) {
super(errorMessage);
}
}

View file

@ -1,5 +1,6 @@
package pro.litvinovg.libreoffice.metadata;
import java.nio.file.attribute.UserDefinedFileAttributeView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
@ -8,13 +9,18 @@ import java.util.Map;
import org.libreoffice.example.comp.MetadataInaccessableException;
import com.sun.org.apache.bcel.internal.generic.NEW;
import com.sun.star.beans.IllegalTypeException;
import com.sun.star.beans.NotRemoveableException;
import com.sun.star.beans.Property;
import com.sun.star.beans.PropertyExistException;
import com.sun.star.beans.UnknownPropertyException;
import com.sun.star.beans.XPropertyContainer;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.XPropertySetInfo;
import com.sun.star.document.XDocumentProperties;
import com.sun.star.document.XDocumentPropertiesSupplier;
import com.sun.star.frame.XDesktop;
import com.sun.star.lang.IllegalArgumentException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.uno.UnoRuntime;
@ -27,7 +33,7 @@ public class Document {
private static final String DOC_SUBJECT = "Document subject";
private static final String DOC_DESCRIPTION = "Document description";
private static final String DOC_KEYWORDS = "Document keywords";
private static final short REMOVEABLE_ATTRIBUTE = 128;
private XComponentContext context;
private XDesktop xDesktop;
@ -48,7 +54,7 @@ public class Document {
e.printStackTrace();
System.exit(1);
}
logProperties();
//logProperties();
}
private void getCurrentDocument() throws MetadataInaccessableException {
@ -62,7 +68,61 @@ public class Document {
logDocumentProperties();
logDocumentCustomProperties();
}
public void setCustomDocumentProperties(ArrayList<CustomDocumentProperty> docCustomProps) {
documentPropertiesSupplier = UnoRuntime.queryInterface(XDocumentPropertiesSupplier.class, currentDocument);
documentProperties = documentPropertiesSupplier.getDocumentProperties();
removeStringProperties();
addStringProperties(docCustomProps);
}
private void addStringProperties(ArrayList<CustomDocumentProperty> docCustomProps) {
XPropertyContainer userDifinedProperties = documentProperties.getUserDefinedProperties();
for (int i = 0; i < docCustomProps.size();i++) {
CustomDocumentProperty property = docCustomProps.get(i);
try {
userDifinedProperties.addProperty(property.getName(), REMOVEABLE_ATTRIBUTE, property.getValue());
// System.out.println("added "+ property.getName() + " value " + property.getValue());
} catch (IllegalArgumentException e) {
System.out.println("IllegalArgumentException while adding new property");
e.printStackTrace();
} catch (PropertyExistException e) {
System.out.println("Property already exists");
e.printStackTrace();
} catch (IllegalTypeException e) {
System.out.println("Property type illegal");
e.printStackTrace();
}
}
}
private void removeStringProperties() {
XPropertyContainer userDifinedProperties = documentProperties.getUserDefinedProperties();
XPropertySet propertySet = UnoRuntime.queryInterface(XPropertySet.class, userDifinedProperties);
if (propertySet != null) {
XPropertySetInfo propertySetInfo = propertySet.getPropertySetInfo();
if (propertySetInfo != null) {
Property[] props = propertySetInfo.getProperties();
for (Property prop : props) {
if (prop.Type.getTypeName().equals("string")){
try {
userDifinedProperties.removeProperty(prop.Name);
// System.out.println("removed "+ prop.Name);
} catch (UnknownPropertyException e) {
System.out.println("Property " + prop.Name + " does not exist.");
e.printStackTrace();
} catch (NotRemoveableException e) {
System.out.println("Property " + prop.Name + " is not removeable.");
e.printStackTrace();
}
}
}
}
}
}
public ArrayList<CustomDocumentProperty> getDocumentCustomProperties() {
ArrayList<CustomDocumentProperty> customProps = new ArrayList<CustomDocumentProperty>();
documentPropertiesSupplier = UnoRuntime.queryInterface(XDocumentPropertiesSupplier.class, currentDocument);
@ -116,7 +176,6 @@ public class Document {
documentProperties = documentPropertiesSupplier.getDocumentProperties();
if (docProps.containsKey(DOC_AUTHOR)) {
documentProperties.setAuthor(docProps.get(DOC_AUTHOR));
System.out.println("set author" + docProps.get(DOC_AUTHOR));
}
if (docProps.containsKey(DOC_TITLE)) {
documentProperties.setTitle(docProps.get(DOC_TITLE));
@ -132,10 +191,6 @@ public class Document {
}
}
private void updateDocProperty(String propertyName, Map<String, String> docProps) {
}
private void logDocumentProperties() {
documentPropertiesSupplier = UnoRuntime.queryInterface(XDocumentPropertiesSupplier.class, currentDocument);
documentProperties = documentPropertiesSupplier.getDocumentProperties();
@ -177,4 +232,6 @@ public class Document {
}
return value;
}
}

View file

@ -40,6 +40,10 @@ import java.util.Map.Entry;
import java.util.Vector;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.JToggleButton;
import javax.swing.LayoutStyle.ComponentPlacement;
public class EditorGUI extends JFrame {
//Components
@ -56,6 +60,7 @@ public class EditorGUI extends JFrame {
private ArrayList<CustomDocumentProperty> docCustomProps;
private Document document = null;
private JButton btnNewButton;
private JMenuItem menuItemPupupDocUserProps;
/**
@ -75,6 +80,7 @@ public class EditorGUI extends JFrame {
public void run() {
try {
EditorGUI frame = new EditorGUI(doc);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
@ -93,6 +99,7 @@ public class EditorGUI extends JFrame {
public void run() {
try {
EditorGUI frame = new EditorGUI();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
@ -118,11 +125,32 @@ public class EditorGUI extends JFrame {
public void actionPerformed(ActionEvent e) {
updateDocProps();
document.setDocumentProperties(docProps);
updateDocCustomProps();
document.setCustomDocumentProperties(docCustomProps);
}
});
menuItemPupupDocUserProps.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
docCustomPropsModel.addRow(new Object[] {null, null});
}
});
}
private void updateDocCustomProps() {
Vector dataVector = docCustomPropsModel.getDataVector();
Enumeration elements = dataVector.elements();
docCustomProps.clear();
while (elements.hasMoreElements()) {
Vector row = (Vector) elements.nextElement();
String name = (String) row.get(0);
String value = (String) row.get(1);
if (!name.isEmpty() && !value.isEmpty()) {
docCustomProps.add(new CustomDocumentProperty(name, value, "string"));
}
}
}
private void updateDocProps() {
System.out.println("updateDocProps");
Vector dataVector = docPropertiesModel.getDataVector();
Enumeration elements = dataVector.elements();
docProps.clear();
@ -155,11 +183,16 @@ public class EditorGUI extends JFrame {
tableDocProps = new JTable();
tableDocProps.putClientProperty("terminateEditOnFocusLost", true);
tableDocProps.setSurrendersFocusOnKeystroke(true);
tableDocProps.setCellSelectionEnabled(true);
tableDocProps.setFillsViewportHeight(true);
tableDocProps.setModel(docPropertiesModel);
tableDocCustomProps = new JTable();
tableDocCustomProps.putClientProperty("terminateEditOnFocusLost", true);
tableDocCustomProps.setSurrendersFocusOnKeystroke(true);
tableDocCustomProps.setFillsViewportHeight(true);
tableDocCustomProps.setCellSelectionEnabled(true);
tableDocCustomProps.setModel(docCustomPropsModel);
@ -168,31 +201,38 @@ public class EditorGUI extends JFrame {
GroupLayout gl_panel = new GroupLayout(panel);
gl_panel.setHorizontalGroup(
gl_panel.createParallelGroup(Alignment.TRAILING)
.addGroup(Alignment.LEADING, gl_panel.createSequentialGroup()
gl_panel.createParallelGroup(Alignment.LEADING)
.addGroup(Alignment.TRAILING, gl_panel.createSequentialGroup()
.addContainerGap(838, Short.MAX_VALUE)
.addComponent(btnNewButton)
.addGap(58))
.addGroup(gl_panel.createSequentialGroup()
.addContainerGap()
.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)
.addGroup(gl_panel.createSequentialGroup()
.addComponent(tableDocProps, GroupLayout.DEFAULT_SIZE, 940, Short.MAX_VALUE)
.addContainerGap())
.addGroup(Alignment.TRAILING, gl_panel.createSequentialGroup()
.addComponent(btnNewButton)
.addGap(58))
.addGroup(Alignment.TRAILING, gl_panel.createSequentialGroup()
.addComponent(tableDocCustomProps, GroupLayout.DEFAULT_SIZE, 940, Short.MAX_VALUE)
.addContainerGap())))
.addComponent(tableDocCustomProps, GroupLayout.DEFAULT_SIZE, 940, Short.MAX_VALUE)
.addContainerGap())
.addGroup(gl_panel.createSequentialGroup()
.addContainerGap()
.addComponent(tableDocProps, GroupLayout.DEFAULT_SIZE, 940, Short.MAX_VALUE)
.addContainerGap())
);
gl_panel.setVerticalGroup(
gl_panel.createParallelGroup(Alignment.LEADING)
.addGroup(gl_panel.createSequentialGroup()
.addGap(86)
.addComponent(tableDocProps, GroupLayout.PREFERRED_SIZE, 81, GroupLayout.PREFERRED_SIZE)
.addGap(18)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(tableDocCustomProps, GroupLayout.DEFAULT_SIZE, 368, Short.MAX_VALUE)
.addGap(75)
.addGap(81)
.addComponent(btnNewButton)
.addGap(27))
);
JPopupMenu popupMenu = new JPopupMenu();
addPopup(tableDocCustomProps, popupMenu);
menuItemPupupDocUserProps = new JMenuItem("Добавить строку");
popupMenu.add(menuItemPupupDocUserProps);
panel.setLayout(gl_panel);