| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
package javax.swing.plaf.synth;  | 
 | 
 | 
 | 
import javax.swing.*;  | 
 | 
import javax.swing.border.*;  | 
 | 
import javax.swing.plaf.*;  | 
 | 
import javax.swing.plaf.basic.*;  | 
 | 
import java.awt.*;  | 
 | 
import java.beans.PropertyChangeListener;  | 
 | 
import java.beans.PropertyChangeEvent;  | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
public class SynthListUI extends BasicListUI  | 
 | 
                         implements PropertyChangeListener, SynthUI { | 
 | 
    private SynthStyle style;  | 
 | 
    private boolean useListColors;  | 
 | 
    private boolean useUIBorder;  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public static ComponentUI createUI(JComponent list) { | 
 | 
        return new SynthListUI();  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    public void update(Graphics g, JComponent c) { | 
 | 
        SynthContext context = getContext(c);  | 
 | 
 | 
 | 
        SynthLookAndFeel.update(context, g);  | 
 | 
        context.getPainter().paintListBackground(context,  | 
 | 
                          g, 0, 0, c.getWidth(), c.getHeight());  | 
 | 
        context.dispose();  | 
 | 
        paint(g, c);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    public void paintBorder(SynthContext context, Graphics g, int x,  | 
 | 
                            int y, int w, int h) { | 
 | 
        context.getPainter().paintListBorder(context, g, x, y, w, h);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    protected void installListeners() { | 
 | 
        super.installListeners();  | 
 | 
        list.addPropertyChangeListener(this);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    public void propertyChange(PropertyChangeEvent e) { | 
 | 
        if (SynthLookAndFeel.shouldUpdateStyle(e)) { | 
 | 
            updateStyle((JList)e.getSource());  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    protected void uninstallListeners() { | 
 | 
        super.uninstallListeners();  | 
 | 
        list.removePropertyChangeListener(this);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    protected void installDefaults() { | 
 | 
        if (list.getCellRenderer() == null ||  | 
 | 
                 (list.getCellRenderer() instanceof UIResource)) { | 
 | 
            list.setCellRenderer(new SynthListCellRenderer());  | 
 | 
        }  | 
 | 
        updateStyle(list);  | 
 | 
    }  | 
 | 
 | 
 | 
    private void updateStyle(JComponent c) { | 
 | 
        SynthContext context = getContext(list, ENABLED);  | 
 | 
        SynthStyle oldStyle = style;  | 
 | 
 | 
 | 
        style = SynthLookAndFeel.updateStyle(context, this);  | 
 | 
 | 
 | 
        if (style != oldStyle) { | 
 | 
            context.setComponentState(SELECTED);  | 
 | 
            Color sbg = list.getSelectionBackground();  | 
 | 
            if (sbg == null || sbg instanceof UIResource) { | 
 | 
                list.setSelectionBackground(style.getColor(  | 
 | 
                                 context, ColorType.TEXT_BACKGROUND));  | 
 | 
            }  | 
 | 
 | 
 | 
            Color sfg = list.getSelectionForeground();  | 
 | 
            if (sfg == null || sfg instanceof UIResource) { | 
 | 
                list.setSelectionForeground(style.getColor(  | 
 | 
                                 context, ColorType.TEXT_FOREGROUND));  | 
 | 
            }  | 
 | 
 | 
 | 
            useListColors = style.getBoolean(context,  | 
 | 
                                  "List.rendererUseListColors", true);  | 
 | 
            useUIBorder = style.getBoolean(context,  | 
 | 
                                  "List.rendererUseUIBorder", true);  | 
 | 
 | 
 | 
            int height = style.getInt(context, "List.cellHeight", -1);  | 
 | 
            if (height != -1) { | 
 | 
                list.setFixedCellHeight(height);  | 
 | 
            }  | 
 | 
            if (oldStyle != null) { | 
 | 
                uninstallKeyboardActions();  | 
 | 
                installKeyboardActions();  | 
 | 
            }  | 
 | 
        }  | 
 | 
        context.dispose();  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    protected void uninstallDefaults() { | 
 | 
        super.uninstallDefaults();  | 
 | 
 | 
 | 
        SynthContext context = getContext(list, ENABLED);  | 
 | 
 | 
 | 
        style.uninstallDefaults(context);  | 
 | 
        context.dispose();  | 
 | 
        style = null;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    public SynthContext getContext(JComponent c) { | 
 | 
        return getContext(c, getComponentState(c));  | 
 | 
    }  | 
 | 
 | 
 | 
    private SynthContext getContext(JComponent c, int state) { | 
 | 
        return SynthContext.getContext(c, style, state);  | 
 | 
    }  | 
 | 
 | 
 | 
    private int getComponentState(JComponent c) { | 
 | 
        return SynthLookAndFeel.getComponentState(c);  | 
 | 
    }  | 
 | 
 | 
 | 
 | 
 | 
    private class SynthListCellRenderer extends DefaultListCellRenderer.UIResource { | 
 | 
        @Override public String getName() { | 
 | 
            return "List.cellRenderer";  | 
 | 
        }  | 
 | 
 | 
 | 
        @Override public void setBorder(Border b) { | 
 | 
            if (useUIBorder || b instanceof SynthBorder) { | 
 | 
                super.setBorder(b);  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
        @Override public Component getListCellRendererComponent(JList list, Object value,  | 
 | 
                  int index, boolean isSelected, boolean cellHasFocus) { | 
 | 
            if (!useListColors && (isSelected || cellHasFocus)) { | 
 | 
                SynthLookAndFeel.setSelectedUI((SynthLabelUI)SynthLookAndFeel.  | 
 | 
                             getUIOfType(getUI(), SynthLabelUI.class),  | 
 | 
                                   isSelected, cellHasFocus, list.isEnabled(), false);  | 
 | 
            }  | 
 | 
            else { | 
 | 
                SynthLookAndFeel.resetSelectedUI();  | 
 | 
            }  | 
 | 
 | 
 | 
            super.getListCellRendererComponent(list, value, index,  | 
 | 
                                               isSelected, cellHasFocus);  | 
 | 
            return this;  | 
 | 
        }  | 
 | 
 | 
 | 
        @Override public void paint(Graphics g) { | 
 | 
            super.paint(g);  | 
 | 
            SynthLookAndFeel.resetSelectedUI();  | 
 | 
        }  | 
 | 
    }  | 
 | 
}  |