You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2016/12/06 07:23:05 UTC

[1/3] cayenne git commit: New welcome screen design

Repository: cayenne
Updated Branches:
  refs/heads/master 263ac1c9e -> 77c59c75e


New welcome screen design


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/77c59c75
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/77c59c75
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/77c59c75

Branch: refs/heads/master
Commit: 77c59c75e018715bbc7594a71e3dc22b936d978e
Parents: 32399f9
Author: Nikita Timofeev <st...@gmail.com>
Authored: Mon Dec 5 11:16:24 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Tue Dec 6 10:22:46 2016 +0300

----------------------------------------------------------------------
 .../modeler/dialog/welcome/WelcomeScreen.java   | 37 +++++++++++++++++---
 .../cayenne/modeler/pref/ComponentGeometry.java | 18 +++++-----
 2 files changed, 42 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/77c59c75/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java
index 21793a6..b9598b7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java
@@ -19,7 +19,12 @@
 
 package org.apache.cayenne.modeler.dialog.welcome;
 
+import java.awt.Color;
+import java.awt.GradientPaint;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
 import java.awt.GridBagLayout;
+import java.awt.Paint;
 import java.awt.event.ActionEvent;
 import java.io.File;
 import java.util.List;
@@ -30,6 +35,7 @@ import javax.swing.ImageIcon;
 import javax.swing.JButton;
 import javax.swing.JList;
 import javax.swing.JPanel;
+import javax.swing.JScrollPane;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ModelerPreferences;
@@ -43,7 +49,17 @@ import org.apache.cayenne.modeler.util.ModelerUtil;
  * Welcome screen (CAY-894) is a panel shown when no project is open. User can quickly
  * create new project or open an existing one.
  */
-public class WelcomeScreen extends JPanel implements RecentFileListListener, RecentFileListRenderer.OnFileClickListener {
+public class WelcomeScreen extends JScrollPane implements RecentFileListListener, RecentFileListRenderer.OnFileClickListener {
+
+    /**
+     * Top color of gradient background
+     */
+    private static final Color TOP_GRADIENT = new Color(153, 153, 153);
+
+    /**
+     * Bottom color of gradient background
+     */
+    private static final Color BOTTOM_GRADIENT = new Color(230, 230, 230);
 
     /**
      * List of recent projects
@@ -52,6 +68,8 @@ public class WelcomeScreen extends JPanel implements RecentFileListListener, Rec
 
     private JPanel buttonsPanel;
 
+    private JPanel mainPanel;
+
     public WelcomeScreen() {
         initView();
     }
@@ -60,9 +78,20 @@ public class WelcomeScreen extends JPanel implements RecentFileListListener, Rec
      * Creates all necessary components
      */
     protected void initView() {
-        setLayout(new GridBagLayout());
+        mainPanel = new JPanel(new GridBagLayout()) {
+            @Override
+            public void paintComponent(Graphics g) {
+                // paint gradient background
+                Graphics2D g2 = (Graphics2D) g.create();
+                Paint paint = new GradientPaint(0, 0, TOP_GRADIENT, 0, getHeight(), BOTTOM_GRADIENT);
+                g2.setPaint(paint);
+                g2.fillRect(0, 0, getWidth(), getHeight());
+                g2.dispose();
+            }
+        };
         initButtonsPane();
         initFileListPane();
+        setViewportView(mainPanel);
     }
 
     private void initFileListPane() {
@@ -79,7 +108,7 @@ public class WelcomeScreen extends JPanel implements RecentFileListListener, Rec
         recentProjectsList.setCellRenderer(new RecentFileListRenderer(recentProjectsList, this));
 
         fileListPanel.add(recentProjectsList);
-        add(fileListPanel);
+        mainPanel.add(fileListPanel);
     }
 
     private void initButtonsPane() {
@@ -92,7 +121,7 @@ public class WelcomeScreen extends JPanel implements RecentFileListListener, Rec
         initButton("open", openButtonY, OpenProjectAction.class);
         initButton("new", newButtonY, NewProjectAction.class);
 
-        add(buttonsPanel);
+        mainPanel.add(buttonsPanel);
     }
 
     private void initButton(String name, int y,  Class<? extends Action> actionClass) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/77c59c75/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ComponentGeometry.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ComponentGeometry.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ComponentGeometry.java
index 0f24f16..78b1b5a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ComponentGeometry.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ComponentGeometry.java
@@ -67,14 +67,14 @@ public class ComponentGeometry extends CayennePreference {
 
             @Override
             public void componentResized(ComponentEvent e) {
-                setWidth(new Integer(window.getWidth()));
-                setHeight(new Integer(window.getHeight()));
+                setWidth(window.getWidth());
+                setHeight(window.getHeight());
             }
 
             @Override
             public void componentMoved(ComponentEvent e) {
-                setX(new Integer(window.getX()));
-                setY(new Integer(window.getY()));
+                setX(window.getX());
+                setY(window.getY());
             }
         });
     }
@@ -90,8 +90,8 @@ public class ComponentGeometry extends CayennePreference {
 
             @Override
             public void componentResized(ComponentEvent e) {
-                setWidth(new Integer(window.getWidth()));
-                setHeight(new Integer(window.getHeight()));
+                setWidth(window.getWidth());
+                setHeight(window.getHeight());
             }
         });
     }
@@ -119,7 +119,7 @@ public class ComponentGeometry extends CayennePreference {
     void updateIntProperty(Component c, String property, int defaultValue) {
         int i = getPreference().getInt(property, defaultValue);
         try {
-            PropertyUtils.setProperty(c, property, new Integer(i));
+            PropertyUtils.setProperty(c, property, i);
         }
         catch (Throwable th) {
             throw new PreferenceException("Error setting property: " + property, th);
@@ -153,13 +153,13 @@ public class ComponentGeometry extends CayennePreference {
 
     public void changeX(int xOffset) {
         if (xOffset != 0) {
-            setX(new Integer(getX(0) + xOffset));
+            setX(getX(0) + xOffset);
         }
     }
 
     public void changeY(int yOffset) {
         if (yOffset != 0) {
-            setY(new Integer(getY(0) + yOffset));
+            setY(getY(0) + yOffset);
         }
     }
 


[3/3] cayenne git commit: New welcome screen design

Posted by aa...@apache.org.
New welcome screen design


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/0ce3fdfd
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/0ce3fdfd
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/0ce3fdfd

Branch: refs/heads/master
Commit: 0ce3fdfd8255166352550fa423f847f0e45a7953
Parents: 263ac1c
Author: Nikita Timofeev <st...@gmail.com>
Authored: Fri Dec 2 18:02:58 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Tue Dec 6 10:22:46 2016 +0300

----------------------------------------------------------------------
 .../cayenne/modeler/CayenneModelerFrame.java    |   1 +
 .../apache/cayenne/modeler/WelcomeScreen.java   | 335 -------------------
 .../dialog/welcome/RecentFileListModel.java     |  56 ++++
 .../dialog/welcome/RecentFileListRenderer.java  | 142 ++++++++
 .../modeler/dialog/welcome/WelcomeScreen.java   | 184 ++++++++++
 .../modeler/util/path/CompoundPathTrimmer.java  |  47 +++
 .../modeler/util/path/DefaultPathTrimmer.java   |  31 ++
 .../util/path/DefaultResourceTrimmer.java       |  40 +++
 .../modeler/util/path/HomePathTrimmer.java      |  38 +++
 .../modeler/util/path/LongPathTrimmer.java      |  66 ++++
 .../modeler/util/path/MaxLengthTrimmer.java     |  41 +++
 .../cayenne/modeler/util/path/PathTrimmer.java  |  26 ++
 .../modeler/images/icon-welcome-new-over.png    | Bin 5299 -> 0 bytes
 .../cayenne/modeler/images/icon-welcome-new.png | Bin 4645 -> 0 bytes
 .../modeler/images/icon-welcome-open-over.png   | Bin 5611 -> 0 bytes
 .../modeler/images/icon-welcome-open.png        | Bin 4687 -> 0 bytes
 .../apache/cayenne/modeler/images/welcome.jpg   | Bin 55857 -> 0 bytes
 .../images/welcome/welcome-screen-left-bg.jpg   | Bin 0 -> 25184 bytes
 .../welcome/welcome-screen-new-btn-hover.png    | Bin 0 -> 20156 bytes
 .../images/welcome/welcome-screen-new-btn.png   | Bin 0 -> 19556 bytes
 .../welcome/welcome-screen-open-btn-hover.png   | Bin 0 -> 20202 bytes
 .../images/welcome/welcome-screen-open-btn.png  | Bin 0 -> 19609 bytes
 .../images/welcome/welcome-screen-right-bg.jpg  | Bin 0 -> 29888 bytes
 23 files changed, 672 insertions(+), 335 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
index 0b78d9e..8a23ed9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
@@ -83,6 +83,7 @@ import org.apache.cayenne.modeler.action.ShowLogConsoleAction;
 import org.apache.cayenne.modeler.action.UndoAction;
 import org.apache.cayenne.modeler.action.ValidateAction;
 import org.apache.cayenne.modeler.dialog.LogConsole;
+import org.apache.cayenne.modeler.dialog.welcome.WelcomeScreen;
 import org.apache.cayenne.modeler.editor.EditorView;
 import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
 import org.apache.cayenne.modeler.event.DataMapDisplayListener;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/WelcomeScreen.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/WelcomeScreen.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/WelcomeScreen.java
deleted file mode 100644
index 466722d..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/WelcomeScreen.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.GradientPaint;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.MouseEvent;
-import java.io.File;
-import java.util.List;
-
-import javax.swing.AbstractListModel;
-import javax.swing.DefaultListCellRenderer;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JPanel;
-import javax.swing.SwingConstants;
-import javax.swing.SwingUtilities;
-import javax.swing.event.MouseInputListener;
-
-import org.apache.cayenne.modeler.action.NewProjectAction;
-import org.apache.cayenne.modeler.action.OpenProjectAction;
-import org.apache.cayenne.modeler.event.RecentFileListListener;
-import org.apache.cayenne.modeler.util.ModelerUtil;
-
-/**
- * Welcome screen (CAY-894) is a panel shown when no project is open. User can quickly
- * create new project or open an existing one.
- */
-public class WelcomeScreen extends JPanel implements RecentFileListListener {
-
-    /**
-     * Top color of gradient background
-     */
-    private static final Color TOP_GRADIENT = new Color(153, 153, 153);
-
-    /**
-     * Bottom color of gradient background
-     */
-    private static final Color BOTTOM_GRADIENT = new Color(230, 230, 230);
-
-    /**
-     * List of recent projects
-     */
-    private JList recentsList;
-
-    public WelcomeScreen() {
-        initView();
-    }
-
-    /**
-     * Creates all neccesary components
-     */
-    protected void initView() {
-        setLayout(new GridBagLayout());
-
-        ImageIcon welcome = ModelerUtil.buildIcon("welcome.jpg");
-        JLabel imageLabel = new JLabel(welcome);
-
-        ImageIcon newOutIcon = ModelerUtil.buildIcon("icon-welcome-new.png");
-        ImageIcon newOverIcon = ModelerUtil.buildIcon("icon-welcome-new-over.png");
-        ImageIcon openOutIcon = ModelerUtil.buildIcon("icon-welcome-open.png");
-        ImageIcon openOverIcon = ModelerUtil.buildIcon("icon-welcome-open-over.png");
-
-        JPanel buttonsPane = new JPanel(null);
-        buttonsPane.setPreferredSize(new Dimension(300, 30));
-
-        buttonsPane.setOpaque(false);
-
-        JButton newButton = createButton(newOutIcon, newOverIcon);
-        newButton.addActionListener(Application
-                .getInstance()
-                .getActionManager()
-                .getAction(NewProjectAction.class));
-
-        JLabel newLabel = new JLabel(
-                NewProjectAction.getActionName(),
-                SwingConstants.CENTER);
-
-        JButton openButton = createButton(openOutIcon, openOverIcon);
-        openButton.addActionListener(Application
-                .getInstance()
-                .getActionManager()
-                .getAction(OpenProjectAction.class));
-
-        JLabel openLabel = new JLabel(
-                OpenProjectAction.getActionName(),
-                SwingConstants.CENTER);
-
-        imageLabel.setLayout(new BorderLayout());
-
-        newButton.setLocation(10, 130);
-        buttonsPane.add(newButton);
-
-        newLabel.setLocation(newButton.getX()
-                + newButton.getWidth()
-                / 2
-                - newLabel.getPreferredSize().width
-                / 2, newButton.getY() + newButton.getHeight());
-        newLabel.setSize(newLabel.getPreferredSize());
-        buttonsPane.add(newLabel);
-
-        openButton.setLocation(120, newButton.getY());
-        buttonsPane.add(openButton);
-
-        openLabel.setLocation(openButton.getX()
-                + openButton.getWidth()
-                / 2
-                - openLabel.getPreferredSize().width
-                / 2, openButton.getY() + openButton.getHeight());
-        openLabel.setSize(openLabel.getPreferredSize());
-        buttonsPane.add(openLabel);
-
-        JLabel recents = new JLabel("Recent Projects:");
-        recents.setLocation(207, newButton.getY());
-        recents.setSize(recents.getPreferredSize());
-        recents.setHorizontalTextPosition(10);
-
-        buttonsPane.add(recents);
-
-        recentsList = new JList();
-        recentsList.setOpaque(false);
-
-        recentsList.setLocation(recents.getX(), recents.getY() + 2 * recents.getHeight());
-        recentsList.setSize(welcome.getIconWidth() - recentsList.getX() - 1, welcome
-                .getIconHeight()
-                - recentsList.getY());
-
-        recentsList.setCellRenderer(new RecentFileListRenderer(recentsList));
-
-        buttonsPane.add(recentsList);
-
-        imageLabel.add(buttonsPane);
-
-        add(imageLabel);
-    }
-
-    /**
-     * Creates welcome screen-specific button
-     */
-    private JButton createButton(Icon outIcon, Icon overIcon) {
-        JButton button = new JButton();
-
-        button.setFocusPainted(false);
-        button.setFocusable(false);
-        button.setBorderPainted(false);
-        button.setOpaque(false);
-        button.setContentAreaFilled(false);
-
-        button.setPressedIcon(overIcon);
-        button.setRolloverIcon(overIcon);
-        button.setIcon(outIcon);
-
-        button.setSize(outIcon.getIconWidth(), outIcon.getIconHeight());
-
-        return button;
-    }
-
-    /**
-     * Paints gradient background
-     */
-    @Override
-    public void paintComponent(Graphics g) {
-        Graphics2D g2 = (Graphics2D) g.create();
-        g2
-                .setPaint(new GradientPaint(
-                        0,
-                        0,
-                        TOP_GRADIENT,
-                        0,
-                        getHeight(),
-                        BOTTOM_GRADIENT));
-        g2.fillRect(0, 0, getWidth(), getHeight());
-
-        g2.dispose();
-    }
-
-    public void recentFileListChanged() {
-
-        final List<String> arr = ModelerPreferences.getLastProjFiles();
-
-        recentsList.setModel(new AbstractListModel() {
-
-            public int getSize() {
-                return arr.size();
-            }
-
-            public Object getElementAt(int i) {
-                return arr.get(i);
-            }
-        });
-    }
-
-    /**
-     * Renderer for the list of last files. Ignores the selection, instead paints with
-     * ROLLOVER_BACKGROUND (currently red) the row mouse is hovering over
-     */
-    class RecentFileListRenderer extends DefaultListCellRenderer implements
-            MouseInputListener {
-
-        /**
-         * Color for background of row mouse is over
-         */
-        final Color ROLLOVER_BACKGROUND = Color.RED;
-
-        /**
-         * Color for foreground of row mouse is over
-         */
-        final Color ROLLOVER_FOREGROUND = Color.WHITE;
-
-        /**
-         * List which is rendered
-         */
-        private final JList list;
-
-        /**
-         * Row mouse is over
-         */
-        private int rolloverRow;
-
-        public RecentFileListRenderer(JList list) {
-            list.addMouseListener(this);
-            list.addMouseMotionListener(this);
-
-            this.list = list;
-            rolloverRow = -1;
-
-            setHorizontalTextPosition(SwingConstants.LEADING);
-        }
-
-        @Override
-        public Component getListCellRendererComponent(
-                JList list,
-                Object value,
-                int index,
-                boolean isSelected,
-                boolean cellHasFocus) {
-            // selection is ignored
-            super.getListCellRendererComponent(list, value, index, false, false);
-
-            if (rolloverRow == index) {
-                setOpaque(true);
-                setForeground(ROLLOVER_FOREGROUND);
-                setBackground(ROLLOVER_BACKGROUND);
-                setToolTipText(getText());
-            }
-            else {
-                setOpaque(false);
-            }
-
-            return this;
-        }
-
-        public void mouseClicked(MouseEvent e) {
-        }
-
-        public void mouseEntered(MouseEvent e) {
-            mouseMoved(e);
-        }
-
-        public void mouseExited(MouseEvent e) {
-            rolloverRow = -1;
-            list.repaint();
-        }
-
-        public void mousePressed(MouseEvent e) {
-        }
-
-        public void mouseReleased(MouseEvent e) {
-            if (SwingUtilities.isLeftMouseButton(e) && rolloverRow != -1) {
-                File file = new File((String) list.getModel().getElementAt(rolloverRow));
-
-                /**
-                 * Fire an action with the file as source
-                 */
-                Application.getInstance().getActionManager().getAction(
-                        OpenProjectAction.class).performAction(
-                        new ActionEvent(file, 0, null));
-
-                rolloverRow = -1; // clear selection
-            }
-        }
-
-        public void mouseDragged(MouseEvent e) {
-        }
-
-        public void mouseMoved(MouseEvent e) {
-            int newRow;
-
-            /**
-             * Check that a row boundary contains the mouse point, so that rolloverRow
-             * would be -1 if we are below last row
-             */
-            if (list.getModel().getSize() > 0
-                    && !list.getCellBounds(0, list.getModel().getSize() - 1).contains(
-                            e.getPoint())) {
-                newRow = -1;
-            }
-            else {
-                newRow = list.locationToIndex(e.getPoint());
-            }
-
-            if (rolloverRow != newRow) {
-                rolloverRow = newRow;
-                list.repaint();
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/RecentFileListModel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/RecentFileListModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/RecentFileListModel.java
new file mode 100644
index 0000000..dc68259
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/RecentFileListModel.java
@@ -0,0 +1,56 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.dialog.welcome;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.AbstractListModel;
+
+import org.apache.cayenne.modeler.util.path.DefaultPathTrimmer;
+import org.apache.cayenne.modeler.util.path.PathTrimmer;
+
+class RecentFileListModel extends AbstractListModel<String> {
+
+    private List<String> fileListFull;
+    private List<String> fileList;
+    private static PathTrimmer pathTrimmer = new DefaultPathTrimmer();
+
+    RecentFileListModel(List<String> fileList) {
+        this.fileListFull = fileList;
+        this.fileList = new ArrayList<>(fileList.size());
+        for(String next : fileList) {
+            this.fileList.add(pathTrimmer.trim(next));
+        }
+    }
+
+    @Override
+    public int getSize() {
+        return fileList.size();
+    }
+
+    @Override
+    public String getElementAt(int index) {
+        return fileList.get(index);
+    }
+
+    String getFullElementAt(int index) {
+        return fileListFull.get(index);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/RecentFileListRenderer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/RecentFileListRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/RecentFileListRenderer.java
new file mode 100644
index 0000000..9b6e1a1
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/RecentFileListRenderer.java
@@ -0,0 +1,142 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.dialog.welcome;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.JList;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.MouseInputListener;
+
+/**
+ * Renderer for the list of last files. Ignores the selection, instead paints with
+ * ROLLOVER_BACKGROUND (currently red) the row mouse is hovering over
+ */
+class RecentFileListRenderer extends DefaultListCellRenderer implements MouseInputListener {
+
+    interface OnFileClickListener {
+        void onFileSelect(String fileName);
+    }
+
+    /**
+     * Color for background of row mouse is over
+     */
+    private final Color ROLLOVER_BACKGROUND = new Color(223, 223, 223);
+
+    /**
+     * List which is rendered
+     */
+    private final JList<String> list;
+
+    /**
+     * Row mouse is over
+     */
+    private int rolloverRow;
+
+    private OnFileClickListener listener;
+
+    RecentFileListRenderer(JList<String> list, OnFileClickListener listener) {
+        if(listener == null) {
+            throw new NullPointerException("listener parameter is null");
+        }
+        list.addMouseListener(this);
+        list.addMouseMotionListener(this);
+
+        this.list = list;
+        this.listener = listener;
+        rolloverRow = -1;
+
+        setHorizontalTextPosition(SwingConstants.LEADING);
+    }
+
+    @Override
+    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+        super.getListCellRendererComponent(list, value, index, false, false);
+        setMargin(8, 15, 8, 15);
+        if (rolloverRow == index) {
+            setOpaque(true);
+            setBackground(ROLLOVER_BACKGROUND);
+            setToolTipText(getFullText());
+        } else {
+            setOpaque(false);
+        }
+        return this;
+    }
+
+    public void setMargin(int top, int left, int bottom, int right) {
+        setBorder(new EmptyBorder(top, left, bottom, right));
+    }
+
+    public void mouseClicked(MouseEvent e) {
+    }
+
+    public void mouseEntered(MouseEvent e) {
+        mouseMoved(e);
+    }
+
+    public void mouseExited(MouseEvent e) {
+        rolloverRow = -1;
+        list.repaint();
+    }
+
+    public void mousePressed(MouseEvent e) {
+    }
+
+    private String getFullText() {
+        if(rolloverRow == -1) {
+            return null;
+        }
+        return ((RecentFileListModel)list.getModel()).getFullElementAt(rolloverRow);
+    }
+
+    public void mouseReleased(MouseEvent e) {
+        if (!SwingUtilities.isLeftMouseButton(e) || rolloverRow == -1) {
+            return;
+        }
+        listener.onFileSelect(getFullText());
+        rolloverRow = -1; // clear selection
+    }
+
+    public void mouseDragged(MouseEvent e) {
+    }
+
+    public void mouseMoved(MouseEvent e) {
+        int newRow;
+
+        // Check that a row boundary contains the mouse point, so that rolloverRow
+        // would be -1 if we are below last row
+        Rectangle bounds = list.getCellBounds(0, list.getModel().getSize() - 1);
+        if (list.getModel().getSize() > 0 && !bounds.contains(e.getPoint())) {
+            newRow = -1;
+        } else {
+            newRow = list.locationToIndex(e.getPoint());
+        }
+
+        if (rolloverRow != newRow) {
+            rolloverRow = newRow;
+            list.repaint();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java
new file mode 100644
index 0000000..f51e3d4
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java
@@ -0,0 +1,184 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.dialog.welcome;
+
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.util.List;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JList;
+import javax.swing.JPanel;
+
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ModelerPreferences;
+import org.apache.cayenne.modeler.action.NewProjectAction;
+import org.apache.cayenne.modeler.action.OpenProjectAction;
+import org.apache.cayenne.modeler.event.RecentFileListListener;
+import org.apache.cayenne.modeler.util.ModelerUtil;
+
+/**
+ * Welcome screen (CAY-894) is a panel shown when no project is open. User can quickly
+ * create new project or open an existing one.
+ */
+public class WelcomeScreen extends JPanel implements RecentFileListListener, RecentFileListRenderer.OnFileClickListener {
+
+    /**
+     * List of recent projects
+     */
+    private JList<String> recentsList;
+
+    private JPanel buttonsPane;
+
+    private JPanel fileListPane;
+
+    public WelcomeScreen() {
+        initView();
+    }
+
+    /**
+     * Creates all neccesary components
+     */
+    protected void initView() {
+        setLayout(new GridBagLayout());
+        initButtonsPane();
+        initFileListPane();
+    }
+
+    private void initFileListPane() {
+        final ImageIcon rightPaneImg = ModelerUtil.buildIcon("welcome/welcome-screen-right-bg.jpg");
+        fileListPane = new JPanel(null) {
+            @Override
+            protected void paintComponent(Graphics g) {
+                super.paintComponent(g);
+                g.drawImage(rightPaneImg.getImage(), 0, 0, null);
+            }
+        };
+        fileListPane.setPreferredSize(new Dimension(902, 592));
+        fileListPane.setOpaque(false);
+
+        initRecentList();
+
+        add(fileListPane);
+    }
+
+    private void initButtonsPane() {
+        final ImageIcon leftPaneImg = ModelerUtil.buildIcon("welcome/welcome-screen-left-bg.jpg");
+        buttonsPane = new JPanel(null) {
+            @Override
+            protected void paintComponent(Graphics g) {
+                super.paintComponent(g);
+                g.drawImage(leftPaneImg.getImage(), 0, 0, null);
+            }
+        };
+        buttonsPane.setPreferredSize(new Dimension(198, 592));
+        buttonsPane.setOpaque(false);
+
+        initNewButton();
+        initOpenButton();
+
+        add(buttonsPane);
+    }
+
+
+    private void initNewButton() {
+        ImageIcon newIcon = ModelerUtil.buildIcon("welcome/welcome-screen-new-btn.png");
+        ImageIcon newHoverIcon = ModelerUtil.buildIcon("welcome/welcome-screen-new-btn-hover.png");
+        JButton newButton = createButton(newIcon, newHoverIcon);
+        newButton.setLocation(24, 488);
+        newButton.addActionListener(Application
+                .getInstance()
+                .getActionManager()
+                .getAction(NewProjectAction.class));
+        buttonsPane.add(newButton);
+    }
+
+    private void initOpenButton() {
+        ImageIcon newIcon = ModelerUtil.buildIcon("welcome/welcome-screen-open-btn.png");
+        ImageIcon newHoverIcon = ModelerUtil.buildIcon("welcome/welcome-screen-open-btn-hover.png");
+        JButton openButton = createButton(newIcon, newHoverIcon);
+        openButton.setLocation(24, 532);
+        openButton.addActionListener(Application
+                .getInstance()
+                .getActionManager()
+                .getAction(NewProjectAction.class));
+        buttonsPane.add(openButton);
+    }
+
+    private void initRecentList() {
+        recentsList = new JList<>();
+        recentsList.setOpaque(false);
+        int padding = 20;
+        recentsList.setLocation(padding, padding);
+        recentsList.setSize(902 - 2 * padding, 592 - 2 * padding);
+        Font fontOld = recentsList.getFont();
+        Font font = new Font(fontOld.getFontName(), Font.PLAIN, 12);
+        recentsList.setFont(font);
+//        recentsList.setFixedCellHeight(24);
+        RecentFileListRenderer cellRenderer = new RecentFileListRenderer(recentsList, this);
+        recentsList.setCellRenderer(cellRenderer);
+        fileListPane.add(recentsList);
+    }
+
+    @Override
+    public void onFileSelect(String fileName) {
+        File file = new File(fileName);
+        ActionEvent event = new ActionEvent(file, 0, null);
+        // Fire an action with the file as source
+        Application.getInstance()
+                .getActionManager()
+                .getAction(OpenProjectAction.class)
+                .performAction(event);
+    }
+
+    /**
+     * Creates welcome screen-specific button
+     */
+    private JButton createButton(Icon outIcon, Icon overIcon) {
+        JButton button = new JButton();
+
+        button.setFocusPainted(false);
+        button.setFocusable(false);
+        button.setBorderPainted(false);
+        button.setOpaque(false);
+        button.setContentAreaFilled(false);
+
+        button.setPressedIcon(overIcon);
+        button.setRolloverIcon(overIcon);
+        button.setIcon(outIcon);
+
+        button.setSize(outIcon.getIconWidth(), outIcon.getIconHeight());
+
+        return button;
+    }
+
+    @Override
+    public void recentFileListChanged() {
+        List<String> arr = ModelerPreferences.getLastProjFiles();
+        recentsList.setModel(new RecentFileListModel(arr));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/CompoundPathTrimmer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/CompoundPathTrimmer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/CompoundPathTrimmer.java
new file mode 100644
index 0000000..6bb1bba
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/CompoundPathTrimmer.java
@@ -0,0 +1,47 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util.path;
+
+public class CompoundPathTrimmer implements PathTrimmer {
+
+    protected int maxLength;
+
+    private PathTrimmer[] decorators;
+
+    public CompoundPathTrimmer(int maxLength, PathTrimmer... decorators) {
+        this.maxLength = maxLength;
+        this.decorators = decorators;
+    }
+
+    public CompoundPathTrimmer(PathTrimmer... decorators) {
+        this(DEFAULT_MAX_LENGTH, decorators);
+    }
+
+    @Override
+    public String trim(String path) {
+        for(PathTrimmer decorator : decorators) {
+            path = decorator.trim(path);
+            if(path.length() <= maxLength) {
+                return path;
+            }
+        }
+        return path;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/DefaultPathTrimmer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/DefaultPathTrimmer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/DefaultPathTrimmer.java
new file mode 100644
index 0000000..16df1262
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/DefaultPathTrimmer.java
@@ -0,0 +1,31 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util.path;
+
+public class DefaultPathTrimmer extends CompoundPathTrimmer {
+    public DefaultPathTrimmer() {
+        super(
+                new HomePathTrimmer(),
+//                new DefaultResourceTrimmer(),
+//                new LongPathTrimmer(),
+                new MaxLengthTrimmer(DEFAULT_MAX_LENGTH)
+        );
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/DefaultResourceTrimmer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/DefaultResourceTrimmer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/DefaultResourceTrimmer.java
new file mode 100644
index 0000000..495c891
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/DefaultResourceTrimmer.java
@@ -0,0 +1,40 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util.path;
+
+import java.io.File;
+
+public class DefaultResourceTrimmer implements PathTrimmer {
+
+    private static String DEFAULT_RESOURCE_PATH;
+    private static String DEFAULT_TEST_RESOURCE_PATH;
+    static {
+        String separator = File.separator;
+        DEFAULT_RESOURCE_PATH = "src" + separator + "main" + separator + "resources";
+        DEFAULT_TEST_RESOURCE_PATH = "src" + separator + "test" + separator + "resources";
+    }
+
+    @Override
+    public String trim(String path) {
+        path = path.replace(DEFAULT_TEST_RESOURCE_PATH, "..test..");
+        path = path.replace(DEFAULT_RESOURCE_PATH, "..main..");
+        return path;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/HomePathTrimmer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/HomePathTrimmer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/HomePathTrimmer.java
new file mode 100644
index 0000000..04fb24c
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/HomePathTrimmer.java
@@ -0,0 +1,38 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util.path;
+
+import java.io.File;
+
+public class HomePathTrimmer implements PathTrimmer {
+
+    private static String homeDir = System.getProperty("user.home");
+    private static String replacement = "~";
+    static {
+        if(homeDir.endsWith(File.separator)) {
+            replacement = "~" + File.separator;
+        }
+    }
+
+    @Override
+    public String trim(String path) {
+        return path.replace(homeDir, replacement);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/LongPathTrimmer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/LongPathTrimmer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/LongPathTrimmer.java
new file mode 100644
index 0000000..9d33d52
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/LongPathTrimmer.java
@@ -0,0 +1,66 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util.path;
+
+import java.io.File;
+
+public class LongPathTrimmer implements PathTrimmer {
+
+    private static final String PATH_SEPARATOR = File.separator;
+    private static final int PATH_LENGTH_THRESHOLD = 8;
+
+    private String[] splitPath(String path) {
+        return path.split(PATH_SEPARATOR);
+    }
+
+    private String joinPath(String[] components) {
+        if(components.length == 0) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder(components[0]);
+        for(int i=1; i<components.length; i++) {
+            sb.append(PATH_SEPARATOR);
+            sb.append(components[i]);
+        }
+        return sb.toString();
+    }
+
+    @Override
+    public String trim(String path) {
+        String[] components = splitPath(path);
+        if(components.length <= PATH_LENGTH_THRESHOLD + 1) {
+            return path;
+        }
+        String[] strippedComponents = new String[PATH_LENGTH_THRESHOLD + 1];
+        int half = PATH_LENGTH_THRESHOLD / 2;
+        int end = components.length - half;
+        int idx = 0;
+        boolean trimAdded = false;
+        for(int i=0; i<components.length; i++) {
+            if(i < half || i >= end) {
+                strippedComponents[idx++] = components[i];
+            } else if(!trimAdded) {
+                strippedComponents[idx++] = "...";
+                trimAdded = true;
+            }
+        }
+        return joinPath(strippedComponents);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/MaxLengthTrimmer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/MaxLengthTrimmer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/MaxLengthTrimmer.java
new file mode 100644
index 0000000..e40e0fd
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/MaxLengthTrimmer.java
@@ -0,0 +1,41 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util.path;
+
+public class MaxLengthTrimmer implements PathTrimmer {
+
+    private int maxLength;
+
+    public MaxLengthTrimmer() {
+        this(DEFAULT_MAX_LENGTH);
+    }
+
+    public MaxLengthTrimmer(int maxLength) {
+        this.maxLength = maxLength;
+    }
+
+    @Override
+    public String trim(String path) {
+        if(path.length() <= maxLength) {
+            return path;
+        }
+        return "..." + path.substring(path.length() - maxLength);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/PathTrimmer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/PathTrimmer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/PathTrimmer.java
new file mode 100644
index 0000000..bef6173
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/path/PathTrimmer.java
@@ -0,0 +1,26 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util.path;
+
+public interface PathTrimmer {
+    int DEFAULT_MAX_LENGTH = 120;
+
+    String trim(String path);
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-new-over.png
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-new-over.png b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-new-over.png
deleted file mode 100755
index 35e9011..0000000
Binary files a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-new-over.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-new.png
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-new.png b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-new.png
deleted file mode 100755
index b145ff4..0000000
Binary files a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-new.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-open-over.png
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-open-over.png b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-open-over.png
deleted file mode 100755
index 3324ca4..0000000
Binary files a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-open-over.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-open.png
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-open.png b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-open.png
deleted file mode 100755
index 78761a1..0000000
Binary files a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-welcome-open.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome.jpg
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome.jpg b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome.jpg
deleted file mode 100755
index b95fa72..0000000
Binary files a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-left-bg.jpg
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-left-bg.jpg b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-left-bg.jpg
new file mode 100755
index 0000000..d3f3152
Binary files /dev/null and b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-left-bg.jpg differ

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-new-btn-hover.png
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-new-btn-hover.png b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-new-btn-hover.png
new file mode 100755
index 0000000..f987f62
Binary files /dev/null and b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-new-btn-hover.png differ

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-new-btn.png
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-new-btn.png b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-new-btn.png
new file mode 100755
index 0000000..198afb3
Binary files /dev/null and b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-new-btn.png differ

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-open-btn-hover.png
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-open-btn-hover.png b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-open-btn-hover.png
new file mode 100755
index 0000000..69bf1e9
Binary files /dev/null and b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-open-btn-hover.png differ

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-open-btn.png
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-open-btn.png b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-open-btn.png
new file mode 100755
index 0000000..ab0e967
Binary files /dev/null and b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-open-btn.png differ

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ce3fdfd/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-right-bg.jpg
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-right-bg.jpg b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-right-bg.jpg
new file mode 100755
index 0000000..a0d8402
Binary files /dev/null and b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/welcome/welcome-screen-right-bg.jpg differ


[2/3] cayenne git commit: Modeler new Welcome screen

Posted by aa...@apache.org.
Modeler new Welcome screen


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/32399f9a
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/32399f9a
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/32399f9a

Branch: refs/heads/master
Commit: 32399f9a26ae46e8afcf7ae63fa4613f36578f84
Parents: 0ce3fdf
Author: stariy <st...@gmail.com>
Authored: Fri Dec 2 21:53:44 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Tue Dec 6 10:22:46 2016 +0300

----------------------------------------------------------------------
 .../modeler/CayenneModelerController.java       |   2 +-
 .../modeler/dialog/welcome/WelcomeScreen.java   | 109 ++++++-------------
 .../cayenne/modeler/util/BackgroundPanel.java   |  47 ++++++++
 3 files changed, 84 insertions(+), 74 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/32399f9a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java
index 30fdebc..bda0504 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java
@@ -137,7 +137,7 @@ public class CayenneModelerController extends CayenneController {
         });
 
         ComponentGeometry geometry = new ComponentGeometry(frame.getClass(), null);
-        geometry.bind(frame, 650, 550, 0);
+        geometry.bind(frame, 1200, 720, 0);
     }
 
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/32399f9a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java
index f51e3d4..21793a6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/welcome/WelcomeScreen.java
@@ -19,14 +19,12 @@
 
 package org.apache.cayenne.modeler.dialog.welcome;
 
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.Graphics;
 import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.io.File;
 import java.util.List;
 
+import javax.swing.Action;
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
 import javax.swing.JButton;
@@ -38,6 +36,7 @@ import org.apache.cayenne.modeler.ModelerPreferences;
 import org.apache.cayenne.modeler.action.NewProjectAction;
 import org.apache.cayenne.modeler.action.OpenProjectAction;
 import org.apache.cayenne.modeler.event.RecentFileListListener;
+import org.apache.cayenne.modeler.util.BackgroundPanel;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 
 /**
@@ -49,18 +48,16 @@ public class WelcomeScreen extends JPanel implements RecentFileListListener, Rec
     /**
      * List of recent projects
      */
-    private JList<String> recentsList;
+    private JList<String> recentProjectsList;
 
-    private JPanel buttonsPane;
-
-    private JPanel fileListPane;
+    private JPanel buttonsPanel;
 
     public WelcomeScreen() {
         initView();
     }
 
     /**
-     * Creates all neccesary components
+     * Creates all necessary components
      */
     protected void initView() {
         setLayout(new GridBagLayout());
@@ -69,78 +66,45 @@ public class WelcomeScreen extends JPanel implements RecentFileListListener, Rec
     }
 
     private void initFileListPane() {
-        final ImageIcon rightPaneImg = ModelerUtil.buildIcon("welcome/welcome-screen-right-bg.jpg");
-        fileListPane = new JPanel(null) {
-            @Override
-            protected void paintComponent(Graphics g) {
-                super.paintComponent(g);
-                g.drawImage(rightPaneImg.getImage(), 0, 0, null);
-            }
-        };
-        fileListPane.setPreferredSize(new Dimension(902, 592));
-        fileListPane.setOpaque(false);
-
-        initRecentList();
-
-        add(fileListPane);
+        JPanel fileListPanel = new BackgroundPanel("welcome/welcome-screen-right-bg.jpg");
+
+        final int padding = 20;
+        recentProjectsList = new JList<>();
+        recentProjectsList.setOpaque(false);
+        recentProjectsList.setLocation(padding, padding);
+        recentProjectsList.setSize(
+                fileListPanel.getWidth() - 2 * padding,
+                fileListPanel.getHeight() - 2 * padding
+        );
+        recentProjectsList.setCellRenderer(new RecentFileListRenderer(recentProjectsList, this));
+
+        fileListPanel.add(recentProjectsList);
+        add(fileListPanel);
     }
 
     private void initButtonsPane() {
-        final ImageIcon leftPaneImg = ModelerUtil.buildIcon("welcome/welcome-screen-left-bg.jpg");
-        buttonsPane = new JPanel(null) {
-            @Override
-            protected void paintComponent(Graphics g) {
-                super.paintComponent(g);
-                g.drawImage(leftPaneImg.getImage(), 0, 0, null);
-            }
-        };
-        buttonsPane.setPreferredSize(new Dimension(198, 592));
-        buttonsPane.setOpaque(false);
-
-        initNewButton();
-        initOpenButton();
-
-        add(buttonsPane);
-    }
+        final int padding = 24; // bottom padding for buttons
+        final int buttonHeight = 36;
 
+        buttonsPanel = new BackgroundPanel("welcome/welcome-screen-left-bg.jpg");
+        int openButtonY = buttonsPanel.getHeight() - padding - buttonHeight; // buttons layout from bottom
+        int newButtonY = openButtonY - 10 - buttonHeight; // 10px - space between buttons
+        initButton("open", openButtonY, OpenProjectAction.class);
+        initButton("new", newButtonY, NewProjectAction.class);
 
-    private void initNewButton() {
-        ImageIcon newIcon = ModelerUtil.buildIcon("welcome/welcome-screen-new-btn.png");
-        ImageIcon newHoverIcon = ModelerUtil.buildIcon("welcome/welcome-screen-new-btn-hover.png");
-        JButton newButton = createButton(newIcon, newHoverIcon);
-        newButton.setLocation(24, 488);
-        newButton.addActionListener(Application
-                .getInstance()
-                .getActionManager()
-                .getAction(NewProjectAction.class));
-        buttonsPane.add(newButton);
+        add(buttonsPanel);
     }
 
-    private void initOpenButton() {
-        ImageIcon newIcon = ModelerUtil.buildIcon("welcome/welcome-screen-open-btn.png");
-        ImageIcon newHoverIcon = ModelerUtil.buildIcon("welcome/welcome-screen-open-btn-hover.png");
-        JButton openButton = createButton(newIcon, newHoverIcon);
-        openButton.setLocation(24, 532);
-        openButton.addActionListener(Application
+    private void initButton(String name, int y,  Class<? extends Action> actionClass) {
+        ImageIcon icon = ModelerUtil.buildIcon("welcome/welcome-screen-"+name+"-btn.png");
+        ImageIcon hoverIcon = ModelerUtil.buildIcon("welcome/welcome-screen-"+name+"-btn-hover.png");
+        JButton button = createButton(icon, hoverIcon);
+        button.setLocation(24, y); // 24px - button left & right padding
+        button.addActionListener(Application
                 .getInstance()
                 .getActionManager()
-                .getAction(NewProjectAction.class));
-        buttonsPane.add(openButton);
-    }
-
-    private void initRecentList() {
-        recentsList = new JList<>();
-        recentsList.setOpaque(false);
-        int padding = 20;
-        recentsList.setLocation(padding, padding);
-        recentsList.setSize(902 - 2 * padding, 592 - 2 * padding);
-        Font fontOld = recentsList.getFont();
-        Font font = new Font(fontOld.getFontName(), Font.PLAIN, 12);
-        recentsList.setFont(font);
-//        recentsList.setFixedCellHeight(24);
-        RecentFileListRenderer cellRenderer = new RecentFileListRenderer(recentsList, this);
-        recentsList.setCellRenderer(cellRenderer);
-        fileListPane.add(recentsList);
+                .getAction(actionClass));
+        buttonsPanel.add(button);
     }
 
     @Override
@@ -178,7 +142,6 @@ public class WelcomeScreen extends JPanel implements RecentFileListListener, Rec
     @Override
     public void recentFileListChanged() {
         List<String> arr = ModelerPreferences.getLastProjFiles();
-        recentsList.setModel(new RecentFileListModel(arr));
+        recentProjectsList.setModel(new RecentFileListModel(arr));
     }
-
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/32399f9a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BackgroundPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BackgroundPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BackgroundPanel.java
new file mode 100644
index 0000000..fe14b84
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BackgroundPanel.java
@@ -0,0 +1,47 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util;
+
+import javax.swing.ImageIcon;
+import javax.swing.JPanel;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Image;
+
+public class BackgroundPanel extends JPanel {
+
+    private Image backgroundImage;
+
+    public BackgroundPanel(String imagePath) {
+        super(null);
+        ImageIcon imageIcon = ModelerUtil.buildIcon(imagePath);
+        backgroundImage = imageIcon.getImage();
+        Dimension dimension = new Dimension(imageIcon.getIconWidth(), imageIcon.getIconHeight());
+        setSize(dimension);
+        setPreferredSize(dimension);
+        setOpaque(false);
+    }
+
+    @Override
+    protected void paintComponent(Graphics g) {
+        super.paintComponent(g);
+        g.drawImage(backgroundImage, 0, 0, null);
+    }
+}