
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __gnu_java_awt_AWTUtilities__
#define __gnu_java_awt_AWTUtilities__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace awt
      {
          class AWTUtilities;
      }
    }
  }
  namespace java
  {
    namespace awt
    {
        class Component;
        class Container;
        class Font;
        class FontMetrics;
        class Insets;
        class Point;
        class Rectangle;
        class Window;
      namespace event
      {
          class MouseEvent;
      }
    }
  }
}

class gnu::java::awt::AWTUtilities : public ::java::lang::Object
{

public:
  AWTUtilities();
  static ::java::util::List * getVisibleChildren(::java::awt::Container *);
  static ::java::awt::Rectangle * calculateInsetArea(::java::awt::Rectangle *, ::java::awt::Insets *, ::java::awt::Rectangle *);
  static ::java::awt::Rectangle * getLocalBounds(::java::awt::Component *);
  static ::java::awt::FontMetrics * getFontMetrics(::java::awt::Font *);
  static ::java::awt::Container * getAncestorNamed(::java::lang::String *, ::java::awt::Component *);
  static ::java::awt::Container * getAncestorOfClass(::java::lang::Class *, ::java::awt::Component *);
  static ::java::awt::Window * windowForComponent(::java::awt::Component *);
  static ::java::awt::Component * getRoot(::java::awt::Component *);
  static jboolean isDescendingFrom(::java::awt::Component *, ::java::awt::Component *);
  static ::java::awt::Component * getDeepestComponentAt(::java::awt::Component *, jint, jint);
  static void convertPointToScreen(::java::awt::Point *, ::java::awt::Component *);
  static void convertPointFromScreen(::java::awt::Point *, ::java::awt::Component *);
  static ::java::awt::Point * convertPoint(::java::awt::Component *, jint, jint, ::java::awt::Component *);
  static ::java::awt::Rectangle * convertRectangle(::java::awt::Component *, ::java::awt::Rectangle *, ::java::awt::Component *);
  static ::java::awt::event::MouseEvent * convertMouseEvent(::java::awt::Component *, ::java::awt::event::MouseEvent *, ::java::awt::Component *);
  static void invokeLater(::java::lang::Runnable *);
  static void invokeAndWait(::java::lang::Runnable *);
  static jboolean isEventDispatchThread();
  static jboolean isValidKey(jint);
public: // actually package-private
  static ::java::util::WeakHashMap * visibleChildrenCache;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_awt_AWTUtilities__
