All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sikuli.script.FindFailedDialog Maven / Gradle / Ivy

/*
 * Copyright (c) 2010-2016, Sikuli.org, sikulix.com
 * Released under the MIT License.
 *
 */
package org.sikuli.script;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * INTERNAL USE
 */
class FindFailedDialog extends JDialog implements ActionListener {

  JButton retryButton;
  JButton skipButton;
  JButton abortButton;
  FindFailedResponse _response;
  boolean isCapture = false;

  public FindFailedDialog(org.sikuli.script.Image target) {
    init(target, false);
  }

  public FindFailedDialog(org.sikuli.script.Image target, boolean isCapture) {
    init(target, isCapture);
  }

  private void init(org.sikuli.script.Image target, boolean isCapture) {
    this.isCapture = isCapture;
    setModal(true);
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    Component targetComp = createTargetComponent(target);
    panel.add(targetComp, BorderLayout.NORTH);
    JPanel buttons = new JPanel();
    String textRetry = "Retry";
    if (isCapture) {
      textRetry = "Capture";
    }
    String textSkip = "Capture/Skip";
    if (isCapture) {
      textSkip = "Skip";
    }
    retryButton = new JButton(textRetry);
    retryButton.addActionListener(this);
    skipButton = new JButton(textSkip);
    skipButton.addActionListener(this);
    abortButton = new JButton("Abort");
    abortButton.addActionListener(this);
    buttons.add(retryButton);
    buttons.add(skipButton);
    buttons.add(abortButton);
    panel.add(buttons, BorderLayout.SOUTH);
    add(panel);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        _response = FindFailedResponse.ABORT;
      }
    });
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    if (retryButton == e.getSource()) {
      _response = FindFailedResponse.RETRY;
    } else if (abortButton == e.getSource()) {
      _response = FindFailedResponse.ABORT;
    } else if (skipButton == e.getSource()) {
      _response = FindFailedResponse.SKIP;
    }
    dispose();
  }

  public FindFailedResponse getResponse() {
    return _response;
  }

   Component createTargetComponent(org.sikuli.script.Image img) {
    JLabel cause = null;
    JPanel dialog = new JPanel();
    dialog.setLayout(new BorderLayout());
    if (img.isValid()) {
      if (!img.isText()) {
        Image bimage = img.get(false);
        if (bimage != null) {
          String rescale = "";
          JLabel iconLabel = new JLabel();
          int w = bimage.getWidth(this);
          int h = bimage.getHeight(this);
          if (w > 500) {
            w = 500;
            h = -h;
            rescale = " (rescaled 500x...)";
          }
          if (h > 300) {
            h = 300;
            w = -w;
            rescale = " (rescaled ...x300)";
          }
          if (h < 0 && w < 0) {
            w = 500;
            h = 300;
            rescale = " (rescaled 500x300)";
          }
          bimage = bimage.getScaledInstance(w, h, Image.SCALE_DEFAULT);
          iconLabel.setIcon(new ImageIcon(bimage));
          cause = new JLabel("Cannot find " + img.getName() + rescale);
          dialog.add(iconLabel, BorderLayout.PAGE_END);
        }
      } else {
        cause = new JLabel("Sikuli cannot find text:" + img.getName());
      }
    }
    if (isCapture) {
      cause = new JLabel("Request to capture: " + img.getName());
    }
    dialog.add(cause, BorderLayout.PAGE_START);
    return dialog;
  }

  @Override
  public void setVisible(boolean flag) {
    if (flag) {
//TODO Can not be called in the constructor (as JFRrame?)
// Doing so somehow made it impossible to keep
// the dialog always on top.
      pack();
      setAlwaysOnTop(true);
      setResizable(false);
      setLocationRelativeTo(this);
      requestFocus();
    }
    super.setVisible(flag);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy