Package kakuro.gui

Source Code of kakuro.gui.Gui

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();
    }
  }
}
TOP

Related Classes of kakuro.gui.Gui

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.