package kakuro.gui;
import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;
import java.util.List;
import javax.swing.*;
import javax.swing.table.*;
import kakuro.table.*;
import kakuro.gui.editor.ListSkeletonDialog;
import kakuro.gui.editor.SkeletonEditor;
import kakuro.server.IServer;
import kakuro.server.ISkeletonTable;
import kakuro.server.ServerException;
import kakuro.server.Session;
import kakuro.server.User;
/** Főképernyő. */
public class Gui extends GuiAncestor {
/** Szerver */
private IServer _server = null;
/** Kirakott tábla */
private Gametable _table = null;
/** Alsó debug táblázat panelje */
private JScrollPane _debug = null;
/** Maga a debug tábla */
private JTable _debugTable = null;
/** Gametable táblát tartalmazó panel */
private JPanel tablePanel = null;
/** Debug tábla modellje */
private DefaultTableModel _debugModel = null;
/** Tipp-panel */
private MessagePanel _messagePanel = null;
/** Háttérkép */
private Image _back1 = ImageFactory.getInstance().getImage(
"kakuro/stone.jpg");
/** Tippek mutatása */
private boolean showHints = true;
/** Debug infók mutatása, tábla igazi értékei */
private boolean showDebug = true;
/** Highscore panel mutatása a tippek helyett */
private boolean showHighscore = false;
private GuiAction aboutAction, exitAction, showHintsAction,
hideDebugAction, newSkeletonEditorAction, newAction, showHighscoreAction, loginAction, logoutAction, openAction, saveAction, registerAction;
/** A kétáállapotú actionök */
private GuiAction[] toggleActions = null;
/** Számláló panelje */
private TimeLabel timer = null;
/** Háttér-panel*/
private JPanel backgroundPanel = null;
/** A bejelentkezett felhasználó */
private User _user = null;
/** Bal oldali összefogó panel */
private JPanel leftPanel = null;
/** Highscore panel*/
private HighscorePanel _highscorePanel = null;
/** Session információ */
private Session _session = null;
/** Alap konstruktor. Kap egy referenciát a szerverre.
*
* @param server a szerver
* */
public Gui(IServer server) {
_server = server;
}
/** Belépés vendégként, névtelenül. */
private void loginAsGuest() {
try {
debug("Login canceled, logging in as Guest");
_frame.setTitle("Kakuro - playing as Guest");
_user = _server.login("Guest", "guestjelszo", this);
setRights();
_table.clear();
} catch (ServerException se) {
debug("Login as guest failed: "+se.getLocalizedMessage());
}
}
/** Toolbar ikonok engedélyezése és letiltása a felhasználó jogosultságai szerint. */
public void setRights() {
if (_user==null || _user.isGuest()) {
setButtons(new String[] {"Save", "Logout", "Open", "SkeletonEditor"}, false);
} else {
setButtons(new String[] {"Save", "Logout", "Open"}, true);
setButtons(new String[] {"SkeletonEditor"}, _user.isAdmin());
}
}
/** A kapott gombok engedélyezése vagy tiltása.
*
* @param list gombok neve
* @param flag ha true, akkor engedélyezés, ha false, akkor tiltás
* */
private void setButtons(String[] list, boolean flag) {
for (int i=0; i<list.length; i++)
((JButton)_buttonMap.get(list[i])).setEnabled(flag);
}
/**
* Frame összerakás. Meghívja a login-register-guest dialógust.
*
* @throws ServerException a szerver oldalról kapott exception-öket továbbdobja!
* @throws SQLException a szerver oldalról kapott exception-öket továbbdobja!
* */
public void init() throws ServerException, SQLException {
_frame = new JFrame("Kakuro");
_frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
_frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
_frame.setVisible(false);
_frame.dispose();
}
});
populate();
_frame.pack();
_frame.setExtendedState(Frame.MAXIMIZED_BOTH|_frame.getExtendedState());
_frame.setVisible(true);
int loginAnswer = GuiDialogs.askLoginRegisterGuest(_frame, this);
if (loginAnswer == 1) {
loginAction();
} else if (loginAnswer == 2) {
registerAction();
} else {
loginAsGuest();
}
}
/** Összeállítja az interfészt. Hátteret beállít, számláló, tipp és debug paneleket életre kelti. */
private void populate() {
backgroundPanel = new JPanel() {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
drawTile(g, this, _back1);
}
};
backgroundPanel.setBackground(Color.RED);
backgroundPanel.setLayout(new BorderLayout(0, 0));
_frame.getContentPane().add(backgroundPanel);
_table = new Gametable(this);
tablePanel = new JPanel();
tablePanel.setLayout(new SquareLayoutManager());
tablePanel.add(_table);
tablePanel.setOpaque(false);
backgroundPanel.add(tablePanel, BorderLayout.CENTER);
leftPanel = new JPanel();
leftPanel.setOpaque(false);
leftPanel.setLayout(new BorderLayout(5, 5));
timer = new TimeLabel();
TransparentPanel timerPanel = new TransparentPanel();
timerPanel.setMinimumSize(new Dimension(320, 80));
timerPanel.setMaximumSize(new Dimension(320, 80));
timerPanel.setPreferredSize(new Dimension(320, 80));
timerPanel.add(timer);
leftPanel.add(timerPanel, BorderLayout.NORTH);
//timer.start();
_messagePanel = new MessagePanel();
_messagePanel.init();
leftPanel.add(_messagePanel, BorderLayout.CENTER);
backgroundPanel.add(leftPanel, BorderLayout.WEST);
_debugModel = new DefaultTableModel(0, 1);
_debugTable = new JTable(_debugModel);
_debug = new JScrollPane(_debugTable);
backgroundPanel.add(_debug, BorderLayout.SOUTH);
_highscorePanel = new HighscorePanel();
_highscorePanel.init(_server, 0);
createActions();
createToolbar();
//createMenus();
_debug.setMinimumSize(new Dimension(480, 100));
_debug.setPreferredSize(new Dimension(480, 100));
_debug.setMaximumSize(new Dimension(1600, 100));
}
/** Debug üzenetet kiír alul a táblázatba, mindig a legelső sorba.
*
* @param s debug üzenet
* */
public void debug(String s) {
_debugModel.insertRow(0, new Object[] { s });
_debugModel.fireTableChanged(null);
}
/** Felső tipp beállítása
*
* @param s tipp
* */
public void setHint1(String s) {
if (showHints)
_messagePanel.setText1(s);
}
/** Alsó tipp beállítása
*
* @param s tipp
* */
public void setHint2(String s) {
if (showHints)
_messagePanel.setText2(s);
}
/** Tippek törlése */
public void clearHint() {
_messagePanel.setText1("");
_messagePanel.setText2("");
}
/** Menüsor összerakása. */
private void createMenus() {
_menubar = new JMenuBar() {
protected void paintComponent(Graphics g) {
drawTile(g, this, _back1);
super.paintComponent(g);
}
};
_menubar.setOpaque(false);
JMenu fileMenu = new JMenu("File");
loadIntoMenu(new Action[] { aboutAction, exitAction }, fileMenu);
fileMenu.setMnemonic(KeyEvent.VK_F);
_menubar.add(fileMenu);
JMenu editorMenu = new JMenu("Editor");
loadIntoMenu(new Action[] { newSkeletonEditorAction }, editorMenu);
fileMenu.setMnemonic(KeyEvent.VK_E);
_menubar.add(editorMenu);
_frame.setJMenuBar(_menubar);
}
/** Toolbar összerakása. */
protected void createToolbar() {
_toolbar = new JToolBar() {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//drawTile(g, this, _back2);
}
};
_toolbar.setOpaque(false);
_toolbar.setFloatable(false);
loadIntoToolbar(new GuiAction[] { registerAction, loginAction, newAction, openAction, saveAction, logoutAction });
_toolbar.addSeparator();
JToggleButton toggleButton = null;
for (int i = 0; i < toggleActions.length; i++) {
toggleButton = new JToggleButton(toggleActions[i]);
toggleButton.setOpaque(false);
toggleButton.setVerticalTextPosition(SwingConstants.BOTTOM);
toggleButton.setHorizontalTextPosition(SwingConstants.CENTER);
if (toggleButton.getIcon() != null) {
//toggleButton.setText("");
}
_toolbar.add(toggleButton);
_buttonMap.put(toggleActions[i].getDescription(), toggleButton);
}
_toolbar.addSeparator();
loadIntoToolbar(new GuiAction[] { newSkeletonEditorAction, aboutAction, exitAction });
backgroundPanel.add(_toolbar, BorderLayout.PAGE_START);
JToggleButton tb = (JToggleButton)_buttonMap.get("HideDebug");
tb.setSelected(true);
toggleHideDebugAction();
}
/** Toolbar és menü action-ök létrehozása. */
protected void createActions() {
aboutAction = new GuiAction("About", "about", "About action",
new Integer(KeyEvent.VK_A), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
aboutAction();
}
};
exitAction = new GuiAction("Exit", "close", "Exit action", new Integer(
KeyEvent.VK_Q), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
exitAction();
}
};
newSkeletonEditorAction = new GuiAction("SkeletonEditor", "new", "New Skeleton Editor", new Integer(
KeyEvent.VK_S), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
newSkeletonEditorAction();
}
};
newAction = new GuiAction("New Game", "newfile", "New Skeleton Game", new Integer(
KeyEvent.VK_N), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
newAction();
}
};
showHintsAction = new GuiAction("Hints", "tip",
"ShowHints action", new Integer(KeyEvent.VK_H), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
toggleShowHintsAction();
}
};
hideDebugAction = new GuiAction("HideDebug", "debug",
"HideDebug action", new Integer(KeyEvent.VK_D), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
toggleHideDebugAction();
}
};
showHighscoreAction = new GuiAction("Highscore", "trophy",
"ShowHighscore action", new Integer(KeyEvent.VK_S), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
toggleShowHighscoreAction();
}
};
toggleActions = new GuiAction[] { showHintsAction, hideDebugAction, showHighscoreAction };
loginAction = new GuiAction("Login", "login", "Login", new Integer(
KeyEvent.VK_L), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
loginAction();
}
};
registerAction = new GuiAction("Register", "register", "Register", new Integer(
KeyEvent.VK_R), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
registerAction();
}
};
logoutAction = new GuiAction("Logout", "logout", "Logout", new Integer(
KeyEvent.VK_X), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
logoutAction();
}
};
openAction = new GuiAction("Open", "open", "Open", new Integer(
KeyEvent.VK_O), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
openAction();
}
};
saveAction = new GuiAction("Save", "save", "Save", new Integer(
KeyEvent.VK_S), GuiAction.CTRL) {
public void actionPerformed(ActionEvent e) {
saveAction();
}
};
}
/** About menü megjelenítése */
protected void aboutAction() {
JOptionPane.showMessageDialog(_frame, "About menu, valami hosszu szoveggel!", "About",
JOptionPane.INFORMATION_MESSAGE);
}
/** Tippek ki és bekapcsolása */
protected void toggleShowHintsAction() {
showHints ^= true;
debug((showHints ? "Be" : "Ki") + "kapcsolta a tippek mutatasat!");
}
/** Be van kapcsolva a debug mód?
*
* @return debug mód állása
* */
boolean showDebugInfo() {
return showDebug;
}
/** Debug mód átállítása */
protected void toggleHideDebugAction() {
showDebug ^= true;
debug((showDebug ? "Be" : "Ki") + "kapcsolta a debug mutatasat!");
if (showDebug)
backgroundPanel.add(_debug, BorderLayout.SOUTH);
else
backgroundPanel.remove(_debug);
_frame.validate();
}
/** Highscore panek ki és bekapcsolása */
protected void toggleShowHighscoreAction() {
showHighscore ^= true;
debug((showHighscore ? "Be" : "Ki") + "kapcsolta a highscore mutatasat!");
if (showHighscore) {
_highscorePanel.init(_server, (_table==null||_table.getModel()==null?0:_table.getModel().getDifficulty()));
leftPanel.remove(_messagePanel);
leftPanel.add(_highscorePanel, BorderLayout.CENTER);
leftPanel.validate();
} else {
leftPanel.remove(_highscorePanel);
leftPanel.add(_messagePanel, BorderLayout.CENTER);
}
leftPanel.repaint();
}
/** Kilépés a programból. Az SQL shutdown hook természetesen a kilépés előtt lefut! */
protected void exitAction() {
System.exit(0);
}
/** Új skeleton szerkesztő ablak létrehozása, ha a felhasználó megfelelő jogokkal rendelkezik */
protected void newSkeletonEditorAction() {
debug("checking admin rights: "+(_user.isAdmin()?"user is admin, can edit skeletons":"user can't edit skeletons"));
if (!_user.isAdmin()) return;
SkeletonEditor editor = new SkeletonEditor(this);
editor.init();
editor.newSkeleton();
}
/** Szerver lekérése
*
* @return szerver
* */
public IServer getServer() {
return _server;
}
/** Session lekérése
*
* @return session
* */
public Session getSession() {
return _session;
}
/** Új, üres játék indítása. Lekéri a szervertől a lehetséges táblákat, érvényes választás után
* lecseréli a játékot az újra, és elindítja a számlálót. */
protected void newAction() {
List<ISkeletonTable> list = getServer().listSkeletonTables(false);
ListSkeletonDialog dialog = new ListSkeletonDialog(_frame, "Skeleton list", list);
dialog.setLocationRelativeTo(_frame);
dialog.setVisible(true);
if (dialog.isValid()) {
try {
ITable it = getServer().populateSkeleton(list.get(dialog.getSelection()));
_session = getServer().startNewGame(_user, it);
_table.load(_session.getTable());
_session.setTimeSpent(0);
debug("Start time is" + _session.getTimeSpent());
timer.stop();
timer.start();
} catch (TableException te) {
debug("New game creation failed: "+te.getLocalizedMessage());
}
}
}
/** Mentett állás betöltése. Újraindíjtja a számlálót. Ezt a funkciót tesztelésre lehet használni csak! */
public void load(ITable table) {
try {
_table.load(table);
timer.stop();
timer.start();
} catch (TableException te) {
debug("New game creation failed: "+te.getLocalizedMessage());
}
}
/** Felhasználó befejezte a táblát. */
public void setReady() {
timer.stop();
debug("Congratulation, the table is done !");
_session.setTimeSpent(timer.getTime());
_server.stopGame(_session);
HighscorePanel hs = new HighscorePanel();
hs.init(_server, _table.getModel().getDifficulty());
JOptionPane.showMessageDialog(_frame, hs, "Gratula!",
JOptionPane.PLAIN_MESSAGE);
JToggleButton tb = (JToggleButton)_buttonMap.get("Highscore");
if (!showHighscore) {
tb.setSelected(true);
toggleShowHighscoreAction();
}
}
/** Üzenet a felhasználónak egy sima MessageDialogban.
*
* @param m üzenet
* */
public void showMessage(String m) {
JOptionPane.showMessageDialog(_frame, m, "Uzenet", JOptionPane.PLAIN_MESSAGE);
}
/** Regisztálás action. Ha nem sikerül, névtelenként lép be. Jogok beállítja. */
protected void registerAction() {
try {
RegisterDialog regist = new RegisterDialog(_frame, "Register dialog yeah");
regist.setLocationRelativeTo(_frame);
regist.pack();
regist.setVisible(true);
if (regist.isValid()) {
String[] data = regist.getData();
_server.register(this, data[0], data[1], data[2], data[3], data[4]);
if (_server.getRegistSucces() == true){
_user = _server.login(data[2], data[3], this);
debug("Register attempt with [" + data[2] + "," + data[3] + "]");
_frame.setTitle("Kakuro - playing as " + data[2]);
}else{
loginAsGuest();
}
}else{
loginAsGuest();
}
} catch (Exception se) {
debug("Register failed with "+se.getLocalizedMessage());
loginAsGuest();
}
setRights();
}
/** Belépés action. Ha nem sikerül, névtelenként lép be. */
protected void loginAction() {
try {
LoginDialog login = new LoginDialog(_frame, "Login dialog yeah");
login.setLocationRelativeTo(_frame);
login.pack();
login.setVisible(true);
if (login.isValid()) {
String[] data = login.getData();
_user = _server.login(data[0], data[1], this);
if (_server.getLoginSucces() == true){
debug("Login attempt with [" + data[0] + "," + data[1] + "]");
_frame.setTitle("Kakuro - playing as " + data[0]);
}else{
loginAsGuest();
}
} else {
loginAsGuest();
}
} catch (ServerException se) {
debug("Login failed with "+se.getLocalizedMessage());
}
setRights();
_table.clear();
}
/** Felhasználó kilés action. Névtelenként lép be utána. */
protected void logoutAction() {
_session = null;
timer.stop();
_table.clear();
loginAsGuest();
}
/** Mentett állás megnyitása. */
protected void openAction() {
List<ITable> lista = getServer().listSavedGames(_user);
if (lista.size() != 0){
ListSavedGameDialog dialog = new ListSavedGameDialog(_frame, "Saved games list", lista);
dialog.setLocationRelativeTo(_frame);
dialog.setVisible(true);
if (dialog.isValid()) {
try {
ITable it = lista.get(dialog.getSelection());
_session = getServer().startLoadedGame(_user, it);
_table.load(_session.getTable());
timer.stop();
timer.start(_session.getTimeSpent());
System.out.println(_session.getTimeSpent());
} catch (TableException te) {
debug("New game creation failed: "+te.getLocalizedMessage());
}
}
}
}
/** Játékállás mentése */
protected void saveAction() {
try {
_session.setTimeSpent(timer.getTime());
getServer().saveGame(_session);
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
} catch (TableException e) {
e.printStackTrace();
}
}
}