git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@405 72836036-5685-4462-b002-a69064685172
467 lines
12 KiB
Java
467 lines
12 KiB
Java
package jrummikub.view.impl;
|
|
|
|
import java.awt.Color;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.ActionListener;
|
|
import java.awt.event.ComponentAdapter;
|
|
import java.awt.event.ComponentEvent;
|
|
import java.io.File;
|
|
import java.util.Arrays;
|
|
import java.util.Collection;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
import javax.swing.JFileChooser;
|
|
import javax.swing.JFrame;
|
|
import javax.swing.JLayeredPane;
|
|
import javax.swing.JMenu;
|
|
import javax.swing.JMenuBar;
|
|
import javax.swing.JMenuItem;
|
|
import javax.swing.JPanel;
|
|
import javax.swing.border.MatteBorder;
|
|
import javax.swing.filechooser.FileNameExtensionFilter;
|
|
|
|
import jrummikub.model.Position;
|
|
import jrummikub.model.Stone;
|
|
import jrummikub.model.StoneColor;
|
|
import jrummikub.model.StoneSet;
|
|
import jrummikub.util.Event;
|
|
import jrummikub.util.Event1;
|
|
import jrummikub.util.IEvent;
|
|
import jrummikub.util.IEvent1;
|
|
import jrummikub.util.IListener;
|
|
import jrummikub.util.Pair;
|
|
import jrummikub.view.IHandPanel;
|
|
import jrummikub.view.ILoginPanel;
|
|
import jrummikub.view.IPlayerPanel;
|
|
import jrummikub.view.IScorePanel;
|
|
import jrummikub.view.ISettingsPanel;
|
|
import jrummikub.view.ITablePanel;
|
|
import jrummikub.view.IView;
|
|
|
|
/**
|
|
* Implementation of the top-level view interface
|
|
*/
|
|
@SuppressWarnings("serial")
|
|
public class View extends JFrame implements IView {
|
|
private final static float PLAYER_PANEL_RATIO = 0.14f;
|
|
private final static int PLAYER_PANEL_BORDER_WIDTH = 1;
|
|
private final static int PLAYER_PANEL_MAX_HEIGHT = 180 + PLAYER_PANEL_BORDER_WIDTH;
|
|
|
|
private JLayeredPane layeredPane;
|
|
private JPanel mainLayer;
|
|
private JMenuBar menuBar;
|
|
|
|
private TablePanel table;
|
|
private PlayerPanel playerPanel;
|
|
private StartTurnPanel startTurnPanel;
|
|
private PausePanel pausePanel;
|
|
private WinPanel winPanel;
|
|
private SettingsPanel settingsPanel;
|
|
private LoginPanel loginPanel;
|
|
private ScorePanel scorePanel;
|
|
|
|
private BottomPanelType bottomPanelType;
|
|
|
|
private JFileChooser chooser;
|
|
|
|
private Event menuNewGameEvent = new Event();
|
|
private Event menuQuitEvent = new Event();
|
|
|
|
private Event networkGameEvent = new Event();
|
|
private Event1<File> loadEvent = new Event1<File>();
|
|
private Event1<File> saveEvent = new Event1<File>();
|
|
|
|
private static int even(double d) {
|
|
return 2 * (int) (d / 2);
|
|
}
|
|
|
|
@Override
|
|
public ISettingsPanel getSettingsPanel() {
|
|
return settingsPanel;
|
|
}
|
|
|
|
@Override
|
|
public ILoginPanel getLoginPanel() {
|
|
return loginPanel;
|
|
}
|
|
|
|
@Override
|
|
public IScorePanel getScorePanel() {
|
|
return scorePanel;
|
|
}
|
|
|
|
@Override
|
|
public ITablePanel getTablePanel() {
|
|
return table;
|
|
}
|
|
|
|
@Override
|
|
public IHandPanel getHandPanel() {
|
|
return playerPanel.getHandPanel();
|
|
}
|
|
|
|
@Override
|
|
public IPlayerPanel getPlayerPanel() {
|
|
return playerPanel;
|
|
}
|
|
|
|
@Override
|
|
public IEvent getMenuNewGameEvent() {
|
|
return menuNewGameEvent;
|
|
}
|
|
|
|
@Override
|
|
public IEvent getMenuQuitEvent() {
|
|
return menuQuitEvent;
|
|
}
|
|
|
|
@Override
|
|
public IEvent1<File> getLoadEvent() {
|
|
return loadEvent;
|
|
}
|
|
|
|
@Override
|
|
public IEvent1<File> getSaveEvent() {
|
|
return saveEvent;
|
|
}
|
|
|
|
@Override
|
|
public IEvent getPauseEvent() {
|
|
return playerPanel.getPauseEvent();
|
|
}
|
|
|
|
@Override
|
|
public IEvent getEndPauseEvent() {
|
|
return pausePanel.getEndPauseEvent();
|
|
}
|
|
|
|
@Override
|
|
public IEvent getNetworkGameEvent() {
|
|
return networkGameEvent;
|
|
}
|
|
|
|
@Override
|
|
public void clearView() {
|
|
showScorePanel(false);
|
|
showSettingsPanel(false);
|
|
showLoginPanel(false);
|
|
getHandPanel().setStones(Collections.<Pair<Stone, Position>> emptyList());
|
|
getTablePanel().setStoneSets(
|
|
Collections.<Pair<StoneSet, Position>> emptyList());
|
|
setSelectedStones(Collections.<Stone> emptyList());
|
|
}
|
|
|
|
private void createFileChooser() {
|
|
chooser = new JFileChooser();
|
|
FileNameExtensionFilter filter = new FileNameExtensionFilter(
|
|
"JRummikub-Spiele", "rum");
|
|
chooser.setFileFilter(filter);
|
|
}
|
|
|
|
private void createMenuBar() {
|
|
menuBar = new JMenuBar();
|
|
|
|
JMenu gameMenu = new JMenu("Spiel");
|
|
menuBar.add(gameMenu);
|
|
|
|
gameMenu.add(createMenuItem("Neu", menuNewGameEvent));
|
|
gameMenu.add(createMenuItem("Netzwerkspiel...", networkGameEvent));
|
|
|
|
gameMenu.addSeparator();
|
|
|
|
JMenuItem loadItem = new JMenuItem("Laden...");
|
|
loadItem.addActionListener(new ActionListener() {
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
load();
|
|
}
|
|
});
|
|
gameMenu.add(loadItem);
|
|
JMenuItem saveItem = new JMenuItem("Speichern...");
|
|
saveItem.addActionListener(new ActionListener() {
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
save();
|
|
}
|
|
});
|
|
gameMenu.add(saveItem);
|
|
|
|
gameMenu.addSeparator();
|
|
|
|
gameMenu.add(createMenuItem("Beenden", menuQuitEvent));
|
|
|
|
setJMenuBar(menuBar);
|
|
}
|
|
|
|
private JMenuItem createMenuItem(String text, final Event event) {
|
|
JMenuItem item = new JMenuItem(text);
|
|
item.addActionListener(new ActionListener() {
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
event.emit();
|
|
}
|
|
});
|
|
return item;
|
|
}
|
|
|
|
private void load() {
|
|
int returnVal = chooser.showOpenDialog(View.this);
|
|
if (returnVal == JFileChooser.APPROVE_OPTION) {
|
|
loadEvent.emit(chooser.getSelectedFile());
|
|
}
|
|
}
|
|
|
|
private void save() {
|
|
int returnVal = chooser.showSaveDialog(View.this);
|
|
if (returnVal == JFileChooser.APPROVE_OPTION) {
|
|
saveEvent.emit(chooser.getSelectedFile());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create a new instance of the view
|
|
*/
|
|
public View() {
|
|
super("JRummikub");
|
|
setLayout(null);
|
|
|
|
setSize(1000, 700);
|
|
setDefaultCloseOperation(EXIT_ON_CLOSE);
|
|
|
|
createFileChooser();
|
|
createMenuBar();
|
|
|
|
layeredPane = new JLayeredPane();
|
|
layeredPane.setLayout(null);
|
|
add(layeredPane);
|
|
|
|
createMainLayer();
|
|
|
|
createSettingsPanel();
|
|
|
|
layeredPane.setLayer(settingsPanel, JLayeredPane.POPUP_LAYER);
|
|
layeredPane.add(settingsPanel);
|
|
|
|
loginPanel = new LoginPanel();
|
|
loginPanel.setVisible(false);
|
|
|
|
layeredPane.setLayer(loginPanel, JLayeredPane.POPUP_LAYER);
|
|
layeredPane.add(loginPanel);
|
|
|
|
scorePanel = new ScorePanel();
|
|
scorePanel.setVisible(false);
|
|
layeredPane.setLayer(scorePanel, JLayeredPane.POPUP_LAYER);
|
|
layeredPane.add(scorePanel);
|
|
|
|
addComponentListener(new ComponentAdapter() {
|
|
@Override
|
|
public void componentResized(ComponentEvent e) {
|
|
rescale();
|
|
}
|
|
});
|
|
|
|
setVisible(true);
|
|
}
|
|
|
|
private void createSettingsPanel() {
|
|
settingsPanel = new SettingsPanel();
|
|
settingsPanel.setVisible(false);
|
|
|
|
settingsPanel.getNetworkGameEvent().add(new IListener() {
|
|
@Override
|
|
public void handle() {
|
|
networkGameEvent.emit();
|
|
}
|
|
});
|
|
settingsPanel.getLoadGameEvent().add(new IListener() {
|
|
@Override
|
|
public void handle() {
|
|
load();
|
|
}
|
|
});
|
|
}
|
|
|
|
private void createMainLayer() {
|
|
mainLayer = new JPanel();
|
|
mainLayer.setLayout(null);
|
|
layeredPane.add(mainLayer);
|
|
|
|
table = new TablePanel();
|
|
mainLayer.add(table);
|
|
|
|
playerPanel = new PlayerPanel();
|
|
playerPanel.setBorder(new MatteBorder(PLAYER_PANEL_BORDER_WIDTH, 0, 0, 0,
|
|
Color.BLACK));
|
|
mainLayer.add(playerPanel);
|
|
|
|
startTurnPanel = new StartTurnPanel();
|
|
startTurnPanel.setVisible(false);
|
|
mainLayer.add(startTurnPanel);
|
|
|
|
pausePanel = new PausePanel();
|
|
pausePanel.setVisible(false);
|
|
mainLayer.add(pausePanel);
|
|
|
|
winPanel = new WinPanel();
|
|
winPanel.setVisible(false);
|
|
mainLayer.add(winPanel);
|
|
}
|
|
|
|
@Override
|
|
public void enablePauseMode(boolean enable) {
|
|
table.enablePauseMode(enable);
|
|
|
|
doSetBottomPanel(enable ? null : bottomPanelType);
|
|
pausePanel.setVisible(enable);
|
|
}
|
|
|
|
private void rescale() {
|
|
int width = getContentPane().getWidth(), height = getContentPane()
|
|
.getHeight();
|
|
|
|
layeredPane.setBounds(0, 0, width, height);
|
|
mainLayer.setBounds(0, 0, width, height);
|
|
|
|
int playerPanelHeight = even(Math.pow((double) width * width * height,
|
|
1 / 3.0) * PLAYER_PANEL_RATIO)
|
|
+ PLAYER_PANEL_BORDER_WIDTH;
|
|
if (playerPanelHeight > PLAYER_PANEL_MAX_HEIGHT)
|
|
playerPanelHeight = PLAYER_PANEL_MAX_HEIGHT;
|
|
|
|
int tableHeight = height - playerPanelHeight;
|
|
|
|
table.setBounds(0, 0, width, tableHeight);
|
|
table.validate();
|
|
playerPanel.setBounds(0, tableHeight, width, playerPanelHeight);
|
|
startTurnPanel.setBounds(0, tableHeight, width, playerPanelHeight);
|
|
pausePanel.setBounds(0, tableHeight, width, playerPanelHeight);
|
|
winPanel.setBounds(0, tableHeight, width, playerPanelHeight);
|
|
settingsPanel.setBounds(width / 4, height / 4, width / 2, height / 2);
|
|
scorePanel.setBounds(width / 8, height / 4, width * 3 / 4, height / 2);
|
|
loginPanel.setBounds(width / 3, height / 3, width / 3, height / 3);
|
|
}
|
|
|
|
@Override
|
|
public void setSelectedStones(Collection<Stone> stones) {
|
|
table.setSelectedStones(stones);
|
|
playerPanel.getHandPanel().setSelectedStones(stones);
|
|
}
|
|
|
|
@Override
|
|
public void showSettingsPanel(boolean show) {
|
|
if (show) {
|
|
settingsPanel.resetTabbedPane();
|
|
}
|
|
|
|
settingsPanel.setVisible(show);
|
|
}
|
|
|
|
@Override
|
|
public void showLoginPanel(boolean show) {
|
|
loginPanel.setVisible(show);
|
|
}
|
|
|
|
@Override
|
|
public void showScorePanel(boolean show) {
|
|
scorePanel.setVisible(show);
|
|
}
|
|
|
|
@Override
|
|
public void setCurrentPlayerName(String playerName) {
|
|
playerPanel.setCurrentPlayerName(playerName);
|
|
startTurnPanel.setCurrentPlayerName(playerName);
|
|
pausePanel.setCurrentPlayerName(playerName);
|
|
}
|
|
|
|
@Override
|
|
public void setCurrentPlayerColor(Color color) {
|
|
playerPanel.setCurrentPlayerColor(color);
|
|
}
|
|
|
|
@Override
|
|
public void setCurrentPlayerHasLaidOut(boolean hasLaidOut) {
|
|
playerPanel.setHasLaidOut(hasLaidOut);
|
|
}
|
|
|
|
@Override
|
|
public IEvent getStartTurnEvent() {
|
|
return startTurnPanel.getStartTurnEvent();
|
|
}
|
|
|
|
@Override
|
|
public IEvent getNewRoundEvent() {
|
|
return winPanel.getNewRoundEvent();
|
|
}
|
|
|
|
@Override
|
|
public IEvent getNewGameEvent() {
|
|
return winPanel.getNewGameEvent();
|
|
}
|
|
|
|
@Override
|
|
public IEvent getEndProgramEvent() {
|
|
return winPanel.getEndProgramEvent();
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
private List<Pair<Stone, Position>> createDecorationStones() {
|
|
Pair<Stone, Position> stoneJ = new Pair<Stone, Position>(new Stone(-'J',
|
|
StoneColor.BLACK), new Position(2.5f, 0));
|
|
Pair<Stone, Position> stoneR = new Pair<Stone, Position>(new Stone(-'R',
|
|
StoneColor.ORANGE), new Position(3.5f, 0));
|
|
Pair<Stone, Position> stoneu1 = new Pair<Stone, Position>(new Stone(-'u',
|
|
StoneColor.BLUE), new Position(4.5f, 0));
|
|
Pair<Stone, Position> stonem1 = new Pair<Stone, Position>(new Stone(-'m',
|
|
StoneColor.RED), new Position(5.5f, 0));
|
|
Pair<Stone, Position> stonem2 = new Pair<Stone, Position>(new Stone(-'m',
|
|
StoneColor.GREEN), new Position(6.5f, 0));
|
|
Pair<Stone, Position> stonei = new Pair<Stone, Position>(new Stone(-'i',
|
|
StoneColor.VIOLET), new Position(7.5f, 0));
|
|
Pair<Stone, Position> stonek = new Pair<Stone, Position>(new Stone(-'k',
|
|
StoneColor.AQUA), new Position(8.5f, 0));
|
|
Pair<Stone, Position> stoneu2 = new Pair<Stone, Position>(new Stone(-'u',
|
|
StoneColor.GRAY), new Position(9.5f, 0));
|
|
Pair<Stone, Position> stoneb = new Pair<Stone, Position>(new Stone(-'b',
|
|
StoneColor.BLACK), new Position(10.5f, 0));
|
|
|
|
Pair<Stone, Position> stone1 = new Pair<Stone, Position>(new Stone(
|
|
StoneColor.RED), new Position(2, 1));
|
|
Pair<Stone, Position> stone2 = new Pair<Stone, Position>(new Stone(13,
|
|
StoneColor.BLACK), new Position(5, 1));
|
|
Pair<Stone, Position> stone3 = new Pair<Stone, Position>(new Stone(13,
|
|
StoneColor.ORANGE), new Position(6, 1));
|
|
Pair<Stone, Position> stone4 = new Pair<Stone, Position>(new Stone(13,
|
|
StoneColor.BLUE), new Position(7, 1));
|
|
Pair<Stone, Position> stone5 = new Pair<Stone, Position>(new Stone(13,
|
|
StoneColor.RED), new Position(8, 1));
|
|
Pair<Stone, Position> stone6 = new Pair<Stone, Position>(new Stone(
|
|
StoneColor.BLACK), new Position(11, 1));
|
|
|
|
return Arrays
|
|
.asList(stoneJ, stoneR, stoneu1, stonem1, stonem2, stonei, stonek,
|
|
stoneu2, stoneb, stone1, stone2, stone3, stone4, stone5, stone6);
|
|
}
|
|
|
|
@Override
|
|
public void setBottomPanel(BottomPanelType type) {
|
|
bottomPanelType = type;
|
|
|
|
doSetBottomPanel(type);
|
|
}
|
|
|
|
private void doSetBottomPanel(BottomPanelType type) {
|
|
startTurnPanel.setVisible(type == BottomPanelType.START_TURN_PANEL);
|
|
winPanel.setVisible(type == BottomPanelType.WIN_PANEL);
|
|
playerPanel.setVisible(type != BottomPanelType.START_TURN_PANEL
|
|
&& type != BottomPanelType.WIN_PANEL && type != null);
|
|
|
|
if (type == BottomPanelType.START_GAME_PANEL) {
|
|
table.setStoneSets(Collections.<Pair<StoneSet, Position>> emptyList());
|
|
playerPanel.getHandPanel().setStones(createDecorationStones());
|
|
}
|
|
|
|
playerPanel.showButtons(type != BottomPanelType.START_GAME_PANEL);
|
|
playerPanel.enableButtons(type != BottomPanelType.COMPUTER_HAND_PANEL);
|
|
}
|
|
}
|