if (ids.containsKey(row.adapterId())) {
                SubmissionRowUiModel existing = ids.get(row.adapterId());
                throw new AssertionError("ID collision between " + existing + " and " + row);
            }

package me.saket.dank.ui.subreddit;

import android.annotation.SuppressLint;
import android.support.annotation.CheckResult;
import android.support.v7.util.DiffUtil;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import io.reactivex.Observable;
import io.reactivex.functions.Consumer;
import me.saket.dank.data.SwipeEvent;
import me.saket.dank.ui.subreddit.events.SubredditSubmissionClickEvent;
import me.saket.dank.ui.subreddit.events.SubredditSubmissionThumbnailClickEvent;
import me.saket.dank.ui.subreddit.uimodels.SubredditScreenUiModel;
import me.saket.dank.ui.subreddit.uimodels.SubredditScreenUiModel.SubmissionRowUiModel;
import me.saket.dank.ui.subreddit.uimodels.SubredditSubmission;
import me.saket.dank.ui.subreddit.uimodels.SubredditSubmissionPagination;
import me.saket.dank.utils.InfinitelyScrollableRecyclerViewAdapter;
import me.saket.dank.utils.Pair;
import me.saket.dank.utils.RecyclerViewArrayAdapter;
import me.saket.dank.walkthrough.SubmissionGestureWalkthroughProceedEvent;
import me.saket.dank.walkthrough.SubmissionGesturesWalkthrough;

public class SubredditSubmissionsAdapter extends RecyclerViewArrayAdapter<SubmissionRowUiModel, RecyclerView.ViewHolder> implements Consumer<Pair<List<SubmissionRowUiModel>, DiffUtil.DiffResult>>, InfinitelyScrollableRecyclerViewAdapter {

    public static final int ADAPTER_ID_PAGINATION_FOOTER = -99;

    public static final long ADAPTER_ID_GESTURES_WALKTHROUGH = -98;

    private static final SubmissionRowUiModel.Type[] VIEW_TYPES = SubmissionRowUiModel.Type.values();

    private final Map<SubmissionRowUiModel.Type, SubredditScreenUiModel.SubmissionRowUiChildAdapter> childAdapters;

    private final SubredditSubmission.Adapter submissionAdapter;

    private final SubredditSubmissionPagination.Adapter paginationAdapter;

    private final SubmissionGesturesWalkthrough.Adapter gestureWalkthroughAdapter;

    @Inject
    public SubredditSubmissionsAdapter(SubmissionGesturesWalkthrough.Adapter gestureWalkthroughAdapter, SubredditSubmission.Adapter submissionAdapter, SubredditSubmissionPagination.Adapter paginationAdapter) {
        childAdapters = new HashMap<>(4);
        childAdapters.put(SubmissionRowUiModel.Type.GESTURES_WALKTHROUGH, gestureWalkthroughAdapter);
        childAdapters.put(SubmissionRowUiModel.Type.SUBMISSION, submissionAdapter);
        childAdapters.put(SubmissionRowUiModel.Type.PAGINATION_FOOTER, paginationAdapter);
        this.gestureWalkthroughAdapter = gestureWalkthroughAdapter;
        this.paginationAdapter = paginationAdapter;
        this.submissionAdapter = submissionAdapter;
        setHasStableIds(true);
    }

    @CheckResult
    public Observable<SubredditSubmissionClickEvent> submissionClicks() {
        return submissionAdapter.submissionClicks();
    }

    @CheckResult
    public Observable<SubmissionGestureWalkthroughProceedEvent> gestureWalkthroughProceedClicks() {
        return gestureWalkthroughAdapter.proceedClicks();
    }

    @CheckResult
    public Observable<SubredditSubmissionThumbnailClickEvent> thumbnailClicks() {
        return submissionAdapter.thumbnailClicks();
    }

    @CheckResult
    public Observable<SwipeEvent> swipeEvents() {
        return submissionAdapter.swipeEvents();
    }

    @CheckResult
    public Observable<?> paginationFailureRetryClicks() {
        return paginationAdapter.failureRetryClicks();
    }

    @Override
    public long getItemId(int position) {
        return getItem(position).adapterId();
    }

    @Override
    public int getItemCountMinusDecorators() {
        int itemCount = getItemCount();
        if (itemCount > 1 && getItem(itemCount - 1).type() == SubmissionRowUiModel.Type.PAGINATION_FOOTER) {
            itemCount = itemCount - 1;
        }
        return itemCount;
    }

    @Override
    public int getItemViewType(int position) {
        return getItem(position).type().ordinal();
    }

    @Override
    protected RecyclerView.ViewHolder onCreateViewHolder(LayoutInflater inflater, ViewGroup parent, int viewType) {
        return childAdapters.get(VIEW_TYPES[viewType]).onCreateViewHolder(inflater, parent);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position, List<Object> payloads) {
        if (payloads.isEmpty()) {
            super.onBindViewHolder(holder, position, payloads);
        } else {
            // noinspection unchecked
            childAdapters.get(VIEW_TYPES[holder.getItemViewType()]).onBindViewHolder(holder, getItem(position), payloads);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        // noinspection unchecked
        childAdapters.get(VIEW_TYPES[holder.getItemViewType()]).onBindViewHolder(holder, getItem(position));
    }

    @Override
    public void accept(Pair<List<SubmissionRowUiModel>, DiffUtil.DiffResult> pair) {
        findCollidingIds(pair.first());
        updateData(pair.first());
        pair.second().dispatchUpdatesTo(this);
    }

    @SuppressLint("UseSparseArrays")
    private static void findCollidingIds(List<SubmissionRowUiModel> rows) {
        Map<Long, SubmissionRowUiModel> ids = new HashMap<>(rows.size(), 1f);
        for (SubmissionRowUiModel row : rows) {

            ids.put(row.adapterId(), row);
        }
    }
}


package me.saket.dank.ui.subreddit;

import android.annotation.SuppressLint;
import android.support.annotation.CheckResult;
import android.support.v7.util.DiffUtil;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import io.reactivex.Observable;
import io.reactivex.functions.Consumer;
import me.saket.dank.data.SwipeEvent;
import me.saket.dank.ui.subreddit.events.SubredditSubmissionClickEvent;
import me.saket.dank.ui.subreddit.events.SubredditSubmissionThumbnailClickEvent;
import me.saket.dank.ui.subreddit.uimodels.SubredditScreenUiModel;
import me.saket.dank.ui.subreddit.uimodels.SubredditScreenUiModel.SubmissionRowUiModel;
import me.saket.dank.ui.subreddit.uimodels.SubredditSubmission;
import me.saket.dank.ui.subreddit.uimodels.SubredditSubmissionPagination;
import me.saket.dank.utils.InfinitelyScrollableRecyclerViewAdapter;
import me.saket.dank.utils.Pair;
import me.saket.dank.utils.RecyclerViewArrayAdapter;
import me.saket.dank.walkthrough.SubmissionGestureWalkthroughProceedEvent;
import me.saket.dank.walkthrough.SubmissionGesturesWalkthrough;

public class SubredditSubmissionsAdapter extends RecyclerViewArrayAdapter<SubmissionRowUiModel, RecyclerView.ViewHolder> implements Consumer<Pair<List<SubmissionRowUiModel>, DiffUtil.DiffResult>>, InfinitelyScrollableRecyclerViewAdapter {

    public static final int ADAPTER_ID_PAGINATION_FOOTER = -99;

    public static final long ADAPTER_ID_GESTURES_WALKTHROUGH = -98;

    private static final SubmissionRowUiModel.Type[] VIEW_TYPES = SubmissionRowUiModel.Type.values();

    private final Map<SubmissionRowUiModel.Type, SubredditScreenUiModel.SubmissionRowUiChildAdapter> childAdapters;

    private final SubredditSubmission.Adapter submissionAdapter;

    private final SubredditSubmissionPagination.Adapter paginationAdapter;

    private final SubmissionGesturesWalkthrough.Adapter gestureWalkthroughAdapter;

    @Inject
    public SubredditSubmissionsAdapter(SubmissionGesturesWalkthrough.Adapter gestureWalkthroughAdapter, SubredditSubmission.Adapter submissionAdapter, SubredditSubmissionPagination.Adapter paginationAdapter) {
        childAdapters = new HashMap<>(4);
        childAdapters.put(SubmissionRowUiModel.Type.GESTURES_WALKTHROUGH, gestureWalkthroughAdapter);
        childAdapters.put(SubmissionRowUiModel.Type.SUBMISSION, submissionAdapter);
        childAdapters.put(SubmissionRowUiModel.Type.PAGINATION_FOOTER, paginationAdapter);
        this.gestureWalkthroughAdapter = gestureWalkthroughAdapter;
        this.paginationAdapter = paginationAdapter;
        this.submissionAdapter = submissionAdapter;
        setHasStableIds(true);
    }

    @CheckResult
    public Observable<SubredditSubmissionClickEvent> submissionClicks() {
        return submissionAdapter.submissionClicks();
    }

