//Titel:            Testbeispiel fuer das Design Pattern Singleton
//Version:          05.05.2013
//Copyright:        HS-Harz, FB AI
//Autor:            Dipl.-Inf.(TU) Dipl.-Ing.(FH) Michael Wilhelm
//Firma:            HS-Harz
//Beschreibung:     Static Erzeugung, getInstance, MDI Fenster


// einfaches Beispiel eines Internal Frame
// mit New einfügen
// Verwendet eine Singleton-Klasse als "globale Variable"
// Internes Fenster zur Demonstration des Singleton-Pattern
// Mit dem Schalter "Set" wird die Variable gesetzt
// er sollte dann in alle anderen Fenstern zu sehen sein
// das geht ueber den Schalter Check

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



public class Singleton6 extends JFrame {

  private JDesktopPane desktopPane = new JDesktopPane();

  private JTextField tGlobal;
  private JButton bnSetValue;

  private int anzFrames=0;

  

  JMenuBar menuBar1 = new JMenuBar();
  JMenu mainFile = new JMenu();
  JMenuItem mnNew = new JMenuItem();
  JMenuItem mnClose = new JMenuItem();

  public Singleton6() {
    this.setSize( 800, 600);
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    setGUI();
  }

  public void setGUI() {
    this.getContentPane().setLayout( new BorderLayout() );
//    this.setContentPane(desktopPane);

    tGlobal = new JTextField("");
    tGlobal.setFont(new java.awt.Font("Dialog", 0, 30));
    bnSetValue = new JButton("SetValue");
    JPanel panel1 = new JPanel();
    panel1.setLayout( new GridBagLayout() );
    panel1.add(bnSetValue, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,20,0,0), 0, 6));

    panel1.add(tGlobal,   new GridBagConstraints(1, 0, 3, 1, 1.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,20,0,20), 22, 6));

    this.getContentPane().add(panel1, BorderLayout.NORTH );
    this.getContentPane().add(desktopPane, BorderLayout.CENTER );

    bnSetValue.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        bnSetValue_click();  // !!!!!!
      }
    });

    desktopPane.setBackground(Color.red);
    setMenus();
  } // setGUI


  private  void setMenus() {
    // Menü Datei
    mainFile.setText("Datei");

    mnNew.setText("Neue Datei");
    mnNew.addActionListener(new ActionListener()  {

      public void actionPerformed(ActionEvent e) {
        mnNew_actionPerformed(e);
      }
    });
    mnNew.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
    mainFile.add(mnNew);



    // --------------------------
    mnClose.setText("Schließen");
    mnClose.addActionListener(new ActionListener()  {

      public void actionPerformed(ActionEvent e) {
        mnClose_actionPerformed(e);
      }
    });
    mainFile.add(mnClose);


    menuBar1.add(mainFile);
    this.setJMenuBar(menuBar1);
  } // setMenus



  void bnSetValue_click() {
    String s =tGlobal.getText();
    mySingleton Single = mySingleton.getInstance();
    Single.setValue( s );
  }

  void mnNew_actionPerformed(ActionEvent e) {
    MyInternalFrame frame = new MyInternalFrame();
    this.anzFrames++;
    frame.setBounds( this.anzFrames*80, this.anzFrames*80, 450, 200);
    desktopPane.add(frame, new Integer(1));
    frame.toFront();

  }

  void mnClose_actionPerformed(ActionEvent e) {
    System.exit(0);
  }


  static public void main(String[] args) {
    Singleton6 frame = new Singleton6();
    frame.setVisible(true);
  }

}  // Singleton6


// Internes Fenster zur Demonstration des Singleton-Pattern
// Mit dem Schalter "Set" wird die Variable gesetzt
// er sollte dann in alle anderen Fenstern zu sehen sein
// das geht ueber den Schalter Check
class MyInternalFrame extends JInternalFrame {

    // Label wird veraendet durch das Singleton
  JLabel jLabel1 = new JLabel("leer");


  public MyInternalFrame() {
    setGUI();
    setVisible(true);
  }

  public void setGUI() {
    this.setClosable(true);
    this.setIconifiable(true);
    this.setMaximizable(true);
    this.setResizable(true);
    this.getContentPane().setLayout(  new BorderLayout() );

    JToolBar toolBar = new JToolBar();
    JButton bnCheck = new JButton("Check");
    toolBar.add(bnCheck);
    bnCheck.setFont(new java.awt.Font("Dialog", 0, 30));


    bnCheck.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        bnCheck_click();  // !!!!!!
      }
    });


    this.getContentPane().add(toolBar, BorderLayout.NORTH);

    jLabel1.setFont(new java.awt.Font("Dialog", 0, 30));
    jLabel1.setFont(new java.awt.Font("Dialog", 0, 30));
    this.getContentPane().add(jLabel1, BorderLayout.CENTER);

  }

  void bnCheck_click() {
    mySingleton Single = mySingleton.getInstance();
    jLabel1.setText( Single.getValue() );
  }

}



class mySingleton {
    private static mySingleton instance = new mySingleton("noname");
    private String s;

    protected mySingleton(String s) {
      this.s = s;
    }

     // hiermit Thread sicher
    public static mySingleton getInstance(){
      return instance;
    }


    public String getValue() {
      return s;
    }
    public void setValue(String value) {
      s = value;
    }
}  // mySingleton

