All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.cayenne.modeler.WelcomeScreen Maven / Gradle / Ivy

The newest version!
/*****************************************************************
 *   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 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();
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy