The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
    /*
    ###########################################################################
    # (@)PACKAGE:Win32::GUI::Label
    #
    # $Id: Label.xs,v 1.7 2006/01/11 21:26:16 robertemay Exp $
    #
    ###########################################################################
    */

#include "GUI.h"

void Label_onPreCreate(NOTXSPROC LPPERLWIN32GUI_CREATESTRUCT perlcs) {

    perlcs->cs.lpszClass = "STATIC";
    perlcs->cs.style = WS_VISIBLE | WS_CHILD | SS_LEFT;
}

BOOL
Label_onParseOption(NOTXSPROC char *option, SV* value, LPPERLWIN32GUI_CREATESTRUCT perlcs) {

    BOOL retval = TRUE;
    
    if(strcmp(option, "-align") == 0) {
        if(strcmp(SvPV_nolen(value), "left") == 0) {
            SwitchBit(perlcs->cs.style, SS_LEFT, 1);
            SwitchBit(perlcs->cs.style, SS_CENTER, 0);
            SwitchBit(perlcs->cs.style, SS_RIGHT, 0);
        } else if(strcmp(SvPV_nolen(value), "center") == 0) {
            SwitchBit(perlcs->cs.style, SS_LEFT, 0);
            SwitchBit(perlcs->cs.style, SS_CENTER, 1);
            SwitchBit(perlcs->cs.style, SS_RIGHT, 0);
        } else if(strcmp(SvPV_nolen(value), "right") == 0) {
            SwitchBit(perlcs->cs.style, SS_LEFT, 0);
            SwitchBit(perlcs->cs.style, SS_CENTER, 0);
            SwitchBit(perlcs->cs.style, SS_RIGHT, 1);
        } else {
            W32G_WARN("Win32::GUI: Invalid value for -align!");
        }
    } else if(strcmp(option, "-bitmap") == 0 || strcmp(option, "-picture") == 0) {
        SwitchBit(perlcs->cs.style, SS_BITMAP, 1);
        perlcs->hImageList = (HIMAGELIST) handle_From(NOTXSCALL value);
    } else if(strcmp(option, "-icon") == 0 ) {
        SwitchBit(perlcs->cs.style, SS_ICON, 1);
        perlcs->hImageList = (HIMAGELIST) handle_From(NOTXSCALL value);
    } else if(strcmp(option, "-truncate") == 0) {
        if(strcmp(SvPV_nolen(value), "path") == 0) {
			perlcs->cs.style &= ~SS_ELLIPSISMASK;
			perlcs->cs.style |= SS_PATHELLIPSIS;
        } else if(strcmp(SvPV_nolen(value), "word") == 0) {
			perlcs->cs.style &= ~SS_ELLIPSISMASK;
			perlcs->cs.style |= SS_WORDELLIPSIS;
        } else if(SvIV(value)) {
			perlcs->cs.style &= ~SS_ELLIPSISMASK;
			perlcs->cs.style |= SS_ENDELLIPSIS;
        } else {
			perlcs->cs.style &= ~SS_ELLIPSISMASK;
        }
    } else if(strcmp(option, "-frame") == 0) {
        if(strcmp(SvPV_nolen(value), "black") == 0) {
            SwitchBit(perlcs->cs.style, SS_BLACKFRAME, 1);
            SwitchBit(perlcs->cs.style, SS_GRAYFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_WHITEFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_ETCHEDFRAME, 0);
        } else if(strcmp(SvPV_nolen(value), "gray") == 0) {
            SwitchBit(perlcs->cs.style, SS_BLACKFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_GRAYFRAME, 1);
            SwitchBit(perlcs->cs.style, SS_WHITEFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_ETCHEDFRAME, 0);
        } else if(strcmp(SvPV_nolen(value), "white") == 0) {
            SwitchBit(perlcs->cs.style, SS_BLACKFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_GRAYFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_WHITEFRAME, 1);
            SwitchBit(perlcs->cs.style, SS_ETCHEDFRAME, 0);
        } else if(strcmp(SvPV_nolen(value), "etched") == 0) {
            SwitchBit(perlcs->cs.style, SS_BLACKFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_GRAYFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_WHITEFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_ETCHEDFRAME, 1);
        } else {
            SwitchBit(perlcs->cs.style, SS_BLACKFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_GRAYFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_WHITEFRAME, 0);
            SwitchBit(perlcs->cs.style, SS_ETCHEDFRAME, 0);
        }
    } else if(strcmp(option, "-fill") == 0) {
        if(strcmp(SvPV_nolen(value), "black") == 0) {
            SwitchBit(perlcs->cs.style, SS_BLACKRECT, 1);
            SwitchBit(perlcs->cs.style, SS_GRAYRECT, 0);
            SwitchBit(perlcs->cs.style, SS_WHITERECT, 0);
        } else if(strcmp(SvPV_nolen(value), "gray") == 0) {
            SwitchBit(perlcs->cs.style, SS_BLACKRECT, 0);
            SwitchBit(perlcs->cs.style, SS_GRAYRECT, 1);
            SwitchBit(perlcs->cs.style, SS_WHITERECT, 0);
        } else if(strcmp(SvPV_nolen(value), "white") == 0) {
            SwitchBit(perlcs->cs.style, SS_BLACKRECT, 0);
            SwitchBit(perlcs->cs.style, SS_GRAYRECT, 0);
            SwitchBit(perlcs->cs.style, SS_WHITERECT, 1);
        } else if(strcmp(SvPV_nolen(value), "etched") == 0) {
            SwitchBit(perlcs->cs.style, SS_BLACKRECT, 0);
            SwitchBit(perlcs->cs.style, SS_GRAYRECT, 0);
            SwitchBit(perlcs->cs.style, SS_WHITERECT, 0);
        } else {
            SwitchBit(perlcs->cs.style, SS_BLACKRECT, 0);
            SwitchBit(perlcs->cs.style, SS_GRAYRECT, 0);
            SwitchBit(perlcs->cs.style, SS_WHITERECT, 0);
        }
    } else if(strcmp(option, "-wrap") == 0) {
        if(SvIV(value)) {
            SwitchBit(perlcs->cs.style, SS_LEFTNOWORDWRAP, 0);
        } else {
            SwitchBit(perlcs->cs.style, SS_LEFTNOWORDWRAP, 1);
        }
    } else if BitmaskOptionValue("-sunken",   perlcs->cs.style, SS_SUNKEN)
    } else if BitmaskOptionValue("-notify",   perlcs->cs.style, SS_NOTIFY)
    } else if BitmaskOptionValue("-simple",   perlcs->cs.style, SS_SIMPLE)
    } else if BitmaskOptionValue("-noprefix", perlcs->cs.style, SS_NOPREFIX)
    } else retval = FALSE;

    return retval;
}

