/* * Copyright 2008-2011 the original author or authors. * * Licensed 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.jdal.swing; import java.awt.BorderLayout; import java.awt.Component; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.DefaultListCellRenderer; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdal.swing.View; import org.jdal.swing.form.FormUtils; import org.jdal.swing.list.ListListModel; /** * A Container with List for select visible panel. * * @author Jose Luis Martin - (jlm@joseluismartin.info) */ public class ListPane extends JPanel implements ListSelectionListener { public static final String DEFAULT_TABLE_ICON = "/images/table/table.png"; private static final long serialVersionUID = 1L; private static final Log log = LogFactory.getLog(ListPane.class); private List<PanelHolder> panels = new ArrayList<PanelHolder>(); private JList list; private Icon tableIcon; private JPanel editorPanel = new JPanel(new BorderLayout()); private JSplitPane split; private ListCellRenderer renderer = new ListCellRenderer(); private List<ListSelectionListener> listeners = new ArrayList<ListSelectionListener>(); private int cellHeight = 0; public ListPane() { } public void init() { setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS)); tableIcon = FormUtils.getIcon(tableIcon, DEFAULT_TABLE_ICON); for (PanelHolder p : panels) p.getPanel().setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); list = new JList(new ListListModel(panels)); list.setBorder(BorderFactory.createEmptyBorder(5, 5 , 5, 5)); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setVisibleRowCount(-1); list.addListSelectionListener(this); list.setCellRenderer(renderer); list.setSelectedIndex(0); if (cellHeight != 0) list.setFixedCellHeight(cellHeight); JScrollPane scroll = new JScrollPane(list); split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scroll, editorPanel); split.setResizeWeight(0); split.setDividerLocation(150); add(split); } public void valueChanged(ListSelectionEvent e) { PanelHolder panel = (PanelHolder) list.getSelectedValue(); editorPanel.removeAll(); editorPanel.add(panel.getPanel()); editorPanel.revalidate(); editorPanel.repaint(); fireValueChanged(e); } /** * @param e */ private void fireValueChanged(ListSelectionEvent e) { for (ListSelectionListener lsl : listeners) lsl.valueChanged(e); } public void addListSelectionListener(ListSelectionListener l) { if (!listeners.contains(l)) listeners.add(l); } public void removeListSelectionListener(ListSelectionListener l) { listeners.remove(l); } /** * @return the tableIcon */ public Icon getTableIcon() { return tableIcon; } /** * @param tableIcon the tableIcon to set */ public void setTableIcon(Icon tableIcon) { this.tableIcon = tableIcon; } public void setCellHeight(int cellHeight) { this.cellHeight = cellHeight; } class ListCellRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); PanelHolder panel = (PanelHolder) value; setText(panel.getName()); Icon icon = panel.getIcon() != null ? panel.getIcon() : tableIcon; setIcon(icon); return this; } } /** * @return the panels */ public List<PanelHolder> getPanels() { return panels; } /** * @param panels the panels to set */ public void setPanels(List<PanelHolder> panels) { this.panels = panels; } public void addPanel(Object panel, String name, Icon icon) { PanelHolder holder = null; if (panel instanceof View) { holder = new ViewPanelHolder((View<?>) panel); } else if (panel instanceof JComponent) { holder = new JComponentPanelHolder((JComponent) panel); } else { if (log.isWarnEnabled()) log.warn("Try to add unsupported object type [" + panel.getClass().getName()); return; } holder.setIcon(icon); holder.setName(name); panels.add(holder); } }