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}