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.