    @CheckResult
    public Observable<SubmissionGestureWalkthroughProceedEvent> gestureWalkthroughProceedClicks() {
        return gestureWalkthroughAdapter.proceedClicks();
    }

    @CheckResult
    public Observable<SubredditSubmissionThumbnailClickEvent> thumbnailClicks() {
        return submissionAdapter.thumbnailClicks();
    }

    @CheckResult
    public Observable<SwipeEvent> swipeEvents() {
        return submissionAdapter.swipeEvents();
    }

    @CheckResult
    public Observable<?> paginationFailureRetryClicks() {
        return paginationAdapter.failureRetryClicks();
    }

    @Override
    public long getItemId(int position) {
        return getItem(position).adapterId();
    }

    @Override
    public int getItemCountMinusDecorators() {
        int itemCount = getItemCount();
        if (itemCount > 1 && getItem(itemCount - 1).type() == SubmissionRowUiModel.Type.PAGINATION_FOOTER) {
            itemCount = itemCount - 1;
        }
        return itemCount;
    }

    @Override
    public int getItemViewType(int position) {
        return getItem(position).type().ordinal();
    }

    @Override
    protected RecyclerView.ViewHolder onCreateViewHolder(LayoutInflater inflater, ViewGroup parent, int viewType) {
        return childAdapters.get(VIEW_TYPES[viewType]).onCreateViewHolder(inflater, parent);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position, List<Object> payloads) {
        if (payloads.isEmpty()) {
            super.onBindViewHolder(holder, position, payloads);
        } else {
            // noinspection unchecked
            childAdapters.get(VIEW_TYPES[holder.getItemViewType()]).onBindViewHolder(holder, getItem(position), payloads);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        // noinspection unchecked
        childAdapters.get(VIEW_TYPES[holder.getItemViewType()]).onBindViewHolder(holder, getItem(position));
    }

    @Override
    public void accept(Pair<List<SubmissionRowUiModel>, DiffUtil.DiffResult> pair) {
        findCollidingIds(pair.first());
        updateData(pair.first());
        pair.second().dispatchUpda

tesTo(this);
    }

    @SuppressLint("UseSparseArrays")
    private static void findCollidingIds(List<SubmissionRowUiModel> rows) {
        Map<Long, SubmissionRowUiModel> ids = new HashMap<>(rows.size(), 1f);
        for (SubmissionRowUiModel row : rows) {
            if (ids.containsKey(row.adapterId())) {
                SubmissionRowUiModel existing = ids.get(row.adapterId());
                throw new AssertionError("ID collision between " + existing + " and " + row);
            }
            ids.put(row.adapterId(), row);
        }
    }
}


@SuppressWarnings("deprecation")
    public void hide()

package javax.swing;

import java.awt.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.ModalExclude;
import sun.awt.SunToolkit;

/**
 * Popups are used to display a Component to the user, typically
 * on top of all the other Components in a particular containment
 * hierarchy. Popups have a very small life cycle. Once you
 * have obtained a Popup, and hidden it (invoked the
 * hide method), you should no longer
 * invoke any methods on it. This allows the PopupFactory to cache
 * Popups for later use.
 *

 * The general contract is that if you need to change the size of the
 * Component, or location of the Popup, you should
 * obtain a new Popup.
 *

 * Popup does not descend from Component, rather
 * implementations of Popup are responsible for creating
 * and maintaining their own Components to render the
 * requested Component to the user.
 *

 * You typically do not explicitly create an instance of Popup,
 * instead obtain one from a PopupFactory.
 *
 * @see PopupFactory
 *
 * @since 1.4
 */
public class Popup {

    /**
     * The Component representing the Popup.
     */
    private Component component;

    /**
     * Creates a Popup for the Component owner
     * containing the Component contents. owner
     * is used to determine which Window the new
     * Popup will parent the Component the
     * Popup creates to.
     * A null owner implies there is no valid parent.
     * x and
     * y specify the preferred initial location to place
     * the Popup at. Based on screen size, or other paramaters,
     * the Popup may not display at x and
     * y.
     *
     * @param owner    Component mouse coordinates are relative to, may be null
     * @param contents Contents of the Popup
     * @param x        Initial x screen coordinate
     * @param y        Initial y screen coordinate
     * @exception IllegalArgumentException if contents is null
     */
    protected Popup(Component owner, Component contents, int x, int y) {
        this();
        if (contents == null) {
            throw new IllegalArgumentException("Contents must be non-null");
        }
        reset(owner, contents, x, y);
    }

    /**
     * Creates a Popup. This is provided for subclasses.
     */
    protected Popup() {
    }

    /**
     * Makes the Popup visible. If the Popup is
     * currently visible, this has no effect.
     */
    @SuppressWarnings("deprecation")
    public void show() {
        Component component = getComponent();
        if (component != null) {
            component.show();
        }
    }

    /**
     * Hides and disposes of the Popup. Once a Popup
     * has been disposed you should no longer invoke methods on it. A
     * disposed Popup may be reclaimed and later used
     * based on the PopupFactory. As such, if you invoke methods
     * on a disposed Popup, indeterminate
     * behavior will result.
     */

{
        Component component = getComponent();
        if (component instanceof JWindow) {
            component.hide();
            ((JWindow) component).getContentPane().removeAll();
        }
        dispose();
    }

    /**
     * Frees any resources the Popup may be holding onto.
     */
    void dispose() {
        Component component = getComponent();
        Window window = SwingUtilities.getWindowAncestor(component);
        if (component instanceof JWindow) {
            ((Window) component).dispose();
            component = null;
        }
        // If our parent is a DefaultFrame, we need to dispose it, too.
        if (window instanceof DefaultFrame) {
            window.dispose();
        }
    }

    /**
     * Resets the Popup to an initial state.
     */
    void reset(Component owner, Component contents, int ownerX, int ownerY) {
        if (getComponent() == null) {
            component = createComponent(owner);
        }
        Component c = getComponent();
        if (c instanceof JWindow) {
            JWindow component = (JWindow) getComponent();
            component.setLocation(ownerX, ownerY);
            component.getContentPane().add(contents, BorderLayout.CENTER);
            component.invalidate();
            component.validate();
            if (component.isVisible()) {
                // Do not call pack() if window is not visible to
                // avoid early native peer creation
                pack();
            }
        }
    }

    /**
     * Causes the Popup to be sized to fit the preferred size
     * of the Component it contains.
     */
    void pack() {
        Component component = getComponent();
        if (component instanceof Window) {
            ((Window) component).pack();
        }
    }

    /**
     * Returns the Window to use as the parent of the
     * Window created for the Popup. This creates
     * a new DefaultFrame, if necessary.
     */
    private Window getParentWindow(Component owner) {
        Window window = null;
        if (owner instanceof Window) {
            window = (Window) owner;
        } else if (owner != null) {
            window = SwingUtilities.getWindowAncestor(owner);
        }
        if (window == null) {
            window = new DefaultFrame();
        }
        return window;
    }

    /**
     * Creates the Component to use as the parent of the Popup.
     * The default implementation creates a Window, subclasses
     * should override.
     */
    Component createComponent(Component owner) {
        if (GraphicsEnvironment.isHeadless()) {
            // Generally not useful, bail.
            return null;
        }
        return new HeavyWeightWindow(getParentWindow(owner));
    }

    /**
     * Returns the Component returned from
     * createComponent that will hold the Popup.
     */
    Component getComponent() {
        return component;
    }

    /**
     * Component used to house window.
     */
    static class HeavyWeightWindow extends JWindow implements ModalExclude {

        HeavyWeightWindow(Window parent) {
            super(parent);
            setFocusableWindowState(false);
            if (AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> System.getProperty("jbre.popupwindow.settype") != null)) {
                setType(Window.Type.POPUP);
            }
            // Popups are typically transient and most likely won't benefit
            // from true double buffering.  Turn it off here.
            getRootPane().setUseTrueDoubleBuffering(false);
            // Try to set "always-on-top" for the popup window.
            // Applets usually don't have sufficient permissions to do it.
            // In this case simply ignore the exception.
            try {
                setAlwaysOnTop(true);
            } catch (SecurityException se) {
                // setAlwaysOnTop is restricted,
                // the exception is ignored
            }
        }

        public void update(Graphics g) {
            paint(g);
        }

        public void show() {
            this.pack();
            if (getWidth() > 0 && getHeight() > 0) {
                super.show();
            }
        }
    }

