// Copyright 2014 Robert Meolic
//
// Program prikazuje tvorjenje zahtevnejsega GUI
// Potrebuje JAVA 1.6 ali novejso

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

public class MojGUI3 {

  static JFrame chatOkno;
  static JPanel chatPlosca;
  static JLabel oznakaPoslusaj, oznakaPoslji;
  static JTextArea vnosPoslusaj, vnosPoslji;
  static JTextArea poslusajVSEBINA,posljiVSEBINA;
  static JButton startGumbek,stopGumbek,posljiGumbek;

  static boolean udpIsRunning = false; //za UDP Chat
  static DatagramSocket udpSocket; //za UDP Chat

  public static void main(String args[]) {

    Serviser serviser = new Serviser();

    chatOkno = new JFrame("UDP Chat");

    oznakaPoslusaj = new JLabel("Dohodna vrata:");
    vnosPoslusaj = new JTextArea(1,12);
    oznakaPoslji = new JLabel("Odhodna vrata:");
    vnosPoslji = new JTextArea(1,12);
    poslusajVSEBINA = new JTextArea(10,60);
    poslusajVSEBINA.setEditable(false);
    posljiVSEBINA = new JTextArea(10,60);

    startGumbek = new JButton("START");
    startGumbek.addActionListener(serviser);
    startGumbek.setActionCommand("start");

    stopGumbek = new JButton("STOP");
    stopGumbek.addActionListener(serviser);
    stopGumbek.setActionCommand("stop");

    posljiGumbek = new JButton("POVEJ");
    posljiGumbek.addActionListener(serviser);
    posljiGumbek.setActionCommand("povej");

    chatPlosca = new JPanel();
    GroupLayout chatLayout = new GroupLayout(chatPlosca);
    chatPlosca.setLayout(chatLayout);
    chatLayout.setAutoCreateGaps(true);
    chatLayout.setAutoCreateContainerGaps(true);

    // Pri GroupLayout podamo horizontalno in vertikalno razporeditev

    chatLayout.setHorizontalGroup(
      chatLayout.createParallelGroup()
        .addGroup(chatLayout.createSequentialGroup()
          .addComponent(oznakaPoslusaj)
          .addComponent(vnosPoslusaj)
          .addComponent(startGumbek)
          .addComponent(stopGumbek)
        )
        .addComponent(poslusajVSEBINA)
        .addComponent(posljiVSEBINA)
        .addGroup(chatLayout.createSequentialGroup()
          .addComponent(oznakaPoslji)
          .addComponent(vnosPoslji)
          .addComponent(posljiGumbek)
        )
    );

    chatLayout.setVerticalGroup(
      chatLayout.createSequentialGroup()
        .addGroup(chatLayout.createParallelGroup()
          .addComponent(oznakaPoslusaj)
          .addComponent(vnosPoslusaj)
          .addComponent(startGumbek)
          .addComponent(stopGumbek)
        )
        .addComponent(poslusajVSEBINA)
        .addComponent(posljiVSEBINA)
        .addGroup(chatLayout.createParallelGroup()
          .addComponent(oznakaPoslji)
          .addComponent(vnosPoslji)
          .addComponent(posljiGumbek)
        )
    );

    chatOkno.add(chatPlosca);
    chatOkno.pack();
    chatOkno.setVisible(true);
  }
}

class UDPServer implements Runnable {

  // predmeti, ki imajo "implements Runnable", imajo metodo run()
  // take objekte lahko uporabimo za tvorjenje nove niti
  // ko izvedemo nit.start(), se koda iz run() zacne izvajati
  // tvorjena nit se lahko sama konca ali pa tudi ne
  // ce se sama ne konca (npr. ker nekaj caka), jo moramo prekiniti
  // ponavadi (uporabite pri vaji) zadosca nit.interrupted()

  public void run() {
    System.out.println("STREZNIK UDP: START");
    try {
      DatagramPacket packet = new DatagramPacket(new byte[128], 128);
      MojGUI3.udpSocket = new DatagramSocket();
      MojGUI3.udpSocket.receive(packet);
      MojGUI3.udpSocket.close();
      MojGUI3.udpIsRunning = false;
    } catch (Exception e) {}
    System.out.println("STREZNIK UDP: STOP");
    // tukaj se konca run() in zato se tukaj konca tudi izvajanje niti
  }
}

class Serviser implements ActionListener {
    public void actionPerformed(ActionEvent ev) {
    if (ev.getActionCommand().equals("start")) {
       if (!MojGUI3.udpIsRunning) {
         new Thread(new UDPServer()).start(); //v novi niti pozenemo streznik UDP
         MojGUI3.udpIsRunning = true;
       }
    }
    if (ev.getActionCommand().equals("stop")) {
       if (MojGUI3.udpIsRunning) {
         MojGUI3.udpSocket.close(); //ko zapremo socket, se streznik UDP konca
         MojGUI3.udpIsRunning = false;
       }
    }
    if (ev.getActionCommand().equals("povej")) {
       String tekstVSEBINA = MojGUI3.posljiVSEBINA.getText();
       System.out.println("POSILJAM:\n"+tekstVSEBINA);
    }
  }
}
