import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.geometry.Side;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuButton;
import javafx.scene.control.MenuItem;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

public class MenuShowBug extends Application {

	private final static Side side = Side.TOP;

	private ContextMenu menu;
	private ToggleButton button;
	private MenuButton mbutton;
	private FlowPane pane;

    @Override
    public void start(Stage stage) {
    	createButton();
    	createMenu();
    	createMenuButton();
    	createPane();
        Scene scene = new Scene(pane, 640, 480);
        scene.getStylesheets().add(createStylesheet());		
        stage.setScene(scene);
        stage.show();
    }
    
    private void createButton() {
    	button = new ToggleButton("Menu should appear on " + side + " of me");
		button.setOnAction(this::toggleContextMenu);      	
    }
    
	private void toggleContextMenu(ActionEvent e) {
		if (button.isSelected()) {
			menu.show(button, side, 0, 0);
		} else {
			menu.hide();
		}
	}

    private void createMenu() {
    	menu = new ContextMenu(new MenuItem("one"), new MenuItem("two"), new MenuItem("three"), new MenuItem("four"));
		menu.setOnHiding(this::deselectContextMenuButton);    	
    }

	public void addMenuItem(String label) {
		MenuItem menuItem = new MenuItem(label);
		menu.getItems().add(menuItem);
	}

	private void deselectContextMenuButton(WindowEvent e) {
		button.setSelected(false);
	}    
	
	private void createMenuButton() {
		mbutton = new MenuButton(
			"Menu should appear on " + side + " of me", null, 
			new MenuItem("one"), new MenuItem("two"), new MenuItem("three"), new MenuItem("four")
		);
		mbutton.setPopupSide(Side.TOP);
	}
	
	private void createPane() {
		pane = new FlowPane(button, mbutton);	
		pane.setAlignment(Pos.BOTTOM_LEFT);
		pane.setHgap(20);
	}

	private String createStylesheet() {
    	try {
			File f = File.createTempFile("menushowbug", ".css"); 
			f.deleteOnExit();
			FileWriter fw=new FileWriter(f);
			fw.write(".menu-item { -fx-padding: 10px;}\n"); 
			fw.close();
			return f.toURI().toString();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	public static void main(String[] args) {
        launch();
    }    
}
