// Ikkunoita.java Copyright (c) 2006 Kari Laitinen // http://www.naturalprogramming.com // 2006-04-09 Tiedosto luotu. // 2006-04-09 Viimeisin muutos. // NOTE: As this is an educational program, the classes defined // here are not safe for all kinds of uses. If you try to define // very large or very small windows, or put long texts inside // the windows, the classes may not work properly. class Ikkuna { protected final int MAKSIMI_IKKUNAN_LEVEYS = 78 ; protected final int MAKSIMI_IKKUNAN_KORKEUS = 22 ; protected char[][] ikkunan_sisalto ; protected int ikkunan_leveys = MAKSIMI_IKKUNAN_LEVEYS ; protected int ikkunan_korkeus = MAKSIMI_IKKUNAN_KORKEUS ; protected char taustamerkki = ' ' ; public Ikkuna() { // Ylla olevat datakentat on jo initialisoitu annetuilla // alustusarvoilla ennenkuin tama konstruktori suoritetaan. ikkunan_sisalto = new char [ ikkunan_leveys ] [ ikkunan_korkeus ] ; tayta_merkilla( taustamerkki ) ; } public Ikkuna( int haluttu_ikkunan_leveys, int haluttu_ikkunan_korkeus, char annettu_taustamerkki ) { ikkunan_leveys = haluttu_ikkunan_leveys ; ikkunan_korkeus = haluttu_ikkunan_korkeus ; taustamerkki = annettu_taustamerkki ; ikkunan_sisalto = new char [ ikkunan_leveys ] [ ikkunan_korkeus ] ; tayta_merkilla( taustamerkki ) ; } public void tayta_merkilla( char tayttomerkki ) { for ( int rivin_indeksi = 0 ; rivin_indeksi < ikkunan_korkeus ; rivin_indeksi ++ ) { for ( int sarakkeen_indeksi = 0 ; sarakkeen_indeksi < ikkunan_leveys ; sarakkeen_indeksi ++ ) { ikkunan_sisalto[ sarakkeen_indeksi ] [ rivin_indeksi ] = tayttomerkki ; } } } public void tulosta() { System.out.print( "\n" ) ; for ( int rivin_indeksi = 0 ; rivin_indeksi < ikkunan_korkeus ; rivin_indeksi ++ ) { for ( int sarakkeen_indeksi = 0 ; sarakkeen_indeksi < ikkunan_leveys ; sarakkeen_indeksi ++ ) { System.out.print( ikkunan_sisalto[ sarakkeen_indeksi ] [ rivin_indeksi ] ) ; } System.out.print( "\n" ) ; } } public void siirra( int kohdepaikka_x, int kohdepaikka_y, Ikkuna toinen_ikkuna ) { int lahtopaikka_y = 0 ; while ( lahtopaikka_y < toinen_ikkuna.ikkunan_korkeus ) { if ( kohdepaikka_y >= 0 && kohdepaikka_y < ikkunan_korkeus ) { int lahtopaikka_x = 0 ; int alkuperainen_kohdepaikka_x = kohdepaikka_x ; while ( lahtopaikka_x < toinen_ikkuna.ikkunan_leveys ) { if ( kohdepaikka_x >= 0 && kohdepaikka_x < ikkunan_leveys ) { ikkunan_sisalto [ kohdepaikka_x ] [ kohdepaikka_y ] = toinen_ikkuna.ikkunan_sisalto[ lahtopaikka_x ] [ lahtopaikka_y ] ; } lahtopaikka_x ++ ; kohdepaikka_x ++ ; } kohdepaikka_x = alkuperainen_kohdepaikka_x ; } lahtopaikka_y ++ ; kohdepaikka_y ++ ; } } } class IkkunaRaameilla extends Ikkuna { public IkkunaRaameilla() { this( 40, 10 ) ; // Kutsutaan alla olevaa konstruktoria. } public IkkunaRaameilla( int haluttu_ikkunan_leveys, int haluttu_ikkunan_korkeus ) { super( haluttu_ikkunan_leveys, haluttu_ikkunan_korkeus, '|' ) ; Ikkuna ikkuna_taynna_vaakasuoria_viivoja = new Ikkuna( ikkunan_leveys - 2, ikkunan_korkeus, '-' ) ; Ikkuna pienempi_ikkuna_taynna_valilyontimerkkeja = new Ikkuna( ikkunan_leveys - 2, ikkunan_korkeus - 2, ' ') ; siirra( 1, 0, ikkuna_taynna_vaakasuoria_viivoja ) ; siirra( 1, 1, pienempi_ikkuna_taynna_valilyontimerkkeja ) ; } } class IkkunaTekstilla extends IkkunaRaameilla { protected String ikkunan_teksti ; protected void laita_teksti_ikkunaan() { int tekstin_pituus = ikkunan_teksti.length() ; int tekstin_rivi = ikkunan_korkeus / 2 ; int tekstin_alun_sarake = (ikkunan_leveys - tekstin_pituus) / 2 ; for ( int merkin_indeksi = 0 ; merkin_indeksi < tekstin_pituus ; merkin_indeksi ++ ) { ikkunan_sisalto [ tekstin_alun_sarake + merkin_indeksi ] [ tekstin_rivi ] = ikkunan_teksti.charAt( merkin_indeksi ) ; } } public IkkunaTekstilla( int haluttu_ikkunan_leveys, int haluttu_ikkunan_korkeus, String annettu_rivi_tekstia ) { super( haluttu_ikkunan_leveys, haluttu_ikkunan_korkeus ) ; ikkunan_teksti = annettu_rivi_tekstia ; laita_teksti_ikkunaan() ; } public void muuta_teksti( String uusi_teksti_ikkunaan ) { ikkunan_teksti = uusi_teksti_ikkunaan ; laita_teksti_ikkunaan() ; } } class KoristeltuIkkunaTesktilla extends IkkunaTekstilla { public KoristeltuIkkunaTesktilla( int haluttu_ikkunan_leveys, int haluttu_ikkunan_korkeus, String annettu_rivi_tekstia ) { super( haluttu_ikkunan_leveys, haluttu_ikkunan_korkeus, annettu_rivi_tekstia ) ; Ikkuna ikkunaa_koristava_raami = new Ikkuna( haluttu_ikkunan_leveys, haluttu_ikkunan_korkeus, '*' ) ; IkkunaTekstilla tekstiikkuna_raamien_sisaan = new IkkunaTekstilla( haluttu_ikkunan_leveys - 2, haluttu_ikkunan_korkeus - 2, annettu_rivi_tekstia ) ; ikkunaa_koristava_raami.siirra( 1, 1, tekstiikkuna_raamien_sisaan ) ; siirra( 0, 0, ikkunaa_koristava_raami ) ; } } class Ikkunoita { public static void main( String[] ei_kaytossa ) { Ikkuna taustaikkuna = new Ikkuna( 76, 22, '/' ) ; IkkunaRaameilla tyhja_ikkuna = new IkkunaRaameilla( 24, 7 ) ; IkkunaTekstilla tervehtiva_ikkuna = new IkkunaTekstilla( 30, 8, "Hello, world." ) ; KoristeltuIkkunaTesktilla hymyileva_ikkuna = new KoristeltuIkkunaTesktilla( 28, 11, "Smile!" ) ; taustaikkuna.siirra( 6, 2, tyhja_ikkuna ) ; taustaikkuna.siirra( 4, 12, tervehtiva_ikkuna ) ; tervehtiva_ikkuna.muuta_teksti( "HELLO, UNIVERSE!" ) ; taustaikkuna.siirra( 43, 11, tervehtiva_ikkuna ) ; taustaikkuna.siirra( 40, 3, hymyileva_ikkuna ) ; taustaikkuna.tulosta() ; } }