diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..a0921154 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "java.project.sourcePaths": [ + "tictactoe/test", + "tictactoe", + "tictactoe/src" + ] +} \ No newline at end of file diff --git a/README.txt b/README.txt new file mode 100644 index 00000000..aec8ec7f --- /dev/null +++ b/README.txt @@ -0,0 +1,3 @@ +Did not change how the code can be complied, tested, and run: + +To compile, test, and run the code, refer to README.MD contained within the tictactoe folder. \ No newline at end of file diff --git a/answers.pdf b/answers.pdf new file mode 100644 index 00000000..edd1369a Binary files /dev/null and b/answers.pdf differ diff --git a/tictactoe/bin/RowGameApp.class b/tictactoe/bin/RowGameApp.class new file mode 100644 index 00000000..8bd0e59c Binary files /dev/null and b/tictactoe/bin/RowGameApp.class differ diff --git a/tictactoe/bin/TestController.class b/tictactoe/bin/TestController.class new file mode 100644 index 00000000..81eaccd2 Binary files /dev/null and b/tictactoe/bin/TestController.class differ diff --git a/tictactoe/bin/TestExample.class b/tictactoe/bin/TestExample.class new file mode 100644 index 00000000..9190b62d Binary files /dev/null and b/tictactoe/bin/TestExample.class differ diff --git a/tictactoe/bin/TestModel.class b/tictactoe/bin/TestModel.class new file mode 100644 index 00000000..c06e3c11 Binary files /dev/null and b/tictactoe/bin/TestModel.class differ diff --git a/tictactoe/bin/TestView.class b/tictactoe/bin/TestView.class new file mode 100644 index 00000000..1fce48a4 Binary files /dev/null and b/tictactoe/bin/TestView.class differ diff --git a/tictactoe/bin/controller/RowGameController.class b/tictactoe/bin/controller/RowGameController.class new file mode 100644 index 00000000..3766dfdb Binary files /dev/null and b/tictactoe/bin/controller/RowGameController.class differ diff --git a/tictactoe/bin/model/RowBlockModel$PlayerPiece.class b/tictactoe/bin/model/RowBlockModel$PlayerPiece.class new file mode 100644 index 00000000..c1a50651 Binary files /dev/null and b/tictactoe/bin/model/RowBlockModel$PlayerPiece.class differ diff --git a/tictactoe/bin/model/RowBlockModel.class b/tictactoe/bin/model/RowBlockModel.class new file mode 100644 index 00000000..476fe0c8 Binary files /dev/null and b/tictactoe/bin/model/RowBlockModel.class differ diff --git a/tictactoe/bin/model/RowGameModel$Player.class b/tictactoe/bin/model/RowGameModel$Player.class new file mode 100644 index 00000000..57b6f646 Binary files /dev/null and b/tictactoe/bin/model/RowGameModel$Player.class differ diff --git a/tictactoe/bin/model/RowGameModel.class b/tictactoe/bin/model/RowGameModel.class new file mode 100644 index 00000000..adc3a177 Binary files /dev/null and b/tictactoe/bin/model/RowGameModel.class differ diff --git a/tictactoe/bin/view/RowGameBoardView.class b/tictactoe/bin/view/RowGameBoardView.class new file mode 100644 index 00000000..70b2af39 Binary files /dev/null and b/tictactoe/bin/view/RowGameBoardView.class differ diff --git a/tictactoe/bin/view/RowGameGUI$1.class b/tictactoe/bin/view/RowGameGUI$1.class new file mode 100644 index 00000000..b98f1710 Binary files /dev/null and b/tictactoe/bin/view/RowGameGUI$1.class differ diff --git a/tictactoe/bin/view/RowGameGUI$2.class b/tictactoe/bin/view/RowGameGUI$2.class new file mode 100644 index 00000000..6d2745a8 Binary files /dev/null and b/tictactoe/bin/view/RowGameGUI$2.class differ diff --git a/tictactoe/bin/view/RowGameGUI.class b/tictactoe/bin/view/RowGameGUI.class new file mode 100644 index 00000000..aa4035bf Binary files /dev/null and b/tictactoe/bin/view/RowGameGUI.class differ diff --git a/tictactoe/bin/view/RowGameStatusView$1.class b/tictactoe/bin/view/RowGameStatusView$1.class new file mode 100644 index 00000000..ab41be33 Binary files /dev/null and b/tictactoe/bin/view/RowGameStatusView$1.class differ diff --git a/tictactoe/bin/view/RowGameStatusView$GameStatus.class b/tictactoe/bin/view/RowGameStatusView$GameStatus.class new file mode 100644 index 00000000..1bbf3021 Binary files /dev/null and b/tictactoe/bin/view/RowGameStatusView$GameStatus.class differ diff --git a/tictactoe/bin/view/RowGameStatusView.class b/tictactoe/bin/view/RowGameStatusView.class new file mode 100644 index 00000000..2f168b8f Binary files /dev/null and b/tictactoe/bin/view/RowGameStatusView.class differ diff --git a/tictactoe/jdoc/RowGameApp.html b/tictactoe/jdoc/RowGameApp.html new file mode 100644 index 00000000..104b474e --- /dev/null +++ b/tictactoe/jdoc/RowGameApp.html @@ -0,0 +1,161 @@ + + + + +RowGameApp (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+ +
+

Class RowGameApp

+
+
java.lang.Object +
RowGameApp
+
+
+
+
public class RowGameApp +extends Object
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      RowGameApp

      +
      public RowGameApp()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      main

      +
      public static void main(String[] args)
      +
      Starts a new game in the GUI.
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/tictactoe/jdoc/allclasses-index.html b/tictactoe/jdoc/allclasses-index.html new file mode 100644 index 00000000..1afb07dc --- /dev/null +++ b/tictactoe/jdoc/allclasses-index.html @@ -0,0 +1,97 @@ + + + + +All Classes and Interfaces (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

All Classes and Interfaces

+
+
+
+
+
+
Class
+
Description
+ +
+
The TicTacToeBlock class represents a given block in the game.
+
+ +
+
Used enum to distinguish the pieces for each player
+
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
+
Type safety using enums
+
+ +
 
+
+
+
+
+
+
+ + diff --git a/tictactoe/jdoc/allpackages-index.html b/tictactoe/jdoc/allpackages-index.html new file mode 100644 index 00000000..421ff537 --- /dev/null +++ b/tictactoe/jdoc/allpackages-index.html @@ -0,0 +1,71 @@ + + + + +All Packages (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

All Packages

+
+
Package Summary
+
+
Package
+
Description
+ +
 
+ +
 
+ +
 
+ +
 
+
+
+
+
+ + diff --git a/tictactoe/jdoc/class-use/RowGameApp.html b/tictactoe/jdoc/class-use/RowGameApp.html new file mode 100644 index 00000000..9b2b48cb --- /dev/null +++ b/tictactoe/jdoc/class-use/RowGameApp.html @@ -0,0 +1,58 @@ + + + + +Uses of Class RowGameApp (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
RowGameApp

+
+No usage of RowGameApp
+
+
+ + diff --git a/tictactoe/jdoc/constant-values.html b/tictactoe/jdoc/constant-values.html new file mode 100644 index 00000000..9be2577b --- /dev/null +++ b/tictactoe/jdoc/constant-values.html @@ -0,0 +1,80 @@ + + + + +Constant Field Values (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Constant Field Values

+
+

Contents

+ +
+
+
+

model.*

+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/controller/RowGameController.html b/tictactoe/jdoc/controller/RowGameController.html new file mode 100644 index 00000000..26c635c2 --- /dev/null +++ b/tictactoe/jdoc/controller/RowGameController.html @@ -0,0 +1,374 @@ + + + + +RowGameController (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+ +
+
Package controller
+

Class RowGameController

+
+
java.lang.Object +
controller.RowGameController
+
+
+
+
public class RowGameController +extends Object
+
+
+
    + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    + + +
     
    + + +
     
    +
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    + +
    +
    Creates a new game initializing the GUI.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    boolean
    +
    columnChecker(int x, + int y)
    +
    +
    Checks if the last placed piece makes a column-of-three of the same piece
    +
    +
    boolean
    +
    diagChecker(int x, + int y)
    +
    +
    Checks if the last placed piece makes a diagonal-of-three of the same piece
    +
    +
    private void
    +
    doTurn(int y, + int x, + boolean isPlayer1)
    +
    +
    Sets the piece on the board for the specific player
    +
    +
    void
    + +
    +
    Ends the game disallowing further player turns.
    +
    +
    boolean
    +
    lineChecker(int x, + int y)
    +
    +
    Incorporates the functions above to check for three-in-a-row pieces
    +
    +
    void
    +
    move(JButton block)
    +
    +
    Moves the current player into the given block.
    +
    +
    private void
    +
    playerWinCheck(JButton block, + boolean isPlayer1)
    +
    +
    Incorporates all the functions above to check for the winner + If there is a three-in-a-row after the turn, player# wins
    +
    +
    void
    + +
    +
    Resets the game to be able to start playing again.
    +
    +
    boolean
    +
    rowChecker(int x, + int y)
    +
    +
    Checks if the last placed piece makes a row-of-three of the same piece
    +
    +
    void
    + +
    +
    Checks the board to see if a player has won
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      RowGameController

      +
      public RowGameController()
      +
      Creates a new game initializing the GUI.
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      move

      +
      public void move(JButton block)
      +
      Moves the current player into the given block.
      +
      +
      Parameters:
      +
      block - The block to be moved to by the current player
      +
      +
      +
    • +
    • +
      +

      winChecker

      +
      public void winChecker(JButton block)
      +
      Checks the board to see if a player has won
      +
      +
      Parameters:
      +
      block - the board the players are playing on
      +
      +
      +
    • +
    • +
      +

      rowChecker

      +
      public boolean rowChecker(int x, + int y)
      +
      Checks if the last placed piece makes a row-of-three of the same piece
      +
      +
      Parameters:
      +
      x - column index of the piece
      +
      y - row index of the piece
      +
      Returns:
      +
      boolean
      +
      +
      +
    • +
    • +
      +

      columnChecker

      +
      public boolean columnChecker(int x, + int y)
      +
      Checks if the last placed piece makes a column-of-three of the same piece
      +
      +
      Parameters:
      +
      x - column index of the piece
      +
      y - row index of the piece
      +
      Returns:
      +
      boolean
      +
      +
      +
    • +
    • +
      +

      diagChecker

      +
      public boolean diagChecker(int x, + int y)
      +
      Checks if the last placed piece makes a diagonal-of-three of the same piece
      +
      +
      Parameters:
      +
      x - column index of the piece
      +
      y - row index of the piece
      +
      Returns:
      +
      boolean
      +
      +
      +
    • +
    • +
      +

      lineChecker

      +
      public boolean lineChecker(int x, + int y)
      +
      Incorporates the functions above to check for three-in-a-row pieces
      +
      +
      Parameters:
      +
      x - column index of the piece
      +
      y - row index of the piece
      +
      Returns:
      +
      boolean
      +
      +
      +
    • +
    • +
      +

      doTurn

      +
      private void doTurn(int y, + int x, + boolean isPlayer1)
      +
      Sets the piece on the board for the specific player
      +
      +
      Parameters:
      +
      y - row index of where the piece should be
      +
      x - column index of where the piece should be
      +
      isPlayer1 - boolean of whether it's player1's turn or not
      +
      +
      +
    • +
    • +
      +

      playerWinCheck

      +
      private void playerWinCheck(JButton block, + boolean isPlayer1)
      +
      Incorporates all the functions above to check for the winner + If there is a three-in-a-row after the turn, player# wins
      +
      +
      Parameters:
      +
      block - board where the players are playing
      +
      isPlayer1 - boolean of whether it's player1's turn or not
      +
      +
      +
    • +
    • +
      +

      endGame

      +
      public void endGame()
      +
      Ends the game disallowing further player turns.
      +
      +
    • +
    • +
      +

      resetGame

      +
      public void resetGame()
      +
      Resets the game to be able to start playing again.
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/tictactoe/jdoc/controller/class-use/RowGameController.html b/tictactoe/jdoc/controller/class-use/RowGameController.html new file mode 100644 index 00000000..698f401b --- /dev/null +++ b/tictactoe/jdoc/controller/class-use/RowGameController.html @@ -0,0 +1,85 @@ + + + + +Uses of Class controller.RowGameController (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
controller.RowGameController

+
+
Packages that use RowGameController
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/controller/package-summary.html b/tictactoe/jdoc/controller/package-summary.html new file mode 100644 index 00000000..85533f45 --- /dev/null +++ b/tictactoe/jdoc/controller/package-summary.html @@ -0,0 +1,83 @@ + + + + +controller (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Package controller

+
+
+
package controller
+
+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/controller/package-tree.html b/tictactoe/jdoc/controller/package-tree.html new file mode 100644 index 00000000..c9a24ec7 --- /dev/null +++ b/tictactoe/jdoc/controller/package-tree.html @@ -0,0 +1,72 @@ + + + + +controller Class Hierarchy (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package controller

+Package Hierarchies: + +
+
+

Class Hierarchy

+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/controller/package-use.html b/tictactoe/jdoc/controller/package-use.html new file mode 100644 index 00000000..c19946ab --- /dev/null +++ b/tictactoe/jdoc/controller/package-use.html @@ -0,0 +1,80 @@ + + + + +Uses of Package controller (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
controller

+
+
Packages that use controller
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/element-list b/tictactoe/jdoc/element-list new file mode 100644 index 00000000..6fe59263 --- /dev/null +++ b/tictactoe/jdoc/element-list @@ -0,0 +1,4 @@ +unnamed package +controller +model +view diff --git a/tictactoe/jdoc/help-doc.html b/tictactoe/jdoc/help-doc.html new file mode 100644 index 00000000..25f12781 --- /dev/null +++ b/tictactoe/jdoc/help-doc.html @@ -0,0 +1,182 @@ + + + + +API Help (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+

JavaDoc Help

+ +
+
+

Navigation

+Starting from the Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The Index and Search box allow you to navigate to specific declarations and summary pages, including: All Packages, All Classes and Interfaces + +
+
+
+

Kinds of Pages

+The following sections describe the different kinds of pages in this collection. +
+

Overview

+

The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

+
+
+

Package

+

Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:

+
    +
  • Interfaces
  • +
  • Classes
  • +
  • Enum Classes
  • +
  • Exceptions
  • +
  • Errors
  • +
  • Annotation Interfaces
  • +
+
+
+

Class or Interface

+

Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.

+
    +
  • Class Inheritance Diagram
  • +
  • Direct Subclasses
  • +
  • All Known Subinterfaces
  • +
  • All Known Implementing Classes
  • +
  • Class or Interface Declaration
  • +
  • Class or Interface Description
  • +
+
+
    +
  • Nested Class Summary
  • +
  • Enum Constant Summary
  • +
  • Field Summary
  • +
  • Property Summary
  • +
  • Constructor Summary
  • +
  • Method Summary
  • +
  • Required Element Summary
  • +
  • Optional Element Summary
  • +
+
+
    +
  • Enum Constant Details
  • +
  • Field Details
  • +
  • Property Details
  • +
  • Constructor Details
  • +
  • Method Details
  • +
  • Element Details
  • +
+

Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.

+

The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

+
+
+

Other Files

+

Packages and modules may contain pages with additional information related to the declarations nearby.

+
+
+

Use

+

Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the USE link in the navigation bar.

+
+
+

Tree (Class Hierarchy)

+

There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.

+
    +
  • When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
  • +
  • When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
  • +
+
+
+

All Packages

+

The All Packages page contains an alphabetic index of all packages contained in the documentation.

+
+
+

All Classes and Interfaces

+

The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.

+
+
+

Index

+

The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields in the documentation, as well as summary pages such as All Packages, All Classes and Interfaces.

+
+
+
+This help file applies to API documentation generated by the standard doclet.
+
+
+ + diff --git a/tictactoe/jdoc/index-all.html b/tictactoe/jdoc/index-all.html new file mode 100644 index 00000000..394b2699 --- /dev/null +++ b/tictactoe/jdoc/index-all.html @@ -0,0 +1,356 @@ + + + + +Index (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Index

+
+B C D E F G I L M O P R S T U V W X 
All Classes and Interfaces|All Packages +

B

+
+
blocks - Variable in class view.RowGameBoardView
+
 
+
blocksData - Variable in class model.RowGameModel
+
 
+
boardView - Variable in class view.RowGameGUI
+
 
+
+

C

+
+
columnChecker(int, int) - Method in class controller.RowGameController
+
+
Checks if the last placed piece makes a column-of-three of the same piece
+
+
contents - Variable in class model.RowBlockModel
+
+
The current value of the contents of this block
+
+
controller - package controller
+
 
+
+

D

+
+
diagChecker(int, int) - Method in class controller.RowGameController
+
+
Checks if the last placed piece makes a diagonal-of-three of the same piece
+
+
disableButtons() - Method in class view.RowGameGUI
+
 
+
doTurn(int, int, boolean) - Method in class controller.RowGameController
+
+
Sets the piece on the board for the specific player
+
+
DRAW - Enum constant in enum class view.RowGameStatusView.GameStatus
+
 
+
+

E

+
+
Empty - Enum constant in enum class model.RowBlockModel.PlayerPiece
+
 
+
endGame() - Method in class controller.RowGameController
+
+
Ends the game disallowing further player turns.
+
+
equals(Object) - Method in class model.RowBlockModel
+
 
+
+

F

+
+
finalResult - Variable in class model.RowGameModel
+
 
+
+

G

+
+
game - Variable in class model.RowBlockModel
+
+
The game that contains this block
+
+
GAME_END_NOWINNER - Static variable in class model.RowGameModel
+
 
+
gameModel - Variable in class controller.RowGameController
+
 
+
gameModel - Variable in class view.RowGameGUI
+
 
+
GameStatus() - Constructor for enum class view.RowGameStatusView.GameStatus
+
 
+
gameView - Variable in class controller.RowGameController
+
 
+
getBlocks() - Method in class view.RowGameGUI
+
+
Gets the block
+
+
getContents() - Method in class model.RowBlockModel
+
+
Returns the non-null String value of the contents of this block.
+
+
getFinalResult() - Method in class model.RowGameModel
+
 
+
getGame() - Method in class model.RowBlockModel
+
 
+
getIsLegalMove() - Method in class model.RowBlockModel
+
 
+
getPiece() - Method in class model.RowBlockModel
+
 
+
gui - Variable in class view.RowGameGUI
+
 
+
+

I

+
+
isLegalMove - Variable in class model.RowBlockModel
+
+
Whether or not it is currently legal to move into this block
+
+
+

L

+
+
lineChecker(int, int) - Method in class controller.RowGameController
+
+
Incorporates the functions above to check for three-in-a-row pieces
+
+
+

M

+
+
main(String[]) - Static method in class RowGameApp
+
+
Starts a new game in the GUI.
+
+
model - package model
+
 
+
move(JButton) - Method in class controller.RowGameController
+
+
Moves the current player into the given block.
+
+
movesLeft - Variable in class model.RowGameModel
+
 
+
+

O

+
+
O - Enum constant in enum class model.RowBlockModel.PlayerPiece
+
 
+
One - Enum constant in enum class model.RowGameModel.Player
+
 
+
+

P

+
+
P1TURN - Enum constant in enum class view.RowGameStatusView.GameStatus
+
 
+
P1WIN - Enum constant in enum class view.RowGameStatusView.GameStatus
+
 
+
P2TURN - Enum constant in enum class view.RowGameStatusView.GameStatus
+
 
+
P2WIN - Enum constant in enum class view.RowGameStatusView.GameStatus
+
 
+
player - Variable in class model.RowGameModel
+
+
The current player taking their turn
+
+
Player() - Constructor for enum class model.RowGameModel.Player
+
 
+
PlayerPiece(String) - Constructor for enum class model.RowBlockModel.PlayerPiece
+
 
+
playerturn - Variable in class view.RowGameStatusView
+
 
+
playerWinCheck(JButton, boolean) - Method in class controller.RowGameController
+
+
Incorporates all the functions above to check for the winner + If there is a three-in-a-row after the turn, player# wins
+
+
+

R

+
+
reset - Variable in class view.RowGameGUI
+
 
+
reset() - Method in class model.RowBlockModel
+
+
Resets this block before starting a new game.
+
+
resetGame() - Method in class controller.RowGameController
+
+
Resets the game to be able to start playing again.
+
+
RowBlockModel - Class in model
+
+
The TicTacToeBlock class represents a given block in the game.
+
+
RowBlockModel(RowBlockModel) - Constructor for class model.RowBlockModel
+
 
+
RowBlockModel(RowGameModel) - Constructor for class model.RowBlockModel
+
+
Creates a new block that will be contained in the given game.
+
+
RowBlockModel.PlayerPiece - Enum Class in model
+
+
Used enum to distinguish the pieces for each player
+
+
rowChecker(int, int) - Method in class controller.RowGameController
+
+
Checks if the last placed piece makes a row-of-three of the same piece
+
+
RowGameApp - Class in Unnamed Package
+
 
+
RowGameApp() - Constructor for class RowGameApp
+
 
+
RowGameBoardView - Class in view
+
 
+
RowGameBoardView() - Constructor for class view.RowGameBoardView
+
 
+
RowGameController - Class in controller
+
 
+
RowGameController() - Constructor for class controller.RowGameController
+
+
Creates a new game initializing the GUI.
+
+
RowGameGUI - Class in view
+
 
+
RowGameGUI(RowGameController) - Constructor for class view.RowGameGUI
+
+
Creates a new game initializing the GUI.
+
+
RowGameModel - Class in model
+
 
+
RowGameModel() - Constructor for class model.RowGameModel
+
 
+
RowGameModel.Player - Enum Class in model
+
 
+
RowGameStatusView - Class in view
+
+
Type safety using enums
+
+
RowGameStatusView() - Constructor for class view.RowGameStatusView
+
 
+
RowGameStatusView.GameStatus - Enum Class in view
+
 
+
+

S

+
+
setFinalResult(RowGameStatusView.GameStatus) - Method in class model.RowGameModel
+
 
+
setIsLegalMove(boolean) - Method in class model.RowBlockModel
+
 
+
setPiece(RowBlockModel.PlayerPiece) - Method in class model.RowBlockModel
+
+
Sets the contents of this block to the given value.
+
+
START - Enum constant in enum class view.RowGameStatusView.GameStatus
+
 
+
statusView - Variable in class view.RowGameGUI
+
 
+
str - Variable in enum class model.RowBlockModel.PlayerPiece
+
 
+
+

T

+
+
toString() - Method in enum class model.RowBlockModel.PlayerPiece
+
 
+
Two - Enum constant in enum class model.RowGameModel.Player
+
 
+
+

U

+
+
update(RowGameModel, int, int) - Method in class view.RowGameBoardView
+
 
+
update(RowGameStatusView.GameStatus) - Method in class view.RowGameStatusView
+
 
+
updateBlock(RowGameModel, int, int) - Method in class view.RowGameGUI
+
+
Updates the block at the given row and column + after one of the player's moves.
+
+
updateStatus(RowGameStatusView.GameStatus) - Method in class view.RowGameGUI
+
 
+
+

V

+
+
valueOf(String) - Static method in enum class model.RowBlockModel.PlayerPiece
+
+
Returns the enum constant of this class with the specified name.
+
+
valueOf(String) - Static method in enum class model.RowGameModel.Player
+
+
Returns the enum constant of this class with the specified name.
+
+
valueOf(String) - Static method in enum class view.RowGameStatusView.GameStatus
+
+
Returns the enum constant of this class with the specified name.
+
+
values() - Static method in enum class model.RowBlockModel.PlayerPiece
+
+
Returns an array containing the constants of this enum class, in +the order they are declared.
+
+
values() - Static method in enum class model.RowGameModel.Player
+
+
Returns an array containing the constants of this enum class, in +the order they are declared.
+
+
values() - Static method in enum class view.RowGameStatusView.GameStatus
+
+
Returns an array containing the constants of this enum class, in +the order they are declared.
+
+
view - package view
+
 
+
+

W

+
+
winChecker(JButton) - Method in class controller.RowGameController
+
+
Checks the board to see if a player has won
+
+
+

X

+
+
X - Enum constant in enum class model.RowBlockModel.PlayerPiece
+
 
+
+B C D E F G I L M O P R S T U V W X 
All Classes and Interfaces|All Packages
+
+
+ + diff --git a/tictactoe/jdoc/index.html b/tictactoe/jdoc/index.html new file mode 100644 index 00000000..c58b7f6a --- /dev/null +++ b/tictactoe/jdoc/index.html @@ -0,0 +1,68 @@ + + + + +Overview (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+
Packages
+
+
Package
+
Description
+ +
 
+ +
 
+ +
 
+
+
+
+
+
+ + diff --git a/tictactoe/jdoc/jquery-ui.overrides.css b/tictactoe/jdoc/jquery-ui.overrides.css new file mode 100644 index 00000000..1abff952 --- /dev/null +++ b/tictactoe/jdoc/jquery-ui.overrides.css @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + /* Overrides the color of selection used in jQuery UI */ + background: #F8981D; +} diff --git a/tictactoe/jdoc/legal/COPYRIGHT b/tictactoe/jdoc/legal/COPYRIGHT new file mode 100644 index 00000000..ca74fffd --- /dev/null +++ b/tictactoe/jdoc/legal/COPYRIGHT @@ -0,0 +1 @@ +Please see ..\java.base\COPYRIGHT diff --git a/tictactoe/jdoc/legal/LICENSE b/tictactoe/jdoc/legal/LICENSE new file mode 100644 index 00000000..4ad9fe40 --- /dev/null +++ b/tictactoe/jdoc/legal/LICENSE @@ -0,0 +1 @@ +Please see ..\java.base\LICENSE diff --git a/tictactoe/jdoc/legal/jquery.md b/tictactoe/jdoc/legal/jquery.md new file mode 100644 index 00000000..8054a34c --- /dev/null +++ b/tictactoe/jdoc/legal/jquery.md @@ -0,0 +1,72 @@ +## jQuery v3.5.1 + +### jQuery License +``` +jQuery v 3.5.1 +Copyright JS Foundation and other contributors, https://js.foundation/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************** + +The jQuery JavaScript Library v3.5.1 also includes Sizzle.js + +Sizzle.js includes the following license: + +Copyright JS Foundation and other contributors, https://js.foundation/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/sizzle + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. + +********************* + +``` diff --git a/tictactoe/jdoc/legal/jqueryUI.md b/tictactoe/jdoc/legal/jqueryUI.md new file mode 100644 index 00000000..8031bdb5 --- /dev/null +++ b/tictactoe/jdoc/legal/jqueryUI.md @@ -0,0 +1,49 @@ +## jQuery UI v1.12.1 + +### jQuery UI License +``` +Copyright jQuery Foundation and other contributors, https://jquery.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/jquery-ui + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code contained within the demos directory. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. + +``` diff --git a/tictactoe/jdoc/member-search-index.js b/tictactoe/jdoc/member-search-index.js new file mode 100644 index 00000000..54a005cb --- /dev/null +++ b/tictactoe/jdoc/member-search-index.js @@ -0,0 +1 @@ +memberSearchIndex = [{"p":"view","c":"RowGameBoardView","l":"blocks"},{"p":"model","c":"RowGameModel","l":"blocksData"},{"p":"view","c":"RowGameGUI","l":"boardView"},{"p":"controller","c":"RowGameController","l":"columnChecker(int, int)","u":"columnChecker(int,int)"},{"p":"model","c":"RowBlockModel","l":"contents"},{"p":"controller","c":"RowGameController","l":"diagChecker(int, int)","u":"diagChecker(int,int)"},{"p":"view","c":"RowGameGUI","l":"disableButtons()"},{"p":"controller","c":"RowGameController","l":"doTurn(int, int, boolean)","u":"doTurn(int,int,boolean)"},{"p":"view","c":"RowGameStatusView.GameStatus","l":"DRAW"},{"p":"model","c":"RowBlockModel.PlayerPiece","l":"Empty"},{"p":"controller","c":"RowGameController","l":"endGame()"},{"p":"model","c":"RowBlockModel","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"model","c":"RowGameModel","l":"finalResult"},{"p":"model","c":"RowBlockModel","l":"game"},{"p":"model","c":"RowGameModel","l":"GAME_END_NOWINNER"},{"p":"controller","c":"RowGameController","l":"gameModel"},{"p":"view","c":"RowGameGUI","l":"gameModel"},{"p":"view","c":"RowGameStatusView.GameStatus","l":"GameStatus()","u":"%3Cinit%3E()"},{"p":"controller","c":"RowGameController","l":"gameView"},{"p":"view","c":"RowGameGUI","l":"getBlocks()"},{"p":"model","c":"RowBlockModel","l":"getContents()"},{"p":"model","c":"RowGameModel","l":"getFinalResult()"},{"p":"model","c":"RowBlockModel","l":"getGame()"},{"p":"model","c":"RowBlockModel","l":"getIsLegalMove()"},{"p":"model","c":"RowBlockModel","l":"getPiece()"},{"p":"view","c":"RowGameGUI","l":"gui"},{"p":"model","c":"RowBlockModel","l":"isLegalMove"},{"p":"controller","c":"RowGameController","l":"lineChecker(int, int)","u":"lineChecker(int,int)"},{"p":"","c":"RowGameApp","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"controller","c":"RowGameController","l":"move(JButton)","u":"move(javax.swing.JButton)"},{"p":"model","c":"RowGameModel","l":"movesLeft"},{"p":"model","c":"RowBlockModel.PlayerPiece","l":"O"},{"p":"model","c":"RowGameModel.Player","l":"One"},{"p":"view","c":"RowGameStatusView.GameStatus","l":"P1TURN"},{"p":"view","c":"RowGameStatusView.GameStatus","l":"P1WIN"},{"p":"view","c":"RowGameStatusView.GameStatus","l":"P2TURN"},{"p":"view","c":"RowGameStatusView.GameStatus","l":"P2WIN"},{"p":"model","c":"RowGameModel","l":"player"},{"p":"model","c":"RowGameModel.Player","l":"Player()","u":"%3Cinit%3E()"},{"p":"model","c":"RowBlockModel.PlayerPiece","l":"PlayerPiece(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"view","c":"RowGameStatusView","l":"playerturn"},{"p":"controller","c":"RowGameController","l":"playerWinCheck(JButton, boolean)","u":"playerWinCheck(javax.swing.JButton,boolean)"},{"p":"view","c":"RowGameGUI","l":"reset"},{"p":"model","c":"RowBlockModel","l":"reset()"},{"p":"controller","c":"RowGameController","l":"resetGame()"},{"p":"model","c":"RowBlockModel","l":"RowBlockModel(RowBlockModel)","u":"%3Cinit%3E(model.RowBlockModel)"},{"p":"model","c":"RowBlockModel","l":"RowBlockModel(RowGameModel)","u":"%3Cinit%3E(model.RowGameModel)"},{"p":"controller","c":"RowGameController","l":"rowChecker(int, int)","u":"rowChecker(int,int)"},{"p":"","c":"RowGameApp","l":"RowGameApp()","u":"%3Cinit%3E()"},{"p":"view","c":"RowGameBoardView","l":"RowGameBoardView()","u":"%3Cinit%3E()"},{"p":"controller","c":"RowGameController","l":"RowGameController()","u":"%3Cinit%3E()"},{"p":"view","c":"RowGameGUI","l":"RowGameGUI(RowGameController)","u":"%3Cinit%3E(controller.RowGameController)"},{"p":"model","c":"RowGameModel","l":"RowGameModel()","u":"%3Cinit%3E()"},{"p":"view","c":"RowGameStatusView","l":"RowGameStatusView()","u":"%3Cinit%3E()"},{"p":"model","c":"RowGameModel","l":"setFinalResult(RowGameStatusView.GameStatus)","u":"setFinalResult(view.RowGameStatusView.GameStatus)"},{"p":"model","c":"RowBlockModel","l":"setIsLegalMove(boolean)"},{"p":"model","c":"RowBlockModel","l":"setPiece(RowBlockModel.PlayerPiece)","u":"setPiece(model.RowBlockModel.PlayerPiece)"},{"p":"view","c":"RowGameStatusView.GameStatus","l":"START"},{"p":"view","c":"RowGameGUI","l":"statusView"},{"p":"model","c":"RowBlockModel.PlayerPiece","l":"str"},{"p":"model","c":"RowBlockModel.PlayerPiece","l":"toString()"},{"p":"model","c":"RowGameModel.Player","l":"Two"},{"p":"view","c":"RowGameBoardView","l":"update(RowGameModel, int, int)","u":"update(model.RowGameModel,int,int)"},{"p":"view","c":"RowGameStatusView","l":"update(RowGameStatusView.GameStatus)","u":"update(view.RowGameStatusView.GameStatus)"},{"p":"view","c":"RowGameGUI","l":"updateBlock(RowGameModel, int, int)","u":"updateBlock(model.RowGameModel,int,int)"},{"p":"view","c":"RowGameGUI","l":"updateStatus(RowGameStatusView.GameStatus)","u":"updateStatus(view.RowGameStatusView.GameStatus)"},{"p":"model","c":"RowBlockModel.PlayerPiece","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"model","c":"RowGameModel.Player","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"view","c":"RowGameStatusView.GameStatus","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"model","c":"RowBlockModel.PlayerPiece","l":"values()"},{"p":"model","c":"RowGameModel.Player","l":"values()"},{"p":"view","c":"RowGameStatusView.GameStatus","l":"values()"},{"p":"controller","c":"RowGameController","l":"winChecker(JButton)","u":"winChecker(javax.swing.JButton)"},{"p":"model","c":"RowBlockModel.PlayerPiece","l":"X"}];updateSearchResults(); \ No newline at end of file diff --git a/tictactoe/jdoc/model/RowBlockModel.PlayerPiece.html b/tictactoe/jdoc/model/RowBlockModel.PlayerPiece.html new file mode 100644 index 00000000..13249ca6 --- /dev/null +++ b/tictactoe/jdoc/model/RowBlockModel.PlayerPiece.html @@ -0,0 +1,302 @@ + + + + +RowBlockModel.PlayerPiece (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+ +
+
Package model
+

Enum Class RowBlockModel.PlayerPiece

+
+
java.lang.Object +
java.lang.Enum<RowBlockModel.PlayerPiece> +
model.RowBlockModel.PlayerPiece
+
+
+
+
+
All Implemented Interfaces:
+
Serializable, Comparable<RowBlockModel.PlayerPiece>, Constable
+
+
+
Enclosing class:
+
RowBlockModel
+
+
+
public static enum RowBlockModel.PlayerPiece +extends Enum<RowBlockModel.PlayerPiece>
+
Used enum to distinguish the pieces for each player
+
+
+ +
+
+
    + +
  • +
    +

    Enum Constant Details

    + +
    +
  • + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      str

      +
      private final String str
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      PlayerPiece

      +
      private PlayerPiece(String str)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      values

      +
      public static RowBlockModel.PlayerPiece[] values()
      +
      Returns an array containing the constants of this enum class, in +the order they are declared.
      +
      +
      Returns:
      +
      an array containing the constants of this enum class, in the order they are declared
      +
      +
      +
    • +
    • +
      +

      valueOf

      +
      public static RowBlockModel.PlayerPiece valueOf(String name)
      +
      Returns the enum constant of this class with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this class. (Extraneous whitespace characters are +not permitted.)
      +
      +
      Parameters:
      +
      name - the name of the enum constant to be returned.
      +
      Returns:
      +
      the enum constant with the specified name
      +
      Throws:
      +
      IllegalArgumentException - if this enum class has no constant with the specified name
      +
      NullPointerException - if the argument is null
      +
      +
      +
    • +
    • +
      +

      toString

      +
      public String toString()
      +
      +
      Overrides:
      +
      toString in class Enum<RowBlockModel.PlayerPiece>
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/tictactoe/jdoc/model/RowBlockModel.html b/tictactoe/jdoc/model/RowBlockModel.html new file mode 100644 index 00000000..23c60a90 --- /dev/null +++ b/tictactoe/jdoc/model/RowBlockModel.html @@ -0,0 +1,336 @@ + + + + +RowBlockModel (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+ +
+
Package model
+

Class RowBlockModel

+
+
java.lang.Object +
model.RowBlockModel
+
+
+
+
public class RowBlockModel +extends Object
+
The TicTacToeBlock class represents a given block in the game.
+
+
+ +
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      game

      +
      private RowGameModel game
      +
      The game that contains this block
      +
      +
    • +
    • +
      +

      contents

      +
      private RowBlockModel.PlayerPiece contents
      +
      The current value of the contents of this block
      +
      +
    • +
    • +
      +

      isLegalMove

      +
      private boolean isLegalMove
      +
      Whether or not it is currently legal to move into this block
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      RowBlockModel

      +
      public RowBlockModel(RowGameModel rowGameModel)
      +
      Creates a new block that will be contained in the given game.
      +
      +
      Parameters:
      +
      rowGameModel - The game that will contain the new block
      +
      Throws:
      +
      IllegalArgumentException - When the given game is null
      +
      +
      +
    • +
    • +
      +

      RowBlockModel

      +
      public RowBlockModel(RowBlockModel block)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getGame

      +
      public RowGameModel getGame()
      +
      +
    • +
    • +
      +

      setPiece

      +
      public void setPiece(RowBlockModel.PlayerPiece playerPiece)
      +
      Sets the contents of this block to the given value.
      +
      +
      Parameters:
      +
      value - The new value for the contents of this block
      +
      Throws:
      +
      IllegalArgumentException - When the given value is null
      +
      +
      +
    • +
    • +
      +

      getPiece

      +
      public RowBlockModel.PlayerPiece getPiece()
      +
      +
    • +
    • +
      +

      getContents

      +
      public String getContents()
      +
      Returns the non-null String value of the contents of this block.
      +
      +
      Returns:
      +
      The non-null String value
      +
      +
      +
    • +
    • +
      +

      setIsLegalMove

      +
      public void setIsLegalMove(boolean isLegalMove)
      +
      +
    • +
    • +
      +

      getIsLegalMove

      +
      public boolean getIsLegalMove()
      +
      +
    • +
    • +
      +

      reset

      +
      public void reset()
      +
      Resets this block before starting a new game.
      +
      +
    • +
    • +
      +

      equals

      +
      public boolean equals(Object other)
      +
      +
      Overrides:
      +
      equals in class Object
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/tictactoe/jdoc/model/RowGameModel.Player.html b/tictactoe/jdoc/model/RowGameModel.Player.html new file mode 100644 index 00000000..9a554e40 --- /dev/null +++ b/tictactoe/jdoc/model/RowGameModel.Player.html @@ -0,0 +1,251 @@ + + + + +RowGameModel.Player (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+ +
+
Package model
+

Enum Class RowGameModel.Player

+
+
java.lang.Object +
java.lang.Enum<RowGameModel.Player> +
model.RowGameModel.Player
+
+
+
+
+
All Implemented Interfaces:
+
Serializable, Comparable<RowGameModel.Player>, Constable
+
+
+
Enclosing class:
+
RowGameModel
+
+
+
public static enum RowGameModel.Player +extends Enum<RowGameModel.Player>
+
+
+ +
+
+
    + +
  • +
    +

    Enum Constant Details

    + +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      Player

      +
      private Player()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      values

      +
      public static RowGameModel.Player[] values()
      +
      Returns an array containing the constants of this enum class, in +the order they are declared.
      +
      +
      Returns:
      +
      an array containing the constants of this enum class, in the order they are declared
      +
      +
      +
    • +
    • +
      +

      valueOf

      +
      public static RowGameModel.Player valueOf(String name)
      +
      Returns the enum constant of this class with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this class. (Extraneous whitespace characters are +not permitted.)
      +
      +
      Parameters:
      +
      name - the name of the enum constant to be returned.
      +
      Returns:
      +
      the enum constant with the specified name
      +
      Throws:
      +
      IllegalArgumentException - if this enum class has no constant with the specified name
      +
      NullPointerException - if the argument is null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/tictactoe/jdoc/model/RowGameModel.html b/tictactoe/jdoc/model/RowGameModel.html new file mode 100644 index 00000000..d9f527de --- /dev/null +++ b/tictactoe/jdoc/model/RowGameModel.html @@ -0,0 +1,251 @@ + + + + +RowGameModel (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+ +
+
Package model
+

Class RowGameModel

+
+
java.lang.Object +
model.RowGameModel
+
+
+
+
public class RowGameModel +extends Object
+
+
+ +
+
+ +
+ +
+
+
+ + diff --git a/tictactoe/jdoc/model/class-use/RowBlockModel.PlayerPiece.html b/tictactoe/jdoc/model/class-use/RowBlockModel.PlayerPiece.html new file mode 100644 index 00000000..34bfd29b --- /dev/null +++ b/tictactoe/jdoc/model/class-use/RowBlockModel.PlayerPiece.html @@ -0,0 +1,116 @@ + + + + +Uses of Enum Class model.RowBlockModel.PlayerPiece (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Enum Class
model.RowBlockModel.PlayerPiece

+
+
Packages that use RowBlockModel.PlayerPiece
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/model/class-use/RowBlockModel.html b/tictactoe/jdoc/model/class-use/RowBlockModel.html new file mode 100644 index 00000000..fa040499 --- /dev/null +++ b/tictactoe/jdoc/model/class-use/RowBlockModel.html @@ -0,0 +1,92 @@ + + + + +Uses of Class model.RowBlockModel (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
model.RowBlockModel

+
+
Packages that use RowBlockModel
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/model/class-use/RowGameModel.Player.html b/tictactoe/jdoc/model/class-use/RowGameModel.Player.html new file mode 100644 index 00000000..eab6fc63 --- /dev/null +++ b/tictactoe/jdoc/model/class-use/RowGameModel.Player.html @@ -0,0 +1,102 @@ + + + + +Uses of Enum Class model.RowGameModel.Player (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Enum Class
model.RowGameModel.Player

+
+
Packages that use RowGameModel.Player
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/model/class-use/RowGameModel.html b/tictactoe/jdoc/model/class-use/RowGameModel.html new file mode 100644 index 00000000..4b070a9e --- /dev/null +++ b/tictactoe/jdoc/model/class-use/RowGameModel.html @@ -0,0 +1,156 @@ + + + + +Uses of Class model.RowGameModel (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
model.RowGameModel

+
+
Packages that use RowGameModel
+
+
Package
+
Description
+ +
 
+ +
 
+ +
 
+
+
+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/model/package-summary.html b/tictactoe/jdoc/model/package-summary.html new file mode 100644 index 00000000..6959653f --- /dev/null +++ b/tictactoe/jdoc/model/package-summary.html @@ -0,0 +1,99 @@ + + + + +model (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Package model

+
+
+
package model
+
+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/model/package-tree.html b/tictactoe/jdoc/model/package-tree.html new file mode 100644 index 00000000..8032f352 --- /dev/null +++ b/tictactoe/jdoc/model/package-tree.html @@ -0,0 +1,88 @@ + + + + +model Class Hierarchy (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package model

+Package Hierarchies: + +
+
+

Class Hierarchy

+ +
+
+

Enum Class Hierarchy

+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/model/package-use.html b/tictactoe/jdoc/model/package-use.html new file mode 100644 index 00000000..8542f5c6 --- /dev/null +++ b/tictactoe/jdoc/model/package-use.html @@ -0,0 +1,116 @@ + + + + +Uses of Package model (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
model

+
+
Packages that use model
+
+
Package
+
Description
+ +
 
+ +
 
+ +
 
+
+
+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/module-search-index.js b/tictactoe/jdoc/module-search-index.js new file mode 100644 index 00000000..0d59754f --- /dev/null +++ b/tictactoe/jdoc/module-search-index.js @@ -0,0 +1 @@ +moduleSearchIndex = [];updateSearchResults(); \ No newline at end of file diff --git a/tictactoe/jdoc/overview-summary.html b/tictactoe/jdoc/overview-summary.html new file mode 100644 index 00000000..234f87cf --- /dev/null +++ b/tictactoe/jdoc/overview-summary.html @@ -0,0 +1,26 @@ + + + + +CS520 - Homework 1 + + + + + + + + + + + +
+ +

index.html

+
+ + diff --git a/tictactoe/jdoc/overview-tree.html b/tictactoe/jdoc/overview-tree.html new file mode 100644 index 00000000..b445da19 --- /dev/null +++ b/tictactoe/jdoc/overview-tree.html @@ -0,0 +1,96 @@ + + + + +Class Hierarchy (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For All Packages

+Package Hierarchies: + +
+
+

Class Hierarchy

+ +
+
+

Enum Class Hierarchy

+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/package-search-index.js b/tictactoe/jdoc/package-search-index.js new file mode 100644 index 00000000..3a812d6c --- /dev/null +++ b/tictactoe/jdoc/package-search-index.js @@ -0,0 +1 @@ +packageSearchIndex = [{"l":"All Packages","u":"allpackages-index.html"},{"l":"controller"},{"l":"model"},{"l":"view"}];updateSearchResults(); \ No newline at end of file diff --git a/tictactoe/jdoc/package-summary.html b/tictactoe/jdoc/package-summary.html new file mode 100644 index 00000000..f6e187db --- /dev/null +++ b/tictactoe/jdoc/package-summary.html @@ -0,0 +1,82 @@ + + + + +Unnamed Package (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Unnamed Package

+
+
+
+
    +
  • +
    +
    Classes
    +
    +
    Class
    +
    Description
    + +
     
    +
    +
    +
  • +
+
+
+
+
+ + diff --git a/tictactoe/jdoc/package-tree.html b/tictactoe/jdoc/package-tree.html new file mode 100644 index 00000000..7ad850ec --- /dev/null +++ b/tictactoe/jdoc/package-tree.html @@ -0,0 +1,72 @@ + + + + + Class Hierarchy (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Unnamed Package

+Package Hierarchies: + +
+
+

Class Hierarchy

+ +
+
+
+
+ + diff --git a/tictactoe/jdoc/package-use.html b/tictactoe/jdoc/package-use.html new file mode 100644 index 00000000..580e42a8 --- /dev/null +++ b/tictactoe/jdoc/package-use.html @@ -0,0 +1,58 @@ + + + + +Uses of Package (CS520 - Homework 1) + + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package

+
+No usage of Unnamed Package
+
+
+ + diff --git a/tictactoe/jdoc/resources/glass.png b/tictactoe/jdoc/resources/glass.png new file mode 100644 index 00000000..a7f591f4 Binary files /dev/null and b/tictactoe/jdoc/resources/glass.png differ diff --git a/tictactoe/jdoc/resources/x.png b/tictactoe/jdoc/resources/x.png new file mode 100644 index 00000000..30548a75 Binary files /dev/null and b/tictactoe/jdoc/resources/x.png differ diff --git a/tictactoe/jdoc/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png b/tictactoe/jdoc/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 00000000..34abd18f Binary files /dev/null and b/tictactoe/jdoc/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png differ diff --git a/tictactoe/jdoc/script-dir/images/ui-bg_glass_65_dadada_1x400.png b/tictactoe/jdoc/script-dir/images/ui-bg_glass_65_dadada_1x400.png new file mode 100644 index 00000000..f058a938 Binary files /dev/null and b/tictactoe/jdoc/script-dir/images/ui-bg_glass_65_dadada_1x400.png differ diff --git a/tictactoe/jdoc/script-dir/images/ui-bg_glass_75_dadada_1x400.png b/tictactoe/jdoc/script-dir/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 00000000..2ce04c16 Binary files /dev/null and b/tictactoe/jdoc/script-dir/images/ui-bg_glass_75_dadada_1x400.png differ diff --git a/tictactoe/jdoc/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png b/tictactoe/jdoc/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 00000000..a90afb8b Binary files /dev/null and b/tictactoe/jdoc/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png differ diff --git a/tictactoe/jdoc/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png b/tictactoe/jdoc/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 00000000..dbe091f6 Binary files /dev/null and b/tictactoe/jdoc/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png differ diff --git a/tictactoe/jdoc/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/tictactoe/jdoc/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 00000000..5dc3593e Binary files /dev/null and b/tictactoe/jdoc/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ diff --git a/tictactoe/jdoc/script-dir/images/ui-icons_222222_256x240.png b/tictactoe/jdoc/script-dir/images/ui-icons_222222_256x240.png new file mode 100644 index 00000000..e723e17c Binary files /dev/null and b/tictactoe/jdoc/script-dir/images/ui-icons_222222_256x240.png differ diff --git a/tictactoe/jdoc/script-dir/images/ui-icons_2e83ff_256x240.png b/tictactoe/jdoc/script-dir/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 00000000..1f5f4975 Binary files /dev/null and b/tictactoe/jdoc/script-dir/images/ui-icons_2e83ff_256x240.png differ diff --git a/tictactoe/jdoc/script-dir/images/ui-icons_454545_256x240.png b/tictactoe/jdoc/script-dir/images/ui-icons_454545_256x240.png new file mode 100644 index 00000000..618f5b0c Binary files /dev/null and b/tictactoe/jdoc/script-dir/images/ui-icons_454545_256x240.png differ diff --git a/tictactoe/jdoc/script-dir/images/ui-icons_888888_256x240.png b/tictactoe/jdoc/script-dir/images/ui-icons_888888_256x240.png new file mode 100644 index 00000000..ee5e33f2 Binary files /dev/null and b/tictactoe/jdoc/script-dir/images/ui-icons_888888_256x240.png differ diff --git a/tictactoe/jdoc/script-dir/images/ui-icons_cd0a0a_256x240.png b/tictactoe/jdoc/script-dir/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 00000000..7e8ebc18 Binary files /dev/null and b/tictactoe/jdoc/script-dir/images/ui-icons_cd0a0a_256x240.png differ diff --git a/tictactoe/jdoc/script-dir/jquery-3.5.1.min.js b/tictactoe/jdoc/script-dir/jquery-3.5.1.min.js new file mode 100644 index 00000000..b0614034 --- /dev/null +++ b/tictactoe/jdoc/script-dir/jquery-3.5.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0a;a++)for(s in o[a])n=o[a][s],o[a].hasOwnProperty(s)&&void 0!==n&&(e[s]=t.isPlainObject(n)?t.isPlainObject(e[s])?t.widget.extend({},e[s],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,s){var n=s.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=i.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new s(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,l=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};h>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),l.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-r-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-r-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.widget("ui.menu",{version:"1.12.1",defaultElement:"
    ",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,l=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=l.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=l.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("
      ").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:n})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&t.trim(s).length&&(this.liveRegion.children().hide(),t("
      ").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,i){var s=i.item.data("ui-autocomplete-item"),n=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n,this.selectedItem=s})),!1!==this._trigger("select",e,{item:s})&&this._value(s.value),this.term=this._value(),this.close(e),this.selectedItem=s}}),this.liveRegion=t("
      ",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),s=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!s)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length").append(t("
      ").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("
      ").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete}); \ No newline at end of file diff --git a/tictactoe/jdoc/script-dir/jquery-ui.structure.min.css b/tictactoe/jdoc/script-dir/jquery-ui.structure.min.css new file mode 100644 index 00000000..e8808927 --- /dev/null +++ b/tictactoe/jdoc/script-dir/jquery-ui.structure.min.css @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.12.1 - 2018-12-06 +* http://jqueryui.com +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0} \ No newline at end of file diff --git a/tictactoe/jdoc/script.js b/tictactoe/jdoc/script.js new file mode 100644 index 00000000..0765364e --- /dev/null +++ b/tictactoe/jdoc/script.js @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; +function loadScripts(doc, tag) { + createElem(doc, tag, 'search.js'); + + createElem(doc, tag, 'module-search-index.js'); + createElem(doc, tag, 'package-search-index.js'); + createElem(doc, tag, 'type-search-index.js'); + createElem(doc, tag, 'member-search-index.js'); + createElem(doc, tag, 'tag-search-index.js'); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +function show(tableId, selected, columns) { + if (tableId !== selected) { + document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')') + .forEach(function(elem) { + elem.style.display = 'none'; + }); + } + document.querySelectorAll('div.' + selected) + .forEach(function(elem, index) { + elem.style.display = ''; + var isEvenRow = index % (columns * 2) < columns; + elem.classList.remove(isEvenRow ? oddRowColor : evenRowColor); + elem.classList.add(isEvenRow ? evenRowColor : oddRowColor); + }); + updateTabs(tableId, selected); +} + +function updateTabs(tableId, selected) { + document.querySelector('div#' + tableId +' .summary-table') + .setAttribute('aria-labelledby', selected); + document.querySelectorAll('button[id^="' + tableId + '"]') + .forEach(function(tab, index) { + if (selected === tab.id || (tableId === selected && index === 0)) { + tab.className = activeTableTab; + tab.setAttribute('aria-selected', true); + tab.setAttribute('tabindex',0); + } else { + tab.className = tableTab; + tab.setAttribute('aria-selected', false); + tab.setAttribute('tabindex',-1); + } + }); +} + +function switchTab(e) { + var selected = document.querySelector('[aria-selected=true]'); + if (selected) { + if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) { + // left or up arrow key pressed: move focus to previous tab + selected.previousSibling.click(); + selected.previousSibling.focus(); + e.preventDefault(); + } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) { + // right or down arrow key pressed: move focus to next tab + selected.nextSibling.click(); + selected.nextSibling.focus(); + e.preventDefault(); + } + } +} + +var updateSearchResults = function() {}; + +function indexFilesLoaded() { + return moduleSearchIndex + && packageSearchIndex + && typeSearchIndex + && memberSearchIndex + && tagSearchIndex; +} + +// Workaround for scroll position not being included in browser history (8249133) +document.addEventListener("DOMContentLoaded", function(e) { + var contentDiv = document.querySelector("div.flex-content"); + window.addEventListener("popstate", function(e) { + if (e.state !== null) { + contentDiv.scrollTop = e.state; + } + }); + window.addEventListener("hashchange", function(e) { + history.replaceState(contentDiv.scrollTop, document.title); + }); + contentDiv.addEventListener("scroll", function(e) { + var timeoutID; + if (!timeoutID) { + timeoutID = setTimeout(function() { + history.replaceState(contentDiv.scrollTop, document.title); + timeoutID = null; + }, 100); + } + }); + if (!location.hash) { + history.replaceState(contentDiv.scrollTop, document.title); + } +}); diff --git a/tictactoe/jdoc/search.js b/tictactoe/jdoc/search.js new file mode 100644 index 00000000..13aba853 --- /dev/null +++ b/tictactoe/jdoc/search.js @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +var noResult = {l: "No results found"}; +var loading = {l: "Loading search index..."}; +var catModules = "Modules"; +var catPackages = "Packages"; +var catTypes = "Classes and Interfaces"; +var catMembers = "Members"; +var catSearchTags = "Search Tags"; +var highlight = "$&"; +var searchPattern = ""; +var fallbackPattern = ""; +var RANKING_THRESHOLD = 2; +var NO_MATCH = 0xffff; +var MIN_RESULTS = 3; +var MAX_RESULTS = 500; +var UNNAMED = ""; +function escapeHtml(str) { + return str.replace(//g, ">"); +} +function getHighlightedText(item, matcher, fallbackMatcher) { + var escapedItem = escapeHtml(item); + var highlighted = escapedItem.replace(matcher, highlight); + if (highlighted === escapedItem) { + highlighted = escapedItem.replace(fallbackMatcher, highlight) + } + return highlighted; +} +function getURLPrefix(ui) { + var urlPrefix=""; + var slash = "/"; + if (ui.item.category === catModules) { + return ui.item.l + slash; + } else if (ui.item.category === catPackages && ui.item.m) { + return ui.item.m + slash; + } else if (ui.item.category === catTypes || ui.item.category === catMembers) { + if (ui.item.m) { + urlPrefix = ui.item.m + slash; + } else { + $.each(packageSearchIndex, function(index, item) { + if (item.m && ui.item.p === item.l) { + urlPrefix = item.m + slash; + } + }); + } + } + return urlPrefix; +} +function createSearchPattern(term) { + var pattern = ""; + var isWordToken = false; + term.replace(/,\s*/g, ", ").trim().split(/\s+/).forEach(function(w, index) { + if (index > 0) { + // whitespace between identifiers is significant + pattern += (isWordToken && /^\w/.test(w)) ? "\\s+" : "\\s*"; + } + var tokens = w.split(/(?=[A-Z,.()<>[\/])/); + for (var i = 0; i < tokens.length; i++) { + var s = tokens[i]; + if (s === "") { + continue; + } + pattern += $.ui.autocomplete.escapeRegex(s); + isWordToken = /\w$/.test(s); + if (isWordToken) { + pattern += "([a-z0-9_$<>\\[\\]]*?)"; + } + } + }); + return pattern; +} +function createMatcher(pattern, flags) { + var isCamelCase = /[A-Z]/.test(pattern); + return new RegExp(pattern, flags + (isCamelCase ? "" : "i")); +} +var watermark = 'Search'; +$(function() { + var search = $("#search-input"); + var reset = $("#reset-button"); + search.val(''); + search.prop("disabled", false); + reset.prop("disabled", false); + search.val(watermark).addClass('watermark'); + search.blur(function() { + if ($(this).val().length === 0) { + $(this).val(watermark).addClass('watermark'); + } + }); + search.on('click keydown paste', function() { + if ($(this).val() === watermark) { + $(this).val('').removeClass('watermark'); + } + }); + reset.click(function() { + search.val('').focus(); + }); + search.focus()[0].setSelectionRange(0, 0); +}); +$.widget("custom.catcomplete", $.ui.autocomplete, { + _create: function() { + this._super(); + this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)"); + }, + _renderMenu: function(ul, items) { + var rMenu = this; + var currentCategory = ""; + rMenu.menu.bindings = $(); + $.each(items, function(index, item) { + var li; + if (item.category && item.category !== currentCategory) { + ul.append("
    • " + item.category + "
    • "); + currentCategory = item.category; + } + li = rMenu._renderItemData(ul, item); + if (item.category) { + li.attr("aria-label", item.category + " : " + item.l); + li.attr("class", "result-item"); + } else { + li.attr("aria-label", item.l); + li.attr("class", "result-item"); + } + }); + }, + _renderItem: function(ul, item) { + var label = ""; + var matcher = createMatcher(escapeHtml(searchPattern), "g"); + var fallbackMatcher = new RegExp(fallbackPattern, "gi") + if (item.category === catModules) { + label = getHighlightedText(item.l, matcher, fallbackMatcher); + } else if (item.category === catPackages) { + label = getHighlightedText(item.l, matcher, fallbackMatcher); + } else if (item.category === catTypes) { + label = (item.p && item.p !== UNNAMED) + ? getHighlightedText(item.p + "." + item.l, matcher, fallbackMatcher) + : getHighlightedText(item.l, matcher, fallbackMatcher); + } else if (item.category === catMembers) { + label = (item.p && item.p !== UNNAMED) + ? getHighlightedText(item.p + "." + item.c + "." + item.l, matcher, fallbackMatcher) + : getHighlightedText(item.c + "." + item.l, matcher, fallbackMatcher); + } else if (item.category === catSearchTags) { + label = getHighlightedText(item.l, matcher, fallbackMatcher); + } else { + label = item.l; + } + var li = $("
    • ").appendTo(ul); + var div = $("
      ").appendTo(li); + if (item.category === catSearchTags && item.h) { + if (item.d) { + div.html(label + " (" + item.h + ")
      " + + item.d + "
      "); + } else { + div.html(label + " (" + item.h + ")"); + } + } else { + if (item.m) { + div.html(item.m + "/" + label); + } else { + div.html(label); + } + } + return li; + } +}); +function rankMatch(match, category) { + if (!match) { + return NO_MATCH; + } + var index = match.index; + var input = match.input; + var leftBoundaryMatch = 2; + var periferalMatch = 0; + // make sure match is anchored on a left word boundary + if (index === 0 || /\W/.test(input[index - 1]) || "_" === input[index]) { + leftBoundaryMatch = 0; + } else if ("_" === input[index - 1] || (input[index] === input[index].toUpperCase() && !/^[A-Z0-9_$]+$/.test(input))) { + leftBoundaryMatch = 1; + } + var matchEnd = index + match[0].length; + var leftParen = input.indexOf("("); + var endOfName = leftParen > -1 ? leftParen : input.length; + // exclude peripheral matches + if (category !== catModules && category !== catSearchTags) { + var delim = category === catPackages ? "/" : "."; + if (leftParen > -1 && leftParen < index) { + periferalMatch += 2; + } else if (input.lastIndexOf(delim, endOfName) >= matchEnd) { + periferalMatch += 2; + } + } + var delta = match[0].length === endOfName ? 0 : 1; // rank full match higher than partial match + for (var i = 1; i < match.length; i++) { + // lower ranking if parts of the name are missing + if (match[i]) + delta += match[i].length; + } + if (category === catTypes) { + // lower ranking if a type name contains unmatched camel-case parts + if (/[A-Z]/.test(input.substring(matchEnd))) + delta += 5; + if (/[A-Z]/.test(input.substring(0, index))) + delta += 5; + } + return leftBoundaryMatch + periferalMatch + (delta / 200); + +} +function doSearch(request, response) { + var result = []; + searchPattern = createSearchPattern(request.term); + fallbackPattern = createSearchPattern(request.term.toLowerCase()); + if (searchPattern === "") { + return this.close(); + } + var camelCaseMatcher = createMatcher(searchPattern, ""); + var fallbackMatcher = new RegExp(fallbackPattern, "i"); + + function searchIndexWithMatcher(indexArray, matcher, category, nameFunc) { + if (indexArray) { + var newResults = []; + $.each(indexArray, function (i, item) { + item.category = category; + var ranking = rankMatch(matcher.exec(nameFunc(item)), category); + if (ranking < RANKING_THRESHOLD) { + newResults.push({ranking: ranking, item: item}); + } + return newResults.length <= MAX_RESULTS; + }); + return newResults.sort(function(e1, e2) { + return e1.ranking - e2.ranking; + }).map(function(e) { + return e.item; + }); + } + return []; + } + function searchIndex(indexArray, category, nameFunc) { + var primaryResults = searchIndexWithMatcher(indexArray, camelCaseMatcher, category, nameFunc); + result = result.concat(primaryResults); + if (primaryResults.length <= MIN_RESULTS && !camelCaseMatcher.ignoreCase) { + var secondaryResults = searchIndexWithMatcher(indexArray, fallbackMatcher, category, nameFunc); + result = result.concat(secondaryResults.filter(function (item) { + return primaryResults.indexOf(item) === -1; + })); + } + } + + searchIndex(moduleSearchIndex, catModules, function(item) { return item.l; }); + searchIndex(packageSearchIndex, catPackages, function(item) { + return (item.m && request.term.indexOf("/") > -1) + ? (item.m + "/" + item.l) : item.l; + }); + searchIndex(typeSearchIndex, catTypes, function(item) { + return request.term.indexOf(".") > -1 ? item.p + "." + item.l : item.l; + }); + searchIndex(memberSearchIndex, catMembers, function(item) { + return request.term.indexOf(".") > -1 + ? item.p + "." + item.c + "." + item.l : item.l; + }); + searchIndex(tagSearchIndex, catSearchTags, function(item) { return item.l; }); + + if (!indexFilesLoaded()) { + updateSearchResults = function() { + doSearch(request, response); + } + result.unshift(loading); + } else { + updateSearchResults = function() {}; + } + response(result); +} +$(function() { + $("#search-input").catcomplete({ + minLength: 1, + delay: 300, + source: doSearch, + response: function(event, ui) { + if (!ui.content.length) { + ui.content.push(noResult); + } else { + $("#search-input").empty(); + } + }, + autoFocus: true, + focus: function(event, ui) { + return false; + }, + position: { + collision: "flip" + }, + select: function(event, ui) { + if (ui.item.category) { + var url = getURLPrefix(ui); + if (ui.item.category === catModules) { + url += "module-summary.html"; + } else if (ui.item.category === catPackages) { + if (ui.item.u) { + url = ui.item.u; + } else { + url += ui.item.l.replace(/\./g, '/') + "/package-summary.html"; + } + } else if (ui.item.category === catTypes) { + if (ui.item.u) { + url = ui.item.u; + } else if (ui.item.p === UNNAMED) { + url += ui.item.l + ".html"; + } else { + url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.l + ".html"; + } + } else if (ui.item.category === catMembers) { + if (ui.item.p === UNNAMED) { + url += ui.item.c + ".html" + "#"; + } else { + url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.c + ".html" + "#"; + } + if (ui.item.u) { + url += ui.item.u; + } else { + url += ui.item.l; + } + } else if (ui.item.category === catSearchTags) { + url += ui.item.u; + } + if (top !== window) { + parent.classFrame.location = pathtoroot + url; + } else { + window.location.href = pathtoroot + url; + } + $("#search-input").focus(); + } + } + }); +}); diff --git a/tictactoe/jdoc/stylesheet.css b/tictactoe/jdoc/stylesheet.css new file mode 100644 index 00000000..836c62da --- /dev/null +++ b/tictactoe/jdoc/stylesheet.css @@ -0,0 +1,865 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:#bb7a2a; +} +a[name] { + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; +} +h4 { + font-size:15px; +} +h5 { + font-size:14px; +} +h6 { + font-size:13px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; +} +:not(h1, h2, h3, h4, h5, h6) > code, +:not(h1, h2, h3, h4, h5, h6) > tt { + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +.summary-table dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +button { + font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size: 14px; +} +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.clear { + clear:both; + height:0; + overflow:hidden; +} +.about-language { + float:right; + padding:0 21px 8px 8px; + font-size:11px; + margin-top:-9px; + height:2.9em; +} +.legal-copy { + margin-left:.5em; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* + * Styles for navigation bar. + */ +@media screen { + .flex-box { + position:fixed; + display:flex; + flex-direction:column; + height: 100%; + width: 100%; + } + .flex-header { + flex: 0 0 auto; + } + .flex-content { + flex: 1 1 auto; + overflow-y: auto; + } +} +.top-nav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + min-height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.sub-nav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.sub-nav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +.sub-nav .nav-list { + padding-top:5px; +} +ul.nav-list { + display:block; + margin:0 25px 0 0; + padding:0; +} +ul.sub-nav-list { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.nav-list li { + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +.sub-nav .nav-list-search { + float:right; + margin:0 0 0 0; + padding:5px 6px; + clear:none; +} +.nav-list-search label { + position:relative; + right:-16px; +} +ul.sub-nav-list li { + list-style:none; + float:left; + padding-top:10px; +} +.top-nav a:link, .top-nav a:active, .top-nav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.top-nav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.nav-bar-cell1-rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skip-nav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Hide navigation links and search box in print layout + */ +@media print { + ul.nav-list, div.sub-nav { + display:none; + } +} +/* + * Styles for page header and footer. + */ +.title { + color:#2c4557; + margin:10px 0; +} +.sub-title { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* + * Styles for headings. + */ +body.class-declaration-page .summary h2, +body.class-declaration-page .details h2, +body.class-use-page h2, +body.module-declaration-page .block-list h2 { + font-style: italic; + padding:0; + margin:15px 0; +} +body.class-declaration-page .summary h3, +body.class-declaration-page .details h3, +body.class-declaration-page .summary .inherited-list h2 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +/* + * Styles for page layout containers. + */ +main { + clear:both; + padding:10px 20px; + position:relative; +} +dl.notes > dt { + font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +dl.notes > dd { + margin:5px 10px 10px 0; + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +dl.name-value > dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +dl.name-value > dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +div.inheritance { + margin:0; + padding:0; +} +div.inheritance div.inheritance { + margin-left:2em; +} +ul.block-list, +ul.details-list, +ul.member-list, +ul.summary-list { + margin:10px 0 10px 0; + padding:0; +} +ul.block-list > li, +ul.details-list > li, +ul.member-list > li, +ul.summary-list > li { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +.summary-table dl, .summary-table dl dt, .summary-table dl dd { + margin-top:0; + margin-bottom:1px; +} +ul.see-list, ul.see-list-long { + padding-left: 0; + list-style: none; +} +ul.see-list li { + display: inline; +} +ul.see-list li:not(:last-child):after, +ul.see-list-long li:not(:last-child):after { + content: ", "; + white-space: pre-wrap; +} +/* + * Styles for tables. + */ +.summary-table, .details-table { + width:100%; + border-spacing:0; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; + padding:0; +} +.caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0; + padding-top:10px; + padding-left:1px; + margin:0; + white-space:pre; +} +.caption a:link, .caption a:visited { + color:#1f389c; +} +.caption a:hover, +.caption a:active { + color:#FFFFFF; +} +.caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +div.table-tabs { + padding:10px 0 0 1px; + margin:0; +} +div.table-tabs > button { + border: none; + cursor: pointer; + padding: 5px 12px 7px 12px; + font-weight: bold; + margin-right: 3px; +} +div.table-tabs > button.active-table-tab { + background: #F8981D; + color: #253441; +} +div.table-tabs > button.table-tab { + background: #4D7A97; + color: #FFFFFF; +} +.two-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(15%, auto); +} +.three-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(15%, max-content) minmax(15%, auto); +} +.four-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(10%, max-content) minmax(10%, max-content) minmax(10%, auto); +} +@media screen and (max-width: 600px) { + .two-column-summary { + display: grid; + grid-template-columns: 1fr; + } +} +@media screen and (max-width: 800px) { + .three-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(25%, auto); + } + .three-column-summary .col-last { + grid-column-end: span 2; + } +} +@media screen and (max-width: 1000px) { + .four-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(15%, auto); + } +} +.summary-table > div, .details-table > div { + text-align:left; + padding: 8px 3px 3px 7px; +} +.col-first, .col-second, .col-last, .col-constructor-name, .col-summary-item-name { + vertical-align:top; + padding-right:0; + padding-top:8px; + padding-bottom:3px; +} +.table-header { + background:#dee3e9; + font-weight: bold; +} +.col-first, .col-first { + font-size:13px; +} +.col-second, .col-second, .col-last, .col-constructor-name, .col-summary-item-name, .col-last { + font-size:13px; +} +.col-first, .col-second, .col-constructor-name { + vertical-align:top; + overflow: auto; +} +.col-last { + white-space:normal; +} +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-constructor-name a:link, .col-constructor-name a:visited, +.col-summary-item-name a:link, .col-summary-item-name a:visited, +.constant-values-container a:link, .constant-values-container a:visited, +.all-classes-container a:link, .all-classes-container a:visited, +.all-packages-container a:link, .all-packages-container a:visited { + font-weight:bold; +} +.table-sub-heading-color { + background-color:#EEEEFF; +} +.even-row-color, .even-row-color .table-header { + background-color:#FFFFFF; +} +.odd-row-color, .odd-row-color .table-header { + background-color:#EEEEEF; +} +/* + * Styles for contents. + */ +.deprecated-content { + margin:0; + padding:10px 0; +} +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +.col-last div { + padding-top:0; +} +.col-last a { + padding-bottom:3px; +} +.module-signature, +.package-signature, +.type-signature, +.member-signature { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + margin:14px 0; + white-space: pre-wrap; +} +.module-signature, +.package-signature, +.type-signature { + margin-top: 0; +} +.member-signature .type-parameters-long, +.member-signature .parameters, +.member-signature .exceptions { + display: inline-block; + vertical-align: top; + white-space: pre; +} +.member-signature .type-parameters { + white-space: normal; +} +/* + * Styles for formatting effect. + */ +.source-line-no { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:0 10px 5px 0; + color:#474747; +} +.deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link, +.module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type, +.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label { + font-weight:bold; +} +.deprecation-comment, .help-footnote, .preview-comment { + font-style:italic; +} +.deprecation-block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +.preview-block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecation-comment { + font-style:normal; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:#4D7A97; + color:#FFFFFF; +} +.result-item { + font-size:13px; +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:scroll; + overflow-x:scroll; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:999999; +} +ul.ui-autocomplete li { + float:left; + clear:both; + width:100%; +} +.result-highlight { + font-weight:bold; +} +#search-input { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + padding-left:20px; + position:relative; + right:-18px; + width:400px; +} +#reset-button { + background-color: rgb(255,255,255); + background-image:url('resources/x.png'); + background-position:center; + background-repeat:no-repeat; + background-size:12px; + border:0 none; + width:16px; + height:16px; + position:relative; + left:-4px; + top:-4px; + font-size:0px; +} +.watermark { + color:#545454; +} +.search-tag-desc-result { + font-style:italic; + font-size:11px; +} +.search-tag-holder-result { + font-style:italic; + font-size:12px; +} +.search-tag-result:target { + background-color:yellow; +} +.module-graph span { + display:none; + position:absolute; +} +.module-graph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.inherited-list { + margin: 10px 0 10px 0; +} +section.class-description { + line-height: 1.4; +} +.summary section[class$="-summary"], .details section[class$="-details"], +.class-uses .detail, .serialized-class-details { + padding: 0px 20px 5px 10px; + border: 1px solid #ededed; + background-color: #f8f8f8; +} +.inherited-list, section[class$="-details"] .detail { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +.vertical-separator { + padding: 0 5px; +} +ul.help-section-list { + margin: 0; +} +ul.help-subtoc > li { + display: inline-block; + padding-right: 5px; + font-size: smaller; +} +ul.help-subtoc > li::before { + content: "\2022" ; + padding-right:2px; +} +span.help-note { + font-style: italic; +} +/* + * Indicator icon for external links. + */ +main a[href*="://"]::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + background-size:100% 100%; + width:7px; + height:7px; + margin-left:2px; + margin-bottom:4px; +} +main a[href*="://"]:hover::after, +main a[href*="://"]:focus::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); +} + +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid black; +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid black; +} +table.striped { + border-collapse: collapse; + border: 1px solid black; +} +table.striped > thead { + background-color: #E3E3E3; +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid black; +} +table.striped > tbody > tr:nth-child(even) { + background-color: #EEE +} +table.striped > tbody > tr:nth-child(odd) { + background-color: #FFF +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid black; + border-right: 1px solid black; +} +table.striped > tbody > tr > th { + font-weight: normal; +} +/** + * Tweak font sizes and paddings for small screens. + */ +@media screen and (max-width: 1050px) { + #search-input { + width: 300px; + } +} +@media screen and (max-width: 800px) { + #search-input { + width: 200px; + } + .top-nav, + .bottom-nav { + font-size: 11px; + padding-top: 6px; + } + .sub-nav { + font-size: 11px; + } + .about-language { + padding-right: 16px; + } + ul.nav-list li, + .sub-nav .nav-list-search { + padding: 6px; + } + ul.sub-nav-list li { + padding-top: 5px; + } + main { + padding: 10px; + } + .summary section[class$="-summary"], .details section[class$="-details"], + .class-uses .detail, .serialized-class-details { + padding: 0 8px 5px 8px; + } + body { + -webkit-text-size-adjust: none; + } +} +@media screen and (max-width: 500px) { + #search-input { + width: 150px; + } + .top-nav, + .bottom-nav { + font-size: 10px; + } + .sub-nav { + font-size: 10px; + } + .about-language { + font-size: 10px; + padding-right: 12px; + } +} diff --git a/tictactoe/jdoc/tag-search-index.js b/tictactoe/jdoc/tag-search-index.js new file mode 100644 index 00000000..0367dae6 --- /dev/null +++ b/tictactoe/jdoc/tag-search-index.js @@ -0,0 +1 @@ +tagSearchIndex = [];updateSearchResults(); \ No newline at end of file diff --git a/tictactoe/jdoc/type-search-index.js b/tictactoe/jdoc/type-search-index.js new file mode 100644 index 00000000..ec9af355 --- /dev/null +++ b/tictactoe/jdoc/type-search-index.js @@ -0,0 +1 @@ +typeSearchIndex = [{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"view","l":"RowGameStatusView.GameStatus"},{"p":"model","l":"RowGameModel.Player"},{"p":"model","l":"RowBlockModel.PlayerPiece"},{"p":"model","l":"RowBlockModel"},{"p":"","l":"RowGameApp"},{"p":"view","l":"RowGameBoardView"},{"p":"controller","l":"RowGameController"},{"p":"view","l":"RowGameGUI"},{"p":"model","l":"RowGameModel"},{"p":"view","l":"RowGameStatusView"}];updateSearchResults(); \ No newline at end of file diff --git a/tictactoe/jdoc/view/RowGameBoardView.html b/tictactoe/jdoc/view/RowGameBoardView.html new file mode 100644 index 00000000..68988abb --- /dev/null +++ b/tictactoe/jdoc/view/RowGameBoardView.html @@ -0,0 +1,192 @@ + + + + +RowGameBoardView (CS520 - Homework 1) + + + + + + + + + + + + + + + +
      + +
      +
      + +
      +
      Package view
      +

      Class RowGameBoardView

      +
      +
      java.lang.Object +
      view.RowGameBoardView
      +
      +
      +
      +
      public class RowGameBoardView +extends Object
      +
      +
      + +
      +
      +
        + +
      • +
        +

        Field Details

        +
          +
        • +
          +

          blocks

          +
          public JButton[][] blocks
          +
          +
        • +
        +
        +
      • + +
      • +
        +

        Constructor Details

        +
          +
        • +
          +

          RowGameBoardView

          +
          public RowGameBoardView()
          +
          +
        • +
        +
        +
      • + +
      • +
        +

        Method Details

        +
          +
        • +
          +

          update

          +
          public void update(RowGameModel gameModel, + int row, + int column)
          +
          +
        • +
        +
        +
      • +
      +
      + +
      +
      +
      + + diff --git a/tictactoe/jdoc/view/RowGameGUI.html b/tictactoe/jdoc/view/RowGameGUI.html new file mode 100644 index 00000000..fde8fa49 --- /dev/null +++ b/tictactoe/jdoc/view/RowGameGUI.html @@ -0,0 +1,276 @@ + + + + +RowGameGUI (CS520 - Homework 1) + + + + + + + + + + + + + + + +
      + +
      +
      + +
      +
      Package view
      +

      Class RowGameGUI

      +
      +
      java.lang.Object +
      view.RowGameGUI
      +
      +
      +
      +
      public class RowGameGUI +extends Object
      +
      +
      + +
      +
      +
        + +
      • +
        +

        Field Details

        + +
        +
      • + +
      • +
        +

        Constructor Details

        +
          +
        • +
          +

          RowGameGUI

          +
          public RowGameGUI(RowGameController controller)
          +
          Creates a new game initializing the GUI.
          +
          +
        • +
        +
        +
      • + +
      • +
        +

        Method Details

        +
          +
        • +
          +

          updateBlock

          +
          public void updateBlock(RowGameModel gameModel, + int row, + int column)
          +
          Updates the block at the given row and column + after one of the player's moves.
          +
          +
          Parameters:
          +
          gameModel - The RowGameModel containing the block
          +
          row - The row that contains the block
          +
          column - The column that contains the block
          +
          +
          +
        • +
        • +
          +

          getBlocks

          +
          public JButton[][] getBlocks()
          +
          Gets the block
          +
          +
          Returns:
          +
          block
          +
          +
          +
        • +
        • +
          +

          updateStatus

          +
          public void updateStatus(RowGameStatusView.GameStatus status)
          +
          +
        • +
        • +
          +

          disableButtons

          +
          public void disableButtons()
          +
          +
        • +
        +
        +
      • +
      +
      + +
      +
      +
      + + diff --git a/tictactoe/jdoc/view/RowGameStatusView.GameStatus.html b/tictactoe/jdoc/view/RowGameStatusView.GameStatus.html new file mode 100644 index 00000000..cde15c92 --- /dev/null +++ b/tictactoe/jdoc/view/RowGameStatusView.GameStatus.html @@ -0,0 +1,283 @@ + + + + +RowGameStatusView.GameStatus (CS520 - Homework 1) + + + + + + + + + + + + + + + +
      + +
      +
      + +
      +
      Package view
      +

      Enum Class RowGameStatusView.GameStatus

      +
      +
      java.lang.Object +
      java.lang.Enum<RowGameStatusView.GameStatus> +
      view.RowGameStatusView.GameStatus
      +
      +
      +
      +
      +
      All Implemented Interfaces:
      +
      Serializable, Comparable<RowGameStatusView.GameStatus>, Constable
      +
      +
      +
      Enclosing class:
      +
      RowGameStatusView
      +
      +
      +
      public static enum RowGameStatusView.GameStatus +extends Enum<RowGameStatusView.GameStatus>
      +
      +
      + +
      +
      +
        + +
      • +
        +

        Enum Constant Details

        + +
        +
      • + +
      • +
        +

        Constructor Details

        +
          +
        • +
          +

          GameStatus

          +
          private GameStatus()
          +
          +
        • +
        +
        +
      • + +
      • +
        +

        Method Details

        +
          +
        • +
          +

          values

          +
          public static RowGameStatusView.GameStatus[] values()
          +
          Returns an array containing the constants of this enum class, in +the order they are declared.
          +
          +
          Returns:
          +
          an array containing the constants of this enum class, in the order they are declared
          +
          +
          +
        • +
        • +
          +

          valueOf

          +
          public static RowGameStatusView.GameStatus valueOf(String name)
          +
          Returns the enum constant of this class with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this class. (Extraneous whitespace characters are +not permitted.)
          +
          +
          Parameters:
          +
          name - the name of the enum constant to be returned.
          +
          Returns:
          +
          the enum constant with the specified name
          +
          Throws:
          +
          IllegalArgumentException - if this enum class has no constant with the specified name
          +
          NullPointerException - if the argument is null
          +
          +
          +
        • +
        +
        +
      • +
      +
      + +
      +
      +
      + + diff --git a/tictactoe/jdoc/view/RowGameStatusView.html b/tictactoe/jdoc/view/RowGameStatusView.html new file mode 100644 index 00000000..efee283a --- /dev/null +++ b/tictactoe/jdoc/view/RowGameStatusView.html @@ -0,0 +1,204 @@ + + + + +RowGameStatusView (CS520 - Homework 1) + + + + + + + + + + + + + + + +
      + +
      +
      + +
      +
      Package view
      +

      Class RowGameStatusView

      +
      +
      java.lang.Object +
      view.RowGameStatusView
      +
      +
      +
      +
      public class RowGameStatusView +extends Object
      +
      Type safety using enums
      +
      +
      + +
      +
      +
        + +
      • +
        +

        Field Details

        +
          +
        • +
          +

          playerturn

          +
          public JTextArea playerturn
          +
          +
        • +
        +
        +
      • + +
      • +
        +

        Constructor Details

        +
          +
        • +
          +

          RowGameStatusView

          +
          public RowGameStatusView()
          +
          +
        • +
        +
        +
      • + +
      • +
        +

        Method Details

        + +
        +
      • +
      +
      + +
      +
      +
      + + diff --git a/tictactoe/jdoc/view/class-use/RowGameBoardView.html b/tictactoe/jdoc/view/class-use/RowGameBoardView.html new file mode 100644 index 00000000..9ef4a0b6 --- /dev/null +++ b/tictactoe/jdoc/view/class-use/RowGameBoardView.html @@ -0,0 +1,83 @@ + + + + +Uses of Class view.RowGameBoardView (CS520 - Homework 1) + + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Uses of Class
      view.RowGameBoardView

      +
      +
      Packages that use RowGameBoardView
      +
      +
      Package
      +
      Description
      + +
       
      +
      +
      + +
      +
      +
      +
      + + diff --git a/tictactoe/jdoc/view/class-use/RowGameGUI.html b/tictactoe/jdoc/view/class-use/RowGameGUI.html new file mode 100644 index 00000000..e8cb427d --- /dev/null +++ b/tictactoe/jdoc/view/class-use/RowGameGUI.html @@ -0,0 +1,83 @@ + + + + +Uses of Class view.RowGameGUI (CS520 - Homework 1) + + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Uses of Class
      view.RowGameGUI

      +
      +
      Packages that use RowGameGUI
      +
      +
      Package
      +
      Description
      + +
       
      +
      +
      + +
      +
      +
      +
      + + diff --git a/tictactoe/jdoc/view/class-use/RowGameStatusView.GameStatus.html b/tictactoe/jdoc/view/class-use/RowGameStatusView.GameStatus.html new file mode 100644 index 00000000..bdcc096e --- /dev/null +++ b/tictactoe/jdoc/view/class-use/RowGameStatusView.GameStatus.html @@ -0,0 +1,140 @@ + + + + +Uses of Enum Class view.RowGameStatusView.GameStatus (CS520 - Homework 1) + + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Uses of Enum Class
      view.RowGameStatusView.GameStatus

      +
      + +
      +
      Package
      +
      Description
      + +
       
      + +
       
      +
      +
      + +
      +
      +
      +
      + + diff --git a/tictactoe/jdoc/view/class-use/RowGameStatusView.html b/tictactoe/jdoc/view/class-use/RowGameStatusView.html new file mode 100644 index 00000000..15495a89 --- /dev/null +++ b/tictactoe/jdoc/view/class-use/RowGameStatusView.html @@ -0,0 +1,83 @@ + + + + +Uses of Class view.RowGameStatusView (CS520 - Homework 1) + + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Uses of Class
      view.RowGameStatusView

      +
      +
      Packages that use RowGameStatusView
      +
      +
      Package
      +
      Description
      + +
       
      +
      +
      + +
      +
      +
      +
      + + diff --git a/tictactoe/jdoc/view/package-summary.html b/tictactoe/jdoc/view/package-summary.html new file mode 100644 index 00000000..a74ac688 --- /dev/null +++ b/tictactoe/jdoc/view/package-summary.html @@ -0,0 +1,97 @@ + + + + +view (CS520 - Homework 1) + + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Package view

      +
      +
      +
      package view
      +
      + +
      +
      +
      +
      + + diff --git a/tictactoe/jdoc/view/package-tree.html b/tictactoe/jdoc/view/package-tree.html new file mode 100644 index 00000000..0ab4fad1 --- /dev/null +++ b/tictactoe/jdoc/view/package-tree.html @@ -0,0 +1,88 @@ + + + + +view Class Hierarchy (CS520 - Homework 1) + + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Hierarchy For Package view

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      + +
      +
      +

      Enum Class Hierarchy

      + +
      +
      +
      +
      + + diff --git a/tictactoe/jdoc/view/package-use.html b/tictactoe/jdoc/view/package-use.html new file mode 100644 index 00000000..a3e0cf91 --- /dev/null +++ b/tictactoe/jdoc/view/package-use.html @@ -0,0 +1,112 @@ + + + + +Uses of Package view (CS520 - Homework 1) + + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Uses of Package
      view

      +
      +
      Packages that use view
      +
      +
      Package
      +
      Description
      + +
       
      + +
       
      + +
       
      +
      +
      + +
      +
      +
      +
      + + diff --git a/tictactoe/src/controller/RowGameController.java b/tictactoe/src/controller/RowGameController.java index 7179388f..c61b4551 100644 --- a/tictactoe/src/controller/RowGameController.java +++ b/tictactoe/src/controller/RowGameController.java @@ -8,7 +8,10 @@ import java.awt.event.*; import model.RowGameModel; +import model.RowBlockModel.PlayerPiece; +import model.RowGameModel.Player; import view.RowGameGUI; +import view.RowGameStatusView.GameStatus; public class RowGameController { public RowGameModel gameModel; @@ -23,9 +26,9 @@ public RowGameController() { for(int row = 0; row<3; row++) { for(int column = 0; column<3 ;column++) { - gameModel.blocksData[row][column].setContents(""); - gameModel.blocksData[row][column].setIsLegalMove(true); - gameView.updateBlock(gameModel,row,column); + gameModel.blocksData[row][column].setPiece(PlayerPiece.Empty); + gameModel.blocksData[row][column].setIsLegalMove(true); + gameView.updateBlock(gameModel,row,column); } } } @@ -38,377 +41,158 @@ public RowGameController() { public void move(JButton block) { gameModel.movesLeft--; if(gameModel.movesLeft%2 == 1) { - gameView.playerturn.setText("'X': Player 1"); + //gameView.statusView.playerturn.setText("'X': Player 1"); + gameView.updateStatus(GameStatus.P1TURN); } else{ - gameView.playerturn.setText("'O': Player 2"); + //gameView.statusView.playerturn.setText("'O': Player 2"); + gameView.updateStatus(GameStatus.P2TURN); } - if(gameModel.player.equals("1")) { - // Check whether player 1 won - if(block==gameView.blocks[0][0]) { - gameModel.blocksData[0][0].setContents("X"); - gameView.updateBlock(gameModel,0,0); - gameModel.player = "2"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[0][1].getContents()) && - gameModel.blocksData[0][1].getContents().equals(gameModel.blocksData[0][2].getContents())) || - (gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[1][0].getContents()) && - gameModel.blocksData[1][0].getContents().equals(gameModel.blocksData[2][0].getContents())) || - (gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[2][2].getContents()))) { - gameModel.setFinalResult("Player 1 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[0][1]) { - gameModel.blocksData[0][1].setContents("X"); - gameView.updateBlock(gameModel,0,1); - gameModel.player = "2"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[0][1].getContents().equals(gameModel.blocksData[0][0].getContents()) && - gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[0][2].getContents())) || - (gameModel.blocksData[0][1].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[2][1].getContents()))) { - gameModel.setFinalResult("Player 1 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[0][2]) { - gameModel.blocksData[0][2].setContents("X"); - gameView.updateBlock(gameModel,0,2); - gameModel.player = "2"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[0][2].getContents().equals(gameModel.blocksData[0][1].getContents()) && - gameModel.blocksData[0][1].getContents().equals(gameModel.blocksData[0][0].getContents())) || - (gameModel.blocksData[0][2].getContents().equals(gameModel.blocksData[1][2].getContents()) && - gameModel.blocksData[1][2].getContents().equals(gameModel.blocksData[2][2].getContents())) || - (gameModel.blocksData[0][2].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[2][0].getContents()))) { - gameModel.setFinalResult("Player 1 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[1][0]) { - gameModel.blocksData[1][0].setContents("X"); - gameView.updateBlock(gameModel,1,0); - gameModel.player = "2"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[1][0].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[1][2].getContents())) || - (gameModel.blocksData[1][0].getContents().equals(gameModel.blocksData[0][0].getContents()) && - gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[2][0].getContents()))) { - gameModel.setFinalResult("Player 1 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[1][1]) { - gameModel.blocksData[1][1].setContents("X"); - gameView.updateBlock(gameModel,1,1); - gameModel.player = "2"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[1][0].getContents()) && - gameModel.blocksData[1][0].getContents().equals(gameModel.blocksData[1][2].getContents())) || - (gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][1].getContents()) && - gameModel.blocksData[0][1].getContents().equals(gameModel.blocksData[2][1].getContents())) || - (gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][0].getContents()) && - gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[2][2].getContents())) || - (gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][2].getContents()) && - gameModel.blocksData[0][2].getContents().equals(gameModel.blocksData[2][0].getContents()))) { - gameModel.setFinalResult("Player 1 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[1][2]) { - gameModel.blocksData[1][2].setContents("X"); - gameView.updateBlock(gameModel,1,2); - gameModel.player = "2"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[1][2].getContents().equals(gameModel.blocksData[0][2].getContents()) && - gameModel.blocksData[0][2].getContents().equals(gameModel.blocksData[2][2].getContents())) || - (gameModel.blocksData[1][2].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[1][0].getContents()))) { - gameModel.setFinalResult("Player 1 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[2][0]) { - gameModel.blocksData[2][0].setContents("X"); - gameView.updateBlock(gameModel,2,0); - gameModel.player = "2"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[2][0].getContents().equals(gameModel.blocksData[2][1].getContents()) && - gameModel.blocksData[2][1].getContents().equals(gameModel.blocksData[2][2].getContents())) || - (gameModel.blocksData[2][0].getContents().equals(gameModel.blocksData[1][0].getContents()) && - gameModel.blocksData[1][0].getContents().equals(gameModel.blocksData[0][0].getContents())) || - (gameModel.blocksData[2][0].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][2].getContents()))) { - gameModel.setFinalResult("Player 1 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[2][1]) { - gameModel.blocksData[2][1].setContents("X"); - gameView.updateBlock(gameModel,2,1); - gameModel.player = "2"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[2][1].getContents().equals(gameModel.blocksData[2][0].getContents()) && - gameModel.blocksData[2][0].getContents().equals(gameModel.blocksData[2][2].getContents())) || - (gameModel.blocksData[2][1].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][1].getContents()))) { - gameModel.setFinalResult("Player 1 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[2][2]) { - gameModel.blocksData[2][2].setContents("X"); - gameView.updateBlock(gameModel,2,2); - gameModel.player = "2"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[2][2].getContents().equals(gameModel.blocksData[2][1].getContents()) && - gameModel.blocksData[2][1].getContents().equals(gameModel.blocksData[2][0].getContents())) || - (gameModel.blocksData[2][2].getContents().equals(gameModel.blocksData[1][2].getContents()) && - gameModel.blocksData[1][2].getContents().equals(gameModel.blocksData[0][2].getContents())) || - (gameModel.blocksData[2][2].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][0].getContents()))) { - gameModel.setFinalResult("Player 1 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } - } else { - // Check whether player 2 won - if(block==gameView.blocks[0][0]) { - gameModel.blocksData[0][0].setContents("O"); - gameView.updateBlock(gameModel,0,0); - gameModel.player = "1"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[0][1].getContents()) && - gameModel.blocksData[0][1].getContents().equals(gameModel.blocksData[0][2].getContents())) || - (gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[1][0].getContents()) && - gameModel.blocksData[1][0].getContents().equals(gameModel.blocksData[2][0].getContents())) || - (gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[2][2].getContents()))) { - gameModel.setFinalResult("Player 2 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[0][1]) { - gameModel.blocksData[0][1].setContents("O"); - gameView.updateBlock(gameModel,0,1); - gameModel.player = "1"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[0][1].getContents().equals(gameModel.blocksData[0][0].getContents()) && - gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[0][2].getContents())) || - (gameModel.blocksData[0][1].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[2][1].getContents()))) { - gameModel.setFinalResult("Player 2 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[0][2]) { - gameModel.blocksData[0][2].setContents("O"); - gameView.updateBlock(gameModel,0,2); - gameModel.player = "1"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[0][2].getContents().equals(gameModel.blocksData[0][1].getContents()) && - gameModel.blocksData[0][1].getContents().equals(gameModel.blocksData[0][0].getContents())) || - (gameModel.blocksData[0][2].getContents().equals(gameModel.blocksData[1][2].getContents()) && - gameModel.blocksData[1][2].getContents().equals(gameModel.blocksData[2][2].getContents())) || - (gameModel.blocksData[0][2].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[2][0].getContents()))) { - gameModel.setFinalResult("Player 2 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[1][0]) { - gameModel.blocksData[1][0].setContents("O"); - gameView.updateBlock(gameModel,1,0); - gameModel.player = "1"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[1][0].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[1][2].getContents())) || - (gameModel.blocksData[1][0].getContents().equals(gameModel.blocksData[0][0].getContents()) && - gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[2][0].getContents()))) { - gameModel.setFinalResult("Player 2 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } - } - } else if(block==gameView.blocks[1][1]) { - gameModel.blocksData[1][1].setContents("O"); - gameView.updateBlock(gameModel,1,1); - gameModel.player = "1"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[1][0].getContents()) && - gameModel.blocksData[1][0].getContents().equals(gameModel.blocksData[1][2].getContents())) || - (gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][1].getContents()) && - gameModel.blocksData[0][1].getContents().equals(gameModel.blocksData[2][1].getContents())) || - (gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][0].getContents()) && - gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[2][2].getContents())) || - (gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][2].getContents()) && - gameModel.blocksData[0][2].getContents().equals(gameModel.blocksData[2][0].getContents()))) { - gameModel.setFinalResult("Player 2 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } + winChecker(block); + } + + /** + *Checks the board to see if a player has won + * + * @param block the board the players are playing on + */ + public void winChecker(JButton block) { + if(gameModel.player == Player.One) { + playerWinCheck(block, true); + } else { + playerWinCheck(block, false); } - } else if(block==gameView.blocks[1][2]) { - gameModel.blocksData[1][2].setContents("O"); - gameView.updateBlock(gameModel,1,2); - gameModel.player = "1"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[1][2].getContents().equals(gameModel.blocksData[0][2].getContents()) && - gameModel.blocksData[0][2].getContents().equals(gameModel.blocksData[2][2].getContents())) || - (gameModel.blocksData[1][2].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[1][0].getContents()))) { - gameModel.setFinalResult("Player 2 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } + } + + /** + *Checks if the last placed piece makes a row-of-three of the same piece + * + * @param x column index of the piece + * @param y row index of the piece + * @return boolean + */ + public boolean rowChecker(int x, int y){ + return gameModel.blocksData[y][0].getContents().equals(gameModel.blocksData[y][1].getContents()) && + gameModel.blocksData[y][1].getContents().equals(gameModel.blocksData[y][2].getContents()); + } + + /** + *Checks if the last placed piece makes a column-of-three of the same piece + * + * @param x column index of the piece + * @param y row index of the piece + * @return boolean + */ + public boolean columnChecker(int x, int y){ + return gameModel.blocksData[0][x].getContents().equals(gameModel.blocksData[1][x].getContents()) && + gameModel.blocksData[1][x].getContents().equals(gameModel.blocksData[2][x].getContents()); + } + + /** + *Checks if the last placed piece makes a diagonal-of-three of the same piece + * + * @param x column index of the piece + * @param y row index of the piece + * @return boolean + */ + public boolean diagChecker(int x, int y){ + if((x-y) == 2 || (x-y) == -2){ + return gameModel.blocksData[2][0].getContents().equals(gameModel.blocksData[1][1].getContents()) && + gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][2].getContents()); + } + else if((x-y) == 0){ + if((x == 1) && (y == 1)){ + return (gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[1][1].getContents()) && + gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[2][2].getContents())) || + (gameModel.blocksData[0][2].getContents().equals(gameModel.blocksData[1][1].getContents()) && + gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[2][0].getContents())); + } else{ + return gameModel.blocksData[0][0].getContents().equals(gameModel.blocksData[1][1].getContents()) && + gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[2][2].getContents()); + } + } else{ + return false; } - } else if(block==gameView.blocks[2][0]) { - gameModel.blocksData[2][0].setContents("O"); - gameView.updateBlock(gameModel,2,0); - gameModel.player = "1"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[2][0].getContents().equals(gameModel.blocksData[2][1].getContents()) && - gameModel.blocksData[2][1].getContents().equals(gameModel.blocksData[2][2].getContents())) || - (gameModel.blocksData[2][0].getContents().equals(gameModel.blocksData[1][0].getContents()) && - gameModel.blocksData[1][0].getContents().equals(gameModel.blocksData[0][0].getContents())) || - (gameModel.blocksData[2][0].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][2].getContents()))) { - gameModel.setFinalResult("Player 2 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } + } + + /** + *Incorporates the functions above to check for three-in-a-row pieces + * + * @param x column index of the piece + * @param y row index of the piece + * @return boolean + */ + public boolean lineChecker(int x, int y){ + //if you can check diagonally + if((x-y)%2 == 0){ + return(columnChecker(x, y) || rowChecker(x, y) || diagChecker(x, y)); + }//else just check for lines + else{ + return(columnChecker(x, y) || rowChecker(x, y)); } - } else if(block==gameView.blocks[2][1]) { - gameModel.blocksData[2][1].setContents("O"); - gameView.updateBlock(gameModel,2,1); - gameModel.player = "1"; + } + + /** + * Sets the piece on the board for the specific player + * + * @param y row index of where the piece should be + * @param x column index of where the piece should be + * @param isPlayer1 boolean of whether it's player1's turn or not + */ + private void doTurn(int y, int x, boolean isPlayer1) { + PlayerPiece playerPiece = isPlayer1 ? PlayerPiece.X : PlayerPiece.O; + Player nextPlayer = isPlayer1 ? Player.Two : Player.One; + GameStatus winMsg = isPlayer1 ? GameStatus.P1WIN : GameStatus.P2WIN; + gameModel.blocksData[y][x].setPiece(playerPiece); + gameView.updateBlock(gameModel,y,x); + gameModel.player = nextPlayer; if(gameModel.movesLeft<7) { - if((gameModel.blocksData[2][1].getContents().equals(gameModel.blocksData[2][0].getContents()) && - gameModel.blocksData[2][0].getContents().equals(gameModel.blocksData[2][2].getContents())) || - (gameModel.blocksData[2][1].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][1].getContents()))) { - gameModel.setFinalResult("Player 2 wins!"); + if(lineChecker(x, y)) { + gameModel.setFinalResult(winMsg); endGame(); } else if(gameModel.movesLeft==0) { gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); } if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); + gameView.updateStatus(gameModel.getFinalResult()); } } - } else if(block==gameView.blocks[2][2]) { - gameModel.blocksData[2][2].setContents("O"); - gameView.updateBlock(gameModel,2,2); - gameModel.player = "1"; - if(gameModel.movesLeft<7) { - if((gameModel.blocksData[2][2].getContents().equals(gameModel.blocksData[2][1].getContents()) && - gameModel.blocksData[2][1].getContents().equals(gameModel.blocksData[2][0].getContents())) || - (gameModel.blocksData[2][2].getContents().equals(gameModel.blocksData[1][2].getContents()) && - gameModel.blocksData[1][2].getContents().equals(gameModel.blocksData[0][2].getContents())) || - (gameModel.blocksData[2][2].getContents().equals(gameModel.blocksData[1][1].getContents()) && - gameModel.blocksData[1][1].getContents().equals(gameModel.blocksData[0][0].getContents()))) { - gameModel.setFinalResult("Player 2 wins!"); - endGame(); - } else if(gameModel.movesLeft==0) { - gameModel.setFinalResult(RowGameModel.GAME_END_NOWINNER); - } - if (gameModel.getFinalResult() != null) { - gameView.playerturn.setText(gameModel.getFinalResult()); - } + } + + /** + * Incorporates all the functions above to check for the winner + * If there is a three-in-a-row after the turn, player# wins + * + * @param block board where the players are playing + * @param isPlayer1 boolean of whether it's player1's turn or not + */ + private void playerWinCheck(JButton block, boolean isPlayer1) { + if(block==gameView.getBlocks()[0][0]) { + doTurn(0, 0, isPlayer1); + } else if(block==gameView.getBlocks()[0][1]) { + doTurn(0, 1, isPlayer1); + } else if(block==gameView.getBlocks()[0][2]) { + doTurn(0, 2, isPlayer1); + } else if(block==gameView.getBlocks()[1][0]) { + doTurn(1, 0, isPlayer1); + } else if(block==gameView.getBlocks()[1][1]) { + doTurn(1, 1, isPlayer1); + } else if(block==gameView.getBlocks()[1][2]) { + doTurn(1, 2, isPlayer1); + } else if(block==gameView.getBlocks()[2][0]) { + doTurn(2, 0, isPlayer1); + } else if(block==gameView.getBlocks()[2][1]) { + doTurn(2, 1, isPlayer1); + } else if(block==gameView.getBlocks()[2][2]) { + doTurn(2, 2, isPlayer1); } - } } - } /** * Ends the game disallowing further player turns. */ public void endGame() { - for(int row = 0;row<3;row++) { - for(int column = 0;column<3;column++) { - gameView.blocks[row][column].setEnabled(false); - } - } + gameView.disableButtons(); } /** @@ -422,9 +206,10 @@ public void resetGame() { gameView.updateBlock(gameModel,row,column); } } - gameModel.player = "1"; + gameModel.player = Player.One; gameModel.movesLeft = 9; - gameModel.setFinalResult(null); - gameView.playerturn.setText("Player 1 to play 'X'"); + gameModel.setFinalResult(null); + //gameView.statusView.playerturn.setText("Player 1 to play 'X'"); + gameView.updateStatus(GameStatus.START); } } diff --git a/tictactoe/src/model/RowBlockModel.java b/tictactoe/src/model/RowBlockModel.java index f7029df1..7e473376 100644 --- a/tictactoe/src/model/RowBlockModel.java +++ b/tictactoe/src/model/RowBlockModel.java @@ -1,10 +1,29 @@ package model; +import model.RowGameModel.Player; + /** * The TicTacToeBlock class represents a given block in the game. */ public class RowBlockModel { + /** + * Used enum to distinguish the pieces for each player for type safety + */ + public enum PlayerPiece { + Empty(""), + X("X"), + O("O"); + + private final String str; + PlayerPiece(String str){ + this.str = str; + } + @Override + public String toString() { + return this.str; + } + } /** * The game that contains this block */ @@ -13,7 +32,7 @@ public class RowBlockModel /** * The current value of the contents of this block */ - private String contents; + private PlayerPiece contents; /** * Whether or not it is currently legal to move into this block @@ -23,20 +42,26 @@ public class RowBlockModel /** * Creates a new block that will be contained in the given game. * - * @param game The game that will contain the new block + * @param rowGameModel The game that will contain the new block * @throws IllegalArgumentException When the given game is null */ - public RowBlockModel(RowGameModel game) { + public RowBlockModel(RowGameModel rowGameModel) { super(); - if (game == null) { + if (rowGameModel == null) { throw new IllegalArgumentException("The game must be non-null."); } - this.game = game; + this.game = rowGameModel; this.reset(); } + public RowBlockModel(RowBlockModel block){ + this.game = block.game; + this.contents = block.contents; + this.isLegalMove = block.isLegalMove; + } + public RowGameModel getGame() { return this.game; } @@ -47,11 +72,20 @@ public RowGameModel getGame() { * @param value The new value for the contents of this block * @throws IllegalArgumentException When the given value is null */ - public void setContents(String value) { - if (value == null) { - throw new IllegalArgumentException("The value must be non-null."); - } - this.contents = value; + public void setPiece(PlayerPiece playerPiece) { + if (playerPiece == null) { + throw new IllegalArgumentException("The value must be non-null."); + } + this.contents = playerPiece; + if(playerPiece == PlayerPiece.Empty){ + this.isLegalMove = true; + } else{ + this.isLegalMove = false; + } + } + + public PlayerPiece getPiece(){ + return this.contents; } /** @@ -60,7 +94,7 @@ public void setContents(String value) { * @return The non-null String value */ public String getContents() { - return this.contents; + return this.contents.toString(); } public void setIsLegalMove(boolean isLegalMove) { @@ -75,7 +109,16 @@ public boolean getIsLegalMove() { * Resets this block before starting a new game. */ public void reset() { - this.contents = ""; - this.isLegalMove = false; + this.contents = PlayerPiece.Empty; + this.isLegalMove = true; + } + + @Override + public boolean equals(Object other){ + if (!(other instanceof RowBlockModel)){ + return false; + } + RowBlockModel o = (RowBlockModel) other; + return this.game == o.game && this.contents == o.contents && this.isLegalMove == o.isLegalMove; } } diff --git a/tictactoe/src/model/RowGameModel.java b/tictactoe/src/model/RowGameModel.java index 8f6f2e8b..8344ee50 100644 --- a/tictactoe/src/model/RowGameModel.java +++ b/tictactoe/src/model/RowGameModel.java @@ -1,19 +1,26 @@ package model; +import view.RowGameStatusView.GameStatus; public class RowGameModel { - public static final String GAME_END_NOWINNER = "Game ends in a draw"; + /** + * Type safety using enums + */ + public enum Player { + One, Two + } + public static final GameStatus GAME_END_NOWINNER = GameStatus.DRAW; public RowBlockModel[][] blocksData = new RowBlockModel[3][3]; /** * The current player taking their turn */ - public String player = "1"; + public Player player = Player.One; public int movesLeft = 9; - private String finalResult = null; + private GameStatus finalResult = null; public RowGameModel() { @@ -26,11 +33,11 @@ public RowGameModel() { } // end for row } - public String getFinalResult() { + public GameStatus getFinalResult() { return this.finalResult; } - public void setFinalResult(String finalResult) { + public void setFinalResult(GameStatus finalResult) { this.finalResult = finalResult; } } diff --git a/tictactoe/src/view/RowGameBoardView.java b/tictactoe/src/view/RowGameBoardView.java new file mode 100644 index 00000000..dc93d1a4 --- /dev/null +++ b/tictactoe/src/view/RowGameBoardView.java @@ -0,0 +1,15 @@ +package view; + +import javax.swing.JButton; + +import model.RowGameModel; + +public class RowGameBoardView { + public JButton[][] blocks = new JButton[3][3]; + + public void update(RowGameModel gameModel, int row, int column) { + blocks[row][column].setText(gameModel.blocksData[row][column].getContents()); + blocks[row][column].setEnabled(gameModel.blocksData[row][column].getIsLegalMove()); + } + +} diff --git a/tictactoe/src/view/RowGameGUI.java b/tictactoe/src/view/RowGameGUI.java index bde278f4..375cf5ee 100644 --- a/tictactoe/src/view/RowGameGUI.java +++ b/tictactoe/src/view/RowGameGUI.java @@ -2,20 +2,23 @@ import javax.swing.JButton; import javax.swing.JFrame; -import javax.swing.JTextArea; import javax.swing.JPanel; import java.awt.*; import java.awt.event.*; import model.RowGameModel; +import view.RowGameStatusView.GameStatus; import controller.RowGameController; public class RowGameGUI { public JFrame gui = new JFrame("Tic Tac Toe"); public RowGameModel gameModel = new RowGameModel(); - public JButton[][] blocks = new JButton[3][3]; + //public JButton[][] blocks = new JButton[3][3]; public JButton reset = new JButton("Reset"); - public JTextArea playerturn = new JTextArea(); + //public JTextArea playerturn = new JTextArea(); + public RowGameBoardView boardView = new RowGameBoardView(); + public RowGameStatusView statusView = new RowGameStatusView(); + /** * Creates a new game initializing the GUI. @@ -38,8 +41,8 @@ public RowGameGUI(RowGameController controller) { gui.add(options, BorderLayout.CENTER); gui.add(messages, BorderLayout.SOUTH); - messages.add(playerturn); - playerturn.setText("Player 1 to play 'X'"); + messages.add(statusView.playerturn); + this.updateStatus(GameStatus.START); reset.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -50,12 +53,12 @@ public void actionPerformed(ActionEvent e) { // Initialize a JButton for each cell of the 3x3 game board. for(int row = 0; row<3; row++) { for(int column = 0; column<3 ;column++) { - blocks[row][column] = new JButton(); - blocks[row][column].setPreferredSize(new Dimension(75,75)); - game.add(blocks[row][column]); - blocks[row][column].addActionListener(new ActionListener() { + boardView.blocks[row][column] = new JButton(); + boardView.blocks[row][column].setPreferredSize(new Dimension(75,75)); + game.add(boardView.blocks[row][column]); + boardView.blocks[row][column].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - controller.move((JButton)e.getSource()); + controller.move((JButton)e.getSource()); } }); } @@ -71,7 +74,27 @@ public void actionPerformed(ActionEvent e) { * @param column The column that contains the block */ public void updateBlock(RowGameModel gameModel, int row, int column) { - blocks[row][column].setText(gameModel.blocksData[row][column].getContents()); - blocks[row][column].setEnabled(gameModel.blocksData[row][column].getIsLegalMove()); + this.boardView.update(gameModel, row, column); + } + + /** + * Gets the block + * + * @return block + */ + public JButton[][] getBlocks(){ + return this.boardView.blocks; + } + + public void updateStatus(GameStatus status){ + statusView.update(status); + } + + public void disableButtons(){ + for(int row = 0;row<3;row++) { + for(int column = 0;column<3;column++) { + this.getBlocks()[row][column].setEnabled(false); + } + } } } diff --git a/tictactoe/src/view/RowGameStatusView.java b/tictactoe/src/view/RowGameStatusView.java new file mode 100644 index 00000000..735ea23e --- /dev/null +++ b/tictactoe/src/view/RowGameStatusView.java @@ -0,0 +1,39 @@ +package view; + +import javax.swing.JTextArea; + +/** + * Type safety using enums + */ +public class RowGameStatusView { + public enum GameStatus { + P1WIN, P2WIN, DRAW, P1TURN, P2TURN, START + } + + public JTextArea playerturn = new JTextArea(); + + public void update(GameStatus status){ + switch(status){ + case START: + this.playerturn.setText("Player 1 to play 'X'"); + break; + case P1TURN: + this.playerturn.setText("'X': Player 1"); + break; + case P2TURN: + this.playerturn.setText("'O': Player 2"); + break; + case P1WIN: + this.playerturn.setText("Player 1 wins!"); + break; + case P2WIN: + this.playerturn.setText("Player 2 wins!"); + break; + case DRAW: + this.playerturn.setText("Game ends in a draw"); + break; + default: + break; + } + } +} diff --git a/tictactoe/test/TestController.java b/tictactoe/test/TestController.java new file mode 100644 index 00000000..05d49641 --- /dev/null +++ b/tictactoe/test/TestController.java @@ -0,0 +1,36 @@ +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +import java.beans.Transient; + +import model.RowBlockModel; +import model.RowBlockModel.PlayerPiece; +import model.RowGameModel.Player; +import controller.RowGameController; + +public class TestController { + private RowGameController game; + + @Before + public void setUp() { + game = new RowGameController(); + } + + @After + public void tearDown() { + game = null; + } + + @Test + public void testRowChecker(){ + for (int i = 0; i < game.gameModel.blocksData.length ; i++) { + game.gameModel.blocksData[0][i].setPiece(PlayerPiece.X); + } + assertEquals(true, game.rowChecker(2, 0)); + assertEquals(true, game.rowChecker(0, 0)); + assertEquals(true, game.rowChecker(1, 0)); + } + +} diff --git a/tictactoe/test/TestExample.java b/tictactoe/test/TestExample.java index 92ac69f6..d20100d6 100644 --- a/tictactoe/test/TestExample.java +++ b/tictactoe/test/TestExample.java @@ -3,7 +3,15 @@ import org.junit.Test; import static org.junit.Assert.*; +import java.beans.Transient; + +import javax.swing.JButton; + import model.RowBlockModel; +import model.RowGameModel; +import model.RowBlockModel.PlayerPiece; +import model.RowGameModel.Player; +import view.RowGameStatusView.GameStatus; import controller.RowGameController; /** @@ -11,7 +19,6 @@ */ public class TestExample { private RowGameController game; - @Before public void setUp() { game = new RowGameController(); @@ -24,12 +31,118 @@ public void tearDown() { @Test public void testNewGame() { - assertEquals ("1", game.gameModel.player); + assertEquals (Player.One, game.gameModel.player); assertEquals (9, game.gameModel.movesLeft); + assertEquals(null, game.gameModel.getFinalResult()); + for (int i = 0; i < game.gameModel.blocksData.length; i++) { + for (int j = 0; j < game.gameModel.blocksData.length; j++) { + assertEquals(PlayerPiece.Empty, game.gameModel.blocksData[i][j].getPiece()); + } + } } @Test(expected = IllegalArgumentException.class) public void testNewBlockViolatesPrecondition() { - RowBlockModel block = new RowBlockModel(null); + RowBlockModel block = new RowBlockModel((RowGameModel) null); + } + + /** + * Test for "One of the players win" BEGIN + */ + @Test + public void testP1Wins(){ + //set the board so player X has three-in-a-row + game.gameView.boardView.blocks[0][0].doClick(); //X + game.gameView.boardView.blocks[1][0].doClick(); //O + game.gameView.boardView.blocks[0][1].doClick(); //X + game.gameView.boardView.blocks[1][1].doClick(); //O + game.gameView.boardView.blocks[0][2].doClick(); //X + assertEquals("Player 1 wins!", game.gameView.statusView.playerturn.getText()); + + } + + @Test + public void testP2Wins(){ + //set the board so player X has three-in-a-row + game.gameView.boardView.blocks[0][0].doClick(); //X + game.gameView.boardView.blocks[1][0].doClick(); //O + game.gameView.boardView.blocks[0][1].doClick(); //X + game.gameView.boardView.blocks[1][1].doClick(); //O + game.gameView.boardView.blocks[2][0].doClick(); //X + game.gameView.boardView.blocks[1][2].doClick(); //O + assertEquals("Player 2 wins!", game.gameView.statusView.playerturn.getText()); + + } + + /** + * Test for "One of the players win" END + */ + + /** + * Test for "The two players tie" + */ + @Test + public void twoPlayersTie(){ + + game.gameView.boardView.blocks[0][0].doClick(); //X + game.gameView.boardView.blocks[0][2].doClick(); //O + game.gameView.boardView.blocks[0][1].doClick(); //X + game.gameView.boardView.blocks[1][0].doClick(); //O + game.gameView.boardView.blocks[1][1].doClick(); //X + game.gameView.boardView.blocks[2][1].doClick(); //O + game.gameView.boardView.blocks[1][2].doClick(); //X + game.gameView.boardView.blocks[2][2].doClick(); //O + game.gameView.boardView.blocks[2][0].doClick(); //X + + assertEquals("Game ends in a draw" ,game.gameView.statusView.playerturn.getText()); + } + + /** + * Test for "Reset" + */ + @Test + public void testReset(){ + game.gameView.reset.doClick(); + testNewGame(); + } + /** + * Test "Illegal Move" + */ + @Test + public void testIllegalMove(){ + boolean flag = false; + RowBlockModel[][] ogBoard = new RowBlockModel[3][3]; + for (int i = 0; i < ogBoard.length; i++) { + for (int j = 0; j < ogBoard.length; j++) { + ogBoard[j][i] = new RowBlockModel(game.gameModel.blocksData[j][i]); + } + } + game.gameView.boardView.blocks[1][0].doClick(); + for (int i = 0; i < ogBoard.length; i++) { + for (int j = 0; j < ogBoard.length; j++) { + flag = (flag || ogBoard[j][i].equals(game.gameModel.blocksData[j][i])); + } + } + assertEquals(true, flag); + } + /** + * Test "Legal Move" + */ + @Test + public void testLegalMove(){ + boolean flag = false; + RowBlockModel[][] ogBoard = new RowBlockModel[3][3]; + for (int i = 0; i < ogBoard.length; i++) { + for (int j = 0; j < ogBoard.length; j++) { + ogBoard[j][i] = new RowBlockModel(game.gameModel.blocksData[j][i]); + } + } + game.gameView.boardView.blocks[1][0].doClick(); + for (int i = 0; i < ogBoard.length; i++) { + for (int j = 0; j < ogBoard.length; j++) { + flag = (flag & ogBoard[j][i].equals(game.gameModel.blocksData[j][i])); + } + } + assertEquals(false, flag); } } diff --git a/tictactoe/test/TestModel.java b/tictactoe/test/TestModel.java new file mode 100644 index 00000000..4b7307b0 --- /dev/null +++ b/tictactoe/test/TestModel.java @@ -0,0 +1,31 @@ +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +import model.RowBlockModel; +import model.RowBlockModel.PlayerPiece; +import view.RowGameStatusView; +import controller.RowGameController; + +public class TestModel { + private RowGameController game; + + + @Before + public void setUp() { + game = new RowGameController(); + } + + @After + public void tearDown() { + game = null; + } + + @Test + public void testGetPiece(){ + game.gameModel.blocksData[0][0].setPiece(PlayerPiece.X); + assertEquals(PlayerPiece.X , game.gameModel.blocksData[0][0].getPiece()); + + } +} diff --git a/tictactoe/test/TestView.java b/tictactoe/test/TestView.java new file mode 100644 index 00000000..3b8c0cb9 --- /dev/null +++ b/tictactoe/test/TestView.java @@ -0,0 +1,29 @@ +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +import model.RowBlockModel; +import view.RowGameStatusView; +import view.RowGameStatusView.GameStatus; +import controller.RowGameController; + +public class TestView { + private RowGameController game; + + @Before + public void setUp() { + game = new RowGameController(); + } + + @After + public void tearDown() { + game = null; + } + + @Test + public void testCompCUpdate(){ + game.gameView.statusView.update(GameStatus.START); + assertEquals("Player 1 to play 'X'", game.gameView.statusView.playerturn.getText()); + } +}