package jp.ac.aiit.jointry.controllers;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.MenuItem;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.stage.Window;
import javafx.stage.WindowEvent;
import jp.ac.aiit.jointry.models.Sprite;
import jp.ac.aiit.jointry.services.broker.core.Agent;
import jp.ac.aiit.jointry.services.broker.core.DefaultMonitor;
import javafx.application.Platform;
import javafx.scene.Node;
import javafx.scene.control.ListView;
import javafx.scene.layout.VBox;
import jp.ac.aiit.jointry.JointryMain;
import jp.ac.aiit.jointry.services.broker.app.JointryAccount;
import static jp.ac.aiit.jointry.services.broker.app.JointryCommon.M_MAIN_DISCONNECT;
import jp.ac.aiit.jointry.services.broker.app.MainDialog;
import jp.ac.aiit.jointry.services.file.FileManager;
import jp.ac.aiit.jointry.util.StageUtil;
public class MainController implements Initializable {
@FXML
private BorderPane rootPane;
@FXML
private MenuItem roomEnter;
@FXML
private MenuItem roomExit;
private BackStageController backStageController;
private FrontStageController frontStageController;
private BlocksController blocksController;
private Agent agent;
private String userName;
private ListView members = new ListView();
private FileManager fileManager = new FileManager();
private JointryMain jointryMain;
@Override
public void initialize(URL url, ResourceBundle rb) {
try {
FXMLLoader ld;
Class<? extends MainController> klass = getClass();
// FrontStage
ld = new FXMLLoader(klass.getResource("FrontStage.fxml"));
Parent front = (Parent) ld.load();
FrontStageController fsc = ld.<FrontStageController>getController();
fsc.setMainController(this);
rootPane.setRight(front);
setFrontStageController(fsc);
// BackStage
ld = new FXMLLoader(klass.getResource("BackStage.fxml"));
Parent back = (Parent) ld.load();
BackStageController bsc = ld.<BackStageController>getController();
bsc.setMainController(this);
rootPane.setCenter(back);
setBackStageController(bsc);
// Blocks
ld = new FXMLLoader(klass.getResource("Blocks.fxml"));
Parent blocks = (Parent) ld.load();
BlocksController bc = ld.<BlocksController>getController();
bc.setMainController(this);
rootPane.setLeft(blocks);
setBlocksController(bc);
} catch (IOException ex) {
Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
}
}
@FXML
protected void newProject(ActionEvent event) {
this.initialize(null, null);
initWindow("new");
fileManager = new FileManager();
MainDialog.sendSynchronize();
}
@FXML
protected void fsave(ActionEvent event) {
try {
fileManager.save(frontStageController.getSprites());
} catch (IOException ex) {
Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
}
}
@FXML
protected void fSaveAsOverWrite(ActionEvent event) {
try {
fileManager.saveAsOverWrite(frontStageController.getSprites());
} catch (IOException ex) {
Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
}
}
@FXML
protected void fopen(ActionEvent event) {
try {
fileManager.load(this);
} catch (IOException ex) {
Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
}
MainDialog.sendSynchronize();
}
@FXML
protected void startCooperation(ActionEvent event) {
//協同編集
Window owner = rootPane.getScene().getWindow(); //画面オーナー
URL fxml = getClass().getResource("Cooperation.fxml"); //表示するfxml
final StageUtil su = new StageUtil(null, owner, fxml, null);
final CooperationController ctrl = (CooperationController) su.getController();
ctrl.setMainController(MainController.this);
su.getStage().setOnHidden(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
if (agent == null) {
agent = ctrl.getAgent();
if (agent != null) {
agent.setMonitor(new MainMonitor());
userName = ctrl.getName();
if ("s".equals(String.valueOf(agent.mark()))) {
getFrontStageController().setSyncVisible(true);
}
}
}
ctrl.windowClose();
}
});
su.getStage().show();
}
@FXML
protected void endCooperation(ActionEvent event) {
MainDialog.sendConnection(M_MAIN_DISCONNECT, agent, userName);
JointryAccount.clearUser(); //コネクションが切れたらユーザキャッシュをクリア
if (agent != null) {
agent.close();
agent = null;
}
initWindow("disconnect");
}
public void initWindow(String mode) {
switch (mode) {
case "new":
//初期スプライト
URL path = getClass().getResource("images/sprite_1.gif");
Sprite sprite = new Sprite(path.toString());
sprite.setMainController(this);
URL costume_path2 = getClass().getResource("images/sprite_2.gif");
sprite.addCostume("costume", new Image(costume_path2.toString()));
URL costume_path3 = getClass().getResource("images/sprite_3.gif");
sprite.addCostume("costume", new Image(costume_path3.toString()));
frontStageController.showSprite(sprite);
break;
case "load":
this.initialize(null, null);
if (agent != null) {
initWindow("connect"); //協同編集中であればメンバーを表示
}
break;
case "connect":
//参加しているメンバー領域の表示
VBox connectFront = new VBox();
connectFront.getChildren().addAll(rootPane.getRight(), members);
rootPane.setRight(connectFront);
refreshMembers();
members.setStyle("-fx-border-color: rgb(49, 89, 23)");
roomEnter.setVisible(false);
roomExit.setVisible(true);
break;
case "disconnect":
//参加しているメンバー領域の非表示
Node disconnectFront = rootPane.getRight();
if (disconnectFront instanceof VBox) {
rootPane.setRight(((VBox) disconnectFront).getChildren().get(0));
}
roomEnter.setVisible(true);
roomExit.setVisible(false);
getFrontStageController().setSyncVisible(false);
break;
default:
break;
}
}
public void refreshMembers() {
members.setItems(JointryAccount.getUsers());
}
public void windowClose() {
if (agent != null) {
agent.close();
}
}
public void setBackStageController(BackStageController controller) {
this.backStageController = controller;
}
public void setFrontStageController(FrontStageController controller) {
this.frontStageController = controller;
}
public void setBlocksController(BlocksController blocksController) {
this.blocksController = blocksController;
}
public BackStageController getBackStageController() {
return this.backStageController;
}
public FrontStageController getFrontStageController() {
return this.frontStageController;
}
public BlocksController getBlocksController() {
return this.blocksController;
}
public Agent getAgent() {
return this.agent;
}
public void setJointryMain(JointryMain jm) {
this.jointryMain = jm;
}
public JointryMain getJointryMain() {
return this.jointryMain;
}
public String getUserName() {
return userName;
}
private class MainMonitor extends DefaultMonitor {
@Override
public void onClose() {
agent = null; //close済みなので参照を外す
Platform.runLater(new Runnable() {
@Override
public void run() {
initWindow("disconnect");
}
});
}
}
}