/* GanttProject is an opensource project management tool. License: GPL3 Copyright (C) 2011 Dmitry Barashev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject.gui; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Component; import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; import java.util.HashSet; import java.util.List; import javax.swing.AbstractListModel; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import net.sourceforge.ganttproject.action.CancelAction; import net.sourceforge.ganttproject.action.OkAction; import net.sourceforge.ganttproject.language.GanttLanguage; public abstract class AbstractPagesDialog { private final UIFacade myUIFacade; private final List<ListItem> myItems; private final HashSet<String> myPageIds = new HashSet<String>(); private final String myTitleKey; private JList<ListItem> myPagesList; protected AbstractPagesDialog(String titleKey, UIFacade uifacade, List<ListItem> pages) { myTitleKey = titleKey; myUIFacade = uifacade; myItems = pages; for (ListItem li : myItems) { myPageIds.add(li.id); } } protected boolean isPageVisible(String pageId) { return myPageIds.contains(pageId); } public void show() { show(null); } public void show(String pageID) { OkAction okAction = new OkAction() { @Override public void actionPerformed(ActionEvent e) { onOk(); } }; myUIFacade.createDialog(getComponent(), new Action[] { okAction, CancelAction.EMPTY }, GanttLanguage.getInstance().getCorrectedLabel(myTitleKey)).show(); if (pageID != null) { for (int i = 0; i < myItems.size(); i++) { if (pageID.equals(myItems.get(i).id)) { myPagesList.setSelectedIndex(i); break; } } } } protected static class ListItem { final boolean isGroupHeader; final String name; final Container component; final String id; public ListItem(boolean isGroupHeader, String id, String name, Container component) { this.isGroupHeader = isGroupHeader; this.id = id; this.name = name; this.component = component; } } protected abstract void onOk(); private Component getComponent() { final JPanel contentPanel = new JPanel(new CardLayout()); // Add panels to CardLayout for (ListItem li : myItems) { if (li.component != null) { contentPanel.add(li.component, li.id); } } myPagesList = new JList<ListItem>(new AbstractListModel<ListItem>() { @Override public ListItem getElementAt(int idx) { return myItems.get(idx); } @Override public int getSize() { return myItems.size(); } }); myPagesList.setVisibleRowCount(myItems.size()); myPagesList.setCellRenderer(new DefaultListCellRenderer() { private final JButton EMPTY_BUTTON = new JButton(); @Override public Component getListCellRendererComponent(JList list, Object value, int idx, boolean isSelected, boolean cellHasFocus) { ListItem listItem = (ListItem) value; Component defaultResult = super.getListCellRendererComponent(list, listItem.name, idx, isSelected, false); Font font = defaultResult.getFont(); JPanel wrapper = new JPanel(new BorderLayout()); if (listItem.isGroupHeader) { defaultResult.setFont(font.deriveFont(Font.BOLD, font.getSize() + 2.0f)); defaultResult.setBackground(EMPTY_BUTTON.getBackground()); defaultResult.setForeground(EMPTY_BUTTON.getForeground()); wrapper.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createMatteBorder(1, 0, 0, 0, EMPTY_BUTTON.getBackground().darker()), BorderFactory.createEmptyBorder(2, 3, 2, 5))); } else { defaultResult.setFont(font.deriveFont(font.getSize() + 2.0f)); wrapper.setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 5)); } wrapper.setBackground(defaultResult.getBackground()); wrapper.add(defaultResult, BorderLayout.CENTER); if (listItem.isGroupHeader) { JPanel headerWrapper = new JPanel(new BorderLayout()); headerWrapper.setBackground(list.getBackground()); if (idx > 0) { headerWrapper.add(new JLabel(" "), BorderLayout.NORTH); } headerWrapper.add(wrapper, BorderLayout.CENTER); return headerWrapper; } return wrapper; } }); myPagesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); myPagesList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { ListItem listItem = myPagesList.getSelectedValue(); if (listItem.isGroupHeader) { // Assumes that the list does not end with a GroupHeader! myPagesList.setSelectedIndex(myPagesList.getSelectedIndex() + 1); } else { final CardLayout cardLayout = (CardLayout) contentPanel.getLayout(); cardLayout.show(contentPanel, listItem.id); } } }); myPagesList.setBorder(BorderFactory.createEtchedBorder()); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { myPagesList.setSelectedIndex(0); } }); JPanel rootPanel = new JPanel(new BorderLayout()); rootPanel.add(myPagesList, BorderLayout.WEST); JPanel contentPanelWrapper = new JPanel(new BorderLayout()); contentPanelWrapper.add(contentPanel, BorderLayout.NORTH); rootPanel.add(contentPanelWrapper, BorderLayout.CENTER); rootPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); return rootPanel; } }