aboutsummaryrefslogtreecommitdiffstats
path: root/Library/UefiShellUfmCommandLib/panel.c
blob: 3f5e2088cba11c601b4fc31dbfd07bfa2c180f23 (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
108
109
110
111
112
113
#include <Library/UefiLib.h>
#include <Library/DebugLib.h>
#include <Library/ShellLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>

#include "tbi/screen.h"
#include "tbi/win.h"
#include "dir.h"
#include "fs.h"
#include "panel.h"

#define SIZE_COLS 7
#define MODIFYTIME_COLS 12

struct panel_ctx *panel_alloc(struct screen *scr, CONST CHAR16 *path,
		INT32 cols, INT32 lines, INT32 x, INT32 y)
{
	ASSERT(scr != NULL);

	struct panel_ctx *panel;
	UINTN name_cols = cols - 1 - MODIFYTIME_COLS - 1 - SIZE_COLS - 1 - 1;
	UINTN rows = lines - 2;
	BOOLEAN res = FALSE;

	panel = AllocateZeroPool(sizeof(struct panel_ctx));
	if(!panel)
		return NULL;

	do { // START DO

	panel->wname = newwin(scr, name_cols + 2, rows, x, y);
	if(!panel->wname)
		break;
	wborder(panel->wname,
		BOXDRAW_VERTICAL, BOXDRAW_VERTICAL,
		BOXDRAW_HORIZONTAL, BOXDRAW_HORIZONTAL,
		BOXDRAW_DOWN_RIGHT, BOXDRAW_DOWN_HORIZONTAL,
		BOXDRAW_VERTICAL_RIGHT, BOXDRAW_UP_HORIZONTAL
	);
	mvwprintf(panel->wname, 1 + ((name_cols - 4) / 2), 1, L"Name");

	panel->wsize = newwin(scr, SIZE_COLS + 2, rows, x + 1 + name_cols, y);
	if(!panel->wsize)
		break;
	wborder(panel->wsize,
		BOXDRAW_VERTICAL, BOXDRAW_VERTICAL,
		BOXDRAW_HORIZONTAL, BOXDRAW_HORIZONTAL,
		BOXDRAW_DOWN_HORIZONTAL, BOXDRAW_DOWN_HORIZONTAL,
		BOXDRAW_UP_HORIZONTAL, BOXDRAW_UP_HORIZONTAL
	);
	mvwprintf(panel->wsize, 1 + ((SIZE_COLS - 4) / 2), 1, L"Size");

	panel->wmodt = newwin(scr, MODIFYTIME_COLS + 2, rows,
		x + 1 + name_cols + 1 + SIZE_COLS, y);
	if(!panel->wmodt)
		break;
	wborder(panel->wmodt,
		BOXDRAW_VERTICAL, BOXDRAW_VERTICAL,
		BOXDRAW_HORIZONTAL, BOXDRAW_HORIZONTAL,
		BOXDRAW_DOWN_HORIZONTAL, BOXDRAW_DOWN_LEFT,
		BOXDRAW_UP_HORIZONTAL, BOXDRAW_VERTICAL_LEFT
	);
	mvwprintf(panel->wmodt, 1 + ((MODIFYTIME_COLS - 11) / 2), 1, L"Modify Time");

	panel->winfo = newwin(scr, cols, 3, x, y + lines - 3);
	if(!panel->winfo)
		break;
	wborder(panel->winfo,
		BOXDRAW_VERTICAL, BOXDRAW_VERTICAL,
		BOXDRAW_HORIZONTAL, BOXDRAW_HORIZONTAL,
		BOXDRAW_VERTICAL_RIGHT, BOXDRAW_VERTICAL_LEFT,
		BOXDRAW_UP_RIGHT, BOXDRAW_UP_LEFT
	);

	res = TRUE;

	} while(0); // END DO

	panel->cwd = path;
	panel->curline = 1;
	panel->list_lines = rows - 2 - 1;
	panel->start_entry = 1;

	if(!res) {
		panel_release(panel);
		return NULL;
	}

	res = panel_show(panel, panel->cwd);
	if(!res) {
		panel_release(panel);
		return NULL;
	}
	return panel;
}

VOID panel_release(struct panel_ctx *p)
{
	ASSERT(p != NULL);

	if(p->winfo)
		delwin(p->winfo);
	if(p->wname)
		delwin(p->wname);
	if(p->wsize)
		delwin(p->wsize);
	if(p->wmodt)
		delwin(p->wmodt);

	FreePool(p);
}