void
Label_onPostCreate(NOTXSPROC HWND myhandle, LPPERLWIN32GUI_CREATESTRUCT perlcs) {

    if(perlcs->hImageList != NULL) {
        if((perlcs->cs.style & SS_ICON) == SS_ICON)
            SendMessage(myhandle, STM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) perlcs->hImageList);
        else
            SendMessage(myhandle, STM_SETIMAGE, (WPARAM) IMAGE_BITMAP, (LPARAM) perlcs->hImageList);
    }
}

BOOL
Label_onParseEvent(NOTXSPROC char *name, int* eventID) {

    BOOL retval = TRUE;

         if Parse_Event("DblClick",   PERLWIN32GUI_NEM_DBLCLICK)
    else if Parse_Event("Click",      PERLWIN32GUI_NEM_CLICK)
    else if Parse_Event("Anonymous",  PERLWIN32GUI_NEM_CONTROL1)
    else if Parse_Event("Enable",     PERLWIN32GUI_NEM_CONTROL2)
    else retval = FALSE;

    return retval;
}

int
Label_onEvent (NOTXSPROC LPPERLWIN32GUI_USERDATA perlud, UINT uMsg, WPARAM wParam, LPARAM lParam) {

    int PerlResult = 1;

    if ( uMsg == WM_COMMAND ) {
        switch(HIWORD(wParam)) {
        case STN_CLICKED:
            /*
             * (@)EVENT:Click()
             * (@)APPLIES_TO:Label
             */
            PerlResult = DoEvent(NOTXSCALL perlud, PERLWIN32GUI_NEM_CLICK, "Click", -1 );
            break;
        case STN_DBLCLK:
            /*
             * (@)EVENT:DblClick()
             * (@)APPLIES_TO:Label
             */
            PerlResult = DoEvent(NOTXSCALL perlud, PERLWIN32GUI_NEM_DBLCLICK, "DblClick", -1 );
            break;
        case STN_DISABLE:
        case STN_ENABLE:
            /*
             * (@)EVENT:Enable(State)
             * Sent when the enable state Label change.
             * (@)APPLIES_TO:Label
             */ 
            PerlResult = DoEvent(NOTXSCALL perlud, PERLWIN32GUI_NEM_CONTROL2, "Enable", 
                                 PERLWIN32GUI_ARGTYPE_INT, (HIWORD(wParam) == STN_ENABLE),
                                 -1 );
        default:
            PerlResult = DoEvent(NOTXSCALL perlud, PERLWIN32GUI_NEM_CONTROL1, "Anonymous", 
                PERLWIN32GUI_ARGTYPE_INT, HIWORD(wParam),
                -1 );
            break;
        }  
    }    
    return PerlResult;
}


