874673f6d18edd561dfeffc77e1a3fc5b5084de7
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / gui / ViewFrame.java
1 /*
2  * Sixth 3D engine. Copyright ©2012-2018, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of version 3 of the GNU Lesser General Public License
6  * or later as published by the Free Software Foundation.
7  *
8  */
9
10 package eu.svjatoslav.sixth.e3d.gui;
11
12 import javax.swing.*;
13 import java.awt.*;
14 import java.awt.event.ComponentEvent;
15 import java.awt.event.ComponentListener;
16 import java.awt.event.WindowEvent;
17 import java.awt.event.WindowListener;
18
19 public class ViewFrame extends JFrame implements WindowListener {
20
21     private static final long serialVersionUID = -7037635097739548470L;
22
23     private final ViewPanel viewPanel;
24
25     public ViewFrame() {
26         setTitle("3D engine");
27
28         addWindowListener(new java.awt.event.WindowAdapter() {
29             @Override
30             public void windowClosing(final java.awt.event.WindowEvent e) {
31                 exit();
32             }
33         });
34
35         viewPanel = new ViewPanel();
36
37         add(getViewPanel());
38
39         setSize(800, 600);
40
41         // maximize window
42         setExtendedState(JFrame.MAXIMIZED_BOTH);
43         setVisible(true);
44
45         addResizeListener();
46         addWindowListener(this);
47     }
48
49     public void addResizeListener() {
50         addComponentListener(new ComponentListener() {
51             // This method is called after the component's size changes
52             @Override
53             public void componentHidden(final ComponentEvent e) {
54             }
55
56             @Override
57             public void componentMoved(final ComponentEvent e) {
58             }
59
60             @Override
61             public void componentResized(final ComponentEvent evt) {
62
63                 final Component c = (Component) evt.getSource();
64
65                 // Get new size
66                 final Dimension newSize = c.getSize();
67
68                 boolean sizeFixed = false;
69
70                 if (newSize.width < 400) {
71                     newSize.width = 400;
72                     sizeFixed = true;
73                 }
74
75                 if (newSize.height < 400) {
76                     newSize.height = 400;
77                     sizeFixed = true;
78                 }
79
80                 if (sizeFixed)
81                     setSize(newSize);
82
83             }
84
85             @Override
86             public void componentShown(final ComponentEvent e) {
87                 viewPanel.repaintDuringNextViewUpdate();
88             }
89
90         });
91     }
92
93     public void exit() {
94         if (getViewPanel() != null) {
95             getViewPanel().stop();
96             getViewPanel().setEnabled(false);
97             getViewPanel().setVisible(false);
98         }
99         dispose();
100     }
101
102     @Override
103     public java.awt.Dimension getPreferredSize() {
104         return new java.awt.Dimension(640, 480);
105     }
106
107     /**
108      * @return the view
109      */
110     public ViewPanel getViewPanel() {
111         return viewPanel;
112     }
113
114     @Override
115     public void windowActivated(final WindowEvent e) {
116         viewPanel.repaintDuringNextViewUpdate();
117     }
118
119     @Override
120     public void windowClosed(final WindowEvent e) {
121     }
122
123     @Override
124     public void windowClosing(final WindowEvent e) {
125     }
126
127     @Override
128     public void windowDeactivated(final WindowEvent e) {
129     }
130
131     @Override
132     public void windowDeiconified(final WindowEvent e) {
133         viewPanel.repaintDuringNextViewUpdate();
134     }
135
136     @Override
137     public void windowIconified(final WindowEvent e) {
138     }
139
140     @Override
141     public void windowOpened(final WindowEvent e) {
142         viewPanel.repaintDuringNextViewUpdate();
143     }
144
145 }