package app.view;

import app.model.*;

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

/**
 * InterntVindu.java
 *
 * De interne vinduene i programmet.
 *
 * @author Hilde Vestøl (106288)
 * @version 0.9
 */


public class InterntVindu extends JInternalFrame {

    private static int vindusTeller = 0, offsetTeller = 0;
    private static final int xOffset = 20, yOffset = 20;

    private ActionListener lytter;
    private Loan lån;
    private TablePanel table;
    
    //GUI-felt som jeg trenger referanser til
    private JTextField txtLåneID = new JTextField(4);
    private JTextField txtLånebeløp = new JTextField(8);
    private JTextField txtLøpeTid = new JTextField(8);
    private JTextField txtTerminer = new JTextField(8);
    private JTextField txtRentesats = new JTextField(8);
    private JTextField txtTypeLån = new JTextField(8);  
    private JComboBox låneTypeBox = new JComboBox(
                                        new String[] {"Annuitet", "Seriell"});
    private JComboBox terminBox = new JComboBox(
                       new String[] {"Årlig", "Halvår", "Kvartal", "Månedlig"});
    private JTextArea txtInfo = new JTextArea();

    
    /**
     *
     * @param tittel
     * @param lytter
     * @param lån
     */

    protected InterntVindu(String tittel, ActionListener lytter, Loan lån) {
        super(tittel +  (++vindusTeller),
                true, //resizable
                true, //closable
                true, //maximizable
                false); //iconifiable
        this.lytter = lytter;
        this.lån = lån;
        this.setSize(800, 600);
        this.addInternalFrameListener((InternalFrameListener)lytter);
        
        
        //Legger til panel med labels, txt-felt og knapper
        NordPanel nord = new NordPanel();
        this.add(nord, BorderLayout.NORTH);
        
        //legger til JTable
        table = new TablePanel(lån);
        this.add(table, BorderLayout.CENTER);
        
        InfoPanel info = new InfoPanel();
        this.add(info, BorderLayout.SOUTH);
        
        
        //Sjekker at ikke offset kommer utenfor vindusStørrelsen
        if ( (yOffset * offsetTeller ) < 400) {
            offsetTeller++;
        } else {
            offsetTeller = 0;
        }
        this.setLocation(xOffset*offsetTeller, yOffset*offsetTeller);
        
    }    
    
    
    /**
     *
     * @param lån
     */

    protected void oppdaterAlleFelt(Loan lån) {
        this.setID(lån.getLåneNR());
        this.setBeløp(lån.getLånebeløp());
        this.setLøpetid(lån.getLøpetid());
        this.setRentesats(lån.getRentesats());
        this.låneTypeBox.setSelectedIndex(lån.getLånetype() - 1);
        
        int terminIndex = 0;
        if (lån.getÅrligeTerminer() == Loan.TERMIN_ÅRLIG) {
            terminIndex = 0;
        } else if (lån.getÅrligeTerminer() == Loan.TERMIN_HALVÅR) {
            terminIndex = 1;
        } else if (lån.getÅrligeTerminer() == Loan.TERMIN_KVARTAL) {
            terminIndex = 2;
        } else if (lån.getÅrligeTerminer() == Loan.TERMIN_ÅRLIG) {
            terminIndex = 3;
        }
        this.terminBox.setSelectedIndex(terminIndex);
    }
    
  /* **********************************************************************
   * get-metoder                                                          *
   * disse er protected, for de skal kun brukes av selve vinduet          *
   * programmet "lenger ute" trenger ikke å vite noe om hva som           *
   * befinner seg her inne...                                             *
   * **********************************************************************/

  
    /**
     *
     * @return
     */

    protected Loan getLån() { return lån; }
    
    /**
     *
     * @return
     */

    protected String getLåneID() { return txtLåneID.getText(); }
        
    /**
     *
     * @return
     */

    protected String getLånebeløp() { return txtLånebeløp.getText(); }
    
    /**
     *
     * @return
     */

    protected String getLøpetid() { return txtLøpeTid.getText();  }
    

