package cz.cuni.lf1.lge.ThunderSTORM.rendering.ui;
import cz.cuni.lf1.lge.ThunderSTORM.UI.LutPicker;
import cz.cuni.lf1.lge.ThunderSTORM.rendering.IncrementalRenderingMethod;
import cz.cuni.lf1.lge.ThunderSTORM.util.GridBagHelper;
import cz.cuni.lf1.lge.ThunderSTORM.util.Range;
import cz.cuni.lf1.lge.ThunderSTORM.util.MacroUI.ParameterKey;
import cz.cuni.lf1.lge.ThunderSTORM.util.MacroUI.ParameterTracker;
import cz.cuni.lf1.lge.ThunderSTORM.util.MacroUI.validators.DoubleValidatorFactory;
import cz.cuni.lf1.lge.ThunderSTORM.util.MacroUI.validators.IntegerValidatorFactory;
import cz.cuni.lf1.lge.ThunderSTORM.util.MacroUI.validators.Validator;
import cz.cuni.lf1.lge.ThunderSTORM.util.MacroUI.validators.ValidatorException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public abstract class AbstractRenderingUI extends IRendererUI {
double sizeX, sizeY, left, top;
JTextField zRangeTextField;
JCheckBox threeDCheckBox;
LutPicker lutPicker;
//parameters
public ParameterKey.Double magnification;
public ParameterKey.Integer repaintFrequency;
public ParameterKey.Boolean threeD;
public ParameterKey.Boolean colorize;
public ParameterKey.String colorizationLut;
public ParameterKey.String zRange;
public ParameterTracker.Condition threeDCondition = new ParameterTracker.Condition() {
@Override
public boolean isSatisfied() {
return threeD.getValue();
}
@Override
public ParameterKey[] dependsOn() {
return new ParameterKey[]{threeD};
}
};
public ParameterTracker.Condition colorizeCondition = new ParameterTracker.Condition() {
@Override
public boolean isSatisfied() {
return colorize.getValue();
}
@Override
public ParameterKey[] dependsOn() {
return new ParameterKey[]{colorize};
}
};
protected boolean showRepaintFrequency = true;
public AbstractRenderingUI() {
lutPicker = new LutPicker();
magnification = parameters.createDoubleField("magnification", DoubleValidatorFactory.positiveNonZero(), 5);
repaintFrequency = parameters.createIntField("repaint", IntegerValidatorFactory.positive(), 50, new ParameterTracker.Condition() {
@Override
public boolean isSatisfied() {
return showRepaintFrequency;
}
@Override
public ParameterKey[] dependsOn() {
return null;
}
});
threeD = parameters.createBooleanField("threeD", null, false);
colorize = parameters.createBooleanField("colorize", null, false);
zRange = parameters.createStringField("zrange", new Validator<String>() {
@Override
public void validate(String input) throws ValidatorException {
try {
Range r = Range.parseFromStepTo(input);
int nSlices = (int) ((r.to - r.from) / r.step);
if (r.from > r.to) {
throw new RuntimeException("Z range \"from\" value (" + r.from + ") must be smaller than \"to\" value (" + r.to + ").");
}
if (nSlices < 1) {
throw new RuntimeException("Invalid range: Must have at least one slice.");
}
} catch (RuntimeException ex) {
throw new ValidatorException(ex);
}
}
}, "-500:100:500", threeDCondition);
colorizationLut = parameters.createStringField("pickedlut", new Validator<String>() {
@Override
public void validate(String input) throws ValidatorException {
if (input != null) { // if null, the default hardwired LUT will be used
if (!lutPicker.lutExists(input)) {
throw new ValidatorException("LUT \"" + input + "\" does not exist!");
}
}
}
}, "intensity", colorizeCondition);
}
public AbstractRenderingUI(double sizeX, double sizeY) {
this();
this.left = 0;
this.top = 0;
this.sizeX = sizeX;
this.sizeY = sizeY;
}
@Override
public void setSize(double sizeX, double sizeY) {
setSize(0, 0, sizeX, sizeY);
}
@Override
public void setSize(double left, double top, double sizeX, double sizeY) {
this.left = left;
this.top = top;
this.sizeX = sizeX;
this.sizeY = sizeY;
}
@Override
public void setZRange(double from, double to) {
if (!threeDCheckBox.isEnabled()) return;
Range r = Range.parseFromStepTo(zRangeTextField.getText());
r.from = roundDownTo(from, r.step);
r.to = roundUpTo(to, r.step);
zRangeTextField.setText(r.toStrFromStepTo());
}
@Override
public void set3D(boolean checked) {
threeDCheckBox.setSelected(checked);
}
protected double roundUpTo(double val, double mod) {
return (val + mod - modulo(val, mod));
}
protected double roundDownTo(double val, double mod) {
if (val > 0) {
return (val - modulo(val, mod));
} else {
return (val - mod - modulo(val, mod));
}
}
protected double modulo(double val, double mod) {
double r = (int)(val / mod);
return (val - r*mod);
}
@Override
public int getRepaintFrequency() {
return repaintFrequency.getValue();
}
public void setShowRepaintFrequency(boolean show) {
this.showRepaintFrequency = show;
}
@Override
public JPanel getOptionsPanel() {
JPanel panel = new JPanel(new GridBagLayout());
final JTextField resolutionTextField = new JTextField("", 20);
parameters.registerComponent(magnification, resolutionTextField);
final JTextField repaintFrequencyTextField = new JTextField("", 20);
parameters.registerComponent(repaintFrequency, repaintFrequencyTextField);
panel.add(new JLabel("Magnification:"), GridBagHelper.leftCol());
panel.add(resolutionTextField, GridBagHelper.rightCol());
if(showRepaintFrequency) {
panel.add(new JLabel("Update frequency [frames]:"), GridBagHelper.leftCol());
panel.add(repaintFrequencyTextField, GridBagHelper.rightCol());
}
final JLabel zRangeLabel = new JLabel("Z range (from:step:to) [nm]:");
zRangeTextField = new JTextField("", 20);
parameters.registerComponent(zRange, zRangeTextField);
threeDCheckBox = new JCheckBox("", true);
parameters.registerComponent(threeD, threeDCheckBox);
final JCheckBox colorizeCheckBox = new JCheckBox("", true);
final JLabel colorizeLabel = new JLabel("Colorize Z:");
final JLabel lutPickerLabel = new JLabel("Lookup Table:");
parameters.registerComponent(colorize, colorizeCheckBox);
parameters.registerComponent(colorizationLut, lutPicker);
threeDCheckBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
colorizeLabel.setEnabled(threeDCheckBox.isSelected());
colorizeCheckBox.setEnabled(threeDCheckBox.isSelected());
lutPickerLabel.setEnabled(threeDCheckBox.isSelected());
lutPicker.setEnabled(threeDCheckBox.isSelected());
zRangeLabel.setEnabled(threeDCheckBox.isSelected());
zRangeTextField.setEnabled(threeDCheckBox.isSelected());
}
});
colorizeCheckBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
}
});
panel.add(new JLabel("3D:"), GridBagHelper.leftCol());
panel.add(threeDCheckBox, GridBagHelper.rightCol());
panel.add(colorizeLabel, GridBagHelper.leftCol());
panel.add(colorizeCheckBox, GridBagHelper.rightCol());
panel.add(lutPicker, GridBagHelper.rightCol());
panel.add(lutPickerLabel, GridBagHelper.leftCol());
panel.add(zRangeLabel, GridBagHelper.leftCol());
panel.add(zRangeTextField, GridBagHelper.rightCol());
return panel;
}
@Override
public IncrementalRenderingMethod getImplementation() {
return getMethod();
}
protected abstract IncrementalRenderingMethod getMethod();
}