    /**
     * Used if no valid Window ancestor of the supplied owner is found.
     *

     * PopupFactory uses this as a way to know when the Popup shouldn't
     * be cached based on the Window.
     */
    static class DefaultFrame extends Frame {
    }
}


{
        Window window = null;
        if (owner instanceof Window) {
            window = (Window) owner;
        } else if (owner != null) {
            window = SwingUtilities.getWindowAncestor(owner);
        }
        if (window == null) {
            window = new DefaultFrame();
        }
        return window;
    }

package javax.swing;

import java.awt.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.ModalExclude;
import sun.awt.SunToolkit;

/**
 * Popups are used to display a Component to the user, typically
 * on top of all the other Components in a particular containment
 * hierarchy. Popups have a very small life cycle. Once you
 * have obtained a Popup, and hidden it (invoked the
 * hide method), you should no longer
 * invoke any methods on it. This allows the PopupFactory to cache
 * Popups for later use.
 *

 * The general contract is that if you need to change the size of the
 * Component, or location of the Popup, you should
 * obtain a new Popup.
 *

 * Popup does not descend from Component, rather
 * implementations of Popup are responsible for creating
 * and maintaining their own Components to render the
 * requested Component to the user.
 *

 * You typically do not explicitly create an instance of Popup,
 * instead obtain one from a PopupFactory.
 *
 * @see PopupFactory
 *
 * @since 1.4
 */
public class Popup {

    /**
     * The Component representing the Popup.
     */
    private Component component;

    /**
     * Creates a Popup for the Component owner
     * containing the Component contents. owner
     * is used to determine which Window the new
     * Popup will parent the Component the
     * Popup creates to.
     * A null owner implies there is no valid parent.
     * x and
     * y specify the preferred initial location to place
     * the Popup at. Based on screen size, or other paramaters,
     * the Popup may not display at x and
     * y.
     *
     * @param owner    Component mouse coordinates are relative to, may be null
     * @param contents Contents of the Popup
     * @param x        Initial x screen coordinate
     * @param y        Initial y screen coordinate
     * @exception IllegalArgumentException if contents is null
     */
    protected Popup(Component owner, Component contents, int x, int y) {
        this();
        if (contents == null) {
            throw new IllegalArgumentException("Contents must be non-null");
        }
        reset(owner, contents, x, y);
    }

    /**
     * Creates a Popup. This is provided for subclasses.
     */
    protected Popup() {
    }

    /**
     * Makes the Popup visible. If the Popup is
     * currently visible, this has no effect.
     */
    @SuppressWarnings("deprecation")
    public void show() {
        Component component = getComponent();
        if (component != null) {
            component.show();
        }
    }

    /**
     * Hides and disposes of the Popup. Once a Popup
     * has been disposed you should no longer invoke methods on it. A
     * disposed Popup may be reclaimed and later used
     * based on the PopupFactory. As such, if you invoke methods
     * on a disposed Popup, indeterminate
     * behavior will result.
     */
    @SuppressWarnings("deprecation")
    public void hide() {
        Component component = getComponent();
        if (component instanceof JWindow) {
            component.hide();
            ((JWindow) component).getContentPane().removeAll();
        }
        dispose();
    }

    /**
     * Frees any resources the Popup may be holding onto.
     */
    void dispose() {
        Component component = getComponent();
        Window window = SwingUtilities.getWindowAncestor(component);
        if (component instanceof JWindow) {
            ((Window) component).dispose();
            component = null;
        }
        // If our parent is a DefaultFrame, we need to dispose it, too.
        if (window instanceof DefaultFrame) {
            window.dispose();
        }
    }

    /**
     * Resets the Popup to an initial state.
     */
    void reset(Component owner, Component contents, int ownerX, int ownerY) {
        if (getComponent() == null) {
            component = createComponent(owner);
        }
        Component c = getComponent();
        if (c instanceof JWindow) {
            JWindow component = (JWindow) getComponent();
            component.setLocation(ownerX, ownerY);
            component.getContentPane().add(contents, BorderLayout.CENTER);
            component.invalidate();
            component.validate();
            if (component.isVisible()) {
                // Do not call pack() if window is not visible to
                // avoid early native peer creation
                pack();
            }
        }
    }

    /**
     * Causes the Popup to be sized to fit the preferred size
     * of the Component it contains.
     */
    void pack() {
        Component component = getComponent();
        if (component instanceof Window) {
            ((Window) component).pack();
        }
    }

    /**
     * Returns the Window to use as the parent of the
     * Window created for the Popup. This creates
     * a new DefaultFrame, if necessary.
     */
    private Window getParentWindow(Component owner)

/**
     * Creates the Component to use as the parent of the Popup.
     * The default implementation creates a Window, subclasses
     * should override.
     */
    Component createComponent(Component owner) {
        if (GraphicsEnvironment.isHeadless()) {
            // Generally not useful, bail.
            return null;
        }
        return new HeavyWeightWindow(getParentWindow(owner));
    }

    /**
     * Returns the Component returned from
     * createComponent that will hold the Popup.
     */
    Component getComponent() {
        return component;
    }

    /**
     * Component used to house window.
     */
    static class HeavyWeightWindow extends JWindow implements ModalExclude {

        HeavyWeightWindow(Window parent) {
            super(parent);
            setFocusableWindowState(false);
            if (AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> System.getProperty("jbre.popupwindow.settype") != null)) {
                setType(Window.Type.POPUP);
            }
            // Popups are typically transient and most likely won't benefit
            // from true double buffering.  Turn it off here.
            getRootPane().setUseTrueDoubleBuffering(false);
            // Try to set "always-on-top" for the popup window.
            // Applets usually don't have sufficient permissions to do it.
            // In this case simply ignore the exception.
            try {
                setAlwaysOnTop(true);
            } catch (SecurityException se) {
                // setAlwaysOnTop is restricted,
                // the exception is ignored
            }
        }

        public void update(Graphics g) {
            paint(g);
        }

        public void show() {
            this.pack();
            if (getWidth() > 0 && getHeight() > 0) {
                super.show();
            }
        }
    }

    /**
     * Used if no valid Window ancestor of the supplied owner is found.
     *

     * PopupFactory uses this as a way to know when the Popup shouldn't
     * be cached based on the Window.
     */
    static class DefaultFrame extends Frame {
    }
}


        if (GraphicsEnvironment.isHeadless()) {
            // Generally not useful, bail.
            return null;
        }

package javax.swing;

import java.awt.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.ModalExclude;
import sun.awt.SunToolkit;

/**
 * Popups are used to display a Component to the user, typically
 * on top of all the other Components in a particular containment
 * hierarchy. Popups have a very small life cycle. Once you
 * have obtained a Popup, and hidden it (invoked the
 * hide method), you should no longer
 * invoke any methods on it. This allows the PopupFactory to cache
 * Popups for later use.
 *

 * The general contract is that if you need to change the size of the
 * Component, or location of the Popup, you should
 * obtain a new Popup.
 *

 * Popup does not descend from Component, rather
 * implementations of Popup are responsible for creating
 * and maintaining their own Components to render the
 * requested Component to the user.
 *

 * You typically do not explicitly create an instance of Popup,
 * instead obtain one from a PopupFactory.
 *
 * @see PopupFactory
 *
 * @since 1.4
 */
public class Popup {

    /**
     * The Component representing the Popup.
     */
    private Component component;

    /**
     * Creates a Popup for the Component owner
     * containing the Component contents. owner
     * is used to determine which Window the new
     * Popup will parent the Component the
     * Popup creates to.
     * A null owner implies there is no valid parent.
     * x and
     * y specify the preferred initial location to place
     * the Popup at. Based on screen size, or other paramaters,
     * the Popup may not display at x and
     * y.
     *
     * @param owner    Component mouse coordinates are relative to, may be null
     * @param contents Contents of the Popup
     * @param x        Initial x screen coordinate
     * @param y        Initial y screen coordinate
     * @exception IllegalArgumentException if contents is null
     */
    protected Popup(Component owner, Component contents, int x, int y) {
        this();
        if (contents == null) {
            throw new IllegalArgumentException("Contents must be non-null");
        }
        reset(owner, contents, x, y);
    }

    /**
     * Creates a Popup. This is provided for subclasses.
     */
    protected Popup() {
    }

    /**
     * Makes the Popup visible. If the Popup is
     * currently visible, this has no effect.
     */
    @SuppressWarnings("deprecation")
    public void show() {
        Component component = getComponent();
        if (component != null) {
            component.show();
        }
    }

    /**
     * Hides and disposes of the Popup. Once a Popup
     * has been disposed you should no longer invoke methods on it. A
     * disposed Popup may be reclaimed and later used
     * based on the PopupFactory. As such, if you invoke methods
     * on a disposed Popup, indeterminate
     * behavior will result.
     */
    @SuppressWarnings("deprecation")
    public void hide() {
        Component component = getComponent();
        if (component instanceof JWindow) {
            component.hide();
            ((JWindow) component).getContentPane().removeAll();
        }
        dispose();
    }

    /**
     * Frees any resources the Popup may be holding onto.
     */
    void dispose() {
        Component component = getComponent();
        Window window = SwingUtilities.getWindowAncestor(component);
        if (component instanceof JWindow) {
            ((Window) component).dispose();
            component = null;
        }
        // If our parent is a DefaultFrame, we need to dispose it, too.
        if (window instanceof DefaultFrame) {
            window.dispose();
        }
    }

