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 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("\nKanal
\n
\nDies ist die Nummer des Kanals\n"); 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("\nEingang
\n
\nzeigt den digitalen Status der Eingangsmessung\n"); 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("\nPullUp Widerstand
\n
\nZeigt an, ob der PullUp-Widerstand für diesen Kanal eingeschaltet ist.\n"); 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("\nZählerstand
\n
\nZeigt den aktuellen Zählerstand dieses Kanals.\n"); 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("\nAnalog Messwert
\n
\nZeigt die an diesem Kanal gemessene Spannung.\n"); 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("\nAusgang
\n
\nZeigt, ob die Ausgangsschaltung für diesen Kanal aktiv ist.\n"); 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(); 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); } } }