From de9f581515bbf4e4d3b70f47b54d329b83e00d26 Mon Sep 17 00:00:00 2001 From: TW2 Date: Wed, 5 May 2021 01:39:10 +0200 Subject: [PATCH] Effects --- .../org/wingate/assfxmaker/MainFrame.form | 157 ++++++++++++------ .../org/wingate/assfxmaker/MainFrame.java | 133 +++++++++++---- .../org/wingate/assfxmaker/sfx/AfmLegacy.java | 137 +++++++++++++++ .../assfxmaker/ui/SfxListCellRenderer.java | 131 +++++++++++++++ src/main/resources/images/js-icon-small.png | Bin 0 -> 566 bytes src/main/resources/images/lua-icon-small.png | Bin 0 -> 941 bytes src/main/resources/images/py-icon-small.png | Bin 0 -> 544 bytes src/main/resources/images/rb-icon-small.png | Bin 0 -> 574 bytes src/main/resources/images/xml-icon-small.png | Bin 0 -> 859 bytes 9 files changed, 468 insertions(+), 90 deletions(-) create mode 100644 src/main/java/org/wingate/assfxmaker/sfx/AfmLegacy.java create mode 100644 src/main/java/org/wingate/assfxmaker/ui/SfxListCellRenderer.java create mode 100644 src/main/resources/images/js-icon-small.png create mode 100644 src/main/resources/images/lua-icon-small.png create mode 100644 src/main/resources/images/py-icon-small.png create mode 100644 src/main/resources/images/rb-icon-small.png create mode 100644 src/main/resources/images/xml-icon-small.png diff --git a/src/main/java/org/wingate/assfxmaker/MainFrame.form b/src/main/java/org/wingate/assfxmaker/MainFrame.form index 68926e0..dacb249 100644 --- a/src/main/java/org/wingate/assfxmaker/MainFrame.form +++ b/src/main/java/org/wingate/assfxmaker/MainFrame.form @@ -64,7 +64,7 @@ - + @@ -239,10 +239,10 @@ - + - + @@ -251,63 +251,112 @@ - + + + + - - - - - - - - - - - - - - - - - + - - - - + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -324,12 +373,12 @@ - + - + diff --git a/src/main/java/org/wingate/assfxmaker/MainFrame.java b/src/main/java/org/wingate/assfxmaker/MainFrame.java index 89f4f5d..5305bce 100644 --- a/src/main/java/org/wingate/assfxmaker/MainFrame.java +++ b/src/main/java/org/wingate/assfxmaker/MainFrame.java @@ -17,11 +17,13 @@ package org.wingate.assfxmaker; import java.io.File; +import javax.swing.DefaultListModel; import javax.swing.JFileChooser; import javax.swing.filechooser.FileFilter; import org.wingate.assfxmaker.ass.ASS; -import org.wingate.assfxmaker.ass.AssEvent; +import org.wingate.assfxmaker.sfx.AfmLegacy; import org.wingate.assfxmaker.ui.AssSfxTableModel; +import org.wingate.assfxmaker.ui.SfxListCellRenderer; /** * @@ -35,6 +37,9 @@ public class MainFrame extends javax.swing.JFrame { private final AssSfxTableModel orginModel = new AssSfxTableModel(); private final AssSfxTableModel generatedModel = new AssSfxTableModel(); + + private final DefaultListModel dlmSFX = new DefaultListModel(); + private final SfxListCellRenderer sfxTreeCellRenderer = new SfxListCellRenderer(); /** * Creates new form MainFrame @@ -73,9 +78,11 @@ public boolean accept(File file) { public String getDescription() { return "ASS files"; } - }); + mf.listSFXChoice.setModel(mf.dlmSFX); + mf.listSFXChoice.setCellRenderer(mf.sfxTreeCellRenderer); + //- INIT END - mf.setVisible(true); @@ -122,10 +129,14 @@ private void initComponents() { panResult = new javax.swing.JPanel(); jScrollPane2 = new javax.swing.JScrollPane(); tblGenerated = new javax.swing.JTable(); - panBottom = new javax.swing.JPanel(); - jTabbedPane2 = new javax.swing.JTabbedPane(); - jPanel1 = new javax.swing.JPanel(); - jPanel2 = new javax.swing.JPanel(); + panSFX = new javax.swing.JPanel(); + panSFXTree = new javax.swing.JPanel(); + btnUseChosenSFX = new javax.swing.JButton(); + btnCreatePreset = new javax.swing.JButton(); + btnCreateCode = new javax.swing.JButton(); + jScrollPane4 = new javax.swing.JScrollPane(); + listSFXChoice = new javax.swing.JList<>(); + panSFXCreator = new javax.swing.JPanel(); panDrawing = new javax.swing.JPanel(); jMenuBar1 = new javax.swing.JMenuBar(); mnuFile = new javax.swing.JMenu(); @@ -133,7 +144,6 @@ private void initComponents() { mnuFileSave = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - getContentPane().setLayout(new java.awt.BorderLayout()); panKaraoke.setLayout(new java.awt.BorderLayout()); @@ -225,38 +235,77 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { panKaraoke.add(panTop, java.awt.BorderLayout.CENTER); - panBottom.setPreferredSize(new java.awt.Dimension(883, 400)); - panBottom.setLayout(new java.awt.BorderLayout()); + panSFX.setPreferredSize(new java.awt.Dimension(0, 200)); + panSFX.setLayout(new java.awt.GridLayout(1, 2)); + + btnUseChosenSFX.setText("Use -->"); + + btnCreatePreset.setText("Create a preset"); + btnCreatePreset.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnCreatePresetActionPerformed(evt); + } + }); - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); - jPanel1.setLayout(jPanel1Layout); - jPanel1Layout.setHorizontalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 0, Short.MAX_VALUE) + btnCreateCode.setText("Create with code"); + btnCreateCode.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnCreateCodeActionPerformed(evt); + } + }); + + listSFXChoice.setModel(new javax.swing.AbstractListModel() { + String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; + public int getSize() { return strings.length; } + public String getElementAt(int i) { return strings[i]; } + }); + jScrollPane4.setViewportView(listSFXChoice); + + javax.swing.GroupLayout panSFXTreeLayout = new javax.swing.GroupLayout(panSFXTree); + panSFXTree.setLayout(panSFXTreeLayout); + panSFXTreeLayout.setHorizontalGroup( + panSFXTreeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panSFXTreeLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panSFXTreeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane4) + .addGroup(panSFXTreeLayout.createSequentialGroup() + .addComponent(btnCreatePreset) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnCreateCode) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 93, Short.MAX_VALUE) + .addComponent(btnUseChosenSFX))) + .addContainerGap()) ); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 0, Short.MAX_VALUE) + panSFXTreeLayout.setVerticalGroup( + panSFXTreeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panSFXTreeLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panSFXTreeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(btnUseChosenSFX) + .addComponent(btnCreatePreset) + .addComponent(btnCreateCode)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane4, javax.swing.GroupLayout.DEFAULT_SIZE, 160, Short.MAX_VALUE) + .addContainerGap()) ); - jTabbedPane2.addTab("Effects", jPanel1); + panSFX.add(panSFXTree); - javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); - jPanel2.setLayout(jPanel2Layout); - jPanel2Layout.setHorizontalGroup( - jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 0, Short.MAX_VALUE) + javax.swing.GroupLayout panSFXCreatorLayout = new javax.swing.GroupLayout(panSFXCreator); + panSFXCreator.setLayout(panSFXCreatorLayout); + panSFXCreatorLayout.setHorizontalGroup( + panSFXCreatorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 410, Short.MAX_VALUE) ); - jPanel2Layout.setVerticalGroup( - jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 0, Short.MAX_VALUE) + panSFXCreatorLayout.setVerticalGroup( + panSFXCreatorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 200, Short.MAX_VALUE) ); - jTabbedPane2.addTab("Code", jPanel2); + panSFX.add(panSFXCreator); - panBottom.add(jTabbedPane2, java.awt.BorderLayout.CENTER); - - panKaraoke.add(panBottom, java.awt.BorderLayout.SOUTH); + panKaraoke.add(panSFX, java.awt.BorderLayout.SOUTH); jTabbedPane1.addTab("Karaoke", panKaraoke); @@ -264,11 +313,11 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { panDrawing.setLayout(panDrawingLayout); panDrawingLayout.setHorizontalGroup( panDrawingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 904, Short.MAX_VALUE) + .addGap(0, 821, Short.MAX_VALUE) ); panDrawingLayout.setVerticalGroup( panDrawingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 555, Short.MAX_VALUE) + .addGap(0, 547, Short.MAX_VALUE) ); jTabbedPane1.addTab("Drawing", panDrawing); @@ -340,6 +389,14 @@ private void mnuFileSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-F } }//GEN-LAST:event_mnuFileSaveActionPerformed + private void btnCreatePresetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCreatePresetActionPerformed + dlmSFX.addElement(new AfmLegacy(AfmLegacy.Type.AFM, "Rouge", "Me", "v1.0", "Fade out")); + }//GEN-LAST:event_btnCreatePresetActionPerformed + + private void btnCreateCodeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCreateCodeActionPerformed + dlmSFX.addElement(new AfmLegacy(AfmLegacy.Type.JavaScript, "RougeJS", "Me", "v2.0", "Fade in")); + }//GEN-LAST:event_btnCreateCodeActionPerformed + /** * @param args the command line arguments */ @@ -369,23 +426,27 @@ public static void main(String args[]) { // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup bgTextMode; + private javax.swing.JButton btnCreateCode; + private javax.swing.JButton btnCreatePreset; + private javax.swing.JButton btnUseChosenSFX; private javax.swing.JFileChooser fcASS; private javax.swing.JMenuBar jMenuBar1; - private javax.swing.JPanel jPanel1; - private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JScrollPane jScrollPane4; private javax.swing.JTabbedPane jTabbedPane1; - private javax.swing.JTabbedPane jTabbedPane2; private javax.swing.JToolBar jToolBar1; + private javax.swing.JList listSFXChoice; private javax.swing.JMenu mnuFile; private javax.swing.JMenuItem mnuFileOpen; private javax.swing.JMenuItem mnuFileSave; - private javax.swing.JPanel panBottom; private javax.swing.JPanel panDrawing; private javax.swing.JPanel panKaraoke; private javax.swing.JPanel panOriginal; private javax.swing.JPanel panResult; + private javax.swing.JPanel panSFX; + private javax.swing.JPanel panSFXCreator; + private javax.swing.JPanel panSFXTree; private javax.swing.JPanel panTop; private javax.swing.JTable tblGenerated; private javax.swing.JTable tblOrigin; diff --git a/src/main/java/org/wingate/assfxmaker/sfx/AfmLegacy.java b/src/main/java/org/wingate/assfxmaker/sfx/AfmLegacy.java new file mode 100644 index 0000000..c29d6e5 --- /dev/null +++ b/src/main/java/org/wingate/assfxmaker/sfx/AfmLegacy.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2021 util2 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.wingate.assfxmaker.sfx; + +/** + * + * @author util2 + */ +public class AfmLegacy { + + public enum Type { + AFM("AFMO"), + Ruby("Ruby"), + Python("Python"), + JavaScript("JS"), + Lua("Lua"); + + String sfxType; + + private Type(String sfxType){ + this.sfxType = sfxType; + } + + public String getSfxType() { + return sfxType; + } + + @Override + public String toString() { + return sfxType; + } + + public static Type get(String s){ + Type sfx = AFM; + + for(Type type : values()){ + if(type.getSfxType().equalsIgnoreCase(s) == true){ + sfx = type; + break; + } + } + + return sfx; + } + } + + private Type type = Type.AFM; + private String code = ""; + private String name = "Unknown effect"; + private String author = "Unknown author"; + private String version = "v1.0"; + private String description = "No description"; + + public AfmLegacy() { + } + + public AfmLegacy(Type type, String code, String name, String author, String version, String description) { + this.type = type; + this.code = code; + this.name = name; + this.author = author; + this.version = version; + this.description = description; + } + + public AfmLegacy(Type type, String name, String author, String version, String description) { + this.type = type; + this.name = name; + this.author = author; + this.version = version; + this.description = description; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + +} diff --git a/src/main/java/org/wingate/assfxmaker/ui/SfxListCellRenderer.java b/src/main/java/org/wingate/assfxmaker/ui/SfxListCellRenderer.java new file mode 100644 index 0000000..fb50c09 --- /dev/null +++ b/src/main/java/org/wingate/assfxmaker/ui/SfxListCellRenderer.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2021 util2 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.wingate.assfxmaker.ui; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.ListCellRenderer; +import org.wingate.assfxmaker.sfx.AfmLegacy; + +/** + * + * @author util2 + */ +public class SfxListCellRenderer extends JPanel implements ListCellRenderer { + + private static final int ICON_WIDTH = 30; + private static final int ITEM_WIDTH = 150; + private static final int DESC_WIDTH = 350; + private static final int WHOLE_HEIGHT = 30; + + private final ImageIcon afmIcon = new ImageIcon(getClass().getResource("/images/xml-icon-small.png")); + private final ImageIcon rubyIcon = new ImageIcon(getClass().getResource("/images/rb-icon-small.png")); + private final ImageIcon pythonIcon = new ImageIcon(getClass().getResource("/images/py-icon-small.png")); + private final ImageIcon javascriptIcon = new ImageIcon(getClass().getResource("/images/js-icon-small.png")); + private final ImageIcon luaIcon = new ImageIcon(getClass().getResource("/images/lua-icon-small.png")); + + private final JLabel lblImage = new JLabel(); + private final JLabel lblName = new JLabel(); + private final JLabel lblAuthor = new JLabel(); + private final JLabel lblVersion = new JLabel(); + private final JLabel lblDescription = new JLabel(); + + public SfxListCellRenderer() { + init(); + } + + private void init(){ + setLayout(null); + setPreferredSize(new Dimension(ICON_WIDTH + ITEM_WIDTH + DESC_WIDTH, WHOLE_HEIGHT)); + + lblImage.setSize(ICON_WIDTH, WHOLE_HEIGHT); + lblImage.setLocation(0, 0); + add(lblImage); + + lblName.setSize(ITEM_WIDTH, WHOLE_HEIGHT / 2); + lblName.setLocation(ICON_WIDTH, 0); + add(lblName); + + lblAuthor.setSize(ICON_WIDTH, WHOLE_HEIGHT / 2); + lblAuthor.setLocation(ICON_WIDTH, WHOLE_HEIGHT / 2); + lblAuthor.setFont(lblAuthor.getFont().deriveFont(Font.ITALIC)); + add(lblAuthor); + + lblVersion.setSize(DESC_WIDTH, WHOLE_HEIGHT / 2); + lblVersion.setLocation(ICON_WIDTH + ITEM_WIDTH, 0); + add(lblVersion); + + lblDescription.setSize(DESC_WIDTH, WHOLE_HEIGHT / 2); + lblDescription.setLocation(ICON_WIDTH + ITEM_WIDTH, WHOLE_HEIGHT / 2); + lblDescription.setFont(lblDescription.getFont().deriveFont(Font.ITALIC)); + add(lblDescription); + } + + @Override + public Component getListCellRendererComponent(JList list, Object o, + int index, boolean isSelected, boolean cellHasFocus) + { + if(o instanceof AfmLegacy){ + AfmLegacy sfx = (AfmLegacy)o; + + lblName.setText(sfx.getName()); + lblAuthor.setText(sfx.getAuthor()); + lblVersion.setText(sfx.getVersion()); + lblDescription.setText(sfx.getDescription()); + + switch(sfx.getType()){ + case AFM -> { + lblImage.setIcon(afmIcon); + lblName.setForeground(Color.magenta.darker()); + } + case Ruby -> { + lblImage.setIcon(rubyIcon); + lblName.setForeground(Color.red.darker()); + } + case Python -> { + lblImage.setIcon(pythonIcon); + lblName.setForeground(Color.green.darker()); + } + case JavaScript -> { + lblImage.setIcon(javascriptIcon); + lblName.setForeground(Color.yellow); + } + case Lua -> { + lblImage.setIcon(luaIcon); + lblName.setForeground(Color.blue.darker()); + } + } + + if(isSelected == true){ + setBackground(list.getSelectionBackground()); + setForeground(list.getSelectionForeground()); + }else{ + setBackground(list.getBackground()); + setForeground(list.getForeground()); + } + } + + return this; + } + +} diff --git a/src/main/resources/images/js-icon-small.png b/src/main/resources/images/js-icon-small.png new file mode 100644 index 0000000000000000000000000000000000000000..3dedf7dfc4b47ab8e9359fc1911f9593f2d64bdd GIT binary patch literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85s1GK$vmWqq~!Ug6t)pzOL+#*rgbFltuVl_W*??OI#yLobz*Y zQ}ap~oQqNuOHxx5$}>wc6x=<11Hv2m#9@kp^V3So6N^$A3KBE(O7!wlOB77>4D^f) zKPqHS1-d5B)5S5w!~5+OTaUv5BCHQ?^F8tpWEW>=bzIoZ$Hh0dTZuz!N5`%Xy>)v3 zbi24_-dUy4y8tk~riMwfbcV6GF8?Sff%6Yag*{DDHY-9co{U>s_CItL# zo9T2^{nf>z{a5nVeG#i$kaliie6XSW>t|m1oL$+XBH_LPF{}Sa{;6}FW2tj`{?zmP z-ggGGeJq)?DPlWgA;-zQ>wlJ7?DW>z-f`3L(fa5|2UnD)74yBjsJZXP_Gbk@RaTzA|#z&)B_g^8&Z6_Q2?2@O1TaS?83{1OVhp B=yd=9 literal 0 HcmV?d00001 diff --git a/src/main/resources/images/lua-icon-small.png b/src/main/resources/images/lua-icon-small.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e74619eda76a3ddb470896e769952f247c4a39 GIT binary patch literal 941 zcmV;e15*5nP)4Tx04UFukvT{MK^TR<9HNL~VG0q8E!4_@sEDORQ3L}aMlfpO?#4tRyN2C} zjiq24u<&TS3L9%}Eo=or@Bp#1vr@DXS^wDx2|@%1hWU6i?=kZRf(Loia>Kn~*+nNg z9@A#hvs(Q#b%beUfQW9oh4|E1ikjo&mVjDsqAH93jpodvYeGO19ySY3QFuXkaIIKS zydxYjm-LMAsc?@Y7Zko%x>4pA#W|mYDl_7wk|V+qVJ%n1MirY&jwL)G+?la#$q&wy zIiq-8v6Wvnf9|PX*tBR*Pbpny2jff-CxM2+D$C?45|z~!#U&~Gu^Rq%-=7edA+BXi zag4Hph3@-NfAG6oH{0J=PHKul-IM3NbwT|We3d-!^U(9Yjv(|17k0(JasWf`qL(UK z=RUM-z}aO*Gq&M;6WSgMx}*D2NM)Nz^Nimgv2TWda<6zusX_n%010qNS#tmYE+PN`E+PS{;@y$}00GfSL_t(Y zOYN39O9Md^$6vgOXbMFT3s1DO6h#EFwD3a+B9>yQwS{1%SosAktVQj#5wTIQ@IXOP zyc5rm%^v>WyqP!w6VwOy?P~2Zs@! zrTP)$7(A)-j1=gYbMk|8Mt*S4$PZ4#jh~VGa-yWbS3Tc-O7(o_j{M~PTb+DR$AD(o zXW0eQ_;Aa7IGm%vi>th{WrRY7VRB+S6u(?my^=^fg^I$IxZO~7S#>v+R(0~0$%6+~ zQ+R|C7^n(lYpI)bG*rM^Nrh|=POUv?)lu>5g9G0wL8z08wsd5&JJ?HH*CP~4MVrvv z*X$0)Q*PhieP})kG7fg(RGNV+k2DCp#4N&;??jiS!$V>_c%|f#2A&gL_g+pfb;+E; zb4k+&f5r{urDAKi0fwOI%|rg$F!coFKW*v*_@r|O7D2^#mfF1Yd;*))UI3ENUg{QD zE-4kmMoGUn_yS(RBUK3PZ!4!5AU~AY`qT$h_s#eOy20bbfvte(xc=00S7$`1Y%rV1!V8ci47?z zyy#gFurk5hwNU(zeAj{pOSM zF<<94?Nh80es>b&4#da)ySaOdx+l+LhK@^Ht1VXl-oSX+kaL@Q)7J}f+|{S{Je zw|TXJ%;X0fvu&0}S-;kqV|wkkf5pOU@*6k~8*=59uqtmU6MFM-_pW^h{>@+s-}YBs zyWp8wD} zv-3|~=FIuKeyuk!-M2t4W?HM`l$PEOz~nzVn+u z=I-1-j7__(EIdjz^OSaVc4%~6I~#Z3InQHH+~t~v=CjQFwlAaK&0b=@@S3Z@R#P1* zzg069?TImxNt)%8IN2lX@Uku-C$li-@}p%-ju!rnKPvuMrO(Y%=I~`hp{+)pyPiJ% zbN3y?+r*uzJ6Lox4&3Jqw#oja{df1?NFj9#!E@bj?Tahef3kdW(Vh3^%d?+(>fv44 z`+f?%>Wqpxnk#?CvY4@Tj`mU2A4<=&SEzdyo-8O@xGS+Mc)uRG8>77AmG_&xbIfMf#jYr;X|$&osGm@5e)n^E&Qgcpl8emeotFJ_s?xvh zRUV(XLcH$z_Xa;UW;Ip+zF}FR{oMV8jf45~|2OJmS~doD=Rf(wBDwX)&GJ9#N7MKH z6rN>Z7TEPy?tqKVA>K^+n2DdIQoC;35+HNPgg&e IbxsLQ0Lmor761SM literal 0 HcmV?d00001 diff --git a/src/main/resources/images/xml-icon-small.png b/src/main/resources/images/xml-icon-small.png new file mode 100644 index 0000000000000000000000000000000000000000..7892ea9808dd5507630731a065868e0fa6a81808 GIT binary patch literal 859 zcmV-h1El4Tx04UFukxM8ZzuMF2nLNk?FA*Wyj|o6>7chQCa+NG{zI21r@sRu$6JM!b`$~>)DLr zJ>ihGY{Z4ngu7k2pzwpz%{;#c& zA41b6oL?0+a~CeQpye@RxJDpV%G8occsrGEnuF#Ws9VVQR@mp{9%9nfVEL!d7hU${@i=Vd-U&c$x1tu``izTsUva|TcNz{f5a^- zqrgiGoP)n&47L>~*fyMC+i-%L63<2{k~ywf)vA;!-F{j-zdz+m`(a2r#0y_Bp4C2- zl9;|{K0Hgw=W96;t&XqJUSgNR@PmNTyPSK;@