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

Print this page

        

*** 121,140 **** private final RepaintArea targetPaintArea; // private volatile boolean paintPending; private volatile boolean isLayouting; ! private D delegate = null; private Container delegateContainer; private Component delegateDropTarget; private final Object dropTargetLock = new Object(); private int fNumDropTargets = 0; private CDropTarget fDropTarget = null; private final PlatformComponent platformComponent; private final class DelegateContainer extends Container { { enableEvents(0xFFFFFFFF); } --- 121,145 ---- private final RepaintArea targetPaintArea; // private volatile boolean paintPending; private volatile boolean isLayouting; ! private final D delegate; private Container delegateContainer; private Component delegateDropTarget; private final Object dropTargetLock = new Object(); private int fNumDropTargets = 0; private CDropTarget fDropTarget = null; private final PlatformComponent platformComponent; + /** + * Character with reasonable value between the minimum width and maximum. + */ + static final char WIDE_CHAR = '0'; + private final class DelegateContainer extends Container { { enableEvents(0xFFFFFFFF); }
*** 265,278 **** protected D createDelegate() { return null; } protected final D getDelegate() { - synchronized (getStateLock()) { return delegate; } - } protected Component getDelegateFocusOwner() { return getDelegate(); } --- 270,281 ----
*** 696,725 **** return font; } } @Override ! public FontMetrics getFontMetrics(Font f) { // Borrow the metrics from the top-level window // return getWindowPeer().getFontMetrics(f); // Obtain the metrics from the offscreen window where this peer is // mostly drawn to. // TODO: check for "use platform metrics" settings ! Graphics g = getWindowPeer().getGraphics(); ! try { if (g != null) { return g.getFontMetrics(f); - } else { - synchronized (getDelegateLock()) { - return delegateContainer.getFontMetrics(f); - } - } } finally { - if (g != null) { g.dispose(); } } } @Override public void setEnabled(final boolean e) { boolean status = e; --- 699,725 ---- return font; } } @Override ! public FontMetrics getFontMetrics(final Font f) { // Borrow the metrics from the top-level window // return getWindowPeer().getFontMetrics(f); // Obtain the metrics from the offscreen window where this peer is // mostly drawn to. // TODO: check for "use platform metrics" settings ! final Graphics g = getOnscreenGraphics(); if (g != null) { + try { return g.getFontMetrics(f); } finally { g.dispose(); } } + synchronized (getDelegateLock()) { + return delegateContainer.getFontMetrics(f); + } } @Override public void setEnabled(final boolean e) { boolean status = e;
*** 845,879 **** // TODO: not implemented return false; } /** ! * Should be overridden in subclasses to forward the request ! * to the Swing helper component, if required. */ @Override public Dimension getPreferredSize() { ! // It looks like a default implementation for all toolkits ! return getMinimumSize(); } ! /* ! * Should be overridden in subclasses to forward the request ! * to the Swing helper component. */ @Override public Dimension getMinimumSize() { ! D delegate = getDelegate(); ! ! if (delegate == null) { ! // Is it a correct default value? ! return getBounds().getSize(); ! } else { synchronized (getDelegateLock()) { ! return delegate.getMinimumSize(); } } } @Override public void updateCursorImmediately() { getLWToolkit().getCursorManager().updateCursor(); --- 845,894 ---- // TODO: not implemented return false; } /** ! * Determines the preferred size of the component. By default forwards the ! * request to the Swing helper component. Should be overridden in subclasses ! * if required. */ @Override public Dimension getPreferredSize() { ! final Dimension size; ! synchronized (getDelegateLock()) { ! size = getDelegate().getPreferredSize(); ! } ! return validateSize(size); } ! /** ! * Determines the minimum size of the component. By default forwards the ! * request to the Swing helper component. Should be overridden in subclasses ! * if required. */ @Override public Dimension getMinimumSize() { ! final Dimension size; synchronized (getDelegateLock()) { ! size = getDelegate().getMinimumSize(); } + return validateSize(size); + } + + /** + * In some situations delegates can return empty minimum/preferred size. + * (For example: empty JLabel, etc), but awt components never should be + * empty. In the XPeers or WPeers we use some magic constants, but here we + * try to use something more useful, + */ + private Dimension validateSize(final Dimension size) { + if (size.width == 0 || size.height == 0) { + final FontMetrics fm = getFontMetrics(getFont()); + size.width = fm.charWidth(WIDE_CHAR); + size.height = fm.getHeight(); } + return size; } @Override public void updateCursorImmediately() { getLWToolkit().getCursorManager().updateCursor();