Window.java |
1 package fi.jyu.mit.graphics; 2 3 import java.awt.*; 4 import java.awt.event.WindowAdapter; 5 import java.awt.event.WindowEvent; 6 7 import javax.swing.JFrame; 8 9 /** 10 * Window-luokka, ikkuna joka näyttää avaruudet. 11 * Ikkunaan voi lisätä kuvioita, esimerkiksi: 12 * esimerkiksi: 13 * <pre> 14 * window.add(new Line(0, 0, 1, 1)).setColor(255, 255, 0); 15 * </pre> 16 * Ikkunaa voi skaalata, kiertää ja liikuttaa, esimerkiksi: 17 * <pre> 18 * window.scale(-2.5, -2.2, 2.1, 2.7); 19 * window.rotate(Axis.X, 45.2); 20 * window.move(0, 1.5, -15); 21 * </pre> 22 * @author Markus Kivioja 23 */ 24 public class Window extends JFrame implements Transformable { 25 26 private static final long serialVersionUID = 1L; 27 private SpacePanel panel; 28 private ControllerFrame touchPad, controlButtons; 29 30 /** 31 * Luo uuden ikkunan jonka korkeus on 500 ja leveys 500 32 * 33 */ 34 public Window() { 35 this(500, 500); 36 } 37 38 /** 39 * Luo uuden ikkunan 40 * @param width leveys 41 * @param height korkeus 42 */ 43 public Window(int width, int height) { 44 super(); 45 this.setSize(width, height); 46 initialize(); 47 setBackground(Color.WHITE); 48 } 49 50 /** 51 * Alustaa uuden ikkunan asetukset 52 */ 53 private void initialize() { 54 Container contentPane = this.getContentPane(); 55 contentPane.setLayout(new BorderLayout()); 56 panel = new SpacePanel(); 57 panel.setSize(getWidth(), getHeight()); 58 contentPane.add(panel); 59 addWindowListener(new CloseWindow()); 60 } 61 62 /** 63 * Skaalaa ikkunan sisällön annettujen reuna-arvojen mukaisesti, 64 * esimerkiksi: 65 * <pre> 66 * window.scale(-2.5, -2.2, 2.1, 2.7); 67 * </pre> 68 * @param left sisällön x-koordinaatin arvo ikkunan vasemmassa reunassa 69 * @param bottom sisällön y-koordinaatin arvo ikkunan alareunassa 70 * @param right sisällön x-koordinaatin arvo ikkunan oikeassa reunassa 71 * @param top sisällön y-koordinaatin arvo ikkunan yläreunassa 72 */ 73 public void scale(double left, double bottom, double right, double top) { 74 panel.scale(left, bottom, right, top); 75 redraw(); 76 } 77 78 /** 79 * Kiertää ikkunan sisältöä annetun akselin ympäri, esimerkiksi: 80 * <pre> 81 * window.rotate(Axis.X, 45.2); 82 * </pre> 83 * @param axis akseli jonka ympäri pyöritetään (Axis.X/Axis.Y/Axis.Z) 84 * @param deg kierrettävän kulman suuruus asteina 85 */ 86 public void rotate(int axis, double deg) { 87 panel.rotate(axis, deg); 88 } 89 90 /** 91 * Liikuttaa ikkunan sisältöä, esimerkiksi: 92 * <pre> 93 * window.move(0, 1.5, -15); 94 * </pre> 95 * @param dx liikutettava matka x-akselin suunnassa 96 * @param dy liikutettava matka y-akselin suunnassa 97 * @param dz liikutettava matka z-akselin suunnassa 98 */ 99 public void move(double dx, double dy, double dz) { 100 panel.move(dx, dy, dz); 101 } 102 103 /** 104 * Skaalaa ikkunan sisällön annettujen kertoimien mukaan 105 * <pre> 106 * window.scale(2, 1, 1); venyttää kuviot kaksinkertaiseksi x-suunnassa 107 * </pre> 108 * @param sx sisällön x-suuntainen kerroin 109 * @param sy sisällön y-suuntainen kerroin 110 * @param sz sisällön z-suuntainen kerroin 111 */ 112 public void scale(double sx, double sy, double sz) { 113 panel.scale(sx, sy, sz); 114 } 115 116 @Override 117 public Transformable transform(Matrix m) { 118 panel.transform(m); 119 return this; 120 } 121 122 /** 123 * Asettaa ikkunan uudeksi muunnosmatriisiksi annetun matriisin 124 * @param m uusi muunnosmatriisi 125 */ 126 public void setTransform(Matrix m) { 127 panel.setTransform(m); 128 } 129 130 @Override 131 public void setRotator(Matrix m) { 132 panel.setRotator(m); 133 } 134 135 @Override 136 public Matrix getRotator() { 137 return panel.getRotator(); 138 } 139 140 /** 141 * Asettaa ikkunan näyttämään annettua avaruutta 142 * @param space näytettävä avaruus 143 */ 144 public void setSpace(Space space) { 145 panel.setSpace(space); 146 } 147 148 /** 149 * Lisää ikkunaan kuvion joka on Drawable-olio ja palauttaa sen, 150 * esimerkiksi: 151 * <pre> 152 * window.add(new Line(0, 0, 1, 1)).setColor(255, 255, 0); 153 * </pre> 154 * @param shape lisättävä kuvio 155 * @return lisätty kuvio 156 */ 157 public Drawable add(Drawable shape) { 158 return panel.add(shape); 159 } 160 161 /** 162 * Antaa Drawable-olion joka muodostuu kaikista 163 * tämän ikkunan näyttämistä kuvioista 164 * @return kokoelma tämän ikkunan näyttämistä kuvioista 165 */ 166 public Drawable getSavedPath() { 167 return panel.getSavedPath(); 168 } 169 170 /** 171 * Antaa ikkunan kokonaismuunnosmatriisin 172 * @return ikkunan kokonaismuunnosmatriisi 173 */ 174 public Matrix getFullTransform() { 175 return panel.getFullTransform(); 176 } 177 178 /** 179 * Poistaa ikkunasta kuvion joka on Drawable-olio 180 * @param shape poistettava kuvio 181 */ 182 public void remove(Drawable shape) { 183 panel.remove(shape); 184 } 185 186 /** 187 * Poistaa ikkunasta kaikki kuviot 188 * 189 */ 190 public void clear() { 191 panel.removeAll(); 192 } 193 194 /** 195 * Piirtää ikkunan sisällön uudelleen 196 */ 197 public void redraw() { 198 repaint(); 199 } 200 201 /** 202 * Tuo ikkunan näkyville näyttöön 203 */ 204 public void showWindow() { 205 this.setVisible(true); 206 } 207 208 /** 209 * Asettaa isotrooppisuuden päälle/pois 210 * @param isotrophic isotrooppisuus tosi/epätosi 211 */ 212 public void setIsotrophic(boolean isotrophic) { 213 panel.setIsotrophic(isotrophic); 214 } 215 216 /** 217 * Lisää ikkunaan ruudun jonka avulla voi pyörittää 218 * ikkunan sisältöä liikuttamalla hiirtä ruudun sisässä 219 * @param touchPadOn ruutu näkyvillä tosi/epätosi 220 * @param move tuleeko hiiren napin olla pohjassa tosi/epätosi 221 */ 222 public void setTouchPad(boolean touchPadOn, boolean move) { 223 if (touchPadOn) { 224 if ( touchPad == null ) 225 touchPad = new ControllerFrame(new TouchPad(panel, move),0,350,150,150); 226 touchPad.showController(); 227 } 228 else { 229 if (touchPad != null) touchPad.hideController(); 230 } 231 } 232 233 /** 234 * Lisää ikkunaan ruudun jonka avulla voi pyörittää 235 * ikkunan sisältöä liikuttamalla hiirtä ruudun sisässä 236 * siten, että hiiren nappia ei paineta 237 * @param touchPadOn ruutu näkyvillä tosi/epätosi 238 */ 239 public void setTouchPad(boolean touchPadOn) { 240 this.setTouchPad(touchPadOn, false); 241 } 242 243 /** 244 * Lisää ikkunaan jokaiselle akselille kiertopainikkeet joilla 245 * ikkunan sisältöä voi kiertää vastaavien akselien ympäri 246 * @param controlButtonsOn painikkeet näkyvillä tosi/epätosi 247 */ 248 public void setControlButtons(boolean controlButtonsOn) { 249 if (controlButtonsOn) { 250 if ( controlButtons == null ) 251 controlButtons = new ControllerFrame(new ControlButtons(panel),150,350,150,150); 252 controlButtons.showController(); 253 } 254 else { 255 if (controlButtons != null) controlButtons.hideController(); 256 } 257 } 258 259 /** 260 * Palauttaa tämän ikkunan sisältämän paneelin johon 261 * kuviot piirretään 262 * @return tämän ikkunan paneeli 263 */ 264 public SpacePanel getPanel() { 265 return panel; 266 } 267 268 /** 269 * Luokka ikkunan sulkemiseen 270 */ 271 protected class CloseWindow extends WindowAdapter { 272 273 /** 274 * Käsittelijä ikkunan sulkemiselle. 275 * @param event ei käytössä 276 */ 277 @Override 278 public void windowClosing(WindowEvent event) { 279 280 System.exit(0); // NOPMD EI ole J2EE ohjelma 281 } 282 } 283 284 /** 285 * Vaihtaa ikkunan muunnosmatriisin annetuksi matriisiksi 286 * @param m uusi muunnosmatriisi 287 */ 288 @Override 289 public void changeTransform(Matrix m) { 290 panel.changeTransform(m); 291 } 292 293 /** 294 * Antaa ikkunan muunnosmatriisin 295 * @return ikkunan muunnosmatriisi 296 */ 297 @Override 298 public Matrix getTransform() { 299 return panel.getTransform(); 300 } 301 } 302