org.sikuli.guide.TransitionDialog Maven / Gradle / Ivy
/*
* Copyright (c) 2010-2016, Sikuli.org, sikulix.com
* Released under the MIT License.
*
*/
package org.sikuli.guide;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import org.sikuli.util.OverlayTransparentWindow;
public class TransitionDialog extends OverlayTransparentWindow implements Transition{
// the location user moved to by dragging
static Point userPreferredLocation = null;
Box buttons;
JLabel titleBar;
Button defaultButton;
TextPane textPane;
String command = null;
boolean isLocationSet = false;
protected void dismiss(){
setVisible(false);
dispose();
synchronized(this){
this.notify();
}
}
public void setTitle(String title){
titleBar.setText(title);
titleBar.setVisible(true);
}
public String getActionCommand(){
return command;
}
public TransitionDialog(){
init("");
}
public TransitionDialog(String text){
init(text);
}
public void setLocationToUserPreferredLocation(){
if (userPreferredLocation != null)
setLocation(userPreferredLocation);
else
setLocationRelativeTo(null);
}
public void setTimeout(int timeout){
Timer timer = new Timer(timeout, new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
command = null;
dismiss();
}
});
timer.setRepeats(false);
timer.start();
}
void init(String text){
setBackground(Color.yellow);
setForeground(Color.black);
JPanel content = new JPanel();
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
add(content);
textPane = new TextPane();
textPane.setText(text);
textPane.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5));
Color darkyellow = new Color(238,185,57);
titleBar = new JLabel();
titleBar.setFont(new Font("sansserif", Font.BOLD, 14));
titleBar.setBackground(darkyellow);
titleBar.setOpaque(true);
titleBar.setBorder(BorderFactory.createEmptyBorder(5, 5, 3, 5));
titleBar.setSize(titleBar.getPreferredSize());
titleBar.setVisible(false);
buttons = new Box(BoxLayout.X_AXIS);
defaultButton = new Button("Close");
buttons.add(defaultButton);
buttons.setBorder(BorderFactory.createEmptyBorder(15,5,5,5));
content.add(titleBar);
content.add(textPane);
content.add(buttons);
// this allows the title bar to take the whole width of the dialog box
titleBar.setMaximumSize(new Dimension(Integer.MAX_VALUE,Integer.MAX_VALUE));
buttons.setMaximumSize(new Dimension(Integer.MAX_VALUE,Integer.MAX_VALUE));
textPane.setMaximumSize(new Dimension(Integer.MAX_VALUE,Integer.MAX_VALUE));
// these allow all the parts to left aligned
titleBar.setAlignmentX(Component.LEFT_ALIGNMENT);
textPane.setAlignmentX(Component.LEFT_ALIGNMENT);
buttons.setAlignmentX(Component.LEFT_ALIGNMENT);
// these are meant to prevent the message box from stealing
// focus when it's clicked, but they don't seem to work
// setFocusableWindowState(false);
// setFocusable(false);
// this allows the window to be dragged to another location on the screen
ComponentMover cm = new ComponentMover();
cm.registerComponent(this);
pack();
}
public String waitForTransition(TransitionListener token){
// must be set visible
setVisible(true);
// before being brought to the front
toFront();
setAlwaysOnTop(true);
Point startLocation = getLocation();
//Debug.info("init location:" + getLocation());
// pack needs to be called after the component is set visible
pack();
// these do not seem necessary any more
// force the dialog to paint right away before animation starts
//repaint();
synchronized(this){
try {
this.wait();
} catch (InterruptedException e) {
}
}
Point endLocation = getLocation();
//Debug.info("end location:" + getLocation());
// if the location has changed
if (endLocation.x != startLocation.x ||
endLocation.y != startLocation.y){
//Debug.info("user has moved the position of this dialog box");
// it must be the result of user's moving the dialog box
// to a presumably preferred location
userPreferredLocation = endLocation;
}
setVisible(false);
return command;
}
public void addButton(String name){
if (defaultButton != null){
//Debug.info("removing" + defaultButton);
buttons.remove(defaultButton);
buttons.removeAll();
defaultButton = null;
}
buttons.add(new Button(name));
}
public void setText(String text) {
textPane.setText(text);
pack();
}
class Button extends JButton implements ActionListener{
public Button(String text){
super(text);
Font f = new Font("sansserif", Font.BOLD, 12);
setFont(f);
setFocusable(false);
setActionCommand(text);
addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
command = e.getActionCommand();
dismiss();
}
}
class TextPane extends HTMLTextPane{
public TextPane(){
super();
setFont(new Font("sansserif", Font.PLAIN, 14));
setBorder(BorderFactory.createEmptyBorder(5, 3, 5, 3));
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy