You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/01/08 17:31:40 UTC

[1/3] incubator-ignite git commit: # IGNITE-32 WIP: Added buttons for fields reordering. Minor UI tweaks.

Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-32 8626532d7 -> 2238d6fd4


# IGNITE-32 WIP: Added buttons for fields reordering. Minor UI tweaks.


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/d4ba030c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/d4ba030c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/d4ba030c

Branch: refs/heads/ignite-32
Commit: d4ba030c7e1a46a9c11c5c01cc51c502a021cf33
Parents: 8626532
Author: AKuznetsov <ak...@gridgain.com>
Authored: Thu Jan 8 21:55:40 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Thu Jan 8 21:55:40 2015 +0700

----------------------------------------------------------------------
 .../src/main/java/media/navigate_down_24x24.png | Bin 0 -> 861 bytes
 .../src/main/java/media/navigate_up_24x24.png   | Bin 0 -> 852 bytes
 .../schema-load/src/main/java/media/style.css   |   4 ++
 .../org/apache/ignite/schema/ui/Controls.java   |  42 ++++++++++-
 .../org/apache/ignite/schema/ui/MessageBox.java |   8 ++-
 .../apache/ignite/schema/ui/NamingDialog.java   |  10 ++-
 .../apache/ignite/schema/ui/SchemaLoadApp.java  |  69 ++++++++++++++++---
 7 files changed, 117 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d4ba030c/modules/schema-load/src/main/java/media/navigate_down_24x24.png
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/media/navigate_down_24x24.png b/modules/schema-load/src/main/java/media/navigate_down_24x24.png
new file mode 100644
index 0000000..a06dc3b
Binary files /dev/null and b/modules/schema-load/src/main/java/media/navigate_down_24x24.png differ

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d4ba030c/modules/schema-load/src/main/java/media/navigate_up_24x24.png
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/media/navigate_up_24x24.png b/modules/schema-load/src/main/java/media/navigate_up_24x24.png
new file mode 100644
index 0000000..e2fad4c
Binary files /dev/null and b/modules/schema-load/src/main/java/media/navigate_up_24x24.png differ

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d4ba030c/modules/schema-load/src/main/java/media/style.css
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/media/style.css b/modules/schema-load/src/main/java/media/style.css
index 42a7d29..99f3d68 100644
--- a/modules/schema-load/src/main/java/media/style.css
+++ b/modules/schema-load/src/main/java/media/style.css
@@ -47,6 +47,10 @@
     -fx-progress-color: gray
 }
 
+.split-pane {
+    -fx-background-color: -fx-box-border, eeeeee;
+}
+
 #banner {
    -fx-font-size: 20px;
    -fx-font-weight: bold;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d4ba030c/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
index e785a11..061ffa1 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
@@ -117,7 +117,29 @@ public class Controls {
     }
 
     /**
-     * Create button.
+     * Create border pane.
+     *
+     * @param top Optional top control.
+     * @param center Optional center control.
+     * @param bottom  Optional bottom control.
+     * @param left  Optional left control.
+     * @param right  Optional right control.
+     * @return New {@code BorderPane} instance.
+     */
+    public static BorderPane borderPane(Node top, Node center, Node bottom, Node left, Node right) {
+        BorderPane bp = new BorderPane();
+
+        bp.setTop(top);
+        bp.setCenter(center);
+        bp.setBottom(bottom);
+        bp.setLeft(left);
+        bp.setRight(right);
+
+        return bp;
+    }
+
+    /**
+     * Create button with text only.
      *
      * @param text Button text.
      * @param onAct Button action.
@@ -132,6 +154,24 @@ public class Controls {
     }
 
     /**
+     * Create button with icon only.
+     *
+     * @param icon Button icon.
+     * @param tip Tooltip text.
+     * @param onAct Button action.
+     * @return New {@code Button} instance.
+     */
+    public static Button button(ImageView icon, String tip, EventHandler<ActionEvent> onAct) {
+        Button btn = new Button();
+
+        btn.setGraphic(icon);
+        btn.setOnAction(onAct);
+        btn.setTooltip(new Tooltip(tip));
+
+        return btn;
+    }
+
+    /**
      * Create pane with buttons.
      *
      * @param btns Buttons that will be added to pane.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d4ba030c/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
index 7696036..cc14783 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
@@ -32,6 +32,9 @@ public class MessageBox extends Stage {
     /** Return value if CANCEL is chosen. */
     public static final int CANCEL_OPTION = 2;
 
