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.awt; 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 }