org.hwo.pulscounter/src/org/hwo/pulscounter/ui/SimpleScriptAddressEditor.java

154 lines
3.7 KiB
Java

package org.hwo.pulscounter.ui;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import javax.swing.JComboBox;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import org.hwo.pulscounter.simplescript.SimpleScriptAddress;
import org.hwo.ui.JComboBoxEx;
public class SimpleScriptAddressEditor extends JPanel {
AddressRange[] addressRanges = new AddressRange[]{
new AddressRange("Zähler", 0, 32),
new AddressRange("Analogspannung", 32, 8),
new AddressRange("Merker", 40, 24),
new AddressRange("PullUp Status", 64, 32),
new AddressRange("Ausgang", 96, 32),
new AddressRange("Inverter", 128, 32),
new AddressRange("Eingang", 160, 32),
new AddressRange("Variable", 192, 64)
};
private JComboBoxEx cbRange;
private JSpinner spValue;
private SpinnerNumberModel numberModel = new SpinnerNumberModel(0, 0, 0, 1);
private int
address;
/**
* Create the panel.
*/
public SimpleScriptAddressEditor() {
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[]{0, 0, 0};
gridBagLayout.rowHeights = new int[]{0, 0};
gridBagLayout.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE};
gridBagLayout.rowWeights = new double[]{1.0, Double.MIN_VALUE};
setLayout(gridBagLayout);
cbRange = new JComboBoxEx();
GridBagConstraints gbc_cbRange = new GridBagConstraints();
gbc_cbRange.insets = new Insets(0, 0, 0, 5);
gbc_cbRange.fill = GridBagConstraints.BOTH;
gbc_cbRange.gridx = 0;
gbc_cbRange.gridy = 0;
cbRange.setItems(addressRanges);
cbRange.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
syncNumberFormat();
}
});
add(cbRange, gbc_cbRange);
spValue = new JSpinner();
GridBagConstraints gbc_spValue = new GridBagConstraints();
gbc_spValue.fill = GridBagConstraints.BOTH;
gbc_spValue.gridx = 1;
gbc_spValue.gridy = 0;
spValue.setModel(numberModel);
add(spValue, gbc_spValue);
cbRange.setSelectedIndex(0);
}
private AddressRange getSelectedRange(){
return (AddressRange)cbRange.getSelectedItem();
}
private int getSelectedDisplayValue(){
return (Integer)spValue.getValue();
}
private void syncNumberFormat(){
AddressRange range = getSelectedRange();
numberModel.setMaximum(range.getSize()-1);
if (range.getSize() <= getSelectedDisplayValue()){
numberModel.setValue(range.getSize()-1);
}
}
public int getAddress() {
this.address = getSelectedRange().scriptValue(((Integer)numberModel.getValue()).intValue());
return address;
}
public void setAddress(int address) {
this.address = address;
cbRange.setEnabled(true);
cbRange.setSelectedItem(findRange(address));
syncNumberFormat();
numberModel.setValue(getSelectedRange().displayValue(address));
}
private AddressRange findRange(int address){
for (AddressRange range: addressRanges){
if (range.contains(address))
return range;
}
return null;
}
private class AddressRange{
private String name;
private int base;
private int size;
public AddressRange(String name,int base,int size){
this.name = name;
this.size = size;
this.base = base;
}
public int getBase() {
return base;
}
public int getSize() {
return size;
}
public String getName() {
return name;
}
public boolean contains(int address){
return (base <= address) && (address < (base+size));
}
public int displayValue(int address){
return address - base;
}
public int scriptValue(int displayAddress){
return displayAddress + base;
}
@Override
public String toString() {
return name;
}
}
}