344 lines
10 KiB
Java
344 lines
10 KiB
Java
package org.hwo.pulscounter.ui;
|
|
|
|
import javax.swing.JPanel;
|
|
import javax.swing.JPopupMenu;
|
|
|
|
import java.awt.GridLayout;
|
|
import java.awt.GridBagLayout;
|
|
import javax.swing.JToggleButton;
|
|
import java.awt.GridBagConstraints;
|
|
import javax.swing.ImageIcon;
|
|
import javax.swing.InputVerifier;
|
|
import javax.swing.JButton;
|
|
import javax.swing.JFormattedTextField;
|
|
|
|
import java.awt.Color;
|
|
import java.awt.Dimension;
|
|
import javax.swing.JLabel;
|
|
import javax.swing.JMenuItem;
|
|
|
|
import java.awt.Insets;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.ActionListener;
|
|
import java.text.NumberFormat;
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
|
|
import javax.swing.JTextField;
|
|
import java.awt.Font;
|
|
import javax.swing.border.EmptyBorder;
|
|
import javax.swing.event.DocumentEvent;
|
|
import javax.swing.event.DocumentListener;
|
|
import javax.swing.SwingConstants;
|
|
|
|
public class ChannelDisplay extends JPanel {
|
|
private JTextField tfCounter;
|
|
private JTextField tfAnalog;
|
|
|
|
|
|
private ImageIcon iconEactive = new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_e_aktiv.png"));
|
|
private ImageIcon iconEpassive = new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_e_passiv.png"));
|
|
private ImageIcon iconAactive = new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_a_aktiv.png"));
|
|
private ImageIcon iconApassive = new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_a_passiv.png"));
|
|
private ImageIcon iconPactive = new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_p2_aktiv.png"));
|
|
private ImageIcon iconPpassive = new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_p2_passiv.png"));
|
|
|
|
private boolean input,output,pullup;
|
|
private Integer counter;
|
|
private Double voltage;
|
|
|
|
private boolean isAnalog;
|
|
private JLabel lblP;
|
|
private JLabel lblA;
|
|
private JLabel lblE;
|
|
private JLabel lblChannelName;
|
|
|
|
private String channelName;
|
|
|
|
private JPopupMenu popupMenu;
|
|
private List<ChannelDisplayListener> channelDisplayListeners;
|
|
private JTextField lName;
|
|
|
|
/**
|
|
* Create the panel.
|
|
*/
|
|
public ChannelDisplay() {
|
|
setBackground(Color.GRAY);
|
|
setBorder(new EmptyBorder(4, 4, 4, 4));
|
|
setSize(260, 64);
|
|
setMinimumSize(new Dimension(160,64));
|
|
|
|
GridBagLayout gridBagLayout = new GridBagLayout();
|
|
gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0};
|
|
gridBagLayout.rowHeights = new int[]{0, 0, 0};
|
|
gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE};
|
|
gridBagLayout.rowWeights = new double[]{1.0, 1.0, Double.MIN_VALUE};
|
|
setLayout(gridBagLayout);
|
|
|
|
lblChannelName = new JLabel("XXX");
|
|
lblChannelName.setToolTipText("<html>\n<b>Kanal</b><br/>\n<br/>\nDies ist die Nummer des Kanals\n</html>");
|
|
lblChannelName.setFont(new Font("DejaVu Sans", Font.PLAIN, 20));
|
|
lblChannelName.setSize(new Dimension(48, 24));
|
|
GridBagConstraints gbc_lblChannelName = new GridBagConstraints();
|
|
gbc_lblChannelName.insets = new Insets(0, 0, 5, 5);
|
|
gbc_lblChannelName.gridx = 0;
|
|
gbc_lblChannelName.gridy = 0;
|
|
add(lblChannelName, gbc_lblChannelName);
|
|
|
|
lblE = new JLabel("");
|
|
lblE.setToolTipText("<html>\n<b>Eingang</b><br/>\n<br/>\nzeigt den digitalen Status der Eingangsmessung\n</html>");
|
|
lblE.setMinimumSize(new Dimension(24, 24));
|
|
lblE.setMaximumSize(new Dimension(24, 24));
|
|
lblE.setIcon(new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_e_passiv.png")));
|
|
lblE.setPreferredSize(new Dimension(24, 24));
|
|
GridBagConstraints gbc_lblE = new GridBagConstraints();
|
|
gbc_lblE.insets = new Insets(0, 0, 5, 5);
|
|
gbc_lblE.gridx = 1;
|
|
gbc_lblE.gridy = 0;
|
|
add(lblE, gbc_lblE);
|
|
|
|
lblP = new JLabel("");
|
|
lblP.setToolTipText("<html>\n<b>PullUp Widerstand</b><br/>\n<br/>\nZeigt an, ob der PullUp-Widerstand für diesen Kanal eingeschaltet ist.\n</html>");
|
|
lblP.setMaximumSize(new Dimension(24, 24));
|
|
lblP.setMinimumSize(new Dimension(24, 24));
|
|
lblP.setIcon(new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_p_passiv.png")));
|
|
lblP.setPreferredSize(new Dimension(24, 24));
|
|
GridBagConstraints gbc_lblP = new GridBagConstraints();
|
|
gbc_lblP.insets = new Insets(0, 0, 5, 5);
|
|
gbc_lblP.anchor = GridBagConstraints.EAST;
|
|
gbc_lblP.gridx = 2;
|
|
gbc_lblP.gridy = 0;
|
|
add(lblP, gbc_lblP);
|
|
|
|
tfCounter = new JTextField();
|
|
tfCounter.setToolTipText("<html>\n<b>Zählerstand</b><br/>\n<br/>\nZeigt den aktuellen Zählerstand dieses Kanals.\n</html>");
|
|
tfCounter.setEditable(false);
|
|
tfCounter.setHorizontalAlignment(SwingConstants.RIGHT);
|
|
tfCounter.setMinimumSize(new Dimension(100, 19));
|
|
tfCounter.setFont(new Font("DejaVu Sans", Font.PLAIN, 12));
|
|
tfCounter.setInheritsPopupMenu(true);
|
|
GridBagConstraints gbc_tfCounter = new GridBagConstraints();
|
|
gbc_tfCounter.insets = new Insets(0, 0, 5, 0);
|
|
gbc_tfCounter.fill = GridBagConstraints.HORIZONTAL;
|
|
gbc_tfCounter.gridx = 3;
|
|
gbc_tfCounter.gridy = 0;
|
|
add(tfCounter, gbc_tfCounter);
|
|
tfCounter.setColumns(10);
|
|
|
|
tfAnalog = new JTextField();
|
|
tfAnalog.setToolTipText("<html>\n<b>Analog Messwert</b><br/>\n<br/>\nZeigt die an diesem Kanal gemessene Spannung.\n</html>");
|
|
tfAnalog.setEditable(false);
|
|
tfAnalog.setHorizontalAlignment(SwingConstants.RIGHT);
|
|
tfAnalog.setInheritsPopupMenu(true);
|
|
GridBagConstraints gbc_tfAnalog = new GridBagConstraints();
|
|
gbc_tfAnalog.gridwidth = 2;
|
|
gbc_tfAnalog.insets = new Insets(0, 0, 0, 5);
|
|
gbc_tfAnalog.fill = GridBagConstraints.HORIZONTAL;
|
|
gbc_tfAnalog.gridx = 0;
|
|
gbc_tfAnalog.gridy = 1;
|
|
add(tfAnalog, gbc_tfAnalog);
|
|
tfAnalog.setColumns(10);
|
|
|
|
lblA = new JLabel("");
|
|
lblA.setToolTipText("<html>\n<b>Ausgang</b><br/>\n<br/>\nZeigt, ob die Ausgangsschaltung für diesen Kanal aktiv ist.\n</html>");
|
|
lblA.setIcon(new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_a_passiv.png")));
|
|
lblA.setPreferredSize(new Dimension(24, 24));
|
|
GridBagConstraints gbc_lblA = new GridBagConstraints();
|
|
gbc_lblA.insets = new Insets(0, 0, 0, 5);
|
|
gbc_lblA.gridx = 2;
|
|
gbc_lblA.gridy = 1;
|
|
add(lblA, gbc_lblA);
|
|
|
|
lName = new JTextField();
|
|
lName.setEditable(false);
|
|
lName.setInheritsPopupMenu(true);
|
|
GridBagConstraints gbc_lName = new GridBagConstraints();
|
|
gbc_lName.fill = GridBagConstraints.HORIZONTAL;
|
|
gbc_lName.gridx = 3;
|
|
gbc_lName.gridy = 1;
|
|
add(lName, gbc_lName);
|
|
|
|
this.initialize();
|
|
}
|
|
|
|
private void initialize(){
|
|
|
|
channelDisplayListeners = new LinkedList<ChannelDisplayListener>();
|
|
|
|
popupMenu = new JPopupMenu("");
|
|
setComponentPopupMenu(popupMenu);
|
|
|
|
JMenuItem mi = new JMenuItem("Zurücksetzen");
|
|
mi.addActionListener(new ActionListener() {
|
|
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
fireChannelDisplayReset();
|
|
}
|
|
});
|
|
popupMenu.add(mi);
|
|
popupMenu.addSeparator();
|
|
|
|
JLabel l = new JLabel("Setzen:");
|
|
popupMenu.add(l);
|
|
|
|
final JFormattedTextField tf = new JFormattedTextField(NumberFormat.getIntegerInstance());
|
|
tf.setText("0");
|
|
tf.addActionListener(new ActionListener() {
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
fireChannelDisplaySet(((Long)tf.getValue()).intValue());
|
|
popupMenu.setVisible(false);
|
|
}
|
|
});
|
|
|
|
popupMenu.add(tf);
|
|
|
|
popupMenu.addSeparator();
|
|
|
|
JLabel l2 = new JLabel("Beschreibung:");
|
|
popupMenu.add(l2);
|
|
|
|
final JTextField tf2 = new JTextField();
|
|
tf2.addActionListener(new ActionListener() {
|
|
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
setDescriptionText(tf2.getText());
|
|
fireChannelDisplayDescriptionSet(tf2.getText());
|
|
popupMenu.setVisible(false);
|
|
}
|
|
});
|
|
popupMenu.add( tf2 );
|
|
|
|
}
|
|
|
|
@Override
|
|
public void setToolTipText(String text) {
|
|
super.setToolTipText(text);
|
|
}
|
|
|
|
public void addChannelDisplayListener(ChannelDisplayListener listener){
|
|
channelDisplayListeners.add(listener);
|
|
}
|
|
public void removeChannelDisplayListener(ChannelDisplayListener listener){
|
|
channelDisplayListeners.remove(listener);
|
|
}
|
|
|
|
private void fireChannelDisplayReset(){
|
|
for (ChannelDisplayListener l:channelDisplayListeners){
|
|
l.reset(this);
|
|
}
|
|
}
|
|
private void fireChannelDisplaySet(int setValue){
|
|
for (ChannelDisplayListener l:channelDisplayListeners){
|
|
l.set(this, setValue);
|
|
}
|
|
}
|
|
private void fireChannelDisplayDescriptionSet(String desc){
|
|
for (ChannelDisplayListener l:channelDisplayListeners){
|
|
l.setDescriptionText(this, desc);
|
|
}
|
|
}
|
|
|
|
public void setAnalog(boolean isAnalog) {
|
|
this.isAnalog = isAnalog;
|
|
tfAnalog.setVisible(isAnalog);
|
|
}
|
|
public boolean isAnalog() {
|
|
return isAnalog;
|
|
}
|
|
|
|
public void setPullup(boolean pullup) {
|
|
this.pullup = pullup;
|
|
if (pullup){
|
|
lblP.setIcon(iconPactive);
|
|
} else {
|
|
lblP.setIcon(iconPpassive);
|
|
}
|
|
}
|
|
public boolean isPullup() {
|
|
return pullup;
|
|
}
|
|
|
|
public void setInput(boolean input) {
|
|
this.input = input;
|
|
if (input){
|
|
lblE.setIcon(iconEactive);
|
|
} else {
|
|
lblE.setIcon(iconEpassive);
|
|
}
|
|
}
|
|
public boolean isInput() {
|
|
return input;
|
|
}
|
|
|
|
public void setOutput(boolean output) {
|
|
this.output = output;
|
|
if (output){
|
|
lblA.setIcon(iconAactive);
|
|
} else {
|
|
lblA.setIcon(iconApassive);
|
|
}
|
|
}
|
|
public boolean isOutput() {
|
|
return output;
|
|
}
|
|
|
|
public Integer getCounter() {
|
|
return counter;
|
|
}
|
|
public void setCounter(Integer counter) {
|
|
this.counter = counter;
|
|
if (counter != null){
|
|
tfCounter.setText(String.format("%d", counter));
|
|
tfCounter.setEnabled(true);
|
|
} else {
|
|
tfCounter.setEnabled(false);
|
|
tfCounter.setText("");
|
|
}
|
|
}
|
|
|
|
public Double getVoltage() {
|
|
return voltage;
|
|
}
|
|
public void setVoltage(Double voltage) {
|
|
this.voltage = voltage;
|
|
if (voltage != null){
|
|
tfAnalog.setText(String.format("%.02f V",voltage));
|
|
tfAnalog.setEnabled(true);
|
|
} else {
|
|
tfAnalog.setEnabled(false);
|
|
tfAnalog.setText("");
|
|
}
|
|
}
|
|
|
|
public void setChannelName(String channelName) {
|
|
this.channelName = channelName;
|
|
lblChannelName.setText(channelName);
|
|
}
|
|
public String getChannelName() {
|
|
return channelName;
|
|
}
|
|
|
|
public void setDescriptionText(String desc){
|
|
lName.setText(desc);
|
|
}
|
|
public String getDescriptionText(){
|
|
return lName.getText();
|
|
}
|
|
|
|
@Override
|
|
public void setEnabled(boolean enabled) {
|
|
if (enabled){
|
|
} else {
|
|
setVoltage(null);
|
|
setCounter(null);
|
|
setOutput(false);
|
|
setInput(false);
|
|
setPullup(false);
|
|
}
|
|
}
|
|
|
|
}
|