    /**
     * returnerer en int. Bruker de samme konstantene fra Loan.java
     * Bryter kanskje litt med mvc ved at InterntVindu "har denne kunnskapen"?
     * Et alternativ er å lage en en String[] med tektsten til combo-boxen
     * i Loan.java, sende kun teksten videre herfra, og gjøre denne sjekken
     * i Loan.java i stedenfor her. Da vil jeg kunne endre ett sted, og
     * programmet vil fortsatt fungere. Nå må jeg sjekke både InterntVindu
     * og Loan hvis jeg f.eks. setter inn ett ekstra valg.
     *
     * @return
     */

    protected int getÅrligeTerminer() {
        int term = Loan.TERMIN_ÅRLIG;
        if (terminBox.getSelectedItem().equals("Halvår")) {
            term = Loan.TERMIN_HALVÅR;
        } else if (terminBox.getSelectedItem().equals("Kvartal")) {
            term = Loan.TERMIN_KVARTAL;
        } else if (terminBox.getSelectedItem().equals("Månedlig")) {
            term = Loan.TERMIN_MND;
        }
        return term;
    }
    
    /**
     *
     * @return
     */

    protected String getRentesats() { return txtRentesats.getText(); }
    
    /**
     *
     * @return
     */

    protected int getLånetype() {
        int value = Loan.TYPE_ANNUITET;
        if (låneTypeBox.getSelectedItem().equals("Seriell")) {
            value = Loan.TYPE_SERIELL;
        }
        return value;
    }
    
    /**
     *
     * @return
     */

    protected JTextArea getTxtInfo() { return txtInfo; }
    
    
   
  /* ************************************************************************
   * Set-metoder                                                            *
   * For å kunne sette inn verdier i txt-feltene                            *
   * Har to sett                                                            *
   *   - en med den faktiske typen, regner med at jeg kanskje trenger det   *
   *     fra databasen                                                      *
   *   - en som tar String, for å f.eks. blanke ut innholdet                *
   * ************************************************************************/

    
    /**
     *
     * @param id
     */

    protected void setID(int id) { txtLåneID.setText("" + id); }
    /**
     *
     * @param txt
     */

    protected void setID(String txt) { txtLåneID.setText(txt); }
    
    /**
     *
     * @param beløp
     */

    protected void setBeløp(int beløp) { txtLånebeløp.setText("" + beløp); }
    /**
     *
     * @param txt
     */

    protected void setBeløp(String txt) { txtLånebeløp.setText(txt); }
    
    /**
     *
     * @param tid
     */

    protected void setLøpetid(int tid) { txtLøpeTid.setText("" + tid); }
    /**
     *
     * @param txt
     */

    protected void setLøpetid(String txt) { txtLøpeTid.setText(txt); }
    
    /**
     *
     * @param rente
     */

    protected void setRentesats (double rente) {
        txtRentesats.setText("" + rente);
    }
    
    /**
     *
     * @param txt
     */

    protected void setRentesats (String txt) { txtRentesats.setText(txt); }
    
    /**
     *
     * @param txt
     */

    protected void setInfoTxt(String txt) { txtInfo.setText(txt); }
    /**
     *
     * @param farge
     */

    protected void setInfoTxt(Color farge) { txtInfo.setForeground(farge); }    
    
    
  /* ************************************************************************
   * En privat indre klasse for å opprette NordPanel                        *
   * Dette for å kunne plassere LabelPanel og ButtonPanel i                 *
   * forhold til hverandre med BorderLayout, men beholde                    *
   * hvert panels faktiske layout.                                          *
   * ************************************************************************/

    private class NordPanel extends JPanel {
        protected NordPanel() {
            this.setLayout(new BorderLayout());
            this.add(new LabelPanel(), BorderLayout.WEST);
            this.add(new ButtonPanel(), BorderLayout.EAST);
        }
    } //end NordPanel
    
    
  /* **************************************************************************
   * Privat indre klasse for å opprette panelet med labels, og tekstfelt      *
   * Inneholder hjelpemetoder for å opprette labels og tekstfelt              *
   * på hver sinde linjer for å få disse underhverandre.                      *
   * Har kombindert box-layout og flowlayout for å forhindre at               *
   * tekstfeltene "flyter" i GUIen, men at jeg likevel kan få plassert        *
   * feltene under hverandre. Har testet mange andre varianter som            *
   * GridLayout, GridBagLayout, GroupLayout, men alle ble litt overkomplisert *
   * og jeg mistet fort kontrollen over GUIen, derfor "forenklet" jeg det     *
   * det ved å gjøre det på måten jeg har gjort nedenfor.                     *
   * **************************************************************************/

