package com.elsealabs.xshot.views; import com.elsealabs.xshot.capture.Capture; import com.elsealabs.xshot.component.ComponentSelection; import com.elsealabs.xshot.math.PointRectangle; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.image.BufferedImage; public class ViewCaptureRec extends JFrame { private static final long serialVersionUID = 1L; private Rectangle bounds; private BufferedImage image; private ComponentSelection componentSelection; private JPanel panel; private Point pointBefore; private Point pointNew; private boolean clicked; private boolean dragging; private boolean released; private boolean keep = true; private boolean zooming; private PointRectangle prevRec; public ViewCaptureRec(BufferedImage image) { this.image = image; this.componentSelection = ComponentSelection.DEFAULT_MODERN; } public void build(Rectangle bounds) { this.bounds = bounds; setUndecorated(true); setBounds(bounds.x, bounds.y, bounds.width, bounds.height); _addListeners(); _createPanel(); add(panel); setVisible(true); } private void _addListeners() { addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { dragging = false; released = true; } @Override public void mousePressed(MouseEvent e) { clicked = false; pointBefore = e.getLocationOnScreen(); SwingUtilities.convertPointFromScreen(pointBefore, panel); } @Override public void mouseClicked(MouseEvent e) { System.out.println(e.getPoint()); clicked = true; } }); addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) { dragging = true; pointNew = e.getLocationOnScreen(); SwingUtilities.convertPointFromScreen(pointNew, panel); } }); addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { zooming = false; } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_Z) { zooming = true; } if (e.getKeyCode() == KeyEvent.VK_K) { keep = false; } } }); } private void _createPanel() { panel = new JPanel() { private static final long serialVersionUID = 1L; public void paint(Graphics g) { super.paint(g); Graphics2D gd = (Graphics2D) g; // Draw image g.drawImage(image, 0, 0, null); // Draw rectangle over image (background) gd.setComposite(getAlphaComposite(0.35f)); gd.setColor(Color.BLACK); gd.fillRect(0, 0, getWidth(), getHeight()); gd.setComposite(getAlphaComposite(1.0f)); // If they have not released their selection if (!released && keep) { // Draw Selection Component if (dragging && !clicked) { prevRec = PointRectangle.rectFromPoint(pointNew, pointBefore); if (prevRec != null) { if (prevRec.width > 0 && prevRec.height > 0) { componentSelection.paint(gd, prevRec, image); } } } // Draw zooming component if (zooming) { } } // If they have released their selection else if (released) { if (keep) { componentSelection.paint(gd, prevRec, image); Capture capture = new Capture(image, bounds, prevRec); ViewPicture view = new ViewPicture(capture); view.build(); dispose(); } else { keep = true; released = false; } } repaint(); } }; } private AlphaComposite getAlphaComposite(float alpha) { return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); } }