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