package com.esir.sr.sweetsnake.gui; import java.awt.Dimension; import java.awt.Frame; import java.awt.Image; import java.awt.Toolkit; import java.util.LinkedList; import java.util.List; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.swing.JFrame; import javax.swing.SwingUtilities; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.esir.sr.sweetsnake.api.IGuiForServer; import com.esir.sr.sweetsnake.constants.ServerGuiConstants; import com.esir.sr.sweetsnake.dto.GameRequestDTO; import com.esir.sr.sweetsnake.dto.GameSessionDTO; import com.esir.sr.sweetsnake.dto.PlayerDTO; import com.esir.sr.sweetsnake.view.AbstractView; import com.esir.sr.sweetsnake.view.MainView; import com.esir.sr.sweetsnake.view.PlayersView; import com.esir.sr.sweetsnake.view.RequestsView; import com.esir.sr.sweetsnake.view.SessionsView; import com.esir.sr.sweetsnake.view.StatusView; /** * * @author Herminaƫl Rougier * @author Damien Jouanno * */ @Component public class ServerGui extends JFrame implements IGuiForServer { // public static void main(final String[] args) { // @SuppressWarnings("resource") // final ClassPathXmlApplicationContext context = new // ClassPathXmlApplicationContext("classpath*:spring/sweetsnake-server-gui-context.xml"); // context.registerShutdownHook(); // } /********************************************************************************************** * [BLOCK] STATIC FIELDS **********************************************************************************************/ /** The serial version UID */ private static final long serialVersionUID = -2931754540991928946L; /** The logger */ private static final Logger log = LoggerFactory.getLogger(ServerGui.class); /********************************************************************************************** * [BLOCK] FIELDS **********************************************************************************************/ /** The main view */ @Autowired private MainView mainView; /** The status view */ @Autowired private StatusView statusView; /** The players view */ @Autowired private PlayersView playersView; /** The sessions view */ @Autowired private SessionsView sessionsView; /** The requests view */ @Autowired private RequestsView requestsView; /** The current view */ private AbstractView currentView; /********************************************************************************************** * [BLOCK] CONSTRUCTOR & INIT **********************************************************************************************/ /** * */ protected ServerGui() { super(); } /** * */ @PostConstruct protected void init() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { log.info("Initializing the Server GUI"); initFrameParameters(); serverStarted(); } }); } /** * */ @PreDestroy protected void destroy() { log.info("Destroying the Server GUI"); } /********************************************************************************************** * [BLOCK] PRIVATE METHODS **********************************************************************************************/ /** * */ private void initFrameParameters() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("SweetSnake Server"); final Image icon = Toolkit.getDefaultToolkit().getImage(ServerGui.class.getResource(ServerGuiConstants.ICON_PATH)); setIconImage(icon); final Dimension dimension = new Dimension(ServerGuiConstants.GUI_WIDTH, ServerGuiConstants.GUI_HEIGHT); setSize(dimension); setPreferredSize(dimension); setExtendedState(Frame.MAXIMIZED_BOTH); pack(); setVisible(true); } /** * * @param view * @param unbuildPrevious */ private void switchView(final AbstractView view, final boolean unbuildPrevious) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { if (currentView != null && unbuildPrevious) { currentView.unbuild(); } view.build(); getContentPane().removeAll(); getContentPane().add(view); refreshUI(); currentView = view; } }); } /********************************************************************************************** * [BLOCK] PUBLIC IMPLEMENTED METHODS **********************************************************************************************/ /* * (non-Javadoc) * * @see com.esir.sr.sweetsnake.api.IServerGui#serverLaunched() */ @Override public void serverStarted() { switchView(mainView, true); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { statusView.disableStartBTN(); statusView.enableStopBTN(); statusView.startTimer(); playersView.refreshPlayers(new LinkedList<PlayerDTO>()); sessionsView.refreshSessions(new LinkedList<GameSessionDTO>()); requestsView.refreshRequests(new LinkedList<GameRequestDTO>()); } }); } /* * (non-Javadoc) * * @see com.esir.sr.sweetsnake.api.IServerGui#serverStopped() */ @Override public void serverStopped() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { statusView.stopTimer(); statusView.disableStopBTN(); statusView.enableStartBTN(); } }); } /* * (non-Javadoc) * * @see com.esir.sr.sweetsnake.api.IServerGui#refreshPlayers(java.util.List) */ @Override public void refreshPlayers(final List<PlayerDTO> players) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { playersView.refreshPlayers(players); refreshUI(); } }); } /* * (non-Javadoc) * * @see com.esir.sr.sweetsnake.api.IServerGui#refreshSessions(java.util.List) */ @Override public void refreshSessions(final List<GameSessionDTO> sessions) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { sessionsView.refreshSessions(sessions); refreshUI(); } }); } /* * (non-Javadoc) * * @see com.esir.sr.sweetsnake.api.IServerGui#refreshRequests(java.util.List) */ @Override public void refreshRequests(final List<GameRequestDTO> requests) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { requestsView.refreshRequests(requests); refreshUI(); } }); } /********************************************************************************************** * [BLOCK] PUBLIC METHODS **********************************************************************************************/ /** * */ public void refreshUI() { revalidate(); repaint(); } }