    private class LabelPanel extends JPanel {
        //Brukes for størrelsene på labels
        private int x_size = 75;
        private int y_size = 40;
        
        
        private LabelPanel() {
            txtLåneID.setEditable(false);
            this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            lagNyLinje(new JLabel("låneID: "), txtLåneID);
            lagNyLinje(new JLabel("Lånebeløp: "), txtLånebeløp);
            lagNyLinjeMedBox
                (   new JLabel("Løpetid: "),
                    txtLøpeTid,
                    new JLabel("Terminer: "),
                    terminBox
                );
            
            lagNyLinjeMedBox
                (   new JLabel("Rentesats: "),
                    txtRentesats,
                    new JLabel("%"),
                    new JLabel("Type lån: "),
                    låneTypeBox
                );
            
            /* Legger til KeyListener slik at man kan trykke Enter i ett
             * tekst-felt for å beregne en plan.
             */

            if (lytter instanceof KeyListener) {
                txtLånebeløp.addKeyListener((KeyListener)lytter);
                txtLøpeTid.addKeyListener((KeyListener)lytter);
                txtRentesats.addKeyListener((KeyListener)lytter);
            }
            
        }
        
        
        //for å opprette både labels og textfield på en linje
        private JPanel lagNyLinje(JLabel label, JTextField txt) {
            JPanel tmp = new JPanel();
            label.setPreferredSize(new Dimension(x_size, y_size));
            tmp.setLayout(new FlowLayout(FlowLayout.LEFT));
            tmp.add(label);
            tmp.add(txt);
            add(tmp);
            
            return tmp;
        }

        
        private JPanel lagNyLinjeMedBox(JLabel label1,
                                        JTextField txt,
                                        JLabel label2,
                                        JLabel label3,
                                        JComboBox box) {
            JPanel tmp = new JPanel();
            label1.setPreferredSize(new Dimension(x_size, y_size));
            label2.setPreferredSize(new Dimension(40, y_size));
            tmp.setLayout(new FlowLayout(FlowLayout.LEFT));
            tmp.add(label1);
            tmp.add(txt);
            tmp.add(label2);
            tmp.add(label3);
            tmp.add(box);
            add(tmp);
            
            return tmp;
        }
        
        private JPanel lagNyLinjeMedBox(JLabel label1,
                                        JTextField txt,
                                        JLabel label2,
                                        JComboBox box) {
            JPanel tmp = new JPanel();
            label1.setPreferredSize(new Dimension(x_size, y_size));
            label2.setPreferredSize(new Dimension(105, y_size));
            tmp.setLayout(new FlowLayout(FlowLayout.LEFT));
            tmp.add(label1);
            tmp.add(txt);
            tmp.add(label2);
            tmp.add(box);
            add(tmp);
            
            return tmp;
        }
        
    } // end class LabelPanel
    
    
  /* **********************************************************************
   * En privat indre klasse for å opprette ButtonPanel                    *
   * **********************************************************************/

    private class ButtonPanel extends JPanel {
    
        private ButtonPanel() {
            this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            lagNyKnapp("Tøm innhold", "reset");
            lagNyKnapp("Lagre", "save");
            lagNyKnapp("Finn", "find");
            lagNyKnapp("Beregn plan", "beregn");
        }
        
         
        private JButton lagNyKnapp(String txt, String kommando) {
            JButton knapp = new JButton(txt);
            knapp.setActionCommand(kommando);
            knapp.addActionListener(lytter);
            add(knapp);
        
            return knapp;
        }
        

    } //end class ButtonPanel
    
    
    private class InfoPanel extends JPanel {
    
        private InfoPanel() {
            txtInfo.setEditable(false);
            txtInfo.setOpaque(false);

            this.add(txtInfo);
        }    
    }
    
    private class TablePanel extends JPanel {
        JTable tabell;
        
        private TablePanel( Loan lån ) {
            this.tabell = new JTable(lån);
            JScrollPane rullefelt = new JScrollPane(this.tabell);
            
            this.setLayout(new BorderLayout());
            this.add(rullefelt, BorderLayout.CENTER);
        }
        
    } //end class TablePanel
    
}

Kontaktinfo

Hilde Vestøl
98883064
hilde@vestol.net

kart