/*
* Copyright 2013-2014 Odysseus Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.musicmount.fx;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.geometry.Side;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TitledPane;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import org.musicmount.util.LoggingUtil;
import org.musicmount.util.VersionUtil;
public class FXMusicMount extends Application {
static final Logger LOGGER = Logger.getLogger(FXMusicMount.class.getName());
static {
LoggingUtil.configure("org.musicmount", Level.FINE);
}
@Override
public void start(final Stage primaryStage) {
// Platform.setImplicitExit(false);
final FXConsole console = new FXConsole();
console.getTextArea().setId("console");
console.getTextArea().setEditable(false);
console.getTextArea().setPrefHeight(200);
TitledPane consolePane = new TitledPane("Console", console.getTextArea());
consolePane.setExpanded(false);
consolePane.setAnimated(false);
consolePane.heightProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
primaryStage.setHeight(primaryStage.getHeight() + newValue.doubleValue() - oldValue.doubleValue());
}
});
FXCommandModel model = new FXCommandModel();
final FXLiveController liveController = new FXLiveController(model);
Pane livePane = liveController.getPane();
livePane.setId("live-pane");
final FXBuildController buildController = new FXBuildController(model);
Pane buildPane = buildController.getPane();
buildPane.setId("build-pane");
final FXTestController testController = new FXTestController(model);
Pane testPane = testController.getPane();
testPane.setId("test-pane");
primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("favicon.png")));
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
if (liveController.getLiveService().isRunning()) {
liveController.getLiveService().cancel();
}
if (buildController.getService().isRunning()) {
buildController.getService().cancel();
}
if (testController.getService().isRunning()) {
testController.getService().cancel();
}
console.stop();
System.exit(0);
}
});
final TabPane tabPane = new TabPane();
tabPane.setId("tab-pane");
tabPane.setSide(Side.TOP);
tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
final Tab liveTab = new Tab();
liveTab.setText("Live");
liveTab.setContent(livePane);
final Tab buildTab = new Tab();
buildTab.setText("Build");
buildTab.setContent(buildPane);
final Tab testTab = new Tab();
testTab.setText("Test");
testTab.setContent(testPane);
tabPane.getTabs().addAll(liveTab, buildTab, testTab);
tabPane.getSelectionModel().select(liveTab);
tabPane.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() {
@Override
public void changed(ObservableValue<? extends Tab> observable, Tab oldValue, Tab newValue) {
if (newValue == liveTab) {
liveController.updateAll();
} else if (newValue == buildTab) {
buildController.updateAll();
} else if (newValue == testTab) {
testController.updateAll();
}
}
});
ChangeListener<Boolean> serviceRunningListener = new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
for (Tab tab : tabPane.getTabs()) {
tab.setDisable(newValue && tab != tabPane.getSelectionModel().getSelectedItem());
}
}
};
liveController.getLiveService().runningProperty().addListener(serviceRunningListener);
liveController.getBuildService().runningProperty().addListener(serviceRunningListener);
buildController.getService().runningProperty().addListener(serviceRunningListener);
testController.getService().runningProperty().addListener(serviceRunningListener);
final BorderPane borderPane = new BorderPane();
borderPane.setId("border-pane");
borderPane.setCenter(tabPane);
borderPane.setBottom(consolePane);
Scene scene = new Scene(borderPane, 600, borderPane.getPrefHeight());
scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
primaryStage.setTitle("MusicMount");
primaryStage.setScene(scene);
primaryStage.show();
// primaryStage.setResizable(false);
console.start();
LOGGER.info("version " + VersionUtil.getImplementationVersion() + " (java version " + System.getProperty("java.version") + ")");
}
/**
* @param args
* the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}