This repository has been archived on 2025-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
JRummikub/src/jrummikub/view/impl/View.java
Matthias Schiffer 9c553786f2 Reset settings panel selected tab
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@405 72836036-5685-4462-b002-a69064685172
2011-06-10 20:20:05 +02:00

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