package org.jivesoftware.spark.otrplug.ui; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Timer; import java.util.TimerTask; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.text.BadLocationException; import javax.swing.text.Style; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; import org.jivesoftware.resource.SparkRes; import org.jivesoftware.spark.otrplug.OTRManager; import org.jivesoftware.spark.otrplug.util.OTRResources; import org.jivesoftware.spark.ui.TranscriptWindow; import org.jivesoftware.spark.ui.rooms.ChatRoomImpl; /** * Shows StyledDocuments in transcript window for info if the session * established successfully or not * * @author Bergunde Holger */ public class OTRConnectionPanel { private ChatRoomImpl _chatRoom; private JLabel _label; private ImageIcon _icon; private JPanel _conPanel; private int _i; private StyledDocument _doc; private TranscriptWindow _transcriptWindow; private JButton _retry; private boolean _succesfull = false; private boolean _waiting = false; public OTRConnectionPanel(ChatRoomImpl chatroom) { _chatRoom = chatroom; _transcriptWindow = _chatRoom.getTranscriptWindow(); _doc = _transcriptWindow.getStyledDocument(); _retry = new JButton(OTRResources.getString("otr.retry")); _retry.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { OTRManager.getInstance().startOtrWithUser(_chatRoom.getParticipantJID()); } }); _retry.setVisible(false); } /** * Indicates that OTR is trying to establish an OTR session. This will * inject a styledDocument. You have 10 seconds to approve that the * connection was successful using method successfullyCon() * */ public void tryToStart() { if (!_succesfull && !_waiting) { renewPanel(); _icon.setImage(SparkRes.getImageIcon(SparkRes.BUSY_IMAGE).getImage()); _conPanel.setVisible(true); _i = 10; _label.setText(OTRResources.getString("otr.try.to.connect.for.seconds", _i)); Timer t = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { if (_i > 0 && !_succesfull) { _waiting = true; _label.setText(OTRResources.getString("otr.try.to.connect.for.seconds", _i)); decI(); } else if (!_succesfull) { _waiting = true; _icon.setImage(SparkRes.getImageIcon(SparkRes.SMALL_DELETE).getImage()); _label.setText(OTRResources.getString("otr.failed.to.establish", _i)); _retry.setVisible(true); this.cancel(); } else { this.cancel(); } } }; t.scheduleAtFixedRate(task, 0, 1000); } } private void renewPanel() { _conPanel = new JPanel(new GridBagLayout()); _label = new JLabel(); _icon = new ImageIcon(); _conPanel.add(new JLabel(_icon), new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); _conPanel.add(_label, new GridBagConstraints(1, 0, 1, 1, 0.7, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); _conPanel.add(_retry, new GridBagConstraints(2, 0, 1, 1, 2.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); _transcriptWindow.addComponent(_conPanel); _chatRoom.scrollToBottom(); } /** * Indicates in the transcript window, that the OTR session has been closed */ public void connectionClosed() { if (_succesfull) { renewPanel(); _succesfull = false; _label.setText(OTRResources.getString("otr.disconnected")); _icon.setImage(SparkRes.getImageIcon(SparkRes.SMALL_STOP).getImage()); _conPanel.setVisible(true); } } private void decI() { --_i; } /** * Should be called after you called tryToStart(). It will indicate that the * session is now encrypted */ public void successfullyCon() { if (!_succesfull) { if (!_waiting) renewPanel(); _retry.setVisible(false); _conPanel.setVisible(true); _succesfull = true; _waiting = false; _icon.setImage(SparkRes.getImageIcon(SparkRes.SMALL_CHECK).getImage()); _label.setText(OTRResources.getString("otr.successfull")); } } }