package app.view;

import app.model.*;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import java.beans.PropertyVetoException;

/**
 * Vindu.java
 *
 * Vinduet oppretter interne vinduer
 * Fungerer som et mellomledd mellom controller og indrevinduer.
 * Har prøvd mest mulig å skille mvc. Controlleren trenger
 * ikke detalj kunnskap om de indre vinduene, det har Vinduet.
 *
 * @author Hilde Vestøl (106288)
 * @version 0.9
 */

public class Vindu extends JFrame {
    private ActionListener lytter;
    private MenyApp meny;
    //private int låneID = 1000; //Skal senere komme fra DB

    /**
     *
     * @param tittel
     * @param lytter
     */

    public Vindu(String tittel, ActionListener lytter) {
        this.lytter = lytter;
        this.meny = new MenyApp(lytter);
        this.setTitle(tittel);
        this.setMinimumSize(new Dimension(640, 480) );
        this.setSize(640, 480);
        this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); //Bruker vinduslytter
        this.setExtendedState(MAXIMIZED_BOTH); //Starter vinduet i "fullscreen"       
        
        this.setContentPane(new JDesktopPane()); //legger til desktop i vindu
        this.addWindowListener((WindowListener)lytter);
        
        setJMenuBar(meny);

    }
    
    /**
     *
     * @return
     */

    public JDesktopPane getDesktop() {
        return (JDesktopPane)this.getContentPane();
    }
    

    /**
     * Metode for å finne hvilket internt vindu som er aktivt.
     * Må vite hvilket vindu en skal kalle events på
     *
     * @return det aktive vinduet
     */

    public InterntVindu getAktivtVindu() {
        return (InterntVindu)getDesktop().getSelectedFrame();
    }
    
    /**
     * Metode for å lukke interne vinduer.
     */

    public void lukkInterneVinduer() {
        if (this.getDesktop().getAllFrames().length == 0) {
            this.dispose();
        } else {
            JInternalFrame[] frames = this.getDesktop().getAllFrames();
            
            for (int i = 0; i < frames.length; i++) {
                try {
                    //setter frame som selected for å forsikre meg om at dette
                    //vinduet er aktivt
                    frames[i].setSelected(true);
                    frames[i].doDefaultCloseAction();
                    
                } catch (PropertyVetoException pve) {
                    JOptionPane.showMessageDialog(null, pve);
                }
            }
        
        }
        
    } //end lukkInterneVinduer
    
    
    /**
     * En metode for å sette meny-elementer til enabled
     * hvis et interntvindu er aktivt.
     */

    public void enableMeny() {
        meny.finnMenyValg("save").setEnabled(true);
        meny.finnMenyValg("closeWindow").setEnabled(true);
        meny.finnMenyValg("beregn").setEnabled(true);
    }
    
    /**
     * En metode for å sette meny-elementer til disabled
     * hvis et interntvindu IKKE er aktivt
     */

    public void disableMeny() {
        meny.finnMenyValg("save").setEnabled(false);
        meny.finnMenyValg("closeWindow").setEnabled(false);
        meny.finnMenyValg("beregn").setEnabled(false);
    }
    

    /**
     * En metode som sjekker om Vinduet har et aktivt internt vindu
     * For å unngå NullPointerException ved å trigge events fra menyen
     * @return
     */

    public boolean harAktivtVindu() {
        if (getAktivtVindu() != null) {
            return true;
        }
        return false;
    }
    
    
    /**
     * Kaller metoden oppdaterAlleFelt i InterntVindu.
     * Setter alle feltene til rett verdi i forhold til
     * innholdet i lånet.
     * @param lån
     */

    public void oppdaterAlleFelt(Loan lån) {
        if (getAktivtVindu() != null){
            getAktivtVindu().oppdaterAlleFelt(lån);
        }
    }
    
    /**
     * Metode for å opprette ett internt vindu
     *
     * @param lån       et låneobjekt
     * @param tittel    Navn på vinduet
     * @return          et internt vindu
     */

    public InterntVindu opprettInterntVindu(Loan lån, String tittel) {
        InterntVindu intern = new InterntVindu(tittel, lytter, lån);
        
        intern.setVisible(true);
        getDesktop().add(intern);
        getDesktop().getDesktopManager().activateFrame(intern);
               
        return intern;
    }
    
    
  /**************************************************************************
   * Har en "kopi" av alle get-metoder fra internt vindu                    *
   * På den måten har jeg skilt de indre delene av GUIet                    *
   * og controlleren min.                                                   *
   * Controlleren trenger kun å vite om metoder i klassen                   *
   * Vindu. Vinduet skjenner til det InterneVinduet.                        *
   **************************************************************************/

   
    /**
     *
     * @return
     */

    public Loan getLån() {
        if (harAktivtVindu())
            return getAktivtVindu().getLån();
            
        return null;
    }
    
    /**
     *
     * @return
     */

    public String getLåneID() {
        if (harAktivtVindu())
            return getAktivtVindu().getLåneID();
        return "";
    }
    
    /**
     *
     * @return
     */

    public String getLånebeløp() {
        if (harAktivtVindu())
            return getAktivtVindu().getLånebeløp();
        return "";
    }
    
    /**
     *
     * @return
     */

    public String getLøpetid() {
        if (harAktivtVindu() )
            return getAktivtVindu().getLøpetid();
        return "";
    }
    
    /**
     *
     * @return
     */

    public int getÅrligeTerminer() {
        if (harAktivtVindu())
            return getAktivtVindu().getÅrligeTerminer();
        return 1; //1 er standard valg
    }
    
    /**
     *
     * @return
     */

    public String getRentesats() {
        if (harAktivtVindu())
            return getAktivtVindu().getRentesats();
        return "";
    }
        
    /**
     *
     * @return
     */

    public int getLånetype() {
        if (harAktivtVindu())
            return getAktivtVindu().getLånetype();
        return 1;
    }
    
    /**
     *
     * @return
     */

    public JTextArea getTxtInfo() {
        if (harAktivtVindu())
            return getAktivtVindu().getTxtInfo();
        return null;
    }
   

  /**************************************************************************
   * Har en "kopi" av alle set-metoder fra internt vindu                    *
   * På den måten har jeg skilt de indre delene av GUIet                    *
   * og controlleren min.                                                   *
   * Controlleren trenger kun å vite om metoder i klassen                   *
   * Vindu. Vinduet skjenner til det InterneVinduet.                        *
   **************************************************************************/

     
    /**
     *
     * @param id
     */

    public void setID(int id) {
        if(harAktivtVindu())
            if(getAktivtVindu().getLåneID().equals("") )
                getAktivtVindu().setID(id); //skal senere komme fra DB
    }
    
    /**
     *
     * @param txt
     */

    public void setID(String txt) {
        if(harAktivtVindu())
            getAktivtVindu().setID(txt);
    }

    /**
     *
     * @param beløp
     */

    public void setBeløp(int beløp) {
        if(harAktivtVindu())
            getAktivtVindu().setBeløp(beløp);
    }
    
    /**
     *
     * @param txt
     */

    public void setBeløp(String txt) {
        if(harAktivtVindu())
            getAktivtVindu().setBeløp(txt);
    }
    
    /**
     *
     * @param tid
     */

    public void setLøpetid(int tid) {
        if(harAktivtVindu())
            getAktivtVindu().setLøpetid(tid);
    }
    
    /**
     *
     * @param txt
     */

    public void setLøpetid(String txt) {
        if(harAktivtVindu())
            getAktivtVindu().setLøpetid(txt);
    }
    
    /**
     *
     * @param rente
     */

    public void setRentesats (double rente) {
        if(harAktivtVindu())
            getAktivtVindu().setRentesats(rente);
    }
    
    /**
     *
     * @param txt
     */

    public void setRentesats (String txt) {
        if(harAktivtVindu())
            getAktivtVindu().setRentesats(txt);
    }
    
    /**
     *
     * @param txt
     */

    public void setInfoTxt(String txt) {
        if(harAktivtVindu())
            getAktivtVindu().setInfoTxt(txt);
    }
    
    /**
     *
     * @param farge
     */

    public void setInfoTxt(Color farge) {
        if(harAktivtVindu())
            getAktivtVindu().setInfoTxt(farge);
    }     
        
} // end class Vindu

Kontaktinfo

Hilde Vestøl
98883064
hilde@vestol.net

kart