package com.onaro.sanscreen.client.view.dashboard; import java.awt.Dimension; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.UIManager; import com.onaro.commons.swing.PopupMenuMouseListener; import com.onaro.commons.util.MessageManager; import com.onaro.sanscreen.client.SANscreenClientPlugin; import com.onaro.sanscreen.server.dataobject.DashboardInfo; import com.onaro.util.jfc.ConfigurableAction; import com.onaro.util.jfc.GradiantLabel; import com.onaro.util.jfc.SelectableCheckBoxMenuItem; /** * The dashboard displays a list of counters displaying summary information on the SAN and/or SANscreen. Each of the * counter consists of an icon, label and the actual data. Once a counter is being clicked, it causes SANscreen to * navigate to the appropriate view. */ public class Dashboard extends JPanel { private static final long serialVersionUID = 1L; public static final Messages MESSAGES = MessageManager.getMessages(Messages.class); private List items; private JPopupMenu popupMenu; private ConfigurableAction popupAction; private PropertyChangeListener myDashboardManagerPropertyChangeListener; public Dashboard() { initialize(); } private void initialize() { setBackground(UIManager.getDefaults().getColor("Table.background")); //$NON-NLS-1$ setBorder(UIManager.getDefaults().getBorder("BasicPanel.border")); //$NON-NLS-1$ BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS); setLayout(layout); Dimension maxSize = new Dimension(Short.MAX_VALUE, Short.MAX_VALUE); JLabel productLabel = GradiantLabel.createLogoLabel(MESSAGES.getDashboardBannerText(SANscreenClientPlugin.getDefault().getBranding().getProductName())); productLabel.setMaximumSize(maxSize); add(productLabel); PopupListener popupListener = new PopupListener(); for (DashboardItem item : getItems()) { add(Box.createVerticalStrut(3)); JButton dashboardHyperlink = item.getDashboardHyperlink(); dashboardHyperlink.setMaximumSize(maxSize); dashboardHyperlink.addMouseListener(popupListener); add(dashboardHyperlink); } addMouseListener(popupListener); getDashboardManager().addPropertyChangeListener(DashboardManager.PROP_DASHBOARD_INFO, getMyDashboardManagerPropertyChangeListener()); } private PropertyChangeListener getMyDashboardManagerPropertyChangeListener() { if (myDashboardManagerPropertyChangeListener == null) { myDashboardManagerPropertyChangeListener = new MyDashboardManagerPropertyChangeListener(); } return myDashboardManagerPropertyChangeListener; } protected DashboardManager getDashboardManager() { return DashboardManager.getInstance(); } class MyDashboardManagerPropertyChangeListener implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent evt) { DashboardInfo dashboardInfo = getDashboardManager().getDashboardInfo(); update(dashboardInfo); } } List getItems() { List itemTypes = DashboardManager.getInstance().getDashboardItemTypes(); if (items == null) { items = new ArrayList<>(); for (DashboardItemType type : itemTypes) { DashboardItem item = type.createDashboardItem(); items.add(item); } } return items; } public void dispose() { getDashboardManager().removePropertyChangeListener(DashboardManager.PROP_DASHBOARD_INFO, getMyDashboardManagerPropertyChangeListener()); } void update(DashboardInfo info) { List items = getItems(); for (DashboardItem item : items) { item.update(info); } repaint(); } JPopupMenu getPopupMenu() { if (popupMenu == null) { popupMenu = new JPopupMenu(); for (DashboardItem item : items) { popupMenu.add(item.getControlMenuItem()); } ConfigurableAction popupAction = getPopupAction(); if (popupAction != null) { popupMenu.addSeparator(); popupMenu.add(new SelectableCheckBoxMenuItem(popupAction)); } } return popupMenu; } class PopupListener extends PopupMenuMouseListener { @Override public JPopupMenu getPopupMenu(MouseEvent mouseEvent) { return Dashboard.this.getPopupMenu(); } } public final ConfigurableAction getPopupAction() { return popupAction; } public final void setPopupAction(ConfigurableAction popupAction) { this.popupAction = popupAction; } }