summaryrefslogtreecommitdiff
path: root/app/wlib/mswlib/mswlines.c
blob: a55618eecbc289f0f07b397ecb1535d7099f28a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
#include "mswint.h"

/*
 *****************************************************************************
 *
 * Lines
 *
 *****************************************************************************
 */

struct wLine_t {
	WOBJ_COMMON
	int count;
	wLines_t * lines;
};

static void repaintLines( HWND hWnd, wControl_p b )
{
	int lastWidth;
	HDC hDc;
	wLine_p bl = (wLine_p)(b);
	wLines_p lp;
	HPEN oldPen, newPen;

	lastWidth = -1;
	hDc = GetDC( hWnd );
	for (lp=bl->lines; lp<&bl->lines[bl->count]; lp++) {
		if (lastWidth != lp->width) {
			lastWidth = lp->width;
			newPen = CreatePen( PS_SOLID, lastWidth, RGB(0,0,0) );
			oldPen = SelectObject( hDc, newPen );
			DeleteObject( oldPen );
		}
		MoveTo( hDc, lp->x0, lp->y0 );
		LineTo( hDc, lp->x1, lp->y1 );
	}
	ReleaseDC( hWnd, hDc );
}


static callBacks_t linesCallBacks = {
	repaintLines,
	NULL,
	NULL
};


wLine_p wLineCreate(
        wWin_p	parent,
        const char	* labelStr,
        int		count,
        wLines_t * lines )
{
	wLine_p b;
	wLines_p lp;
	wWinPix_t minX, maxX, minY, maxY;
	int index;

	if (count <= 0) {
		return NULL;
	}
	b = (wLine_p)mswAlloc( parent, B_LINES, labelStr, sizeof *b, NULL, &index );
	b->count = count;
	b->lines = lines;

	lp = lines;
	minX = maxX = lp->x0;
	minY = maxY = lp->y0;
	for (lp=lines; lp<&b->lines[count]; lp++) {
		if (minX > lp->x0) {
			minX = lp->x0;
		}
		if (maxX < lp->x0) {
			maxX = lp->x0;
		}
		if (minY > lp->y0) {
			minY = lp->y0;
		}
		if (maxY < lp->y0) {
			maxY = lp->y0;
		}
		if (minX > lp->x1) {
			minX = lp->x1;
		}
		if (maxX < lp->x1) {
			maxX = lp->x1;
		}
		if (minY > lp->y1) {
			minY = lp->y1;
		}
		if (maxY < lp->y1) {
			maxY = lp->y1;
		}
	}
	b->x = minX;
	b->y = minY;
	b->w = maxX-minX;
	b->h = maxY-minY;
	mswAddButton( (wControl_p)b, FALSE, NULL );
	mswCallBacks[B_LINES] = &linesCallBacks;
	return b;
}