diff --git a/src/main/java/ch/psi/mxsc/MainPanel.form b/src/main/java/ch/psi/mxsc/MainPanel.form index 5bfe075..e1bfb8a 100644 --- a/src/main/java/ch/psi/mxsc/MainPanel.form +++ b/src/main/java/ch/psi/mxsc/MainPanel.form @@ -31,7 +31,7 @@ - + @@ -346,9 +346,9 @@ - + - + @@ -384,12 +384,12 @@ - + - + @@ -896,7 +896,7 @@ - + @@ -1004,9 +1004,9 @@ - + - + @@ -1016,7 +1016,7 @@ - + diff --git a/src/main/java/ch/psi/mxsc/MainPanel.java b/src/main/java/ch/psi/mxsc/MainPanel.java index 0ad308a..06381ba 100644 --- a/src/main/java/ch/psi/mxsc/MainPanel.java +++ b/src/main/java/ch/psi/mxsc/MainPanel.java @@ -4,6 +4,7 @@ package ch.psi.mxsc; import ch.psi.mxsc.BasePlatePanel.SelectionMode; +import ch.psi.pshell.core.Context; import ch.psi.pshell.core.Plugin; import ch.psi.pshell.device.Device; import ch.psi.pshell.device.DeviceAdapter; @@ -11,11 +12,16 @@ import ch.psi.pshell.imaging.Renderer; import ch.psi.pshell.imaging.RendererMode; import ch.psi.pshell.imaging.Source; import ch.psi.pshell.scripting.ViewPreference; +import ch.psi.pshell.swing.ScriptEditor; import ch.psi.pshell.ui.App; import ch.psi.pshell.ui.Panel; import ch.psi.pshell.ui.StatusBar; import ch.psi.utils.Chrono; import ch.psi.utils.State; +import ch.psi.utils.swing.Document; +import ch.psi.utils.swing.DocumentListener; +import ch.psi.utils.swing.Editor; +import ch.psi.utils.swing.JsonTableEditor; import ch.psi.utils.swing.SwingUtils; import java.awt.BorderLayout; import java.awt.Color; @@ -25,14 +31,21 @@ import java.awt.Dimension; import java.awt.GridBagLayout; import java.awt.Image; import java.awt.Window; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.logging.Level; +import java.util.logging.Logger; +import javax.script.ScriptException; import javax.swing.GroupLayout; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; @@ -151,6 +164,9 @@ public class MainPanel extends Panel { }); } + JMenuItem menuEditSamples; + JsonTableEditor samplesInfoEditor; + @Override protected void onLoaded() { if (App.isDetached()) { @@ -164,7 +180,26 @@ public class MainPanel extends Panel { statusBar = (StatusBar) SwingUtils.getComponentsByType(getTopLevel(), StatusBar.class)[0]; } catch (Exception ex){ } + + if (getView() != null) { + JMenuBar menu = getView().getMenu(); + JMenu menuFile = (JMenu) SwingUtils.getComponentByName(menu, "menuFile"); + menuEditSamples = new JMenuItem("Edit Samples Info"); + menuFile.insert(menuEditSamples,0); + menuEditSamples.addActionListener((e) -> { + samplesInfoEditor = openSamplesInfo(); + }); + } } + + @Override + protected void onUnloaded() { + if (getView() != null) { + JMenuBar menu = getView().getMenu(); + JMenu menuFile = (JMenu) SwingUtils.getComponentByName(menu, "menuFile"); + menuFile.remove(menuEditSamples); + } + } @Override public void onInitialize(int runCount) { @@ -676,6 +711,73 @@ public class MainPanel extends Panel { expertWindows.clear(); } } + + JsonTableEditor openSamplesInfo(){ + try{ + String file = getContext().getSetup().expandPath("{context}/samples_info.json"); + for (Editor ed : getView().getEditors()) { + if (ed instanceof JsonTableEditor) { + if (file.equals(ed.getFileName())){ + if (ed.changedOnDisk()){ + getView().closeFile(file); + } else { + getView().selectPanel(ed); + return (JsonTableEditor) ed; + } + } + } + } + String[] columns = new String[]{ "userName", "dewarName", + "puckName", "puckType", "puckBarcode", "puckAddress", + "sampleName", "samplePosition", "sampleBarcode", "sampleStatus", "sampleMountCount" + }; + Class[] types = null; + + + JsonTableEditor editor = new JsonTableEditor(columns, types); + editor.getDocument().addListener(new DocumentListener() { + @Override + public void onDocumentChanged(Document doc) { + updateSamplesInfoTitle(); + } + + @Override + public void onDocumentSaved(Document doc) { + try { + eval("restore_samples_info()", true); + } catch (Exception ex) { + showException(ex); + } + } + }); + getView().openComponent(new File(file).getName(), editor); + editor.load(file); + return editor; + } catch (Exception ex) { + showException(ex); + return null; + } + } + + void updateSamplesInfoTitle() { + try { + + if ((samplesInfoEditor!=null) &&(samplesInfoEditor.isDisplayable())){ + String title = new File(samplesInfoEditor.getFileName()).getName()+ (samplesInfoEditor.hasChanged() ? "*" : ""); + int index = getView().getDocumentsTab().indexOfComponent(samplesInfoEditor); + if (index>=0){ + if (!title.equals(getView().getDocumentsTab().getTitleAt(index))) { + getView().getDocumentsTab().setTitleAt(index, title); + SwingUtils.CloseButtonTabComponent tabComponent = (SwingUtils.CloseButtonTabComponent) getView().getDocumentsTab().getTabComponentAt(index); + tabComponent.updateUI(); + } + } + } + } catch (Exception ex) { + logger.log(Level.WARNING, null, ex); + } + } + /** * This method is called from within the constructor to initialize the form.