    /**
     * Resets the Popup to an initial state.
     */
    void reset(Component owner, Component contents, int ownerX, int ownerY) {
        if (getComponent() == null) {
            component = createComponent(owner);
        }
        Component c = getComponent();
        if (c instanceof JWindow) {
            JWindow component = (JWindow) getComponent();
            component.setLocation(ownerX, ownerY);
            component.getContentPane().add(contents, BorderLayout.CENTER);
            component.invalidate();
            component.validate();
            if (component.isVisible()) {
                // Do not call pack() if window is not visible to
                // avoid early native peer creation
                pack();
            }
        }
    }

    /**
     * Causes the Popup to be sized to fit the preferred size
     * of the Component it contains.
     */
    void pack() {
        Component component = getComponent();
        if (component instanceof Window) {
            ((Window) component).pack();
        }
    }

    /**
     * Returns the Window to use as the parent of the
     * Window created for the Popup. This creates
     * a new DefaultFrame, if necessary.
     */
    private Window getParentWindow(Component owner) {
        Window window = null;
        if (owner instanceof Window) {
            window = (Window) owner;
        } else if (owner != null) {
            window = SwingUtilities.getWindowAncestor(owner);
        }
        if (window == null) {
            window = new DefaultFrame();
        }
        return window;
    }

    /**
     * Creates the Component to use as the parent of the Popup.
     * The default implementation creates a Window, subclasses
     * should override.
     */
    Component createComponent(Component owner) {

return new HeavyWeightWindow(getParentWindow(owner));
    }

    /**
     * Returns the Component returned from
     * createComponent that will hold the Popup.
     */
    Component getComponent() {
        return component;
    }

    /**
     * Component used to house window.
     */
    static class HeavyWeightWindow extends JWindow implements ModalExclude {

        HeavyWeightWindow(Window parent) {
            super(parent);
            setFocusableWindowState(false);
            if (AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> System.getProperty("jbre.popupwindow.settype") != null)) {
                setType(Window.Type.POPUP);
            }
            // Popups are typically transient and most likely won't benefit
            // from true double buffering.  Turn it off here.
            getRootPane().setUseTrueDoubleBuffering(false);
            // Try to set "always-on-top" for the popup window.
            // Applets usually don't have sufficient permissions to do it.
            // In this case simply ignore the exception.
            try {
                setAlwaysOnTop(true);
            } catch (SecurityException se) {
                // setAlwaysOnTop is restricted,
                // the exception is ignored
            }
        }

        public void update(Graphics g) {
            paint(g);
        }

        public void show() {
            this.pack();
            if (getWidth() > 0 && getHeight() > 0) {
                super.show();
            }
        }
    }

    /**
     * Used if no valid Window ancestor of the supplied owner is found.
     *

     * PopupFactory uses this as a way to know when the Popup shouldn't
     * be cached based on the Window.
     */
    static class DefaultFrame extends Frame {
    }
}


package javax.swing;

import java.awt.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.ModalExclude;
import sun.awt.SunToolkit;

/**
 * Popups are used to display a Component to the user, typically
 * on top of all the other Components in a particular containment
 * hierarchy. Popups have a very small life cycle. Once you
 * have obtained a Popup, and hidden it (invoked the
 * hide method), you should no longer
 * invoke any methods on it. This allows the PopupFactory to cache
 * Popups for later use.
 *

 * The general contract is that if you need to change the size of the
 * Component, or location of the Popup, you should
 * obtain a new Popup.
 *

 * Popup does not descend from Component, rather
 * implementations of Popup are responsible for creating
 * and maintaining their own Components to render the
 * requested Component to the user.
 *

 * You typically do not explicitly create an instance of Popup,
 * instead obtain one from a PopupFactory.
 *
 * @see PopupFactory
 *
 * @since 1.4
 */
public class Popup {

    /**
     * The Component representing the Popup.
     */
    private Component component;

    /**
     * Creates a Popup for the Component owner
     * containing the Component contents. owner
     * is used to determine which Window the new
     * Popup will parent the Component the
     * Popup creates to.
     * A null owner implies there is no valid parent.
     * x and
     * y specify the preferred initial location to place
     * the Popup at. Based on screen size, or other paramaters,
     * the Popup may not display at x and
     * y.
     *
     * @param owner    Component mouse coordinates are relative to, may be null
     * @param contents Contents of the Popup
     * @param x        Initial x screen coordinate
     * @param y        Initial y screen coordinate
     * @exception IllegalArgumentException if contents is null
     */
    protected Popup(Component owner, Component contents, int x, int y) {
        this();
        if (contents == null) {
            throw new IllegalArgumentException("Contents must be non-null");
        }
        reset(owner, contents, x, y);
    }

    /**
     * Creates a Popup. This is provided for subclasses.
     */
    protected Popup() {
    }

    /**
     * Makes the Popup visible. If the Popup is
     * currently visible, this has no effect.
     */
    @SuppressWarnings("deprecation")
    public void show() {
        Component component = getComponent();
        if (component != null) {
            component.show();
        }
    }

    /**
     * Hides and disposes of the Popup. Once a Popup
     * has been disposed you should no longer invoke methods on it. A
     * disposed Popup may be reclaimed and later used
     * based on the PopupFactory. As such, if you invoke methods
     * on a disposed Popup, indeterminate
     * behavior will result.
     */
    @SuppressWarnings("deprecation")
    public void hide() {
        Component component = getComponent();
        if (component instanceof JWindow) {
            component.hide();
            ((JWindow) component).getContentPane().removeAll();
        }
        dispose();
    }

    /**
     * Frees any resources the Popup may be holding onto.
     */
    void dispose() {
        Component component = getComponent();
        Window window = SwingUtilities.getWindowAncestor(component);
        if (component instanceof JWindow) {
            ((Window) component).dispose();
            component = null;
        }
        // If our parent is a DefaultFrame, we need to dispose it, too.
        if (window instanceof DefaultFrame) {
            window.dispose();
        }
    }

    /**
     * Resets the Popup to an initial state.
     */
    void reset(Component owner, Component contents, int ownerX, int ownerY) {
        if (getComponent() == null) {
            component = createComponent(owner);
        }
        Component c = getComponent();
        if (c instanceof JWindow) {
            JWindow component = (JWindow) getComponent();
            component.setLocation(ownerX, ownerY);
            component.getContentPane().add(contents, BorderLayout.CENTER);
            component.invalidate();
            component.validate();
            if (component.isVisible()) {
                // Do not call pack() if window is not visible to
                // avoid early native peer creation
                pack();
            }
        }
    }

    /**
     * Causes the Popup to be sized to fit the preferred size
     * of the Component it contains.
     */
    void pack() {
        Component component = getComponent();
        if (component instanceof Window) {
            ((Window) component).pack();
        }
    }

    /**
     * Returns the Window to use as the parent of the
     * Window created for the Popup. This creates
     * a new DefaultFrame, if necessary.
     */
    private Window getParentWindow(Component owner) {
        Window window = null;
        if (owner instanceof Window) {
            window = (Window) owner;
        } else if (owner != null) {
            window = SwingUtilities.getWindowAncestor(owner);
        }
        if (window == null) {
            window = new DefaultFrame();
        }
        return window;
    }

    /**
     * Creates the Component to use as the parent of the Popup.
     * The default implementation creates a Window, subclasses
     * should override.
     */
    Component createComponent(Component owner) {
        if (GraphicsEnvironment.isHeadless()) {
            // Generally not useful, bail.
            return null;
        }

}

    /**
     * Returns the Component returned from
     * createComponent that will hold the Popup.
     */
    Component getComponent() {
        return component;
    }

    /**
     * Component used to house window.
     */
    static class HeavyWeightWindow extends JWindow implements ModalExclude {

        HeavyWeightWindow(Window parent) {
            super(parent);
            setFocusableWindowState(false);
            if (AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> System.getProperty("jbre.popupwindow.settype") != null)) {
                setType(Window.Type.POPUP);
            }
            // Popups are typically transient and most likely won't benefit
            // from true double buffering.  Turn it off here.
            getRootPane().setUseTrueDoubleBuffering(false);
            // Try to set "always-on-top" for the popup window.
            // Applets usually don't have sufficient permissions to do it.
            // In this case simply ignore the exception.
            try {
                setAlwaysOnTop(true);
            } catch (SecurityException se) {
                // setAlwaysOnTop is restricted,
                // the exception is ignored
            }
        }

        public void update(Graphics g) {
            paint(g);
        }

        public void show() {
            this.pack();
            if (getWidth() > 0 && getHeight() > 0) {
                super.show();
            }
        }
    }

    /**
     * Used if no valid Window ancestor of the supplied owner is found.
     *

     * PopupFactory uses this as a way to know when the Popup shouldn't
     * be cached based on the Window.
     */
    static class DefaultFrame extends Frame {
    }
}


package javax.swing;

import java.awt.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.ModalExclude;
import sun.awt.SunToolkit;

