1   package fi.jyu.mit.graphics;
2   
3   import java.awt.*;
4   
5   /**
6    * Avaruus jossa lisätyt kuviot ovat.
7    * Avaruuteen voi lisätä kuvioita, esimerkiksi:
8    * <pre>
9    *      space.add(new Line(0, 0, 1, 1)).setColor(255, 255, 0);
10   *      space.add(new Circle(2, 4, 9)).rotate(Axis.Y, 94);
11   * </pre>
12   * @author Markus Kivioja
13   *
14   */
15  public class Space {
16      
17      private final DrawableCollection objects;
18      private SpaceParent[] windows;
19      private int numOfWins;
20      
21      /**
22       * Luo uuden avaruuden
23       */
24      public Space() {
25          this.objects = new DrawableCollection();
26          this.objects.registerSpace(this);
27          this.windows = new SpaceParent[20];
28          this.numOfWins = 0;
29      }
30      
31      /**
32       * Rekisteröi annetun ikkunan näyttämään tätä avaruutta
33       * @param window ikkuna joka näyttää tätä avaruutta
34       */
35      public void registerWindow(SpaceParent window) {
36          if (numOfWins == this.windows.length) {
37              SpaceParent[] temp = this.windows;
38              this.windows = new SpaceParent[this.numOfWins+20];
39              for (int i = 0; i < temp.length; i++) this.windows[i] = temp[i];
40          }
41          this.windows[numOfWins] = window;
42          numOfWins++;
43      }
44      
45      /**
46       * Poistaa annetun ikkunan tämän avaruuden rekisteristä, kutsutaan
47       * kun ikkuna lopettaa tämän avaruuden näyttämisen
48       * @param window
49       */
50      public void unRegisterWindow(Window window) {
51          int index = this.numOfWins;
52          for (int i = 0; i < this.numOfWins; i++) {
53              if (this.windows[i] == (window)) {
54                  index = i;
55              }
56          }
57          if (index == this.numOfWins) return;
58          for (int i = index; i < (this.numOfWins-1); i++) {
59              this.windows[i] = this.windows[i+1];
60          }
61          this.windows[this.numOfWins-1] = null; // NOPMD, vapautetaan muistia
62          this.numOfWins--;
63      }
64      
65      /**
66       * Antaa Drawable-olion joka muodostuu kaikista 
67       * tämän avaruuden sisältämistä kuvioista
68       * @return kokoelma tämän paneelin näyttämistä kuvioista
69       */
70      public Drawable getSavedPath() {
71          return this.objects;
72      }
73      
74      /**
75       * Piirtää tämän avaruuden sisältämät kuviot uudelleen
76       */
77      public void redraw() {
78          for (int i = 0; i < this.numOfWins; i++) this.windows[i].redraw();
79      }
80      
81      /**
82       * Piirtää tämän avaruuden sisältämät kuviot annetulla matriisilla ja Graphics-oliolla
83       * @param g Graphics-olio
84       * @param a muunnosmatriisi
85       */
86      public void draw(Graphics g, Matrix a) {
87          this.objects.draw(g, a);
88      }
89      
90      /**
91       * Lisää avaruuteen kuvion joka on Drawable-olio ja palauttaa sen,
92       * esimerkiksi:
93       * <pre>
94       *      space.add(new Line(0, 0, 1, 1)).setColor(255, 255, 0);
95       * </pre>
96       * @param shape lisättävä kuvio
97       * @return lisätty kuvio
98       */
99      public Drawable add(Drawable shape) {
100         objects.add(shape);
101         redraw();
102         return shape;
103     }
104 
105     /**
106      * Poistaa avaruudesta kuvion joka on Drawable-olio
107      * @param shape poistettava kuvio
108      */
109     public void remove(Drawable shape) {
110         objects.remove(shape);
111         redraw();
112     }
113     
114     /**
115      * Poistaa avaruudesta kaikki kuviot
116      *
117      */
118     public void removeAll() {
119         objects.removeAll();
120         redraw();
121     }
122 }
123