+    /** Owner window. */
+    private final Stage owner;
+
     /** Dialog result. */
     private int res = CANCEL_OPTION;
 
@@ -43,6 +46,8 @@ public class MessageBox extends Stage {
      * @param msg Message to show.
      */
     private MessageBox(Stage owner, MessageType type, String msg) {
+        this.owner = owner;
+
         String title;
         String iconFile;
 
@@ -110,7 +115,8 @@ public class MessageBox extends Stage {
     public void showDialog() {
         sizeToScene();
 
-        centerOnScreen();
+        setX(owner.getX() + owner.getWidth() / 8);
+        setY(owner.getY() + owner.getHeight() / 4);
 
         showAndWait();
     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d4ba030c/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
index 5434a4e..7b70820 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
@@ -12,12 +12,17 @@ import static org.apache.ignite.schema.ui.Controls.*;
  * Dialog with naming custom options.
  */
 public class NamingDialog extends Stage {
+    /** Owner window. */
+    private final Stage owner;
+
     /**
      * Create naming dialog.
      *
      * @param owner Owner window.
      */
     public NamingDialog(Stage owner) {
+        this.owner = owner;
+
         setTitle("Custom Naming");
         initStyle(StageStyle.UTILITY);
         initModality(Modality.APPLICATION_MODAL);
@@ -26,8 +31,6 @@ public class NamingDialog extends Stage {
 
         GridPaneEx pane = paneEx();
 
-        pane.setGridLinesVisible(true);
-
         pane.addColumn();
         pane.addColumn(200, 200, Double.MAX_VALUE, Priority.ALWAYS);
 
@@ -55,7 +58,8 @@ public class NamingDialog extends Stage {
     public void showDialog() {
         sizeToScene();
 
-        centerOnScreen();
+        setX(owner.getX() + owner.getWidth() / 6);
+        setY(owner.getY() + owner.getHeight() / 4);
 
         showAndWait();
     }}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d4ba030c/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
index f6518f5..5ae7e8e 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
@@ -510,7 +510,7 @@ public class SchemaLoadApp extends Application {
     /**
      * Create connection pane with controls.
      */
-    private void createConnectionPane() {
+    private Pane createConnectionPane() {
         connPnl = paneEx();
 
         connPnl.addColumn();
@@ -542,6 +542,8 @@ public class SchemaLoadApp extends Application {
         pwdTf = connPnl.addLabeled("Password:", new PasswordField(), 2);
 
         connLayerPnl = stackPane(connPnl);
+
+        return connLayerPnl;
     }
 
     /**
@@ -582,6 +584,51 @@ public class SchemaLoadApp extends Application {
         tbl.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
         tbl.setEditable(true);
 
+        final Button upBtn = button(imageView("navigate_up", 24), "Move selected column up",
+            new EventHandler<ActionEvent>() {
+                @Override public void handle(ActionEvent evt) {
+                    TableView.TableViewSelectionModel<Field> selMdl = tbl.getSelectionModel();
+
+                    int selIdx = selMdl.getSelectedIndex();
+
+                    if (selIdx > 0) {
+                        ObservableList<Field> items = tbl.getItems();
+
+                        items.add(selIdx - 1, items.remove(selIdx));
+
+                        selMdl.select(selIdx - 1);
+                    }
+                }
+            });
+
+        upBtn.setDisable(true);
+
+        final Button downBtn = button(imageView("navigate_down", 24), "Move selected column down",
+            new EventHandler<ActionEvent>() {
+                @Override public void handle(ActionEvent evt) {
+                    TableView.TableViewSelectionModel<Field> selMdl = tbl.getSelectionModel();
+
+                    int selIdx = selMdl.getSelectedIndex();
+
+                    ObservableList<Field> items = tbl.getItems();
+
+                    if (selIdx < items.size() - 1) {
+                        items.add(selIdx + 1, items.remove(selIdx));
+
+                        selMdl.select(selIdx + 1);
+                    }
+                }
+            });
+
+        downBtn.setDisable(true);
+
+        tbl.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
+            @Override public void changed(ObservableValue<? extends Number> observable, Number oldVal, Number newVal) {
+                upBtn.setDisable(newVal == null || newVal.intValue() == 0);
+                downBtn.setDisable(newVal == null || newVal.intValue() == tbl.getItems().size() - 1);
+            }
+        });
+
         rootItem = new CheckBoxTreeItem<>("Database");
         rootItem.setExpanded(true);
 
@@ -595,16 +642,22 @@ public class SchemaLoadApp extends Application {
             /** {@inheritDoc} */
             @Override public void changed(ObservableValue<? extends TreeItem<String>> val, TreeItem<String> oldItem,
                 TreeItem<String> newItem) {
-                if (newItem != null && newItem.getParent() != null && newItem.isLeaf())
+                if (newItem != null && newItem.getParent() != null && newItem.isLeaf()) {
                     tbl.setItems(FXCollections.observableArrayList(
                         fields.get(newItem.getParent().getValue()).get(newItem.getValue())));
-                else
+
+                    tbl.getSelectionModel().select(0);
+                }
+                else {
                     tbl.setItems(noData);
+                    upBtn.setDisable(true);
+                    downBtn.setDisable(true);
+                }
 
             }
         });
 
-        genPnl.add(splitPane(tree, tbl, 0.6), 3);
+        genPnl.add(splitPane(tree, borderPane(null, tbl, null, null, vBox(10, upBtn, downBtn)), 0.6), 3);
 
         pkgTf = genPnl.addLabeled("Package:", textField());
 
@@ -674,17 +727,11 @@ public class SchemaLoadApp extends Application {
             image("ignite", 64),
             image("ignite", 128));
 
-        rootPane = new BorderPane();
-
         pi = progressIndicator(100);
 
-        createConnectionPane();
-
         createGeneratePane();
 
-        rootPane.setTop(createHeaderPane());
-        rootPane.setCenter(connLayerPnl);
-        rootPane.setBottom(createButtonsPane());
+        rootPane = borderPane(createHeaderPane(), createConnectionPane(), createButtonsPane(), null, null);
 
         primaryStage.setScene(scene(rootPane));
 


[3/3] incubator-ignite git commit: # IGNITE-32 WIP: Implemented table fields reordering. Added option to reveal output folder in system file manager. Minor UI tweaks.

Posted by sb...@apache.org.
# IGNITE-32 WIP: Implemented table fields reordering. Added option to reveal output folder in system file manager. Minor UI tweaks.


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/2238d6fd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/2238d6fd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/2238d6fd

Branch: refs/heads/ignite-32
Commit: 2238d6fd4113028109fd41bc45f595cfdd086b2a
Parents: 8103d87
Author: AKuznetsov <ak...@gridgain.com>
Authored: Thu Jan 8 23:31:40 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Thu Jan 8 23:31:40 2015 +0700

----------------------------------------------------------------------
 .../org/apache/ignite/schema/pojo/PojoCodeGenerator.java     | 4 ++--
 .../src/main/java/org/apache/ignite/schema/ui/Controls.java  | 8 ++++----
 .../main/java/org/apache/ignite/schema/ui/MessageBox.java    | 3 +--
 .../main/java/org/apache/ignite/schema/ui/NamingDialog.java  | 3 ++-
 .../main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java | 7 ++++---
 5 files changed, 13 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2238d6fd/modules/schema-load/src/main/java/org/apache/ignite/schema/pojo/PojoCodeGenerator.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/pojo/PojoCodeGenerator.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/pojo/PojoCodeGenerator.java
index e1b20bb..b98b629 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/pojo/PojoCodeGenerator.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/pojo/PojoCodeGenerator.java
@@ -59,7 +59,7 @@ public class PojoCodeGenerator {
     private static void add3(Collection<String> src, String line) {
         src.add(TAB3 + line);
     }
-    
+
     /**
      * Generate java class code.
      *
@@ -123,7 +123,7 @@ public class PojoCodeGenerator {
 
             Iterator<GridCacheQueryTypeDescriptor> it = descs.iterator();
 
-            while(it.hasNext()) {
+            while (it.hasNext()) {
                 GridCacheQueryTypeDescriptor desc = it.next();
 
                 add2(src, desc.getJavaType().getSimpleName() + " " + desc.getJavaName() + (it.hasNext() ? "," : ""));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2238d6fd/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
index 061ffa1..99a60b3 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
@@ -121,9 +121,9 @@ public class Controls {
      *
      * @param top Optional top control.
      * @param center Optional center control.
-     * @param bottom  Optional bottom control.
-     * @param left  Optional left control.
-     * @param right  Optional right control.
+     * @param bottom Optional bottom control.
+     * @param left Optional left control.
+     * @param right Optional right control.
      * @return New {@code BorderPane} instance.
      */
     public static BorderPane borderPane(Node top, Node center, Node bottom, Node left, Node right) {
@@ -177,7 +177,7 @@ public class Controls {
      * @param btns Buttons that will be added to pane.
      * @return New {@code HBox} instance with buttons.
      */
-    public static Pane buttonsPane(Button ... btns) {
+    public static Pane buttonsPane(Button... btns) {
         HBox hb = hBox(10, true, btns);
         hb.setAlignment(Pos.BOTTOM_RIGHT);
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2238d6fd/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
index cc14783..a6789da 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
@@ -168,7 +168,6 @@ public class MessageBox extends Stage {
         showDialog(owner, MessageType.WARN, msg);
     }
 
-
     /**
      * Show error dialog.
      *
@@ -177,6 +176,6 @@ public class MessageBox extends Stage {
      * @param e Optional exception to show.
      */
     public static void errorDialog(Stage owner, String msg, Throwable e) {
-        showDialog(owner, MessageType.ERROR, (e != null && e.getMessage() != null) ? msg + "\n" + e.getMessage()  : msg);
+        showDialog(owner, MessageType.ERROR, (e != null && e.getMessage() != null) ? msg + "\n" + e.getMessage() : msg);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2238d6fd/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
index 7b70820..e4269ee 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
@@ -62,4 +62,5 @@ public class NamingDialog extends Stage {
         setY(owner.getY() + owner.getHeight() / 4);
 
         showAndWait();
-    }}
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2238d6fd/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
index 52ac1cb..5547fdf 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
@@ -244,7 +244,7 @@ public class SchemaLoadApp extends Application {
                 for (Map.Entry<String, Map<String, List<Field>>> schema : fields.entrySet()) {
                     CheckBoxTreeItem<String> schemaItem = new CheckBoxTreeItem<>(schema.getKey());
 
-                    for(String tbl : schema.getValue().keySet())
+                    for (String tbl : schema.getValue().keySet())
                         schemaItem.getChildren().add(new CheckBoxTreeItem<>(tbl));
 
                     rootItem.getChildren().add(schemaItem);
@@ -500,7 +500,7 @@ public class SchemaLoadApp extends Application {
             try {
                 URL u = new URL("jar:" + drvJar.toURI() + "!/");
 
-                URLClassLoader ucl = URLClassLoader.newInstance(new URL[] { u });
+                URLClassLoader ucl = URLClassLoader.newInstance(new URL[] {u});
 
                 drv = (Driver)Class.forName(drvCls, true, ucl).newInstance();
 
@@ -855,7 +855,8 @@ public class SchemaLoadApp extends Application {
 
                 appCls.getDeclaredMethod("setDockIconImage", Image.class)
                     .invoke(osxApp, fromFXImage(image("ignite", 128), null));
-            } catch (Throwable ignore) {
+            }
+            catch (Throwable ignore) {
                 // No-op.
             }
         }


[2/3] incubator-ignite git commit: # IGNITE-32 WIP: Implemented table fields reordering. Added option to reveal output folder in system file manager. Minor UI tweaks.

Posted by sb...@apache.org.
# IGNITE-32 WIP: Implemented table fields reordering. Added option to reveal output folder in system file manager. Minor UI tweaks.


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/8103d876
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/8103d876
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/8103d876

Branch: refs/heads/ignite-32
Commit: 8103d876170027cd5fa38e5ff6a241580f9e1465
Parents: d4ba030
Author: AKuznetsov <ak...@gridgain.com>
Authored: Thu Jan 8 23:29:20 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Thu Jan 8 23:29:20 2015 +0700

----------------------------------------------------------------------
 .../apache/ignite/schema/ui/SchemaLoadApp.java  | 94 +++++++++++++-------
 1 file changed, 61 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8103d876/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
index 5ae7e8e..52ac1cb 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
@@ -9,9 +9,12 @@ import javafx.concurrent.*;
 import javafx.event.*;
 import javafx.geometry.*;
 import javafx.scene.*;
+import javafx.scene.control.Button;
 import javafx.scene.control.*;
+import javafx.scene.control.Label;
+import javafx.scene.control.TextField;
 import javafx.scene.control.cell.*;
-import javafx.scene.image.*;
+import javafx.scene.image.Image;
 import javafx.scene.layout.*;
 import javafx.stage.*;
 import javafx.util.*;
@@ -21,11 +24,12 @@ import org.apache.ignite.schema.xml.*;
 import org.gridgain.grid.cache.query.*;
 import org.gridgain.grid.util.typedef.internal.*;
 
-import java.awt.Toolkit;
+import java.awt.*;
 import java.io.*;
 import java.net.*;
 import java.sql.*;
 import java.util.*;
+import java.util.List;
 import java.util.concurrent.*;
 import java.util.prefs.*;
 
@@ -97,6 +101,9 @@ public class SchemaLoadApp extends Application {
     private CheckBox dfltNamingCh;
 
     /** */
+    private CheckBox openFolderCh;
+
+    /** */
     private Button btnNaming;
 
     /** */
@@ -112,7 +119,10 @@ public class SchemaLoadApp extends Application {
     private LinkedHashMap<String, LinkedHashMap<String, GridCacheQueryTypeMetadata>> metas;
 
     /** Map with fields descriptors. */
-    private Map<String, Map<String, Collection<Field>>> fields;
+    private Map<String, Map<String, List<Field>>> fields;
+
+    /** Fields collection of currently selected table. */
+    private List<Field> curFields;
 
     /** */
     private final ObservableList<Field> noData = FXCollections.emptyObservableList();
@@ -197,7 +207,7 @@ public class SchemaLoadApp extends Application {
 
                     LinkedHashMap<String, GridCacheQueryTypeMetadata> tbls = meta.getValue();
 
-                    Map<String, Collection<Field>> tblsFields = U.newHashMap(tbls.size());
+                    Map<String, List<Field>> tblsFields = U.newHashMap(tbls.size());
 
                     fields.put(schema, tblsFields);
 
@@ -208,7 +218,7 @@ public class SchemaLoadApp extends Application {
 
                         Collection<GridCacheQueryTypeDescriptor> vals = type.getValueDescriptors();
 
-                        Collection<Field> tblFields = new ArrayList<>(keys.size() + vals.size());
+                        List<Field> tblFields = new ArrayList<>(keys.size() + vals.size());
 
                         tblsFields.put(type.getTableName(), tblFields);
 
@@ -231,7 +241,7 @@ public class SchemaLoadApp extends Application {
 
                 rootItem.getChildren().clear();
 
-                for (Map.Entry<String, Map<String, Collection<Field>>> schema : fields.entrySet()) {
+                for (Map.Entry<String, Map<String, List<Field>>> schema : fields.entrySet()) {
                     CheckBoxTreeItem<String> schemaItem = new CheckBoxTreeItem<>(schema.getKey());
 
                     for(String tbl : schema.getValue().keySet())
@@ -277,6 +287,12 @@ public class SchemaLoadApp extends Application {
     private void generate() {
         lockUI(genLayerPnl, genPnl, prevBtn, nextBtn);
 
+        final String outFolder = outFolderTf.getText();
+
+        final String pkg = pkgTf.getText();
+
+        final File destFolder = new File(outFolder);
+
         Task<Void> task = new Task<Void>() {
             private void checkEmpty(Collection<GridCacheQueryTypeDescriptor> items,
                 final TreeItem<String> treeItem, String msg) {
@@ -296,11 +312,6 @@ public class SchemaLoadApp extends Application {
             @Override protected Void call() throws Exception {
                 long started = System.currentTimeMillis();
 
-                String outFolder = outFolderTf.getText();
-                String pkg = pkgTf.getText();
-
-                File destFolder = new File(outFolder);
-
                 if (!destFolder.exists() && !destFolder.mkdirs())
                     throw new IOException("Failed to create output folder: " + destFolder);
 
@@ -375,6 +386,14 @@ public class SchemaLoadApp extends Application {
                 unlockUI(genLayerPnl, genPnl, prevBtn, nextBtn);
 
                 MessageBox.informationDialog(owner, "Generation complete!");
+
+                if (openFolderCh.isSelected())
+                    try {
+                        Desktop.getDesktop().open(destFolder);
+                    }
+                    catch (IOException e) {
+                        MessageBox.errorDialog(owner, "Failed to open folder with results.", e);
+                    }
             }
 
             /** {@inheritDoc} */
@@ -584,7 +603,7 @@ public class SchemaLoadApp extends Application {
         tbl.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
         tbl.setEditable(true);
 
-        final Button upBtn = button(imageView("navigate_up", 24), "Move selected column up",
+        final Button upBtn = button(imageView("navigate_up", 24), "Move selected row up",
             new EventHandler<ActionEvent>() {
                 @Override public void handle(ActionEvent evt) {
                     TableView.TableViewSelectionModel<Field> selMdl = tbl.getSelectionModel();
@@ -595,6 +614,7 @@ public class SchemaLoadApp extends Application {
                         ObservableList<Field> items = tbl.getItems();
 
                         items.add(selIdx - 1, items.remove(selIdx));
+                        curFields.add(selIdx - 1, curFields.remove(selIdx));
 
                         selMdl.select(selIdx - 1);
                     }
@@ -603,7 +623,7 @@ public class SchemaLoadApp extends Application {
 
         upBtn.setDisable(true);
 
-        final Button downBtn = button(imageView("navigate_down", 24), "Move selected column down",
+        final Button downBtn = button(imageView("navigate_down", 24), "Move selected row down",
             new EventHandler<ActionEvent>() {
                 @Override public void handle(ActionEvent evt) {
                     TableView.TableViewSelectionModel<Field> selMdl = tbl.getSelectionModel();
@@ -614,6 +634,7 @@ public class SchemaLoadApp extends Application {
 
                     if (selIdx < items.size() - 1) {
                         items.add(selIdx + 1, items.remove(selIdx));
+                        curFields.add(selIdx + 1, curFields.remove(selIdx));
 
                         selMdl.select(selIdx + 1);
                     }
@@ -630,26 +651,24 @@ public class SchemaLoadApp extends Application {
         });
 
         rootItem = new CheckBoxTreeItem<>("Database");
-        rootItem.setExpanded(true);
 
         tree = new TreeView<>(rootItem);
 
         tree.setShowRoot(false);
-
         tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());
-
         tree.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem<String>>() {
             /** {@inheritDoc} */
             @Override public void changed(ObservableValue<? extends TreeItem<String>> val, TreeItem<String> oldItem,
                 TreeItem<String> newItem) {
                 if (newItem != null && newItem.getParent() != null && newItem.isLeaf()) {
-                    tbl.setItems(FXCollections.observableArrayList(
-                        fields.get(newItem.getParent().getValue()).get(newItem.getValue())));
+                    curFields = fields.get(newItem.getParent().getValue()).get(newItem.getValue());
 
+                    tbl.setItems(FXCollections.observableArrayList(curFields));
                     tbl.getSelectionModel().select(0);
                 }
                 else {
                     tbl.setItems(noData);
+
                     upBtn.setDisable(true);
                     downBtn.setDisable(true);
                 }
@@ -707,6 +726,9 @@ public class SchemaLoadApp extends Application {
 
         genPnl.add(hBox(10, false, dfltNamingCh, btnNaming), 3);
 
+        openFolderCh = genPnl.add(checkBox("Reveal output folder",
+            "Open output folder in system file manager after generation complete", true));
+
         genLayerPnl = stackPane(genPnl);
     }
 
@@ -746,22 +768,26 @@ public class SchemaLoadApp extends Application {
         Preferences userPrefs = Preferences.userNodeForPackage(getClass());
 
         // Restore window pos and size.
-        double x = userPrefs.getDouble("window.x", 100);
-        double y = userPrefs.getDouble("window.y", 100);
-        double w = userPrefs.getDouble("window.width", 500);
-        double h = userPrefs.getDouble("window.height", 600);
-
-        // Ensure that window fit any available screen.
-        if (!Screen.getScreensForRectangle(x, y, w, h).isEmpty()) {
-            if (x > 0)
-                primaryStage.setX(x);
-
-            if (y > 0)
-                primaryStage.setY(y);
-
-            primaryStage.setWidth(w);
-            primaryStage.setHeight(h);
+        if (userPrefs.get("window.x", null) != null) {
+            double x = userPrefs.getDouble("window.x", 100);
+            double y = userPrefs.getDouble("window.y", 100);
+            double w = userPrefs.getDouble("window.width", 500);
+            double h = userPrefs.getDouble("window.height", 600);
+
+            // Ensure that window fit any available screen.
+            if (!Screen.getScreensForRectangle(x, y, w, h).isEmpty()) {
+                if (x > 0)
+                    primaryStage.setX(x);
+
+                if (y > 0)
+                    primaryStage.setY(y);
+
+                primaryStage.setWidth(w);
+                primaryStage.setHeight(h);
+            }
         }
+        else
+            primaryStage.centerOnScreen();
 
         String userHome = System.getProperty("user.home").replace('\\', '/');
 
@@ -773,6 +799,7 @@ public class SchemaLoadApp extends Application {
 
         // Restore generation pane settings.
         outFolderTf.setText(userPrefs.get("out.folder", userHome + "/schema-load/out"));
+        openFolderCh.setSelected(userPrefs.getBoolean("out.folder.open", true));
         pkgTf.setText(userPrefs.get("pojo.package", "org.apache.ignite"));
         pojoIncludeKeysCh.setSelected(userPrefs.getBoolean("pojo.include", true));
         pojoConstructorCh.setSelected(userPrefs.getBoolean("pojo.constructor", false));
@@ -801,6 +828,7 @@ public class SchemaLoadApp extends Application {
 
         // Save generation pane settings.
         userPrefs.put("out.folder", outFolderTf.getText());
+        userPrefs.putBoolean("out.folder.open", openFolderCh.isSelected());
         userPrefs.put("pojo.package", pkgTf.getText());
         userPrefs.putBoolean("pojo.include", pojoIncludeKeysCh.isSelected());
         userPrefs.putBoolean("pojo.constructor", pojoConstructorCh.isSelected());