From b1498964fa5d958ddb924d7c3f55138b71ed90d3 Mon Sep 17 00:00:00 2001 From: Philipp Spohr <spohr.philipp@web.de> Date: Fri, 1 Sep 2017 15:17:16 +0200 Subject: [PATCH] Work on layout / style / graphics --- .../yoshikoWrapper/core/GraphicsLoader.java | 25 ++++- .../gui/ComfortCollapsiblePanel.java | 20 ---- .../ba/yoshikoWrapper/gui/EditCostPanel.java | 33 ++++-- .../yoshikoWrapper/gui/LanguageSwitcher.java | 1 + .../gui/LanguageSwitcherPanel.java | 47 ++++++++ .../ba/yoshikoWrapper/gui/LibStatusPanel.java | 4 +- .../ba/yoshikoWrapper/gui/LibraryPanel.java | 34 ++++-- .../hhu/ba/yoshikoWrapper/gui/MainPanel.java | 106 +++++++++++------- .../gui/OperationModePanel.java | 52 +++++++-- .../gui/ReductionRulesChooser.java | 39 ++++++- .../ba/yoshikoWrapper/gui/ResultPanel.java | 46 +++++++- .../yoshikoWrapper/gui/TimeLimitSetter.java | 16 +-- .../ba/yoshikoWrapper/gui/YoshikoHeader.java | 6 +- .../ba/yoshikoWrapper/gui/package-info.java | 1 + src/main/resources/YoshikoStrings.properties | 2 +- .../resources/graphics/YoshikoAlphaLogo.png | Bin 3620 -> 0 bytes .../resources/graphics/YoshikoAlphaText.png | Bin 10911 -> 0 bytes src/main/resources/graphics/YoshikoLogo.png | Bin 0 -> 4555 bytes src/main/resources/graphics/YoshikoSolved.png | Bin 0 -> 18506 bytes src/main/resources/graphics/YoshikoText.png | Bin 0 -> 6526 bytes src/main/resources/graphics/flags/deDE.svg | 5 + src/main/resources/graphics/flags/enUS.svg | 18 +++ 22 files changed, 345 insertions(+), 110 deletions(-) delete mode 100644 src/main/java/de/hhu/ba/yoshikoWrapper/gui/ComfortCollapsiblePanel.java create mode 100644 src/main/java/de/hhu/ba/yoshikoWrapper/gui/LanguageSwitcherPanel.java delete mode 100644 src/main/resources/graphics/YoshikoAlphaLogo.png delete mode 100644 src/main/resources/graphics/YoshikoAlphaText.png create mode 100644 src/main/resources/graphics/YoshikoLogo.png create mode 100644 src/main/resources/graphics/YoshikoSolved.png create mode 100644 src/main/resources/graphics/YoshikoText.png create mode 100644 src/main/resources/graphics/flags/deDE.svg create mode 100644 src/main/resources/graphics/flags/enUS.svg diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/GraphicsLoader.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/GraphicsLoader.java index 3590a50..2edb56c 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/GraphicsLoader.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/GraphicsLoader.java @@ -21,6 +21,7 @@ ******************************************************************************/ package de.hhu.ba.yoshikoWrapper.core; +import java.awt.Color; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; @@ -30,15 +31,18 @@ import javax.swing.ImageIcon; public class GraphicsLoader { private static BufferedImage yoshikoLogo; + private static BufferedImage yoshikoLogo_solved; private static BufferedImage yoshikoText; + public final static Color yoshikoGreen = new Color(0,128,0); + private final static ClassLoader classLoader = GraphicsLoader.class.getClassLoader(); public static ImageIcon getLogo(int size) { if (yoshikoLogo == null) { try { yoshikoLogo = ImageIO.read( - classLoader.getResource("graphics/YoshikoAlphaLogo.png") + classLoader.getResource("graphics/YoshikoLogo.png") ); } catch (IOException e) { e.printStackTrace(); @@ -47,16 +51,31 @@ public class GraphicsLoader { return new ImageIcon(yoshikoLogo.getScaledInstance(size, size, Image.SCALE_SMOOTH)); } + public static ImageIcon getSolvedLogo(int size) { + if (yoshikoLogo_solved == null) { + try { + yoshikoLogo_solved = ImageIO.read( + classLoader.getResource("graphics/YoshikoSolved.png") + ); + } catch (IOException e) { + e.printStackTrace(); + } + } + return new ImageIcon(yoshikoLogo_solved.getScaledInstance(size, size, Image.SCALE_SMOOTH)); + } + + public static ImageIcon getText(int height) { + //Default dimension is 258x48 if (yoshikoText == null) { try { yoshikoText = ImageIO.read( - classLoader.getResource("graphics/YoshikoAlphaText.png") + classLoader.getResource("graphics/YoshikoText.png") ); } catch (IOException e) { e.printStackTrace(); } } - return new ImageIcon(yoshikoText.getScaledInstance(height*4, height, Image.SCALE_SMOOTH)); + return new ImageIcon(yoshikoText.getScaledInstance((int)(height*258/48), height, Image.SCALE_SMOOTH)); } } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ComfortCollapsiblePanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ComfortCollapsiblePanel.java deleted file mode 100644 index 9292f72..0000000 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ComfortCollapsiblePanel.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.hhu.ba.yoshikoWrapper.gui; - -import org.cytoscape.util.swing.BasicCollapsiblePanel; - -@SuppressWarnings("serial") -public class ComfortCollapsiblePanel extends BasicCollapsiblePanel { - - public ComfortCollapsiblePanel(String text) { - super(text); - } - - @Override - public void setCollapsed(boolean collapse) { - super.setCollapsed(collapse); - //Force resize of parent - if (getParent() != null) { - getParent().revalidate(); - } - } -} diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/EditCostPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/EditCostPanel.java index 0277bcd..8a134bb 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/EditCostPanel.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/EditCostPanel.java @@ -21,11 +21,11 @@ ******************************************************************************/ package de.hhu.ba.yoshikoWrapper.gui; -import java.awt.FlowLayout; -import javax.swing.BoxLayout; +import javax.swing.GroupLayout; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.GroupLayout.Alignment; import org.cytoscape.model.CyColumn; import org.cytoscape.util.swing.BasicCollapsiblePanel; @@ -49,8 +49,7 @@ public class EditCostPanel extends BasicCollapsiblePanel { public EditCostPanel() { super(LocalizationManager.get("editingCostPanel")); - //Define Layout - this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); + //Initialize components columnMapper = new ColumnMapper(); @@ -66,18 +65,30 @@ public class EditCostPanel extends BasicCollapsiblePanel { //Group the labels with their text fields groupIC = new JPanel(); groupDC = new JPanel(); - - groupIC.setLayout(new FlowLayout()); - groupDC.setLayout(new FlowLayout()); SwingUtil.addAll(groupIC,icLabel,icField); SwingUtil.addAll(groupDC,dcLabel,dcField); SwingUtil.addAll(this,columnMapper,groupIC,groupDC); - //Decoration/Visual - //Border border = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED); - //this.setBorder(border); + + //Layout + GroupLayout layout = new GroupLayout(this.getContentPane()); + + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING,true) + .addComponent(columnMapper) + .addComponent(groupIC) + .addComponent(groupDC) + ); + + layout.setVerticalGroup(layout.createSequentialGroup() + .addComponent(columnMapper) + .addComponent(groupIC) + .addComponent(groupDC) + ); + + this.getContentPane().setLayout(layout); + } //SETTER / GETTER @@ -105,7 +116,5 @@ public class EditCostPanel extends BasicCollapsiblePanel { public ColumnMapper getColumnMapper() { return columnMapper; } - - } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LanguageSwitcher.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LanguageSwitcher.java index 6773d7a..942ae8f 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LanguageSwitcher.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LanguageSwitcher.java @@ -49,6 +49,7 @@ public class LanguageSwitcher extends JComboBox<Locale>{ } }); + } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LanguageSwitcherPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LanguageSwitcherPanel.java new file mode 100644 index 0000000..aa8c5a7 --- /dev/null +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LanguageSwitcherPanel.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (C) 2017 Philipp Spohr + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ +package de.hhu.ba.yoshikoWrapper.gui; + + +import javax.swing.BoxLayout; + +import org.cytoscape.util.swing.BasicCollapsiblePanel; + +import de.hhu.ba.yoshikoWrapper.core.LocalizationManager; + +@SuppressWarnings("serial") +public class LanguageSwitcherPanel extends BasicCollapsiblePanel{ + + private final LanguageSwitcher switcher; + + public LanguageSwitcherPanel() { + super(LocalizationManager.get("switchLanguage")); + this.getContentPane().setLayout(new BoxLayout(this.getContentPane(),BoxLayout.X_AXIS)); + //SWING COMPONENTS INIT + switcher = new LanguageSwitcher(); + + SwingUtil.addAll(this, + switcher + ); + } + +} diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LibStatusPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LibStatusPanel.java index a24bfdc..f1690c0 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LibStatusPanel.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LibStatusPanel.java @@ -25,6 +25,8 @@ import java.awt.Color; import javax.swing.JLabel; +import de.hhu.ba.yoshikoWrapper.core.GraphicsLoader; + public class LibStatusPanel extends JLabel { /** @@ -35,7 +37,7 @@ public class LibStatusPanel extends JLabel { public void setStyle(boolean libraryLoaded) { if(libraryLoaded) { this.setText("YOSHIKO LIBRARY READY!"); - this.setForeground(Color.GREEN); + this.setForeground(GraphicsLoader.yoshikoGreen); } else { this.setText("YOSHIKO LIBRARY NOT LOADED :("); diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LibraryPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LibraryPanel.java index bdb7f21..6267c16 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LibraryPanel.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LibraryPanel.java @@ -24,12 +24,12 @@ package de.hhu.ba.yoshikoWrapper.gui; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import javax.swing.BorderFactory; -import javax.swing.BoxLayout; +import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JLabel; -import javax.swing.border.EtchedBorder; +import javax.swing.GroupLayout.Alignment; + import org.cytoscape.util.swing.BasicCollapsiblePanel; @@ -38,7 +38,7 @@ import de.hhu.ba.yoshikoWrapper.core.YoshikoLoader; import de.hhu.ba.yoshikoWrapper.swig.LibraryInterface; @SuppressWarnings("serial") -public class LibraryPanel extends ComfortCollapsiblePanel { +public class LibraryPanel extends BasicCollapsiblePanel { //SYMBOLIC LINKS private LibraryPanel self = this; @@ -50,7 +50,6 @@ public class LibraryPanel extends ComfortCollapsiblePanel { public LibraryPanel() { super(LocalizationManager.get("libraryPanel")); - this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); //SWING COMPONENT INITIALIZATION libStatusPanel = new LibStatusPanel(); searchLibButton = new JButton(LocalizationManager.get("resolveLibPath")); @@ -63,7 +62,6 @@ public class LibraryPanel extends ComfortCollapsiblePanel { searchLibButton.setEnabled(false); } - searchLibButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -78,7 +76,29 @@ public class LibraryPanel extends ComfortCollapsiblePanel { } }); - SwingUtil.addAll(this,libStatusPanel,yoshikoVersionLabel,searchLibButton); + SwingUtil.addAll(this, + libStatusPanel, + yoshikoVersionLabel, + searchLibButton + ); + + //Layout + GroupLayout layout = new GroupLayout(this.getContentPane()); + + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING,true) + .addComponent(libStatusPanel) + .addComponent(yoshikoVersionLabel) + .addComponent(searchLibButton) + ); + + layout.setVerticalGroup(layout.createSequentialGroup() + .addComponent(libStatusPanel) + .addComponent(yoshikoVersionLabel) + .addComponent(searchLibButton) + ); + + + this.getContentPane().setLayout(layout); } } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanel.java index 23480f3..cbfa232 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanel.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanel.java @@ -21,22 +21,21 @@ ******************************************************************************/ package de.hhu.ba.yoshikoWrapper.gui; +import static javax.swing.GroupLayout.DEFAULT_SIZE; +import static javax.swing.GroupLayout.PREFERRED_SIZE; + import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Arrays; -import javax.swing.BoxLayout; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; -import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -61,19 +60,14 @@ public class MainPanel extends JPanel implements CytoPanelComponent { private final YoshikoHeader header; - /** - * Swing is a bit special sometimes, so a panel is used to wrap the lang-switcher. - * This prevents stretching of the component - */ - private final JPanel langSwitcherWrapper; - private final LanguageSwitcher langSwitcher; + private final JCheckBox showAdvancedOptions; + private final ArrayList<JComponent> advancedOptions; + + private final LanguageSwitcherPanel langPanel; private final LibraryPanel libraryPanel; private final EditCostPanel ecPanel; private final ReductionRulesChooser reductionRulesChooser; - private final OperationModePanel opModePanel; - - //OTHER - + private final OperationModePanel opModePanel; /** * Main constructor, creates a new Panel and initializes subcomponents @@ -86,19 +80,18 @@ public class MainPanel extends JPanel implements CytoPanelComponent { //Initialize Swing components header = new YoshikoHeader(); - langSwitcherWrapper = new JPanel(); - langSwitcher = new LanguageSwitcher(); - langSwitcherWrapper.add(new JLabel(LocalizationManager.get("switchLanguage"))); - langSwitcherWrapper.add(langSwitcher); - langSwitcherWrapper.setLayout(new FlowLayout()); + showAdvancedOptions = new JCheckBox(LocalizationManager.get("showAdvanced")); + showAdvancedOptions.addActionListener(toggleAdvancedOptionsListener); + + langPanel = new LanguageSwitcherPanel(); libraryPanel = new LibraryPanel(); + //If no library is loaded yet the obvious panel should be showing up if (!YoshikoLoader.isLibraryLoaded()) { libraryPanel.setCollapsed(false); } ecPanel = new EditCostPanel(); - ecPanel.setCollapsed(false); opModePanel = new OperationModePanel(); @@ -107,44 +100,79 @@ public class MainPanel extends JPanel implements CytoPanelComponent { JButton runButton = new JButton(LocalizationManager.get("run")); runButton.addActionListener(buttonListener); + //Add components to main panel + SwingUtil.addAll(this, header, - langSwitcherWrapper, + showAdvancedOptions, + langPanel, libraryPanel, ecPanel, reductionRulesChooser, opModePanel, runButton - ); - + ); + + //Manage all advanced components separately to enable toggling + advancedOptions = new ArrayList<JComponent>(); + advancedOptions.addAll( + Arrays.asList( + opModePanel, + reductionRulesChooser + ) + ); + + showAdvancedOptions(false); //Layout GroupLayout layout = new GroupLayout(this); + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); - layout.setHorizontalGroup(layout.createParallelGroup() - .addComponent(header) - .addComponent(langSwitcherWrapper) - .addComponent(libraryPanel) - .addComponent(ecPanel) - .addComponent(reductionRulesChooser) - .addComponent(opModePanel) - .addComponent(runButton) + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING,true) + .addGap(30) + .addComponent(header,DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(showAdvancedOptions,DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(langPanel,DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(libraryPanel,PREFERRED_SIZE, PREFERRED_SIZE, Short.MAX_VALUE) + .addComponent(ecPanel,DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(reductionRulesChooser,DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(opModePanel,DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(runButton,DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup(layout.createSequentialGroup() - .addComponent(header) - .addComponent(langSwitcherWrapper) - .addComponent(libraryPanel) - .addComponent(ecPanel) - .addComponent(reductionRulesChooser) - .addComponent(opModePanel) - .addComponent(runButton) + .addComponent(header,PREFERRED_SIZE,PREFERRED_SIZE,PREFERRED_SIZE) + .addComponent(showAdvancedOptions,PREFERRED_SIZE,PREFERRED_SIZE,PREFERRED_SIZE) + .addComponent(langPanel,PREFERRED_SIZE,PREFERRED_SIZE,PREFERRED_SIZE) + .addComponent(libraryPanel,PREFERRED_SIZE,PREFERRED_SIZE,PREFERRED_SIZE) + .addComponent(ecPanel,PREFERRED_SIZE,PREFERRED_SIZE,PREFERRED_SIZE) + .addComponent(reductionRulesChooser,PREFERRED_SIZE,PREFERRED_SIZE,PREFERRED_SIZE) + .addComponent(opModePanel,PREFERRED_SIZE,PREFERRED_SIZE,PREFERRED_SIZE) + .addComponent(runButton,PREFERRED_SIZE,PREFERRED_SIZE,PREFERRED_SIZE) ); this.setLayout(layout); + + + } + + private ActionListener toggleAdvancedOptionsListener = new ActionListener() { - this.setVisible(true); + @Override + public void actionPerformed(ActionEvent e) { + showAdvancedOptions(showAdvancedOptions.isSelected()); + } + + }; + + private void showAdvancedOptions(boolean show) { + for (JComponent j : advancedOptions) { + j.setVisible(show); + } + setPreferredSize(getPreferredSize()); // <<< Swing at its finest + revalidate(); } /** diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/OperationModePanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/OperationModePanel.java index f0fa03c..e3d38c7 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/OperationModePanel.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/OperationModePanel.java @@ -24,20 +24,24 @@ package de.hhu.ba.yoshikoWrapper.gui; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import javax.swing.BorderFactory; -import javax.swing.BoxLayout; +import static javax.swing.GroupLayout.DEFAULT_SIZE; + import javax.swing.ButtonGroup; +import javax.swing.GroupLayout; import javax.swing.JCheckBox; import javax.swing.JRadioButton; -import javax.swing.border.Border; -import javax.swing.border.EtchedBorder; import org.cytoscape.util.swing.BasicCollapsiblePanel; +import javax.swing.GroupLayout.Alignment; + + import de.hhu.ba.yoshikoWrapper.core.LocalizationManager; @SuppressWarnings("serial") -public class OperationModePanel extends ComfortCollapsiblePanel{ +public class OperationModePanel extends BasicCollapsiblePanel{ + + //SWING COMPONENTS private final JRadioButton useHeuristic; private final JRadioButton useILP; private final TimeLimitSetter timeLimitSetter; @@ -48,8 +52,8 @@ public class OperationModePanel extends ComfortCollapsiblePanel{ private final ButtonGroup heuristicGroup; public OperationModePanel() { + super(LocalizationManager.get("operationMode")); - this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); heuristicGroup = new ButtonGroup(); useILP = new JRadioButton("Use Integer Linear Programming"); @@ -61,7 +65,6 @@ public class OperationModePanel extends ComfortCollapsiblePanel{ solutionNumberChooser = new SolutionNumberChooser(); - timeLimitSetter = new TimeLimitSetter(); useTriangleCutsBox = new JCheckBox("Use Triangle Cuts"); @@ -70,10 +73,41 @@ public class OperationModePanel extends ComfortCollapsiblePanel{ //Link time limit option to ILP useILP.addActionListener(ilpHeuristicSwitch); useHeuristic.addActionListener(ilpHeuristicSwitch); - - SwingUtil.addAll(this,useILP,useHeuristic,solutionNumberChooser,timeLimitSetter,useTriangleCutsBox,usePartitionCutsBox); + SwingUtil.addAll(this, + useILP, + useHeuristic, + solutionNumberChooser, + timeLimitSetter, + useTriangleCutsBox, + usePartitionCutsBox + ); + //Layout + GroupLayout layout = new GroupLayout(this.getContentPane()); + + layout.setAutoCreateContainerGaps(true); + + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING,true) + .addComponent(useILP, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(useHeuristic, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(solutionNumberChooser, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(timeLimitSetter, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(useTriangleCutsBox, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(usePartitionCutsBox, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + ); + + layout.setVerticalGroup(layout.createSequentialGroup() + .addComponent(useILP) + .addComponent(useHeuristic) + .addComponent(solutionNumberChooser) + .addComponent(timeLimitSetter) + .addComponent(useTriangleCutsBox) + .addComponent(usePartitionCutsBox) + ); + + this.getContentPane().setLayout(layout); + } ActionListener ilpHeuristicSwitch = new ActionListener() { diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ReductionRulesChooser.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ReductionRulesChooser.java index 074cd34..00dc45c 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ReductionRulesChooser.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ReductionRulesChooser.java @@ -21,19 +21,24 @@ ******************************************************************************/ package de.hhu.ba.yoshikoWrapper.gui; +import static javax.swing.GroupLayout.DEFAULT_SIZE; + import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BoxLayout; +import javax.swing.GroupLayout; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.GroupLayout.Alignment; +import org.cytoscape.util.swing.BasicCollapsiblePanel; import de.hhu.ba.yoshikoWrapper.core.LocalizationManager; @SuppressWarnings("serial") -public class ReductionRulesChooser extends ComfortCollapsiblePanel{ +public class ReductionRulesChooser extends BasicCollapsiblePanel{ private final JCheckBox useCRule; private final JCheckBox useCCRule; @@ -48,8 +53,8 @@ public class ReductionRulesChooser extends ComfortCollapsiblePanel{ public ReductionRulesChooser() { + super(LocalizationManager.get("redRuleChooserTitle")); - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); //Initialize subcomponents useCRule = new JCheckBox("Use Clique Rule"); useCCRule = new JCheckBox("Use Critical-Clique Rule"); @@ -60,7 +65,7 @@ public class ReductionRulesChooser extends ComfortCollapsiblePanel{ multFactor = new DoubleInputField(1, Double.POSITIVE_INFINITY); multFactor.setText("1.0"); SNPanel = new JPanel(); - + SNPanel.setLayout(new BoxLayout(SNPanel,BoxLayout.X_AXIS)); SwingUtil.addAll(SNPanel,new JLabel(LocalizationManager.get("multFactor")),multFactor); useSNRule.setSelected(true); @@ -92,6 +97,34 @@ public class ReductionRulesChooser extends ComfortCollapsiblePanel{ useSNRule, SNPanel ); + + //Layout + GroupLayout layout = new GroupLayout(this.getContentPane()); + + layout.setAutoCreateGaps(true); + + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING,true) + .addComponent(useCRule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(useCCRule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(useACRule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(useHERule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(usePDRRule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(useSNRule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(SNPanel, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + ); + + layout.setVerticalGroup(layout.createSequentialGroup() + .addComponent(useCRule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(useCCRule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(useACRule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(useHERule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(usePDRRule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(useSNRule, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(SNPanel, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) + ); + + this.getContentPane().setLayout(layout); + } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ResultPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ResultPanel.java index a6515d3..de3ab6f 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ResultPanel.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ResultPanel.java @@ -25,7 +25,7 @@ import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import javax.swing.BoxLayout; +import javax.swing.GroupLayout; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JLabel; @@ -51,21 +51,25 @@ public class ResultPanel extends JPanel implements CytoPanelComponent{ private final JTabbedPane solutionTabs; private final JLabel costLabel; private final JButton destroyButton; + private final JLabel optimalLabel; private final YoshikoResult result; public ResultPanel(YoshikoResult result) { this.result = result; - - setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); - + //Init subcomponents solutionTabs = new JTabbedPane(); for (YoshikoSolution s : result.solutions) { addSolutionTab(s); } + + //TODO + optimalLabel = new JLabel("Optimal"); + optimalLabel.setForeground(GraphicsLoader.yoshikoGreen); + costLabel = new JLabel(); setCost(result.editingCost); @@ -79,7 +83,33 @@ public class ResultPanel extends JPanel implements CytoPanelComponent{ }); - SwingUtil.addAll(this,costLabel,solutionTabs,destroyButton); + SwingUtil.addAll(this,optimalLabel,costLabel,solutionTabs,destroyButton); + + //Layout + GroupLayout layout = new GroupLayout(this); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup(layout.createSequentialGroup() + .addComponent(costLabel) + .addComponent(optimalLabel) + .addComponent(solutionTabs) + .addComponent(destroyButton) + ); + + + + + layout.setHorizontalGroup(layout.createParallelGroup() + .addComponent(costLabel) + .addComponent(optimalLabel) + .addComponent(solutionTabs) + .addComponent(destroyButton) + ); + + + this.setLayout(layout); } public void deleteSolution() { @@ -129,7 +159,11 @@ public class ResultPanel extends JPanel implements CytoPanelComponent{ @Override public Icon getIcon() { - return GraphicsLoader.getLogo(16); + return GraphicsLoader.getSolvedLogo(16); + } + + public YoshikoResult getResult() { + return result; } } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/TimeLimitSetter.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/TimeLimitSetter.java index 81afa9b..576e6de 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/TimeLimitSetter.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/TimeLimitSetter.java @@ -24,6 +24,7 @@ package de.hhu.ba.yoshikoWrapper.gui; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import javax.swing.BoxLayout; import javax.swing.JCheckBox; import javax.swing.JPanel; @@ -36,20 +37,21 @@ public class TimeLimitSetter extends JPanel{ private IntegerInputField numberField; public TimeLimitSetter() { + this.setLayout(new BoxLayout(this,BoxLayout.X_AXIS)); checkBox = new JCheckBox(LocalizationManager.get("timeLimitILP")); numberField = new IntegerInputField(); numberField.setText("60"); numberField.setEnabled(false); //By default time limit is turned off checkBox.addActionListener( - new ActionListener() { + new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - numberField.setEnabled(checkBox.isSelected()); - } - + @Override + public void actionPerformed(ActionEvent e) { + numberField.setEnabled(checkBox.isSelected()); } - ); + + } + ); //REGISTER COMPONENTS SwingUtil.addAll(this,checkBox,numberField); } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/YoshikoHeader.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/YoshikoHeader.java index 889a03b..4684644 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/YoshikoHeader.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/YoshikoHeader.java @@ -22,6 +22,7 @@ package de.hhu.ba.yoshikoWrapper.gui; +import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JLabel; import javax.swing.JPanel; @@ -40,7 +41,8 @@ public class YoshikoHeader extends JPanel { logo = new JLabel(GraphicsLoader.getLogo(32)); text = new JLabel(GraphicsLoader.getText(32)); - SwingUtil.addAll(this,logo,text); - + this.add(logo); + this.add(Box.createHorizontalStrut(4)); + this.add(text); } } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/package-info.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/package-info.java index 602043f..e0d4d45 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/package-info.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/package-info.java @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. ******************************************************************************/ + /**This package contains all Swing extensions and components (frontend) * */ diff --git a/src/main/resources/YoshikoStrings.properties b/src/main/resources/YoshikoStrings.properties index 1ecfdc7..fa80efd 100644 --- a/src/main/resources/YoshikoStrings.properties +++ b/src/main/resources/YoshikoStrings.properties @@ -48,7 +48,7 @@ editingCostPanel = Editing Costs libraryPanel = Library defaultInsertion = Default insertion cost: defaultDeletion = Default deletion cost: -switchLanguage = Plugin language: +switchLanguage = Plugin language icTooltip = This value is used to determine what the algorithm pays when inserting an edge. Existing mappings overwrite this value. A higher value means that the algorithm is less likely to insert edges in order to generate a cluster. operationMode = Operation Mode run = Perform Algorithm diff --git a/src/main/resources/graphics/YoshikoAlphaLogo.png b/src/main/resources/graphics/YoshikoAlphaLogo.png deleted file mode 100644 index f13dc35cf24becfe8be3f416884073b36b04f8ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3620 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 V^g88xbqov)44$rjF6*2UngCRs0>c0R diff --git a/src/main/resources/graphics/YoshikoAlphaText.png b/src/main/resources/graphics/YoshikoAlphaText.png deleted file mode 100644 index 5d9b127ace12d72208f05f4d3633ee0ed0f0472c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10911 zcmeAS@N?(olHy`uVBq!ia0y~yU}RumU~u7JV_;y&JM(%40|NtFlDE4H!+#K5uy^@n z1_lPs0*}aI1_o|n5N2eUHAjMhfq}im)7O>#A%{G_G3&C~J9rrw7$i$vBTAg}b8}Pk zN*J7rQWHy3QxwWGOEMJPJ$(bh8~MZ;7!(*hT^vIyZoRFotdTi7^ILH38P$_gk(*LH zx2a5sjNZh{Xf1HAAcv!^K!PKIgHcFf!=2-kVud1#Ch{^0F`Z=ROy6;hWe$t;ffnsM zo(2z?rE3yTPhyk3ma*hwPui~4uYM<|Mcp;MYO5@rqZ#)4`u>Se=h?lgz5l%S-r`k_ zow-S~Z>Vj<LY1}m`tTflZdF#3G(#=Lj*(&hd)v>2CSf(|vD5n*Z+-~0<G<fnoOfR0 zlcCOMPKF!25nS@_=g+7|JbteCne(xf`uA<CZHy$>du^NDcB;nagoku`vu{~}!^!jq z6HoF<J^6M|`{p^r2lF3Syz^S{Z2rO8w^}nNZ)9Rhk&&?fIj4vrWy-M^%LL*+E`2ju zd`J1CqPrKhO#b&w>FIaMKbFLo;Qr|U`KV_#Yc?_(we`*yQRInp;IQtxcf|Ea>y(3f zKkodTar*w=Df;DksUkdW)f$g8_9iPXR<V|3==!>DF(X4<%e~rbM$eO3Sx!ip|4U-q zKVj2uNu#bG^L#jqc0Vfe(-X8huf;rF!*$_vvGq^Q*y60a3{u`D%IxXbsFQMIF>Au6 zxer<bC05-wwdbFC+97dzbAwr1?|r))T~FR?TzWi_Nu*Ewp{D3VJCT#MJ0(?4zq3?U z){}GGW4}GSQd0Lb!|bHJ7SlCMJ{sr+vFPeudni&}V`wDZyL?*j+2@MI)Bf(8J@3<9 zL54j%eHA=*A06W24m5X5e-2O!ii%n_<!)S=>RkVPCx=h9TnbJ7!u={@N9*O^3-wIA zWjAxfX_j>i3I`JcX4c$&veSa+`UfMs%N&x%TNBp?ONN+bywC9e`ftbgerIRrye{>B z=ejwJ0~#DZC`p|9)>OBV)7H-Gf}3ED=P`yUlE!Hhn5W4VT%EVI`rZ=3UIC{C0<2sj z8C`6>nI21n<;!*6Mtu3w>tDWg>()-A?WbqnD(MmBu>85sV8_No3_44-Vq>yeqMRFE znQS@Y&Us|N-1;vLaj)~QP7gKTkiWsyYvv=H<G)xQEkCyUV8X4w^URF%&%3MLwSUR? zwfogh--Bu_R~15z^Y-Sb8DGpTS)83M-uvHXU;VF{CG!_>T-jzUZD27)UxZ7uk)65z z+V_k7bHrw}8Ld52=*!im;=4%qYTK3Nnv?IJ=kK=@$o(8(lU?KFt;XMy*2>`On3o`& z{m5g^9pjs+I!6m#Kg?W~a&nHrf*;1W&S*}`PV&%;u#Xgr`Wc_~R(rmw=qg_2U-s`D zKb;T_HR_kEO5VS3mhEz<RxT%_<*#47a7+4UJyl4cK;kmv_qZ6zAFpQl+8s@o)MgNH z5-?7B@%!kNXIuAIXlX5cI*mt4O6tU)@MrfoexI`U{M>LO{-s`;B`+>4Xl!t3=M&Wu z(RlFSg{%HQ$^YtacdgI<?_U2aBR)J_{ObhssTK_Tv=1}p_DJq$WwLv>d+*LYKVMCd zD$@ABtM<C0oxa?WqV|ucGW35){+W5Rbn`;ZS%(Ac*ZeE6IQNK)A=YWG@$I?*?>z07 zH&<8cw_KU9v?p)&x>qa0Uk7eYpL*-t>1|IfxXSZ)W}SZ9q%<S)yvyeKWvU9M*RPs< z-2C&D<U>ggEytIprWqQSPhD8G?NE-<)_2mo?sLe<RVWtuJ+W8eT7Jt>!9=^oQnYx} zu^Ez+zo)NvVY1zoqBGMWm64&*^68B5P36ZJJlI_B&D|^Ic|d*f(WjfW3LRFka@7QI zus+thH+QF$tnzVdn~zg$vp+1Ir0>AGao+#Azotgax4bv?<JBuy5<YF5ZGKkYmPhKM zgUBRCLAMD`T=HxFJvj9J-M`ZTVb3<*kooohw*T)>D>qm7t+wDx&5|_9NVqA_mG#$p zu>p@(NXTL-ZZGi_bHhvYj$hnSeR89B-u*q5n>C6zGkm_2YRSNwoV{6NX<_5Xzh_sT z6>Ac9S|G^l`%f(-KJ+hx5!b}qrMH*!IdHQz&k9=lW~Jt=ueDAbzcTHo96j}M+xx7Y z?<4NpOQ=qMKj+S6qs6SMQJ#*Ex98Vg?YC{JUhwM4s_rcLm3#Re7#i+xd%f*-<nJk` zmz((hI=5u%+R4$~OfpU!C86$f_w(_(o5;j|t~d2hT`xMJ$NSk$5mqe`fkjc)AxsY| ze(zoR$d99uiB;uw;#5J=OQ}YI#mCd;yGvH;&3{v&nyucF^3M2k^4-PpMeD0HL@sIH zU-73PFGJ5{QL2r}={w;~svB}nZ@M05`|N7!$&{cPx7U%&?-s_rcyyWXWu!n{!<@?x zZ_0CVv9Sp+`)Ymm-xG#~e5DpkpHAr(`<MH$*4NjU@nKwT)1J`jbI$ptKT8&5U})gs z<I`Gsb>;TSIxj60R<Jbw{L!`U^|ymxyS)NylfPzOZoVwrcEr*>#h~e(^=|u#8uOP* zh}y5cVYNC@?9H3Qb$o^AKVNcjj^JMW?!qo->H1q0t-LHL-)99L`MhD1T>yV?#^POa ziY!aBG_&~E++F^zZP(;nhvfZj{>Q#qEDtzilRSkn#4j;a|IK8Ht^HPW<~$a2x%t#C z_xp5X6TXK#Wqymt&HF$9c(}a%Ru|okGn5#3E;;JFjGYuydSKP(<c%{l(rtg+M7g@Q zR(;6q?E8D_TeF+Vj5Aw!Y`!NS*kD(@|Mq`B$H1;2ot%h@7n=U_i;hmw3}zC#a6LD9 zCCARSv70iJ&wP-rY}hydtL*)69?|d5Jn%U^fm3k>_qE0tKfbrS*1nc!N<Diqex8L@ zVffCdcRM_Kjy<S8_PyBR<#OAwG|~E171d#v*YI56Xq%DZS+c}xf=_>gP$1{BU(1!& zv@Kk{>#)J$D2a*d-St$wPd@&mE4Nv4ViGrN#8>94+s(qwtb67c_gVBV*1gJ>74Z7~ zs&$Kwg*R^y+tznJcJ<@evi1l2KkO-x&GzZAKKbRQhNkG0$z5`t!YjK!ot#{{OFZF# zZRPCnnh&Q}$r{%cXI{0dzL@RQCA=osrnQ{yzT@#a*?1W#sZX4n&h>JB{8>|T?vv$z z8<QFhlSPsD=BBKl>n1gKrJqZXpoGB!C)b%_ZMDw77xBzAP@KMa;Q|iDmgaQ%nuiZc z8;{rjo^RjD=pnws!+~S-k8?g8S;-fFNB_1?I6U_-^E0_;D!U6?w;EXaz1zXQ{UO8b zM?ESL&ziC)n<z<rxb`Hh<Zt=)#Z8Ac$E=aDGq<UIbuV~%m&lyrzPiowZ?$hJ$C{VU zZU3HdBU5JoEcvUIdC#|2hrW5*ahFpu<C}T%kNURw7r(RaC*FMjM8xUru{NI18&8}w zvv~f(v`R2qs#>ck@=4fi^>Y%>$~P)hIevMiRzI25O6uZ;fO`yYt8x>cJUcNzw@`g6 z;~d-E%<G=}6BL$Ba81{H>LAD<a&ZNxF?S<h%Et=9<H51lD-VCnzPIKQ|2gK@=StM= z;(|(Dbi{<`_ue?>YWeHCxUc=1v|Cpi#3T&=yt&An!;oLLUo!H~qidhp&eh&~FlRNx zlwZH9ik>m2%WZw0SRH45*<QHr$L2<_w2D<zvwU_k==<zWzP0e}+qXuKw?9{Sb5&&D zW^Kk~Qx=JpN9|gae`U;ntRSj2MeAt$PCl=Uzjkk}FW239kY6BC*rc{#&(c4ad%rPX zn3}JBdezsgl^?(By{ldDx@Fzw4{|F!ChyLFU$^%8lzGC}*Tgd$rhL@23pumm!q@dL zO1J&q^6qN+lJ%=}LZ%%L`8EH=|Fh3do88yrmR7Rw-gD*u;eXmnZbt-#revljaNoEp zv}(0DLv`ezcazu+_V9$5Z8JN-C}Do5@B7W(IZtmpIPffe6?XpL?R}}AKOb7gXw}fW ze(8Ssoo`O2#MQZ1ESsdfJ5DS3^a0EBM}FEk|4(+~S-<!9E$05SHE-73usk1lZs*s( zeSLgypS%D6v$gyF-XBNA+2f7~v?Uy9;1teWa`3>1)=l~^md6)Y&28Vea#D<gVQkO; zOAHgXf3?3N|Fh&l@Qgbp7hW$*5SBWh_b1<R;va@TFZGx2k6Sg(s;8nj%UH?WWnGzI zTU#0n^H#>IafT-t-Jidno4q||`_sTq2KN=8suuj0{>yF7lUpF6s>o8h&#FbA`@Vj6 z^=rSCyU*}h%_%NfVzuGvF5P}lA&+ZYllS-Mc9kBPwCwERRRISN+o*KjH?1fr<bOQ% zDYHyzq?yp;ZcFz0e`d|9@U3PFPj+gam#ZUdlvnxli+0~y%T-QG{xO#@tk0|YI)DAV zKOeH4CSBKC-}CWq^y~T0W-oiT>6e=M!2<%uNfDbWPu^<Z|L4Quj}>=fpS3fX|Nr}} z^>y3zNX|nsmo_-9WQaZ@ry&$ERq0U6U10{F%PsYt{}(wHU-<YvXsgIc)|0}n@1NQq ziw~F6I=}kj@@>o7F6K!(&l8YZm$zf##p^Sk|202muJoz*MCzm#iBDeXa}Aiina&^0 z(CKHLP_O*7N&OS!hmSLB<oCZSpLNxs^@v2MVWZ3Z1?68a+G$&QI2LDGEnn3CCXUBp za?L6;hK&pj#a!oRzLD9ba{8T{T?#`m$C5t`H4EAInbiKXyPEDBboxMNlH&yd*+ZAs zEnWHj+5Ydb59f(SK6;z|`~2^RA@{HNEbLD`Rm*1j;ot@Kiof0K<0ttoKU#Qx`p=67 z;p<|4#!PXYxb5!@gFq=Q-Ta)KD>28^%Hy_gdwf@jVaZ1S`?|HKx2bJ^R(Y+!Q(|GT zbM>t$$IX8pI=O$=tJ$v%o^%L0zIt~>HSZX|gRk5a8^<%hj%V;Rsy3>tc)aa!eOrC| zYi{|;cUv!ocV1W&u$qBkS74UOE)(%eO>Tw{_pGbq@BjIiw&qoIYv{(%h|AmAR`zNt zbZ{viUL!JL>zN;>kvlKV<M?9H{<z}M(n<!&9U12wW}ZHF_<GHyKkl!Zj29#w`N5m^ z;B2G$#=2|2gkx;CIjo(kmAa7Y>Zd<FhDRc0=E|4-yZ_+90*iO+jN+><UD_RXBs?O~ zp^x_r&$%O=_7)pMKlPL)2z||3-o|)J!mLhv;uH^+9q%pg?=6%nmkC&WeZiMKm*Q_+ zoVx9j+kB%*`bIlDGfcV`s<&CiWNlz!P^_CY-Q$%<>4LYvbH97G9C?`Y$slL<%5~wp zeH4F&E(~Ar?8Gc%7qJ7T^R7EAW()Cn<PynmB^_f?5%c}dJJ!2v@5aBKcl+<u8y`0= zp5Rg+=Vbaj_K>JK!-W{0`^qd6HgQznSeTZSJx}*(>SqRz!;7yo@LUNjJkhk0?|}Hf zAE*1ze>Z3Pm#J{GK=-Kc8voj+?ep%HrJ03Yk4bs9!t6ztUC`s_Y8uNUY_~|Qm-&6F zw&`K9{!Diz!QzCB1>QP>ZBqo8+F8Un9hUDp5yq0a$=Z-X?<9xyim?0Nf92hrbLY*6 zHFihYjhcN<@n&634Q;>9mL+>{|NS@Z-==)C_V54T+T#50&#e73O%yrYLR#hsEqPm= z<oW2C+^xyi_Y2IIw-5MI^U7@NWj?VM0h6Dz1Aa%mojd8bs*_mcn_H95a()QV2!7Uk zbji$l^RH~atH1n_rOVN>BmX3yEpT4+W1Y@X_mU~or)O8&6dv2&zhY+iEB5w-Yz#|z zM0oDHiM*b#_mg%1m&J*mGt}nZzwqUC_o1(iRoriipYCVzO~}abSaV){%FdsgDvRe| zoc{6u8JDi52}Q!p4;!0X3f2Vt*?+s8;nK|9PM4;S<v*%9XB9}C-g3a?%76dAGZ{?g z^u5;l!j*2Bu|jy_Y~}M_Q!Yt8$vp0By(egO2}AoypB5{p*(&p<bDf&NHsRE}Ooo^L ze*eCIf7-2S_qR-5=_9n8DMNd!>EW6ig)tty3tvuHX1h8(^#8_p)uqdKRs2s<V-THV zw)$6zM%N;*J^S?1UT`YzQ{cRDY<j28AyEdE#D+&gv(s0zDsQ*F8qWIbP0y~E?rnX# z;invSayF|a{CYJZA#=~Zhl{VipZouIJ;#+<9I58j@^<zqd4KM&zM6IVL$QK@2a8$P z!f63=Q&0W*s4ZV#|MY^Fgvn_pi>(o@?tX5Cj6deGG2D_cs91k9s;^V`?)K99VC#tJ zyNk9(9E(~uHSzVzXz_ywf~$Jh-FW=cqWAFk@cUhF61wFsCP^NYJh=C0&L;zTwn*Q5 z6RzaD`YT+!8OosLU#x#&>%Zd9kIwq9QeUk;W!2KYe~m(GS=LUDHmrE~K&ehIK80__ z2m9Cmy?^`PdhdSf(TO`tx9Ko5CVjs%^Yw}hzBi0H2QIT2vzY1c;*e#$+W*WUd0DH) z>$ACMT~}GGQ~Gh^FvE%2`$bki4otkJxjaMEBIlc9dB}>%4jhdqFBzN=xMb3{^=0Fi zU(9iTD#NC8x>ZTM$??n)Np_pMaXk}jk8%4-|1O`Z!{2J-mYkV-?_ON)1sRuF%N-ro z99iS(bK^$KE5@26`-U0p5B_&CC~z}(u&@|4MRO|e)s!`lJ`+^Ud`9kRb;7NKm)BkT zyKC{BYtyovpDa7^ze+=$`M~7TlWC!aYLD1%D*U?sb$v<Tk~u~*%vv8XiRxW>Kf!Qq z`9*UB0|u!RK4yg+?HMaBXbW6Bv_P@z$Ig$*H)p<yP)=0%QT1W&w)tD{wwdvG91EDE z@RWi3ko%+xMb#F|gOQPor)_z=N+tWr%=-Q>pJrdX@3Cy#das7qli}w63=ht<Y4j9p z+_Y4fnq|qr#KkAd!Y141Cgj1ss#vF$t0Z>HOyv+ME}pYzd|xEaaa828crNj7eXL^7 zbPk3*qjWZ&8FyID|C`x-`}B2}NmD}0Qdtw$Ok=zo7Lv&D;zNGBf0x9>J(Ch{-b-b_ zo&7&^np>80mc+$9jc1d^*Gvh$J(KyljOHw-oa8nBpJZPN@=I+y@5GR>Hvd8VtN)J| zSZd4-pODP5^CzqBL9sLI=JeiroW1|bkD|x&tM09h3M=+K8~$Klfa^l1)lV;WF1k@B z>T=SrMs?NJ(;;foTr2XX%roX<dl$yrp!4nNoMz!?VS*>7ytyGDbwxpH-rs{vp2y<e zxooly&EyT9arO8DLEg-1$Cf?3w8DEvXuz{6K{L*@oHVZH6X25AAI^Uu?;^($TLy<W zpO=4Be=K`3!(_doNBG=(|1W=8-tk|nZn8?}baCU^b(>xGtYq<S(0?At?>eE9_3*cR z5l*Hhe~*3pZNB#26t4>{+8iAT0n4T)x)rdcT|aZ|%IRfs;&Ebig0rsnz24SvYK8f+ z&q8f}iGuDN6U0y7?yX?a+4FItpu;ro6DDjM?>teMq0=hF7b1V9zRP{9%QKH1D`zgX z`CXtDlHuaqr21i1o%?+EKkqe*gHKA>GN1O*SR^v1Fns6X>aEM~uHs^tJ|k?~47RKD zF0FfI{yWy+$x*P^ZDO6?U(F}l_bk--1dZ!w@hGx<aCH60Byz=7^UeH{E&Ot}dR3>6 zpSJfalfG-PB2a+i&4KWx;S0BJ6&0;t8_{OqB=;pK>%`1sa$M&a&P9~@HyY3Sc&{d< ze5KNX=38P#S(PXC=k4v2=04Hru&tE6xMu5&O%HcpU%W%K&*=X_qb;q*d`=u8>zq`z zvL5|jA@}BB@UuA|1s^}Z66JkBOlac92VajT@ilm}xTkbFFqjk-KVkjF+jZ)b*ULRW zR|v9J&aqMReDJi9lVO=umVCp?zD=^6hqljOue4WZ?i7uQJ3h4SC}=b4nza1s!e3(F z=B|oaBqQ-N?aA+@p-Wd>&3+jEx9@7<od$&^Z5NCdvu4kW`8@q!{d@aW0Zf|H**!L} znDON^`KGg<Tqt-mWx*stcL!b9&HFEIjAN8%WIej}&50>7V$;$YXZ22MO(|kjGoP4n z@{E?P%gId*CV#rRm{&LV`rEIX{y;~W_xsaxZZEike_K4?x>H#~!YPa6_cXcCi;c^b zgcvk6idQe5(9<HOIqy?a!;R35|08^u#Jo~0dCY(Kd|3EH@?-I-Ek*}tr#}1h{m!+| zi(0;QD;!`juwC~(@WRTSDlz94czx5DImd0+W`_)=w7Z-SRzAF=?C1J^ef9k#>kDJv z-`gAdrl>5p=>L-#+a-(7g|`Q7y&}xh<R#E+EcI~zvHx4w-QG3t;E6TnnU)iZyLu1L zzHoQX&o_5`%*7wbR&LX+D9Kyl>UMK!mrlOTC2lQ8y_?4^**ToMjB~uUKD_+YcK@uc z^`D=9t>V=PT+pO&cG8NVQj_|pYvS{cG(Q)899imopKZalb5hJ+44coMJC)vW;@b(E z>l{;7Gd(%g9k-M3&7xL^V?{z60*odw8CdVXUYQ-eN;kjZu}R;9O%J?wn4j+8Y0#=Y zrFLr0mu(@Mt`%t&ae{I&J;pyZ=KJy$X<xitR(JcWZT0s#S1i{T2Yy$+t6%fuWqZWr zh~^a!&othc>ChU-SS7WW>(jYCHn03H^Qr2tXgF;0RFqAmuE6b~p=-oB1_|f(i@jg@ z*Zp*T-Zb6rr^2>_9vi19%R5LM-S;ok>#uYA`R1C7LC5cZNvxfGH*-m48x!x9+}Y2S zRyP?f*SX9%V|HK$H{+dS<<r-nwA71gd^qR5Kcm56gN(9EJ%@j9UwUi9(`mZfcT4Qk z<Yw&odQ93=&*!nK-376#2jA>`w$0rxA&@ZXxv^|D&&h4CZ@+st^LlYsO5Kw$>)Lls zTl+G)xo)#PKSSt>04J^q_wTKK*3Rgqm@rAz_u!5zn?0rbB`#h26f@JS`TLF=v%534 zwN^|}yYMmS%iV*o!}3@T{C-#Wv(3N9@AZusy9A+&0s9)_^-k`1e)Zwxzoz+1DsN@o zW;OcES*2CYcS~-)3}3t8m8Nr<M@ydENiLOM&C?)$;?XX(TQ3Y)cWvg*_1LqQg(c$p z>Dcw|y(^qonz|k?`1_$mq^_99ML)RQ`R>EgeY<Q{o%4-baY=ESq_5&@AHn9Eb;-Z? z-Ywqk|Gsw9cTq`>8;7hn-rpx-kThxIrn}8L&G`&Jd&BPZGKzQ=bgAy=eQCC3?!V{N zYku!$UHR>4Y%a6SLk1qdhMoVauIw+mH`Od(|Mec_)%FrKyU(8psnnGIc<Zq0;mh3} z*FUG!9eM07b5AIPQC;TdpGB-J!VDXdbr>e-|2}F{s!?y5cJmxVz+=_L`4=Q~o*Yfx z5)^fLsrzO5?wy?~-iyB6y|mqSQo|Y6H8J1MhUfqDJ^yK5S)rg%HxI|(=SK`%&$qZw z3Sp72zIpoKj+Xb&b(QBO@?=I@u95iJT-=qSHt`w5$rFb4dvik{CC|9I^5o6{1rMef z8@K=Wt}w{gb++bM@pihMRJQ;2=#5sXGw-hdvGDb-*=IUepLu>k{&%RoM7r2l^8|<f z7x|SNmL%O1wVcS@P@O!Xns4QX@8u0F{?GKcMZRBue9L^F-42U*RxOA*cRuS%cW}*O zH<4KVGF>sv)R*#J(?i#<s#{s*`*roz>{aozKmD6>J-a@vdM~$t#J2mI47WZfoY%E| zDYso`bH)4#q0BKo_W6gr%gVcd9~DpV_^i05;aF-q*R9puO2RUdlT}}B(vW6g-t5pI z(3DxFn$>UfjPb<p_qu8c^TQ``v(92ZJLCJ6f8riJ_d=gNefo6Os?}e28YQ&7Eci0B z_C?j+N<*&wK2wsDB0mJGvPka9ep@od`tr2w({H#K8J=cYUgEyY{ZQxq%~pNC_g9wP zHGNy{dvMvFR@ZGyw<~V6*ytGY;=&q%DD~}0c|T*$=+5uHd3CcRpJKdI9q+9v8=Ia~ zpM0m{e=6f^#x>>*+bz0z^(+sc_p5oBr=?Q;vbDKz#|8$+pQW$&FmXKbJ^J^_rKSF< z5e=NxlPB=;{+@DHW9^Tp2hYYSY*_1GYdF*Q-_vaqgq*Ja>6%<)C$I8Yed^CS&!5+< zSG~csuHf_!O$|HGx+Y)ynv}inLDkdu>sGAU##H^3xvYip#JwAb7&n}lJ5hW4lI>4) zpInT&)$@z}RlcZ*V@#Iz=b!l;7uR3<{8sm*!!q5O>mM^0tn_~FRo#*jm*%)S;|B8= znVhswCnrDeGL}?L^maQpWq0a_)Sc`XKQDKaXqdtpaALWt^}6K-s_U&U#C{Z==_C8l z^U=h8|KA!ezPZPdjYWcS*^0y#f9?NERYW#9HH*Ig|MhqDrTK@R+}RcA#1ZAZHlud& z*RX@XPpAId-FD&4-n9Agi!5h*`sOVv-%zd~)hjmZjT&>y++!Tan3-?P+kP)-$Mk<G zwv0U52|Vs?ih553gPd1bEn2noAN$wk99wQ#=57=H*Hx_*cAn$RiO>I{FGmah4gC`2 zG3{&`XWA{}qdPUv@!IEEFu(iDbZu{Tdgk@ks~d_BJTVsRbU%4cmoYP)ai+hU%xXqM zzv7rR7hbRHVyi!9DG?OrWH9^1<gbsVFTU4{|M~9%oAFUzb`FLEcP{vt*i{{~%u{4I z#~N+FM^LjMK;Si_lNU$(yV8u)f0m}tZThqGkFrrb&;O0_vp4TL7oP52l(whde;0dh zedZn)p+g3dsj1-`8B=8>_J<$a6(AIl_Tvhx!i>WCAFt*uw(e&Qc_BKZ=-rh3>w4?< zvKv1T-_x-E-Tqg8E8=4Iu1a;|ezRKe>7M#Gi)Uo+%Wz9Q^`QD#dH;@ki4oj~_n)Z$ zImLT<4P(LFGe@M~XYMKNzhztU+i97hRP+DH|HVg-&rsu%*uP`9s!(^;PtC`f1@qM1 zZ`(>mHe8g^X7=2(|ES-h?)ZOU>AS4CWt8_?KK0`K<F4u-EaKXDn#;!ayy?7a**VRO zY|JboEOP`}u6oH-oOqHizvbJB-5)1><_%I+Ro&M-eO~RMo9^@WX2qSfIsRLr=w7{R zP3z9L`~O`DXE-pkhNtY_vcx|*ixU}q7WBrgeim_GvZkOQ_<Coo?Ze84n%~O8doxyC z(Gs*VxZyER{rs%V+g^Kibw$PNp4zf$&(oE@c}cNJvWv`J&bQQ<DZT#__+0+X<ul%g zCLiwm%J7Q$D@Tm<4)34KCS99<z5epgs^`&fYOl%vDcZ2^-G^Q4dF4ziUR}Aga>IJ% z1D5X5i+Jyvm)(D!_Q$e7*s0A))q^XVUHPGxS+$1?^Vw>*L&lSn4=}cBv^rV)tqp1E zlaVg4{NG{oU-<9q@A<cbw)(p!OL8_gK9A$>y4jfaWpCw=_f`BgKcmgq(tGP~x9-3H z>rvqGJnKxa%2dsd>Hb~}P6nQ9j~pzG&&jdd_VDJra~v8=6}TKHuo!BGbPH`|d8Bno zL?k*m`s26aiLM??Ic(BY7X4t2`SFhJ(&}HQ7#KKzgVq8t#BsNZ2rCDQA6=&RMf<y~ zX=U1{4O`Ezi@m)oeD&k22|Hb_qOOQ3bnNMJtozxeoaM66ew}^WcLN<mGjGM3`Y(5H z*ZckdnW+1QVXjm>uhwhr+K<JL!+)Ls6hAY8bIQup6<4$jW9RDCPM(lI^L;IU|6>Ea z&hKT~&Otl&NgVlN6p%jm!m69I1y-#0RonGe;w%@l!6!B0mq8iK?)!hv-8$QQ{(Sja z%&h|4EM6W0#ow~l)qg#=b?OeCOT5odTQD%({`T)S=lYU&zn>Z2Qu$FKHHWvk$x)T7 zB&g|SqphLsg(;QlO6fB#kGC{voO@_6vvY;y(N+78%O5^EyM5yQFkjn4f$PKP`G+vt zWUV}^!uYoNP1_+624A(wTmB#VS9?7#g8Sx|nBU!Q#ntmX3xsc<$-VLIdanGI`&a($ zXkWgRA>()N+wZwiJ2mxo$K}a3EOQVBl|~#U3tY5M8vkSQO}M+Nbj{zcZ}Lv}j2&GY ziX`<nI~-N9b~f<$U;0z@+|1g$4m%hYmewrujVPYHQpbEE+XTO*K`)PFzX~=q%h<>^ zO_%%HtKbdSPi~gqocc}HCp9CZV{O$V_4fUVB}o_VGrS01uuApXqQ#cMCw*kECJM36 z5!Sx9{KOjO4ZV4Xxux&_PPn@$wcq=|*{y=P;i?SBg&B6VGF@xo&W`=_r)T4e1Dn2u zEoZ;e@bHD|#ma2^nA6E7VI}6_d5RNDPnN!@-tqqBH||^cF8{iml#VWA$oTT(#YFkF zzce0}+3IiTyli0?^;NJtPSRHLQ>%B;^^<+mC+0>j-Fd1ZdUK#1!-Wzx!{ZtnXLY_X zPHVeeY{+Er@c6SwpVv*CxO8GJv)KWMgGL$2JEo|wy}$Um?(WBjpRh?782@BAmsrGR zf6;J%iM`36f6>Q1WIWvT#1+1Nlh3n!qrdn32M+0D8|*~W64Vy>H!f;(n8F~kdaBde zef<v1sWOMp95{9*ZO^CvZ_BOwq6!~Bc(7plnbf};K0=e;i3nUcw(w*0iCI518cjD} z>)Em+K;dKHp>y7ncV^eWQAnugOjC2*!nSguaND!;|0{m~+V=Ri-^@58+0-b>m}?*0 zC#hbX`OYP$wuk>;!3UYoy4eSr3RM%i(w+NVr!GG3%Kvuf*5|jjCEpe^onjWT`Tvu5 z6O=qB|4{kJxn=s+s~7)w#Oa?jw3v6>GS14uQt0)Xk42{$Z!}Kkskdn1PutJFVrGiE zy3FD1M`c}k-#^&wTqS?{`5G2QE{lr?EnJIy&&VyaWT-57YxZYvDl3O#fCv*;+l^f_ zG=gV-RG8?Y@$B%itLx|Q{PV5hRWlP)>k1A>M@jPw+pq7+X0*}eR5l9vTeHA;%aaS@ z|BkF*dGq}Kg0cd&L$6daZl%2N;uHy3kt48xGa&EKlguwmsy7<_6a4?-<qOMB?|W~j z+e{YUVbsVfqSajgOj`2rF}-yu%G$?I#PP4YIm0)v;pnVwiW2f0uYP~~oR{GPYqR73 zC$H7!&$Y7qI`@r>^zs%TzTB<bo?foD|I1iE^SjrkzmJTPzCD>0`-6)?SA=Wj<o)J9 zA6+qA`Pm~tPifvGj(q|(3tt~w7r!(}vqED3iJCWW`aLANGNqNBCo!MUZ-2Uf$C0%` z%F!!3c0Wlu^7!r{jor_utlhVo<GV}jzU=FaTlegVS^eYf$#hme={*;g|6C|&&vDUF zL_Xw)gJ|Evg_CsU_y2jq?<Ai4w)gmBqnW3}1h=hM%kf}XxWZC&w=e_4xjvn0=k_;C zr#+hWVbhF@Qy3UF&b_YAC~ke=#I*TB*?%61#7D;Om1Q{cTsZzj;EUQ%o0chFcD|YV z)HQOBuHT+hlGA=f>2Lq~V+Tuth^L(c3-9*nX-48^>Hqt*CQkNI3t{Tov|aS({YTDS zQ+BRdsP*(w#|m$w55?>aA0?P}oSkQ!<0K&2kh5SW3qw(21LOD5)EVtg9b9Ksw!}Y+ ze0wj{jeX~XRLMKjt&-&;|0FRuh^@bMywiKi{GA32dNTS|^&Sxn-*+5$Vn}#@XYq;p z_49LjTqYEG3#~T0`)N|;Lf2$o#y@+j80@~=G?*Rhy_-AJ!1`>^gPeecObi{TE1qv< z<mL?A?rP$i_4ez&15Q`sO?+-JcsSQJcc|Iu7k;$kxi@+Kj+VIUR_#aSoKJY&LJlzm z99VGoMpK1N49^VDO)tvW7VK)+5-od=Phr!m_S?Jv+)2sfco=fanZ4YTvtW-Q!^UmC zEXnN;Iu#aH8$I4GJ;C;-iZP!g!wHdFt2Z9g{nvi>bjGC5H`Xt&FyPZ?5O7}O^xaq0 z$1`mM*C+M#PA*;J436aUsyv5_J<FfypLLyJpY30mDE;V->qN(n<d<s9<};<8<PPWv zv8b(L(93aPV_McCSEadC{8up}OUmlQS$dTWN*|B;I4ytsll|kbO<JuhYP<y99<o&# zF*I;*PSR6Qojq;sfm%U7^X6%W4BH<+Ov>>|I#70ef!M^7DXng+cv*aQ>|Zgp!oXlN z!w2L3C(l`!HI&#HJabm;;Fw)Gg<)s=rK0I))_Jf$T$I4NT+w^ey;TLaSDk;Rgv79w zZEAHC?RS|L?q8obr+D7{gMXK*+*!QIStV}1_{1e;)r?x=5^YLT%JvrVJ<2*3k|4OO zB~(PaIMVLuTE>j!RsTOSFg)Vg<>GWxG3DakJ<8ub_M8a&BD#M)7nftqBS(jOo$j_q z`&^j97Cl_eYLlV3K|6%CX!d5kv{O41esp=?coKH^W7g+yyWHcJFbeP3FVpI+#lPte zhv>0b$)#uR-dZhbH+$yf-MY*Zj`q25aCfvj8H)>i?D9OiWbq1)q;JtFyn8qv3QKbo zD5?Z>X;`01x}C&xl$YTS!z8ZnufnE%xpjgsZTDWaw$ATvTn3yUZ;AZuUKw!W{-fYE zXZEJ-zij-!RpVO3oeuWiDXG)$Zn}6!`Jt0a+<{`*9ZXlsP2L<nU9HJ#qx;~K*H@)I zJem`B>OZS)?a49uWj0HILGMfCH3v3MW{qb*Pw<`EGr^{8<;Q+?1`QUb)=6%0TzyQ1 zt8U-=l$YvkenB(sR=VN!ue;=I)*a@S;OaWjc_4X@C*xwhu<I2QpG)`h1U}graA0T7 z`ZK9(il<BeuV8Dq$hAx2u)Y{aS8eCwoJ*dDp8DHgi&fjMKlAHbOLQyGnt(lVYtHqm zu`~1^k^ER7A<=qqr{NsgiI(!-$L#Mh9C%&l{yKKs^wJ4RjqTzG?YIK(U5r^j;rl&7 z*2lLs+vhSeSg$f~WoQtYa5^J(-)V71+4l?^_BtFWH+ZMwT467eIpZitt^4|LkDDjT zB>qNRR{SS<FJ4jh$DWjP$5$!#mMi?wnbQ8IDZ9_?i)Kk)UuUk)D@pnH{ATl74<A1v z@v%@v_@DkV<K#pcb%q4<k4(vpQJ-TC+#V~kZ!m6{@qe}UR~CggG7l%$v$oEj@bie- jM&BIa+fZuVy?^#M1<x*u`)RZawEoo7)z4*}Q$iB}U{lpB diff --git a/src/main/resources/graphics/YoshikoLogo.png b/src/main/resources/graphics/YoshikoLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..f71daaa2bec19e27195c3d5d229a50e607761bf0 GIT binary patch literal 4555 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 Qfq{X+)78&qol`;+09fA2sQ>@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/graphics/YoshikoSolved.png b/src/main/resources/graphics/YoshikoSolved.png new file mode 100644 index 0000000000000000000000000000000000000000..f1631b52749f39c677cc1db46262a9f1227a8090 GIT binary patch literal 18506 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	XHI&0ESmg(k6xc&_M?I3b?3 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 Z5&iJUx0z4RFfcGMc)I$ztaD0e0svW1MsNTC literal 0 HcmV?d00001 diff --git a/src/main/resources/graphics/YoshikoText.png b/src/main/resources/graphics/YoshikoText.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b0025ed2f9031f564425f0100530ba6e12f083 GIT binary patch literal 6526 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 Ax&QzG literal 0 HcmV?d00001 diff --git a/src/main/resources/graphics/flags/deDE.svg b/src/main/resources/graphics/flags/deDE.svg new file mode 100644 index 0000000..7af71b9 --- /dev/null +++ b/src/main/resources/graphics/flags/deDE.svg @@ -0,0 +1,5 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="512" width="512" viewBox="0 0 512 512"> + <path fill="#ffce00" d="M0 341.338h512.005v170.67H0z"/> + <path d="M0 0h512.005v170.67H0z"/> + <path fill="#d00" d="M0 170.67h512.005v170.668H0z"/> +</svg> diff --git a/src/main/resources/graphics/flags/enUS.svg b/src/main/resources/graphics/flags/enUS.svg new file mode 100644 index 0000000..15d50af --- /dev/null +++ b/src/main/resources/graphics/flags/enUS.svg @@ -0,0 +1,18 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="512" width="512" viewBox="0 0 512 512"> + <g fill-rule="evenodd" transform="scale(3.9385)"> + <g stroke-width="1pt"> + <path d="M0 0h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0z" fill="#bd3d44"/> + <path d="M0 10h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0z" fill="#fff"/> + </g> + <path fill="#192f5d" d="M0 0h98.8v70H0z"/> + <g fill="#fff"> + <path d="M8.233 2.996l.9 2.767h2.908l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.898 2.766L24.7 8.53l-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.467 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.466 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.354 1.71.9 2.766L74.1 8.53l-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.467 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zM16.467 9.996l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.466 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.466 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zM8.233 16.996l.9 2.767h2.908l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.467 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.466 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.467 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zM16.467 23.996l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.466 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.466 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zM8.233 30.996l.9 2.767h2.908l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.467 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.466 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.467 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zM16.467 37.996l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.466 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.466 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909z"/> + <g> + <path d="M8.233 44.996l.9 2.767h2.908l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.467 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.466 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.467 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zM16.467 51.996l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.466 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.466 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909z"/> + </g> + <g> + <path d="M8.233 58.996l.9 2.767h2.908l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.353 1.71.898 2.766-2.353-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.467 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.466 0l.899 2.767h2.909l-2.353 1.71.899 2.766-2.354-1.71-2.353 1.71.899-2.766-2.354-1.71h2.91zm16.467 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909zm16.467 0l.899 2.767h2.909l-2.354 1.71.9 2.766-2.354-1.71-2.353 1.71.898-2.766-2.353-1.71h2.909z"/> + </g> + </g> + </g> +</svg> -- GitLab