From 1c869d0bbc613fd21f782229ab5d9d8230170a0b Mon Sep 17 00:00:00 2001 From: Philipp Spohr <spohr.philipp@web.de> Date: Fri, 18 Aug 2017 14:03:50 +0200 Subject: [PATCH] Some work on localization / various small quality of life improvements --- .../de/hhu/ba/yoshikoWrapper/CyActivator.java | 18 +++++-- .../ba/yoshikoWrapper/core/AlgorithmTask.java | 11 ++++- .../de/hhu/ba/yoshikoWrapper/core/CyCore.java | 1 + .../core/LocalizationManager.java | 49 +++++++++++++------ .../ba/yoshikoWrapper/core/YoshikoLoader.java | 8 +-- .../yoshikoWrapper/gui/LanguageSwitcher.java | 5 +- .../ba/yoshikoWrapper/gui/LibraryPanel.java | 4 +- .../hhu/ba/yoshikoWrapper/gui/MainPanel.java | 13 ++++- .../yoshikoWrapper/gui/MainPanelAction.java | 46 ----------------- .../ba/yoshikoWrapper/gui/SolutionTab.java | 7 +++ .../ba/yoshikoWrapper/gui/SolutionsPanel.java | 25 +++++++++- src/main/resources/YoshikoStrings.properties | 6 ++- src/main/resources/yoshiko | 3 +- 13 files changed, 114 insertions(+), 82 deletions(-) delete mode 100644 src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanelAction.java create mode 100644 src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionTab.java diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java b/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java index 82ae5ea..3d3eef8 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java @@ -10,6 +10,7 @@ import org.osgi.framework.BundleContext; import de.hhu.ba.yoshikoWrapper.core.ConfigurationManager; import de.hhu.ba.yoshikoWrapper.core.CyCore; +import de.hhu.ba.yoshikoWrapper.core.LocalizationManager; import de.hhu.ba.yoshikoWrapper.core.YoshikoLoader; import de.hhu.ba.yoshikoWrapper.gui.MainPanel; import de.hhu.ba.yoshikoWrapper.gui.SolutionsPanel; @@ -28,17 +29,24 @@ public class CyActivator extends AbstractCyActivator { Properties propsReaderServiceProps = new Properties(); propsReaderServiceProps.setProperty("cyPropertyName", "yoshiko.props"); registerAllServices(context,cm,propsReaderServiceProps); + + //Create symbolic links to give other classes access + CyCore.cy = getService(context, CyApplicationManager.class); + CyCore.dialogTaskManager = getService(context, DialogTaskManager.class); + CyCore.cm = cm; + //Set language according to settings + LocalizationManager.switchLanguage(cm.getProperties().getProperty("locale", "enUS")); //Attempt to find the yoshiko lib in r a previously stored location - YoshikoLoader.provideConfiguration(cm); if (!YoshikoLoader.isLibraryLoaded()){ - YoshikoLoader.loadLibrary(cm.getProperties().getProperty("pathToYoshiko")); + String pathToYosh = cm.getProperties().getProperty("pathToYoshiko"); + if (pathToYosh != null && pathToYosh != "null") { + YoshikoLoader.loadLibrary(pathToYosh); + } } - //Create symbolic links to give other classes access - CyCore.cy = getService(context, CyApplicationManager.class); - CyCore.dialogTaskManager = getService(context, DialogTaskManager.class); + //main panel and result panel SolutionsPanel solutionsPanel = new SolutionsPanel(); MainPanel mainPanel = new MainPanel(solutionsPanel); diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java index e910feb..f63d937 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java @@ -8,6 +8,7 @@ import org.cytoscape.work.AbstractTask; import org.cytoscape.work.TaskMonitor; import org.slf4j.Logger; +import de.hhu.ba.yoshikoWrapper.gui.SolutionsPanel; import de.hhu.ba.yoshikoWrapper.logging.YoshikoLogger; import de.hhu.ba.yoshikoWrapper.swig.LibraryInterface; import de.hhu.ba.yoshikoWrapper.swig.SWIGTYPE_p_std__vectorT_int_t; @@ -29,6 +30,8 @@ public class AlgorithmTask extends AbstractTask { private int timeLimit; private CyNetwork net; + private SolutionsPanel solutionsPanel; + public AlgorithmTask( CyNetwork net, int timeLimit, @@ -36,7 +39,8 @@ public class AlgorithmTask extends AbstractTask { CyColumn permanentColumn, CyColumn forbiddenColumn, double insertionCostDefault, - double deletionCostDefault + double deletionCostDefault, + SolutionsPanel solutionsPanel ) { this.net = net; @@ -46,11 +50,12 @@ public class AlgorithmTask extends AbstractTask { this.forbiddenColumn = forbiddenColumn; this.insertionCostDefault = insertionCostDefault; this.deletionCostDefault = deletionCostDefault; + this.solutionsPanel = solutionsPanel; } @Override public void run(TaskMonitor taskMonitor) throws Exception { - taskMonitor.setTitle(LocalizationManager.yoshikoStrings().getString("yoshTask")); + taskMonitor.setTitle(LocalizationManager.get("yoshTask")); taskMonitor.setProgress(0.0); //Get current network if (net == null) { @@ -85,6 +90,8 @@ public class AlgorithmTask extends AbstractTask { long numberOfSolutions = LibraryInterface.ClusterEditingSolutions_getNumberOfSolutions(solutions); + this.solutionsPanel.erase(); + this.solutionsPanel.generateSolTabs(numberOfSolutions); System.out.println("Found: "+numberOfSolutions+" solutions!"); double modificationCost = LibraryInterface.ClusterEditingSolutions_getTotalCost(solutions); System.out.println("Paid a total modification cost of: "+modificationCost); diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java index 47fac47..33df2b9 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java @@ -6,4 +6,5 @@ import org.cytoscape.work.swing.DialogTaskManager; public class CyCore { public static CyApplicationManager cy; public static DialogTaskManager dialogTaskManager; + public static ConfigurationManager cm; } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/LocalizationManager.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/LocalizationManager.java index 4a65d2e..fae2f29 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/LocalizationManager.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/LocalizationManager.java @@ -1,35 +1,56 @@ package de.hhu.ba.yoshikoWrapper.core; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; import java.util.Locale; import java.util.ResourceBundle; public class LocalizationManager { + //Locales - static public final Locale usEnglish = new Locale("en","US"); - static public final Locale german = new Locale("de","DE"); - //List of Locales - static public final ArrayList<Locale> locales = new ArrayList<Locale>( - Arrays.asList( - usEnglish, - german - ) - ); + static private final Locale usEnglish = new Locale("en","US"); + static private final Locale german = new Locale("de","DE"); + + static private final HashMap<String, Locale> locales; + static + { + locales = new HashMap<String, Locale>(); + locales.put("enUS", usEnglish); + locales.put("deDE", german); + } + static private ResourceBundle currentBundle; - static public Locale currentLanguage = usEnglish; + static private Locale currentLanguage = usEnglish; + + static public Collection<Locale> getLocales(){ + return locales.values(); + } - static public ResourceBundle yoshikoStrings() { + static public String get(String key) { if (currentBundle == null) { currentBundle = ResourceBundle.getBundle("YoshikoStrings",currentLanguage); } - return currentBundle; + return currentBundle.getString(key); } static public void switchLanguage(Locale lcl) { currentLanguage = lcl; + updateBundle(); + } + + public static void switchLanguage(String key) { + System.out.println("DEBUG: SWITCHING TO: "+key); + currentLanguage = locales.get(key); + updateBundle(); + } + + private static void updateBundle() { currentBundle = ResourceBundle.getBundle("YoshikoStrings",currentLanguage); + CyCore.cm.getProperties().setProperty( + "locale", + currentLanguage.getLanguage()+currentLanguage.getCountry() + ); } } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/YoshikoLoader.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/YoshikoLoader.java index 1c9440e..fc42a4d 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/YoshikoLoader.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/YoshikoLoader.java @@ -8,7 +8,6 @@ import de.hhu.ba.yoshikoWrapper.logging.YoshikoLogger; public class YoshikoLoader { - private static ConfigurationManager cm; private static boolean isLoaded; //Symbolic Links @@ -27,7 +26,7 @@ public class YoshikoLoader { System.out.println("Attempting to load library @: "+libPath); System.load(libPath); //update cfg - cm.getProperties().setProperty("pathToYoshiko", libPath); + CyCore.cm.getProperties().setProperty("pathToYoshiko", libPath); } catch(Exception e) { //e.printStackTrace(); @@ -38,11 +37,6 @@ public class YoshikoLoader { //SETTER / GETTER - - public static void provideConfiguration(ConfigurationManager _cm) { - cm = _cm; - } - public static boolean isLibraryLoaded() { return isLoaded; } 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 638bdc0..b017bae 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LanguageSwitcher.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LanguageSwitcher.java @@ -5,6 +5,7 @@ import java.awt.event.ActionListener; import java.util.Locale; import javax.swing.JComboBox; +import javax.swing.JOptionPane; import de.hhu.ba.yoshikoWrapper.core.LocalizationManager; @@ -12,15 +13,15 @@ import de.hhu.ba.yoshikoWrapper.core.LocalizationManager; public class LanguageSwitcher extends JComboBox<Locale>{ public LanguageSwitcher() { - for (Locale l: LocalizationManager.locales) { + for (Locale l: LocalizationManager.getLocales() ) { this.addItem(l); } this.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - System.out.println("HI"); LocalizationManager.switchLanguage(getItemAt(getSelectedIndex())); + JOptionPane.showMessageDialog(null,LocalizationManager.get("restartNeeded")); } }); 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 d2e666b..5b78ee1 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LibraryPanel.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/LibraryPanel.java @@ -29,8 +29,8 @@ public class LibraryPanel extends ComfortPanel { this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); //SWING COMPONENT INITIALIZATION libStatusPanel = new LibStatusPanel(); - searchLibButton = new JButton(LocalizationManager.yoshikoStrings().getString("resolveLibPath")); - yoshikoVersionLabel = new JLabel(LocalizationManager.yoshikoStrings().getString("yoshVersion")); + searchLibButton = new JButton(LocalizationManager.get("resolveLibPath")); + yoshikoVersionLabel = new JLabel(LocalizationManager.get("yoshVersion")); libStatusPanel.setStyle(YoshikoLoader.isLibraryLoaded()); 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 f370508..ee7d4f5 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanel.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanel.java @@ -9,6 +9,7 @@ import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JCheckBox; +import javax.swing.JOptionPane; import javax.swing.JRadioButton; import org.cytoscape.application.swing.CytoPanelComponent; @@ -18,6 +19,7 @@ import org.cytoscape.work.TaskIterator; import de.hhu.ba.yoshikoWrapper.core.AlgorithmTask; import de.hhu.ba.yoshikoWrapper.core.CyCore; +import de.hhu.ba.yoshikoWrapper.core.LocalizationManager; import de.hhu.ba.yoshikoWrapper.core.YoshikoLoader; /**This class describes the Swing Panel that the user interacts with in cytoscape @@ -87,11 +89,20 @@ public class MainPanel extends ComfortPanel implements CytoPanelComponent { ecPanel.getPermanentColumn(), ecPanel.getForbiddenColumn(), ecPanel.getDefaultInsertionCost(), - ecPanel.getDefaultDeletionCost() + ecPanel.getDefaultDeletionCost(), + solutionsPanel ); CyCore.dialogTaskManager.execute(new TaskIterator(1,yoshiko)); solutionsPanel.setVisible(true); } + else { + JOptionPane.showMessageDialog( + null, + LocalizationManager.get("noLibTitle"), + LocalizationManager.get("noLibMessage"), + JOptionPane.ERROR_MESSAGE + ); + } } }); diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanelAction.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanelAction.java deleted file mode 100644 index 34b8cb7..0000000 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanelAction.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.hhu.ba.yoshikoWrapper.gui; - -import java.awt.event.ActionEvent; - -import org.cytoscape.application.swing.AbstractCyAction; -import org.cytoscape.application.swing.CySwingApplication; -//import org.cytoscape.application.swing.CytoPanel; -//import org.cytoscape.application.swing.CytoPanelName; - -public class MainPanelAction extends AbstractCyAction { - - /** - * - */ - private static final long serialVersionUID = -4710814976875737575L; - - //private CySwingApplication desktopApp; - //private final CytoPanel cytoPanelWest; - //private MainPanel mainPanel; - - /**Main constructor, generates a new CyAction handling the main panel - * @param desktopApp - * @param mainPanel - */ - public MainPanelAction( - CySwingApplication desktopApp, - MainPanel mainPanel - ){ - - super("Control Panel"); - - setPreferredMenu("Apps.Clustering"); - - //this.desktopApp = desktopApp; - - //this.cytoPanelWest = this.desktopApp.getCytoPanel(CytoPanelName.WEST); - //this.mainPanel = mainPanel; - } - - @Override - public void actionPerformed(ActionEvent e) { - // TODO Auto-generated method stub - - } - -} diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionTab.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionTab.java new file mode 100644 index 0000000..2a41d72 --- /dev/null +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionTab.java @@ -0,0 +1,7 @@ +package de.hhu.ba.yoshikoWrapper.gui; + + +@SuppressWarnings("serial") +public class SolutionTab extends ComfortPanel { + +} diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionsPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionsPanel.java index 588c66f..425ed42 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionsPanel.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionsPanel.java @@ -3,6 +3,7 @@ package de.hhu.ba.yoshikoWrapper.gui; import java.awt.Component; import javax.swing.Icon; +import javax.swing.JTabbedPane; import org.cytoscape.application.swing.CytoPanelComponent; import org.cytoscape.application.swing.CytoPanelName; @@ -11,7 +12,29 @@ import de.hhu.ba.yoshikoWrapper.core.LocalizationManager; @SuppressWarnings("serial")//Will never be serialized public class SolutionsPanel extends ComfortPanel implements CytoPanelComponent{ + + private JTabbedPane solutionTabs; + + public SolutionsPanel() { + solutionTabs = new JTabbedPane(); + this.add(solutionTabs); + } + public void generateSolTabs(long numberOfSolutions) { + for (long i=0;i<numberOfSolutions;i++) { + solutionTabs.add( + LocalizationManager.get("solution")+" "+(i+1), + new SolutionTab() + ); + } + } + /** + * Helper pseudo-destructor as the object itself can't be reassigned due to Cytoscapes registry + */ + public void erase() { + this.removeAll(); + } + @Override public Component getComponent() { return this; @@ -24,7 +47,7 @@ public class SolutionsPanel extends ComfortPanel implements CytoPanelComponent{ @Override public String getTitle() { - return LocalizationManager.yoshikoStrings().getString("resultsPanelTitle"); + return LocalizationManager.get("resultsPanelTitle"); } @Override diff --git a/src/main/resources/YoshikoStrings.properties b/src/main/resources/YoshikoStrings.properties index b919c85..44fedf8 100644 --- a/src/main/resources/YoshikoStrings.properties +++ b/src/main/resources/YoshikoStrings.properties @@ -1,4 +1,8 @@ resultsPanelTitle = Yoshiko Results yoshVersion = Yoshiko Version resolveLibPath = Resolve Yoshiko Library Path -yoshTask = Performing Yoshiko Algorithm \ No newline at end of file +yoshTask = Performing Yoshiko Algorithm +solution = Solution +restartNeeded = Changes only take effect after restart! +noLibTitle = Library not loaded! +noLibMessage = There is no Yoshiko Library currently loaded! You might have to specify its location. \ No newline at end of file diff --git a/src/main/resources/yoshiko b/src/main/resources/yoshiko index bcecbad..a04dd9a 100644 --- a/src/main/resources/yoshiko +++ b/src/main/resources/yoshiko @@ -1 +1,2 @@ -yoshiko.pathToYoshiko = "NO PATH SET" \ No newline at end of file +yoshiko.pathToYoshiko = null +yoshiko.locale = "enUS" \ No newline at end of file -- GitLab