/* * Copyright (c) 2010-2016, Sikuli.org, sikulix.com * Released under the MIT License. * */ package org.sikuli.ide; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; import org.sikuli.util.OverlayCapturePrompt; import org.sikuli.script.IScreen; import org.sikuli.script.Region; import org.sikuli.script.ScreenImage; import org.sikuli.basics.Debug; import org.sikuli.script.Screen; import org.sikuli.util.EventObserver; import org.sikuli.util.EventSubject; class EditorRegionButton extends JButton implements ActionListener, EventObserver { private static final String me = "EditorRegionButton: "; EditorPane _pane; int _x, _y, _w, _h; public EditorRegionButton(EditorPane pane, int x, int y, int w, int h) { _pane = pane; _x = x; _y = y; _w = w; _h = h; setIcon(new ImageIcon(getRegionImage(x, y, w, h))); setBorderPainted(true); setToolTipText(this.toString()); addActionListener(this); } @Override public void actionPerformed(ActionEvent ae) { SikuliIDE ide = SikuliIDE.getInstance(); ide.setVisible(false); Screen.doPrompt(SikuliIDE._I("msgCapturePrompt"), this); } @Override public void update(EventSubject es) { OverlayCapturePrompt ocp = (OverlayCapturePrompt) es; ScreenImage simg = ocp.getSelection(); Screen.closePrompt(); if (simg != null) { try { Thread.sleep(300); } catch (InterruptedException ie) { } Rectangle roi = simg.getROI(); _x = (int) roi.getX(); _y = (int) roi.getY(); _w = (int) roi.getWidth(); _h = (int) roi.getHeight(); BufferedImage img = getRegionImage(_x, _y, _w, _h); setIcon(new ImageIcon(img)); setToolTipText(this.toString()); } Screen.resetPrompt(ocp); SikuliIDE.showAgain(); } private BufferedImage getRegionImage(int x, int y, int w, int h) { Region region = Region.create(x, y, w, h); IScreen _screen = region.getScreen(); ScreenImage simg = _screen.capture(); int scr_w = simg.w, scr_h = simg.h; int max_h = 80; // FIXME: put max_h in UserPreferences float scale = (float) max_h / scr_h; scr_w *= scale; scr_h *= scale; BufferedImage screen = new BufferedImage(scr_w, scr_h, BufferedImage.TYPE_INT_RGB); Graphics2D screen_g2d = screen.createGraphics(); try { screen_g2d.drawImage(simg.getImage(), 0, 0, scr_w, scr_h, null); int sx = (int) ((x - simg.x) * scale), sy = (int) ((y - simg.y) * scale), sw = (int) (w * scale), sh = (int) (h * scale); screen_g2d.setColor(new Color(255, 0, 0, 150)); screen_g2d.fillRect(sx, sy, sw, sh); } catch (RasterFormatException e) { Debug.error(me + "getRegionImage: Problem making image\n%s", e.getMessage()); } screen_g2d.dispose(); return screen; } public static EditorRegionButton createFromString(EditorPane parentPane, String str) { String[] tokens = str.split("[(),]"); try { int x = Integer.valueOf(tokens[1].trim()), y = Integer.valueOf(tokens[2].trim()), w = Integer.valueOf(tokens[3].trim()), h = Integer.valueOf(tokens[4].trim()); return new EditorRegionButton(parentPane, x, y, w, h); } catch (Exception e) { Debug.error(me + "createFromString: Problem parsing region expression\n%s", e.getMessage()); } return null; } @Override public String toString() { return String.format("Region(%d,%d,%d,%d)", _x, _y, _w, _h); } }