diff --git a/src/eva2/client/EvAClient.java b/src/eva2/client/EvAClient.java index ed5e96dd..8590213a 100644 --- a/src/eva2/client/EvAClient.java +++ b/src/eva2/client/EvAClient.java @@ -41,6 +41,8 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JRadioButtonMenuItem; +import javax.swing.JScrollPane; +import javax.swing.JSeparator; import javax.swing.JWindow; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; @@ -78,7 +80,8 @@ import eva2.tools.jproxy.RemoteStateListener; * */ public class EvAClient implements RemoteStateListener, Serializable { - final int splashScreenTime = 1500; + private final int splashScreenTime = 1500; + private final int maxWindowMenuLength = 30; private static Properties EVA_PROPERTIES; public static boolean TRACE = false; @@ -303,7 +306,7 @@ public class EvAClient implements RemoteStateListener, Serializable { } if (withGUI ) { - m_Frame = new JEFrame(); + m_Frame = new JEFrame(EvAInfo.productName + " workbench"); BasicResourceLoader loader = BasicResourceLoader.instance(); byte[] bytes = loader.getBytesFromResourceLocation(EvAInfo.iconLocation); try { @@ -311,7 +314,7 @@ public class EvAClient implements RemoteStateListener, Serializable { } catch (java.lang.NullPointerException e) { System.out.println("Could not find EvA2 icon, please move resources folder to working directory!"); } - m_Frame.setTitle(EvAInfo.productName + " workbench"); +// m_Frame.setTitle(EvAInfo.productName + " workbench"); try { Thread.sleep(200); @@ -583,22 +586,47 @@ public class EvAClient implements RemoteStateListener, Serializable { m_mnuWindow = new JExtMenu("&Window"); m_mnuWindow.addMenuListener(new MenuListener() { public void menuSelected(MenuEvent e) { -// System.out.println("Selected"); + // System.out.println("Selected"); m_mnuWindow.removeAll(); + JExtMenu curMenu = m_mnuWindow; +// JScrollPane jsp = new JScrollPane(); Object[] framelist = JEFrameRegister.getFrameList(); for (int i = 0; i < framelist.length; i++) { JMenuItem act = new JMenuItem((i + 1) + ". " + ((JEFrame) framelist[i]).getTitle()); final JFrame x = ((JEFrame) framelist[i]); + act.addActionListener((new ActionListener() { public void actionPerformed(ActionEvent e) { - x.setExtendedState(JFrame.NORMAL); - x.toFront(); + if (!x.isActive()) { + x.setExtendedState(JFrame.NORMAL); + x.setVisible(false); + x.setVisible(true); // it seems to be quite a fuss to bring something to the front and actually mean it... + x.toFront(); // this seems useless + x.requestFocus(); // this seems useless too + } } + })); + if (curMenu.getItemCount()>=maxWindowMenuLength) { + JExtMenu subMenu = new JExtMenu("&More..."); + curMenu.add(new JSeparator()); + curMenu.add(subMenu); + curMenu=subMenu; } - ) - ); + curMenu.add(act); + } + String[] commonPrefixes = JEFrameRegister.getCommonPrefixes(10); + if (commonPrefixes.length > 0) m_mnuWindow.add(new JSeparator()); + for (int i=0; i JEFrameList; - private static ArrayList JEFrameList; + static { + JEFrameList = new ArrayList(); + } - static { + public static void register(JEFrame jf) { + if (!JEFrameList.contains(jf)) JEFrameList.add(jf); +// System.out.println("reg " + jf.getTitle() + "/" + (jf.hashCode()) + ", list size: " + JEFrameList.size()); + } - JEFrameList = new ArrayList(); - } + public static void unregister(JEFrame jf) { + JEFrameList.remove(jf); // Plot windows produce double closing events, so ignore it +// if (!JEFrameList.remove(jf)) System.err.println("Warning: tried to unregister frame " + jf.getTitle() + " which was not registered! (JEFrameRegister)"); +// System.out.println("unreg " + jf.getTitle() + "/" + jf.hashCode() + ", list size:" + JEFrameList.size()); + } - public static void register(JEFrame jf) { - JEFrameList.add(jf); -// System.out.println("reg ! JEFSIZE :" + JEFrameList.size()); - } + public static Object[] getFrameList() { + return JEFrameList.toArray(); + } - public static void unregister(JEFrame jf) { - JEFrameList.remove(jf); -// System.out.println("unreg! JEFSIZE :" + JEFrameList.size()); - } - - public static Object[] getFrameList() { - return JEFrameList.toArray(); - } - - public static void setFocusToNext(JEFrame jf) { - int idx = JEFrameList.indexOf(jf); - idx = (idx + 1) % JEFrameList.size(); - JEFrame toset = ((JEFrame) JEFrameList.get(idx)); - toset.setExtendedState(JEFrame.NORMAL); - toset.toFront(); - } + public static void setFocusToNext(JEFrame jf) { + int idx = JEFrameList.indexOf(jf); + idx = (idx + 1) % JEFrameList.size(); + JEFrame toset = ((JEFrame) JEFrameList.get(idx)); + toset.setExtendedState(JEFrame.NORMAL); + toset.toFront(); + } + /** + * Return all prefixes which occur at least twice in the registered frame list. + * @param prefLen + * @return + */ + public static String[] getCommonPrefixes(int prefLen) { + ArrayList prefixes = new ArrayList(); + ArrayList count = new ArrayList(); + for (int i=0; i=0; i--) { + if (count.get(i)<=1) { + prefixes.remove(i); + count.remove(i); + } + } + return prefixes.toArray(new String[prefixes.size()]); + } + public static void closeAllByPrefix(String prefix) { + for (int i=0; i max) max = tmp; + if (problem instanceof InterfaceFirstOrderDerivableProblem) { + double[] deriv = ((InterfaceFirstOrderDerivableProblem)problem).getFirstOrderGradients(pos); + for (int i=0; i<2;i++) maxDeriv=Math.max(maxDeriv, Math.abs(deriv[i])); // maximum deriv of first 2 dims + } } // for y } // for x fitRange = java.lang.Math.abs(max - min); @@ -89,18 +104,31 @@ public class TopoPlot extends Plot { m_Frame.setVisible(false); for (int x=0; x