/*
 * Xailer source code:
 *
 * PopupWindow.prg
 * Clase TPopupWindow
 *
 * Copyright 2016 Jose F. Gimenez
 * Copyright 2016 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"

//------------------------------------------------------------------------------

CLASS XPopupWindow FROM TWinObject

   PROPERTY cText

   PROPERTY nLeft    INIT 0   WRITE METHOD SetBounds
   PROPERTY nTop     INIT 0   WRITE INLINE ::SetBounds( , Value )
   PROPERTY nWidth   INIT 0   WRITE INLINE ::SetBounds( ,, Value )
   PROPERTY nHeight  INIT 0   WRITE INLINE ::SetBounds( ,,, Value )
   PROPERTY nClrPane INIT clBlack
   PROPERTY nClrText INIT clWhite
   PROPERTY nOpacity INIT 160

   PROPERTY lVisible     INIT .F. WRITE INLINE IIF( Value, ::Show(), ::Hide() ), Value

PUBLIC:
   PROPERTY oFont READ INLINE ::oParent:oFont
   PROPERTY oForm

   EVENT OnPaint()
   EVENT OnPainted()

RESERVED:
   METHOD Create( oParent, oForm )
   METHOD Link()    EXTERN WndLink()
   METHOD Unlink()  EXTERN WndUnlink()
   METHOD SetBounds()
   METHOD Show()
   METHOD Hide()
   METHOD WMEraseBkgnd()   INLINE 1
   METHOD WMPaint()

   PROPERTY lTransparent INIT .F.

ENDCLASS

//------------------------------------------------------------------------------

METHOD Create( oParent, oForm ) CLASS XPopupWindow

   LOCAL nStyle := nOr( WS_EX_TOPMOST, WS_EX_LAYERED, WS_EX_NOACTIVATE )

   UPDATE ::oParent TO oParent, ::oForm TO oForm

   RegisterClass( ::ClassName )

   IF ( ::Handle := CreateWindow( ::ClassName, "", WS_POPUP, nStyle,,,,, 0 ) ) != 0
      ::Link()
   ENDIF

RETURN Self

//------------------------------------------------------------------------------

METHOD SetBounds( nLeft, nTop, nWidth, nHeight ) CLASS XPopupWindow

   UPDATE ::FnLeft   TO nLeft
   UPDATE ::FnTop    TO nTop
   UPDATE ::FnWidth  TO nWidth
   UPDATE ::FnHeight TO nHeight

   IF !Empty( ::Handle )
      MoveWindow( ::Handle, ::FnLeft, ::FnTop, ::FnWidth, ::FnHeight, .T. )
   ENDIF

RETURN Self

//------------------------------------------------------------------------------

METHOD Show() CLASS XPopupWindow

   ::FlVisible := .T.
   IF ! Empty( ::Handle )
      IF ! IsWindowVisible( ::Handle )
         ShowWindow( ::Handle, SW_SHOWNA )
         SetLayeredWindowAttributes( ::Handle, 0, ::nOpacity, LWA_ALPHA )
         ::SetBounds()
      ENDIF
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD Hide() CLASS XPopupWindow

   ::FlVisible := .F.
   IF ! Empty( ::Handle )
      ShowWindow( ::Handle, SW_HIDE )
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include "Windows.h"
#include "Xailer.h"

XA_FUNC( XPOPUPWINDOW_WMPAINT )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hWnd = GetHandleOf( Self );
   char *cText;
   CONTROLPAINT cp;
   UINT nTextLen = 0;

   if ( XA_ControlBeginPaint( Self, hWnd, &cp, (HDC) hb_parnl( 1 ) ) )
      {
      HBRUSH hBrush = CreateSolidBrush( XA_ObjGetNL( Self, "nClrPane" ) );
      RECT rect;

      GetClientRect( hWnd, &rect );
      FillRect( cp.hDC, &rect, hBrush );

      cText = XA_ObjGetCLen( Self, "cText", &nTextLen );

      if ( nTextLen )
      {
      HFONT hOld;
      hOld = SelectObject( cp.hDC, GetHandleOf( XA_ObjGetItem( Self, "oFont" ) ) );
      SetBkMode( cp.hDC, TRANSPARENT );
      SetBkColor( cp.hDC, XA_ObjGetNL( Self, "nClrPane" )  );
      SetTextColor( cp.hDC, XA_ObjGetNL( Self, "nClrText" ) );
      DrawText( cp.hDC, cText, nTextLen, &rect, DT_WORD_ELLIPSIS | DT_CENTER  | DT_SINGLELINE | DT_VCENTER );
      SelectObject( cp.hDC, hOld );
      }

      }
   XA_ControlEndPaint( Self, hWnd, &cp );

   hb_retnl( 0 );
}

#pragma ENDDUMP

//------------------------------------------------------------------------------
