src/macosx/classes/sun/lwawt/LWListPeer.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 30,43 **** import java.awt.*; import java.awt.event.*; import java.awt.peer.ListPeer; import java.util.Arrays; ! final class LWListPeer ! extends LWComponentPeer<List, LWListPeer.ScrollableJList> implements ListPeer { LWListPeer(final List target, final PlatformComponent platformComponent) { super(target, platformComponent); if (!getTarget().isBackgroundSet()) { getTarget().setBackground(SystemColor.text); } --- 30,55 ---- import java.awt.*; import java.awt.event.*; import java.awt.peer.ListPeer; import java.util.Arrays; ! /** ! * Lightweight implementation of {@link ListPeer}. ! */ ! final class LWListPeer extends LWComponentPeer<List, LWListPeer.ScrollableJList> implements ListPeer { + /** + * The default number of visible rows. + */ + private static final int DEFAULT_VISIBLE_ROWS = 4; // From java.awt.List, + + /** + * This text is used for cell bounds calculation. + */ + private static final String TEXT = "0123456789abcde"; + LWListPeer(final List target, final PlatformComponent platformComponent) { super(target, platformComponent); if (!getTarget().isBackgroundSet()) { getTarget().setBackground(SystemColor.text); }
*** 133,159 **** : ListSelectionModel.SINGLE_SELECTION); } } @Override public Dimension getPreferredSize(final int rows) { return getMinimumSize(rows); } @Override public Dimension getMinimumSize(final int rows) { synchronized (getDelegateLock()) { ! final int margin = 2; ! final int space = 1; ! ! // TODO: count ScrollPane's scrolling elements if any. ! final FontMetrics fm = getFontMetrics(getFont()); ! final int itemHeight = (fm.getHeight() - fm.getLeading()) + (2 * space); ! ! return new Dimension(20 + (fm == null ? 10 * 15 : fm.stringWidth("0123456789abcde")), ! (fm == null ? 10 : itemHeight) * rows + (2 * margin)); } } private void revalidate() { synchronized (getDelegateLock()) { getDelegate().getView().invalidate(); --- 145,191 ---- : ListSelectionModel.SINGLE_SELECTION); } } @Override + public Dimension getPreferredSize() { + return getMinimumSize(); + } + + @Override + public Dimension getMinimumSize() { + return getMinimumSize(DEFAULT_VISIBLE_ROWS); + } + + @Override public Dimension getPreferredSize(final int rows) { return getMinimumSize(rows); } @Override public Dimension getMinimumSize(final int rows) { synchronized (getDelegateLock()) { ! final Dimension size = getCellSize(); ! size.height *= rows; ! // Always take vertical scrollbar into account. ! final JScrollBar vbar = getDelegate().getVerticalScrollBar(); ! size.width += vbar != null ? vbar.getMinimumSize().width : 0; ! // JScrollPane and JList insets ! final Insets pi = getDelegate().getInsets(); ! final Insets vi = getDelegate().getView().getInsets(); ! size.width += pi.left + pi.right + vi.left + vi.right; ! size.height += pi.top + pi.bottom + vi.top + vi.bottom; ! return size; ! } } + + private Dimension getCellSize() { + final JList<String> jList = getDelegate().getView(); + final ListCellRenderer<? super String> cr = jList.getCellRenderer(); + final Component cell = cr.getListCellRendererComponent(jList, TEXT, 0, + false, false); + return cell.getPreferredSize(); } private void revalidate() { synchronized (getDelegateLock()) { getDelegate().getView().invalidate();
*** 163,176 **** final class ScrollableJList extends JScrollPane implements ListSelectionListener { private boolean skipStateChangedEvent; ! private DefaultListModel<Object> model = ! new DefaultListModel<Object>() { @Override ! public void add(final int index, final Object element) { if (index == -1) { addElement(element); } else { super.add(index, element); } --- 195,208 ---- final class ScrollableJList extends JScrollPane implements ListSelectionListener { private boolean skipStateChangedEvent; ! private final DefaultListModel<String> model = ! new DefaultListModel<String>() { @Override ! public void add(final int index, final String element) { if (index == -1) { addElement(element); } else { super.add(index, element); }
*** 179,189 **** private int[] oldSelectedIndices = new int[0]; ScrollableJList() { getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE); ! final JList<Object> list = new JListDelegate(); list.addListSelectionListener(this); getViewport().setView(list); // Pull the items from the target. --- 211,221 ---- private int[] oldSelectedIndices = new int[0]; ScrollableJList() { getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE); ! final JList<String> list = new JListDelegate(); list.addListSelectionListener(this); getViewport().setView(list); // Pull the items from the target.
*** 221,235 **** } oldSelectedIndices = source.getSelectedIndices(); } } ! public JList getView() { ! return (JList) getViewport().getView(); } ! public DefaultListModel<Object> getModel() { return model; } @Override public void setEnabled(final boolean enabled) { --- 253,267 ---- } oldSelectedIndices = source.getSelectedIndices(); } } ! public JList<String> getView() { ! return (JList<String>) getViewport().getView(); } ! public DefaultListModel<String> getModel() { return model; } @Override public void setEnabled(final boolean enabled) {
*** 252,262 **** getView().setFont(font); LWListPeer.this.revalidate(); } } ! private final class JListDelegate extends JList<Object> { JListDelegate() { super(ScrollableJList.this.model); } --- 284,294 ---- getView().setFont(font); LWListPeer.this.revalidate(); } } ! private final class JListDelegate extends JList<String> { JListDelegate() { super(ScrollableJList.this.model); }
*** 270,292 **** super.processMouseEvent(e); if (e.getID() == MouseEvent.MOUSE_CLICKED && e.getClickCount() == 2) { final int index = locationToIndex(e.getPoint()); if (0 <= index && index < getModel().getSize()) { LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED, ! getModel().getElementAt(index).toString(), e.getWhen(), e.getModifiers())); } } } @Override protected void processKeyEvent(final KeyEvent e) { super.processKeyEvent(e); if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == KeyEvent.VK_ENTER) { ! final Object selectedValue = getSelectedValue(); if(selectedValue != null){ LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED, ! selectedValue.toString(), e.getWhen(), e.getModifiers())); } } } //Needed for Autoscroller. --- 302,324 ---- super.processMouseEvent(e); if (e.getID() == MouseEvent.MOUSE_CLICKED && e.getClickCount() == 2) { final int index = locationToIndex(e.getPoint()); if (0 <= index && index < getModel().getSize()) { LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED, ! getModel().getElementAt(index), e.getWhen(), e.getModifiers())); } } } @Override protected void processKeyEvent(final KeyEvent e) { super.processKeyEvent(e); if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == KeyEvent.VK_ENTER) { ! final String selectedValue = getSelectedValue(); if(selectedValue != null){ LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED, ! selectedValue, e.getWhen(), e.getModifiers())); } } } //Needed for Autoscroller.