/**
 * Popups are used to display a Component to the user, typically
 * on top of all the other Components in a particular containment
 * hierarchy. Popups have a very small life cycle. Once you
 * have obtained a Popup, and hidden it (invoked the
 * hide method), you should no longer
 * invoke any methods on it. This allows the PopupFactory to cache
 * Popups for later use.
 *

 * The general contract is that if you need to change the size of the
 * Component, or location of the Popup, you should
 * obtain a new Popup.
 *

 * Popup does not descend from Component, rather
 * implementations of Popup are responsible for creating
 * and maintaining their own Components to render the
 * requested Component to the user.
 *

 * You typically do not explicitly create an instance of Popup,
 * instead obtain one from a PopupFactory.
 *
 * @see PopupFactory
 *
 * @since 1.4
 */
public class Popup {

    /**
     * The Component representing the Popup.
     */
    private Component component;

    /**
     * Creates a Popup for the Component owner
     * containing the Component contents. owner
     * is used to determine which Window the new
     * Popup will parent the Component the
     * Popup creates to.
     * A null owner implies there is no valid parent.
     * x and
     * y specify the preferred initial location to place
     * the Popup at. Based on screen size, or other paramaters,
     * the Popup may not display at x and
     * y.
     *
     * @param owner    Component mouse coordinates are relative to, may be null
     * @param contents Contents of the Popup
     * @param x        Initial x screen coordinate
     * @param y        Initial y screen coordinate
     * @exception IllegalArgumentException if contents is null
     */
    protected Popup(Component owner, Component contents, int x, int y) {
        this();
        if (contents == null) {
            throw new IllegalArgumentException("Contents must be non-null");
        }
        reset(owner, contents, x, y);
    }

    /**
     * Creates a Popup. This is provided for subclasses.
     */
    protected Popup() {
    }

    /**
     * Makes the Popup visible. If the Popup is
     * currently visible, this has no effect.
     */
    @SuppressWarnings("deprecation")
    public void show() {
        Component component = getComponent();
        if (component != null) {
            component.show();
        }
    }

    /**
     * Hides and disposes of the Popup. Once a Popup
     * has been disposed you should no longer invoke methods on it. A
     * disposed Popup may be reclaimed and later used
     * based on the PopupFactory. As such, if you invoke methods
     * on a disposed Popup, indeterminate
     * behavior will result.
     */
    @SuppressWarnings("deprecation")
    public void hide() {
        Component component = getComponent();
        if (component instanceof JWindow) {
            component.hide();
            ((JWindow) component).getContentPane().removeAll();
        }
        dispose();
    }

    /**
     * Frees any resources the Popup may be holding onto.
     */
    void dispose() {
        Component component = getComponent();
        Window window = SwingUtilities.getWindowAncestor(component);
        if (component instanceof JWindow) {
            ((Window) component).dispose();
            component = null;
        }
        // If our parent is a DefaultFrame, we need to dispose it, too.
        if (window instanceof DefaultFrame) {
            window.dispose();
        }
    }

    /**
     * Resets the Popup to an initial state.
     */
    void reset(Component owner, Component contents, int ownerX, int ownerY) {
        if (getComponent() == null) {
            component = createComponent(owner);
        }
        Component c = getComponent();
        if (c instanceof JWindow) {
            JWindow component = (JWindow) getComponent();
            component.setLocation(ownerX, ownerY);
            component.getContentPane().add(contents, BorderLayout.CENTER);
            component.invalidate();
            component.validate();
            if (component.isVisible()) {
                // Do not call pack() if window is not visible to
                // avoid early native peer creation
                pack();
            }
        }
    }

    /**
     * Causes the Popup to be sized to fit the preferred size
     * of the Component it contains.
     */
    void pack() {
        Component component = getComponent();
        if (component instanceof Window) {
            ((Window) component).pack();
        }
    }

    /**
     * Returns the Window to use as the parent of the
     * Window created for the Popup. This creates
     * a new DefaultFrame, if necessary.
     */
    private Window getParentWindow(Component owner) {
        Window window = null;
        if (owner instanceof Window) {
            window = (Window) owner;
        } else if (owner != null) {
            window = SwingUtilities.getWindowAncestor(owner);
        }
        if (window == null) {
            window = new DefaultFrame();
        }
        return window;
    }

    /**
     * Creates the Component to use as the parent of the Popup.
     * The default implementation creates a Window, subclasses
     * should override.
     */
    Component createComponent(Component owner) {
        if (GraphicsEnvironment.isHeadless()) {
            // Generally not useful, bail.
            return null;
        }
        return new HeavyWeightWindow(getParentWindow(owner));

/**
     * Returns the Component returned from
     * createComponent that will hold the Popup.
     */
    Component getComponent() {
        return component;
    }

    /**
     * Component used to house window.
     */
    static class HeavyWeightWindow extends JWindow implements ModalExclude {

        HeavyWeightWindow(Window parent) {
            super(parent);
            setFocusableWindowState(false);
            if (AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> System.getProperty("jbre.popupwindow.settype") != null)) {
                setType(Window.Type.POPUP);
            }
            // Popups are typically transient and most likely won't benefit
            // from true double buffering.  Turn it off here.
            getRootPane().setUseTrueDoubleBuffering(false);
            // Try to set "always-on-top" for the popup window.
            // Applets usually don't have sufficient permissions to do it.
            // In this case simply ignore the exception.
            try {
                setAlwaysOnTop(true);
            } catch (SecurityException se) {
                // setAlwaysOnTop is restricted,
                // the exception is ignored
            }
        }

        public void update(Graphics g) {
            paint(g);
        }

        public void show() {
            this.pack();
            if (getWidth() > 0 && getHeight() > 0) {
                super.show();
            }
        }
    }

    /**
     * Used if no valid Window ancestor of the supplied owner is found.
     *

     * PopupFactory uses this as a way to know when the Popup shouldn't
     * be cached based on the Window.
     */
    static class DefaultFrame extends Frame {
    }
}


package javax.swing;

import java.awt.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.ModalExclude;
import sun.awt.SunToolkit;

/**
 * Popups are used to display a Component to the user, typically
 * on top of all the other Components in a particular containment
 * hierarchy. Popups have a very small life cycle. Once you
 * have obtained a Popup, and hidden it (invoked the
 * hide method), you should no longer
 * invoke any methods on it. This allows the PopupFactory to cache
 * Popups for later use.
 *

 * The general contract is that if you need to change the size of the
 * Component, or location of the Popup, you should
 * obtain a new Popup.
 *

 * Popup does not descend from Component, rather
 * implementations of Popup are responsible for creating
 * and maintaining their own Components to render the
 * requested Component to the user.
 *

 * You typically do not explicitly create an instance of Popup,
 * instead obtain one from a PopupFactory.
 *
 * @see PopupFactory
 *
 * @since 1.4
 */
public class Popup {

    /**
     * The Component representing the Popup.
     */
    private Component component;

    /**
     * Creates a Popup for the Component owner
     * containing the Component contents. owner
     * is used to determine which Window the new
     * Popup will parent the Component the
     * Popup creates to.
     * A null owner implies there is no valid parent.
     * x and
     * y specify the preferred initial location to place
     * the Popup at. Based on screen size, or other paramaters,
     * the Popup may not display at x and
     * y.
     *
     * @param owner    Component mouse coordinates are relative to, may be null
     * @param contents Contents of the Popup
     * @param x        Initial x screen coordinate
     * @param y        Initial y screen coordinate
     * @exception IllegalArgumentException if contents is null
     */
    protected Popup(Component owner, Component contents, int x, int y) {
        this();
        if (contents == null) {
            throw new IllegalArgumentException("Contents must be non-null");
        }
        reset(owner, contents, x, y);
    }

    /**
     * Creates a Popup. This is provided for subclasses.
     */
    protected Popup() {
    }

    /**
     * Makes the Popup visible. If the Popup is
     * currently visible, this has no effect.
     */
    @SuppressWarnings("deprecation")
    public void show() {
        Component component = getComponent();
        if (component != null) {
            component.show();
        }
    }

    /**
     * Hides and disposes of the Popup. Once a Popup
     * has been disposed you should no longer invoke methods on it. A
     * disposed Popup may be reclaimed and later used
     * based on the PopupFactory. As such, if you invoke methods
     * on a disposed Popup, indeterminate
     * behavior will result.
     */
    @SuppressWarnings("deprecation")
    public void hide() {
        Component component = getComponent();
        if (component instanceof JWindow) {
            component.hide();
            ((JWindow) component).getContentPane().removeAll();
        }
        dispose();
    }

    /**
     * Frees any resources the Popup may be holding onto.
     */
    void dispose() {
        Component component = getComponent();
        Window window = SwingUtilities.getWindowAncestor(component);
        if (component instanceof JWindow) {
            ((Window) component).dispose();
            component = null;
        }
        // If our parent is a DefaultFrame, we need to dispose it, too.
        if (window instanceof DefaultFrame) {
            window.dispose();
        }
    }

