1 /*
   2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation. Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package javafx.scene.control.test.chooser;
  26 
  27 import java.io.File;
  28 import java.util.List;
  29 import javafx.application.Application;
  30 import javafx.event.Event;
  31 import javafx.event.EventHandler;
  32 import javafx.scene.Scene;
  33 import javafx.scene.control.Button;
  34 import javafx.scene.control.Label;
  35 import javafx.scene.control.TextField;
  36 import javafx.scene.control.Tooltip;
  37 import javafx.scene.layout.GridPane;
  38 import javafx.scene.text.Text;
  39 import javafx.stage.DirectoryChooser;
  40 import javafx.stage.FileChooser;
  41 import javafx.stage.FileChooser.ExtensionFilter;
  42 import javafx.stage.Stage;
  43 import test.javaclient.shared.Utils;
  44 
  45 /**
  46  * @author Andrey Glushchenko, Alexander Kirov
  47  */
  48 public class FXChooser extends Application {
  49 
  50     int width = 600;
  51     int height = 400;
  52     ExtensionFilter extensionFilter;
  53     TextField initialFileNameTextField;
  54     TextField titleTextField;
  55     Label errorText;
  56 
  57     @Override
  58     public void start(final Stage stage) throws Exception {
  59         try {
  60             extensionFilter = new FileChooser.ExtensionFilter("File with extension (*.extension)", "*.extension");
  61             initialFileNameTextField = new TextField("");
  62             initialFileNameTextField.setPromptText("Initial file name");
  63             titleTextField = new TextField("");
  64             titleTextField.setPromptText("Title");
  65             errorText = new Label("No errors");
  66 
  67             //                  OPEN FOLDER
  68             final DirectoryChooser directoryChooser = new DirectoryChooser();
  69 
  70             final Text fxDirOpenResText = new Text("no dir choosen");
  71             Button fxOpenDirButton = new Button("Open Dir FX");
  72             fxOpenDirButton.setPrefSize(width / 2, height / 2);
  73             fxOpenDirButton.setOnAction(new EventHandler() {
  74                 public void handle(Event t) {
  75                     try {
  76                         initTitle(directoryChooser);
  77                         final File folder = directoryChooser.showDialog(null);
  78                         fxDirOpenResText.setText("FX Dir chooser result is : " + (folder != null ? folder.getAbsolutePath() : "null"));
  79                     } catch (Throwable ex) {
  80                         indicateError(ex);
  81                     }
  82                 }
  83             });
  84 
  85             //                  SAVE FILE
  86             final FileChooser saveFileChooser = new FileChooser();
  87 
  88             final Text fxFileSaveResText = new Text("no files choosen");
  89             Button fxSaveFileButton = new Button("Save file FX (modal dialog)");
  90             fxSaveFileButton.setPrefSize(width / 2, height / 2);
  91             fxSaveFileButton.setOnAction(new EventHandler() {
  92                 public void handle(Event t) {
  93                     try {
  94                         initFileAndTitle(saveFileChooser);
  95                         File file = saveFileChooser.showSaveDialog(stage);
  96                         fxFileSaveResText.setText("FX File save chooser result is : " + (file != null ? file.getAbsolutePath() : "null"));
  97                         if (file != null) {
  98                             file.createNewFile();
  99                         }
 100                     } catch (Exception ex) {
 101                         indicateError(ex);
 102                     }
 103                 }
 104             });
 105 
 106             //                  SAVE FILE WITH EXTENSION
 107             final FileChooser saveFileWithExtChooser = new FileChooser();
 108             saveFileWithExtChooser.getExtensionFilters().addAll(extensionFilter);
 109 
 110             final Text fxFileSaveWithExtResText = new Text("no files choosen");
 111             Button fxSaveFileWithExtButton = new Button("Save file with extension FX (modal dialog)");
 112             fxSaveFileWithExtButton.setPrefSize(width / 2, height / 2);
 113             fxSaveFileWithExtButton.setOnAction(new EventHandler() {
 114                 public void handle(Event t) {
 115                     try {
 116                         initFileAndTitle(saveFileWithExtChooser);
 117                         File file = saveFileWithExtChooser.showSaveDialog(stage);
 118                         fxFileSaveWithExtResText.setText("FX File save chooser result is : " + (file != null ? file.getAbsolutePath() : "null"));
 119                         if (file != null) {
 120                             file.createNewFile();
 121                         }
 122                     } catch (Exception ex) {
 123                         indicateError(ex);
 124                     }
 125                 }
 126             });
 127 
 128             //                  OPEN FILE
 129             final FileChooser fileOpenChooser = new FileChooser();
 130 
 131             final Text fxFileOpenResText = new Text("no file choosen");
 132             Button fxOpenFileButton = new Button("Open File FX");
 133             fxOpenFileButton.setPrefSize(width / 2, height / 2);
 134             fxOpenFileButton.setOnAction(new EventHandler() {
 135                 public void handle(Event t) {
 136                     try {
 137                         initFileAndTitle(fileOpenChooser);
 138                         final File file = fileOpenChooser.showOpenDialog(null);
 139                         fxFileOpenResText.setText("FX File chooser result is : " + (file != null ? file.getAbsolutePath() : "null"));
 140                     } catch (Throwable ex) {
 141                         indicateError(ex);
 142                     }
 143                 }
 144             });
 145 
 146             //                  OPEN FILE WITH EXTENSION
 147             final FileChooser fileOpenWithExtChooser = new FileChooser();
 148             fileOpenWithExtChooser.getExtensionFilters().addAll(extensionFilter);
 149 
 150             final Text fxFileOpenWithExtResText = new Text("no file choosen");
 151             Button fxOpenFileWithExtButton = new Button("Open File with extension FX");
 152             fxOpenFileWithExtButton.setPrefSize(width / 2, height / 2);
 153             fxOpenFileWithExtButton.setOnAction(new EventHandler() {
 154                 public void handle(Event t) {
 155                     try {
 156                         initFileAndTitle(fileOpenWithExtChooser);
 157                         final File file = fileOpenWithExtChooser.showOpenDialog(null);
 158                         fxFileOpenWithExtResText.setText("FX File chooser result is : " + (file != null ? file.getAbsolutePath() : "null"));
 159                     } catch (Throwable ex) {
 160                         indicateError(ex);
 161                     }
 162                 }
 163             });
 164 
 165             //                  OPEN MULTIPLE FILES
 166             final FileChooser fileOpenMultiChooser = new FileChooser();
 167 
 168             final Label fxFileOpenMultiResText = new Label("no file choosen");
 169             fxFileOpenMultiResText.setWrapText(true);
 170             Button fxOpenMultiFileButton = new Button("Open Multiple Files FX");
 171             fxOpenMultiFileButton.setPrefSize(width / 2, height / 2);
 172             fxOpenMultiFileButton.setOnAction(new EventHandler() {
 173                 public void handle(Event t) {
 174                     try {
 175                         initFileAndTitle(fileOpenMultiChooser);
 176                         final List<File> files = fileOpenMultiChooser.showOpenMultipleDialog(null);
 177                         StringBuilder builder = new StringBuilder("FX File chooser result : ");
 178                         if (files != null) {
 179                             for (File file : files) {
 180                                 builder.append(file != null ? file.getAbsolutePath() : "null").append("; ");
 181                             }
 182                         } else {
 183                             builder.append("null");
 184                         }
 185                         fxFileOpenMultiResText.setText(builder.toString());
 186                     } catch (Throwable ex) {
 187                         indicateError(ex);
 188                     }
 189                 }
 190             });
 191 
 192             //                  OPEN MULTIPLE FILES WITH EXTENSIONS
 193             final FileChooser fileOpenMultiWithExtChooser = new FileChooser();
 194             fileOpenMultiWithExtChooser.getExtensionFilters().addAll(extensionFilter);
 195 
 196             final Label fxFileOpenMultiWithExtResText = new Label("no file choosen");
 197             fxFileOpenMultiWithExtResText.setWrapText(true);
 198             Button fxOpenMultiWithExtFileButton = new Button("Open Multiple Files With extensions FX");
 199             fxOpenMultiWithExtFileButton.setPrefSize(width / 2, height / 2);
 200             fxOpenMultiWithExtFileButton.setOnAction(new EventHandler() {
 201                 public void handle(Event t) {
 202                     try {
 203                         initFileAndTitle(fileOpenMultiWithExtChooser);
 204                         final List<File> files = fileOpenMultiWithExtChooser.showOpenMultipleDialog(null);
 205                         StringBuilder builder = new StringBuilder("FX File chooser result : ");
 206                         if (files != null) {
 207                             for (File file : files) {
 208                                 builder.append(file != null ? file.getAbsolutePath() : "null").append("; ");
 209                             }
 210                         } else {
 211                             builder.append("null");
 212                         }
 213                         fxFileOpenMultiWithExtResText.setText(builder.toString());
 214                     } catch (Throwable ex) {
 215                         indicateError(ex);
 216                     }
 217                 }
 218             });
 219 
 220             GridPane root = new GridPane();
 221 
 222             root.add(new Label("Initial file name : "), 0, 0);
 223             root.add(initialFileNameTextField, 1, 0);
 224 
 225             root.add(new Label("Title : "), 0, 1);
 226             root.add(titleTextField, 1, 1);
 227 
 228             root.add(fxOpenDirButton, 0, 2);
 229             root.add(fxSaveFileButton, 0, 3);
 230             root.add(fxSaveFileWithExtButton, 0, 4);
 231             root.add(fxOpenFileButton, 0, 5);
 232             root.add(fxOpenFileWithExtButton, 0, 6);
 233             root.add(fxOpenMultiFileButton, 0, 7);
 234             root.add(fxOpenMultiWithExtFileButton, 0, 8);
 235 
 236             root.add(fxDirOpenResText, 1, 2);
 237             root.add(fxFileSaveResText, 1, 3);
 238             root.add(fxFileSaveWithExtResText, 1, 4);
 239             root.add(fxFileOpenResText, 1, 5);
 240             root.add(fxFileOpenWithExtResText, 1, 6);
 241             root.add(fxFileOpenMultiResText, 1, 7);
 242             root.add(fxFileOpenMultiWithExtResText, 1, 8);
 243 
 244             root.add(errorText, 0, 9);
 245 
 246             Scene scene = new Scene(root, width, height);
 247             stage.setScene(scene);
 248             stage.setTitle("FXChooser");
 249             stage.show();
 250         } catch (Throwable ex) {
 251             indicateError(ex);
 252         }
 253     }
 254 
 255     private void indicateError(Throwable ex) {
 256         errorText.setText("Error has happened. See log.");
 257         ex.printStackTrace(System.err);
 258         errorText.setTooltip(new Tooltip(ex.getMessage() + "\n"));
 259         for (StackTraceElement element : ex.getStackTrace()) {
 260             errorText.getTooltip().setText(errorText.getTooltip().getText() + element.toString() + "\n");
 261         }
 262     }
 263 
 264     private void initFileAndTitle(FileChooser fc) {
 265         if (!titleTextField.getText().equals("")) {
 266             fc.setTitle(titleTextField.getText());
 267         }
 268         if (!initialFileNameTextField.getText().equals("")) {
 269             fc.setInitialFileName(initialFileNameTextField.getText());
 270         }
 271     }
 272 
 273     private void initTitle(DirectoryChooser dc) {
 274         if (!titleTextField.getText().equals("")) {
 275             dc.setTitle(titleTextField.getText());
 276         }
 277     }
 278 
 279     public static void main(String[] args) {
 280         Utils.launch(FXChooser.class, args);
 281     }
 282 }