001package fi.jyu.mit.fxgui;
002
003import java.util.Optional;
004
005import javafx.scene.control.Alert;
006import javafx.scene.control.Alert.AlertType;
007import javafx.scene.control.ButtonBar.ButtonData;
008import javafx.scene.control.ButtonType;
009import javafx.scene.control.Control;
010import javafx.scene.control.TextInputDialog;
011import javafx.scene.control.Tooltip;
012
013/**
014 * @author vesal
015 * @version 31.12.2015
016 * Joukko valmiita dialogeja helpottamaan yksinkertaisia tehtäviä. 
017 */
018public class Dialogs {
019 
020    /**
021     * Rajapinta dialogin asettamisen takaisinkutsulle
022     */
023    public interface AlertSetterInterface {
024        /**
025         * @param alert mille dialogille asetetaan
026         */
027        public void set(Alert alert); 
028    }
029    
030    
031    /**
032     * Rajapinta dialogin asettamisen takaisinkutsulle
033     */
034    public interface TextInputDialogSetterInterface {
035        /**
036         * @param dlg mille dialogille asetetaan
037         */
038        public void set(TextInputDialog dlg); 
039    }
040    
041    
042    /**
043     * Asetetan tietylle kontrollille Tooltip
044     * @param node mikkle kontrollille asetetaan
045     * @param tip mikä viesti
046     * @return luotu Tooltip tai null jos ei viestiä
047     */
048    public static Tooltip setToolTipText(Control node, String tip) {
049        if ( tip == null || tip.isEmpty() ) {
050            node.setTooltip(null);
051            return null;
052        }
053        Tooltip tooltip = new Tooltip();
054        tooltip.setText(tip);
055        node.setTooltip(tooltip);
056        return tooltip;
057    }
058    
059    
060    /**
061     * Näytetään viesti käyttäjälle ja odotetaan kuittausta
062     * @param message näytettävä viesti
063     * @param alertSetter kutsu, jolla voidaan asettaa arvoja ennen näyttämistä
064     */
065    public static void showMessageDialog(String message, AlertSetterInterface alertSetter) {
066        Alert alert = new Alert(AlertType.INFORMATION);
067        alert.setTitle("Huomautus");
068        alert.setHeaderText(null);
069        alert.setContentText(message);
070        alert.getDialogPane().setPrefSize(200, -1);
071        if ( alertSetter != null ) alertSetter.set(alert);
072        alert.showAndWait();
073    }
074
075    
076    /**
077     * Näytetään viesti käyttäjälle ja odotetaan kuittausta
078     * @param message näytettävä viesti
079     */
080    public static void showMessageDialog(String message) {
081        showMessageDialog(message, null);
082    }
083
084    
085    /**
086     * Näytetään dialogi, joka kysyy merkkijonon
087     * @param prompt teksti joka näytetään kysymykseksi
088     * @param def arvo joka on syötön pohjana
089     * @param setter kutsu, jolla voidaan asettaa arvoja ennen näyttämistä
090     * @return null mikäli painetaan Cancel, muuten käyttäjän antama syöte.
091     */
092    public static String showInputDialog(String prompt, String def, TextInputDialogSetterInterface setter) {
093        TextInputDialog dialog = new TextInputDialog(def);
094        dialog.setHeaderText(null);
095        dialog.setTitle("Vastaa");
096        dialog.setContentText(prompt + ":");
097        if ( setter != null ) setter.set(dialog);
098        Optional<String> answer = dialog.showAndWait();
099        return answer.isPresent() ? answer.get() : null;
100    }
101
102
103    /**
104     * Näytetään dialogi, joka kysyy merkkijonon
105     * @param prompt teksti joka näytetään kysymykseksi
106     * @param def arvo joka on syötön pohjana
107     * @return null mikäli painetaan Cancel, muuten käyttäjän antama syöte.
108     */
109    public static String showInputDialog(String prompt, String def) {
110        return showInputDialog(prompt, def, null);         
111    }
112    
113    
114    /**
115     * Näytetään dialogi, jossa itse valittava otsikko, kysymysteksti
116     * ja kaksi itse valittavaa painiketta joista 1. on oletus ja toinen cancel
117     * @param title dialogin otsikko
118     * @param question dislogissa oleva kysymys
119     * @param buttonYes kyllä painikkeen teksti
120     * @param buttonNo ei painikkeen teksti
121     * @return true jos painetaan 1. painiketta ja false jos toista
122     * @param alertSetter kutsu, jolla voidaan asettaa arvoja ennen näyttämistä
123     */
124    public static boolean showQuestionDialog(String title, String question,  
125                        String buttonYes, String buttonNo,
126                        AlertSetterInterface alertSetter) {
127        Alert alert = new Alert(AlertType.CONFIRMATION);
128        alert.setTitle(title);
129        alert.setHeaderText(null);
130        alert.setContentText(question);
131
132        ButtonType buttonTypeYes = new ButtonType(buttonYes, ButtonData.OK_DONE);
133        ButtonType buttonTypeCancel = new ButtonType(buttonNo, ButtonData.CANCEL_CLOSE);
134
135        alert.getButtonTypes().setAll(buttonTypeYes, buttonTypeCancel);
136
137        if ( alertSetter != null ) alertSetter.set(alert);
138        Optional<ButtonType> result = alert.showAndWait();
139        return result.get() == buttonTypeYes;
140    }
141
142
143    /**
144     * Näytetään dialogi, jossa itse valittava otsikko, kysymysteksti
145     * ja kaksi itse valittavaa painiketta joista 1. on oletus ja toinen cancel
146     * @param title dialogin otsikko
147     * @param question dislogissa oleva kysymys
148     * @param buttonYes kyllä painikkeen teksti
149     * @param buttonNo ei painikkeen teksti
150     * @return true jos painetaan 1. painiketta ja false jos toista
151     */
152    public static boolean showQuestionDialog(String title, String question,  
153                        String buttonYes, String buttonNo) {
154        return showQuestionDialog(title, question, buttonYes, buttonNo, null);
155    }
156
157}