    /**
     * Resets the Popup to an initial state.
     */
    void reset(Component owner, Component contents, int ownerX, int ownerY) {
        if (getComponent() == null) {
            component = createComponent(owner);
        }
        Component c = getComponent();
        if (c instanceof JWindow) {
            JWindow component = (JWindow) getComponent();
            component.setLocation(ownerX, ownerY);
            component.getContentPane().add(contents, BorderLayout.CENTER);
            component.invalidate();
            component.validate();
            if (component.isVisible()) {
                // Do not call pack() if window is not visible to
                // avoid early native peer creation
                pack();
            }
        }
    }

    /**
     * Causes the Popup to be sized to fit the preferred size
     * of the Component it contains.
     */
    void pack() {
        Component component = getComponent();
        if (component instanceof Window) {
            ((Window) component).pack();
        }
    }

    /**
     * Returns the Window to use as the parent of the
     * Window created for the Popup. This creates
     * a new DefaultFrame, if necessary.
     */
    private Window getParentWindow(Component owner) {
        Window window = null;
        if (owner instanceof Window) {
            window = (Window) owner;
        } else if (owner != null) {
            window = SwingUtilities.getWindowAncestor(owner);
        }
        if (window == null) {
            window = new DefaultFrame();
        }
        return window;
    }

    /**
     * Creates the Component to use as the parent of the Popup.
     * The default implementation creates a Window, subclasses
     * should override.
     */
    Component createComponent(Component owner) {
        if (GraphicsEnvironment.isHeadless()) {
            // Generally not useful, bail.
            return null;
        }
        return new HeavyWeightWindow(getParentWindow(owner));
    }

    /**
     * Returns the Component returned from
     * createComponent that will hold the Popup.
     */
    Component getComponent() {
        return component;
    }

    /**
     * Component used to house window.
     */
    static class HeavyWeightWindow extends JWindow implements ModalExclude {

        HeavyWeightWindow(Window parent) {
            super(parent);
            setFocusableWindowState(false);
            if (AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> System.getProperty("jbre.popupwindow.settype") != null)) {
                setType(Window.Type.POPUP);
            }
            // Popups are typically transient and most likely won't benefit
            // from true double buffering.  Turn it off here.
            getRootPane().setUseTrueDoubleBuffering(false);
            // Try to set "always-on-top" for the popup window.
            // Applets usually don't have sufficient permissions to do it.
            // In this case simply ignore the exception.
            try {
                setAlwaysOnTop(true);
            } catch (SecurityException se) {
                // setAlwaysOnTop is restricted,
                // the exception is ignored
            }
        }

        public void update(Graphics g) {
            paint(

        }

        public void show() {
            this.pack();
            if (getWidth() > 0 && getHeight() > 0) {
                super.show();
            }
        }
    }

    /**
     * Used if no valid Window ancestor of the supplied owner is found.
     * <p>
     * PopupFactory uses this as a way to know when the Popup shouldn't
     * be cached based on the Window.
     */
    static class DefaultFrame extends Frame {
    }
}


Component getComponent() {
        return component;
    }

package javax.swing;

import java.awt.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.ModalExclude;
import sun.awt.SunToolkit;

/**
 * Popups are used to display a Component to the user, typically
 * on top of all the other Components in a particular containment
 * hierarchy. Popups have a very small life cycle. Once you
 * have obtained a Popup, and hidden it (invoked the
 * hide method), you should no longer
 * invoke any methods on it. This allows the PopupFactory to cache
 * Popups for later use.
 *

 * The general contract is that if you need to change the size of the
 * Component, or location of the Popup, you should
 * obtain a new Popup.
 *

 * Popup does not descend from Component, rather
 * implementations of Popup are responsible for creating
 * and maintaining their own Components to render the
 * requested Component to the user.
 *

 * You typically do not explicitly create an instance of Popup,
 * instead obtain one from a PopupFactory.
 *
 * @see PopupFactory
 *
 * @since 1.4
 */
public class Popup {

    /**
     * The Component representing the Popup.
     */
    private Component component;

    /**
     * Creates a Popup for the Component owner
     * containing the Component contents. owner
     * is used to determine which Window the new
     * Popup will parent the Component the
     * Popup creates to.
     * A null owner implies there is no valid parent.
     * x and
     * y specify the preferred initial location to place
     * the Popup at. Based on screen size, or other paramaters,
     * the Popup may not display at x and
     * y.
     *
     * @param owner    Component mouse coordinates are relative to, may be null
     * @param contents Contents of the Popup
     * @param x        Initial x screen coordinate
     * @param y        Initial y screen coordinate
     * @exception IllegalArgumentException if contents is null
     */
    protected Popup(Component owner, Component contents, int x, int y) {
        this();
        if (contents == null) {
            throw new IllegalArgumentException("Contents must be non-null");
        }
        reset(owner, contents, x, y);
    }

    /**
     * Creates a Popup. This is provided for subclasses.
     */
    protected Popup() {
    }

    /**
     * Makes the Popup visible. If the Popup is
     * currently visible, this has no effect.
     */
    @SuppressWarnings("deprecation")
    public void show() {
        Component component = getComponent();
        if (component != null) {
            component.show();
        }
    }

    /**
     * Hides and disposes of the Popup. Once a Popup
     * has been disposed you should no longer invoke methods on it. A
     * disposed Popup may be reclaimed and later used
     * based on the PopupFactory. As such, if you invoke methods
     * on a disposed Popup, indeterminate
     * behavior will result.
     */
    @SuppressWarnings("deprecation")
    public void hide() {
        Component component = getComponent();
        if (component instanceof JWindow) {
            component.hide();
            ((JWindow) component).getContentPane().removeAll();
        }
        dispose();
    }

    /**
     * Frees any resources the Popup may be holding onto.
     */
    void dispose() {
        Component component = getComponent();
        Window window = SwingUtilities.getWindowAncestor(component);
        if (component instanceof JWindow) {
            ((Window) component).dispose();
            component = null;
        }
        // If our parent is a DefaultFrame, we need to dispose it, too.
        if (window instanceof DefaultFrame) {
            window.dispose();
        }
    }

    /**
     * Resets the Popup to an initial state.
     */
    void reset(Component owner, Component contents, int ownerX, int ownerY) {
        if (getComponent() == null) {
            component = createComponent(owner);
        }
        Component c = getComponent();
        if (c instanceof JWindow) {
            JWindow component = (JWindow) getComponent();
            component.setLocation(ownerX, ownerY);
            component.getContentPane().add(contents, BorderLayout.CENTER);
            component.invalidate();
            component.validate();
            if (component.isVisible()) {
                // Do not call pack() if window is not visible to
                // avoid early native peer creation
                pack();
            }
        }
    }

    /**
     * Causes the Popup to be sized to fit the preferred size
     * of the Component it contains.
     */
    void pack() {
        Component component = getComponent();
        if (component instanceof Window) {
            ((Window) component).pack();
        }
    }

    /**
     * Returns the Window to use as the parent of the
     * Window created for the Popup. This creates
     * a new DefaultFrame, if necessary.
     */
    private Window getParentWindow(Component owner) {
        Window window = null;
        if (owner instanceof Window) {
            window = (Window) owner;
        } else if (owner != null) {
            window = SwingUtilities.getWindowAncestor(owner);
        }
        if (window == null) {
            window = new DefaultFrame();
        }
        return window;
    }

    /**
     * Creates the Component to use as the parent of the Popup.
     * The default implementation creates a Window, subclasses
     * should override.
     */
    Component createComponent(Component owner) {
        if (GraphicsEnvironment.isHeadless()) {
            // Generally not useful, bail.
            return null;
        }
        return new HeavyWeightWindow(getParentWindow(owner));
    }

    /**
     * Returns the Component returned from
     * createComponent that will hold the Popup.
     */

    /**
     * Component used to house window.
     */
    static class HeavyWeightWindow extends JWindow implements ModalExclude {

        HeavyWeightWindow(Window parent) {
            super(parent);
            setFocusableWindowState(false);
            if (AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> System.getProperty("jbre.popupwindow.settype") != null)) {
                setType(Window.Type.POPUP);
            }
            // Popups are typically transient and most likely won't benefit
            // from true double buffering.  Turn it off here.
            getRootPane().setUseTrueDoubleBuffering(false);
            // Try to set "always-on-top" for the popup window.
            // Applets usually don't have sufficient permissions to do it.
            // In this case simply ignore the exception.
            try {
                setAlwaysOnTop(true);
            } catch (SecurityException se) {
                // setAlwaysOnTop is restricted,
                // the exception is ignored
            }
        }

        public void update(Graphics g) {
            paint(g);
        }

        public void show() {
            this.pack();
            if (getWidth() > 0 && getHeight() > 0) {
                super.show();
            }
        }
    }

    /**
     * Used if no valid Window ancestor of the supplied owner is found.
     * <p>
     * PopupFactory uses this as a way to know when the Popup shouldn't
     * be cached based on the Window.
     */
    static class DefaultFrame extends Frame {
    }
}


if (window == null) {
            window = new DefaultFrame();
        }

package javax.swing;

import java.awt.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.ModalExclude;
import sun.awt.SunToolkit;

