bdfe7659cf79515cf183c3c952a1cb71bd303d74
[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 ViewListener, WindowListener {
20
21     private static final long serialVersionUID = -7037635097739548470L;
22
23     private final View view;
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         view = new View();
36
37         add(getView());
38
39         getView().addViewListener(this);
40
41         setSize(800, 600);
42
43         // maximize window
44         setExtendedState(JFrame.MAXIMIZED_BOTH);
45         setVisible(true);
46
47         addResizeListener();
48         addWindowListener(this);
49     }
50
51     public void addResizeListener() {
52         addComponentListener(new ComponentListener() {
53             // This method is called after the component's size changes
54             @Override
55             public void componentHidden(final ComponentEvent e) {
56             }
57
58             @Override
59             public void componentMoved(final ComponentEvent e) {
60             }
61
62             @Override
63             public void componentResized(final ComponentEvent evt) {
64
65                 final Component c = (Component) evt.getSource();
66
67                 // Get new size
68                 final Dimension newSize = c.getSize();
69
70                 boolean sizeFixed = false;
71
72                 if (newSize.width < 400) {
73                     newSize.width = 400;
74                     sizeFixed = true;
75                 }
76
77                 if (newSize.height < 400) {
78                     newSize.height = 400;
79                     sizeFixed = true;
80                 }
81
82                 if (sizeFixed)
83                     setSize(newSize);
84
85             }
86
87             @Override
88             public void componentShown(final ComponentEvent e) {
89                 view.repaintDuringNextViewUpdate();
90             }
91
92         });
93     }
94
95     @Override
96     public void exit() {
97         if (getView() != null) {
98             getView().stop();
99             getView().setEnabled(false);
100             getView().setVisible(false);
101         }
102         dispose();
103     }
104
105     @Override
106     public java.awt.Dimension getPreferredSize() {
107         return new java.awt.Dimension(640, 480);
108     }
109
110     /**
111      * @return the view
112      */
113     public View getView() {
114         return view;
115     }
116
117     @Override
118     public void windowActivated(final WindowEvent e) {
119         view.repaintDuringNextViewUpdate();
120     }
121
122     @Override
123     public void windowClosed(final WindowEvent e) {
124     }
125
126     @Override
127     public void windowClosing(final WindowEvent e) {
128     }
129
130     @Override
131     public void windowDeactivated(final WindowEvent e) {
132     }
133
134     @Override
135     public void windowDeiconified(final WindowEvent e) {
136         view.repaintDuringNextViewUpdate();
137     }
138
139     @Override
140     public void windowIconified(final WindowEvent e) {
141     }
142
143     @Override
144     public void windowOpened(final WindowEvent e) {
145         view.repaintDuringNextViewUpdate();
146     }
147
148 }