JFrameContextView.java
- package org.jbehave.core.context;
- import static java.text.MessageFormat.format;
- import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
- import java.awt.BorderLayout;
- import java.awt.Point;
- import java.awt.event.MouseEvent;
- import java.util.concurrent.TimeUnit;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.border.EmptyBorder;
- import javax.swing.event.MouseInputAdapter;
- @SuppressWarnings("checkstyle:MemberName")
- public class JFrameContextView implements ContextView {
- protected JFrame frame;
- protected JLabel label;
- protected int width;
- protected int height;
- protected int x;
- protected int y;
- /**
- * Creates view frame of default size - (380 x 85)
- */
- public JFrameContextView() {
- sized(380, 85);
- located(0, 0); // origin by default
- }
- /**
- * Builder-style way to set the preferred size for the frame
- *
- * @param width the width
- * @param height height
- * @return The JFrameContextView
- */
- public JFrameContextView sized(final int width, final int height) {
- this.width = width;
- this.height = height;
- return this;
- }
- /**
- * Builder-style way to set the preferred location for the frame
- *
- * @param x the x position on screen
- * @param y the y position on screen
- * @return The JFrameContextView
- */
- public JFrameContextView located(final int x, final int y) {
- this.x = x;
- this.y = y;
- return this;
- }
- @Override
- public synchronized void show(String story, String scenario, String step) {
- if (frame == null) {
- initialize();
- }
- label.setText(formatText(story, scenario, step));
- try {
- TimeUnit.MILLISECONDS.sleep(pauseInMillis());
- } catch (InterruptedException e) {
- // continue
- }
- }
- protected String formatText(String story, String scenario, String step) {
- return format(labelTemplate(), (story != null ? escapeHtml4(story) : ""),
- (scenario != null ? escapeHtml4(scenario) : ""), escapeHtml4(step));
- }
- protected String labelTemplate() {
- return "<html><h3>{0}</h3><h4>{1}</h4><p>{2}</p></html>";
- }
- protected long pauseInMillis() {
- return 250;
- }
- @Override
- public synchronized void close() {
- if (frame != null) {
- frame.setVisible(false);
- frame.dispose();
- frame = null;
- label = null;
- }
- }
- protected void initialize() {
- frame = new JFrame();
- label = new JLabel();
- frame.setAlwaysOnTop(true);
- frame.setSize(width, height);
- frame.setLocation(x, y);
- frame.setUndecorated(true);
- JPanel panel = new JPanel();
- frame.setContentPane(panel);
- panel.setLayout(new BorderLayout());
- label.setBorder(new EmptyBorder(3, 3, 3, 3));
- panel.add(label, BorderLayout.CENTER);
- MouseInputAdapter mia = new MouseInputAdapter() {
- private Point mousePressedScreenCoords;
- private Point mousePressedCompCoords;
- @Override
- public void mouseReleased(MouseEvent e) {
- mousePressedScreenCoords = null;
- mousePressedCompCoords = null;
- }
- @Override
- public void mousePressed(MouseEvent e) {
- mousePressedScreenCoords = e.getLocationOnScreen();
- mousePressedCompCoords = e.getPoint();
- }
- @Override
- public void mouseDragged(MouseEvent e) {
- Point currCoords = e.getLocationOnScreen();
- x = mousePressedScreenCoords.x
- + (currCoords.x - mousePressedScreenCoords.x)
- - mousePressedCompCoords.x;
- y = mousePressedScreenCoords.y
- + (currCoords.y - mousePressedScreenCoords.y)
- - mousePressedCompCoords.y;
- frame.setLocation(x, y);
- }
- };
- frame.addMouseListener(mia);
- frame.addMouseMotionListener(mia);
- frame.setVisible(true);
- }
- }