/**
 * Popups are used to display a Component to the user, typically
 * on top of all the other Components in a particular containment
 * hierarchy. Popups have a very small life cycle. Once you
 * have obtained a Popup, and hidden it (invoked the
 * hide method), you should no longer
 * invoke any methods on it. This allows the PopupFactory to cache
 * Popups for later use.
 *

 * The general contract is that if you need to change the size of the
 * Component, or location of the Popup, you should
 * obtain a new Popup.
 *

 * Popup does not descend from Component, rather
 * implementations of Popup are responsible for creating
 * and maintaining their own Components to render the
 * requested Component to the user.
 *

 * You typically do not explicitly create an instance of Popup,
 * instead obtain one from a PopupFactory.
 *
 * @see PopupFactory
 *
 * @since 1.4
 */
public class Popup {

    /**
     * The Component representing the Popup.
     */
    private Component component;

    /**
     * Creates a Popup for the Component owner
     * containing the Component contents. owner
     * is used to determine which Window the new
     * Popup will parent the Component the
     * Popup creates to.
     * A null owner implies there is no valid parent.
     * x and
     * y specify the preferred initial location to place
     * the Popup at. Based on screen size, or other paramaters,
     * the Popup may not display at x and
     * y.
     *
     * @param owner    Component mouse coordinates are relative to, may be null
     * @param contents Contents of the Popup
     * @param x        Initial x screen coordinate
     * @param y        Initial y screen coordinate
     * @exception IllegalArgumentException if contents is null
     */
    protected Popup(Component owner, Component contents, int x, int y) {
        this();
        if (contents == null) {
            throw new IllegalArgumentException("Contents must be non-null");
        }
        reset(owner, contents, x, y);
    }

    /**
     * Creates a Popup. This is provided for subclasses.
     */
    protected Popup() {
    }

    /**
     * Makes the Popup visible. If the Popup is
     * currently visible, this has no effect.
     */
    @SuppressWarnings("deprecation")
    public void show() {
        Component component = getComponent();
        if (component != null) {
            component.show();
        }
    }

    /**
     * Hides and disposes of the Popup. Once a Popup
     * has been disposed you should no longer invoke methods on it. A
     * disposed Popup may be reclaimed and later used
     * based on the PopupFactory. As such, if you invoke methods
     * on a disposed Popup, indeterminate
     * behavior will result.
     */
    @SuppressWarnings("deprecation")
    public void hide() {
        Component component = getComponent();
        if (component instanceof JWindow) {
            component.hide();
            ((JWindow) component).getContentPane().removeAll();
        }
        dispose();
    }

    /**
     * Frees any resources the Popup may be holding onto.
     */
    void dispose() {
        Component component = getComponent();
        Window window = SwingUtilities.getWindowAncestor(component);
        if (component instanceof JWindow) {
            ((Window) component).dispose();
            component = null;
        }
        // If our parent is a DefaultFrame, we need to dispose it, too.
        if (window instanceof DefaultFrame) {
            window.dispose();
        }
    }

    /**
     * Resets the Popup to an initial state.
     */
    void reset(Component owner, Component contents, int ownerX, int ownerY) {
        if (getComponent() == null) {
            component = createComponent(owner);
        }
        Component c = getComponent();
        if (c instanceof JWindow) {
            JWindow component = (JWindow) getComponent();
            component.setLocation(ownerX, ownerY);
            component.getContentPane().add(contents, BorderLayout.CENTER);
            component.invalidate();
            component.validate();
            if (component.isVisible()) {
                // Do not call pack() if window is not visible to
                // avoid early native peer creation
                pack();
            }
        }
    }

    /**
     * Causes the Popup to be sized to fit the preferred size
     * of the Component it contains.
     */
    void pack() {
        Component component = getComponent();
        if (component instanceof Window) {
            ((Window) component).pack();
        }
    }

    /**
     * Returns the Window to use as the parent of the
     * Window created for the Popup. This creates
     * a new DefaultFrame, if necessary.
     */
    private Window getParentWindow(Component owner) {
        Window window = null;
        if (owner instanceof Window) {
            window = (Window) owner;
        } else if (owner != null) {
            window = SwingUtilities.getWindowAncestor(owner);
        }

return window;
    }

    /**
     * Creates the Component to use as the parent of the Popup.
     * The default implementation creates a Window, subclasses
     * should override.
     */
    Component createComponent(Component owner) {
        if (GraphicsEnvironment.isHeadless()) {
            // Generally not useful, bail.
            return null;
        }
        return new HeavyWeightWindow(getParentWindow(owner));
    }

    /**
     * Returns the Component returned from
     * createComponent that will hold the Popup.
     */
    Component getComponent() {
        return component;
    }

    /**
     * Component used to house window.
     */
    static class HeavyWeightWindow extends JWindow implements ModalExclude {

        HeavyWeightWindow(Window parent) {
            super(parent);
            setFocusableWindowState(false);
            if (AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> System.getProperty("jbre.popupwindow.settype") != null)) {
                setType(Window.Type.POPUP);
            }
            // Popups are typically transient and most likely won't benefit
            // from true double buffering.  Turn it off here.
            getRootPane().setUseTrueDoubleBuffering(false);
            // Try to set "always-on-top" for the popup window.
            // Applets usually don't have sufficient permissions to do it.
            // In this case simply ignore the exception.
            try {
                setAlwaysOnTop(true);
            } catch (SecurityException se) {
                // setAlwaysOnTop is restricted,
                // the exception is ignored
            }
        }

        public void update(Graphics g) {
            paint(g);
        }

        public void show() {
            this.pack();
            if (getWidth() > 0 && getHeight() > 0) {
                super.show();
            }
        }
    }

    /**
     * Used if no valid Window ancestor of the supplied owner is found.
     *

     * PopupFactory uses this as a way to know when the Popup shouldn't
     * be cached based on the Window.
     */
    static class DefaultFrame extends Frame {
    }
}


try {
                setAlwaysOnTop(true);
            } catch (SecurityException se) {
                // setAlwaysOnTop is restricted,
                // the exception is ignored
            }

package javax.swing;

import java.awt.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.ModalExclude;
import sun.awt.SunToolkit;

/**
 * Popups are used to display a Component to the user, typically
 * on top of all the other Components in a particular containment
 * hierarchy. Popups have a very small life cycle. Once you
 * have obtained a Popup, and hidden it (invoked the
 * hide method), you should no longer
 * invoke any methods on it. This allows the PopupFactory to cache
 * Popups for later use.
 *

 * The general contract is that if you need to change the size of the
 * Component, or location of the Popup, you should
 * obtain a new Popup.
 *

 * Popup does not descend from Component, rather
 * implementations of Popup are responsible for creating
 * and maintaining their own Components to render the
 * requested Component to the user.
 *

 * You typically do not explicitly create an instance of Popup,
 * instead obtain one from a PopupFactory.
 *
 * @see PopupFactory
 *
 * @since 1.4
 */
public class Popup {

    /**
     * The Component representing the Popup.
     */
    private Component component;

    /**
     * Creates a Popup for the Component owner
     * containing the Component contents. owner
     * is used to determine which Window the new
     * Popup will parent the Component the
     * Popup creates to.
     * A null owner implies there is no valid parent.
     * x and
     * y specify the preferred initial location to place
     * the Popup at. Based on screen size, or other paramaters,
     * the Popup may not display at x and
     * y.
     *
     * @param owner    Component mouse coordinates are relative to, may be null
     * @param contents Contents of the Popup
     * @param x        Initial x screen coordinate
     * @param y        Initial y screen coordinate
     * @exception IllegalArgumentException if contents is null
     */
    protected Popup(Component owner, Component contents, int x, int y) {
        this();
        if (contents == null) {
            throw new IllegalArgumentException("Contents must be non-null");
        }
        reset(owner, contents, x, y);
    }

    /**
     * Creates a Popup. This is provided for subclasses.
     */
    protected Popup() {
    }

    /**
     * Makes the Popup visible. If the Popup is
     * currently visible, this has no effect.
     */
    @SuppressWarnings("deprecation")
    public void show() {
        Component component = getComponent();
        if (component != null) {
            component.show();
        }
    }

    /**
     * Hides and disposes of the Popup. Once a Popup
     * has been disposed you should no longer invoke methods on it. A
     * disposed Popup may be reclaimed and later used
     * based on the PopupFactory. As such, if you invoke methods
     * on a disposed Popup, indeterminate
     * behavior will result.
     */
    @SuppressWarnings("deprecation")
    public void hide() {
        Component component = getComponent();
        if (component instanceof JWindow) {
            component.hide();
            ((JWindow) component).getContentPane().removeAll();
        }
        dispose();
    }

    /**
     * Frees any resources the Popup may be holding onto.
     */
    void dispose() {
        Component component = getComponent();
        Window window = SwingUtilities.getWindowAncestor(component);
        if (component instanceof JWindow) {
            ((Window) component).dispose();
            component = null;
        }
        // If our parent is a DefaultFrame, we need to dispose it, too.
        if (window instanceof DefaultFrame) {
            window.dispose();
        }
    }

