diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2016-12-28 16:52:56 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2016-12-28 16:52:56 +0100 |
commit | 7b358424ebad9349421acd533c2fa1cbf6cf3e3e (patch) | |
tree | 686678532eefed525c242fd214d0cfb2914726c5 /app/wlib/mswlib/mswbutt.c |
Initial import of xtrkcad version 1:4.0.2-2
Diffstat (limited to 'app/wlib/mswlib/mswbutt.c')
-rw-r--r-- | app/wlib/mswlib/mswbutt.c | 387 |
1 files changed, 387 insertions, 0 deletions
diff --git a/app/wlib/mswlib/mswbutt.c b/app/wlib/mswlib/mswbutt.c new file mode 100644 index 0000000..b5d7b49 --- /dev/null +++ b/app/wlib/mswlib/mswbutt.c @@ -0,0 +1,387 @@ +#include <windows.h> +#include <string.h> +#include <malloc.h> +#include <stdlib.h> +#include <commdlg.h> +#include <math.h> +#include "mswint.h" +int kludge12 = 0; + +/* + ***************************************************************************** + * + * Simple Buttons + * + ***************************************************************************** + */ + + + +static XWNDPROC oldButtProc = NULL; +static XWNDPROC newButtProc; + + +struct wButton_t { + WOBJ_COMMON + wButtonCallBack_p action; + wBool_t busy; + wBool_t selected; + wIcon_p icon; + }; + + + +void mswButtPush( + wControl_p b ) +{ + if ( ((wButton_p)b)->action ) + ((wButton_p)b)->action( ((wButton_p)b)->data ); +} + +/** + * Paint function for toolbar buttons + * + * \param hButtDc IN valid device context + * \param bm IN bitmap to add to button + * \param selected IN selected state of button + * \param disabled IN disabled state of button + */ + +static void drawButton( + HDC hButtDc, + wIcon_p bm, + BOOL_T selected, + BOOL_T disabled ) +{ + HGDIOBJ oldBrush, newBrush; + HPEN oldPen, newPen; + RECT rect; + COLORREF color1, color2; + POS_T offw=5, offh=5; + TRIVERTEX vert[2] ; + GRADIENT_RECT gRect; + + COLORREF colL; + COLORREF colD; + COLORREF colF; + +#define LEFT (0) +#define RIGHT (bm->w+10) +#define TOP (0) +#define BOTTOM (bm->h+10) + + /* get the lightest and the darkest color to use */ + colL = GetSysColor( COLOR_BTNHIGHLIGHT ); + colD = GetSysColor( COLOR_BTNSHADOW ); + colF = GetSysColor( COLOR_BTNFACE ); + + /* define the rectangle for the button */ + rect.top = TOP; + rect.left = LEFT; + rect.right = RIGHT; + rect.bottom = BOTTOM; + + /* fill the button with the face color */ + newBrush = CreateSolidBrush( colF ); + oldBrush = SelectObject( hButtDc, newBrush ); + FillRect( hButtDc, &rect, newBrush ); + DeleteObject( SelectObject( hButtDc, oldBrush ) ); + + /* disabled button remain flat */ + if( !disabled ) + { + /* select colors for the gradient */ + if( selected ) { + color1 = colD; + color2 = colL; + } else { + color1 = colL; + color2 = colD; + } + +#define GRADIENT_WIDTH 6 + + /* + first draw the top gradient + this always ends in the button face color + starting color depends on button state (selected or not) + */ + vert [0] .x = LEFT; + vert [0] .y = TOP; + vert [0] .Red = GetRValue( color1 )* 256; + vert [0] .Green = GetGValue( color1 )* 256; + vert [0] .Blue = GetBValue( color1 )* 256; + vert [0] .Alpha = 0x0000; + vert [1] .x = RIGHT; + vert [1] .y = TOP + GRADIENT_WIDTH; + vert [1] .Red = GetRValue( colF )* 256; + vert [1] .Green = GetGValue( colF )* 256; + vert [1] .Blue = GetBValue( colF )* 256; + vert [1] .Alpha = 0x0000; + + gRect.UpperLeft = 0; + gRect.LowerRight = 1; + + GradientFill(hButtDc, vert, 2, &gRect, 1, GRADIENT_FILL_RECT_V); + + /* + now draw the bottom gradient + this always starts with the button face color + ending color depends on button state (selected or not) + */ + vert [0] .x = LEFT; + vert [0] .y = BOTTOM - GRADIENT_WIDTH; + vert [0] .Red = GetRValue( colF )* 256; + vert [0] .Green = GetGValue( colF )* 256; + vert [0] .Blue = GetBValue( colF )* 256; + vert [0] .Alpha = 0x0000; + vert [1] .x = RIGHT; + vert [1] .y = BOTTOM; + vert [1] .Red = GetRValue( color2 )* 256; + vert [1] .Green = GetGValue( color2 )* 256; + vert [1] .Blue = GetBValue( color2 )* 256; + vert [1] .Alpha = 0x0000; + gRect.UpperLeft = 0; + gRect.LowerRight = 1; + GradientFill(hButtDc, vert, 2, &gRect, 1, GRADIENT_FILL_RECT_V); + + } + + /* draw delimiting lines in shadow color */ + newPen = CreatePen( PS_SOLID, 0, colD ); + oldPen = SelectObject( hButtDc, newPen ); + + MoveTo( hButtDc, LEFT, TOP ); + LineTo( hButtDc, LEFT, BOTTOM ); + MoveTo( hButtDc, RIGHT, TOP ); + LineTo( hButtDc, RIGHT, BOTTOM ); + + DeleteObject( SelectObject( hButtDc, oldPen ) ); + + color2 = GetSysColor( COLOR_BTNSHADOW ); + color1 = RGB( bm->colormap[ 1 ].rgbRed, bm->colormap[ 1 ].rgbGreen, bm->colormap[ 1 ].rgbBlue ); + + if (selected) { + offw++; offh++; + } + mswDrawIcon( hButtDc, offw, offh, bm, disabled, color1, color2 ); +} + + +static void buttDrawIcon( + wButton_p b, + HDC butt_hDc ) +{ + wIcon_p bm = b->icon; + POS_T offw=5, offh=5; + + if (b->selected || b->busy) { + offw++; offh++; + } else if ( (b->option & BO_DISABLED) != 0 ) { + ; + } else { + ; + } + drawButton( butt_hDc, bm, b->selected || b->busy, (b->option & BO_DISABLED) != 0 ); +} + +void wButtonSetBusy( + wButton_p b, + int value ) +{ + b->busy = value; + if (!value) + b->selected = FALSE; + /*SendMessage( b->hWnd, BM_SETSTATE, (WPARAM)value, 0L );*/ + InvalidateRgn( b->hWnd, NULL, FALSE ); +} + + +void wButtonSetLabel( + wButton_p b, + const char * label ) +{ + if ((b->option&BO_ICON) == 0) { + /*b->labelStr = label;*/ + SetWindowText( b->hWnd, label ); + } else { + b->icon = (wIcon_p)label; + } + InvalidateRgn( b->hWnd, NULL, FALSE ); +} + + +static LRESULT buttPush( wControl_p b, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) +{ + wButton_p bb = (wButton_p)b; + DRAWITEMSTRUCT * di = (DRAWITEMSTRUCT *)lParam; + wBool_t selected; + + switch (message) { + case WM_COMMAND: + if (bb->action /*&& !bb->busy*/) { + bb->action( bb->data ); + return 0L; + } + break; + + case WM_MEASUREITEM: { + MEASUREITEMSTRUCT * mi = (MEASUREITEMSTRUCT *)lParam; + if (bb->type != B_BUTTON || (bb->option & BO_ICON) == 0) + break; + mi->CtlType = ODT_BUTTON; + mi->CtlID = wParam; + mi->itemWidth = bb->w; + mi->itemHeight = bb->h; + } return 0L; + + case WM_DRAWITEM: + if (bb->type == B_BUTTON && (bb->option & BO_ICON) != 0) { + selected = ((di->itemState & ODS_SELECTED) != 0); + if (bb->selected != selected) { + bb->selected = selected; + InvalidateRgn( bb->hWnd, NULL, FALSE ); + } + return TRUE; + } + break; + + } + return DefWindowProc( hWnd, message, wParam, lParam ); +} + + +static void buttDone( + wControl_p b ) +{ + free(b); +} + +long FAR PASCAL _export pushButt( + HWND hWnd, + UINT message, + UINT wParam, + LONG lParam ) +{ + /* Catch <Return> and cause focus to leave control */ +#ifdef WIN32 + long inx = GetWindowLong( hWnd, GWL_ID ); +#else + short inx = GetWindowWord( hWnd, GWW_ID ); +#endif + wButton_p b = (wButton_p)mswMapIndex( inx ); + PAINTSTRUCT ps; + + switch (message) { + case WM_PAINT: + if ( b && b->type == B_BUTTON && (b->option & BO_ICON) != 0 ) { + BeginPaint( hWnd, &ps ); + buttDrawIcon( (wButton_p)b, ps.hdc ); + EndPaint( hWnd, &ps ); + return 1L; + } + break; + case WM_CHAR: + if ( b != NULL ) { + switch( wParam ) { + case 0x0D: + case 0x1B: + case 0x09: + /*SetFocus( ((wControl_p)(b->parent))->hWnd );*/ + SendMessage( ((wControl_p)(b->parent))->hWnd, WM_CHAR, + wParam, lParam ); + /*SendMessage( ((wControl_p)(b->parent))->hWnd, WM_COMMAND, + inx, MAKELONG( hWnd, EN_KILLFOCUS ) );*/ + return 0L; + } + } + break; + case WM_KILLFOCUS: + if ( b ) + InvalidateRect( b->hWnd, NULL, TRUE ); + return 0L; + break; + case WM_ERASEBKGND: + if (kludge12) + return 1L; + } + return CallWindowProc( oldButtProc, hWnd, message, wParam, lParam ); +} + +static callBacks_t buttonCallBacks = { + mswRepaintLabel, + buttDone, + buttPush }; + +wButton_p wButtonCreate( + wWin_p parent, + POS_T x, + POS_T y, + const char * helpStr, + const char * labelStr, + long option, + wPos_t width, + wButtonCallBack_p action, + void * data ) +{ + wButton_p b; + RECT rect; + int h=20; + int index; + DWORD style; + HDC hDc; + wIcon_p bm; + + if (width <= 0) + width = 80; + if ((option&BO_ICON) == 0) { + labelStr = mswStrdup( labelStr ); + } else { + bm = (wIcon_p)labelStr; + labelStr = NULL; + } + b = (wButton_p)mswAlloc( parent, B_BUTTON, NULL, sizeof *b, data, &index ); + b->option = option; + b->busy = 0; + b->selected = 0; + mswComputePos( (wControl_p)b, x, y ); + if (b->option&BO_ICON) { + width = bm->w+10; + h = bm->h+10; + b->icon = bm; + } else { + width = (wPos_t)(width*mswScale); + } + style = ((b->option&BO_ICON)? BS_OWNERDRAW : BS_PUSHBUTTON) | + WS_CHILD | WS_VISIBLE | + mswGetBaseStyle(parent); + if ((b->option&BB_DEFAULT) != 0) + style |= BS_DEFPUSHBUTTON; + b->hWnd = CreateWindow( "BUTTON", labelStr, style, b->x, b->y, + /*CW_USEDEFAULT, CW_USEDEFAULT,*/ width, h, + ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL ); + if (b->hWnd == NULL) { + mswFail("CreateWindow(BUTTON)"); + return b; + } + /*SetWindowLong( b->hWnd, 0, (long)b );*/ + GetWindowRect( b->hWnd, &rect ); + b->w = rect.right - rect.left; + b->h = rect.bottom - rect.top; + mswAddButton( (wControl_p)b, TRUE, helpStr ); + b->action = action; + mswCallBacks[B_BUTTON] = &buttonCallBacks; + mswChainFocus( (wControl_p)b ); + newButtProc = MakeProcInstance( (XWNDPROC)pushButt, mswHInst ); + oldButtProc = (XWNDPROC)GetWindowLong( b->hWnd, GWL_WNDPROC ); + SetWindowLong( b->hWnd, GWL_WNDPROC, (LONG)newButtProc ); + if (mswPalette) { + hDc = GetDC( b->hWnd ); + SelectPalette( hDc, mswPalette, 0 ); + RealizePalette( hDc ); + ReleaseDC( b->hWnd, hDc ); + } + if ( !mswThickFont ) + SendMessage( b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L ); + return b; +} |