1 /*
   2  * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation. Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package org.jemmy.image;
  26 
  27 import java.awt.BorderLayout;
  28 import java.awt.Dimension;
  29 import java.awt.Graphics;
  30 import java.awt.Toolkit;
  31 import java.awt.event.ComponentEvent;
  32 import java.awt.event.ComponentListener;
  33 import java.awt.image.BufferedImage;
  34 import javax.swing.JDialog;
  35 import javax.swing.JLabel;
  36 import javax.swing.JPanel;
  37 
  38 /**
  39  *
  40  * @author shura
  41  */
  42 public class DiffDialog extends javax.swing.JDialog {
  43 
  44     private final static StrictImageComparator comparator = new StrictImageComparator();
  45     private double scale = 1.0;
  46     private int imageWidth, imageHeight, scaledWidth, scaledHeight;
  47     private ImagePane left = null, right = null, diff = null;
  48     int status = 0;
  49 
  50     /** Creates new form ImageDiff */
  51     DiffDialog() {
  52         super((JDialog)null, true);
  53         initComponents();
  54         leftPane.setLayout(new BorderLayout());
  55         leftPane.add(new JLabel("Golden"), BorderLayout.NORTH);
  56         rightPane.setLayout(new BorderLayout());
  57         rightPane.add(new JLabel("Result"), BorderLayout.NORTH);
  58         diffPane.setLayout(new BorderLayout());
  59         diffPane.add(new JLabel("Diff"), BorderLayout.NORTH);
  60         getContentPane().addComponentListener(new ComponentListener() {
  61 
  62             public void componentResized(ComponentEvent e) {
  63                 lrSplit.setDividerLocation(.5);
  64                 dcSplit.setDividerLocation(.5);
  65                 tbSplit.setDividerLocation(.5);
  66             }
  67 
  68             public void componentMoved(ComponentEvent e) {
  69                 throw new UnsupportedOperationException("Not supported yet.");
  70             }
  71 
  72             public void componentShown(ComponentEvent e) {
  73                 throw new UnsupportedOperationException("Not supported yet.");
  74             }
  75 
  76             public void componentHidden(ComponentEvent e) {
  77                 throw new UnsupportedOperationException("Not supported yet.");
  78             }
  79         });
  80         setSize(400, 300);
  81 
  82         // Get the size of the screen
  83         Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
  84 
  85         // Determine the new location of the window
  86         int w = getSize().width;
  87         int h = getSize().height;
  88         int x = (dim.width - w) / 2;
  89         int y = (dim.height - h) / 2;
  90 
  91         // Move the window
  92         setLocation(x, y);
  93     }
  94 
  95     void setImages(BufferedImage leftImage, BufferedImage rightImage) {
  96         if (leftImage != null && rightImage != null) {
  97             copyBtn.setEnabled(true);
  98             removeBtn.setEnabled(false);
  99             imageWidth = leftImage.getWidth();
 100             imageHeight = leftImage.getHeight();
 101         } else {
 102             if (leftImage == null) {
 103                 copyBtn.setEnabled(true);
 104                 removeBtn.setEnabled(false);
 105                 imageWidth = rightImage.getWidth();
 106                 imageHeight = rightImage.getHeight();
 107             } else if (rightImage == null) {
 108                 copyBtn.setEnabled(false);
 109                 removeBtn.setEnabled(true);
 110                 imageWidth = leftImage.getWidth();
 111                 imageHeight = leftImage.getHeight();
 112             }
 113         }
 114         if (left == null) {
 115             left = new ImagePane(leftImage);
 116         } else {
 117             left.setImage(leftImage);
 118         }
 119         leftPane.add(left, BorderLayout.CENTER);
 120         if (right == null) {
 121             right = new ImagePane(rightImage);
 122         } else {
 123             right.setImage(rightImage);
 124         }
 125         rightPane.add(right, BorderLayout.CENTER);
 126         if (diff == null) {
 127             diff = new ImagePane(subtract(leftImage, rightImage));
 128         } else {
 129             diff.setImage(subtract(leftImage, rightImage));
 130         }
 131         diffPane.add(diff, BorderLayout.CENTER);
 132         rescaleAll();
 133     }
 134 
 135     private BufferedImage subtract(BufferedImage left, BufferedImage right) {
 136         if(left != null && right != null) {
 137             return ImageTool.subtractImage(left, right);
 138         } else {
 139             return null;
 140         }
 141     }
 142 
 143     /** This method is called from within the constructor to
 144      * initialize the form.
 145      * WARNING: Do NOT modify this code. The content of this method is
 146      * always regenerated by the Form Editor.
 147      */
 148     @SuppressWarnings("unchecked")
 149     // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
 150     private void initComponents() {
 151 
 152         tbSplit = new javax.swing.JSplitPane();
 153         lrSplit = new javax.swing.JSplitPane();
 154         leftPane = new javax.swing.JPanel();
 155         rightPane = new javax.swing.JPanel();
 156         dcSplit = new javax.swing.JSplitPane();
 157         diffPane = new javax.swing.JPanel();
 158         controlPane = new javax.swing.JPanel();
 159         jButton1 = new javax.swing.JButton();
 160         jButton2 = new javax.swing.JButton();
 161         copyBtn = new javax.swing.JButton();
 162         removeBtn = new javax.swing.JButton();
 163         jButton6 = new javax.swing.JButton();
 164         jButton7 = new javax.swing.JButton();
 165 
 166         tbSplit.setDividerLocation(200);
 167         tbSplit.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
 168 
 169         lrSplit.setDividerLocation(250);
 170 
 171         javax.swing.GroupLayout leftPaneLayout = new javax.swing.GroupLayout(leftPane);
 172         leftPane.setLayout(leftPaneLayout);
 173         leftPaneLayout.setHorizontalGroup(
 174             leftPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 175             .addGap(0, 250, Short.MAX_VALUE)
 176         );
 177         leftPaneLayout.setVerticalGroup(
 178             leftPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 179             .addGap(0, 200, Short.MAX_VALUE)
 180         );
 181 
 182         lrSplit.setLeftComponent(leftPane);
 183 
 184         javax.swing.GroupLayout rightPaneLayout = new javax.swing.GroupLayout(rightPane);
 185         rightPane.setLayout(rightPaneLayout);
 186         rightPaneLayout.setHorizontalGroup(
 187             rightPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 188             .addGap(0, 293, Short.MAX_VALUE)
 189         );
 190         rightPaneLayout.setVerticalGroup(
 191             rightPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 192             .addGap(0, 200, Short.MAX_VALUE)
 193         );
 194 
 195         lrSplit.setRightComponent(rightPane);
 196 
 197         tbSplit.setTopComponent(lrSplit);
 198 
 199         javax.swing.GroupLayout diffPaneLayout = new javax.swing.GroupLayout(diffPane);
 200         diffPane.setLayout(diffPaneLayout);
 201         diffPaneLayout.setHorizontalGroup(
 202             diffPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 203             .addGap(0, 100, Short.MAX_VALUE)
 204         );
 205         diffPaneLayout.setVerticalGroup(
 206             diffPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 207             .addGap(0, 255, Short.MAX_VALUE)
 208         );
 209 
 210         dcSplit.setLeftComponent(diffPane);
 211 
 212         jButton1.setMnemonic('+');
 213         jButton1.setText("+");
 214         jButton1.addActionListener(new java.awt.event.ActionListener() {
 215             public void actionPerformed(java.awt.event.ActionEvent evt) {
 216                 jButton1ActionPerformed(evt);
 217             }
 218         });
 219 
 220         jButton2.setMnemonic('-');
 221         jButton2.setText("-");
 222         jButton2.addActionListener(new java.awt.event.ActionListener() {
 223             public void actionPerformed(java.awt.event.ActionEvent evt) {
 224                 jButton2ActionPerformed(evt);
 225             }
 226         });
 227 
 228         copyBtn.setText("Copy to golgen");
 229         copyBtn.setEnabled(false);
 230         copyBtn.addActionListener(new java.awt.event.ActionListener() {
 231             public void actionPerformed(java.awt.event.ActionEvent evt) {
 232                 copyBtnActionPerformed(evt);
 233             }
 234         });
 235 
 236         removeBtn.setText("Remove from golden");
 237         removeBtn.setEnabled(false);
 238         removeBtn.addActionListener(new java.awt.event.ActionListener() {
 239             public void actionPerformed(java.awt.event.ActionEvent evt) {
 240                 removeBtnActionPerformed(evt);
 241             }
 242         });
 243 
 244         jButton6.setText("Next");
 245         jButton6.addActionListener(new java.awt.event.ActionListener() {
 246             public void actionPerformed(java.awt.event.ActionEvent evt) {
 247                 jButton6ActionPerformed(evt);
 248             }
 249         });
 250 
 251         jButton7.setText("Exit");
 252         jButton7.addActionListener(new java.awt.event.ActionListener() {
 253             public void actionPerformed(java.awt.event.ActionEvent evt) {
 254                 jButton7ActionPerformed(evt);
 255             }
 256         });
 257 
 258         javax.swing.GroupLayout controlPaneLayout = new javax.swing.GroupLayout(controlPane);
 259         controlPane.setLayout(controlPaneLayout);
 260         controlPaneLayout.setHorizontalGroup(
 261             controlPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 262             .addGroup(controlPaneLayout.createSequentialGroup()
 263                 .addContainerGap(289, Short.MAX_VALUE)
 264                 .addGroup(controlPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 265                     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, controlPaneLayout.createSequentialGroup()
 266                         .addComponent(jButton6)
 267                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 268                         .addComponent(jButton7))
 269                     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, controlPaneLayout.createSequentialGroup()
 270                         .addComponent(jButton1)
 271                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 272                         .addComponent(jButton2))
 273                     .addComponent(copyBtn, javax.swing.GroupLayout.Alignment.TRAILING)
 274                     .addComponent(removeBtn, javax.swing.GroupLayout.Alignment.TRAILING))
 275                 .addContainerGap())
 276         );
 277         controlPaneLayout.setVerticalGroup(
 278             controlPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 279             .addGroup(controlPaneLayout.createSequentialGroup()
 280                 .addContainerGap()
 281                 .addGroup(controlPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 282                     .addComponent(jButton1)
 283                     .addComponent(jButton2))
 284                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 285                 .addComponent(copyBtn)
 286                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 287                 .addComponent(removeBtn)
 288                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 107, Short.MAX_VALUE)
 289                 .addGroup(controlPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 290                     .addComponent(jButton7)
 291                     .addComponent(jButton6))
 292                 .addContainerGap())
 293         );
 294 
 295         dcSplit.setRightComponent(controlPane);
 296 
 297         tbSplit.setRightComponent(dcSplit);
 298 
 299         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
 300         getContentPane().setLayout(layout);
 301         layout.setHorizontalGroup(
 302             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 303             .addComponent(tbSplit, javax.swing.GroupLayout.DEFAULT_SIZE, 549, Short.MAX_VALUE)
 304         );
 305         layout.setVerticalGroup(
 306             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 307             .addComponent(tbSplit, javax.swing.GroupLayout.DEFAULT_SIZE, 461, Short.MAX_VALUE)
 308         );
 309 
 310         pack();
 311     }// </editor-fold>//GEN-END:initComponents
 312 
 313     private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
 314         scale *= .9;
 315         rescaleAll();
 316     }//GEN-LAST:event_jButton2ActionPerformed
 317 
 318     private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
 319         scale *= 1.1;
 320         rescaleAll();
 321     }//GEN-LAST:event_jButton1ActionPerformed
 322 
 323     private void rescaleAll() {
 324         scaledWidth = (int) (imageWidth * scale);
 325         scaledHeight = (int) (imageHeight * scale);
 326         left.reScale();
 327         right.reScale();
 328         diff.reScale();
 329         getContentPane().repaint();
 330     }
 331 
 332     private void copyBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyBtnActionPerformed
 333         status = -1;
 334         setVisible(false);
 335     }//GEN-LAST:event_copyBtnActionPerformed
 336 
 337     private void removeBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeBtnActionPerformed
 338         status = 1;
 339         setVisible(false);
 340     }//GEN-LAST:event_removeBtnActionPerformed
 341 
 342     private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton6ActionPerformed
 343         setVisible(false);
 344     }//GEN-LAST:event_jButton6ActionPerformed
 345 
 346     private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton7ActionPerformed
 347         status = -2;
 348         setVisible(false);
 349     }//GEN-LAST:event_jButton7ActionPerformed
 350 
 351     private class ImagePane extends JPanel {
 352 
 353         BufferedImage img;
 354         java.awt.Image scaled;
 355 
 356         public ImagePane(BufferedImage img) {
 357             this.img = img;
 358         }
 359 
 360         @Override
 361         protected void paintComponent(Graphics g) {
 362             if (img != null) {
 363                 g.drawImage(scaled, 0, 0, this);
 364             } else {
 365                 super.paintComponent(g);
 366             }
 367         }
 368 
 369         void setImage(BufferedImage img) {
 370             this.img = img;
 371             reScale();
 372         }
 373 
 374         void reScale() {
 375             if (img != null) {
 376                     scaled = img.getScaledInstance(scaledWidth, scaledHeight, java.awt.Image.SCALE_DEFAULT);
 377             }
 378         }
 379     }
 380     // Variables declaration - do not modify//GEN-BEGIN:variables
 381     private javax.swing.JPanel controlPane;
 382     private javax.swing.JButton copyBtn;
 383     private javax.swing.JSplitPane dcSplit;
 384     private javax.swing.JPanel diffPane;
 385     private javax.swing.JButton jButton1;
 386     private javax.swing.JButton jButton2;
 387     private javax.swing.JButton jButton6;
 388     private javax.swing.JButton jButton7;
 389     private javax.swing.JPanel leftPane;
 390     private javax.swing.JSplitPane lrSplit;
 391     private javax.swing.JButton removeBtn;
 392     private javax.swing.JPanel rightPane;
 393     private javax.swing.JSplitPane tbSplit;
 394     // End of variables declaration//GEN-END:variables
 395 }