package gui;
import gui.ComponentSwitcher.ComponentChoice;
import java.awt.Color;
import java.io.IOException;
import java.util.*;
import javax.swing.*;
import domain.IRCController;
/**
* Klasse GUIController.
* Is de Controller van alles wat er in de GUI gebeurt (Facade-pattern).
* Alle communicatie naar de GUI toe loopt via de GUIController.
* Is ook een observer (Observerpattern).
* @author Maarten Minnebo, David Covemaeker, Tim Van Thuyne, Toon Kin
*/
public class GUIController implements Observer
{
private IRCController ircController;
private MainFrame mainFrame;
private String startChannel;
private IRCScherm tabs;
private Color bgc;
private Color bgcl;
/**
* Is de constructor van de klasse.
* Zal de IRCController aanmaken en het MainFrame.
* Zet ook het MainFrame in de LaadScherm - modus
*/
public GUIController()
{
initIrcController();
mainFrame = new MainFrame(this);
bgc = new Color(239, 228, 176);
bgcl = new Color(250, 240, 210);
UIManager.put("TabbedPane.selected", bgc);
UIManager.put("TabbedPane.borderHightlightColor", bgc);
UIManager.put("TabbedPane.contentAreaColor", bgc);
UIManager.put("TabbedPane.background", bgcl);
UIManager.put("TabbedPane.focus", bgc);
UIManager.put("TabbedPane.darkShadow", Color.WHITE);
mainFrame.switchToComponent(this, ComponentChoice.WelcomeScherm);
}
/**
* Functie wordt opgeroepen door GUIController.
* Zal de IRCController aanmaken.
* Zal de GUIController (this) inschrijven als observer bij de IRCController
*/
public void initIrcController()
{
ircController = new IRCController(this);
ircController.addObserver(this);
}
/**
* Overridefunctie van de update()-functie van de observer
* Zal aangeroepen worden wanneer door het Subject wanneer die gewijzigd is.
* Deze functie zal doen een extra tab openen op het scherm.
* Wanneer er nog geen tabs voor handen zijn zal hij eerst het mainFrame in modus 'IRCScherm' zetten.
*/
@Override
public void update(Observable o, Object arg)
{
if(tabs == null)
{
mainFrame.switchToComponent(this, ComponentChoice.IRCScherm);
tabs = (IRCScherm) mainFrame.getContentPane();
tabs.addNewChannelTab(startChannel);
}
else
{
tabs.addTab((String) arg, new Tab(ircController, (String) arg));
}
}
/**
* Functie die de gegevens uit de GUI zal doorsturen naar de IRCController om connectie te maken met de server.
* @param server URL van de gewenste IRC-server
* @param port Poortnummer van de gewenste poort om te communiceren
* @param channel Naam van het kanaal (String) waarop men wil intekenen
* @param nick Nickname (String) van de gebuiker
* @return boolean false wanneer connectie mislukt, boolean true wanneer geslaagd.
*/
protected boolean submitData(String server, int port, String channel, String nick)
{
boolean connected = false;
try
{
connected = ircController.connect(server, nick, port);
startChannel = channel;
return connected;
}
catch (IOException e)
{
JOptionPane.showMessageDialog(mainFrame.getContentPane(), "Verbinding met IRC server is mislukt.", "Netwerkfout", JOptionPane.ERROR_MESSAGE);
}
return connected;
}
/**
* Functie die de IRCController zal aanroepen om de verbinding te verbreken
*/
protected void disconnect()
{
try
{
ircController.disconnect();
}
catch(IOException ioe)
{
JOptionPane.showMessageDialog(mainFrame.getContentPane(), "Er was een fout bij het verbreken van de verbinding.", "Verbindingsfout", JOptionPane.ERROR_MESSAGE);
}
}
/**
* Functie de IRCController teruggeeft ('getter')
* @return
*/
protected IRCController getIrcController()
{
return ircController;
}
/**
* Functie die de MainFrame teruggeeft. ('getter')
* @return
*/
public MainFrame getMainFrame()
{
return mainFrame;
}
}