Fixed git clone URL
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / gui / ViewFrame.java
1 /*
2  * Sixth 3D engine. Author: Svjatoslav Agejenko.
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5 package eu.svjatoslav.sixth.e3d.gui;
6
7 import javax.swing.*;
8 import java.awt.*;
9 import java.awt.event.ComponentEvent;
10 import java.awt.event.ComponentListener;
11 import java.awt.event.WindowEvent;
12 import java.awt.event.WindowListener;
13
14 /**
15  * Java Swing GUI frame that contains {@link ViewPanel} with canvas for 3D rendering.
16  */
17 public class ViewFrame extends JFrame implements WindowListener {
18
19     private static final long serialVersionUID = -7037635097739548470L;
20
21     private final ViewPanel viewPanel;
22
23     public ViewFrame() {
24         setTitle("3D engine");
25
26         addWindowListener(new java.awt.event.WindowAdapter() {
27             @Override
28             public void windowClosing(final java.awt.event.WindowEvent e) {
29                 exit();
30             }
31         });
32
33         viewPanel = new ViewPanel();
34
35         add(getViewPanel());
36
37         setSize(800, 600);
38
39         // maximize window
40         setExtendedState(JFrame.MAXIMIZED_BOTH);
41         setVisible(true);
42
43         addResizeListener();
44         addWindowListener(this);
45     }
46
47     private void addResizeListener() {
48         addComponentListener(new ComponentListener() {
49             // This method is called after the component's size changes
50             @Override
51             public void componentHidden(final ComponentEvent e) {
52             }
53
54             @Override
55             public void componentMoved(final ComponentEvent e) {
56             }
57
58             @Override
59             public void componentResized(final ComponentEvent evt) {
60
61                 final Component c = (Component) evt.getSource();
62
63                 // Get new size
64                 final Dimension newSize = c.getSize();
65
66                 boolean sizeFixed = false;
67
68                 if (newSize.width < 400) {
69                     newSize.width = 400;
70                     sizeFixed = true;
71                 }
72
73                 if (newSize.height < 400) {
74                     newSize.height = 400;
75                     sizeFixed = true;
76                 }
77
78                 if (sizeFixed)
79                     setSize(newSize);
80
81             }
82
83             @Override
84             public void componentShown(final ComponentEvent e) {
85                 viewPanel.repaintDuringNextViewUpdate();
86             }
87
88         });
89     }
90
91     /**
92      * Exit the application.
93      */
94     public void exit() {
95         if (getViewPanel() != null) {
96             getViewPanel().stop();
97             getViewPanel().setEnabled(false);
98             getViewPanel().setVisible(false);
99         }
100         dispose();
101     }
102
103     @Override
104     public java.awt.Dimension getPreferredSize() {
105         return new java.awt.Dimension(640, 480);
106     }
107
108     /**
109      * @return the view
110      */
111     public ViewPanel getViewPanel() {
112         return viewPanel;
113     }
114
115     @Override
116     public void windowActivated(final WindowEvent e) {
117         viewPanel.repaintDuringNextViewUpdate();
118     }
119
120     @Override
121     public void windowClosed(final WindowEvent e) {
122     }
123
124     @Override
125     public void windowClosing(final WindowEvent e) {
126     }
127
128     @Override
129     public void windowDeactivated(final WindowEvent e) {
130     }
131
132     /**
133      * Repaint the view when the window is deiconified.
134      *
135      * Deiconified means that the window is restored from minimized state.
136      */
137     @Override
138     public void windowDeiconified(final WindowEvent e) {
139         viewPanel.repaintDuringNextViewUpdate();
140     }
141
142     /**
143      * Do nothing when the window is iconified.
144      *
145      * Iconified means that the window is minimized.
146      * @param e the event to be processed
147      */
148     @Override
149     public void windowIconified(final WindowEvent e) {
150     }
151
152     @Override
153     public void windowOpened(final WindowEvent e) {
154         viewPanel.repaintDuringNextViewUpdate();
155     }
156
157 }