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

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

There is a newer version: 5.0-M1
Show 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
 *
 *    https://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.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;

import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.Icon;
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;
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;

/**
 * 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 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
     */
    private JList recentProjectsList;

    private JPanel buttonsPanel;

    private JPanel mainPanel;

    public WelcomeScreen() {
        initView();
    }

    /**
     * Creates all necessary components
     */
    protected void initView() {
        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();
            }
        };
        setBorder(BorderFactory.createEmptyBorder());
        initButtonsPane();
        initFileListPane();
        setViewportView(mainPanel);
    }

    private void initFileListPane() {
        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);
        mainPanel.add(fileListPanel);
    }

    private void initButtonsPane() {
        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);

        mainPanel.add(buttonsPanel);
    }

    private void initButton(String name, int y,  Class 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(actionClass));
        buttonsPanel.add(button);
    }

    @Override
    public void onFileSelect(File file) {
        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 arr = ModelerPreferences.getLastProjFiles();
        recentProjectsList.setModel(new RecentFileListModel(arr));
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy