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:07 UTC

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

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