    /**
     * Resets the Popup to an initial state.
     */
    void reset(Component owner, Component contents, int ownerX, int ownerY) {
        if (getComponent() == null) {
            component = createComponent(owner);
        }
        Component c = getComponent();
        if (c instanceof JWindow) {
            JWindow component = (JWindow) getComponent();
            component.setLocation(ownerX, ownerY);
            component.getContentPane().add(contents, BorderLayout.CENTER);
            component.invalidate();
            component.validate();
            if (component.isVisible()) {
                // Do not call pack() if window is not visible to
                // avoid early native peer creation
                pack();
            }
        }
    }

    /**
     * Causes the Popup to be sized to fit the preferred size
     * of the Component it contains.
     */
    void pack() {
        Component component = getComponent();
        if (component instanceof Window) {
            ((Window) component).pack();
        }
    }

    /**
     * Returns the Window to use as the parent of the
     * Window created for the Popup. This creates
     * a new DefaultFrame, if necessary.
     */
    private Window getParentWindow(Component owner) {
        Window window = null;
        if (owner instanceof Window) {
            window = (Window) owner;
        } else if (owner != null) {
            window = SwingUtilities.getWindowAncestor(owner);
        }
        if (window == null) {
            window = new DefaultFrame();
        }
        return window;
    }

    /**
     * Creates the Component to use as the parent of the Popup.
     * The default implementation creates a Window, subclasses
     * should override.
     */
    Component createComponent(Component owner) {
        if (GraphicsEnvironment.isHeadless()) {
            // Generally not useful, bail.
            return null;
        }
        return new HeavyWeightWindow(getParentWindow(owner));
    }

    /**
     * Returns the Component returned from
     * createComponent that will hold the Popup.
     */
    Component getComponent() {
        return component;
    }

    /**
     * Component used to house window.
     */
    static class HeavyWeightWindow extends JWindow implements ModalExclude {

        HeavyWeightWindow(Window parent) {
            super(parent);
            setFocusableWindowState(false);
            if (AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> System.getProperty("jbre.popupwindow.settype") != null)) {
                setType(Window.Type.POPUP);
            }
            // Popups are typically transient and most likely won't benefit
            // from true double buffering.  Turn it off here.
            getRootPane().setUseTrueDoubleBuffering(false);
            // Try to set "always-on-top" for the popup window.
            // Applets usually don't have sufficient permissions to do it.
            // In this case simply ignore the exception.

        }

        public void update(Graphics g) {
            paint(g);
        }

        public void show() {
            this.pack();
            if (getWidth() > 0 && getHeight() > 0) {
                super.show();
            }
        }
    }

    /**
     * Used if no valid Window ancestor of the supplied owner is found.
     * <p>
     * PopupFactory uses this as a way to know when the Popup shouldn't
     * be cached based on the Window.
     */
    static class DefaultFrame extends Frame {
    }
}


package javax.swing;

import java.awt.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.ModalExclude;
import sun.awt.SunToolkit;

/**
 * Popups are used to display a Component to the user, typically
 * on top of all the other Components in a particular containment
 * hierarchy. Popups have a very small life cycle. Once you
 * have obtained a Popup, and hidden it (invoked the
 * hide method), you should no longer
 * invoke any methods on it. This allows the PopupFactory to cache
 * Popups for later use.
 *

 * The general contract is that if you need to change the size of the
 * Component, or location of the Popup, you should
 * obtain a new Popup.
 *

 * Popup does not descend from Component, rather
 * implementations of Popup are responsible for creating
 * and maintaining their own Components to render the
 * requested Component to the user.
 *

 * You typically do not explicitly create an instance of Popup,
 * instead obtain one from a PopupFactory.
 *
 * @see PopupFactory
 *
 * @since 1.4
 */
public class Popup {

    /**
     * The Component representing the Popup.
     */
    private Component component;

    /**
     * Creates a Popup for the Component owner
     * containing the Component contents. owner
     * is used to determine which Window the new
     * Popup will parent the Component the
     * Popup creates to.
     * A null owner implies there is no valid parent.
     * x and
     * y specify the preferred initial location to place
     * the Popup at. Based on screen size, or other paramaters,
     * the Popup may not display at x and
     * y.
     *
     * @param owner    Component mouse coordinates are relative to, may be null
     * @param contents Contents of the Popup
     * @param x        Initial x screen coordinate
     * @param y        Initial y screen coordinate
     * @exception IllegalArgumentException if contents is null
     */
    protected Popup(Component owner, Component contents, int x, int y) {
        this();
        if (contents == null) {
            throw new IllegalArgumentException("Contents must be non-null");
        }
        reset(owner, contents, x, y);
    }

    /**
     * Creates a Popup. This is provided for subclasses.
     */
    protected Popup() {
    }

    /**
     * Makes the Popup visible. If the Popup is
     * currently visible, this has no effect.
     */
    @SuppressWarnings("deprecation")
    public void show() {
        Component component = getComponent();
        if (component != null) {
            component.show();
        }
    }

    /**
     * Hides and disposes of the Popup. Once a Popup
     * has been disposed you should no longer invoke methods on it. A
     * disposed Popup may be reclaimed and later used
     * based on the PopupFactory. As such, if you invoke methods
     * on a disposed Popup, indeterminate
     * behavior will result.
     */
    @SuppressWarnings("deprecation")
    public void hide() {
        Component component = getComponent();
        if (component instanceof JWindow) {
            component.hide();
            ((JWindow) component).getContentPane().removeAll();
        }
        dispose();
    }

    /**
     * Frees any resources the Popup may be holding onto.
     */
    void dispose() {
        Component component = getComponent();
        Window window = SwingUtilities.getWindowAncestor(component);
        if (component instanceof JWindow) {
            ((Window) component).dispose();
            component = null;
        }
        // If our parent is a DefaultFrame, we need to dispose it, too.
        if (window instanceof DefaultFrame) {
            window.dispose();
        }
    }

    /**
     * Resets the Popup to an initial state.
     */
    void reset(Component owner, Component contents, int ownerX, int ownerY) {
        if (getComponent() == null) {
            component = createComponent(owner);
        }
        Component c = getComponent();
        if (c instanceof JWindow) {
            JWindow component = (JWindow) getComponent();
            component.setLocation(ownerX, ownerY);
            component.getContentPane().add(contents, BorderLayout.CENTER);
            component.invalidate();
            component.validate();
            if (component.isVisible()) {
                // Do not call pack() if window is not visible to
                // avoid early native peer creation
                pack();
            }
        }
    }

    /**
     * Causes the Popup to be sized to fit the preferred size
     * of the Component it contains.
     */
    void pack() {
        Component component = getComponent();
        if (component instanceof Window) {
            ((Window) component).pack();
        }
    }

    /**
     * Returns the Window to use as the parent of the
     * Window created for the Popup. This creates
     * a new DefaultFrame, if necessary.
     */
    private Window getParentWindow(Component owner) {
        Window window = null;
        if (owner instanceof Window) {
            window = (Window) owner;
        } else if (owner != null) {
            window = SwingUtilities.getWindowAncestor(owner);
        }
        if (window == null) {
            window = new DefaultFrame();
        }
        return window;
    }

    /**
     * Creates the Component to use as the parent of the Popup.
     * The default implementation creates a <c

ode>Window, subclasses
     * should override.
     */
    Component createComponent(Component owner) {
        if (GraphicsEnvironment.isHeadless()) {
            // Generally not useful, bail.
            return null;
        }
        return new HeavyWeightWindow(getParentWindow(owner));
    }

    /**
     * Returns the Component returned from
     * createComponent that will hold the Popup.
     */
    Component getComponent() {
        return component;
    }

    /**
     * Component used to house window.
     */
    static class HeavyWeightWindow extends JWindow implements ModalExclude {

        HeavyWeightWindow(Window parent) {
            super(parent);
            setFocusableWindowState(false);
            if (AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> System.getProperty("jbre.popupwindow.settype") != null)) {
                setType(Window.Type.POPUP);
            }
            // Popups are typically transient and most likely won't benefit
            // from true double buffering.  Turn it off here.
            getRootPane().setUseTrueDoubleBuffering(false);
            // Try to set "always-on-top" for the popup window.
            // Applets usually don't have sufficient permissions to do it.
            // In this case simply ignore the exception.
            try {
                setAlwaysOnTop(true);
            } catch (SecurityException se) {
                // setAlwaysOnTop is restricted,
                // the exception is ignored
            }
        }

        public void update(Graphics g) {
            paint(g);
        }

        public void show() {
            this.pack();
            if (getWidth() > 0 && getHeight() > 0) {
                super.show();
            }
        }
    }

    /**
     * Used if no valid Window ancestor of the supplied owner is found.
     *

     * PopupFactory uses this as a way to know when the Popup shouldn't
     * be cached based on the Window.
     */
    static class DefaultFrame extends Frame {
    }
}