-
Notifications
You must be signed in to change notification settings - Fork 0
/
ImageEditView.java
132 lines (108 loc) · 3.79 KB
/
ImageEditView.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Graphics2D;
public class ImageEditView extends JFrame {
private JButton cutButton;
private JButton undoButton;
private JButton redoButton;
private ImagePane imagePane;
private ImageEditModel model;
public ImageEditView(ImageEditModel model) {
this.model = model;
setTitle("Image Editor");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cutButton = new JButton("Cut");
undoButton = new JButton("Undo");
redoButton = new JButton("Redo");
cutButton.setEnabled(false);
undoButton.setEnabled(false);
redoButton.setEnabled(false);
JMenuBar menuBar = new JMenuBar();
JMenu editMenu = new JMenu("Edit");
JMenuItem cutMenuItem = new JMenuItem("Cut");
JMenuItem undoMenuItem = new JMenuItem("Undo");
JMenuItem redoMenuItem = new JMenuItem("Redo");
editMenu.add(cutMenuItem);
editMenu.add(undoMenuItem);
editMenu.add(redoMenuItem);
menuBar.add(editMenu);
setJMenuBar(menuBar);
imagePane = new ImagePane();
setContentPane(imagePane);
Dimension imageSize = new Dimension(model.getImage().getWidth(), model.getImage().getHeight());
setSize(imageSize);
cutButton.addActionListener((ActionEvent e) -> {
Rectangle selectionRect = imagePane.selection.getRectangle();
model.saveCut(selectionRect);
imagePane.repaint();
undoButton.setEnabled(true);
redoButton.setEnabled(false);
cutButton.setEnabled(false);
});
undoButton.addActionListener((ActionEvent e) -> {
if (model.canUndo()) {
model.performUndo();
imagePane.repaint();
}
});
redoButton.addActionListener((ActionEvent e) -> {
if (model.canRedo()) {
model.performRedo();
imagePane.repaint();
}
});
}
private class ImagePane extends JPanel {
private Selection selection = new Selection();
public ImagePane() {
Dimension imageSize = new Dimension(model.getImage().getWidth(), model.getImage().getHeight());
setPreferredSize(imageSize);
addMouseListener(selection);
addMouseMotionListener(selection);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(model.getImage(), 0, 0, this);
((Graphics2D) g).draw(selection.getRectangle());
}
}
private class Selection extends MouseAdapter {
private int x1, y1, x2, y2;
public Rectangle getRectangle() {
int x = Math.min(x1, x2);
int y = Math.min(y1, y2);
int width = Math.abs(x2 - x1);
int height = Math.abs(y2 - y1);
return new Rectangle(x, y, width, height);
}
@Override
public void mousePressed(MouseEvent event) {
x1 = event.getX();
y1 = event.getY();
cutButton.setEnabled(false);
imagePane.repaint();
}
@Override
public void mouseDragged(MouseEvent event) {
x2 = event.getX();
y2 = event.getY();
cutButton.setEnabled(true);
imagePane.repaint();
}
@Override
public void mouseMoved(MouseEvent event) {
// nothing
}
}
}