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

347 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) {
if (!tf2.getText().startsWith("!\"§$%")){
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);
}
}
}