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.