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