package io.loli.sc.ui.swing;
import io.loli.sc.config.Config;
import io.loli.sc.core.ScreenCaptor;
import java.awt.AWTEvent;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.MouseInputAdapter;
public class DragFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JFrame jframe;
private JPanel imgPanel;
private JLabel bgLabel;
private BufferedImage img;
private DragPanel dragPanel;
private Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
private BufferedImage subImg = null;
private volatile String result;
private void useSystemUI() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
}
private void fullScreen() {
setVisible(true);
validate();
// 必须加这句否则linux下无法全屏
dispose();
setUndecorated(true);
requestFocus();
jframe.getGraphicsConfiguration().getDevice()
.setFullScreenWindow(jframe);
}
class DragPanel extends JPanel {
private static final long serialVersionUID = 1L;
public DragPanel() {
super();
setBackground(new Color(0, 0, 0, 80));
setPreferredSize(scrSize);
setVisible(false);
}
public void processParentEvent(AWTEvent e) {
this.processEvent(e);
}
public void move(int x, int y) {
int xx = getX();
int yy = getY();
if (xx + x < 0) {
xx = 0;
x = 0;
}
if (yy + y < 0) {
yy = 0;
y = 0;
}
if (xx + x > (int) scrSize.getWidth() - getWidth()) {
xx = (int) scrSize.getWidth() - getWidth();
x = 0;
}
if (yy + y > (int) scrSize.getHeight() - getHeight()) {
yy = (int) scrSize.getHeight() - getHeight();
y = 0;
}
xx += x;
yy += y;
setBounds(xx, yy, getWidth(), getHeight());
}
@Override
public void paint(Graphics g) {
super.paint(g);
int a = getX();
int b = getY();
int w = getWidth();
int h = getHeight();
subImg = img.getSubimage(a, b, w, h);
originSubImg = originImg.getSubimage((int) (a * bi),
(int) (b * bi), (int) (w * bi), (int) (h * bi));
g.drawImage(subImg, 0, 0, null);
}
public void resize() {
dragPanel.setBounds(Math.min(a1, a2), Math.min(b1, b2),
Math.abs(a2 - a1), Math.abs(b2 - b1));
dragPanel.setVisible(true);
}
}
private void addComponents() {
addDragPanel();
addGreyPanel();
}
private void addDragPanel() {
dragPanel = new DragPanel();
add(dragPanel);
}
BufferedImage originImg;
BufferedImage originSubImg;
private double bi;
private void setBackground() {
originImg = ScreenCaptor.screenShot();
img = new BufferedImage(Toolkit
.getDefaultToolkit().getScreenSize().width, Toolkit
.getDefaultToolkit().getScreenSize().height,
BufferedImage.TYPE_INT_RGB);
Graphics2D bg = img.createGraphics();
bg.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
bg.drawImage(originImg , 0, 0, Toolkit
.getDefaultToolkit().getScreenSize().width,Toolkit
.getDefaultToolkit().getScreenSize().height,null);
bg.dispose();
bi = ((double) originImg.getWidth()) / img.getWidth();
ImageIcon background = new ImageIcon(img);
bgLabel = new JLabel(background);
bgLabel.setBounds(0, 0, background.getIconWidth(),
background.getIconHeight());
imgPanel = (JPanel) jframe.getContentPane();
imgPanel.setOpaque(false);
imgPanel.setLayout(null);
getLayeredPane().setLayout(null);
getLayeredPane().add(bgLabel, new Integer(Integer.MIN_VALUE));
}
private JPanel greyPanel;
public void addGreyPanel() {
greyPanel = new JPanel();
this.getContentPane().add(greyPanel);
greyPanel.setBackground(new Color(0, 0, 0, 60));
greyPanel.setPreferredSize(scrSize);
greyPanel.setVisible(true);
greyPanel.setBounds(0, 0, (int) scrSize.getWidth(),
(int) scrSize.getHeight());
}
private void init() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(false);
this.jframe = this;
setLayout(new FlowLayout());
this.setBackground();
}
int m1, n1;
int m2, n2;
int a1, b1;
int a2, b2;
private void addListeners() {
greyPanel.addMouseMotionListener(new DrawListener());
greyPanel.addMouseListener(new DrawListener());
dragPanel.addMouseListener(new DragListener());
dragPanel.addMouseMotionListener(new DragListener());
jframe.addKeyListener(new CostumKeyListener());
}
private boolean canStop = false;
class CostumKeyListener extends KeyAdapter {
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
if (dragPanel.isVisible()) {
dragPanel.setVisible(false);
} else {
canStop = true;
jframe.remove(dragPanel);
jframe.dispose();
}
}
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
new Thread(new UploadRun()).start();
jframe.dispose();
}
}
}
class UploadRun implements Runnable {
@Override
public void run() {
ScreenCaptor sc = ScreenCaptor.newInstance(false);
Config config = new Config();
sc.setConfig(config);
result = sc.uploadImage(config.getDefaultUpload(),
getOriginSubImg());
}
}
class DrawListener extends MouseInputAdapter {
boolean dragged = false;
@Override
public void mousePressed(MouseEvent e) {
if (!e.isMetaDown()) {
a1 = e.getX();
b1 = e.getY();
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (!e.isMetaDown()) {
if (!dragged)
dragged = true;
a2 = e.getX();
b2 = e.getY();
dragPanel.resize();
jframe.repaint();
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (!e.isMetaDown()) {
a2 = e.getX();
b2 = e.getY();
if (dragged)
dragPanel.resize();
jframe.repaint();
} else {
if (dragPanel.isVisible()) {
dragPanel.setVisible(false);
} else {
canStop = true;
jframe.remove(dragPanel);
jframe.dispose();
}
}
}
}
class DragListener extends MouseInputAdapter {
boolean dragged = false;
@Override
public void mouseClicked(MouseEvent e) {
if (!e.isMetaDown()) {
if (e.getClickCount() == 2) {
new Thread(new UploadRun()).start();
jframe.dispose();
}
}
}
@Override
public void mousePressed(MouseEvent e) {
if (!e.isMetaDown()) {
m1 = e.getX();
n1 = e.getY();
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (!e.isMetaDown()) {
m2 = e.getX();
n2 = e.getY();
if (!dragged)
dragged = true;
if (dragged)
dragPanel.move(m2 - m1, n2 - n1);
jframe.repaint();
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (!e.isMetaDown()) {
m2 = e.getX();
n2 = e.getY();
if (dragged)
dragPanel.move(m2 - m1, n2 - n1);
jframe.repaint();
} else {
if (dragPanel.isVisible()) {
dragPanel.setVisible(false);
} else {
canStop = true;
jframe.remove(dragPanel);
jframe.dispose();
}
}
}
}
public DragFrame() {
this.useSystemUI();
this.init();
this.addComponents();
this.addListeners();
this.fullScreen();
}
public String getResult() {
while ((result == null || result.equals("")) && !canStop) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return result;
}
public BufferedImage getOriginSubImg() {
return originSubImg;
}
public void setOriginSubImg(BufferedImage originSubImg) {
this.originSubImg = originSubImg;
}
public BufferedImage getSubImg() {
return subImg;
}
public void setSubImg(BufferedImage subImg) {
this.subImg = subImg;
}
public boolean isCanStop() {
return canStop;
}
}