import com.apple.eawt.AppEvent; 
import com.apple.eawt.QuitResponse; 

import java.security.AccessControlException; 
import java.util.Optional; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.scene.Scene; 
import javafx.scene.control.Alert; 
import javafx.scene.control.ButtonType; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuBar; 
import javafx.scene.control.MenuItem; 
import javafx.scene.control.SeparatorMenuItem; 
import javafx.scene.control.TextArea; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 


/** 
 * Sample application. 
 * @author me 
 */ 
public class HelloWorldApplication extends Application { 
// constants -------------------------------------------------------------------------------- 
  

   /** 
    * Running on Mac platform. 
    */ 
   public static final boolean MAC; 

   static { 
      boolean mac = false; 
      try { 
         final String osName = System.getProperty("os.name");         
         System.out.println("OS: {}" + osName); 
         mac = osName != null && osName.toLowerCase().contains("mac"); 
      } catch (AccessControlException ex) {         
    	  System.out.println("Cannot determine OS"); 
      } 
      MAC = mac; 
   } 

// member variables ------------------------------------------------------------------------- 
   private final Alert mAlert = new Alert(Alert.AlertType.CONFIRMATION); 

// methods ---------------------------------------------------------------------------------- 
   @Override 
   public void start(Stage pStage) { 
      final BorderPane root = new BorderPane(); 

      final MenuBar menuBar = new MenuBar(); 

      final Menu fileMenu = new Menu("_File"); 
      menuBar.getMenus().add(fileMenu); 
      menuBar.setUseSystemMenuBar(true);
      // Exit 
      boolean macQuitMenuItem = false; 
      if (MAC) { 
         final com.apple.eawt.Application application = com.apple.eawt.Application.getApplication(); 
         try { 
            application.setQuitHandler( 
               (AppEvent.QuitEvent pEvt, QuitResponse pQuitResponse) -> Platform.runLater( 
                  () -> exit(pQuitResponse::cancelQuit) 
               ) 
            ); 
            //macQuitMenuItem = true; 
			System.out.println("test1");
            // occurs when running as untrusted applet 
         } catch (AccessControlException ex) { 
        	 System.out.println("Cannot listen for application quit"); 
         } 
      } 
	  System.out.println("macQuitMenuItem::" + macQuitMenuItem);
      if (!macQuitMenuItem) { 
			System.out.println("test2");
         fileMenu.getItems().add(new SeparatorMenuItem()); 

         final MenuItem exitMenuItem = new MenuItem("E_xit"); 

         exitMenuItem.setOnAction(pEvt -> exit(() -> {})); 
         fileMenu.getItems().add(exitMenuItem); 
		 System.out.println("Added exit");
      } 


      root.setTop(menuBar); 
      root.setCenter(new TextArea("Hello, world!")); 

      final Scene scene = new Scene(root, 300, 250); 

      pStage.setTitle("Hello World!"); 
      pStage.setScene(scene); 

      mAlert.initOwner(pStage); 
      mAlert.setTitle("Confirm Exit"); 
      mAlert.setHeaderText("Look, a Confirmation Dialog"); 
      mAlert.setContentText("Are you sure you want to exit?"); 

      pStage.show(); 
   } 

   public static void cd(String[] pArgs) {launch(pArgs);} 

   public void exit() {exit(() -> {});} 

   public void exit(Runnable pAbortExitRunnable) { 
	   System.out.println("Exit"); 
      if (checkUnsavedChanges()) { 
         Platform.exit(); 
      } else { 
         pAbortExitRunnable.run(); 
      } 
   } 

   private boolean checkUnsavedChanges() { 
      final Optional<ButtonType> result = mAlert.showAndWait(); 
      return result.isPresent() && result.get() == ButtonType.OK; 
   } 
} 
