Sidebar.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. package gui.simulator;
  2. import gui.simulator.facilities.ImageType;
  3. import gui.simulator.facilities.Fence;
  4. import gui.simulator.facilities.PalmTree1;
  5. import gui.simulator.facilities.RestRoom;
  6. import gui.simulator.facilities.SimulatorStage;
  7. import gui.simulator.facilities.SnackBar;
  8. import gui.simulator.facilities.Tree1;
  9. import gui.simulator.facilities.WayPoint;
  10. import java.awt.BasicStroke;
  11. import java.awt.Color;
  12. import java.awt.Font;
  13. import java.awt.Graphics2D;
  14. import java.awt.Rectangle;
  15. import java.awt.event.MouseEvent;
  16. import java.awt.geom.Point2D;
  17. import java.awt.geom.Rectangle2D;
  18. import java.io.Serializable;
  19. import java.lang.reflect.Constructor;
  20. import java.lang.reflect.InvocationTargetException;
  21. import java.util.ArrayList;
  22. import java.util.HashMap;
  23. import java.util.LinkedHashMap;
  24. import java.util.Map.Entry;
  25. public class Sidebar implements Serializable {
  26. private int sideBarWidth;
  27. private int sideBarHeight;
  28. private Terrain terrain;
  29. private LinkedHashMap<String, DrawEngine> drawableStages = new LinkedHashMap<String, DrawEngine>();
  30. private LinkedHashMap<String, DrawEngine> drawableFacilities = new LinkedHashMap<String, DrawEngine>();
  31. private LinkedHashMap<String, DrawEngine> drawableOrnaments = new LinkedHashMap<String, DrawEngine>();
  32. private LinkedHashMap<String, ImageType> drawablePaths = new LinkedHashMap<String, ImageType>();
  33. private ArrayList<LinkedHashMap<String, DrawEngine>> drawableArrays = new ArrayList<LinkedHashMap<String, DrawEngine>>();
  34. public enum SideBarTab{
  35. STAGES(0), FACILITIES(1), ORNAMENTS(2), PATHS(3);
  36. public final int value;
  37. SideBarTab(int value){
  38. this.value = value;
  39. }
  40. int getValue(){
  41. return value;
  42. }
  43. }
  44. private SideBarTab currentTab = SideBarTab.STAGES;
  45. private int tabWidth, tab1X, tab2X, tab3X;
  46. /*
  47. * Constructor for initializing all variables
  48. * @param: int sideBarWidth -> width of sidebar
  49. * @param int screenHeight -> Height of screen, so sidebar will be same height
  50. */
  51. public Sidebar(int sideBarWidth, int screenHeight, Terrain terrain){
  52. this.sideBarWidth = sideBarWidth;
  53. this.sideBarHeight = screenHeight;
  54. this.terrain = terrain;
  55. this.tabWidth = sideBarWidth/3;
  56. this.tab1X = 0;
  57. this.tab2X = sideBarWidth/3;
  58. this.tab3X = 2*sideBarWidth/3;
  59. loadDrawableObjects();
  60. }
  61. /*
  62. * Add your new objects to this method. This method is run when the sidebar is drawn and will automatically align and place
  63. * all inserted objects. Only thing YOU have to do is insert nice parameter values to the object instantiation.
  64. *
  65. * Important: only the scaling parameter matters, the x and y values will be overwritten by the system
  66. */
  67. public void loadDrawableObjects(){
  68. //stages
  69. drawableStages.put("Stage1", new SimulatorStage(0, 0, 0.26, 1, terrain));
  70. drawableStages.put("Stage2",new SimulatorStage(0, 0, 0.26, 1, terrain));
  71. drawableStages.put("Stage3",new SimulatorStage(0, 0, 0.26, 1, terrain));
  72. drawableStages.put("Stage4", new SimulatorStage(0, 0, 0.26, 1, terrain));
  73. drawableStages.put("Stage5", new SimulatorStage(0, 0, 0.26, 1, terrain));
  74. drawableStages.put("Stage6", new SimulatorStage(0, 0, 0.26, 1, terrain));
  75. drawableStages.put("Stage7", new SimulatorStage(0, 0, 0.26, 1, terrain));
  76. drawableStages.put("Stage8", new SimulatorStage(0, 0, 0.26, 1, terrain));
  77. drawableStages.put("Stage9", new SimulatorStage(0, 0, 0.26, 1, terrain));
  78. drawableStages.put("Stage10", new SimulatorStage(0, 0, 0.26, 1, terrain));
  79. drawableStages.put("Stage11", new SimulatorStage(0, 0, 0.26, 1, terrain));
  80. //facilities
  81. drawableFacilities.put("Toilet", new RestRoom(0, 0, 0.8, 1, this.terrain));
  82. drawableFacilities.put("Ingang", new AccessPoint(terrain, 0, 0, 0.26, 1));
  83. drawableFacilities.put("Uitgang", new ExitPoint(terrain, 0, 0, 0.26, 1));
  84. drawableFacilities.put("Snackbar", new SnackBar(0, 0, 0.2, 1, this.terrain));
  85. drawableFacilities.put("Wegwijzer", new WayPoint(0, 0, 0.8, 1, this.terrain));
  86. //paths
  87. drawablePaths.put("Ground-stone", ImageType.PathGroundStone);
  88. drawablePaths.put("Dirt", ImageType.PathDirt);
  89. drawablePaths.put("Stone", ImageType.PathStone);
  90. //ornaments
  91. drawableOrnaments.put("Tree1", new Tree1(0, 0, 0.7, 1, this.terrain));
  92. drawableOrnaments.put("PalmTree1", new PalmTree1(0, 0, 0.7, 1, this.terrain));
  93. drawableOrnaments.put("Fence", new Fence(0, 0, 0.4, 0, this.terrain));
  94. drawableArrays.add(drawableStages);
  95. drawableArrays.add(drawableFacilities);
  96. drawableArrays.add(drawableOrnaments);
  97. }
  98. public void draw(Graphics2D g2){
  99. //setclip
  100. g2.setClip(new Rectangle2D.Double(0,0, sideBarWidth, sideBarHeight));
  101. //header + tabs
  102. g2.setColor(Color.GRAY);
  103. //g2.fill3DRect(x, y, width, height, raised);
  104. g2.fill3DRect(0, 0, sideBarWidth, 30, true);
  105. g2.fill3DRect(tab1X, 30, tabWidth, 30, true);
  106. g2.fill3DRect(tab2X, 30, tabWidth, 30, true);
  107. g2.fill3DRect(tab3X, 30, tabWidth, 30, true);
  108. g2.fill3DRect(0, 60, sideBarWidth, 30, true);
  109. g2.setColor(Color.WHITE);
  110. g2.setFont(new Font("SansSerif", Font.BOLD, 20));
  111. //g2.drawString(str, x, y);
  112. g2.drawString("Drag and drop", 30, 23);
  113. g2.setFont(new Font("SansSerif", Font.PLAIN, 16));
  114. g2.drawString("Stages", tab1X+10, 50);
  115. g2.drawString("Facilities", tab2X+3, 50);
  116. g2.drawString("Paths", tab3X+15, 50);
  117. g2.drawString("Ornaments", sideBarWidth/3, 80);
  118. switch (currentTab) {
  119. case STAGES:
  120. g2.drawLine(tab1X+10, 55, tab1X+60, 55);
  121. break;
  122. case FACILITIES:
  123. g2.drawLine(tab2X+3, 55, tab2X+64, 55);
  124. break;
  125. case PATHS:
  126. g2.drawLine(tab3X+15, 55, tab3X+55, 55);
  127. break;
  128. case ORNAMENTS:
  129. g2.drawLine(sideBarWidth/3, 85, (sideBarWidth/3)+80, 85);
  130. break;
  131. default:
  132. break;
  133. }
  134. //draw objects
  135. g2.setColor(Color.BLACK);
  136. int objectPlacementX = 0;
  137. int objectPlacementY = 91;
  138. if(currentTab == SideBarTab.PATHS){
  139. for(Entry<String, ImageType> object : drawablePaths.entrySet()){
  140. g2.drawImage(Images.getImage(object.getValue()), objectPlacementX +10, objectPlacementY +10, sideBarWidth/2 -20, 80, null);
  141. g2.drawString(object.getKey(), objectPlacementX+2, objectPlacementY + 95);
  142. g2.drawRect(objectPlacementX, objectPlacementY, sideBarWidth/2, 100);
  143. objectPlacementX += 100;
  144. //switch to next row
  145. if(objectPlacementX % 200 == 0){
  146. objectPlacementX = 0;
  147. objectPlacementY += 100;
  148. }
  149. }
  150. }else{
  151. for(Entry<String, DrawEngine> object : drawableArrays.get(currentTab.getValue()).entrySet()){
  152. object.getValue().setX(objectPlacementX);
  153. object.getValue().setY(objectPlacementY);
  154. if(object.getValue().getFacilityName() == "Fence")
  155. object.getValue().setY(objectPlacementY+50);
  156. object.getValue().draw(g2);
  157. g2.drawString(object.getKey(), objectPlacementX+2, objectPlacementY + 95);
  158. g2.drawRect(objectPlacementX, objectPlacementY, sideBarWidth/2, 100);
  159. objectPlacementX += 100;
  160. //switch to next row
  161. if(objectPlacementX % 200 == 0){
  162. objectPlacementX = 0;
  163. objectPlacementY += 100;
  164. }
  165. }
  166. }
  167. //draw seperation line between sidebar and field
  168. g2.setColor(Color.BLACK);
  169. g2.setStroke(new BasicStroke(5));
  170. g2.drawLine(199, 0, 199, sideBarHeight);
  171. }
  172. /*
  173. * Make new facility and place it on the mousepointer, dependent on where the user clicked in the sidebar
  174. * @param: MouseEvent e -> Used to get mouselocation
  175. */
  176. protected void getFacility(MouseEvent e){
  177. Point2D clickPoint = terrain.getClickPoint(e.getPoint());
  178. DrawEngine dragObject = null;
  179. if(e.getX() < sideBarWidth)
  180. {
  181. //check for click on tabs
  182. if(e.getY() > 30 && e.getY() < 60){
  183. if(e.getX() > tab1X && e.getX() < tab2X){
  184. currentTab = SideBarTab.STAGES;
  185. }else if(e.getX() > tab2X && e.getX() < tab3X){
  186. currentTab = SideBarTab.FACILITIES;
  187. }else if(e.getX() > tab3X && e.getX() < sideBarWidth){
  188. currentTab = SideBarTab.PATHS;
  189. }
  190. }
  191. if(e.getY() > 60 && e.getY() < 90){
  192. currentTab = SideBarTab.ORNAMENTS;
  193. }
  194. //check for object selection
  195. int objectPlacementX = 0;
  196. int objectPlacementY = 61;
  197. if(currentTab == SideBarTab.PATHS){
  198. for(Entry<String, ImageType> object : drawablePaths.entrySet()){
  199. if(new Rectangle(objectPlacementX, objectPlacementY, sideBarWidth/2, 100).contains(e.getPoint())){
  200. terrain.newWalkingPath(object.getValue());
  201. }
  202. objectPlacementX += 100;
  203. //switch to next row
  204. if(objectPlacementX % 200 == 0){
  205. objectPlacementX = 0;
  206. objectPlacementY += 100;
  207. }
  208. }
  209. }else{
  210. for(Entry<String, DrawEngine> object : drawableArrays.get(currentTab.getValue()).entrySet()){
  211. if(object.getValue().contains(e.getPoint())){
  212. try {
  213. Constructor<?> constructor = object.getValue().getClass().getConstructor(int.class, int.class, double.class, double.class, Terrain.class, boolean.class);
  214. dragObject = (DrawEngine) constructor.newInstance(new Object[] { (int)clickPoint.getX(),(int)clickPoint.getY(), 0.5, 10, terrain, true});
  215. terrain.setDragObject(dragObject);
  216. } catch (NoSuchMethodException e1) {
  217. try{
  218. Constructor<?> constructor = object.getValue().getClass().getConstructor(int.class, int.class, double.class, double.class, Terrain.class);
  219. dragObject = (DrawEngine) constructor.newInstance(new Object[] { (int)clickPoint.getX(),(int)clickPoint.getY(), 0.5, 10, terrain});
  220. terrain.setDragObject(dragObject);
  221. }catch (NoSuchMethodException ex){
  222. ex.printStackTrace();
  223. } catch (InvocationTargetException e2) {
  224. e2.printStackTrace();
  225. } catch (InstantiationException e2) {
  226. e2.printStackTrace();
  227. } catch (IllegalAccessException e2) {
  228. e2.printStackTrace();
  229. }
  230. } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException ex){
  231. ex.printStackTrace();
  232. }
  233. }
  234. }
  235. }
  236. if(dragObject != null)
  237. terrain.addEntity(dragObject);
  238. }
  239. }
  240. public int getSideBarWidth(){
  241. return sideBarWidth;
  242. }
  243. }