MODULE = Win32::GUI::Label      PACKAGE = Win32::GUI::Label

PROTOTYPES: DISABLE

#pragma message( "*** PACKAGE Win32::GUI::Label..." )


    ###########################################################################
    # (@)METHOD:GetIcon()
    # Retrieve a handle to the icon associated with a LABEL that has the SS_ICON style

LRESULT
GetIcon(handle)
    HWND   handle
CODE:
    RETVAL = SendMessage(handle, STM_GETICON, 0, 0);
OUTPUT:
    RETVAL

    ###########################################################################
    # (@)METHOD:SetIcon(ICON)
    # Associate an icon with a LABEL that has the SS_ICON style

LRESULT
SetIcon(handle, icon)
    HWND   handle
    HICON  icon
CODE:
    RETVAL = SendMessage(handle, STM_SETICON, (WPARAM) icon, 0);
OUTPUT:
    RETVAL

    ###########################################################################
    # (@)METHOD:GetImage(type)
    # Retrieve a handle to the image (icon or bitmap) associated with the button
    # type = IMAGE_BITMAP | IMAGE_ICON | IMAGE_CURSOR

LRESULT
GetImage(handle, type)
    HWND   handle
    WPARAM type
CODE:
    RETVAL = SendMessage(handle, STM_GETIMAGE, type, 0);
OUTPUT:
    RETVAL

    ###########################################################################
    # (@)METHOD:SetImage(BITMAP)
    # Draws the specified BITMAP in the Label.
    # BITMAP is assumed a Win32::GUI::Bitmap object by default.

LRESULT
SetImage(handle, icon)
    HWND   handle
    HICON  icon
CODE:
    WPARAM type = IMAGE_BITMAP;
    if (sv_isobject(ST(1))) {
        if (sv_derived_from(ST(1), "Win32::GUI::Icon"))
            type = IMAGE_ICON;
        else if (sv_derived_from(ST(1), "Win32::GUI::Cursor"))
            type = IMAGE_CURSOR;
    }    
    RETVAL = SendMessage(handle, STM_SETIMAGE, type, (LPARAM) icon);
OUTPUT:
    RETVAL