70350e01c8ff7cf581f2fd112223c6b351fe5d7d
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / gui / GuiComponent.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 eu.svjatoslav.sixth.e3d.geometry.Box;
13 import eu.svjatoslav.sixth.e3d.geometry.Point3D;
14 import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseInteractionController;
15 import eu.svjatoslav.sixth.e3d.gui.humaninput.UserInputHandler;
16 import eu.svjatoslav.sixth.e3d.gui.textEditorComponent.KeyboardHelper;
17 import eu.svjatoslav.sixth.e3d.math.Transform;
18 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.line.LineAppearance;
19 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.base.AbstractCompositeShape;
20 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.wireframe.WireframeBox;
21
22 import java.awt.event.KeyEvent;
23
24 public class GuiComponent extends AbstractCompositeShape implements
25         UserInputHandler, MouseInteractionController {
26
27     private static final String GROUP_GUI_FOCUS = "gui.focus";
28     public final ViewPanel viewPanel;
29     Box containingBox = new Box();
30     private WireframeBox borders = null;
31
32     private boolean borderShown = false;
33
34     public GuiComponent(final Transform transform,
35                         final ViewPanel viewPanel, final Point3D size) {
36         super(transform);
37         this.viewPanel = viewPanel;
38         setDimensions(size);
39     }
40
41     @Override
42     public boolean beforeRender(final ViewPanel viewPanel,
43                                 final int millisecondsSinceLastFrame) {
44         return false;
45     }
46
47     private WireframeBox createBorder() {
48         final LineAppearance appearance = new LineAppearance(10,
49                 new eu.svjatoslav.sixth.e3d.renderer.raster.Color(255, 0, 0, 100));
50
51         final double borderSize = 10;
52
53         final Box borderArea = containingBox.clone().addBorder(borderSize);
54
55         return new WireframeBox(borderArea, appearance);
56     }
57
58     @Override
59     public boolean focusLost(final ViewPanel viewPanel) {
60         hideBorder();
61         return true;
62     }
63
64     @Override
65     public boolean focusReceived(final ViewPanel viewPanel) {
66         showBorder();
67         return true;
68     }
69
70     public WireframeBox getBorders() {
71         if (borders == null)
72             borders = createBorder();
73         return borders;
74     }
75
76     public int getDepth() {
77         return (int) containingBox.getDepth();
78     }
79
80     public int getHeight() {
81         return (int) containingBox.getHeight();
82     }
83
84     public int getWidth() {
85         return (int) containingBox.getWidth();
86     }
87
88     public void hideBorder() {
89         if (!borderShown)
90             return;
91         borderShown = false;
92         removeGroup(GROUP_GUI_FOCUS);
93     }
94
95     @Override
96     public boolean keyPressed(final KeyEvent event, final ViewPanel viewPanel) {
97         if (event.getKeyChar() == KeyboardHelper.ESC)
98             viewPanel.getKeyboardFocusStack().popFocusOwner();
99         return true;
100     }
101
102     @Override
103     public boolean keyReleased(final KeyEvent event, final ViewPanel viewPanel) {
104         return false;
105     }
106
107     @Override
108     public void mouseClicked() {
109         viewPanel.getKeyboardFocusStack().pushFocusOwner(this);
110     }
111
112     @Override
113     public void mouseEntered() {
114     }
115
116     @Override
117     public void mouseExited() {
118     }
119
120     private void setDimensions(final Point3D size) {
121         containingBox.setSizeCentered(size);
122     }
123
124     private void showBorder() {
125         if (borderShown)
126             return;
127         borderShown = true;
128         addShape(getBorders(), GROUP_GUI_FOCUS);
129     }
130
131 }