From adf19bc4ab26549a2029e7fb87bb21671d88756a Mon Sep 17 00:00:00 2001 From: Georgy Litvinov Date: Thu, 16 Apr 2020 14:08:29 +0200 Subject: [PATCH] Working on GUI --- .../litvinovg/libreoffice/MetadataReader.java | 13 +- .../libreoffice/metadata/Document.java | 4 +- .../libreoffice/metadata/OutlineElement.java | 48 ++-- .../libreoffice/metadata/views/EditorGUI.java | 265 ++++++++++-------- 4 files changed, 190 insertions(+), 140 deletions(-) diff --git a/source/pro/litvinovg/libreoffice/MetadataReader.java b/source/pro/litvinovg/libreoffice/MetadataReader.java index 74f639a..cbc6d2e 100644 --- a/source/pro/litvinovg/libreoffice/MetadataReader.java +++ b/source/pro/litvinovg/libreoffice/MetadataReader.java @@ -15,6 +15,7 @@ import static pro.litvinovg.libreoffice.metadata.Document.*; public class MetadataReader extends DocumentParserImpl { private ArrayList outline; + private boolean firstPara = true; public MetadataReader(XText text, ArrayList outline) { super(text); @@ -24,7 +25,6 @@ public class MetadataReader extends DocumentParserImpl { public void parse() { parseText(text); OutlineElement lastElement = outline.get(outline.size()-1); - lastElement.setAnnotationEnd(documentEnd); } @Override @@ -59,11 +59,14 @@ public class MetadataReader extends DocumentParserImpl { } catch (WrappedTargetException e) { e.printStackTrace(); } - if (outlineLevel != null && outlineLevel > 0) { + if (firstPara || (outlineLevel != null && outlineLevel > 0)) { XTextRange textRange = textContent.getAnchor(); - OutlineElement lastElement = outline.get(outline.size()-1); - lastElement.setAnnotationEnd(textContent.getAnchor().getStart()); - outline.add(new OutlineElement(textRange)); + if (firstPara) { + outline.add(new OutlineElement(textRange, "Документ")); + firstPara = false; + } else { + outline.add(new OutlineElement(textRange, textRange.getString())); + } } } } diff --git a/source/pro/litvinovg/libreoffice/metadata/Document.java b/source/pro/litvinovg/libreoffice/metadata/Document.java index f8fbb12..6a41280 100644 --- a/source/pro/litvinovg/libreoffice/metadata/Document.java +++ b/source/pro/litvinovg/libreoffice/metadata/Document.java @@ -82,12 +82,12 @@ public class Document { reader.parse(); } - private void writeMetadata() { + private void writeOutlineMetadata() { cleanMetadataInDocument(); for (OutlineElement element : outline){ Object annotation; try { - annotation = multiServiceFactory.createInstance("com.sun.star.text.textfield.nnotation"); + annotation = multiServiceFactory.createInstance("com.sun.star.text.textfield.annotation"); element.writeMetadata(annotation); } catch (com.sun.star.uno.Exception e) { e.printStackTrace(); diff --git a/source/pro/litvinovg/libreoffice/metadata/OutlineElement.java b/source/pro/litvinovg/libreoffice/metadata/OutlineElement.java index e394269..ed4488e 100644 --- a/source/pro/litvinovg/libreoffice/metadata/OutlineElement.java +++ b/source/pro/litvinovg/libreoffice/metadata/OutlineElement.java @@ -19,25 +19,38 @@ import com.sun.star.uno.UnoRuntime; import static pro.litvinovg.libreoffice.metadata.Document.*; public class OutlineElement { - private String name; + private String elementName; private ArrayList metadata = null; public String getName() { - return name; + return elementName; } private XTextRange textRange; - private XTextRange annotationStart = null; - private XTextRange annotationEnd = null; - public OutlineElement(XTextRange textRange) { + public OutlineElement(XTextRange textRange, String name) { this.textRange = textRange; - this.name = textRange.getString(); + this.elementName = name; this.metadata = new ArrayList(); - annotationStart = textRange.getStart(); } - public void setAnnotationEnd(XTextRange anchor) { - this.annotationEnd = anchor; + + public Object[][] metadataToArray() { + Object [] [] result = null; + int size = metadata.size(); + if (metadata.size() == 0) { + result = new Object[][] { + {null, null}, + {null, null}, + {null, null}, + }; + } else { + result = new Object [size] [2]; + for (int i = 0; i < size; i++) { + result[i][0] = metadata.get(i).getName(); + result[i][1] = metadata.get(i).getValue(); + } + } + return result; } public void readMetadata(String data) { @@ -59,24 +72,23 @@ public class OutlineElement { private String metadataToString() { JSONObject json = new JSONObject(); for (MetadataElement element : metadata) { - json.put(element.getName(), element.getValue()); + String name = element.getName(); + String value = element.getValue(); + if (!name.isEmpty() && !value.isEmpty()) { + json.put(element.getName(), element.getValue()); + } } return json.toString(); } + public void writeMetadata(Object annotation) { XPropertySet properties = UnoRuntime.queryInterface(XPropertySet.class, annotation); - XText startText = annotationStart.getText(); + XText startText = textRange.getText(); try { properties.setPropertyValue("Author", METADATA_EXTENSION); properties.setPropertyValue("Content", metadataToString()); XTextRange annotationRange = null; - if (startText.equals(annotationEnd.getText())){ - XTextCursor cursor = startText.createTextCursorByRange(annotationStart); - cursor.gotoRange(annotationEnd, true); - annotationRange = UnoRuntime.queryInterface(XTextRange.class, cursor); - } else { - annotationRange = textRange; - } + annotationRange = textRange; XTextField textField = UnoRuntime.queryInterface(XTextField.class, annotation); startText.insertTextContent( annotationRange, textField, true ); } catch (IllegalArgumentException e) { diff --git a/source/pro/litvinovg/libreoffice/metadata/views/EditorGUI.java b/source/pro/litvinovg/libreoffice/metadata/views/EditorGUI.java index c786fba..21243f6 100644 --- a/source/pro/litvinovg/libreoffice/metadata/views/EditorGUI.java +++ b/source/pro/litvinovg/libreoffice/metadata/views/EditorGUI.java @@ -49,24 +49,27 @@ import javax.swing.JLabel; public class EditorGUI extends JFrame { //Components - private JTable tableDocProps; - private JTable tableDocCustomProps; + private JTable tableDocStandard; + private JTable tableDocCustom; //Component models private DefaultTableModel docPropertiesModel; private DefaultTableModel docCustomPropsModel; - private DefaultTableModel outlineTableModel; + //GroupLayouts + + private Map docProps; private ArrayList docCustomProps; private Document document = null; - private JButton btnNewButton; + private JButton btnSaveButton; private JMenuItem menuItemPupupDocUserProps; private ArrayList outline; - private JTable tableOutline; - private JPanel panelForOutline; + private JTabbedPane tabbedPane; + private JPanel panelStandardMetadata; + private JMenuBar menuBar; /** @@ -129,12 +132,10 @@ public class EditorGUI extends JFrame { } private void createEvents() { - btnNewButton.addActionListener(new ActionListener() { + + btnSaveButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - updateDocProps(); - document.setDocumentProperties(docProps); - updateDocCustomProps(); - document.setCustomDocumentProperties(docCustomProps); + saveAction(); } }); @@ -170,135 +171,163 @@ public class EditorGUI extends JFrame { } } private void initComponents() { - setIconImage(Toolkit.getDefaultToolkit().getImage(EditorGUI.class.getResource("/pro/litvinovg/libreoffice/metadata/resources/webcam.png"))); - setTitle("Редактор метаданных"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setBounds(100, 100, 1064, 733); - getContentPane().setLayout(null); - getContentPane().setLayout(new GridLayout(0, 1, 0, 0)); - - JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.LEFT, JTabbedPane.SCROLL_TAB_LAYOUT); - tabbedPane.setBounds(125, 138, 913, 546); - getContentPane().add(tabbedPane); - - JPanel panel = new JPanel(); - tabbedPane.addTab("Документ", null, panel, null); - for (OutlineElement element : outline) { - JPanel panelForOutline = new JPanel(); - tabbedPane.addTab(element.getName(), null, panelForOutline, null); + configureWindow(); + panelStandardMetadata = new JPanel(); + tabbedPane.addTab("Метаданные либры", null, panelStandardMetadata, null); + tabbedPane.setEnabledAt(0, true); + if (true) { + //TEST ONLY + addMetadataTab(new OutlineElement(null, "Тестовое название")); + } + for (OutlineElement element : outline) { + addMetadataTab(element); } - panelForOutline = new JPanel(); - tabbedPane.addTab("секция", null, panelForOutline, null); - tableOutline = new JTable(); - createOutlineTableModel(); + createDocPropsModel(); + createCustomDocPropsModel(); + tableDocStandard = new JTable(); + tableDocCustom = new JTable(); + configureTableDocStandard(); + configureTableDocCustom(); + + btnSaveButton = new JButton("Сохранить"); + + GroupLayout gl_panelStandardMetadata = new GroupLayout(panelStandardMetadata); + configureGroupLayoutDoc(gl_panelStandardMetadata); + + JPopupMenu popupMenu = new JPopupMenu(); + addPopup(tableDocCustom, popupMenu); + + menuItemPupupDocUserProps = new JMenuItem("Добавить строку"); + + popupMenu.add(menuItemPupupDocUserProps); + panelStandardMetadata.setLayout(gl_panelStandardMetadata); + + menuBar = new JMenuBar(); + setJMenuBar(menuBar); + + JMenu mnFile = new JMenu("Файл"); + menuBar.add(mnFile); + } + + private void addMetadataTab(OutlineElement element) { + JPanel panelOutline = new JPanel(); + JTable tableOutline = new JTable(); + DefaultTableModel outlineTableModel = createOutlineTableModel(element); + configureTableOutline(tableOutline, outlineTableModel); + + JButton btnOutlineSave = new JButton("Сохранить"); + btnOutlineSave.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + saveAction(); + } + }); + + GroupLayout groupLayoutOutlineMetadata = new GroupLayout(panelOutline); + groupLayoutOutlineMetadata.setHorizontalGroup( + groupLayoutOutlineMetadata.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayoutOutlineMetadata.createSequentialGroup() + .addGap(34) + .addComponent(tableOutline, GroupLayout.DEFAULT_SIZE, 839, Short.MAX_VALUE) + .addGap(126)) + .addGroup(Alignment.TRAILING, groupLayoutOutlineMetadata.createSequentialGroup() + .addContainerGap(748, Short.MAX_VALUE) + .addComponent(btnOutlineSave) + .addGap(134)) + ); + groupLayoutOutlineMetadata.setVerticalGroup( + groupLayoutOutlineMetadata.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayoutOutlineMetadata.createSequentialGroup() + .addGap(85) + .addComponent(tableOutline, GroupLayout.DEFAULT_SIZE, 497, Short.MAX_VALUE) + .addGap(52) + .addComponent(btnOutlineSave) + .addGap(43)) + ); + panelOutline.setLayout(groupLayoutOutlineMetadata); + tabbedPane.addTab(element.getName(), null, panelOutline, null); + } + + private void configureTableOutline(JTable tableOutline, DefaultTableModel outlineTableModel) { tableOutline.setModel(outlineTableModel); tableOutline.putClientProperty("terminateEditOnFocusLost", true); tableOutline.setSurrendersFocusOnKeystroke(true); tableOutline.setCellSelectionEnabled(true); tableOutline.setFillsViewportHeight(true); - - GroupLayout gl_panelForOutline = new GroupLayout(panelForOutline); - gl_panelForOutline.setHorizontalGroup( - gl_panelForOutline.createParallelGroup(Alignment.LEADING) - .addGroup(gl_panelForOutline.createSequentialGroup() - .addGap(34) - .addComponent(tableOutline, GroupLayout.DEFAULT_SIZE, 804, Short.MAX_VALUE) - .addGap(126)) - ); - gl_panelForOutline.setVerticalGroup( - gl_panelForOutline.createParallelGroup(Alignment.LEADING) - .addGroup(gl_panelForOutline.createSequentialGroup() - .addGap(85) - .addComponent(tableOutline, GroupLayout.DEFAULT_SIZE, 475, Short.MAX_VALUE) - .addGap(120)) - ); - panelForOutline.setLayout(gl_panelForOutline); - - tabbedPane.setEnabledAt(0, true); - - - createDocPropsModel(); - createCustomDocPropsModel(); - - - tableDocProps = new JTable(); - tableDocProps.putClientProperty("terminateEditOnFocusLost", true); - tableDocProps.setSurrendersFocusOnKeystroke(true); - tableDocProps.setCellSelectionEnabled(true); - tableDocProps.setFillsViewportHeight(true); - tableDocProps.setModel(docPropertiesModel); - - tableDocCustomProps = new JTable(); - tableDocCustomProps.setColumnSelectionAllowed(true); - tableDocCustomProps.putClientProperty("terminateEditOnFocusLost", true); + } - tableDocCustomProps.setSurrendersFocusOnKeystroke(true); - tableDocCustomProps.setFillsViewportHeight(true); - tableDocCustomProps.setCellSelectionEnabled(true); - tableDocCustomProps.setModel(docCustomPropsModel); - - btnNewButton = new JButton("Save"); + private void configureWindow() { + setIconImage(Toolkit.getDefaultToolkit().getImage(EditorGUI.class.getResource("/pro/litvinovg/libreoffice/metadata/resources/webcam.png"))); + setTitle("Редактор метаданных"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(100, 100, 1170, 755); + getContentPane().setLayout(null); + getContentPane().setLayout(new GridLayout(0, 1, 0, 0)); + tabbedPane = new JTabbedPane(JTabbedPane.LEFT, JTabbedPane.SCROLL_TAB_LAYOUT); + tabbedPane.setBounds(125, 138, 913, 546); + getContentPane().add(tabbedPane); + } + + private void configureTableDocStandard() { + tableDocStandard.putClientProperty("terminateEditOnFocusLost", true); + tableDocStandard.setSurrendersFocusOnKeystroke(true); + tableDocStandard.setCellSelectionEnabled(true); + tableDocStandard.setFillsViewportHeight(true); + tableDocStandard.setModel(docPropertiesModel); + } + + private void configureTableDocCustom() { + tableDocCustom.setColumnSelectionAllowed(true); + tableDocCustom.putClientProperty("terminateEditOnFocusLost", true); + tableDocCustom.setSurrendersFocusOnKeystroke(true); + tableDocCustom.setFillsViewportHeight(true); + tableDocCustom.setCellSelectionEnabled(true); + tableDocCustom.setModel(docCustomPropsModel); + } + + private void configureGroupLayoutDoc(GroupLayout gl_panelStandardMetadata) { JLabel labelDocProperties = new JLabel("Основные метаданные"); - JLabel labelDocCustomProperties = new JLabel("Дополнительные метаданные"); - - GroupLayout gl_panel = new GroupLayout(panel); - gl_panel.setHorizontalGroup( - gl_panel.createParallelGroup(Alignment.TRAILING) - .addGroup(Alignment.LEADING, gl_panel.createSequentialGroup() + gl_panelStandardMetadata.setHorizontalGroup( + gl_panelStandardMetadata.createParallelGroup(Alignment.TRAILING) + .addGroup(Alignment.LEADING, gl_panelStandardMetadata.createSequentialGroup() .addGap(378) .addComponent(labelDocProperties, GroupLayout.DEFAULT_SIZE, 260, Short.MAX_VALUE) .addGap(421)) - .addGroup(Alignment.LEADING, gl_panel.createSequentialGroup() + .addGroup(Alignment.LEADING, gl_panelStandardMetadata.createSequentialGroup() .addContainerGap() - .addGroup(gl_panel.createParallelGroup(Alignment.LEADING) - .addGroup(gl_panel.createSequentialGroup() - .addComponent(tableDocProps, GroupLayout.DEFAULT_SIZE, 940, Short.MAX_VALUE) + .addGroup(gl_panelStandardMetadata.createParallelGroup(Alignment.LEADING) + .addGroup(gl_panelStandardMetadata.createSequentialGroup() + .addComponent(tableDocStandard, GroupLayout.DEFAULT_SIZE, 940, Short.MAX_VALUE) .addContainerGap()) - .addGroup(Alignment.TRAILING, gl_panel.createSequentialGroup() - .addComponent(btnNewButton) - .addGap(294)))) - .addGroup(Alignment.LEADING, gl_panel.createSequentialGroup() + .addGroup(Alignment.TRAILING, gl_panelStandardMetadata.createSequentialGroup() + .addComponent(btnSaveButton) + .addGap(154)))) + .addGroup(Alignment.LEADING, gl_panelStandardMetadata.createSequentialGroup() .addGap(350) .addComponent(labelDocCustomProperties, GroupLayout.DEFAULT_SIZE, 233, Short.MAX_VALUE) .addGap(381)) - .addGroup(Alignment.LEADING, gl_panel.createSequentialGroup() + .addGroup(Alignment.LEADING, gl_panelStandardMetadata.createSequentialGroup() .addContainerGap() - .addComponent(tableDocCustomProps, GroupLayout.DEFAULT_SIZE, 940, Short.MAX_VALUE) + .addComponent(tableDocCustom, GroupLayout.DEFAULT_SIZE, 940, Short.MAX_VALUE) .addContainerGap()) ); - gl_panel.setVerticalGroup( - gl_panel.createParallelGroup(Alignment.LEADING) - .addGroup(gl_panel.createSequentialGroup() + gl_panelStandardMetadata.setVerticalGroup( + gl_panelStandardMetadata.createParallelGroup(Alignment.LEADING) + .addGroup(gl_panelStandardMetadata.createSequentialGroup() .addGap(53) .addComponent(labelDocProperties) .addGap(18) - .addComponent(tableDocProps, GroupLayout.PREFERRED_SIZE, 81, GroupLayout.PREFERRED_SIZE) + .addComponent(tableDocStandard, GroupLayout.PREFERRED_SIZE, 81, GroupLayout.PREFERRED_SIZE) .addPreferredGap(ComponentPlacement.UNRELATED) .addComponent(labelDocCustomProperties, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) .addGap(18) - .addComponent(tableDocCustomProps, GroupLayout.PREFERRED_SIZE, 322, GroupLayout.PREFERRED_SIZE) + .addComponent(tableDocCustom, GroupLayout.PREFERRED_SIZE, 322, GroupLayout.PREFERRED_SIZE) .addPreferredGap(ComponentPlacement.RELATED, 90, Short.MAX_VALUE) - .addComponent(btnNewButton) + .addComponent(btnSaveButton) .addGap(31)) ); - - JPopupMenu popupMenu = new JPopupMenu(); - addPopup(tableDocCustomProps, popupMenu); - - menuItemPupupDocUserProps = new JMenuItem("Добавить строку"); - - popupMenu.add(menuItemPupupDocUserProps); - panel.setLayout(gl_panel); - - - JMenuBar menuBar = new JMenuBar(); - setJMenuBar(menuBar); - - JMenu mnFile = new JMenu("Файл"); - menuBar.add(mnFile); } private void createDocPropsModel() { @@ -325,15 +354,15 @@ public class EditorGUI extends JFrame { }); } - private void createOutlineTableModel() { - outlineTableModel = new DefaultTableModel( - new Object[][] { - {null, null}, - }, + private DefaultTableModel createOutlineTableModel(OutlineElement element) { + + DefaultTableModel outlineTableModel = new DefaultTableModel( + element.metadataToArray(), new String[] { - "New column", "New column" + "Metadata Name", "Metadata Value" } ); + return outlineTableModel; } private void createCustomDocPropsModel() { Object[][] tableArray = new Object[][] { @@ -375,4 +404,10 @@ public class EditorGUI extends JFrame { } }); } + public void saveAction() { + updateDocProps(); + document.setDocumentProperties(docProps); + updateDocCustomProps(); + document.setCustomDocumentProperties(docCustomProps); + } }