package org.chartsy.main.templates; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JToolBar; import javax.swing.ListSelectionModel; import org.chartsy.main.managers.TemplateManager; import org.chartsy.main.resources.ResourcesUtils; import org.openide.DialogDescriptor; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor.Message; /** * * @author Viorel */ public class TemplateManagerPanel extends JPanel { private ZebraJList templateList; private JToolBar toolBar; private JButton defaultBtn; private JButton deleteBtn; public TemplateManagerPanel() { super(new BorderLayout()); setOpaque(false); initComponents(); } private void initComponents() { templateList = new ZebraJList(TemplateManager.getDefault().getTemplateNames()); templateList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); templateList.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); templateList.setPreferredSize(new Dimension(400, 500)); add(templateList, BorderLayout.CENTER); toolBar = new JToolBar(JToolBar.HORIZONTAL); toolBar.setLayout(new FlowLayout(FlowLayout.LEFT)); toolBar.setPreferredSize(new Dimension(150, 500)); toolBar.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); add(toolBar, BorderLayout.EAST); defaultBtn = new JButton(new SetDefault()); defaultBtn.setIcon(ResourcesUtils.getIcon("default")); defaultBtn.setOpaque(true); defaultBtn.setBorderPainted(true); defaultBtn.setRolloverEnabled(true); toolBar.add(defaultBtn); deleteBtn = new JButton(new Delete()); deleteBtn.setIcon(ResourcesUtils.getIcon("delete")); deleteBtn.setOpaque(true); deleteBtn.setBorderPainted(true); deleteBtn.setRolloverEnabled(true); toolBar.add(deleteBtn); } public class SetDefault extends AbstractAction { public SetDefault() { putValue(NAME, "Set As Default"); putValue(SHORT_DESCRIPTION, "Set the selected template as default"); } @Override public void actionPerformed(ActionEvent e) { int index = templateList.getSelectedIndex(); if (index != -1) { String name = (String) templateList.getSelectedValue(); TemplateManager.getDefault().setDefaultTemplate(name); } } } public class Delete extends AbstractAction { public Delete() { putValue(NAME, "Delete"); putValue(SHORT_DESCRIPTION, "Delete the selected template"); } @Override public void actionPerformed(ActionEvent e) { if (templateList.getModel().getSize() > 1) { int index = templateList.getSelectedIndex(); if (index != -1) { String name = (String) templateList.getSelectedValue(); if (!name.equals(TemplateManager.getDefault().getDefaultTemplate())) { TemplateManager.getDefault().removeTemplate(name); templateList.clearSelection(); templateList.setListData(TemplateManager.getDefault().getTemplateNames()); } else { Message message = new Message("You can't delete the default template.", DialogDescriptor.WARNING_MESSAGE); DialogDisplayer.getDefault().notify(message); } } } else { Message message = new Message("You can't delete the default template.", DialogDescriptor.WARNING_MESSAGE); DialogDisplayer.getDefault().notify(message); } } } public class ZebraJList extends javax.swing.JList { private java.awt.Color rowColors[] = new java.awt.Color[2]; private boolean drawStripes = false; public ZebraJList() {} public ZebraJList(javax.swing.ListModel dataModel) { super(dataModel); } public ZebraJList(Object[] listData) { super(listData); } @Override public void paintComponent(java.awt.Graphics g) { drawStripes = (getLayoutOrientation()==VERTICAL) && isOpaque(); if (!drawStripes) { super.paintComponent(g); return; } updateZebraColors(); final java.awt.Insets insets = getInsets(); final int w = getWidth() - insets.left - insets.right; final int h = getHeight() - insets.top - insets.bottom; final int x = insets.left; int y = insets.top; int nRows = 0; int startRow = 0; int rowHeight = getFixedCellHeight(); if (rowHeight > 0) nRows = h / rowHeight; else { final int nItems = getModel().getSize(); rowHeight = 17; for (int i = 0; i < nItems; i++, y+=rowHeight) { rowHeight = getCellBounds(i, i).height; g.setColor(rowColors[i&1]); g.fillRect(x, y, w, rowHeight); } nRows = nItems + (insets.top + h - y) / rowHeight; startRow = nItems; } for (int i = startRow; i < nRows; i++, y+=rowHeight) { g.setColor(rowColors[i&1]); g.fillRect(x, y, w, rowHeight); } final int remainder = insets.top + h - y; if (remainder > 0) { g.setColor(rowColors[nRows&1]); g.fillRect(x, y, w, remainder); } setOpaque(false); super.paintComponent(g); setOpaque(true); } private class RendererWrapper implements javax.swing.ListCellRenderer { public javax.swing.ListCellRenderer ren = null; @Override public java.awt.Component getListCellRendererComponent( javax.swing.JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { String temp = (String) value; if (TemplateManager.getDefault().getDefaultTemplate().equals(temp)) temp += " (default)"; final java.awt.Component c = ren.getListCellRendererComponent( list, temp, index, isSelected, cellHasFocus); if (!isSelected && drawStripes) c.setBackground(rowColors[index&1]); return c; } } private RendererWrapper wrapper = null; @Override public javax.swing.ListCellRenderer getCellRenderer() { final javax.swing.ListCellRenderer ren = super.getCellRenderer(); if (ren == null) return null; if (wrapper == null) wrapper = new RendererWrapper(); wrapper.ren = ren; return wrapper; } private void updateZebraColors() { if ((rowColors[0] = getBackground()) == null) { rowColors[0] = rowColors[1] = java.awt.Color.white; return; } final java.awt.Color sel = getSelectionBackground(); if (sel == null) { rowColors[1] = rowColors[0]; return; } final float[] bgHSB = java.awt.Color.RGBtoHSB( rowColors[0].getRed(), rowColors[0].getGreen(), rowColors[0].getBlue(), null); final float[] selHSB = java.awt.Color.RGBtoHSB( sel.getRed(), sel.getGreen(), sel.getBlue(), null ); rowColors[1] = java.awt.Color.getHSBColor( (selHSB[1]==0.0||selHSB[2]==0.0) ? bgHSB[0] : selHSB[0], 0.1f * selHSB[1] + 0.9f * bgHSB[1], bgHSB[2] + ((bgHSB[2]<0.5f) ? 0.05f : -0.05f)); } } }