// This file is for classes that appear in JDK 8 but not in JDK 11.

import org.checkerframework.checker.fenum.qual.*;

package javax.swing;

interface SwingConstants {
  //
  // WMD adds this new constant to use instead of literally using -1.
  //
  @SwingCompassDirection
  @SwingHorizontalOrientation
  @SwingVerticalOrientation
  public static final int NOTSET = -1;

  //
  // The central position in an area. Used for
  // both compass-direction constants (NORTH, etc.)
  // and box-orientation constants (TOP, etc.).
  //
  @SwingCompassDirection
  @SwingHorizontalOrientation
  @SwingVerticalOrientation
  int CENTER  = 0;

  //
  // Box-orientation constant used to specify locations in a box.
  //
  @SwingVerticalOrientation int TOP     = 1;
  @SwingHorizontalOrientation int LEFT    = 2;
  @SwingVerticalOrientation int BOTTOM  = 3;
  @SwingHorizontalOrientation int RIGHT   = 4;

  //
  // Compass-direction constants used to specify a position.
  //
  @SwingCompassDirection int NORTH      = 1;
  @SwingCompassDirection int NORTH_EAST = 2;
  @SwingCompassDirection int EAST       = 3;
  @SwingCompassDirection int SOUTH_EAST = 4;
  @SwingCompassDirection int SOUTH      = 5;
  @SwingCompassDirection int SOUTH_WEST = 6;
  @SwingCompassDirection int WEST       = 7;
  @SwingCompassDirection int NORTH_WEST = 8;

  //
  // These constants specify a horizontal or
  // vertical orientation. For example, they are
  // used by scrollbars and sliders.
  //
  @SwingElementOrientation int HORIZONTAL = 0;
  @SwingElementOrientation int VERTICAL   = 1;

  //
  // Constants for orientation support, since some languages are
  // left-to-right oriented and some are right-to-left oriented.
  // This orientation is currently used by buttons and labels.
  //
  @SwingTextOrientation @SwingHorizontalOrientation int LEADING  = 10;
  @SwingTextOrientation @SwingHorizontalOrientation int TRAILING = 11;

  @SwingTextOrientation int NEXT = 12;
  @SwingTextOrientation int PREVIOUS = 13;
}


package java.beans;

class PropertyChangeSupport {
    public void firePropertyChange(String propertyName, @FenumTop int oldValue, @FenumTop int newValue);
    public void firePropertyChange(String propertyName, @FenumTop Object oldValue, @FenumTop Object newValue);
}
