From 12a0686cb3fa183aa8e4829ad4cab25798bc7cf5 Mon Sep 17 00:00:00 2001 From: Pacien TRAN-GIRARD Date: Mon, 3 Mar 2014 19:27:27 +0100 Subject: Add web interface and clean project dir --- src/esieequest/Main.java | 22 +- src/esieequest/controller/GameEngine.java | 17 +- src/esieequest/controller/Interpreter.java | 6 +- src/esieequest/controller/Parser.java | 19 +- src/esieequest/controller/Performer.java | 25 +- src/esieequest/controller/package-info.java | 8 - src/esieequest/esieequest.gwt.xml | 35 +++ src/esieequest/model/Game.java | 9 +- src/esieequest/model/command/package-info.java | 8 - src/esieequest/model/package-info.java | 8 - src/esieequest/package-info.java | 11 - src/esieequest/view/Applet.java | 27 -- src/esieequest/view/Console.java | 61 ---- src/esieequest/view/UserInterface.java | 247 ----------------- src/esieequest/view/View.java | 16 +- src/esieequest/view/Window.java | 35 --- src/esieequest/view/app/Applet.java | 27 ++ src/esieequest/view/app/UserInterface.java | 263 ++++++++++++++++++ src/esieequest/view/app/Window.java | 35 +++ src/esieequest/view/console/Console.java | 59 ++++ src/esieequest/view/package-info.java | 8 - src/esieequest/view/web/Main.java | 18 ++ src/esieequest/view/web/WebInterface.java | 123 ++++++++ src/esieequest/view/web/WebInterface.ui.xml | 97 +++++++ .../nikiroo/utils/gui/JBackgroundPanel.java | 308 --------------------- 25 files changed, 707 insertions(+), 785 deletions(-) delete mode 100644 src/esieequest/controller/package-info.java create mode 100644 src/esieequest/esieequest.gwt.xml delete mode 100644 src/esieequest/model/command/package-info.java delete mode 100644 src/esieequest/model/package-info.java delete mode 100644 src/esieequest/package-info.java delete mode 100644 src/esieequest/view/Applet.java delete mode 100644 src/esieequest/view/Console.java delete mode 100644 src/esieequest/view/UserInterface.java delete mode 100644 src/esieequest/view/Window.java create mode 100644 src/esieequest/view/app/Applet.java create mode 100644 src/esieequest/view/app/UserInterface.java create mode 100644 src/esieequest/view/app/Window.java create mode 100644 src/esieequest/view/console/Console.java delete mode 100644 src/esieequest/view/package-info.java create mode 100644 src/esieequest/view/web/Main.java create mode 100644 src/esieequest/view/web/WebInterface.java create mode 100644 src/esieequest/view/web/WebInterface.ui.xml delete mode 100644 src/net/homelinux/nikiroo/utils/gui/JBackgroundPanel.java (limited to 'src') diff --git a/src/esieequest/Main.java b/src/esieequest/Main.java index add0fb1..5a08f1d 100755 --- a/src/esieequest/Main.java +++ b/src/esieequest/Main.java @@ -1,13 +1,15 @@ package esieequest; +import java.util.Arrays; + import javax.swing.JApplet; import esieequest.controller.GameEngine; import esieequest.model.Game; -import esieequest.view.Applet; -import esieequest.view.Console; import esieequest.view.View; -import esieequest.view.Window; +import esieequest.view.app.Applet; +import esieequest.view.app.Window; +import esieequest.view.console.Console; /** * This class instantiates the game and makes it possible to run it via the @@ -28,9 +30,8 @@ public class Main extends JApplet { public void init() { // applet Game vGame = new Game(); - Applet vApplet = new Applet(vGame, this); - vGame.addObserver(vApplet); - GameEngine vGameEngine = new GameEngine(vGame, vApplet); + Applet vApplet = new Applet(this); + new GameEngine(vGame, vApplet); } public static void main(final String[] pArgs) { @@ -38,15 +39,14 @@ public class Main extends JApplet { Game vGame = new Game(); View vView; - if (pArgs.length != 0) { - vView = new Console(vGame); + if (Arrays.asList(pArgs).contains("--nogui")) { + vView = new Console(); } else { - vView = new Window(vGame); + vView = new Window(); } - vGame.addObserver(vView); - GameEngine vGameEngine = new GameEngine(vGame, vView); + new GameEngine(vGame, vView); } } diff --git a/src/esieequest/controller/GameEngine.java b/src/esieequest/controller/GameEngine.java index 72de63a..3999cd0 100644 --- a/src/esieequest/controller/GameEngine.java +++ b/src/esieequest/controller/GameEngine.java @@ -1,8 +1,5 @@ package esieequest.controller; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - import esieequest.model.Game; import esieequest.view.View; @@ -15,7 +12,7 @@ import esieequest.view.View; * * @version February 2014 */ -public class GameEngine implements ActionListener { +public class GameEngine { private Game aGame; private View aView; @@ -26,9 +23,10 @@ public class GameEngine implements ActionListener { this.aGame = pGame; this.aView = pView; - this.aInterpreter = new Interpreter(this.aGame, this.aView); + this.aView.setModel(pGame); + this.aView.setController(this); - this.aView.setActionListener(this); + this.aInterpreter = new Interpreter(this.aGame, this.aView); this.startGame(); this.startView(); @@ -40,12 +38,11 @@ public class GameEngine implements ActionListener { } private void startView() { - this.aView.start(); + this.aView.enable(); } - @Override - public void actionPerformed(final ActionEvent pActionEvent) { - this.aInterpreter.interpret(pActionEvent.getActionCommand()); + public void interpret(final String pCommandString) { + this.aInterpreter.interpret(pCommandString); } } diff --git a/src/esieequest/controller/Interpreter.java b/src/esieequest/controller/Interpreter.java index 1e2937b..b4fbb3e 100644 --- a/src/esieequest/controller/Interpreter.java +++ b/src/esieequest/controller/Interpreter.java @@ -3,10 +3,6 @@ */ package esieequest.controller; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.StringTokenizer; - import esieequest.model.Game; import esieequest.model.command.Command; import esieequest.view.View; @@ -62,7 +58,7 @@ public class Interpreter { return; } } - this.aPerformer.showMessage("Unknown command."); + this.aPerformer.echo("Unknown command."); return; } } diff --git a/src/esieequest/controller/Parser.java b/src/esieequest/controller/Parser.java index bd36041..c9095fe 100644 --- a/src/esieequest/controller/Parser.java +++ b/src/esieequest/controller/Parser.java @@ -1,7 +1,5 @@ package esieequest.controller; -import java.util.StringTokenizer; - import esieequest.model.command.Command; public class Parser { @@ -10,22 +8,23 @@ public class Parser { } public Command getCommand(final String pCommandString) { - StringTokenizer vTokenizer = new StringTokenizer(pCommandString); + String[] vElements = pCommandString.split(" "); String vAction = null; String vOption = null; - if (vTokenizer.hasMoreTokens()) { - vAction = vTokenizer.nextToken(); - if (vTokenizer.hasMoreTokens()) { - vOption = vTokenizer.nextToken(); - } + if (vElements.length > 0) { + vAction = vElements[0]; + } + if (vElements.length > 1) { + vOption = vElements[1]; } + return new Command(vAction, vOption); } - + private void validateCommand() { - + // TODO } } diff --git a/src/esieequest/controller/Performer.java b/src/esieequest/controller/Performer.java index db52c4f..c56ef39 100644 --- a/src/esieequest/controller/Performer.java +++ b/src/esieequest/controller/Performer.java @@ -21,53 +21,52 @@ public class Performer { this.aView = pView; } - public void showMessage(final String pString) { - this.aView.showMessage(pString); + public void echo(final String pString) { + this.aView.echo(pString); } public void newGame() { // this.loadGame(default game); - this.aView - .showMessage(this.aGame.getWelcomeMessage() + "\n" + this.aGame.getLocationInfo()); + this.aView.echo(this.aGame.getWelcomeMessage() + "\n" + this.aGame.getLocationInfo()); } public void loadGame() { - this.aView.showMessage("Not implemented."); + this.aView.echo("Not implemented."); } public void saveGame() { - this.aView.showMessage("Not implemented."); + this.aView.echo("Not implemented."); } public void toggleSound() { - this.aView.showMessage("Not implemented."); + this.aView.echo("Not implemented."); } public void quitGame() { - this.aView.showMessage(this.aGame.getQuitMessage()); + this.aView.echo(this.aGame.getQuitMessage()); this.aGame.setRunning(false); } public void showHelp() { - this.aView.showMessage(this.aGame.getHelpMessage()); + this.aView.echo(this.aGame.getHelpMessage()); } public void goTo(final String pDirection) { Room vNextRoom = this.aGame.getRoomExit(pDirection); if (vNextRoom != null) { this.aGame.goToRoom(vNextRoom); - this.aView.showMessage(this.aGame.getLocationInfo()); + this.aView.echo(this.aGame.getLocationInfo()); } else { - this.aView.showMessage(this.aGame.getNoExitMessage()); + this.aView.echo(this.aGame.getNoExitMessage()); } } public void look() { - this.aView.showMessage(this.aGame.getLocationInfo()); + this.aView.echo(this.aGame.getLocationInfo()); } public void eat() { - this.aView.showMessage(this.aGame.getEatMessage()); + this.aView.echo(this.aGame.getEatMessage()); } } diff --git a/src/esieequest/controller/package-info.java b/src/esieequest/controller/package-info.java deleted file mode 100644 index 4d6616c..0000000 --- a/src/esieequest/controller/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * - */ -/** - * @author pacien - * - */ -package esieequest.controller; \ No newline at end of file diff --git a/src/esieequest/esieequest.gwt.xml b/src/esieequest/esieequest.gwt.xml new file mode 100644 index 0000000..b97b0a2 --- /dev/null +++ b/src/esieequest/esieequest.gwt.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/esieequest/model/Game.java b/src/esieequest/model/Game.java index ed7c3df..668a7f9 100644 --- a/src/esieequest/model/Game.java +++ b/src/esieequest/model/Game.java @@ -1,6 +1,5 @@ package esieequest.model; -import java.util.Observable; import java.util.HashMap; /** @@ -10,7 +9,7 @@ import java.util.HashMap; * * @version February 2014 */ -public class Game extends Observable { +public class Game { private boolean aRunning; private HashMap aRooms; @@ -168,8 +167,6 @@ public class Game extends Observable { public void setRunning(final boolean pState) { this.aRunning = pState; - this.setChanged(); - this.notifyObservers("state"); } public boolean isRunning() { @@ -178,14 +175,10 @@ public class Game extends Observable { public void goToRoom(final Room pRoom) { this.aCurrentRoom = pRoom; - this.setChanged(); - this.notifyObservers("room"); } public void goToRoom(final String pRoomName) { this.aCurrentRoom = this.aRooms.get(pRoomName); - this.setChanged(); - this.notifyObservers("room"); } public Room getRoomExit(final String pDirection) { diff --git a/src/esieequest/model/command/package-info.java b/src/esieequest/model/command/package-info.java deleted file mode 100644 index 38be480..0000000 --- a/src/esieequest/model/command/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * - */ -/** - * @author pacien - * - */ -package esieequest.model.command; \ No newline at end of file diff --git a/src/esieequest/model/package-info.java b/src/esieequest/model/package-info.java deleted file mode 100644 index a3e2ceb..0000000 --- a/src/esieequest/model/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * - */ -/** - * @author pacien - * - */ -package esieequest.model; \ No newline at end of file diff --git a/src/esieequest/package-info.java b/src/esieequest/package-info.java deleted file mode 100644 index 13db6f7..0000000 --- a/src/esieequest/package-info.java +++ /dev/null @@ -1,11 +0,0 @@ -/** - * "ESIEEquest" is a very simple, text based adventure game. - */ -/** - * @author Pacien TRAN-GIRARD - * @author Benoît LUBRANO DI SBARAGLIONE - * - * @version February 2014 - * - */ -package esieequest; \ No newline at end of file diff --git a/src/esieequest/view/Applet.java b/src/esieequest/view/Applet.java deleted file mode 100644 index 0537b71..0000000 --- a/src/esieequest/view/Applet.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * - */ -package esieequest.view; - -import javax.swing.JApplet; - -import esieequest.model.Game; - -/** - * @author pacien - * - */ -public class Applet extends UserInterface { - - private JApplet aApplet; - - public Applet(final Game pGame, final JApplet pApplet) { - this.aGame = pGame; - this.aApplet = pApplet; - } - - public void start() { - this.aApplet.add(this.getLayout()); - } - -} diff --git a/src/esieequest/view/Console.java b/src/esieequest/view/Console.java deleted file mode 100644 index 9a24d01..0000000 --- a/src/esieequest/view/Console.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * - */ -package esieequest.view; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.Observable; -import java.util.Scanner; - -import esieequest.model.Game; - -/** - * @author pacien - * - */ -public class Console implements View { - - private ArrayList aActionListeners; - - private Game aGame; - private Scanner aScanner; - - public Console(final Game pGame) { - this.aActionListeners = new ArrayList(); - this.aGame = pGame; - this.aScanner = new Scanner(System.in); - } - - public void start() { - this.play(); - } - - public void update(final Observable pObservable, final Object pArgument) { - this.showMessage(this.aGame.getLocationInfo()); - } - - private void play(){ - while (this.aGame.isRunning()) { - System.out.print("> "); - String vString = this.aScanner.nextLine(); - this.sendEvent(new ActionEvent(this, 0, vString)); - } - } - - private void sendEvent(final ActionEvent pActionEvent) { - for (ActionListener vActionListener : this.aActionListeners) { - vActionListener.actionPerformed(pActionEvent); - } - } - - public void showMessage(final String pMessage) { - System.out.println(pMessage); - } - - public void setActionListener(final ActionListener pActionListener) { - this.aActionListeners.add(pActionListener); - } - -} diff --git a/src/esieequest/view/UserInterface.java b/src/esieequest/view/UserInterface.java deleted file mode 100644 index 10e0c69..0000000 --- a/src/esieequest/view/UserInterface.java +++ /dev/null @@ -1,247 +0,0 @@ -package esieequest.view; - -import javax.swing.JPanel; -import javax.swing.JButton; -import javax.swing.JTextPane; -import javax.swing.JLabel; -import javax.swing.border.EmptyBorder; - -import esieequest.model.Game; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.event.ActionListener; -import java.net.URL; -import java.util.HashMap; -import java.util.Observable; - -import javax.swing.JTextField; - -import net.homelinux.nikiroo.utils.gui.JBackgroundPanel; - -import com.wordpress.tipsforjava.swing.StretchIcon; - -import java.awt.Font; -import javax.swing.JTabbedPane; -import javax.swing.JEditorPane; -import javax.swing.JLayeredPane; - -public abstract class UserInterface implements View { - - protected Game aGame; - - private JPanel aLayout; - - private JTextPane aQuestTextPane; - private JTextPane aInfoTextPane; - - private JLabel aImageLabel; - - private HashMap aGameButtons; - private HashMap aControlButtons; - private JTextField aInputField; - - /** - * Create the panel. - */ - public UserInterface() { - - this.aLayout = new JPanel(); - this.aLayout.setLayout(new BorderLayout(0, 0)); - - JPanel vMenuPanel = new JPanel(); - this.aLayout.add(vMenuPanel, BorderLayout.NORTH); - vMenuPanel.setLayout(new BorderLayout(0, 0)); - - JPanel vQuestPanel = new JPanel(); - vMenuPanel.add(vQuestPanel, BorderLayout.CENTER); - - this.aQuestTextPane = new JTextPane(); - this.aQuestTextPane.setEditable(false); - this.aQuestTextPane.setText("ESIEEquest"); - vQuestPanel.add(this.aQuestTextPane); - - JPanel vGamePanel = new JPanel(); - vMenuPanel.add(vGamePanel, BorderLayout.WEST); - - JButton vNewButton = new JButton("New"); - vNewButton.setToolTipText("New game"); - vGamePanel.add(vNewButton); - - JButton vSoundButton = new JButton("Sound"); - vSoundButton.setToolTipText("Toggle sound"); - vGamePanel.add(vSoundButton); - - JPanel filePanel = new JPanel(); - vMenuPanel.add(filePanel, BorderLayout.EAST); - - JButton vLoadButton = new JButton("Load"); - vLoadButton.setToolTipText("Load a game"); - filePanel.add(vLoadButton); - - JButton vSaveButton = new JButton("Save"); - vSaveButton.setToolTipText("Save the current game"); - filePanel.add(vSaveButton); - - JPanel vImagePanel = new JPanel(); - aLayout.add(vImagePanel, BorderLayout.CENTER); - vImagePanel.setLayout(new BorderLayout(0, 0)); - - this.aImageLabel = new JLabel(); - vImagePanel.add(this.aImageLabel); - - JPanel vUserPanel = new JPanel(); - this.aLayout.add(vUserPanel, BorderLayout.SOUTH); - vUserPanel.setLayout(new BorderLayout(0, 0)); - - JPanel vDispPanel = new JPanel(); - vDispPanel.setBorder(new EmptyBorder(5, 5, 5, 0)); - vUserPanel.add(vDispPanel, BorderLayout.CENTER); - vDispPanel.setLayout(new BorderLayout(0, 0)); - - this.aInfoTextPane = new JTextPane(); - this.aInfoTextPane.setEditable(false); - this.aInfoTextPane.setText("Welcome to ESIEEquest!"); - vDispPanel.add(this.aInfoTextPane); - - aInputField = new JTextField(); - vDispPanel.add(aInputField, BorderLayout.SOUTH); - aInputField.setColumns(10); - - JPanel vControlPanel = new JPanel(); - vControlPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); - vUserPanel.add(vControlPanel, BorderLayout.EAST); - vControlPanel.setLayout(new BorderLayout(0, 0)); - - JPanel vTopControlPanel = new JPanel(); - vControlPanel.add(vTopControlPanel, BorderLayout.NORTH); - vTopControlPanel.setLayout(new BorderLayout(0, 0)); - - JButton vForwardButton = new JButton("↥"); - vForwardButton.setFont(new Font("Dialog", Font.BOLD, 19)); - vForwardButton.setToolTipText("Go forward"); - vTopControlPanel.add(vForwardButton, BorderLayout.CENTER); - - JButton vInventoryButton = new JButton("⇱"); - vInventoryButton.setFont(new Font("Dialog", Font.BOLD, 19)); - vInventoryButton.setToolTipText("Use item"); - vTopControlPanel.add(vInventoryButton, BorderLayout.WEST); - - JButton vActionButton = new JButton("⇲"); - vActionButton.setFont(new Font("Dialog", Font.BOLD, 19)); - vActionButton.setToolTipText("Talk/Take item"); - vTopControlPanel.add(vActionButton, BorderLayout.EAST); - - JPanel vBottomControlPanel = new JPanel(); - vControlPanel.add(vBottomControlPanel, BorderLayout.SOUTH); - vBottomControlPanel.setLayout(new BorderLayout(0, 0)); - - JButton vBackButton = new JButton("↧"); - vBackButton.setFont(new Font("Dialog", Font.BOLD, 19)); - vBackButton.setToolTipText("Go back"); - vBottomControlPanel.add(vBackButton, BorderLayout.CENTER); - - JButton vLeftButton = new JButton("↰"); - vLeftButton.setFont(new Font("Dialog", Font.BOLD, 19)); - vLeftButton.setToolTipText("Turn left"); - vBottomControlPanel.add(vLeftButton, BorderLayout.WEST); - - JButton vRightButton = new JButton("↱"); - vRightButton.setFont(new Font("Dialog", Font.BOLD, 19)); - vRightButton.setToolTipText("Turn right"); - vBottomControlPanel.add(vRightButton, BorderLayout.EAST); - - Dimension vSquareButton = new Dimension(50, 50); - vForwardButton.setPreferredSize(vSquareButton); - vInventoryButton.setPreferredSize(vSquareButton); - vActionButton.setPreferredSize(vSquareButton); - vBackButton.setPreferredSize(vSquareButton); - vLeftButton.setPreferredSize(vSquareButton); - vRightButton.setPreferredSize(vSquareButton); - - vNewButton.setActionCommand("new"); - vSoundButton.setActionCommand("sound"); - vLoadButton.setActionCommand("load"); - vSaveButton.setActionCommand("save"); - - vForwardButton.setActionCommand("forward"); - vInventoryButton.setActionCommand("inventory"); - vActionButton.setActionCommand("do"); - vBackButton.setActionCommand("back"); - vLeftButton.setActionCommand("turn left"); - vRightButton.setActionCommand("turn right"); - - this.aGameButtons = new HashMap(); - - this.aGameButtons.put("vNewButton", vNewButton); - this.aGameButtons.put("vSoundButton", vSoundButton); - this.aGameButtons.put("vLoadButton", vLoadButton); - this.aGameButtons.put("vSaveButton", vSaveButton); - - this.aControlButtons = new HashMap(); - - this.aControlButtons.put("vForwardButton", vForwardButton); - this.aControlButtons.put("vInventoryButton", vInventoryButton); - this.aControlButtons.put("vActionButton", vActionButton); - this.aControlButtons.put("vBackButton", vBackButton); - this.aControlButtons.put("vLeftButton", vLeftButton); - this.aControlButtons.put("vRightButton", vRightButton); - - } - - @Override - public void update(final Observable pObservable, final Object pArgument) { - // TODO Auto-generated method stub - this.clearInputField(); - this.updateIllustration(); - this.setControlsState(this.aGame.isRunning()); - } - - public JPanel getLayout() { - return this.aLayout; - } - - private void setActionListener(final HashMap vHashMap, - final ActionListener pActionListener) { - for (JButton vButton : vHashMap.values()) { - vButton.addActionListener(pActionListener); - } - } - - public void setActionListener(final ActionListener pActionListener) { - this.aInputField.addActionListener(pActionListener); - this.setActionListener(this.aGameButtons, pActionListener); - this.setActionListener(this.aControlButtons, pActionListener); - } - - private void clearInputField() { - this.aInputField.setText(null); - } - - private void setControlsState(final boolean pState) { - this.aInputField.setEnabled(pState); - for (JButton vButton : this.aControlButtons.values()) { - vButton.setEnabled(pState); - } - } - - private void setQuest(final String pQuest) { - this.aQuestTextPane.setText(pQuest); - } - - public void showMessage(final String pMessage) { - this.aInfoTextPane.setText(pMessage); - this.clearInputField(); - } - - private void updateIllustration() { - String vImageName = this.aGame.getLocationImageName(); - if (vImageName == null) { - vImageName = "res/img/placeholder.jpg"; - } - URL vImageURL = this.getClass().getClassLoader().getResource(vImageName); - StretchIcon vImageIcon = new StretchIcon(vImageURL, true); - this.aImageLabel.setIcon(vImageIcon); - } - -} diff --git a/src/esieequest/view/View.java b/src/esieequest/view/View.java index 3061b47..ad84b61 100644 --- a/src/esieequest/view/View.java +++ b/src/esieequest/view/View.java @@ -3,21 +3,23 @@ */ package esieequest.view; -import java.awt.event.ActionListener; -import java.util.Observer; +import esieequest.controller.GameEngine; +import esieequest.model.Game; /** * @author pacien * */ -public interface View extends Observer { +public interface View { - public void setActionListener(final ActionListener pActionListener); + public void setModel(final Game pGame); - public void start(); + public void setController(final GameEngine pGameEngine); - //public void quit(); + public void enable(); - public void showMessage(final String pMessage); + public void refresh(); + + public void echo(final String pMessage); } diff --git a/src/esieequest/view/Window.java b/src/esieequest/view/Window.java deleted file mode 100644 index bacc8bf..0000000 --- a/src/esieequest/view/Window.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * - */ -package esieequest.view; - -import javax.swing.JFrame; - -import esieequest.model.Game; - -/** - * @author pacien - * - */ -public class Window extends UserInterface { - - private JFrame aWindow; - - /** - * Create the frame. - * - * @wbp.parser.entryPoint - */ - public Window(final Game pGame) { - this.aGame = pGame; - this.aWindow = new JFrame("ESIEEquest"); - this.aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - this.aWindow.setBounds(100, 100, 700, 500); - this.aWindow.setContentPane(this.getLayout()); - } - - public void start() { - this.aWindow.setVisible(true); - } - -} diff --git a/src/esieequest/view/app/Applet.java b/src/esieequest/view/app/Applet.java new file mode 100644 index 0000000..f472b06 --- /dev/null +++ b/src/esieequest/view/app/Applet.java @@ -0,0 +1,27 @@ +/** + * + */ +package esieequest.view.app; + +import javax.swing.JApplet; + +import esieequest.model.Game; + +/** + * @author pacien + * + */ +public class Applet extends UserInterface { + + private JApplet aApplet; + + public Applet(final JApplet pApplet) { + //this.aGame = pGame; + this.aApplet = pApplet; + } + + public void enable() { + this.aApplet.add(this.getLayout()); + } + +} diff --git a/src/esieequest/view/app/UserInterface.java b/src/esieequest/view/app/UserInterface.java new file mode 100644 index 0000000..36b928e --- /dev/null +++ b/src/esieequest/view/app/UserInterface.java @@ -0,0 +1,263 @@ +package esieequest.view.app; + +import javax.swing.JPanel; +import javax.swing.JButton; +import javax.swing.JTextPane; +import javax.swing.JLabel; +import javax.swing.border.EmptyBorder; + +import esieequest.controller.GameEngine; +import esieequest.model.Game; +import esieequest.view.View; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.net.URL; +import java.util.HashMap; + +import javax.swing.JTextField; + +import com.wordpress.tipsforjava.swing.StretchIcon; + +import java.awt.Font; + +public abstract class UserInterface implements View, ActionListener { + + protected Game aGame; + private GameEngine aGameEngine; + + private JPanel aLayout; + + private JTextPane aQuestTextPane; + private JTextPane aInfoTextPane; + + private JLabel aImageLabel; + + private HashMap aGameButtons; + private HashMap aControlButtons; + private JTextField aInputField; + + /** + * Create the panel. + */ + public UserInterface() { + this.buildUI(); + this.aInputField.addActionListener(this); + this.setControlsState(false); + aInputField.setEnabled(true); + } + + private void buildUI() { + this.aLayout = new JPanel(); + this.aLayout.setLayout(new BorderLayout(0, 0)); + + JPanel vMenuPanel = new JPanel(); + this.aLayout.add(vMenuPanel, BorderLayout.NORTH); + vMenuPanel.setLayout(new BorderLayout(0, 0)); + + JPanel vQuestPanel = new JPanel(); + vMenuPanel.add(vQuestPanel, BorderLayout.CENTER); + + this.aQuestTextPane = new JTextPane(); + this.aQuestTextPane.setEditable(false); + this.aQuestTextPane.setText("ESIEEquest"); + vQuestPanel.add(this.aQuestTextPane); + + JPanel vGamePanel = new JPanel(); + vMenuPanel.add(vGamePanel, BorderLayout.WEST); + + JButton vNewButton = new JButton("New"); + vNewButton.setToolTipText("New game"); + vGamePanel.add(vNewButton); + + JButton vSoundButton = new JButton("Sound"); + vSoundButton.setToolTipText("Toggle sound"); + vGamePanel.add(vSoundButton); + + JPanel filePanel = new JPanel(); + vMenuPanel.add(filePanel, BorderLayout.EAST); + + JButton vLoadButton = new JButton("Load"); + vLoadButton.setToolTipText("Load a game"); + filePanel.add(vLoadButton); + + JButton vSaveButton = new JButton("Save"); + vSaveButton.setToolTipText("Save the current game"); + filePanel.add(vSaveButton); + + JPanel vImagePanel = new JPanel(); + aLayout.add(vImagePanel, BorderLayout.CENTER); + vImagePanel.setLayout(new BorderLayout(0, 0)); + + this.aImageLabel = new JLabel(); + vImagePanel.add(this.aImageLabel); + + JPanel vUserPanel = new JPanel(); + this.aLayout.add(vUserPanel, BorderLayout.SOUTH); + vUserPanel.setLayout(new BorderLayout(0, 0)); + + JPanel vDispPanel = new JPanel(); + vDispPanel.setBorder(new EmptyBorder(5, 5, 5, 0)); + vUserPanel.add(vDispPanel, BorderLayout.CENTER); + vDispPanel.setLayout(new BorderLayout(0, 0)); + + this.aInfoTextPane = new JTextPane(); + this.aInfoTextPane.setEditable(false); + this.aInfoTextPane.setText("Welcome to ESIEEquest!"); + vDispPanel.add(this.aInfoTextPane); + + aInputField = new JTextField(); + vDispPanel.add(aInputField, BorderLayout.SOUTH); + aInputField.setColumns(10); + + JPanel vControlPanel = new JPanel(); + vControlPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); + vUserPanel.add(vControlPanel, BorderLayout.EAST); + vControlPanel.setLayout(new BorderLayout(0, 0)); + + JPanel vTopControlPanel = new JPanel(); + vControlPanel.add(vTopControlPanel, BorderLayout.NORTH); + vTopControlPanel.setLayout(new BorderLayout(0, 0)); + + JButton vForwardButton = new JButton("↥"); + vForwardButton.setFont(new Font("Dialog", Font.BOLD, 19)); + vForwardButton.setToolTipText("Go forward"); + vTopControlPanel.add(vForwardButton, BorderLayout.CENTER); + + JButton vInventoryButton = new JButton("⇱"); + vInventoryButton.setFont(new Font("Dialog", Font.BOLD, 19)); + vInventoryButton.setToolTipText("Use item"); + vTopControlPanel.add(vInventoryButton, BorderLayout.WEST); + + JButton vActionButton = new JButton("⇲"); + vActionButton.setFont(new Font("Dialog", Font.BOLD, 19)); + vActionButton.setToolTipText("Talk/Take item"); + vTopControlPanel.add(vActionButton, BorderLayout.EAST); + + JPanel vBottomControlPanel = new JPanel(); + vControlPanel.add(vBottomControlPanel, BorderLayout.SOUTH); + vBottomControlPanel.setLayout(new BorderLayout(0, 0)); + + JButton vBackButton = new JButton("↧"); + vBackButton.setFont(new Font("Dialog", Font.BOLD, 19)); + vBackButton.setToolTipText("Go back"); + vBottomControlPanel.add(vBackButton, BorderLayout.CENTER); + + JButton vLeftButton = new JButton("↰"); + vLeftButton.setFont(new Font("Dialog", Font.BOLD, 19)); + vLeftButton.setToolTipText("Turn left"); + vBottomControlPanel.add(vLeftButton, BorderLayout.WEST); + + JButton vRightButton = new JButton("↱"); + vRightButton.setFont(new Font("Dialog", Font.BOLD, 19)); + vRightButton.setToolTipText("Turn right"); + vBottomControlPanel.add(vRightButton, BorderLayout.EAST); + + Dimension vSquareButton = new Dimension(50, 50); + vForwardButton.setPreferredSize(vSquareButton); + vInventoryButton.setPreferredSize(vSquareButton); + vActionButton.setPreferredSize(vSquareButton); + vBackButton.setPreferredSize(vSquareButton); + vLeftButton.setPreferredSize(vSquareButton); + vRightButton.setPreferredSize(vSquareButton); + + vNewButton.setActionCommand("new"); + vSoundButton.setActionCommand("sound"); + vLoadButton.setActionCommand("load"); + vSaveButton.setActionCommand("save"); + + vForwardButton.setActionCommand("forward"); + vInventoryButton.setActionCommand("inventory"); + vActionButton.setActionCommand("do"); + vBackButton.setActionCommand("back"); + vLeftButton.setActionCommand("turn left"); + vRightButton.setActionCommand("turn right"); + + this.aGameButtons = new HashMap(); + + this.aGameButtons.put("vNewButton", vNewButton); + this.aGameButtons.put("vSoundButton", vSoundButton); + this.aGameButtons.put("vLoadButton", vLoadButton); + this.aGameButtons.put("vSaveButton", vSaveButton); + + this.aControlButtons = new HashMap(); + + this.aControlButtons.put("vForwardButton", vForwardButton); + this.aControlButtons.put("vInventoryButton", vInventoryButton); + this.aControlButtons.put("vActionButton", vActionButton); + this.aControlButtons.put("vBackButton", vBackButton); + this.aControlButtons.put("vLeftButton", vLeftButton); + this.aControlButtons.put("vRightButton", vRightButton); + } + + public void actionPerformed(final ActionEvent pActionEvent) { + this.aGameEngine.interpret(pActionEvent.getActionCommand()); + } + + public JPanel getLayout() { + return this.aLayout; + } + + private void setActionListener(final HashMap vHashMap, + final ActionListener pActionListener) { + for (JButton vButton : vHashMap.values()) { + vButton.addActionListener(pActionListener); + } + } + + public void setActionListener(final ActionListener pActionListener) { + this.aInputField.addActionListener(pActionListener); + this.setActionListener(this.aGameButtons, pActionListener); + this.setActionListener(this.aControlButtons, pActionListener); + } + + private void clearInputField() { + this.aInputField.setText(null); + } + + private void setControlsState(final boolean pState) { + this.aInputField.setEnabled(pState); + for (JButton vButton : this.aControlButtons.values()) { + vButton.setEnabled(pState); + } + } + + private void setQuest(final String pQuest) { + this.aQuestTextPane.setText(pQuest); + } + + private void updateIllustration() { + String vImageName = this.aGame.getLocationImageName(); + if (vImageName == null) { + vImageName = "res/img/placeholder.jpg"; + } + URL vImageURL = this.getClass().getClassLoader().getResource(vImageName); + StretchIcon vImageIcon = new StretchIcon(vImageURL, true); + this.aImageLabel.setIcon(vImageIcon); + } + + @Override + public void setModel(Game pGame) { + this.aGame = pGame; + } + + @Override + public void setController(GameEngine pGameEngine) { + this.aGameEngine = pGameEngine; + } + + @Override + public void echo(final String pMessage) { + this.aInfoTextPane.setText(pMessage); + this.clearInputField(); + } + + @Override + public void refresh() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/esieequest/view/app/Window.java b/src/esieequest/view/app/Window.java new file mode 100644 index 0000000..ad20ce7 --- /dev/null +++ b/src/esieequest/view/app/Window.java @@ -0,0 +1,35 @@ +/** + * + */ +package esieequest.view.app; + +import javax.swing.JFrame; + +import esieequest.model.Game; + +/** + * @author pacien + * + */ +public class Window extends UserInterface { + + private JFrame aWindow; + + /** + * Create the frame. + * + * @wbp.parser.entryPoint + */ + public Window() { + //this.aGame = pGame; + this.aWindow = new JFrame("ESIEEquest"); + this.aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.aWindow.setBounds(100, 100, 700, 500); + this.aWindow.setContentPane(this.getLayout()); + } + + public void enable() { + this.aWindow.setVisible(true); + } + +} diff --git a/src/esieequest/view/console/Console.java b/src/esieequest/view/console/Console.java new file mode 100644 index 0000000..90cde08 --- /dev/null +++ b/src/esieequest/view/console/Console.java @@ -0,0 +1,59 @@ +/** + * + */ +package esieequest.view.console; + +import java.util.Scanner; + +import esieequest.controller.GameEngine; +import esieequest.model.Game; +import esieequest.view.View; + +/** + * @author pacien + * + */ +public class Console implements View { + + private Game aGame; + private GameEngine aGameEngine; + private Scanner aScanner; + + public Console() { + this.aScanner = new Scanner(System.in); + } + + private void play() { + while (this.aGame.isRunning()) { + System.out.print("> "); + String vInputString = this.aScanner.nextLine(); + this.aGameEngine.interpret(vInputString); + } + } + + @Override + public void setModel(Game pGame) { + this.aGame = pGame; + } + + @Override + public void setController(GameEngine pGameEngine) { + this.aGameEngine = pGameEngine; + } + + @Override + public void enable() { + this.play(); + } + + @Override + public void refresh() { + this.echo(this.aGame.getLocationInfo()); + } + + @Override + public void echo(String pMessage) { + System.out.println(pMessage); + } + +} diff --git a/src/esieequest/view/package-info.java b/src/esieequest/view/package-info.java deleted file mode 100644 index 283292d..0000000 --- a/src/esieequest/view/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * - */ -/** - * @author pacien - * - */ -package esieequest.view; \ No newline at end of file diff --git a/src/esieequest/view/web/Main.java b/src/esieequest/view/web/Main.java new file mode 100644 index 0000000..bf444c9 --- /dev/null +++ b/src/esieequest/view/web/Main.java @@ -0,0 +1,18 @@ +package esieequest.view.web; + +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.user.client.ui.RootLayoutPanel; + +import esieequest.controller.GameEngine; +import esieequest.model.Game; + +public class Main implements EntryPoint { + + @Override + public void onModuleLoad() { + Game vGame = new Game(); + WebInterface vWebInterface = new WebInterface(); + new GameEngine(vGame, vWebInterface); + } + +} diff --git a/src/esieequest/view/web/WebInterface.java b/src/esieequest/view/web/WebInterface.java new file mode 100644 index 0000000..516042e --- /dev/null +++ b/src/esieequest/view/web/WebInterface.java @@ -0,0 +1,123 @@ +/** + * + */ +package esieequest.view.web; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.KeyCodes; +import com.google.gwt.event.dom.client.KeyDownEvent; +import com.google.gwt.event.dom.client.KeyDownHandler; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HasText; +import com.google.gwt.user.client.ui.RootLayoutPanel; +import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.user.client.ui.Label; + +import esieequest.controller.GameEngine; +import esieequest.model.Game; +import esieequest.view.View; + +import com.google.gwt.user.client.ui.TextBox; + +/** + * @author pacien + * + */ +public class WebInterface extends Composite implements View { + + private GameEngine aGameEngine; + private Game aGame; + + private static WebInterfaceUiBinder uiBinder = GWT.create(WebInterfaceUiBinder.class); + + @UiField + Label displayLabel; + @UiField + Label questLabel; + @UiField + TextBox inputField; + @UiField + Button newButton; + @UiField + Button soundButton; + @UiField + Button saveButton; + @UiField + Button loadButton; + @UiField + Button inventoryButton; + @UiField + Button forwardButton; + @UiField + Button actionButton; + @UiField + Button rightButton; + @UiField + Button backButton; + @UiField + Button leftButton; + + interface WebInterfaceUiBinder extends UiBinder { + } + + /** + * Because this class has a default constructor, it can be used as a binder + * template. In other words, it can be used in other *.ui.xml files as + * follows: + * Hello! Note that + * depending on the widget that is used, it may be necessary to implement + * HasHTML instead of HasText. + */ + public WebInterface() { + initWidget(uiBinder.createAndBindUi(this)); + + inputField.addKeyDownHandler(new KeyDownHandler() { + public void onKeyDown(KeyDownEvent event) { + if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { + aGameEngine.interpret(inputField.getText()); + inputField.setText(null); + } + } + }); + + } + + @Override + public void setModel(Game pGame) { + this.aGame = pGame; + } + + @Override + public void setController(GameEngine pGameEngine) { + this.aGameEngine = pGameEngine; + } + + @Override + public void enable() { + RootLayoutPanel.get().add(this); + } + + @Override + public void refresh() { + // TODO Auto-generated method stub + + } + + @Override + public void echo(String pMessage) { + this.displayLabel.setText(pMessage); + } + + /* + * @UiHandler("button") void onClick(ClickEvent e) { Window.alert("Hello!"); + * } + */ + +} diff --git a/src/esieequest/view/web/WebInterface.ui.xml b/src/esieequest/view/web/WebInterface.ui.xml new file mode 100644 index 0000000..755990e --- /dev/null +++ b/src/esieequest/view/web/WebInterface.ui.xml @@ -0,0 +1,97 @@ + + + + /* Add CSS here. See the GWT docs on UI Binder for more details */ + .important { + font-weight: bold; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Console + + + + Inventory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/net/homelinux/nikiroo/utils/gui/JBackgroundPanel.java b/src/net/homelinux/nikiroo/utils/gui/JBackgroundPanel.java deleted file mode 100644 index ba53b86..0000000 --- a/src/net/homelinux/nikiroo/utils/gui/JBackgroundPanel.java +++ /dev/null @@ -1,308 +0,0 @@ -package net.homelinux.nikiroo.utils.gui; - -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Insets; -import java.awt.LayoutManager; -import java.awt.Paint; -import java.awt.Rectangle; - -import javax.swing.ImageIcon; -import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JViewport; - -/** - * Support custom painting on a panel in the form of
  • images - that can be - * scaled, tiled or painted at original size
  • non solid painting - that - * can be done by using a Paint object
  • Also, any component added directly - * to this panel will be made non-opaque so that the custom painting can show - * through. - */ -public class JBackgroundPanel extends JPanel { - private static final long serialVersionUID = 1L; - - public static final int SCALED = 0; - public static final int TILED = 1; - public static final int ACTUAL = 2; - public static final int RATIO = 3; - - private Paint painter; - private Image image; - private int style = SCALED; - private float alignmentX = 0.5f; - private float alignmentY = 0.5f; - private boolean isTransparentAdd = true; - - /** - * Empty {@link JBackgroundPanel}. - */ - public JBackgroundPanel() { - } - - /** - * Empty {@link JBackgroundPanel} with the given {@link LayoutManager}. - */ - public JBackgroundPanel(LayoutManager layout) { - super(layout); - } - - /* - * Set image as the background with the SCALED style - */ - public JBackgroundPanel(ImageIcon image) { - this(image.getImage()); - } - - /* - * Set image as the background with the SCALED style - */ - public JBackgroundPanel(ImageIcon image, int style) { - this(image.getImage(), style); - } - - /* - * Set image as the backround with the specified style and alignment - */ - public JBackgroundPanel(ImageIcon image, int style, float alignmentX, float alignmentY) { - this(image.getImage(), style, alignmentX, alignmentY); - } - - /* - * Set image as the background with the SCALED style - */ - public JBackgroundPanel(Image image) { - this(image, SCALED); - } - - /* - * Set image as the background with the specified style - */ - public JBackgroundPanel(Image image, int style) { - setImage(image); - setStyle(style); - setLayout(new BorderLayout()); - } - - /* - * Set image as the backround with the specified style and alignment - */ - public JBackgroundPanel(Image image, int style, float alignmentX, float alignmentY) { - setImage(image); - setStyle(style); - setImageAlignmentX(alignmentX); - setImageAlignmentY(alignmentY); - setLayout(new BorderLayout()); - } - - /* - * Use the Paint interface to paint a background - */ - public JBackgroundPanel(Paint painter) { - setPaint(painter); - setLayout(new BorderLayout()); - } - - /* - * Set the image used as the background - */ - public void setImage(Image image) { - this.image = image; - repaint(); - } - - /* - * Set the style used to paint the background image - */ - public void setStyle(int style) { - this.style = style; - repaint(); - } - - /* - * Set the Paint object used to paint the background - */ - public void setPaint(Paint painter) { - this.painter = painter; - repaint(); - } - - /* - * Specify the horizontal alignment of the image when using ACTUAL style - */ - public void setImageAlignmentX(float alignmentX) { - this.alignmentX = alignmentX > 1.0f ? 1.0f : alignmentX < 0.0f ? 0.0f : alignmentX; - repaint(); - } - - /* - * Specify the horizontal alignment of the image when using ACTUAL style - */ - public void setImageAlignmentY(float alignmentY) { - this.alignmentY = alignmentY > 1.0f ? 1.0f : alignmentY < 0.0f ? 0.0f : alignmentY; - repaint(); - } - - /* - * Override method so we can make the component transparent - */ - public void add(JComponent component) { - add(component, null); - } - - /* - * Override to provide a preferred size equal to the image size - */ - @Override - public Dimension getPreferredSize() { - if (image == null) - return super.getPreferredSize(); - else - return new Dimension(image.getWidth(null), image.getHeight(null)); - } - - /* - * Override method so we can make the component transparent - */ - public void add(JComponent component, Object constraints) { - if (isTransparentAdd) { - makeComponentTransparent(component); - } - - super.add(component, constraints); - } - - /* - * Controls whether components added to this panel should automatically be - * made transparent. That is, setOpaque(false) will be invoked. The default - * is set to true. - */ - public void setTransparentAdd(boolean isTransparentAdd) { - this.isTransparentAdd = isTransparentAdd; - } - - /* - * Try to make the component transparent. For components that use renderers, - * like JTable, you will also need to change the renderer to be transparent. - * An easy way to do this it to set the background of the table to a Color - * using an alpha value of 0. - */ - private void makeComponentTransparent(JComponent component) { - component.setOpaque(false); - - if (component instanceof JScrollPane) { - JScrollPane scrollPane = (JScrollPane) component; - JViewport viewport = scrollPane.getViewport(); - viewport.setOpaque(false); - Component c = viewport.getView(); - - if (c instanceof JComponent) { - ((JComponent) c).setOpaque(false); - } - } - } - - /* - * Add custom painting - */ - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - - // Invoke the painter for the background - - if (painter != null) { - Dimension d = getSize(); - Graphics2D g2 = (Graphics2D) g; - g2.setPaint(painter); - g2.fill(new Rectangle(0, 0, d.width, d.height)); - } - - // Draw the image - - if (image == null) - return; - - switch (style) { - case RATIO: - drawRatio(g); - break; - - case SCALED: - drawScaled(g); - break; - - case TILED: - drawTiled(g); - break; - - case ACTUAL: - drawActual(g); - break; - - default: - drawScaled(g); - } - } - - /* - * Custom painting code for drawing a SCALED image as the background - */ - private void drawScaled(Graphics g) { - Dimension d = getSize(); - g.drawImage(image, 0, 0, d.width, d.height, null); - } - - /* - * Custom painting code for drawing TILED images as the background - */ - private void drawTiled(Graphics g) { - Dimension d = getSize(); - int width = image.getWidth(null); - int height = image.getHeight(null); - - for (int x = 0; x < d.width; x += width) { - for (int y = 0; y < d.height; y += height) { - g.drawImage(image, x, y, null, null); - } - } - } - - /* - * Custom painting code for drawing the ACTUAL image as the background. The - * image is positioned in the panel based on the horizontal and vertical - * alignments specified. - */ - private void drawActual(Graphics g) { - Dimension d = getSize(); - Insets insets = getInsets(); - int width = d.width - insets.left - insets.right; - int height = d.height - insets.top - insets.left; - float x = (width - image.getWidth(null)) * alignmentX; - float y = (height - image.getHeight(null)) * alignmentY; - g.drawImage(image, (int) x + insets.left, (int) y + insets.top, this); - } - - private void drawRatio(Graphics g) { - if (image != null && g != null) { - // si la dimension actuelle est > � la preferedSize (qui est - // elle-meme a la taille de l'avatar) - int h = (this.getHeight() - image.getHeight(null)) / 2; - int w = (this.getWidth() - image.getWidth(null)) / 2; - if (h < 0) { - h = 0; - } - if (w < 0) { - w = 0; - } - // TODO: alignment, solid paint - - g.drawImage(image, w, h, null, null); - } - } -} \ No newline at end of file -- cgit v1.2.3