diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java b/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java index 82ae5ea73b193238f2f624ad9f77aa92a97e65fd..3d3eef8c858847df5d0b167baa8b311c6fa4fb49 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 e910feb81a7cb62139861ed42ab3f9aeb684eedf..f63d9376f95758b45980e4562664091ca393119e 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 47fac47bd1342b3cdda37ab605ca00b4deb44e83..33df2b9b1a52a9aec0d855688644a40f8d2742b6 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 4a65d2efcb2c081fbf2ac9c5d681e3b363db7e1f..fae2f2993e336257a039ddd2c56bed7e2a454134 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 1c9440ef6f3bc00f673ccbf97c7264748bcc9090..fc42a4d842cec4332d78bcb768093ddefbbfcc6f 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 638bdc08ff709841729b8885d5104fc8155d3f51..b017baebfa556c71d07ec91230a68d151094721d 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 d2e666b761d9feab9da282045940e8931c80d895..5b78ee19e147767204a91894c792b2fcc731afb3 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 f3705081dfdfe04c91e7bc4fb9e53d82dd81a14f..ee7d4f5e471dbce3d78b9792a78dc7a032876bef 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 34b8cb7ee60394be31b85a57d384bf5130797674..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..2a41d72e343ca3853b6b64baa6b82b5c8486f250 --- /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 588c66f411caf5b58b56f8ac28b1ede9b9ed2fd8..425ed42249538fe4b641666c3ab6de5a8072e09d 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 b919c85a9d2e7916543055251f88a188ff472d25..44fedf8f0e73de02df992795f85c35a7dd2a3c32 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 bcecbad7d4949ff3f3d0f9c22073dce549f8ba9e..a04dd9a7044a66d3466545b2bfd8fb6ee226902e 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