summaryrefslogtreecommitdiff
path: root/ldmicro/simpledialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ldmicro/simpledialog.cpp')
-rw-r--r--ldmicro/simpledialog.cpp422
1 files changed, 422 insertions, 0 deletions
diff --git a/ldmicro/simpledialog.cpp b/ldmicro/simpledialog.cpp
new file mode 100644
index 0000000..14aab25
--- /dev/null
+++ b/ldmicro/simpledialog.cpp
@@ -0,0 +1,422 @@
+//-----------------------------------------------------------------------------
+// Copyright 2007 Jonathan Westhues
+//
+// This file is part of LDmicro.
+//
+// LDmicro is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// LDmicro is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with LDmicro. If not, see <http://www.gnu.org/licenses/>.
+//------
+//
+// All the simple dialogs that just require a row of text boxes: timer name
+// and delay, counter name and count, move and arithmetic destination and
+// operands. Try to reuse code a bit.
+// Jonathan Westhues, Nov 2004
+//-----------------------------------------------------------------------------
+#include "linuxUI.h"
+//#include <commctrl.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "ldmicro.h"
+
+static HWND SimpleDialog;
+
+#define MAX_BOXES 5
+
+static HWND Textboxes[MAX_BOXES];
+static HWND Labels[MAX_BOXES];
+
+static LONG_PTR PrevAlnumOnlyProc[MAX_BOXES];
+static LONG_PTR PrevNumOnlyProc[MAX_BOXES];
+
+static BOOL NoCheckingOnBox[MAX_BOXES];
+
+//-----------------------------------------------------------------------------
+// Don't allow any characters other than -A-Za-z0-9_ in the box.
+//-----------------------------------------------------------------------------
+// static LRESULT CALLBACK MyAlnumOnlyProc(HWND hwnd, UINT msg, WPARAM wParam,
+// LPARAM lParam)
+// {
+// if(msg == WM_CHAR) {
+// if(!(isalpha(wParam) || isdigit(wParam) || wParam == '_' ||
+// wParam == '\b' || wParam == '-' || wParam == '\''))
+// {
+// return 0;
+// }
+// }
+
+// int i;
+// for(i = 0; i < MAX_BOXES; i++) {
+// if(hwnd == Textboxes[i]) {
+// return CallWindowProc((WNDPROC)PrevAlnumOnlyProc[i], hwnd, msg,
+// wParam, lParam);
+// }
+// }
+// oops();
+// }
+
+//-----------------------------------------------------------------------------
+// Don't allow any characters other than -0-9. in the box.
+//-----------------------------------------------------------------------------
+// static LRESULT CALLBACK MyNumOnlyProc(HWND hwnd, UINT msg, WPARAM wParam,
+// LPARAM lParam)
+// {
+// if(msg == WM_CHAR) {
+// if(!(isdigit(wParam) || wParam == '.' || wParam == '\b'
+// || wParam == '-'))
+// {
+// return 0;
+// }
+// }
+
+// int i;
+// for(i = 0; i < MAX_BOXES; i++) {
+// if(hwnd == Textboxes[i]) {
+// return CallWindowProc((WNDPROC)PrevNumOnlyProc[i], hwnd, msg,
+// wParam, lParam);
+// }
+// }
+// oops();
+// }
+
+// static void MakeControls(int boxes, char **labels, DWORD fixedFontMask)
+// {
+// int i;
+// HDC hdc = GetDC(SimpleDialog);
+// SelectObject(hdc, MyNiceFont);
+
+// SIZE si;
+
+// int maxLen = 0;
+// for(i = 0; i < boxes; i++) {
+// GetTextExtentPoint32(hdc, labels[i], strlen(labels[i]), &si);
+// if(si.cx > maxLen) maxLen = si.cx;
+// }
+
+// int adj;
+// if(maxLen > 70) {
+// adj = maxLen - 70;
+// } else {
+// adj = 0;
+// }
+
+// for(i = 0; i < boxes; i++) {
+// GetTextExtentPoint32(hdc, labels[i], strlen(labels[i]), &si);
+
+// Labels[i] = CreateWindowEx(0, WC_STATIC, labels[i],
+// WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
+// (80 + adj) - si.cx - 4, 13 + i*30, si.cx, 21,
+// SimpleDialog, NULL, Instance, NULL);
+// NiceFont(Labels[i]);
+
+// Textboxes[i] = CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, "",
+// WS_CHILD | ES_AUTOHSCROLL | WS_TABSTOP | WS_CLIPSIBLINGS |
+// WS_VISIBLE,
+// 80 + adj, 12 + 30*i, 120 - adj, 21,
+// SimpleDialog, NULL, Instance, NULL);
+
+// if(fixedFontMask & (1 << i)) {
+// FixedFont(Textboxes[i]);
+// } else {
+// NiceFont(Textboxes[i]);
+// }
+// }
+// ReleaseDC(SimpleDialog, hdc);
+
+// OkButton = CreateWindowEx(0, WC_BUTTON, _("OK"),
+// WS_CHILD | WS_TABSTOP | WS_CLIPSIBLINGS | WS_VISIBLE | BS_DEFPUSHBUTTON,
+// 218, 11, 70, 23, SimpleDialog, NULL, Instance, NULL);
+// NiceFont(OkButton);
+
+// CancelButton = CreateWindowEx(0, WC_BUTTON, _("Cancel"),
+// WS_CHILD | WS_TABSTOP | WS_CLIPSIBLINGS | WS_VISIBLE,
+// 218, 41, 70, 23, SimpleDialog, NULL, Instance, NULL);
+// NiceFont(CancelButton);
+// }
+
+// BOOL ShowSimpleDialog(char *title, int boxes, char **labels, DWORD numOnlyMask,
+// DWORD alnumOnlyMask, DWORD fixedFontMask, char **dests)
+// {
+// BOOL didCancel;
+
+// if(boxes > MAX_BOXES) oops();
+
+// SimpleDialog = CreateWindowClient(0, "LDmicroDialog", title,
+// WS_OVERLAPPED | WS_SYSMENU,
+// 100, 100, 304, 15 + 30*(boxes < 2 ? 2 : boxes), NULL, NULL,
+// Instance, NULL);
+
+// MakeControls(boxes, labels, fixedFontMask);
+
+// int i;
+// for(i = 0; i < boxes; i++) {
+// SendMessage(Textboxes[i], WM_SETTEXT, 0, (LPARAM)dests[i]);
+
+// if(numOnlyMask & (1 << i)) {
+// PrevNumOnlyProc[i] = SetWindowLongPtr(Textboxes[i], GWLP_WNDPROC,
+// (LONG_PTR)MyNumOnlyProc);
+// }
+// if(alnumOnlyMask & (1 << i)) {
+// PrevAlnumOnlyProc[i] = SetWindowLongPtr(Textboxes[i], GWLP_WNDPROC,
+// (LONG_PTR)MyAlnumOnlyProc);
+// }
+// }
+
+// EnableWindow(MainWindow, FALSE);
+// ShowWindow(SimpleDialog, TRUE);
+// SetFocus(Textboxes[0]);
+// SendMessage(Textboxes[0], EM_SETSEL, 0, -1);
+
+// MSG msg;
+// DWORD ret;
+// DialogDone = FALSE;
+// DialogCancel = FALSE;
+// while((ret = GetMessage(&msg, NULL, 0, 0)) && !DialogDone) {
+// if(msg.message == WM_KEYDOWN) {
+// if(msg.wParam == VK_RETURN) {
+// DialogDone = TRUE;
+// break;
+// } else if(msg.wParam == VK_ESCAPE) {
+// DialogDone = TRUE;
+// DialogCancel = TRUE;
+// break;
+// }
+// }
+
+// if(IsDialogMessage(SimpleDialog, &msg)) continue;
+// TranslateMessage(&msg);
+// DispatchMessage(&msg);
+// }
+
+// didCancel = DialogCancel;
+
+// if(!didCancel) {
+// for(i = 0; i < boxes; i++) {
+// if(NoCheckingOnBox[i]) {
+// char get[64];
+// SendMessage(Textboxes[i], WM_GETTEXT, 60, (LPARAM)get);
+// strcpy(dests[i], get);
+// } else {
+// char get[20];
+// SendMessage(Textboxes[i], WM_GETTEXT, 15, (LPARAM)get);
+
+// if( (!strchr(get, '\'')) ||
+// (get[0] == '\'' && get[2] == '\'' && strlen(get)==3) )
+// {
+// if(strlen(get) == 0) {
+// Error(_("Empty textbox; not permitted."));
+// } else {
+// strcpy(dests[i], get);
+// }
+// } else {
+// Error(_("Bad use of quotes: <%s>"), get);
+// }
+// }
+// }
+// }
+
+// EnableWindow(MainWindow, TRUE);
+// DestroyWindow(SimpleDialog);
+
+// return !didCancel;
+// }
+
+// void ShowTimerDialog(int which, int *delay, char *name)
+// {
+// char *s;
+// switch(which) {
+// case ELEM_TON: s = _("Turn-On Delay"); break;
+// case ELEM_TOF: s = _("Turn-Off Delay"); break;
+// case ELEM_RTO: s = _("Retentive Turn-On Delay"); break;
+// default: oops(); break;
+// }
+
+// char *labels[] = { _("Name:"), _("Delay (ms):") };
+
+// char delBuf[16];
+// char nameBuf[16];
+// sprintf(delBuf, "%.3f", (*delay / 1000.0));
+// strcpy(nameBuf, name+1);
+// char *dests[] = { nameBuf, delBuf };
+
+// if(ShowSimpleDialog(s, 2, labels, (1 << 1), (1 << 0), (1 << 0), dests)) {
+// name[0] = 'T';
+// strcpy(name+1, nameBuf);
+// double del = atof(delBuf);
+// if(del > 2140000) { // 2**31/1000, don't overflow signed int
+// Error(_("Delay too long; maximum is 2**31 us."));
+// } else if(del <= 0) {
+// Error(_("Delay cannot be zero or negative."));
+// } else {
+// *delay = (int)(1000*del + 0.5);
+// }
+// }
+// }
+
+// void ShowCounterDialog(int which, int *maxV, char *name)
+// {
+// char *title;
+
+// switch(which) {
+// case ELEM_CTU: title = _("Count Up"); break;
+// case ELEM_CTD: title = _("Count Down"); break;
+// case ELEM_CTC: title = _("Circular Counter"); break;
+
+// default: oops();
+// }
+
+// char *labels[] = { _("Name:"), (which == ELEM_CTC ? _("Max value:") :
+// _("True if >= :")) };
+// char maxS[128];
+// sprintf(maxS, "%d", *maxV);
+// char *dests[] = { name+1, maxS };
+// ShowSimpleDialog(title, 2, labels, 0x2, 0x1, 0x1, dests);
+// *maxV = atoi(maxS);
+// }
+
+// void ShowCmpDialog(int which, char *op1, char *op2)
+// {
+// char *title;
+// char *l2;
+// switch(which) {
+// case ELEM_EQU:
+// title = _("If Equals");
+// l2 = "= :";
+// break;
+
+// case ELEM_NEQ:
+// title = _("If Not Equals");
+// l2 = "/= :";
+// break;
+
+// case ELEM_GRT:
+// title = _("If Greater Than");
+// l2 = "> :";
+// break;
+
+// case ELEM_GEQ:
+// title = _("If Greater Than or Equal To");
+// l2 = ">= :";
+// break;
+
+// case ELEM_LES:
+// title = _("If Less Than");
+// l2 = "< :";
+// break;
+
+// case ELEM_LEQ:
+// title = _("If Less Than or Equal To");
+// l2 = "<= :";
+// break;
+
+// default:
+// oops();
+// }
+// char *labels[] = { _("'Closed' if:"), l2 };
+// char *dests[] = { op1, op2 };
+// ShowSimpleDialog(title, 2, labels, 0, 0x3, 0x3, dests);
+// }
+
+// void ShowMoveDialog(char *dest, char *src)
+// {
+// char *labels[] = { _("Destination:"), _("Source:") };
+// char *dests[] = { dest, src };
+// ShowSimpleDialog(_("Move"), 2, labels, 0, 0x3, 0x3, dests);
+// }
+
+// void ShowReadAdcDialog(char *name)
+// {
+// char *labels[] = { _("Destination:") };
+// char *dests[] = { name };
+// ShowSimpleDialog(_("Read A/D Converter"), 1, labels, 0, 0x1, 0x1, dests);
+// }
+
+// void ShowSetPwmDialog(char *name, int *targetFreq)
+// {
+// char freq[100];
+// sprintf(freq, "%d", *targetFreq);
+
+// char *labels[] = { _("Duty cycle var:"), _("Frequency (Hz):") };
+// char *dests[] = { name, freq };
+// ShowSimpleDialog(_("Set PWM Duty Cycle"), 2, labels, 0x2, 0x1, 0x1, dests);
+
+// *targetFreq = atoi(freq);
+// }
+
+// void ShowUartDialog(int which, char *name)
+// {
+// char *labels[] = { (which == ELEM_UART_RECV) ? _("Destination:") :
+// _("Source:") };
+// char *dests[] = { name };
+
+// ShowSimpleDialog((which == ELEM_UART_RECV) ? _("Receive from UART") :
+// _("Send to UART"), 1, labels, 0, 0x1, 0x1, dests);
+// }
+
+// void ShowMathDialog(int which, char *dest, char *op1, char *op2)
+// {
+// char *l2, *title;
+// if(which == ELEM_ADD) {
+// l2 = "+ :";
+// title = _("Add");
+// } else if(which == ELEM_SUB) {
+// l2 = "- :";
+// title = _("Subtract");
+// } else if(which == ELEM_MUL) {
+// l2 = "* :";
+// title = _("Multiply");
+// } else if(which == ELEM_DIV) {
+// l2 = "/ :";
+// title = _("Divide");
+// } else oops();
+
+// char *labels[] = { _("Destination:"), _("is set := :"), l2 };
+// char *dests[] = { dest, op1, op2 };
+// ShowSimpleDialog(title, 3, labels, 0, 0x7, 0x7, dests);
+// }
+
+// void ShowShiftRegisterDialog(char *name, int *stages)
+// {
+// char stagesStr[20];
+// sprintf(stagesStr, "%d", *stages);
+
+// char *labels[] = { _("Name:"), _("Stages:") };
+// char *dests[] = { name, stagesStr };
+// ShowSimpleDialog(_("Shift Register"), 2, labels, 0x2, 0x1, 0x1, dests);
+
+// *stages = atoi(stagesStr);
+
+// if(*stages <= 0 || *stages >= 200) {
+// Error(_("Not a reasonable size for a shift register."));
+// *stages = 1;
+// }
+// }
+
+// void ShowFormattedStringDialog(char *var, char *string)
+// {
+// char *labels[] = { _("Variable:"), _("String:") };
+// char *dests[] = { var, string };
+// NoCheckingOnBox[0] = TRUE;
+// NoCheckingOnBox[1] = TRUE;
+// ShowSimpleDialog(_("Formatted String Over UART"), 2, labels, 0x0,
+// 0x1, 0x3, dests);
+// NoCheckingOnBox[0] = FALSE;
+// NoCheckingOnBox[1] = FALSE;
+// }
+
+// void ShowPersistDialog(char *var)
+// {
+// char *labels[] = { _("Variable:") };
+// char *dests[] = { var };
+// ShowSimpleDialog(_("Make Persistent"), 1, labels, 0, 1, 1, dests);
+// }