+ public final int getAbsoluteY() {
+ assert (parent != null);
+ if (parent == this) {
+ return y;
+ }
+ if ((parent instanceof TWindow)
+ && !(parent instanceof TMenu)
+ && !(parent instanceof TDesktop)
+ ) {
+ // Widgets on a TWindow have (0,0) as their top-left, but this is
+ // actually the TWindow's (1,1).
+ return parent.getAbsoluteY() + y + 1;
+ }
+ return parent.getAbsoluteY() + y;
+ }
+
+ /**
+ * Get the global color theme.
+ *
+ * @return the ColorTheme
+ */
+ public final ColorTheme getTheme() {
+ return window.getApplication().getTheme();
+ }
+
+ /**
+ * Draw my specific widget. When called, the screen rectangle I draw
+ * into is already setup (offset and clipping).
+ */
+ public void draw() {
+ // Default widget draws nothing.
+ }
+
+ /**
+ * Called by parent to render to TWindow.
+ */
+ public final void drawChildren() {
+ // Set my clipping rectangle
+ assert (window != null);
+ assert (getScreen() != null);
+ Screen screen = getScreen();
+
+ // Special case: TStatusBar is drawn by TApplication, not anything
+ // else.
+ if (this instanceof TStatusBar) {
+ return;
+ }
+
+ screen.setClipRight(width);
+ screen.setClipBottom(height);
+
+ int absoluteRightEdge = window.getAbsoluteX() + window.getWidth();
+ int absoluteBottomEdge = window.getAbsoluteY() + window.getHeight();
+ if (!(this instanceof TWindow) && !(this instanceof TVScroller)) {
+ absoluteRightEdge -= 1;
+ }
+ if (!(this instanceof TWindow) && !(this instanceof THScroller)) {
+ absoluteBottomEdge -= 1;
+ }
+ int myRightEdge = getAbsoluteX() + width;
+ int myBottomEdge = getAbsoluteY() + height;
+ if (getAbsoluteX() > absoluteRightEdge) {
+ // I am offscreen
+ screen.setClipRight(0);
+ } else if (myRightEdge > absoluteRightEdge) {
+ screen.setClipRight(screen.getClipRight()
+ - (myRightEdge - absoluteRightEdge));
+ }
+ if (getAbsoluteY() > absoluteBottomEdge) {
+ // I am offscreen
+ screen.setClipBottom(0);
+ } else if (myBottomEdge > absoluteBottomEdge) {
+ screen.setClipBottom(screen.getClipBottom()
+ - (myBottomEdge - absoluteBottomEdge));
+ }
+
+ // Set my offset
+ screen.setOffsetX(getAbsoluteX());
+ screen.setOffsetY(getAbsoluteY());
+
+ // Draw me
+ draw();