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.TextFieldBuilder;
  37 import javafx.scene.control.Tooltip;
  38 import javafx.scene.layout.GridPane;
  39 import javafx.scene.text.Text;
  40 import javafx.stage.DirectoryChooser;
  41 import javafx.stage.FileChooser;
  42 import javafx.stage.FileChooser.ExtensionFilter;
  43 import javafx.stage.Stage;
  44 import test.javaclient.shared.Utils;
  45 
  46 /**
  47  * @author Andrey Glushchenko, Alexander Kirov
  48  */
  49 public class FXChooser extends Application {
  50 
  51     int width = 600;
  52     int height = 400;
  53     ExtensionFilter extensionFilter;
  54     TextField initialFileNameTextField;
  55     TextField titleTextField;
  56     Label errorText;
  57 
  58     @Override
  59     public void start(final Stage stage) throws Exception {
  60         try {
  61             extensionFilter = new FileChooser.ExtensionFilter("File with extension (*.extension)", "*.extension");
  62             initialFileNameTextField = TextFieldBuilder.create().text("").promptText("Initial file name").build();
  63             titleTextField = TextFieldBuilder.create().text("").promptText("Title").build();
  64             errorText = new Label("No errors");
  65 
  66             //                  OPEN FOLDER
  67             final DirectoryChooser directoryChooser = new DirectoryChooser();
  68 
  69             final Text fxDirOpenResText = new Text("no dir choosen");
  70             Button fxOpenDirButton = new Button("Open Dir FX");
  71             fxOpenDirButton.setPrefSize(width / 2, height / 2);
  72             fxOpenDirButton.setOnAction(new EventHandler() {
  73                 public void handle(Event t) {
  74                     try {
  75                         initTitle(directoryChooser);
  76                         final File folder = directoryChooser.showDialog(null);
  77                         fxDirOpenResText.setText("FX Dir chooser result is : " + (folder != null ? folder.getAbsolutePath() : "null"));
  78                     } catch (Throwable ex) {
  79                         indicateError(ex);
  80                     }
  81                 }
  82             });
  83 
  84             //                  SAVE FILE
  85             final FileChooser saveFileChooser = new FileChooser();
  86 
  87             final Text fxFileSaveResText = new Text("no files choosen");
  88             Button fxSaveFileButton = new Button("Save file FX (modal dialog)");
  89             fxSaveFileButton.setPrefSize(width / 2, height / 2);
  90             fxSaveFileButton.setOnAction(new EventHandler() {
  91                 public void handle(Event t) {
  92                     try {
  93                         initFileAndTitle(saveFileChooser);
  94                         File file = saveFileChooser.showSaveDialog(stage);
  95                         fxFileSaveResText.setText("FX File save chooser result is : " + (file != null ? file.getAbsolutePath() : "null"));
  96                         if (file != null) {
  97                             file.createNewFile();
  98                         }
  99                     } catch (Exception ex) {
 100                         indicateError(ex);
 101                     }
 102                 }
 103             });
 104 
 105             //                  SAVE FILE WITH EXTENSION
 106             final FileChooser saveFileWithExtChooser = new FileChooser();
 107             saveFileWithExtChooser.getExtensionFilters().addAll(extensionFilter);
 108 
 109             final Text fxFileSaveWithExtResText = new Text("no files choosen");
 110             Button fxSaveFileWithExtButton = new Button("Save file with extension FX (modal dialog)");
 111             fxSaveFileWithExtButton.setPrefSize(width / 2, height / 2);
 112             fxSaveFileWithExtButton.setOnAction(new EventHandler() {
 113                 public void handle(Event t) {
 114                     try {
 115                         initFileAndTitle(saveFileWithExtChooser);
 116                         File file = saveFileWithExtChooser.showSaveDialog(stage);
 117                         fxFileSaveWithExtResText.setText("FX File save chooser result is : " + (file != null ? file.getAbsolutePath() : "null"));
 118                         if (file != null) {
 119                             file.createNewFile();
 120                         }
 121                     } catch (Exception ex) {
 122                         indicateError(ex);
 123                     }
 124                 }
 125             });
 126 
 127             //                  OPEN FILE
 128             final FileChooser fileOpenChooser = new FileChooser();
 129 
 130             final Text fxFileOpenResText = new Text("no file choosen");
 131             Button fxOpenFileButton = new Button("Open File FX");
 132             fxOpenFileButton.setPrefSize(width / 2, height / 2);
 133             fxOpenFileButton.setOnAction(new EventHandler() {
 134                 public void handle(Event t) {
 135                     try {
 136                         initFileAndTitle(fileOpenChooser);
 137                         final File file = fileOpenChooser.showOpenDialog(null);
 138                         fxFileOpenResText.setText("FX File chooser result is : " + (file != null ? file.getAbsolutePath() : "null"));
 139                     } catch (Throwable ex) {
 140                         indicateError(ex);
 141                     }
 142                 }
 143             });
 144 
 145             //                  OPEN FILE WITH EXTENSION
 146             final FileChooser fileOpenWithExtChooser = new FileChooser();
 147             fileOpenWithExtChooser.getExtensionFilters().addAll(extensionFilter);
 148 
 149             final Text fxFileOpenWithExtResText = new Text("no file choosen");
 150             Button fxOpenFileWithExtButton = new Button("Open File with extension FX");
 151             fxOpenFileWithExtButton.setPrefSize(width / 2, height / 2);
 152             fxOpenFileWithExtButton.setOnAction(new EventHandler() {
 153                 public void handle(Event t) {
 154                     try {
 155                         initFileAndTitle(fileOpenWithExtChooser);
 156                         final File file = fileOpenWithExtChooser.showOpenDialog(null);
 157                         fxFileOpenWithExtResText.setText("FX File chooser result is : " + (file != null ? file.getAbsolutePath() : "null"));
 158                     } catch (Throwable ex) {
 159                         indicateError(ex);
 160                     }
 161                 }
 162             });
 163 
 164             //                  OPEN MULTIPLE FILES
 165             final FileChooser fileOpenMultiChooser = new FileChooser();
 166 
 167             final Label fxFileOpenMultiResText = new Label("no file choosen");
 168             fxFileOpenMultiResText.setWrapText(true);
 169             Button fxOpenMultiFileButton = new Button("Open Multiple Files FX");
 170             fxOpenMultiFileButton.setPrefSize(width / 2, height / 2);
 171             fxOpenMultiFileButton.setOnAction(new EventHandler() {
 172                 public void handle(Event t) {
 173                     try {
 174                         initFileAndTitle(fileOpenMultiChooser);
 175                         final List<File> files = fileOpenMultiChooser.showOpenMultipleDialog(null);
 176                         StringBuilder builder = new StringBuilder("FX File chooser result : ");
 177                         if (files != null) {
 178                             for (File file : files) {
 179                                 builder.append(file != null ? file.getAbsolutePath() : "null").append("; ");
 180                             }
 181                         } else {
 182                             builder.append("null");
 183                         }
 184                         fxFileOpenMultiResText.setText(builder.toString());
 185                     } catch (Throwable ex) {
 186                         indicateError(ex);
 187                     }
 188                 }
 189             });
 190 
 191             //                  OPEN MULTIPLE FILES WITH EXTENSIONS
 192             final FileChooser fileOpenMultiWithExtChooser = new FileChooser();
 193             fileOpenMultiWithExtChooser.getExtensionFilters().addAll(extensionFilter);
 194 
 195             final Label fxFileOpenMultiWithExtResText = new Label("no file choosen");
 196             fxFileOpenMultiWithExtResText.setWrapText(true);
 197             Button fxOpenMultiWithExtFileButton = new Button("Open Multiple Files With extensions FX");
 198             fxOpenMultiWithExtFileButton.setPrefSize(width / 2, height / 2);
 199             fxOpenMultiWithExtFileButton.setOnAction(new EventHandler() {
 200                 public void handle(Event t) {
 201                     try {
 202                         initFileAndTitle(fileOpenMultiWithExtChooser);
 203                         final List<File> files = fileOpenMultiWithExtChooser.showOpenMultipleDialog(null);
 204                         StringBuilder builder = new StringBuilder("FX File chooser result : ");
 205                         if (files != null) {
 206                             for (File file : files) {
 207                                 builder.append(file != null ? file.getAbsolutePath() : "null").append("; ");
 208                             }
 209                         } else {
 210                             builder.append("null");
 211                         }
 212                         fxFileOpenMultiWithExtResText.setText(builder.toString());
 213                     } catch (Throwable ex) {
 214                         indicateError(ex);
 215                     }
 216                 }
 217             });
 218 
 219             GridPane root = new GridPane();
 220 
 221             root.add(new Label("Initial file name : "), 0, 0);
 222             root.add(initialFileNameTextField, 1, 0);
 223 
 224             root.add(new Label("Title : "), 0, 1);
 225             root.add(titleTextField, 1, 1);
 226 
 227             root.add(fxOpenDirButton, 0, 2);
 228             root.add(fxSaveFileButton, 0, 3);
 229             root.add(fxSaveFileWithExtButton, 0, 4);
 230             root.add(fxOpenFileButton, 0, 5);
 231             root.add(fxOpenFileWithExtButton, 0, 6);
 232             root.add(fxOpenMultiFileButton, 0, 7);
 233             root.add(fxOpenMultiWithExtFileButton, 0, 8);
 234 
 235             root.add(fxDirOpenResText, 1, 2);
 236             root.add(fxFileSaveResText, 1, 3);
 237             root.add(fxFileSaveWithExtResText, 1, 4);
 238             root.add(fxFileOpenResText, 1, 5);
 239             root.add(fxFileOpenWithExtResText, 1, 6);
 240             root.add(fxFileOpenMultiResText, 1, 7);
 241             root.add(fxFileOpenMultiWithExtResText, 1, 8);
 242 
 243             root.add(errorText, 0, 9);
 244 
 245             Scene scene = new Scene(root, width, height);
 246             stage.setScene(scene);
 247             stage.setTitle("FXChooser");
 248             stage.show();
 249         } catch (Throwable ex) {
 250             indicateError(ex);
 251         }
 252     }
 253 
 254     private void indicateError(Throwable ex) {
 255         errorText.setText("Error has happened. See log.");
 256         ex.printStackTrace(System.err);
 257         errorText.setTooltip(new Tooltip(ex.getMessage() + "\n"));
 258         for (StackTraceElement element : ex.getStackTrace()) {
 259             errorText.getTooltip().setText(errorText.getTooltip().getText() + element.toString() + "\n");
 260         }
 261     }
 262 
 263     private void initFileAndTitle(FileChooser fc) {
 264         if (!titleTextField.getText().equals("")) {
 265             fc.setTitle(titleTextField.getText());
 266         }
 267         if (!initialFileNameTextField.getText().equals("")) {
 268             fc.setInitialFileName(initialFileNameTextField.getText());
 269         }
 270     }
 271 
 272     private void initTitle(DirectoryChooser dc) {
 273         if (!titleTextField.getText().equals("")) {
 274             dc.setTitle(titleTextField.getText());
 275         }
 276     }
 277 
 278     public static void main(String[] args) {
 279         Utils.launch(FXChooser.class, args);
 280     }
 281 }