Added D-Flat/32 library
authorEric Kohl <eric.kohl@reactos.org>
Sun, 5 Mar 2000 19:58:08 +0000 (19:58 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 5 Mar 2000 19:58:08 +0000 (19:58 +0000)
svn path=/trunk/; revision=1032

66 files changed:
rosapps/Makefile
rosapps/dflat32/applicat.c [new file with mode: 0644]
rosapps/dflat32/barchart.c [new file with mode: 0644]
rosapps/dflat32/box.c [new file with mode: 0644]
rosapps/dflat32/button.c [new file with mode: 0644]
rosapps/dflat32/calendar.c [new file with mode: 0644]
rosapps/dflat32/checkbox.c [new file with mode: 0644]
rosapps/dflat32/classdef.h [new file with mode: 0644]
rosapps/dflat32/classes.h [new file with mode: 0644]
rosapps/dflat32/clipbord.c [new file with mode: 0644]
rosapps/dflat32/combobox.c [new file with mode: 0644]
rosapps/dflat32/commands.h [new file with mode: 0644]
rosapps/dflat32/config.c [new file with mode: 0644]
rosapps/dflat32/config.h [new file with mode: 0644]
rosapps/dflat32/console.c [new file with mode: 0644]
rosapps/dflat32/decomp.c [new file with mode: 0644]
rosapps/dflat32/dfalloc.c [new file with mode: 0644]
rosapps/dflat32/dflat.doc [new file with mode: 0644]
rosapps/dflat32/dflat.h [new file with mode: 0644]
rosapps/dflat32/dflatmsg.h [new file with mode: 0644]
rosapps/dflat32/dialbox.c [new file with mode: 0644]
rosapps/dflat32/dialbox.h [new file with mode: 0644]
rosapps/dflat32/dialogs.c [new file with mode: 0644]
rosapps/dflat32/direct.c [new file with mode: 0644]
rosapps/dflat32/edit.c [new file with mode: 0644]
rosapps/dflat32/edit.txt [new file with mode: 0644]
rosapps/dflat32/editbox.c [new file with mode: 0644]
rosapps/dflat32/fileopen.c [new file with mode: 0644]
rosapps/dflat32/help.txt [new file with mode: 0644]
rosapps/dflat32/helpbox.c [new file with mode: 0644]
rosapps/dflat32/htree.c [new file with mode: 0644]
rosapps/dflat32/htree.h [new file with mode: 0644]
rosapps/dflat32/huffc.c [new file with mode: 0644]
rosapps/dflat32/keys.c [new file with mode: 0644]
rosapps/dflat32/keys.h [new file with mode: 0644]
rosapps/dflat32/listbox.c [new file with mode: 0644]
rosapps/dflat32/lists.c [new file with mode: 0644]
rosapps/dflat32/log.c [new file with mode: 0644]
rosapps/dflat32/makefile [new file with mode: 0644]
rosapps/dflat32/memopad.c [new file with mode: 0644]
rosapps/dflat32/menu.c [new file with mode: 0644]
rosapps/dflat32/menu.h [new file with mode: 0644]
rosapps/dflat32/menubar.c [new file with mode: 0644]
rosapps/dflat32/menus.c [new file with mode: 0644]
rosapps/dflat32/message.c [new file with mode: 0644]
rosapps/dflat32/msgbox.c [new file with mode: 0644]
rosapps/dflat32/normal.c [new file with mode: 0644]
rosapps/dflat32/pictbox.c [new file with mode: 0644]
rosapps/dflat32/popdown.c [new file with mode: 0644]
rosapps/dflat32/radio.c [new file with mode: 0644]
rosapps/dflat32/readme.doc [new file with mode: 0644]
rosapps/dflat32/readme.txt [new file with mode: 0644]
rosapps/dflat32/rect.c [new file with mode: 0644]
rosapps/dflat32/rect.h [new file with mode: 0644]
rosapps/dflat32/search.c [new file with mode: 0644]
rosapps/dflat32/slidebox.c [new file with mode: 0644]
rosapps/dflat32/spinbutt.c [new file with mode: 0644]
rosapps/dflat32/statbar.c [new file with mode: 0644]
rosapps/dflat32/sysmenu.c [new file with mode: 0644]
rosapps/dflat32/system.h [new file with mode: 0644]
rosapps/dflat32/text.c [new file with mode: 0644]
rosapps/dflat32/textbox.c [new file with mode: 0644]
rosapps/dflat32/video.c [new file with mode: 0644]
rosapps/dflat32/video.h [new file with mode: 0644]
rosapps/dflat32/watch.c [new file with mode: 0644]
rosapps/dflat32/window.c [new file with mode: 0644]

index 03a1c1f..23e905d 100644 (file)
@@ -13,7 +13,7 @@ include rules.mak
 #
 # Available applications
 #
-APPS = cmd cmdutils notevil sysutils
+APPS = cmd cmdutils notevil sysutils dflat32
 
 all: $(APPS)
 .PHONY: all
diff --git a/rosapps/dflat32/applicat.c b/rosapps/dflat32/applicat.c
new file mode 100644 (file)
index 0000000..270cf06
--- /dev/null
@@ -0,0 +1,621 @@
+/* ------------- applicat.c ------------- */
+
+#include "dflat.h"
+
+static int ScreenHeight;
+static BOOL DisplayModified = FALSE;
+DFWINDOW ApplicationWindow;
+
+extern DBOX Display;
+extern DBOX Windows;
+
+#ifdef INCLUDE_LOGGING
+extern DBOX Log;
+#endif
+
+#ifdef INCLUDE_SHELLDOS
+static void ShellDOS(DFWINDOW);
+#endif
+static void DfCreateMenu(DFWINDOW);
+static void CreateStatusBar(DFWINDOW);
+static void SelectColors(DFWINDOW);
+
+#ifdef INCLUDE_WINDOWOPTIONS
+static void SelectTexture(void);
+static void SelectBorder(DFWINDOW);
+static void SelectTitle(DFWINDOW);
+static void SelectStatusBar(DFWINDOW);
+#endif
+
+static DFWINDOW oldFocus;
+#ifdef INCLUDE_MULTI_WINDOWS
+static void CloseAll(DFWINDOW, int);
+static void MoreWindows(DFWINDOW);
+static void ChooseWindow(DFWINDOW, int);
+static int WindowSel;
+static char Menus[9][26] =
+{
+       "~1.                      ",
+       "~2.                      ",
+       "~3.                      ",
+       "~4.                      ",
+       "~5.                      ",
+       "~6.                      ",
+       "~7.                      ",
+       "~8.                      ",
+       "~9.                      "
+};
+#endif
+
+/* --------------- CREATE_WINDOW Message -------------- */
+static int CreateWindowMsg(DFWINDOW wnd)
+{
+    int rtn;
+       ApplicationWindow = wnd;
+    ScreenHeight = SCREENHEIGHT;
+#ifdef INCLUDE_WINDOWOPTIONS
+    if (cfg.Border)
+        SetCheckBox(&Display, ID_BORDER);
+    if (cfg.Title)
+        SetCheckBox(&Display, ID_TITLE);
+    if (cfg.StatusBar)
+        SetCheckBox(&Display, ID_STATUSBAR);
+    if (cfg.Texture)
+        SetCheckBox(&Display, ID_TEXTURE);
+#endif
+    SelectColors(wnd);
+#ifdef INCLUDE_WINDOWOPTIONS
+    SelectBorder(wnd);
+    SelectTitle(wnd);
+    SelectStatusBar(wnd);
+#endif
+    rtn = BaseWndProc(APPLICATION, wnd, CREATE_WINDOW, 0, 0);
+    if (wnd->extension != NULL)
+        DfCreateMenu(wnd);
+    CreateStatusBar(wnd);
+    return rtn;
+}
+
+/* --------- ADDSTATUS Message ---------- */
+static void AddStatusMsg(DFWINDOW wnd, PARAM p1)
+{
+    if (wnd->StatusBar != NULL)    {
+        if (p1 && *(char *)p1)
+            DfSendMessage(wnd->StatusBar, SETTEXT, p1, 0);
+        else 
+            DfSendMessage(wnd->StatusBar, CLEARTEXT, 0, 0);
+        DfSendMessage(wnd->StatusBar, PAINT, 0, 0);
+    }
+}
+
+/* -------- SETFOCUS Message -------- */
+static void SetFocusMsg(DFWINDOW wnd, BOOL p1)
+{
+    if (p1)
+        DfSendMessage(inFocus, SETFOCUS, FALSE, 0);
+    inFocus = p1 ? wnd : NULL;
+       if (isVisible(wnd))
+           DfSendMessage(wnd, BORDER, 0, 0);
+       else 
+           DfSendMessage(wnd, SHOW_WINDOW, 0, 0);
+}
+
+/* ------- SIZE Message -------- */
+static void SizeMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    BOOL WasVisible;
+    WasVisible = isVisible(wnd);
+    if (WasVisible)
+        DfSendMessage(wnd, DFM_HIDE_WINDOW, 0, 0);
+    if (p1-GetLeft(wnd) < 30)
+        p1 = GetLeft(wnd) + 30;
+    BaseWndProc(APPLICATION, wnd, DFM_SIZE, p1, p2);
+    DfCreateMenu(wnd);
+    CreateStatusBar(wnd);
+    if (WasVisible)
+        DfSendMessage(wnd, SHOW_WINDOW, 0, 0);
+}
+
+/* ----------- KEYBOARD Message ------------ */
+static int KeyboardMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    if (WindowMoving || WindowSizing || (int) p1 == F1)
+        return BaseWndProc(APPLICATION, wnd, KEYBOARD, p1, p2);
+    switch ((int) p1)    {
+        case ALT_F4:
+            DfPostMessage(wnd, CLOSE_WINDOW, 0, 0);
+            return TRUE;
+#ifdef INCLUDE_MULTI_WINDOWS
+        case ALT_F6:
+            SetNextFocus();
+            return TRUE;
+#endif
+        case ALT_HYPHEN:
+            BuildSystemMenu(wnd);
+            return TRUE;
+        default:
+            break;
+    }
+    DfPostMessage(wnd->MenuBarWnd, KEYBOARD, p1, p2);
+    return TRUE;
+}
+
+/* --------- SHIFT_CHANGED Message -------- */
+static void ShiftChangedMsg(DFWINDOW wnd, PARAM p1)
+{
+       extern BOOL AltDown;
+    if ((int)p1 & ALTKEY)
+        AltDown = TRUE;
+    else if (AltDown)    {
+        AltDown = FALSE;
+        if (wnd->MenuBarWnd != inFocus)
+            DfSendMessage(NULL, HIDE_CURSOR, 0, 0);
+        DfSendMessage(wnd->MenuBarWnd, KEYBOARD, F10, 0);
+    }
+}
+
+/* -------- COMMAND Message ------- */
+static void CommandMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    switch ((int)p1)    {
+        case ID_HELP:
+            DisplayHelp(wnd, DFlatApplication);
+            break;
+        case ID_HELPHELP:
+            DisplayHelp(wnd, "HelpHelp");
+            break;
+        case ID_EXTHELP:
+            DisplayHelp(wnd, "ExtHelp");
+            break;
+        case ID_KEYSHELP:
+            DisplayHelp(wnd, "KeysHelp");
+            break;
+        case ID_HELPINDEX:
+            DisplayHelp(wnd, "HelpIndex");
+            break;
+#ifdef TESTING_DFLAT
+        case ID_LOADHELP:
+            LoadHelpFile();
+            break;
+#endif
+#ifdef INCLUDE_LOGGING
+        case ID_LOG:
+            MessageLog(wnd);
+            break;
+#endif
+#ifdef INCLUDE_SHELLDOS
+        case ID_DOS:
+            ShellDOS(wnd);
+            break;
+#endif
+        case ID_EXIT:
+        case ID_SYSCLOSE:
+            DfPostMessage(wnd, CLOSE_WINDOW, 0, 0);
+            break;
+        case ID_DISPLAY:
+            if (DfDialogBox(wnd, &Display, TRUE, NULL))    {
+                               if (inFocus == wnd->MenuBarWnd || inFocus == wnd->StatusBar)
+                                       oldFocus = ApplicationWindow;
+                               else 
+                                       oldFocus = inFocus;
+                DfSendMessage(wnd, DFM_HIDE_WINDOW, 0, 0);
+                SelectColors(wnd);
+#ifdef INCLUDE_WINDOWOPTIONS
+                SelectBorder(wnd);
+                SelectTitle(wnd);
+                SelectStatusBar(wnd);
+                SelectTexture();
+#endif
+                DfCreateMenu(wnd);
+                CreateStatusBar(wnd);
+                DfSendMessage(wnd, SHOW_WINDOW, 0, 0);
+                           DfSendMessage(oldFocus, SETFOCUS, TRUE, 0);
+            }
+            break;
+        case ID_SAVEOPTIONS:
+            SaveConfig();
+            break;
+#ifdef INCLUDE_MULTI_WINDOWS
+        case ID_WINDOW:
+            ChooseWindow(wnd, (int)p2-2);
+            break;
+        case ID_CLOSEALL:
+            CloseAll(wnd, FALSE);
+            break;
+        case ID_MOREWINDOWS:
+            MoreWindows(wnd);
+            break;
+#endif
+#ifdef INCLUDE_RESTORE
+        case ID_SYSRESTORE:
+#endif
+        case ID_SYSMOVE:
+        case ID_SYSSIZE:
+#ifdef INCLUDE_MINIMIZE
+        case ID_SYSMINIMIZE:
+#endif
+#ifdef INCLUDE_MAXIMIZE
+        case ID_SYSMAXIMIZE:
+#endif
+            BaseWndProc(APPLICATION, wnd, DFM_COMMAND, p1, p2);
+            break;
+        default:
+            if (inFocus != wnd->MenuBarWnd && inFocus != wnd)
+                DfPostMessage(inFocus, DFM_COMMAND, p1, p2);
+            break;
+    }
+}
+
+/* --------- CLOSE_WINDOW Message -------- */
+static int CloseWindowMsg(DFWINDOW wnd)
+{
+    int rtn;
+#ifdef INCLUDE_MULTI_WINDOWS
+    CloseAll(wnd, TRUE);
+       WindowSel = 0;
+#endif
+    DfPostMessage(NULL, DFM_STOP, 0, 0);
+    rtn = BaseWndProc(APPLICATION, wnd, CLOSE_WINDOW, 0, 0);
+    UnLoadHelpFile();
+       DisplayModified = FALSE;
+       ApplicationWindow = NULL;
+    return rtn;
+}
+
+/* --- APPLICATION Window Class window processing module --- */
+int ApplicationProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
+{
+    switch (msg)
+    {
+        case CREATE_WINDOW:
+            return CreateWindowMsg(wnd);
+        case DFM_HIDE_WINDOW:
+            if (wnd == inFocus)
+                inFocus = NULL;
+            break;
+        case ADDSTATUS:
+            AddStatusMsg(wnd, p1);
+            return TRUE;
+        case SETFOCUS:
+            if ((int)p1 == (inFocus != wnd))    {
+                SetFocusMsg(wnd, (BOOL) p1);
+                return TRUE;
+            }
+            break;
+        case DFM_SIZE:
+            SizeMsg(wnd, p1, p2);
+            return TRUE;
+#ifdef INCLUDE_MINIMIZE
+        case MINIMIZE:
+            return TRUE;
+#endif
+        case KEYBOARD:
+            return KeyboardMsg(wnd, p1, p2);
+        case SHIFT_CHANGED:
+            ShiftChangedMsg(wnd, p1);
+            return TRUE;
+        case PAINT:
+            if (isVisible(wnd))    {
+#ifdef INCLUDE_WINDOWOPTIONS
+                int cl = cfg.Texture ? APPLCHAR : ' ';
+#else
+                int cl = APPLCHAR;
+#endif
+                ClearWindow(wnd, (DFRECT *)p1, cl);
+            }
+            return TRUE;
+        case DFM_COMMAND:
+            CommandMsg(wnd, p1, p2);
+            return TRUE;
+        case CLOSE_WINDOW:
+            return CloseWindowMsg(wnd);
+        default:
+            break;
+    }
+    return BaseWndProc(APPLICATION, wnd, msg, p1, p2);
+}
+
+#ifdef INCLUDE_SHELLDOS
+static void SwitchCursor(void)
+{
+    DfSendMessage(NULL, SAVE_CURSOR, 0, 0);
+    SwapCursorStack();
+    DfSendMessage(NULL, RESTORE_CURSOR, 0, 0);
+}
+
+/* ------- Shell out to DOS ---------- */
+static void ShellDOS(DFWINDOW wnd)
+{
+       oldFocus = inFocus;
+    DfSendMessage(wnd, DFM_HIDE_WINDOW, 0, 0);
+    SwitchCursor();
+    printf("To return to %s, execute the DOS exit command.",
+                    DFlatApplication);
+    fflush(stdout);
+    _spawnl(P_WAIT, getenv("COMSPEC"), " ", NULL);
+    SwitchCursor();
+       DfSendMessage(wnd, SHOW_WINDOW, 0, 0);
+    DfSendMessage(oldFocus, SETFOCUS, TRUE, 0);
+}
+#endif
+
+/* -------- Create the menu bar -------- */
+static void DfCreateMenu(DFWINDOW wnd)
+{
+    AddAttribute(wnd, HASMENUBAR);
+    if (wnd->MenuBarWnd != NULL)
+        DfSendMessage(wnd->MenuBarWnd, CLOSE_WINDOW, 0, 0);
+    wnd->MenuBarWnd = DfCreateWindow(MENUBAR,
+                        NULL,
+                        GetClientLeft(wnd),
+                        GetClientTop(wnd)-1,
+                        1,
+                        ClientWidth(wnd),
+                        NULL,
+                        wnd,
+                        NULL,
+                        0);
+    DfSendMessage(wnd->MenuBarWnd,BUILDMENU,
+        (PARAM)wnd->extension,0);
+    AddAttribute(wnd->MenuBarWnd, VISIBLE);
+}
+
+/* ----------- Create the status bar ------------- */
+static void CreateStatusBar(DFWINDOW wnd)
+{
+    if (wnd->StatusBar != NULL)    {
+        DfSendMessage(wnd->StatusBar, CLOSE_WINDOW, 0, 0);
+        wnd->StatusBar = NULL;
+    }
+    if (TestAttribute(wnd, HASSTATUSBAR))    {
+        wnd->StatusBar = DfCreateWindow(STATUSBAR,
+                            NULL,
+                            GetClientLeft(wnd),
+                            GetBottom(wnd),
+                            1,
+                            ClientWidth(wnd),
+                            NULL,
+                            wnd,
+                            NULL,
+                            0);
+        AddAttribute(wnd->StatusBar, VISIBLE);
+    }
+}
+
+#ifdef INCLUDE_MULTI_WINDOWS
+/* -------- return the name of a document window ------- */
+static char *WindowName(DFWINDOW wnd)
+{
+    if (GetTitle(wnd) == NULL)    {
+        if (GetClass(wnd) == DIALOG)
+            return ((DBOX *)(wnd->extension))->HelpName;
+        else 
+            return "Untitled";
+    }
+    else
+        return GetTitle(wnd);
+}
+
+/* ----------- Prepare the Window menu ------------ */
+void PrepWindowMenu(void *w, struct Menu *mnu)
+{
+    DFWINDOW wnd = w;
+    struct PopDown *p0 = mnu->Selections;
+    struct PopDown *pd = mnu->Selections + 2;
+    struct PopDown *ca = mnu->Selections + 13;
+    int MenuNo = 0;
+    DFWINDOW cwnd;
+
+       mnu->Selection = 0;
+       oldFocus = NULL;
+
+       if (GetClass(wnd) != APPLICATION)
+       {
+               oldFocus = wnd;
+
+               /* point to the APPLICATION window */
+               if (ApplicationWindow == NULL)
+                       return;
+
+               cwnd = FirstWindow(ApplicationWindow);
+               /* get the first 9 document windows */
+               while (cwnd != NULL && MenuNo < 9)
+               {
+                       if (GetClass(cwnd) != MENUBAR &&
+                           GetClass(cwnd) != STATUSBAR)
+                       {
+                               /* add the document window to the menu */
+                               strncpy (Menus[MenuNo]+4, WindowName(cwnd), 20);
+                               pd->SelectionTitle = Menus[MenuNo];
+                               if (cwnd == oldFocus)
+                               {
+                                       /* mark the current document */
+                                       pd->Attrib |= CHECKED;
+                                       mnu->Selection = MenuNo+2;
+                               }
+                               else
+                                       pd->Attrib &= ~CHECKED;
+                               pd++;
+                               MenuNo++;
+                       }
+                       cwnd = NextWindow(cwnd);
+               }
+       }
+
+       if (MenuNo)
+               p0->SelectionTitle = "~Close all";
+       else
+               p0->SelectionTitle = NULL;
+
+       if (MenuNo >= 9)
+       {
+               *pd++ = *ca;
+               if (mnu->Selection == 0)
+                       mnu->Selection = 11;
+       }
+       pd->SelectionTitle = NULL;
+}
+
+/* window processing module for the More Windows dialog box */
+static int WindowPrep(DFWINDOW wnd,DFMESSAGE msg,PARAM p1,PARAM p2)
+{
+    switch (msg)    {
+        case INITIATE_DIALOG:    {
+            DFWINDOW wnd1;
+            DFWINDOW cwnd = ControlWindow(&Windows,ID_WINDOWLIST);
+            int sel = 0;
+            if (cwnd == NULL)
+                return FALSE;
+                       wnd1 = FirstWindow(ApplicationWindow);
+                       while (wnd1 != NULL)    {
+                if (wnd1 != wnd && GetClass(wnd1) != MENUBAR &&
+                        GetClass(wnd1) != STATUSBAR)    {
+                    if (wnd1 == oldFocus)
+                        WindowSel = sel;
+                    DfSendMessage(cwnd, ADDTEXT,
+                        (PARAM) WindowName(wnd1), 0);
+                    sel++;
+                }
+                               wnd1 = NextWindow(wnd1);
+            }
+            DfSendMessage(cwnd, LB_SETSELECTION, WindowSel, 0);
+            AddAttribute(cwnd, VSCROLLBAR);
+            DfPostMessage(cwnd, SHOW_WINDOW, 0, 0);
+            break;
+        }
+        case DFM_COMMAND:
+            switch ((int) p1)    {
+                case ID_OK:
+                    if ((int)p2 == 0)
+                        WindowSel = DfSendMessage(
+                                    ControlWindow(&Windows,
+                                    ID_WINDOWLIST),
+                                    LB_CURRENTSELECTION, 0, 0);
+                    break;
+                case ID_WINDOWLIST:
+                    if ((int) p2 == LB_CHOOSE)
+                        DfSendMessage(wnd, DFM_COMMAND, ID_OK, 0);
+                    break;
+                default:
+                    break;
+            }
+            break;
+        default:
+            break;
+    }
+    return DefaultWndProc(wnd, msg, p1, p2);
+}
+
+/* ---- the More Windows command on the Window menu ---- */
+static void MoreWindows(DFWINDOW wnd)
+{
+    if (DfDialogBox(wnd, &Windows, TRUE, WindowPrep))
+        ChooseWindow(wnd, WindowSel);
+}
+
+/* ----- user chose a window from the Window menu
+        or the More Window dialog box ----- */
+static void ChooseWindow(DFWINDOW wnd, int WindowNo)
+{
+    DFWINDOW cwnd = FirstWindow(wnd);
+       while (cwnd != NULL)    {
+        if (GetClass(cwnd) != MENUBAR &&
+                GetClass(cwnd) != STATUSBAR)
+            if (WindowNo-- == 0)
+                break;
+               cwnd = NextWindow(cwnd);
+    }
+    if (cwnd != NULL)    {
+        DfSendMessage(cwnd, SETFOCUS, TRUE, 0);
+        if (cwnd->condition == ISMINIMIZED)
+            DfSendMessage(cwnd, RESTORE, 0, 0);
+    }
+}
+
+/* ----- Close all document windows ----- */
+static void CloseAll(DFWINDOW wnd, int closing)
+{
+       DFWINDOW wnd1, wnd2;
+
+       DfSendMessage(wnd, SETFOCUS, TRUE, 0);
+       wnd1 = LastWindow(wnd);
+       while (wnd1 != NULL)
+       {
+               wnd2 = PrevWindow(wnd1);
+               if (GetClass(wnd1) != MENUBAR && GetClass(wnd1) != STATUSBAR)
+               {
+                       ClearVisible(wnd1);
+                       DfSendMessage(wnd1, CLOSE_WINDOW, 0, 0);
+               }
+               wnd1 = wnd2;
+       }
+       if (!closing)
+               DfSendMessage(wnd, PAINT, 0, 0);
+}
+
+#endif    /* #ifdef INCLUDE_MULTI_WINDOWS */
+
+static void DoWindowColors(DFWINDOW wnd)
+{
+       DFWINDOW cwnd;
+
+       InitWindowColors(wnd);
+       cwnd = FirstWindow(wnd);
+       while (cwnd != NULL)
+       {
+               DoWindowColors(cwnd);
+               if (GetClass(cwnd) == TEXT && GetText(cwnd) != NULL)
+                       DfSendMessage(cwnd, CLEARTEXT, 0, 0);
+               cwnd = NextWindow(cwnd);
+       }
+}
+
+/* set up colors for the application window */
+static void SelectColors(DFWINDOW wnd)
+{
+       memcpy(cfg.clr, color, sizeof color);
+       DoWindowColors(wnd);
+}
+
+
+#ifdef INCLUDE_WINDOWOPTIONS
+
+/* ----- select the screen texture ----- */
+static void SelectTexture(void)
+{
+    cfg.Texture = CheckBoxSetting(&Display, ID_TEXTURE);
+}
+
+/* -- select whether the application screen has a border -- */
+static void SelectBorder(DFWINDOW wnd)
+{
+    cfg.Border = CheckBoxSetting(&Display, ID_BORDER);
+    if (cfg.Border)
+        AddAttribute(wnd, HASBORDER);
+    else
+        ClearAttribute(wnd, HASBORDER);
+}
+
+/* select whether the application screen has a status bar */
+static void SelectStatusBar(DFWINDOW wnd)
+{
+    cfg.StatusBar = CheckBoxSetting(&Display, ID_STATUSBAR);
+    if (cfg.StatusBar)
+        AddAttribute(wnd, HASSTATUSBAR);
+    else
+        ClearAttribute(wnd, HASSTATUSBAR);
+}
+
+/* select whether the application screen has a title bar */
+static void SelectTitle(DFWINDOW wnd)
+{
+    cfg.Title = CheckBoxSetting(&Display, ID_TITLE);
+    if (cfg.Title)
+        AddAttribute(wnd, HASTITLEBAR);
+    else
+        ClearAttribute(wnd, HASTITLEBAR);
+}
+
+#endif
+
+/* EOF */
diff --git a/rosapps/dflat32/barchart.c b/rosapps/dflat32/barchart.c
new file mode 100644 (file)
index 0000000..020c154
--- /dev/null
@@ -0,0 +1,74 @@
+/* ------------ barchart.c ----------- */
+#include "dflat.h"
+
+#define BCHEIGHT 12
+#define BCWIDTH 44
+#define COLWIDTH 4
+
+static DFWINDOW Bwnd;
+
+/* ------- project schedule array ------- */
+static struct ProjChart {
+    char *prj;
+    int start, stop;
+} projs[] = {
+    {"Center St", 0,3},
+    {"City Hall", 0,5},
+    {"Rt 395   ", 1,4},
+    {"Sky Condo", 2,3},
+    {"Out Hs   ", 0,4},
+    {"Bk Palace", 1,5}
+};
+
+static char *Title =  "              PROJECT SCHEDULE";
+static char *Months = "           Jan Feb Mar Apr May Jun";
+
+static int BarChartProc(DFWINDOW wnd, DFMESSAGE msg,
+                                    PARAM p1, PARAM p2)
+{
+    switch (msg)    {
+        case DFM_COMMAND:
+            if ((int)p1 == ID_HELP)    {
+                DisplayHelp(wnd, "BarChart");
+                return TRUE;
+            }
+            break;
+        case CLOSE_WINDOW:
+            Bwnd = NULL;
+            break;
+        default:
+            break;
+    }
+    return DefaultWndProc(wnd, msg, p1, p2);
+}
+
+void BarChart(DFWINDOW pwnd)
+{
+    int pct = sizeof projs / sizeof(struct ProjChart);
+    int i;
+
+    if (Bwnd == NULL)    {
+        Bwnd = DfCreateWindow(PICTUREBOX,
+                    "BarChart",
+                    -1, -1, BCHEIGHT, BCWIDTH,
+                    NULL, pwnd, BarChartProc,
+                    SHADOW     |
+                    CONTROLBOX |
+                    MOVEABLE   |
+                    HASBORDER
+        );
+        DfSendMessage(Bwnd, ADDTEXT, (PARAM) Title, 0);
+        DfSendMessage(Bwnd, ADDTEXT, (PARAM) "", 0);
+        for (i = 0; i < pct; i++)    {
+            DfSendMessage(Bwnd,ADDTEXT,(PARAM)projs[i].prj,0);
+            DrawBar(Bwnd, SOLIDBAR+(i%4),
+                11+projs[i].start*COLWIDTH, 2+i,
+                (1 + projs[i].stop-projs[i].start) * COLWIDTH,
+                TRUE);
+        }
+        DfSendMessage(Bwnd, ADDTEXT, (PARAM) "", 0);
+        DfSendMessage(Bwnd, ADDTEXT, (PARAM) Months, 0);
+        DrawBox(Bwnd, 10, 1, pct+2, 25);
+    }
+    DfSendMessage(Bwnd, SETFOCUS, TRUE, 0);
+}
diff --git a/rosapps/dflat32/box.c b/rosapps/dflat32/box.c
new file mode 100644 (file)
index 0000000..f236042
--- /dev/null
@@ -0,0 +1,44 @@
+/* ----------- box.c ------------ */
+
+#include "dflat.h"
+
+int BoxProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
+{
+       int rtn;
+       DFWINDOW oldFocus;
+       CTLWINDOW *ct = GetControl(wnd);
+       static BOOL SettingFocus = FALSE;
+       if (ct != NULL)
+       {
+               switch (msg)
+               {
+                       case SETFOCUS:
+                               SettingFocus = isVisible(wnd);
+                               rtn = BaseWndProc(BOX, wnd, msg, p1, p2);
+                               SettingFocus = FALSE;
+                               return rtn;
+
+            case PAINT:
+                return FALSE;
+            case LEFT_BUTTON:
+            case DFM_BUTTON_RELEASED:
+                return DfSendMessage(GetParent(wnd), msg, p1, p2);
+            case BORDER:
+                               if (SettingFocus)
+                                       return TRUE;
+                               oldFocus = inFocus;
+                               inFocus = NULL;
+                               rtn = BaseWndProc(BOX, wnd, msg, p1, p2);
+                               inFocus = oldFocus;
+                if (ct != NULL)
+                    if (ct->itext != NULL)
+                        writeline(wnd, ct->itext, 1, 0, FALSE);
+                               return rtn;
+            default:
+                break;
+        }
+    }
+    return BaseWndProc(BOX, wnd, msg, p1, p2);
+}
+
+/* EOF */
diff --git a/rosapps/dflat32/button.c b/rosapps/dflat32/button.c
new file mode 100644 (file)
index 0000000..46f0b26
--- /dev/null
@@ -0,0 +1,92 @@
+/* -------------- button.c -------------- */
+
+#include "dflat.h"
+
+void PaintMsg(DFWINDOW wnd, CTLWINDOW *ct, DFRECT *rc)
+{
+    if (isVisible(wnd))
+    {
+        if (TestAttribute(wnd, SHADOW))
+               {
+            /* -------- draw the button's shadow ------- */
+            int x;
+            background = WndBackground(GetParent(wnd));
+            foreground = BLACK;
+            for (x = 1; x <= WindowWidth(wnd); x++)
+                wputch(wnd, (char)223, x, 1);
+            wputch(wnd, (char)220, WindowWidth(wnd), 0);
+        }
+        if (ct->itext != NULL)
+               {
+            unsigned char *txt;
+            txt = DFcalloc(1, strlen(ct->itext)+10);
+            if (ct->setting == OFF)    {
+                txt[0] = CHANGECOLOR;
+                txt[1] = wnd->WindowColors
+                            [HILITE_COLOR] [FG] | 0x80;
+                txt[2] = wnd->WindowColors
+                            [STD_COLOR] [BG] | 0x80;
+            }
+            CopyCommand(txt+strlen(txt),ct->itext,!ct->setting,
+                WndBackground(wnd));
+            DfSendMessage(wnd, CLEARTEXT, 0, 0);
+            DfSendMessage(wnd, ADDTEXT, (PARAM) txt, 0);
+            free(txt);
+        }
+        /* --------- write the button's text ------- */
+        WriteTextLine(wnd, rc, 0, wnd == inFocus);
+    }
+}
+
+void LeftButtonMsg(DFWINDOW wnd, DFMESSAGE msg, CTLWINDOW *ct)
+{
+    /* --------- draw a pushed button -------- */
+    int x;
+    background = WndBackground(GetParent(wnd));
+    foreground = WndBackground(wnd);
+    wputch(wnd, ' ', 0, 0);
+    for (x = 0; x < WindowWidth(wnd); x++)
+    {
+         wputch(wnd, (char)220, x+1, 0);
+         wputch(wnd, (char)223, x+1, 1);
+    }
+    if (msg == LEFT_BUTTON)
+        DfSendMessage(NULL, WAITMOUSE, 0, 0);
+    else
+        DfSendMessage(NULL, WAITKEYBOARD, 0, 0);
+    DfSendMessage(wnd, PAINT, 0, 0);
+    if (ct->setting == ON)
+        DfPostMessage(GetParent(wnd), DFM_COMMAND, ct->command, 0);
+    else
+        beep();
+}
+
+int ButtonProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
+{
+    CTLWINDOW *ct = GetControl(wnd);
+    if (ct != NULL)    {
+        switch (msg)    {
+            case SETFOCUS:
+                BaseWndProc(BUTTON, wnd, msg, p1, p2);
+                p1 = 0;
+                /* ------- fall through ------- */
+            case PAINT:
+                PaintMsg(wnd, ct, (DFRECT*)p1);
+                return TRUE;
+            case KEYBOARD:
+                if (p1 != '\r')
+                    break;
+                /* ---- fall through ---- */
+            case LEFT_BUTTON:
+                LeftButtonMsg(wnd, msg, ct);
+                return TRUE;
+            case HORIZSCROLL:
+                return TRUE;
+            default:
+                break;
+        }
+    }
+    return BaseWndProc(BUTTON, wnd, msg, p1, p2);
+}
+
+/* EOF */
diff --git a/rosapps/dflat32/calendar.c b/rosapps/dflat32/calendar.c
new file mode 100644 (file)
index 0000000..99a33bf
--- /dev/null
@@ -0,0 +1,165 @@
+/* ------------- calendar.c ------------- */
+#include "dflat.h"
+
+#ifndef TURBOC
+
+#define CALHEIGHT 17
+#define CALWIDTH 33
+
+static int DyMo[] = {31,28,31,30,31,30,31,31,30,31,30,31};
+static struct tm ttm;
+static int dys[42];
+static DFWINDOW Cwnd;
+
+static void FixDate(void)
+{
+    /* ---- adjust Feb for leap year ---- */
+    DyMo[1] = (ttm.tm_year % 4) ? 28 : 29;
+    ttm.tm_mday = min(ttm.tm_mday, DyMo[ttm.tm_mon]);
+}
+
+/* ---- build calendar dates array ---- */
+static void BuildDateArray(void)
+{
+    int offset, dy = 0;
+    memset(dys, 0, sizeof dys);
+    FixDate();
+    /* ----- compute the weekday for the 1st ----- */
+    offset = ((ttm.tm_mday-1) - ttm.tm_wday) % 7;
+    if (offset < 0)
+        offset += 7;
+    if (offset)
+        offset = (offset - 7) * -1;
+    /* ----- build the dates into the array ---- */
+    for (dy = 1; dy <= DyMo[ttm.tm_mon]; dy++)
+        dys[offset++] = dy;
+}
+
+static void CreateWindowMsg(DFWINDOW wnd)
+{
+    int x, y;
+    DrawBox(wnd, 1, 2, CALHEIGHT-4, CALWIDTH-4);
+    for (x = 5; x < CALWIDTH-4; x += 4)
+        DrawVector(wnd, x, 2, CALHEIGHT-4, FALSE);
+    for (y = 4; y < CALHEIGHT-3; y+=2)
+        DrawVector(wnd, 1, y, CALWIDTH-4, TRUE);
+}
+
+static void DisplayDates(DFWINDOW wnd)
+{
+    int week, day;
+    char dyln[10];
+    int offset;
+    char banner[CALWIDTH-1];
+    char banner1[30];
+
+    SetStandardColor(wnd);
+    PutWindowLine(wnd, "Sun Mon Tue Wed Thu Fri Sat", 2, 1);
+    memset(banner, ' ', CALWIDTH-2);
+    strftime(banner1, 16, "%B, %Y", &ttm);
+    offset = (CALWIDTH-2 - strlen(banner1)) / 2;
+    strcpy(banner+offset, banner1);
+    strcat(banner, "    ");
+    PutWindowLine(wnd, banner, 0, 0);
+    BuildDateArray();
+    for (week = 0; week < 6; week++)    {
+        for (day = 0; day < 7; day++)    {
+            int dy = dys[week*7+day];
+            if (dy == 0)
+                strcpy(dyln, "   ");
+            else    {
+                if (dy == ttm.tm_mday)
+                    sprintf(dyln, "%c%c%c%2d %c",
+                        CHANGECOLOR,
+                        SelectForeground(wnd)+0x80,
+                        SelectBackground(wnd)+0x80,
+                        dy, RESETCOLOR);
+                else
+                    sprintf(dyln, "%2d ", dy);
+            }
+            SetStandardColor(wnd);
+            PutWindowLine(wnd, dyln, 2 + day * 4, 3 + week*2);
+        }
+    }
+}
+
+static int KeyboardMsg(DFWINDOW wnd, PARAM p1)
+{
+    switch ((int)p1)    {
+        case PGUP:
+            if (ttm.tm_mon == 0)    {
+                ttm.tm_mon = 12;
+                ttm.tm_year--;
+            }
+            ttm.tm_mon--;
+            FixDate();
+            mktime(&ttm);
+            DisplayDates(wnd);
+            return TRUE;
+        case PGDN:
+            ttm.tm_mon++;
+            if (ttm.tm_mon == 12)    {
+                ttm.tm_mon = 0;
+                ttm.tm_year++;
+            }
+            FixDate();
+            mktime(&ttm);
+            DisplayDates(wnd);
+            return TRUE;
+        default:
+            break;
+    }
+    return FALSE;
+}
+
+static int CalendarProc(DFWINDOW wnd,DFMESSAGE msg,
+                                PARAM p1,PARAM p2)
+{
+    switch (msg)    {
+        case CREATE_WINDOW:
+            DefaultWndProc(wnd, msg, p1, p2);
+            CreateWindowMsg(wnd);
+            return TRUE;
+        case KEYBOARD:
+            if (KeyboardMsg(wnd, p1))
+                return TRUE;
+            break;
+        case PAINT:
+            DefaultWndProc(wnd, msg, p1, p2);
+            DisplayDates(wnd);
+            return TRUE;
+        case DFM_COMMAND:
+            if ((int)p1 == ID_HELP)    {
+                DisplayHelp(wnd, "Calendar");
+                return TRUE;
+            }
+            break;
+        case CLOSE_WINDOW:
+            Cwnd = NULL;
+            break;
+        default:
+            break;
+    }
+    return DefaultWndProc(wnd, msg, p1, p2);
+}
+
+void Calendar(DFWINDOW pwnd)
+{
+    if (Cwnd == NULL)    {
+        time_t tim = time(NULL);
+        ttm = *localtime(&tim);
+        Cwnd = DfCreateWindow(PICTUREBOX,
+                    "Calendar",
+                    -1, -1, CALHEIGHT, CALWIDTH,
+                    NULL, pwnd, CalendarProc,
+                    SHADOW     |
+                    MINMAXBOX  |
+                    CONTROLBOX |
+                    MOVEABLE   |
+                    HASBORDER
+        );
+    }
+    DfSendMessage(Cwnd, SETFOCUS, TRUE, 0);
+}
+
+#endif
diff --git a/rosapps/dflat32/checkbox.c b/rosapps/dflat32/checkbox.c
new file mode 100644 (file)
index 0000000..3f41abe
--- /dev/null
@@ -0,0 +1,49 @@
+/* -------------- checkbox.c ------------ */
+
+#include "dflat.h"
+
+int CheckBoxProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
+{
+    int rtn;
+    CTLWINDOW *ct = GetControl(wnd);
+    if (ct != NULL)    {
+        switch (msg)    {
+            case SETFOCUS:
+                if (!(int)p1)
+                    DfSendMessage(NULL, HIDE_CURSOR, 0, 0);
+            case MOVE:
+                rtn = BaseWndProc(CHECKBOX, wnd, msg, p1, p2);
+                SetFocusCursor(wnd);
+                return rtn;
+            case PAINT:    {
+                char cb[] = "[ ]";
+                if (ct->setting)
+                    cb[1] = 'X';
+                DfSendMessage(wnd, CLEARTEXT, 0, 0);
+                DfSendMessage(wnd, ADDTEXT, (PARAM) cb, 0);
+                SetFocusCursor(wnd);
+                break;
+            }
+            case KEYBOARD:
+                if ((int)p1 != ' ')
+                    break;
+            case LEFT_BUTTON:
+                ct->setting ^= ON;
+                DfSendMessage(wnd, PAINT, 0, 0);
+                return TRUE;
+            default:
+                break;
+        }
+    }
+    return BaseWndProc(CHECKBOX, wnd, msg, p1, p2);
+}
+
+BOOL CheckBoxSetting(DBOX *db, enum commands cmd)
+{
+    CTLWINDOW *ct = FindCommand(db, cmd, CHECKBOX);
+    if (ct != NULL)
+        return (ct->isetting == ON);
+    return FALSE;
+}
+
+/* EOF */
diff --git a/rosapps/dflat32/classdef.h b/rosapps/dflat32/classdef.h
new file mode 100644 (file)
index 0000000..086ee49
--- /dev/null
@@ -0,0 +1,31 @@
+/* ---------------- classdef.h --------------- */
+
+#ifndef CLASSDEF_H
+#define CLASSDEF_H
+
+typedef struct classdefs {
+    DFCLASS base;                         /* base window class */
+    int (*wndproc)(struct window *,enum messages,PARAM,PARAM);
+    int attrib;
+} CLASSDEFS;
+
+extern CLASSDEFS classdefs[];
+
+#define SHADOW       0x0001
+#define MOVEABLE     0x0002
+#define SIZEABLE     0x0004
+#define HASMENUBAR   0x0008
+#define VSCROLLBAR   0x0010
+#define HSCROLLBAR   0x0020
+#define VISIBLE      0x0040
+#define SAVESELF     0x0080
+#define HASTITLEBAR  0x0100
+#define CONTROLBOX   0x0200
+#define MINMAXBOX    0x0400
+#define NOCLIP       0x0800
+#define READONLY     0x1000
+#define MULTILINE    0x2000
+#define HASBORDER    0x4000
+#define HASSTATUSBAR 0x8000
+
+#endif
diff --git a/rosapps/dflat32/classes.h b/rosapps/dflat32/classes.h
new file mode 100644 (file)
index 0000000..bfd1fda
--- /dev/null
@@ -0,0 +1,56 @@
+/* ----------- classes.h ------------ */
+/*
+ *         Class definition source file
+ *         Make class changes to this source file
+ *         Other source files will adapt
+ *
+ *         You must add entries to the color tables in
+ *         CONFIG.C for new classes.
+ *
+ *        Class Name  Base Class   Processor       Attribute    
+ *       ------------  --------- ---------------  -----------
+ */
+ClassDef(  NORMAL,      -1,      NormalProc,      0 )
+ClassDef(  APPLICATION, NORMAL,  ApplicationProc, VISIBLE   |
+                                                  SAVESELF  |
+                                                  CONTROLBOX )
+ClassDef(  TEXTBOX,     NORMAL,  TextBoxProc,     0          )
+ClassDef(  LISTBOX,     TEXTBOX, ListBoxProc,     0          )
+ClassDef(  EDITBOX,     TEXTBOX, EditBoxProc,     0          )
+ClassDef(  MENUBAR,     NORMAL,  MenuBarProc,     NOCLIP     )
+ClassDef(  POPDOWNMENU, LISTBOX, PopDownProc,     SAVESELF  |
+                                                  NOCLIP    |
+                                                  HASBORDER  )
+#ifdef INCLUDE_PICTUREBOX
+ClassDef(  PICTUREBOX,  TEXTBOX, PictureProc,     0          )
+#endif
+ClassDef(  DIALOG,      NORMAL,  DialogProc,      SHADOW    |
+                                                  MOVEABLE  |
+                                                  CONTROLBOX|
+                                                  HASBORDER |
+                                                  NOCLIP     )
+ClassDef(  BOX,         NORMAL,  BoxProc,         HASBORDER  )
+ClassDef(  BUTTON,      TEXTBOX, ButtonProc,      SHADOW     )
+ClassDef(  COMBOBOX,    EDITBOX, ComboProc,       0          )
+ClassDef(  TEXT,        TEXTBOX, TextProc,        0          )
+ClassDef(  RADIOBUTTON, TEXTBOX, RadioButtonProc, 0          )
+ClassDef(  CHECKBOX,    TEXTBOX, CheckBoxProc,    0          )
+ClassDef(  SPINBUTTON,  LISTBOX, SpinButtonProc,  0          )
+ClassDef(  ERRORBOX,    DIALOG,  NULL,            SHADOW    |
+                                                  HASBORDER  )
+ClassDef(  MESSAGEBOX,  DIALOG,  NULL,            SHADOW    |
+                                                  HASBORDER  )
+ClassDef(  HELPBOX,     DIALOG,  HelpBoxProc,     MOVEABLE  |
+                                                  SAVESELF  |
+                                                  HASBORDER |
+                                                  NOCLIP    |
+                                                  CONTROLBOX )
+ClassDef(  STATUSBAR,   TEXTBOX, StatusBarProc,   NOCLIP     )
+
+/*
+ *  ========> Add new classes here <========
+ */
+
+/* ---------- pseudo classes to create enums, etc. ---------- */
+ClassDef(  TITLEBAR,    -1,      NULL,            0          )
+ClassDef(  DUMMY,       -1,      NULL,            HASBORDER  )
diff --git a/rosapps/dflat32/clipbord.c b/rosapps/dflat32/clipbord.c
new file mode 100644 (file)
index 0000000..bfa52f7
--- /dev/null
@@ -0,0 +1,54 @@
+/* ----------- clipbord.c ------------ */
+#include "dflat.h"
+
+char *Clipboard;
+unsigned ClipboardLength;
+
+void CopyTextToClipboard(char *text)
+{
+    ClipboardLength = strlen(text);
+    Clipboard = DFrealloc(Clipboard, ClipboardLength);
+    memmove(Clipboard, text, ClipboardLength);
+}
+
+void CopyToClipboard(DFWINDOW wnd)
+{
+    if (TextBlockMarked(wnd))    {
+        char *bbl=TextLine(wnd,wnd->BlkBegLine)+wnd->BlkBegCol;
+        char *bel=TextLine(wnd,wnd->BlkEndLine)+wnd->BlkEndCol;
+        ClipboardLength = (int) (bel - bbl);
+        Clipboard = DFrealloc(Clipboard, ClipboardLength);
+        memmove(Clipboard, bbl, ClipboardLength);
+    }
+}
+
+void ClearClipboard(void)
+{
+    if (Clipboard != NULL)  {
+        free(Clipboard);
+        Clipboard = NULL;
+    }
+}
+
+
+BOOL PasteText(DFWINDOW wnd, char *SaveTo, unsigned len)
+{
+    if (SaveTo != NULL && len > 0)    {
+        unsigned plen = strlen(wnd->text) + len;
+
+               if (plen <= wnd->MaxTextLength) {
+               if (plen+1 > wnd->textlen)    {
+               wnd->text = DFrealloc(wnd->text, plen+3);
+               wnd->textlen = plen+1;
+               }
+               memmove(CurrChar+len, CurrChar, strlen(CurrChar)+1);
+               memmove(CurrChar, SaveTo, len);
+               BuildTextPointers(wnd);
+               wnd->TextChanged = TRUE;
+                       return TRUE;
+               }
+    }
+       return FALSE;
+}
+
+/* EOF */
diff --git a/rosapps/dflat32/combobox.c b/rosapps/dflat32/combobox.c
new file mode 100644 (file)
index 0000000..5bb6da8
--- /dev/null
@@ -0,0 +1,149 @@
+/* -------------- combobox.c -------------- */
+
+#include "dflat.h"
+
+int ListProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+
+int ComboProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
+{
+    switch (msg)    {
+        case CREATE_WINDOW:
+            wnd->extension = DfCreateWindow(
+                        LISTBOX,
+                        NULL,
+                        wnd->rc.lf,wnd->rc.tp+1,
+                        wnd->ht-1, wnd->wd+1,
+                        NULL,
+                        wnd,
+                        ListProc,
+                        HASBORDER | NOCLIP | SAVESELF);
+            ((DFWINDOW)(wnd->extension))->ct->command =
+                                        wnd->ct->command;
+            wnd->ht = 1;
+            wnd->rc.bt = wnd->rc.tp;
+                       break;
+        case PAINT:
+            foreground = WndBackground(wnd);
+            background = WndForeground(wnd);
+            wputch(wnd, DOWNSCROLLBOX, WindowWidth(wnd), 0);
+            break;
+        case KEYBOARD:
+            if ((int)p1 == DN)    {
+                DfSendMessage(wnd->extension, SETFOCUS, TRUE, 0);
+                return TRUE;
+            }
+            break;
+        case LEFT_BUTTON:
+            if ((int)p1 == GetRight(wnd) + 1)
+                DfSendMessage(wnd->extension, SETFOCUS, TRUE, 0);
+            break;
+        case CLOSE_WINDOW:
+            DfSendMessage(wnd->extension, CLOSE_WINDOW, 0, 0);
+            break;
+        default:
+            break;
+    }
+    return BaseWndProc(COMBOBOX, wnd, msg, p1, p2);
+}
+
+int ListProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
+{
+       DFWINDOW pwnd = GetParent(GetParent(wnd));
+       DBOX *db = pwnd->extension;
+       DFWINDOW cwnd;
+       char text[130];
+       int rtn;
+       DFWINDOW currFocus;
+
+       switch (msg)
+       {
+               case CREATE_WINDOW:
+                       wnd->ct = DFmalloc(sizeof(CTLWINDOW));
+                       wnd->ct->setting = OFF;
+                       wnd->WindowColors[FRAME_COLOR][FG] =
+                               wnd->WindowColors[STD_COLOR][FG];
+                       wnd->WindowColors[FRAME_COLOR][BG] =
+                               wnd->WindowColors[STD_COLOR][BG];
+                       rtn = DefaultWndProc(wnd, msg, p1, p2);
+                       return rtn;
+
+               case SETFOCUS:
+                       if ((int)p1 == FALSE)
+                       {
+                               if (!wnd->isHelping)
+                               {
+                                       DfSendMessage(wnd, DFM_HIDE_WINDOW, 0, 0);
+                                       wnd->ct->setting = OFF;
+                               }
+                       }
+                       else
+                               wnd->ct->setting = ON;
+                       break;
+
+               case SHOW_WINDOW:
+                       if (wnd->ct->setting == OFF)
+                               return TRUE;
+                       break;
+
+               case BORDER:
+                       currFocus = inFocus;
+                       inFocus = NULL;
+                       rtn = DefaultWndProc(wnd, msg, p1, p2);
+                       inFocus = currFocus;
+                       return rtn;
+
+               case LB_SELECTION:
+                       rtn = DefaultWndProc(wnd, msg, p1, p2);
+                       DfSendMessage(wnd, DFM_LB_GETTEXT,
+                                     (PARAM) text, wnd->selection);
+                       PutItemText(pwnd, wnd->ct->command, text);
+                       cwnd = ControlWindow(db, wnd->ct->command);
+                       DfSendMessage(cwnd, PAINT, 0, 0);
+                       cwnd->TextChanged = TRUE;
+                       return rtn;
+
+               case KEYBOARD:
+                       switch ((int) p1)
+                       {
+                               case ESC:
+                               case FWD:
+                               case BS:
+                                       cwnd = ControlWindow(db, wnd->ct->command);
+                                       DfSendMessage(cwnd, SETFOCUS, TRUE, 0);
+                                       return TRUE;
+
+                               default:
+                                       break;
+                       }
+                       break;
+
+               case LB_CHOOSE:
+                       cwnd = ControlWindow(db, wnd->ct->command);
+                       DfSendMessage(cwnd, SETFOCUS, TRUE, 0);
+                       return TRUE;
+
+               case CLOSE_WINDOW:
+                       if (wnd->ct != NULL)
+                               free(wnd->ct);
+                       wnd->ct = NULL;
+                       break;
+
+               default:
+                       break;
+       }
+
+       return DefaultWndProc(wnd, msg, p1, p2);
+}
+
+void PutComboListText(DFWINDOW wnd, enum commands cmd, char *text)
+{
+       CTLWINDOW *ct = FindCommand(wnd->extension, cmd, COMBOBOX);
+
+       if (ct != NULL)
+       {
+               DFWINDOW lwnd = ((DFWINDOW)(ct->wnd))->extension;
+               DfSendMessage(lwnd, ADDTEXT, (PARAM) text, 0);
+       }
+}
+
+/* EOF */
diff --git a/rosapps/dflat32/commands.h b/rosapps/dflat32/commands.h
new file mode 100644 (file)
index 0000000..6850ac6
--- /dev/null
@@ -0,0 +1,121 @@
+/* ---------------- commands.h ----------------- */
+
+/*
+ * Command values sent as the first parameter
+ * in the COMMAND message
+ *
+ * Add application-specific commands to this enum
+ */
+
+#ifndef COMMANDS_H
+#define COMMANDS_H
+
+enum commands {
+    /* --------------- File menu ---------------- */
+    ID_OPEN,
+    ID_NEW,
+    ID_SAVE,
+    ID_SAVEAS,
+    ID_DELETEFILE,
+    ID_PRINT,
+    ID_PRINTSETUP,
+    ID_DOS,
+    ID_EXIT,
+    /* --------------- Edit menu ---------------- */
+    ID_UNDO,
+    ID_CUT,
+    ID_COPY,
+    ID_PASTE,
+    ID_PARAGRAPH,
+    ID_CLEAR,
+    ID_DELETETEXT,
+    /* --------------- Search Menu -------------- */
+    ID_SEARCH,
+    ID_REPLACE,
+    ID_SEARCHNEXT,
+       /* --------------- Utilities Menu ------------- */
+       ID_CALENDAR,
+       ID_BARCHART,
+    /* -------------- Options menu -------------- */
+    ID_INSERT,
+    ID_WRAP,
+    ID_LOG,
+    ID_TABS,
+    ID_DISPLAY,
+    ID_SAVEOPTIONS,
+    /* --------------- Window menu -------------- */
+    ID_CLOSEALL,
+    ID_WINDOW,
+       ID_MOREWINDOWS,
+    /* --------------- Help menu ---------------- */
+    ID_HELPHELP,
+    ID_EXTHELP,
+    ID_KEYSHELP,
+    ID_HELPINDEX,
+    ID_ABOUT,
+    ID_LOADHELP,
+    /* --------------- System menu -------------- */
+#ifdef INCLUDE_RESTORE
+    ID_SYSRESTORE,
+#endif
+    ID_SYSMOVE,
+    ID_SYSSIZE,
+#ifdef INCLUDE_MINIMIZE
+    ID_SYSMINIMIZE,
+#endif
+#ifdef INCLUDE_MAXIMIZE
+    ID_SYSMAXIMIZE,
+#endif
+    ID_SYSCLOSE,
+    /* ---- FileOpen and SaveAs dialog boxes ---- */
+    ID_FILENAME,
+    ID_FILES,
+    ID_DRIVE,
+    ID_PATH,
+    /* ----- Search and Replace dialog boxes ---- */
+    ID_SEARCHFOR,
+    ID_REPLACEWITH,
+    ID_MATCHCASE,
+    ID_REPLACEALL,
+    /* ----------- Windows dialog box ----------- */
+    ID_WINDOWLIST,
+    /* --------- generic command buttons -------- */
+    ID_OK,
+    ID_CANCEL,
+    ID_HELP,
+    /* -------------- TabStops menu ------------- */
+    ID_TAB2,
+    ID_TAB4,
+    ID_TAB6,
+    ID_TAB8,
+    /* ------------ Display dialog box ---------- */
+    ID_BORDER,
+    ID_TITLE,
+    ID_STATUSBAR,
+    ID_TEXTURE,
+       ID_SNOWY,
+    ID_COLOR,
+    ID_MONO,
+    ID_REVERSE,
+    ID_25LINES,
+    ID_43LINES,
+    ID_50LINES,
+    /* ------------- Log dialog box ------------- */
+    ID_LOGLIST,
+    ID_LOGGING,
+    /* ------------ HelpBox dialog box ---------- */
+    ID_HELPTEXT,
+    ID_BACK,
+    ID_PREV,
+    ID_NEXT,
+       /* ---------- Print Select dialog box --------- */
+       ID_PRINTERPORT,
+       ID_LEFTMARGIN,
+       ID_RIGHTMARGIN,
+       ID_TOPMARGIN,
+       ID_BOTTOMMARGIN,
+       /* ----------- InputBox dialog box ------------ */
+       ID_INPUTTEXT
+};
+
+#endif
diff --git a/rosapps/dflat32/config.c b/rosapps/dflat32/config.c
new file mode 100644 (file)
index 0000000..6ac1475
--- /dev/null
@@ -0,0 +1,514 @@
+/* ------------- config.c ------------- */
+
+#include "dflat.h"
+
+/* ----- default colors for color video system ----- */
+unsigned char color[CLASSCOUNT] [4] [2] = {
+    /* ------------ NORMAL ------------ */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}},/* HILITE_COLOR */
+
+    /* ---------- APPLICATION --------- */
+   {{LIGHTGRAY, BLUE},  /* STD_COLOR    */
+    {LIGHTGRAY, BLUE},  /* SELECT_COLOR */
+    {LIGHTGRAY, BLUE},  /* FRAME_COLOR  */
+    {LIGHTGRAY, BLUE}}, /* HILITE_COLOR */
+
+    /* ------------ TEXTBOX ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ------------ LISTBOX ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLUE},  /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ----------- EDITBOX ------------ */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLUE},  /* SELECT_COLOR */
+    {LIGHTGRAY, BLUE},  /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ---------- MENUBAR ------------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {BLACK, CYAN},      /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {DARKGRAY, RED}},   /* HILITE_COLOR
+                          Inactive, Shortcut (both FG) */
+
+    /* ---------- POPDOWNMENU --------- */
+   {{BLACK, CYAN},      /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {BLACK, CYAN},      /* FRAME_COLOR  */
+    {DARKGRAY, RED}},   /* HILITE_COLOR
+                           Inactive ,Shortcut (both FG) */
+
+#ifdef INCLUDE_PICTUREBOX
+    /* ------------ PICTUREBOX ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+#endif
+
+    /* ------------- DIALOG ----------- */
+   {{LIGHTGRAY, BLUE},  /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLUE},  /* FRAME_COLOR  */
+    {LIGHTGRAY, BLUE}}, /* HILITE_COLOR */
+
+       /* ------------ BOX --------------- */
+   {{LIGHTGRAY, BLUE},  /* STD_COLOR    */
+    {LIGHTGRAY, BLUE},  /* SELECT_COLOR */
+    {LIGHTGRAY, BLUE},  /* FRAME_COLOR  */
+    {LIGHTGRAY, BLUE}}, /* HILITE_COLOR */
+
+    /* ------------ BUTTON ------------ */
+   {{BLACK, CYAN},      /* STD_COLOR    */
+    {WHITE, CYAN},      /* SELECT_COLOR */
+    {BLACK, CYAN},      /* FRAME_COLOR  */
+    {DARKGRAY, RED}},   /* HILITE_COLOR
+                           Inactive ,Shortcut (both FG) */
+    /* ------------ COMBOBOX ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK},  /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ------------- TEXT ----------- */
+   {{0xff, 0xff},  /* STD_COLOR    */
+    {0xff, 0xff},  /* SELECT_COLOR */
+    {0xff, 0xff},  /* FRAME_COLOR  */
+    {0xff, 0xff}}, /* HILITE_COLOR */
+
+    /* ------------- RADIOBUTTON ----------- */
+   {{LIGHTGRAY, BLUE},  /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLUE},  /* FRAME_COLOR  */
+    {LIGHTGRAY, BLUE}}, /* HILITE_COLOR */
+
+    /* ------------- CHECKBOX ----------- */
+   {{LIGHTGRAY, BLUE},  /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLUE},  /* FRAME_COLOR  */
+    {LIGHTGRAY, BLUE}}, /* HILITE_COLOR */
+
+    /* ------------ SPINBUTTON ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ----------- ERRORBOX ----------- */
+   {{YELLOW, RED},      /* STD_COLOR    */
+    {YELLOW, RED},      /* SELECT_COLOR */
+    {YELLOW, RED},      /* FRAME_COLOR  */
+    {YELLOW, RED}},     /* HILITE_COLOR */
+
+    /* ----------- MESSAGEBOX --------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ----------- HELPBOX ------------ */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLUE},  /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {WHITE, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ---------- STATUSBAR ------------- */
+   {{BLACK, CYAN},      /* STD_COLOR    */
+    {BLACK, CYAN},      /* SELECT_COLOR */
+    {BLACK, CYAN},      /* FRAME_COLOR  */
+    {BLACK, CYAN}},     /* HILITE_COLOR */
+
+    /* ---------- TITLEBAR ------------ */
+   {{BLACK, CYAN},      /* STD_COLOR    */
+    {BLACK, CYAN},      /* SELECT_COLOR */
+    {BLACK, CYAN},      /* FRAME_COLOR  */
+    {WHITE, CYAN}},     /* HILITE_COLOR */
+
+    /* ------------ DUMMY ------------- */
+   {{GREEN, LIGHTGRAY}, /* STD_COLOR    */
+    {GREEN, LIGHTGRAY}, /* SELECT_COLOR */
+    {GREEN, LIGHTGRAY}, /* FRAME_COLOR  */
+    {GREEN, LIGHTGRAY}} /* HILITE_COLOR */
+};
+
+/* ----- default colors for mono video system ----- */
+unsigned char bw[CLASSCOUNT] [4] [2] = {
+    /* ------------ NORMAL ------------ */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}},/* HILITE_COLOR */
+
+    /* ---------- APPLICATION --------- */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}},/* HILITE_COLOR */
+
+    /* ------------ TEXTBOX ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ------------ LISTBOX ----------- */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ----------- EDITBOX ------------ */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ---------- MENUBAR ------------- */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {DARKGRAY, WHITE}}, /* HILITE_COLOR
+                           Inactive, Shortcut (both FG) */
+
+    /* ---------- POPDOWNMENU --------- */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {DARKGRAY, WHITE}}, /* HILITE_COLOR
+                           Inactive ,Shortcut (both FG) */
+
+#ifdef INCLUDE_PICTUREBOX
+    /* ------------ PICTUREBOX ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+#endif
+
+    /* ------------- DIALOG ----------- */
+   {{LIGHTGRAY, BLACK},  /* STD_COLOR    */
+    {BLACK, LIGHTGRAY},  /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK},  /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}}, /* HILITE_COLOR */
+
+       /* ------------ BOX --------------- */
+   {{LIGHTGRAY, BLACK},  /* STD_COLOR    */
+    {LIGHTGRAY, BLACK},  /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK},  /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}}, /* HILITE_COLOR */
+
+    /* ------------ BUTTON ------------ */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {WHITE, LIGHTGRAY}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {DARKGRAY, WHITE}}, /* HILITE_COLOR
+                           Inactive ,Shortcut (both FG) */
+    /* ------------ COMBOBOX ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ------------- TEXT ----------- */
+   {{0xff, 0xff},  /* STD_COLOR    */
+    {0xff, 0xff},  /* SELECT_COLOR */
+    {0xff, 0xff},  /* FRAME_COLOR  */
+    {0xff, 0xff}}, /* HILITE_COLOR */
+
+    /* ------------- RADIOBUTTON ----------- */
+   {{LIGHTGRAY, BLACK},  /* STD_COLOR    */
+    {BLACK, LIGHTGRAY},  /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK},  /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}}, /* HILITE_COLOR */
+
+    /* ------------- CHECKBOX ----------- */
+   {{LIGHTGRAY, BLACK},  /* STD_COLOR    */
+    {BLACK, LIGHTGRAY},  /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK},  /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}}, /* HILITE_COLOR */
+
+    /* ------------ SPINBUTTON ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ----------- ERRORBOX ----------- */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}},/* HILITE_COLOR */
+
+    /* ----------- MESSAGEBOX --------- */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}},/* HILITE_COLOR */
+
+    /* ----------- HELPBOX ------------ */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {WHITE, BLACK},     /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {WHITE, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ---------- STATUSBAR ------------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ---------- TITLEBAR ------------ */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ------------ DUMMY ------------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}} /* HILITE_COLOR */
+};
+/* ----- default colors for reverse mono video ----- */
+unsigned char reverse[CLASSCOUNT] [4] [2] = {
+    /* ------------ NORMAL ------------ */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ---------- APPLICATION --------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ------------ TEXTBOX ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ------------ LISTBOX ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ----------- EDITBOX ------------ */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ---------- MENUBAR ------------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {DARKGRAY, WHITE}}, /* HILITE_COLOR
+                           Inactive, Shortcut (both FG) */
+
+    /* ---------- POPDOWNMENU --------- */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {DARKGRAY, WHITE}}, /* HILITE_COLOR
+                           Inactive ,Shortcut (both FG) */
+
+#ifdef INCLUDE_PICTUREBOX
+    /* ------------ PICTUREBOX ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+#endif
+
+    /* ------------- DIALOG ----------- */
+   {{BLACK, LIGHTGRAY},  /* STD_COLOR    */
+    {LIGHTGRAY, BLACK},  /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY},  /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}}, /* HILITE_COLOR */
+
+       /* ------------ BOX --------------- */
+   {{BLACK, LIGHTGRAY},  /* STD_COLOR    */
+    {BLACK, LIGHTGRAY},  /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY},  /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}}, /* HILITE_COLOR */
+
+    /* ------------ BUTTON ------------ */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {WHITE, BLACK},     /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {DARKGRAY, WHITE}}, /* HILITE_COLOR
+                           Inactive ,Shortcut (both FG) */
+    /* ------------ COMBOBOX ----------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ------------- TEXT ----------- */
+   {{0xff, 0xff},  /* STD_COLOR    */
+    {0xff, 0xff},  /* SELECT_COLOR */
+    {0xff, 0xff},  /* FRAME_COLOR  */
+    {0xff, 0xff}}, /* HILITE_COLOR */
+
+    /* ------------- RADIOBUTTON ----------- */
+   {{BLACK, LIGHTGRAY},  /* STD_COLOR    */
+    {LIGHTGRAY, BLACK},  /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY},  /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}}, /* HILITE_COLOR */
+
+    /* ------------- CHECKBOX ----------- */
+   {{BLACK, LIGHTGRAY},  /* STD_COLOR    */
+    {LIGHTGRAY, BLACK},  /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY},  /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}}, /* HILITE_COLOR */
+
+    /* ------------ SPINBUTTON ----------- */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ----------- ERRORBOX ----------- */
+   {{BLACK, LIGHTGRAY},      /* STD_COLOR    */
+    {BLACK, LIGHTGRAY},      /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY},      /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},     /* HILITE_COLOR */
+
+    /* ----------- MESSAGEBOX --------- */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ----------- HELPBOX ------------ */
+   {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
+    {WHITE, LIGHTGRAY}},/* HILITE_COLOR */
+
+    /* ---------- STATUSBAR ------------- */
+   {{LIGHTGRAY, BLACK},      /* STD_COLOR    */
+    {LIGHTGRAY, BLACK},      /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK},      /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}},     /* HILITE_COLOR */
+
+    /* ---------- TITLEBAR ------------ */
+   {{LIGHTGRAY, BLACK},      /* STD_COLOR    */
+    {LIGHTGRAY, BLACK},      /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK},      /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}},     /* HILITE_COLOR */
+
+    /* ------------ DUMMY ------------- */
+   {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
+    {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
+    {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
+    {LIGHTGRAY, BLACK}} /* HILITE_COLOR */
+};
+
+/* ------ default configuration values ------- */
+CONFIG cfg = {
+    VERSION,
+    TRUE,            /* Editor Insert Mode          */
+    4,               /* Editor tab stops            */
+    TRUE,            /* Editor word wrap            */
+#ifdef INCLUDE_WINDOWOPTIONS
+    TRUE,            /* Application Border          */
+    TRUE,            /* Application Title           */
+    TRUE,            /* Status Bar                  */
+    TRUE,            /* Textured application window */
+#endif
+//    25,              /* Number of screen lines      */
+       "Lpt1",                  /* Printer Port                */
+       66,              /* Lines per printer page      */
+       80,                              /* characters per printer line */
+       6,                               /* Left printer margin                 */
+       70,                              /* Right printer margin                */
+       3,                               /* Top printer margin                  */
+       55                               /* Bottom printer margin               */
+};
+
+void BuildFileName(char *path, char *ext)
+{
+       extern char **Argv;
+    char *cp;
+
+       strcpy(path, Argv[0]);
+       cp = strrchr(path, '\\');
+       if (cp == NULL)
+               cp = path;
+       else 
+               cp++;
+       strcpy(cp, DFlatApplication);
+       strcat(cp, ext);
+}
+
+FILE *OpenConfig(char *mode)
+{
+       char path[64];
+       BuildFileName(path, ".cfg");
+       return fopen(path, mode);
+}
+
+/* ------ load a configuration file from disk ------- */
+BOOL LoadConfig(void)
+{
+       static BOOL ConfigLoaded = FALSE;
+       if (ConfigLoaded == FALSE)      {
+           FILE *fp = OpenConfig("rb");
+       if (fp != NULL)    {
+               fread(cfg.version, sizeof cfg.version+1, 1, fp);
+               if (strcmp(cfg.version, VERSION) == 0)    {
+               fseek(fp, 0L, SEEK_SET);
+               fread(&cfg, sizeof(CONFIG), 1, fp);
+                       fclose(fp);
+               }
+               else    {
+                               char path[64];
+                               BuildFileName(path, ".cfg");
+                       fclose(fp);
+                               unlink(path);
+               strcpy(cfg.version, VERSION);
+                       }
+                       ConfigLoaded = TRUE;
+       }
+       }
+    return ConfigLoaded;
+}
+
+/* ------ save a configuration file to disk ------- */
+void SaveConfig(void)
+{
+    FILE *fp = OpenConfig("wb");
+    if (fp != NULL)    {
+        fwrite(&cfg, sizeof(CONFIG), 1, fp);
+        fclose(fp);
+    }
+}
+
+/* --------- set window colors --------- */
+void SetStandardColor(DFWINDOW wnd)
+{
+    foreground = WndForeground(wnd);
+    background = WndBackground(wnd);
+}
+
+void SetReverseColor(DFWINDOW wnd)
+{
+    foreground = SelectForeground(wnd);
+    background = SelectBackground(wnd);
+}
+
+/* EOF */
\ No newline at end of file
diff --git a/rosapps/dflat32/config.h b/rosapps/dflat32/config.h
new file mode 100644 (file)
index 0000000..065e197
--- /dev/null
@@ -0,0 +1,48 @@
+/* ---------------- config.h -------------- */
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+enum colortypes {
+       STD_COLOR,
+       SELECT_COLOR,
+       FRAME_COLOR,
+       HILITE_COLOR
+};
+
+enum grounds { FG, BG };
+
+/* ----------- configuration parameters ----------- */
+typedef struct config {
+    char version[sizeof VERSION];
+    BOOL InsertMode;   /* Editor insert mode                 */
+    int Tabs;          /* Editor tab stops                   */
+    BOOL WordWrap;     /* True to word wrap editor           */
+#ifdef INCLUDE_WINDOWOPTIONS
+    BOOL Border;       /* True for application window border */
+    BOOL Title;        /* True for application window title  */
+       BOOL StatusBar;    /* True for appl'n window status bar  */
+    BOOL Texture;      /* True for textured appl window      */
+#endif
+//    int ScreenLines;   /* Number of screen lines (25/43/50)  */
+       char PrinterPort[5];
+       int LinesPage;     /* Lines per printer page             */
+       int CharsLine;     /* Characters per printer line        */
+       int LeftMargin;    /* Printer margins                    */
+       int RightMargin;
+       int TopMargin;
+       int BottomMargin;
+    unsigned char clr[CLASSCOUNT] [4] [2]; /* Colors         */
+} CONFIG;
+
+extern CONFIG cfg;
+extern unsigned char color[CLASSCOUNT] [4] [2];
+extern unsigned char bw[CLASSCOUNT] [4] [2];
+extern unsigned char reverse[CLASSCOUNT] [4] [2];
+
+BOOL LoadConfig(void);
+void SaveConfig(void);
+FILE *OpenConfig(char *);
+
+#endif
+
diff --git a/rosapps/dflat32/console.c b/rosapps/dflat32/console.c
new file mode 100644 (file)
index 0000000..a604300
--- /dev/null
@@ -0,0 +1,198 @@
+/* ----------- console.c ---------- */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+
+#include "dflat.h"
+
+
+/* ----- table of alt keys for finding shortcut keys ----- */
+#if 0
+static int altconvert[] = {
+    ALT_A,ALT_B,ALT_C,ALT_D,ALT_E,ALT_F,ALT_G,ALT_H,
+    ALT_I,ALT_J,ALT_K,ALT_L,ALT_M,ALT_N,ALT_O,ALT_P,
+    ALT_Q,ALT_R,ALT_S,ALT_T,ALT_U,ALT_V,ALT_W,ALT_X,
+    ALT_Y,ALT_Z,ALT_0,ALT_1,ALT_2,ALT_3,ALT_4,ALT_5,
+    ALT_6,ALT_7,ALT_8,ALT_9
+};
+#endif
+
+static int cursorpos[MAXSAVES];
+static int cursorshape[MAXSAVES];
+static int cs;
+
+
+void SwapCursorStack(void)
+{
+       if (cs > 1)     {
+               swap(cursorpos[cs-2], cursorpos[cs-1]);
+               swap(cursorshape[cs-2], cursorshape[cs-1]);
+       }
+}
+
+
+/* ---- Read a keystroke ---- */
+void GetKey (PINPUT_RECORD lpBuffer)
+{
+       HANDLE hInput;
+       DWORD dwRead;
+
+       hInput = GetStdHandle (STD_INPUT_HANDLE);
+
+       do
+       {
+//             WaitForSingleObject (hInput, INFINITE);
+               ReadConsoleInput (hInput, lpBuffer, 1, &dwRead);
+               if ((lpBuffer->EventType == KEY_EVENT) &&
+                       (lpBuffer->Event.KeyEvent.bKeyDown == TRUE))
+                       break;
+       }
+       while (TRUE);
+}
+
+
+/* ---------- read the keyboard shift status --------- */
+int getshift(void)
+{
+//    regs.h.ah = 2;
+//    int86(KEYBRD, &regs, &regs);
+//    return regs.h.al;
+/*     FIXME */
+
+       return 0;
+}
+
+
+/* -------- sound a buzz tone ---------- */
+void beep(void)
+{
+       Beep(440, 50);
+//     MessageBeep (-1);
+}
+
+
+/* ------ position the cursor ------ */
+void cursor(int x, int y)
+{
+       COORD coPos;
+
+       coPos.X = (USHORT)x;
+       coPos.Y = (USHORT)y;
+       SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), coPos);
+}
+
+/* ------ get cursor shape and position ------ */
+static void getcursor(void)
+{
+/*
+    videomode();
+    regs.h.ah = READCURSOR;
+    regs.x.bx = video_page;
+    int86(VIDEO, &regs, &regs);
+*/
+       /* FIXME */
+}
+
+/* ------- get the current cursor position ------- */
+
+void curr_cursor(int *x, int *y)
+//VOID GetCursorXY (PSHORT x, PSHORT y)
+{
+       CONSOLE_SCREEN_BUFFER_INFO csbi;
+
+       GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &csbi);
+
+       *x = (int)csbi.dwCursorPosition.X;
+       *y = (int)csbi.dwCursorPosition.Y;
+}
+
+
+/* ------ save the current cursor configuration ------ */
+void savecursor(void)
+{
+/*
+    if (cs < MAXSAVES)    {
+        getcursor();
+        cursorshape[cs] = regs.x.cx;
+        cursorpos[cs] = regs.x.dx;
+        cs++;
+    }
+*/
+}
+
+/* ---- restore the saved cursor configuration ---- */
+void restorecursor(void)
+{
+/*
+    if (cs)    {
+        --cs;
+        videomode();
+        regs.x.dx = cursorpos[cs];
+        regs.h.ah = SETCURSOR;
+        regs.x.bx = video_page;
+        int86(VIDEO, &regs, &regs);
+        set_cursor_type(cursorshape[cs]);
+    }
+*/
+}
+
+/* ------ make a normal cursor ------ */
+void normalcursor(void)
+{
+//    set_cursor_type(0x0607);
+}
+
+/* ------ hide the cursor ------ */
+void hidecursor(void)
+{
+/*
+    getcursor();
+    regs.h.ch |= HIDECURSOR;
+    regs.h.ah = SETCURSORTYPE;
+    int86(VIDEO, &regs, &regs);
+*/
+}
+
+/* ------ unhide the cursor ------ */
+void unhidecursor(void)
+{
+/*
+    getcursor();
+    regs.h.ch &= ~HIDECURSOR;
+    regs.h.ah = SETCURSORTYPE;
+    int86(VIDEO, &regs, &regs);
+*/
+}
+
+/* ---- use BIOS to set the cursor type ---- */
+void set_cursor_type(unsigned t)
+{
+/*
+    videomode();
+    regs.h.ah = SETCURSORTYPE;
+    regs.x.bx = video_page;
+    regs.x.cx = t;
+    int86(VIDEO, &regs, &regs);
+*/
+}
+
+
+/* ------ convert an Alt+ key to its letter equivalent ----- */
+int AltConvert(int c)
+{
+       return c;
+#if 0
+       int i, a = 0;
+       for (i = 0; i < 36; i++)
+               if (c == altconvert[i])
+                       break;
+       if (i < 26)
+               a = 'a' + i;
+       else if (i < 36)
+               a = '0' + i - 26;
+       return a;
+#endif
+}
+
+/* EOF */
diff --git a/rosapps/dflat32/decomp.c b/rosapps/dflat32/decomp.c
new file mode 100644 (file)
index 0000000..9660107
--- /dev/null
@@ -0,0 +1,134 @@
+/* ------------------- decomp.c -------------------- */
+
+/*
+ * Decompress the application.HLP file
+ * or load the application.TXT file if the .HLP file
+ * does not exist
+ */
+
+#include "dflat.h"
+#include "htree.h"
+
+static int in8;
+static int ct8 = 8;
+static FILE *fi;
+static BYTECOUNTER bytectr;
+static int LoadingASCII;
+struct htr *HelpTree;
+static int root;
+
+/* ------- open the help database file -------- */
+FILE *OpenHelpFile(void)
+{
+    char *cp;
+    int treect, i;
+    char helpname[65];
+
+    /* -------- get the name of the help file ---------- */
+    BuildFileName(helpname, ".hlp");
+    LoadingASCII = FALSE;
+    if ((fi = fopen(helpname, "rb")) == NULL)    {
+        /* ---- no .hlp file, look for .txt file ---- */
+        if ((cp = strrchr(helpname, '.')) != NULL)    {
+            strcpy(cp, ".TXT");
+            fi = fopen(helpname, "rt");
+        }
+        if (fi == NULL)
+            return NULL;
+        LoadingASCII = TRUE;
+    }
+
+    if (!LoadingASCII && HelpTree == NULL)    {
+           /* ----- read the byte count ------ */
+           fread(&bytectr, sizeof bytectr, 1, fi);
+           /* ----- read the frequency count ------ */
+           fread(&treect, sizeof treect, 1, fi);
+           /* ----- read the root offset ------ */
+           fread(&root, sizeof root, 1, fi);
+        HelpTree = DFcalloc(treect-256, sizeof(struct htr));
+        /* ---- read in the tree --- */
+        for (i = 0; i < treect-256; i++)    {
+               fread(&HelpTree[i].left,  sizeof(int), 1, fi);
+            fread(&HelpTree[i].right, sizeof(int), 1, fi);
+        }
+    }
+    return fi;
+}
+
+/* ----- read a line of text from the help database ----- */
+void *GetHelpLine(char *line)
+{
+    int h;
+    if (LoadingASCII)  {
+               void *hp;
+               do
+                       hp = fgets(line, 160, fi);
+               while (*line == ';');
+               return hp;
+       }
+    *line = '\0';
+    while (TRUE)    {
+        /* ----- decompress a line from the file ------ */
+        h = root;
+        /* ----- walk the Huffman tree ----- */
+        while (h > 255)    {
+            /* --- h is a node pointer --- */
+            if (ct8 == 8)   {
+                /* --- read 8 bits of compressed data --- */
+                if ((in8 = fgetc(fi)) == EOF)    {
+                    *line = '\0';
+                    return NULL;
+                }
+                ct8 = 0;
+            }
+            /* -- point to left or right node based on msb -- */
+            if (in8 & 0x80)
+                h = HelpTree[h-256].left;
+            else
+                h = HelpTree[h-256].right;
+            /* --- shift the next bit in --- */
+            in8 <<= 1;
+            ct8++;
+        }
+        /* --- h < 255 = decompressed character --- */
+        if (h == '\r')
+            continue;    /* skip the '\r' character */
+        /* --- put the character in the buffer --- */
+        *line++ = h;
+        /* --- if '\n', end of line --- */
+        if (h == '\n')
+            break;
+    }
+    *line = '\0';    /* null-terminate the line */
+    return line;
+}
+
+/* --- compute the database file byte and bit position --- */
+void HelpFilePosition(long *offset, int *bit)
+{
+    *offset = ftell(fi);
+    if (LoadingASCII)
+        *bit = 0;
+    else    {
+        if (ct8 < 8)
+            --*offset;
+        *bit = ct8;
+    }
+}
+
+/* -- position the database to the specified byte and bit -- */
+void SeekHelpLine(long offset, int bit)
+{
+    int i;
+    fseek(fi, offset, 0);
+    if (!LoadingASCII)    {
+        ct8 = bit;
+        if (ct8 < 8)    {
+            in8 = fgetc(fi);
+            for (i = 0; i < bit; i++)
+                in8 <<= 1;
+        }
+    }
+}
+
+
diff --git a/rosapps/dflat32/dfalloc.c b/rosapps/dflat32/dfalloc.c
new file mode 100644 (file)
index 0000000..f34b2a6
--- /dev/null
@@ -0,0 +1,70 @@
+/* ---------- dfalloc.c ---------- */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#include "dflat.h"
+
+static void AllocationError(void)
+{
+       static BOOL OnceIn = FALSE;
+       extern jmp_buf AllocError;
+       extern BOOL AllocTesting;
+       static char *ErrMsg[] = {
+               "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",
+               "³ Out of Memory! ³",
+               "RÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU"
+       };
+       int x, y;
+       CHAR_INFO savbuf[54];
+       DFRECT rc = {30,11,47,13};
+       INPUT_RECORD ir;
+
+       if (!OnceIn)
+       {
+               OnceIn = TRUE;
+               /* ------ close all windows ------ */
+               DfSendMessage(ApplicationWindow, CLOSE_WINDOW, 0, 0);
+               GetVideo(rc, savbuf);
+               for (x = 0; x < 18; x++)
+               {
+                       for (y = 0; y < 3; y++)
+                       {
+                               int c = (255 & (*(*(ErrMsg+y)+x))) | 0x7000;
+                               PutVideoChar(x+rc.lf, y+rc.tp, c);
+                       }
+               }
+               GetKey(&ir);
+               StoreVideo(rc, savbuf);
+               if (AllocTesting)
+                       longjmp(AllocError, 1);
+       }
+}
+
+void *DFcalloc(size_t nitems, size_t size)
+{
+       void *rtn = calloc(nitems, size);
+       if (size && rtn == NULL)
+               AllocationError();
+       return rtn;
+}
+
+void *DFmalloc(size_t size)
+{
+       void *rtn = malloc(size);
+       if (size && rtn == NULL)
+               AllocationError();
+       return rtn;
+}
+
+void *DFrealloc(void *block, size_t size)
+{
+       void *rtn;
+
+       rtn = realloc(block, size);
+       if (size && rtn == NULL)
+               AllocationError();
+       return rtn;
+}
+
+/* EOF */
diff --git a/rosapps/dflat32/dflat.doc b/rosapps/dflat32/dflat.doc
new file mode 100644 (file)
index 0000000..9a96530
--- /dev/null
@@ -0,0 +1,1350 @@
+Window Classes:
+
+Window classes define the behavior of windows. Each class has its own
+unique reaction to messages. Classes derive from other classes.
+
+    NORMAL       base window for all window classes
+    APPLICATION  application window. has the menu 
+                 (derived from NORMAL)
+    TEXTBOX      textbox. base window for listbox, editbox, etc.
+                 (derived from NORMAL)
+    LISTBOX      listbox. base window for menubar
+                 (derived from TEXTBOX)
+    PICTUREBOX   picturebox. a text box onto which you can draw lines
+                 (derived from TEXTBOX)
+    EDITBOX      editbox
+                 (derived from TEXTBOX)
+    MENUBAR      the application's menu bar
+                 (derived from NORMAL)
+    POPDOWNMENU  popdown menu
+                 (derived from LISTBOX)
+    BUTTON       command button in a dialog box
+                 (derived from TEXTBOX)
+    SPINBUTTON   spin button in a dialog box
+                 (derived from LISTBOX)
+    COMBOBOX    combination editbox/listbox
+                (derived from EDITBOX)
+    DIALOG       dialog box. parent to editbox, button, listbox, etc.
+                 (derived from NORMAL)
+    ERRORBOX     for displaying an error message
+                 (derived from DIALOG)
+    MESSAGEBOX   for displaying a message
+                 (derived from DIALOG)
+    HELPBOX      help window
+                 (derived from DIALOG)
+    TEXT         static text on a dialog box
+                 (derived from TEXTBOX)
+    RADIOBUTTON  radio button on a dialog box
+                 (derived from TEXTBOX)
+    CHECKBOX     check box on a dialog box
+                 (derived from TEXTBOX)
+    STATUSBAR    status bar at the bottom of application window
+                 (derived from TEXTBOX)
+
+               D-Flat Window Class Tree
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³                                             ³
+    ³      NORMAL                                 ³
+    ³        ³                                    ³
+    ³        ÃÄÄ APPLICATION                      ³
+    ³        ³                                    ³
+    ³        ÃÄÄ MENUBAR                          ³
+    ³        ³                                    ³
+    ³        ÃÄÄ TEXTBOX                          ³
+    ³        ³      ³                             ³
+    ³        ³      ÃÄÄ LISTBOX                   ³
+    ³        ³      ³      ³                      ³
+    ³        ³      ³      ÃÄÄÄÄ POPDOWNMENU      ³
+    ³        ³      ³      ³                      ³
+    ³        ³      ³      ÀÄÄÄÄ SPINBUTTON       ³
+    ³        ³      ³                             ³
+    ³        ³      ÃÄÄ EDITBOX                   ³
+    ³        ³      ³      ³                      ³
+    ³        ³      ³      ÀÄÄÄÄ COMBOBOX         ³
+    ³        ³      ³                             ³
+    ³        ³      ÃÄÄ PICTUREBOX                ³
+    ³        ³      ³                             ³
+    ³        ³      ÃÄÄ STATUSBAR                 ³
+    ³        ³      ³                             ³
+    ³        ³      ÃÄÄ TEXT                      ³
+    ³        ³      ³                             ³
+    ³        ³      ÃÄÄ BUTTON                    ³
+    ³        ³      ³                             ³
+    ³        ³      ÃÄÄ RADIOBUTTON               ³
+    ³        ³      ³                             ³
+    ³        ³      ÀÄÄ CHECKBOX                  ³
+    ³        ³                                    ³
+    ³        ÀÄÄ DIALOG                           ³
+    ³              ³                              ³
+    ³              ÃÄÄ ERRORBOX                   ³
+    ³              ³                              ³
+    ³              ÃÄÄ MESSAGEBOX                 ³
+    ³              ³                              ³
+    ³              ÀÄÄ HELPBOX                    ³
+    ³                                             ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+
+
+Window Attributes:
+
+Every window has an attribute word that defines some of its
+appearance and behavior. The following values are bitwise flags that
+OR together to make a window's attributes.
+
+You can establish default attributes for a window's class, add
+additional attributes when you create the window, and use the
+AddAttribute, ClearAttribute, and TestAttribute macros to change and
+test a window's attributes.
+
+    SHADOW       has a shadow
+    MOVEABLE     can move the window with mouse or cursor
+    SIZEABLE     can resize the window with mouse or cursor
+    HASMENUBAR   has a menubar (an application window)
+    VSCROLLBAR   has a vertical scroll bar
+    HSCROLLBAR   has a horizontal scroll bar
+    VISIBLE      is visible
+    SAVESELF     saves its own video memory
+    TITLEBAR     has a title bar 
+    CONTROLBOX   has a control box and control menu
+    MINMAXBOX    has a min/max box 
+    NOCLIP       is not clipped to its parent's borders
+    READONLY     is a readonly textbox
+    MULTILINE    is a multiline editbox or listbox
+    HASBORDER    has a border
+    HASSTATUSBAR has a statusbar (application window only)
+
+Messages:
+
+A D-Flat program is message-driven. You initiate message processing
+with the init_messages function, create a window with the
+CreateWindow function, and go into the message dispatching loop with
+the dispatch_message function. 
+
+A window can have a window-processing function. When the user causes
+events to occur by pressing keys and using the mouse, D-Flat sends
+messages to the window's function. That function can send messages to
+itself and other windows with the SendMessage and PostMessage
+functions.
+
+Windows are declared as members of a class. Every class has a default
+window-processing function. If you do not provide one for an instance
+of a window class, the default one receives messages for the window.
+Your custom window-processing function--if one exists--should chain to
+the default window-processing function for the blass by calling the
+DefaultWndProc function.
+
+There are five things a window-processing function can do with a
+message:
+  - ignore it and let the D-Flat default processing occur.
+  - suppress it by returning without chaining to the default
+    window-processing function for the window class.
+  - chain to the default window-processing function and then do some
+    additional processing.
+  - do some preliminary processing and then chain to the default
+    window-processing function.
+  - do all the processing of the message and then return without 
+    chaining to the default window-processing function for the 
+    window class.
+
+Following are the messages that an application program would use.
+There are other messages, but they are used by D-Flat only.
+
+Process Communication Messages  
+
+START                  start message processing (not used now)
+  Sent:    
+  P1:      
+  P2:      
+  Returns: 
+
+STOP                   stop message processing        
+  Sent:    by application window to NULL to stop message 
+           dispatch loop
+  P1:      
+  P2:      
+  Returns: 
+
+COMMAND                send a command to a window
+  Sent:    to send command
+  P1:      command code (commands.h)
+  P2:      additional data (command-dependent)
+           If the command code is a menu selection, P2 is the
+           position of the selection on the menu (1,2,...)
+           If the command code is a dialog box control, P2 is
+           ENTERFOCUS when the command gets the focus, LEAVEFOCUS
+           when the command loses the focus, and 0 when the user
+           executes the control's command, e.g. presses a button.
+  Returns: Nothing if sent by PostCommand
+           Command-dependent value if sent by SendCommand
+
+
+Window Management Messages  
+
+CREATE_WINDOW          create a window                
+  Sent:    by DFLAT to new window after window is created
+  P1:      
+  P2:      
+  Returns: 
+
+OPEN_WINDOW           open a window                
+  Sent:    (posted) by DFLAT to new window after window is created
+  P1:      
+  P2:      
+  Returns: 
+
+SHOW_WINDOW            show a window                  
+  Sent:    by the app to the window to display the window
+  P1:      
+  P2:      
+  Returns: 
+
+HIDE_WINDOW            hide a window                  
+  Sent:    by the app to the window to hide the window
+  P1:      
+  P2:      
+  Returns: 
+
+CLOSE_WINDOW           delete a window                
+  Sent:    by the app to destroy a window
+  P1:      
+  P2:      
+  Returns: 
+
+SETFOCUS               set and clear the focus        
+  Sent:    by D-Flat or the app to set or release the focus
+  P1:      true = set, false = release
+  P2:      
+  Returns: 
+
+PAINT                  paint the window's data space  
+  Sent:    to paint the client area of a window
+  P1:      address of RECT relative to window (0/0 = upper left) 
+           to paint or 0 to paint entire client area
+  P2:      True to make non-focus window paint without clipping
+  Returns: 
+
+BORDER                 paint the window's border      
+  Sent:    to paint a window's border
+  P1:      address of RECT relative to window (0/0 = upper left) 
+           to paint or 0 to paint entire border
+  P2:      
+  Returns: FALSE to suppress D-Flat title display 
+           (e.g. the window displays its own border)
+
+TITLE                  display the window's title     
+  Sent:    by D-Flat when it is about to display a window's title
+  P1:      address of RECT relative to window (0/0 = upper left) 
+           to paint or 0 to paint entire title
+  P2:      
+  Returns: FALSE to suppress D-Flat title display 
+           (e.g. the window displays its own title)
+
+MOVE                   move the window                
+  Sent:    to move a window
+  P1:      new left coordinate
+  P2:      new upper coordinate
+  Returns: 
+
+SIZE                   change the window's size       
+  Sent:    to resize a window
+  P1:      new right coordinate
+  P2:      new lower coordinate
+  Returns: 
+
+MAXIMIZE               maximize the window            
+  Sent:    to maximize a window within its parent's client area
+  P1:      
+  P2:      
+  Returns: 
+
+MINIMIZE               minimize the window            
+  Sent:    to minimize a window to an icon 
+  P1:      
+  P2:      
+  Returns: 
+
+RESTORE                restore the window             
+  Sent:    to restore a window to its position and size prior to the
+           maximize or minimize operation
+  P1:      
+  P2:      
+  Returns: 
+
+INSIDE_WINDOW          test x/y inside a window       
+  Sent:    to test to see if coordinates are inside a window
+  P1:      x
+  P2:      y
+  Returns: true or false
+
+
+Clock Messages  
+
+CLOCKTICK              the clock ticked               
+  Sent:    every second to a window that has captured the clock
+  P1:      segment of time display string
+  P2:      offset of time display string
+  Returns: 
+
+CAPTURE_CLOCK          capture clock into a window    
+  Sent:    to capture the clock. To chain clock ticks, send this
+           message to wnd->PrevClock when you receive the message.
+  P1:      
+  P2:      
+  Returns: 
+
+RELEASE_CLOCK          release clock to the system    
+  Sent:    to release the captured clock
+  P1:      
+  P2:      
+  Returns: 
+
+
+Keyboard and Screen Messages  
+
+KEYBOARD               key was pressed                
+  Sent:    when key is pressed. sent to the window that has the focus 
+  P1:      keystroke
+  P2:      shift key mask
+  Returns: 
+
+CAPTURE_KEYBOARD       capture keyboard into a window 
+  Sent:    by window to itself to capture the keyboard 
+           regardless of focus
+  P1:      
+  P2:      
+  Returns: 
+
+RELEASE_KEYBOARD       release keyboard to system     
+  Sent:    by window to itelf to release the captured keyboard
+  P1:      
+  P2:      
+  Returns: 
+
+KEYBOARD_CURSOR        position the keyboard cursor   
+  Sent:    to position the keyboard cursor
+  P1:      x (if sent by window, 0 = left client area)
+  P2:      y (if sent by window, 0 = top client area)
+           if sent with NULL, x/y are relative to the screen
+  Returns: 
+
+CURRENT_KEYBOARD_CURSOR    read the cursor position
+  Sent:    to retrieve the cursor position
+  P1:      x (relative to the screen)
+  P2:      y (relative to the screen)
+  Returns: 
+
+HIDE_CURSOR            hide the keyboard cursor       
+  Sent:    to hide the keyboard cursor
+  P1:      
+  P2:      
+  Returns: 
+
+SHOW_CURSOR            display the keyboard cursor    
+  Sent:    to display the keyboard cursor
+  P1:      
+  P2:      
+  Returns: 
+
+SAVE_CURSOR            save the cursor's configuration
+  Sent:    to save the keyboard cursor's current configuration 
+  P1:      
+  P2:      
+  Returns: 
+
+RESTORE_CURSOR         restore the saved cursor       
+  Sent:    to restore a keyboard cursor's saved configuration 
+  P1:      
+  P2:      
+  Returns: 
+
+SHIFT_CHANGED          the shift status changed       
+  Sent:    to in-focus window when the user presses or 
+           releases shift, alt, or ctrl key
+  P1:      BIOS shift key mask
+  P2:      
+  Returns: 
+
+WAITKEYBOARD            wait for key release
+  Sent:    to wait for a keypress release
+  P1:
+  P2:      
+  Returns: 
+
+
+Mouse Messages  
+
+RESET_MOUSE            reset the mouse
+  Sent:    to reset the mouse to the current screen configuration
+  P1:
+  P2:      
+  Returns: 
+
+MOUSE_TRAVEL        set the mouse's travel
+  Sent:    to limit the mouse travel to a screen rectangle
+  P1:      address of a RECT
+  P2:      
+  Returns: 
+
+MOUSE_INSTALLED        test for mouse installed       
+  Sent:    to see if the mouse is installed
+  P1:      
+  P2:      
+  Returns: true or false
+
+RIGHT_BUTTON           right button pressed           
+  Sent:    to window when the user presses the right button
+           (sent only when mouse cursor is within the window
+            or the window has captured the mouse)
+  P1:      x
+  P2:      y
+  Returns: 
+
+LEFT_BUTTON            left button pressed            
+  Sent:    to window when the user presses the left button
+           (sent only when mouse cursor is within the window
+            or the window has captured the mouse)
+  P1:      x
+  P2:      y
+  Returns: 
+
+DOUBLE_CLICK           left button doubleclicked    
+  Sent:    to window when the user double-clicks the left button
+           (sent only when mouse cursor is within the window
+            or the window has captured the mouse)
+           (a LEFT_BUTTON message will have preceded this one)
+  P1:      x
+  P2:      y
+  Returns: 
+
+MOUSE_MOVED            mouse changed position         
+  Sent:    to window when the mouse has moved
+           (sent only when mouse cursor is within the window
+            or the window has captured the mouse)
+  P1:      x
+  P2:      y
+  Returns: 
+
+BUTTON_RELEASED        mouse button released          
+  Sent:    to window when user releases mouse button
+           (sent only when mouse cursor is within the window
+            or the window has captured the mouse)
+  P1:      x
+  P2:      y
+  Returns: 
+
+CURRENT_MOUSE_CURSOR   get mouse position             
+  Sent:    to determine the current mouse position
+  P1:      address of x
+  P2:      address of y
+  Returns: mouse coordinates in x and y. If no mouse is installed,
+           returns -1 in x and y.
+
+MOUSE_CURSOR           set mouse position             
+  Sent:    to set the current mouse position
+  P1:      x
+  P2:      y
+  Returns: 
+
+SHOW_MOUSE             make mouse cursor visible      
+  Sent:    to display the mouse cursor
+  P1:      
+  P2:      
+  Returns: 
+
+HIDE_MOUSE             hide mouse cursor              
+  Sent:    to hide the mouse cursor
+  P1:      
+  P2:      
+  Returns: 
+
+WAITMOUSE              wait until button released     
+  Sent:    to wait until the user releases the mouse button
+  P1:      
+  P2:      
+  Returns: 
+
+TESTMOUSE              test any mouse button pressed  
+  Sent:    to see if either mouse button is pressed
+  P1:      
+  P2:      
+  Returns: true or false
+
+CAPTURE_MOUSE          capture mouse into a window    
+  Sent:    by/to a window to capture all mouse activity 
+           regardless of whether it occurs inside this window
+  P1:      
+  P2:      
+  Returns: 
+
+RELEASE_MOUSE          release the mouse to system    
+  Sent:    release a captured mouse
+  P1:      
+  P2:      
+  Returns: 
+
+
+Text Box Messages  
+
+ADDTEXT                add text to the text box       
+  Sent:    to append a line of text to the text box
+  P1:      address of null-terminated string without \n
+           (textbox makes its own copy. string can go out of scope.)
+  P2:      
+  Returns: 
+
+DELETETEXT         delete line of text from the text box       
+  Sent:    to delete a line of text from the text box
+  P1:      line number relative to zero
+  P2:      
+  Returns: 
+
+INSERTTEXT           insert line of text into the text box       
+  Sent:    to insert a line of text into the text box
+  P1:      address of null-terminated string without \n
+  P2:      line number relative to zero that will follow new line.
+  Returns: 
+
+CLEARTEXT              clear the text box             
+  Sent:    clear all text from the text box
+  P1:      
+  P2:      
+  Returns: 
+
+SETTEXT                set text buffer contents
+  Sent:    To set text buffer to caller's text.
+  P1:      address of text buffer
+           (lines are terminated by \n without \0)
+           (textbox makes its own copy. string can go out of scope.)
+  P2:      length of text buffer
+  Returns: 
+
+SCROLL                 vertical scroll of text box    
+  Sent:    to scroll a text window vertically one line
+  P1:      true = scroll up, false = scroll down
+  P2:
+  Returns: 
+
+HORIZSCROLL            horizontal scroll of text box 
+  Sent:    to scroll a text window horizontally one column
+  P1:      true = scroll left, false = scroll right
+  P2:
+  Returns: 
+
+SCROLLPAGE             vertical scroll of text box 1 page
+  Sent:    to scroll a text window vertically one page
+  P1:      true = scroll up, false = scroll down
+  P2:
+  Returns: 
+
+HORIZSCROLLPAGE        horizontal scroll of text box 1 page
+  Sent:    to scroll a text window horizontally one page
+  P1:      true = scroll left, false = scroll right
+  P2:
+  Returns: 
+
+SCROLLDOC             document scroll of text box
+  Sent:    to scroll a text window to beginning/end of document
+  P1:      true = scroll to beginning, false = scroll to end
+  P2:
+  Returns: 
+
+Edit Box Messages  
+
+GETTEXT             get text from an edit box      
+  Sent:    Get the line of text from a single-line editbox
+  P1:      address of receiving buffer
+  P2:      max length to copy
+  Returns: 
+
+SETTEXTLENGTH        set maximum text length in an edit box      
+  Sent:    to set the maximum number of characters that an editbox
+           may hold in its buffer.
+  P1:      maximum character count
+  P2:      
+  Returns: 
+
+
+Application Window Messages
+
+ADDSTATUS               write text to the status bar
+  Sent:    to write to or clear status bar text area
+  P1:      address of text (null-terminated string) or NULL to clear
+  P2:      
+  Returns: 
+
+List Box Messages  
+
+LB_SELECTION               list box selection
+  Sent:    sent by list box to self and to parent (if parent is not
+           a simple LISTBOX window) when user moves to an entry on 
+           the list box.
+  P1:      selection number: 0, 1, ...
+  P2:      if multi-line selection listbox, shift status mask
+           if not, true = selection was same as choice (e.g. mouse)
+  Returns: 
+
+LB_CHOOSE               list box choice        
+  Sent:    sent to parent of list box when user chooses an item 
+           from the list box
+  P1:      selection number: 0, 1, ...
+  P2:      
+  Returns: 
+
+LB_CURRENTSELECTION    return the current selection   
+  Sent:    To get the current selection number (where the listbox
+           cursor is positioned)
+  P1:      
+  P2:      
+  Returns: selection number: 0, 1, ..., or -1 if listbox is empty or
+           no line is selected.
+
+LB_GETTEXT             return the text of selection   
+  Sent:    To get a copy of the text at a specified line
+  P1:      Address of string to receive copy of text
+  P2:      Line number: 0, 1, ...
+  Returns: 
+
+LB_SETSELECTION        sets the listbox selection     
+  Sent:    To change where the listbox cursor points
+  P1:      Line number: 0, 1, ...
+  P2:      
+  Returns: 
+
+Picture Box Messages
+
+DRAWVECTOR           Draws a vector
+  Sent:    To draw a vector in the window's client area
+  P1:      address of RECT that describes the vector relative to the
+           window's client area
+           (either lf = rt [vertical vector] or tp = bt [horizontal
+           vector])
+  P2:      
+  Returns: 
+
+DRAWBOX             Draws a box
+  Sent:    To draw a box in the window's client area
+  P1:      address of RECT that describes the box relative to the
+           window's client area
+  P2:      
+  Returns: 
+
+DRAWBAR             Draws a barchart bar
+  Sent:    To draw a bar in the window's client area
+  P1:      address of RECT that describes the bar relative to the
+           window's client area
+           (either lf = rt [vertical vector] or tp = bt [horizontal
+           vector])
+  P2:      one of these: SOLIDBAR, HEAVYBAR, CROSSBAR, LIGHTBAR
+             (4 different bar textures)
+  Returns: 
+
+=====================================================
+
+API Functions & Macros:
+
+These are functions and macros defined for use by applications
+programs. There are many others defined in the header files. These
+others are for D-Flat to use, and programmers need not be concerned
+about them except as an expression of their curiosity about how
+D-Flat works.
+
+
+(Note: These specifications are not in any orderly sequence yet.)
+
+
+-------------------------------------------------------------------
+void init_messages(void)
+
+Call this function first to initialize message processing. Continue
+only if the function returns a true value. Otherwise, terminate the
+processing of your program. A false return occurs from a longjmp that
+is executed when D-Flat attempts to allocate memory that is not
+available.
+
+-------------------------------------------------------------------
+WINDOW CreateWindow(
+    CLASS Class,              /* class of this window       */
+    char *ttl,                /* title or NULL              */
+    int left, int top,        /* upper left coordinates     */
+    int height, int width,    /* dimensions                 */
+    void *extension,          /* pointer to additional data */
+    WINDOW parent,            /* parent of this window      */
+    int (*wndproc)(struct window *,MESSAGE,PARAM,PARAM),
+    int attrib)               /* window attribute           */
+
+This function creates a window. It returns the WINDOW handle that
+messages and functions use to identify the window. If you specify
+NULL for the parent, the APPLICATION window becomes the parent.
+
+-------------------------------------------------------------------
+void PostMessage(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
+
+Post a message to a window. The window will receive the message in
+turn during the message-dispatching loop.
+
+-------------------------------------------------------------------
+int SendMessage(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
+
+Send a message to a window. The window will receive the message
+immediately. Control returns to the sender after the window has
+processed the message. The window can return an integer value.
+
+This function can send system messages to NULL. System messages
+are ones that D-Flat processes without regard to a particular window.
+-------------------------------------------------------------------
+int dispatch_message(void)
+
+The message dispatching loop. After opening the first window (usually
+the applications window), continue to call this function until it
+returns a FALSE value.
+-------------------------------------------------------------------
+void handshake(void)
+
+This function dispatches messages without allowing any keyboard or
+click events to pass through. You use it to allow the clock to run or
+the watch icon to move during a lengthy process without allowing
+anything to execute a command that might interfere with what your
+program is doing.
+
+-------------------------------------------------------------------
+int TestCriticalError(void)
+
+-------------------------------------------------------------------
+int DefaultWndProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
+
+Call this from a window-processing function to chain to the default
+window-processing function for the window's class.
+
+-------------------------------------------------------------------
+int BaseWndProc(CLASS Class, WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
+
+Call this from the window-processing function of a derived window
+class to chain to the window-processing function of the base window's
+class.
+
+-------------------------------------------------------------------
+int WindowHeight(WINDOW wnd)
+int WindowWidth(WINDOW wnd)
+
+These functions return the window's height and width.
+-------------------------------------------------------------------
+int ClientWidth(WINDOW wnd)
+int ClientHeight(WINDOW wnd)
+
+These functions return the height and width of the window's client
+area.
+
+-------------------------------------------------------------------
+int GetTop(WINDOW wnd)
+int GetBottom(WINDOW wnd)
+int GetLeft(WINDOW wnd)
+int GetRight(WINDOW wnd)
+
+These functions return the screen coordinates of the four corners of
+the window.
+
+-------------------------------------------------------------------
+int GetClientTop(WINDOW wnd)
+int GetClientBottom(WINDOW wnd)
+int GetClientLeft(WINDOW wnd)
+int GetClientRight(WINDOW wnd)
+
+These functions return the screen coordinates of the four corners of
+the window's client area.
+
+-------------------------------------------------------------------
+WINDOW GetParent(WINDOW wnd)
+
+Returns the parent of the window or NULL if the window has no
+parent.
+
+-------------------------------------------------------------------
+WINDOW FirstWindow(wnd)
+
+Returns the first child window that wnd is a parent of or NULL if
+wnd has no children.
+
+-------------------------------------------------------------------
+WINDOW LastWindow(wnd) 
+
+Returns the last child window that wnd is a parent of or NULL if
+wnd has no children.
+
+-------------------------------------------------------------------
+WINDOW NextWindow(wnd)
+
+Returns the next adjacent sibling window of wnd or NULL if wnd has no
+siblings.
+
+-------------------------------------------------------------------
+WINDOW PrevWindow(wnd) 
+
+Returns the previous adjacent sibling window of wnd or NULL if wnd
+has no siblings.
+
+-------------------------------------------------------------------
+int CharInView(WINDOW wnd, int x, int y)
+
+Returns true if the x/y character position, relative to the window,
+is in view (not clipped at the border of a parent window or the
+screen.
+
+-------------------------------------------------------------------
+int TopBorderAdj(WINDOW wnd)
+
+Returns the value to add to a y coordinate of the window's client
+area to make it relative to the window top.
+
+-------------------------------------------------------------------
+int BorderAdj(WINDOW wnd)
+
+Returns the value to add to an x coordinate relative to the window's
+client area to make it relative to the window's left edge.
+
+-------------------------------------------------------------------
+char *GetTitle(WINDOW wnd)
+
+Returns the address of a window's title, or NULL if the window has no
+title.
+
+-------------------------------------------------------------------
+void AddTitle(WINDOW wnd, char *title)
+
+Adds or changes the title to an existing window.
+
+-------------------------------------------------------------------
+CLASS GetClass(WINDOW wnd)
+
+Returns the class of the window.
+
+-------------------------------------------------------------------
+int GetAttribute(WINDOW wnd)
+
+Returns the attribute word of a window.
+
+-------------------------------------------------------------------
+void AddAttribute(WINDOW wnd, int attrib)
+
+Adds one or more attributes to a window. OR the attribute values
+together.
+
+-------------------------------------------------------------------
+void ClearAttribute(WINDOW wnd, int attrib)
+
+Clears one or more attributes from a window. OR the attribute values
+together.
+
+-------------------------------------------------------------------
+int TestAttribute(WINDOW wnd, int attrib)
+
+Tests one or more attributes in a window. Returns true if any of them
+are set. OR the attribute values together.
+
+-------------------------------------------------------------------
+int isVisible(WINDOW wnd)
+
+Returns true if the window is visible.
+
+-------------------------------------------------------------------
+char *GetText(WINDOW wnd)
+
+Returns the address of the text buffer for a TEXTBOX or derived
+window class.
+
+-------------------------------------------------------------------
+int GetTextLines(WINDOW wnd)
+
+Returns the number of text lines in a TEXTBOX or derived
+window class.
+
+-------------------------------------------------------------------
+char *TextLine(WINDOW wnd, int line)
+
+Returns the address of a specified line of text (0, 1, ...) in a
+TEXTBOX or derived class.
+
+-------------------------------------------------------------------
+void SetProtected(WINDOW wnd)
+
+Protects a TEXTBOX or control derived from a TEXT from having its
+data displayed. Displays * for each displayable character. Typically
+used for EDITBOX controls used for password input.
+
+-------------------------------------------------------------------
+int isActive(MENU *mnu, int command)
+
+Returns true if the command (commands.h) on the menu is active
+(enabled).
+
+-------------------------------------------------------------------
+char *GetCommandText(MBAR *mn, int cmd)
+
+Returns the address of a menu command's title text.
+
+-------------------------------------------------------------------
+void ActivateCommand(MENU *mnu, int command)
+void DeactivateCommand(MENU *mnu, int command)
+
+Activate (enable) or deactivate (disable) a command (commands.h) on a
+menu.
+
+-------------------------------------------------------------------
+int GetCommandToggle(MENU *mnu, int command)
+void SetCommandToggle(MENU *mnu, int command)
+void ClearCommandToggle(MENU *mnu, int command)
+void InvertCommandToggle(MENU *mnu, int command)
+
+Some menu commands are toggles rather than executors of processes. 
+Examples are the Insert and Word wrap commands on the Options menu.
+These functions get, set, clear, and invert the toggle setting for a
+specified command on a specified menu.
+
+-------------------------------------------------------------------
+int ItemSelected(WINDOW wnd, int line)
+
+This function returns true if the specified item (0, 1, ...) on a
+multiple-line selection listbox is selected.
+
+-------------------------------------------------------------------
+int DialogBox(
+  WINDOW wnd,        /* parent window of the dialog box        */
+  DBOX *db,          /* address of dialog box definition array */
+  int Modal,         /* true if it is a modal dialog box       */
+  int (*wndproc)(struct window *, MESSAGE, PARAM, PARAM)
+                     /* the window processing function or NULL */
+)
+
+This function executes a dialog box. If it is a modal dialog box, the
+function does not return until the user completes the dialog box. The
+return value will be true if the user has selected OK and false if
+the user has selected Cancel on the dialog box. If the dialog box is
+modeless, the function returns immediately, and the user can select
+other things from the screen while the dialog box is still active.
+
+-------------------------------------------------------------------
+WINDOW ControlWindow(DBOX *db, enum commands cmd)
+
+This function returns the WINDOW handle of the control specified by
+the cmd parameter.
+-------------------------------------------------------------------
+void MessageBox(char *title, char *message)
+void CancelBox(wnd, char *message)
+void ErrorMessage(char *message)
+int TestErrorMessage(char *message)
+int YesNoBox(char *question)
+WINDOW MomentaryMessage(char *message)
+
+These functions display generic message boxes. The message text is
+one null-terminated string with newlines (\n) to indicate where lines
+are to be broken. The size of the boxes adjusts to the width of the
+longest line and the number of lines of text. A message may have no
+more lines of text than will fit into the largest window that the
+screen can display. You must account for the window's border's and
+the presence at the bottom of one or more command buttons.
+
+The MessageBox function displays a message in a window with a title
+provided by the caller. The window contains the message and an OK
+command button.
+
+The CancelBox function displays a message in a window with a
+"Wait..." title. The window contains the message and a Cancel command
+button. If the user presses the Cancel button before the program
+closes the window, the COMMAND, ID_CANCEL message is sent to the
+parent window.
+
+The ErrorMessage function displays the message in an error box window
+with an OK command button.
+
+The TestErrorMessage function is an error message with OK and Cancel
+command buttons. The function returns true if the user selects OK or
+presses Enter and false if the user selects Cancel or presses Esc.
+
+The YesNoBox function displays the message with Yes and No command
+buttons. The function returns true if the user selects Yes or
+presses Enter and false if the user selects No or presses Esc.
+
+The MomentaryMessage function displays a message box and returns its
+WINDOW handle. The caller must close the window. The purpose of this
+function is to allow you to display a message while some time
+consuming process is underway and then erase the message after the
+process is done but without any action required from the user.
+
+-------------------------------------------------------------------
+int InputBox(WINDOW wnd, char *ttl, char *msg, char *text, int len, int wd)
+
+This function executes a generic one-line user input dialog box. The
+wnd parameter is the parent window of the dialog box. The ttl
+parameter points to a title string for the dialog box. The msg
+parameter points to a prompting text message. The text parameter
+points to the string that will receive the user's input. The len
+parameter is the length of the input string not including the null
+terminator. The wd parameter is the width of the string display. If
+the wd parameter is 0, the function computes a width based on the len
+parameter.
+
+The function returns a true value if the user chooses the OK command
+button and false if the user selects Cancel.
+
+-------------------------------------------------------------------
+WINDOW SliderBox(int len, char *ttl, char *msg)
+
+This function displays a dialog box with the specified title and
+message, a slider bar of the specified length, and a Cancel button.
+The slider bar displays a percent value.
+
+You use the slider box to display feedback to the user when the
+program is doing a time-consuming task, such as printing a file.
+Periodically, through your process, you send a PAINT message to the
+window handle that the SliderBox function returns. The second
+parameter is the new percent value. When you have sent 100, the
+slider dialog box closes itself. If the user chooses the Cancel
+command on the dialog box, your next PAINT message returns FALSE.
+Otherwise it returns TRUE.
+
+-------------------------------------------------------------------
+int RadioButtonSetting(DBOX *db, enum commands cmd)
+
+This function returns true if the specified command on the specified
+dialog box is a pressed radio button.
+
+-------------------------------------------------------------------
+void EnableButton(DBOX *db, enum commands cmd)
+
+This function enables a command button on a dialog box. command
+buttons are initially enabled when the dialog box is first opened.
+
+-------------------------------------------------------------------
+void DisableButton(DBOX *db, enum commands cmd)
+
+This function disables a command button on a dialog box. command
+buttons are initially enabled when the dialog box is first opened.
+
+-------------------------------------------------------------------
+int ButtonEnabled(DBOX *db, enum commands cmd)
+
+Returns true if the button is enabled.
+-------------------------------------------------------------------
+void PushRadioButton(DBOX *db, enum commands cmd)
+
+This function presses the specified radio button command on the
+specified dialog box.
+
+-------------------------------------------------------------------
+void PutItemText(WINDOW wnd, enum commands cmd, char *text)
+
+This function appends a line of text to a TEXT, TEXTBOX, EDITBOX,
+LISTBOX, SPINBUTTON, or COMBOBOX control window in a dialog box. The
+wnd parameter is the WINDOW handle of the dialog box. The cmd
+parameter specifies the command associated with the control item. The
+text parameter points to the text to be added. The control window
+makes its own copy of the text, so the caller's copy can go out of
+scope.  If the control window is a COMBOBOX, TEXTBOX, or EDITBOX
+window, you must send a PAINT message to the control window so that
+the new text will display.
+
+You must call this function while the dialog box is active. That
+means that if the dialog box is modal, you must call this function
+from within a custom window processing function that you supply when
+you call DialogBox.
+
+-------------------------------------------------------------------
+void PutComboListText(WINDOW wnd, enum commands cmd, char *text)
+
+This function appends a line of text to the LISTBOX of a COMBOBOX
+control window in a dialog box. The wnd parameter is the WINDOW
+handle of the dialog box. The cmd parameter specifies the command
+associated with the combo box. The text parameter points to the
+text to be added. The control window makes its own copy of the text,
+so the caller's copy can go out of scope.
+
+You must call this function while the dialog box is active. That
+means that if the dialog box is modal, you must call this function
+from within a custom window processing function that you supply when
+you call DialogBox.
+
+-------------------------------------------------------------------
+void GetItemText(WINDOW wnd, enum commands cmd, char *text, int length)
+
+This function copies the text from a TEXT, TEXTBOX, COMBOBOX, or
+EDITBOX control window in a dialog box. The wnd parameter is the
+WINDOW handle of the dialog box. The cmd parameter specifies the
+command associated with the control item. The text parameter points
+to the caller's buffer where the text will be copied. The length
+parameter specifies the maximum number of characters to copy.
+
+You must call this function while the dialog box is active. That
+means that if the dialog box is modal, you must call this function
+from within a custom window processing function that you supply when
+you call DialogBox.
+
+-------------------------------------------------------------------
+char *GetEditBoxText(DBOX *db, enum commands cmd)
+
+This function returns a pointer to the text associated with an
+editbox control in a dialog box. You can call it after the dialog box
+has completed processing. The buffer is on the heap. Do not free it.
+Instead, call SetEditBoxText with a NULL pointer.
+
+-------------------------------------------------------------------
+char *GetComboBoxText(DBOX *db, enum commands cmd)
+
+This function returns a pointer to the text associated with an
+combo box control in a dialog box. You can call it after the dialog box
+has completed processing. The buffer is on the heap. Do not free it.
+Instead, call SetEditBoxText with a NULL pointer.
+
+-------------------------------------------------------------------
+void SetEditBoxText(DBOX *db, enum commands cmd, char *text)
+
+This function sets the text of a dialog box editbox. You can call
+this function before or while the dialog box is open. The dialog box
+makes its own copy on the heap, so your text can go out of scope.
+
+-------------------------------------------------------------------
+void SetComboBoxText(DBOX *db, enum commands cmd, char *text)
+
+This function sets the text of a dialog box combo box. You can call
+this function before or while the dialog box is open. The dialog box
+makes its own copy on the heap, so your text can go out of scope.
+
+-------------------------------------------------------------------
+char *GetDlgText(DBOX *db, enum commands cmd, char *text)
+
+Similar to GetEditBoxText except that it works with text controls.
+
+-------------------------------------------------------------------
+char *SetDlgText(DBOX *db, enum commands cmd, char *text)
+
+Similar to SetEditBoxText except that it works with text controls.
+
+-------------------------------------------------------------------
+char *GetDlgTextBox(DBOX *db, enum commands cmd, char *text)
+
+Similar to GetEditBoxText except that it works with textbox controls.
+
+-------------------------------------------------------------------
+char *SetDlgTextBox(DBOX *db, enum commands cmd, char *text)
+
+Similar to SetEditBoxText except that it works with textbox controls.
+
+-------------------------------------------------------------------
+void SetCheckBox(DBOX *db, enum commands cmd)
+void ClearCheckBox(DBOX *db, enum commands cmd)
+int CheckBoxSetting(DBOX *db, enum commands cmd)
+
+These functions set, clear, and test the setting of a specified check
+box control item on a dialog box.
+
+-------------------------------------------------------------------
+void SetDlgTitle(DBOX *db, char *ttl)
+
+This function changes the specified dialog box's title.
+-------------------------------------------------------------------
+void LoadHelpFile(char *apname);
+
+This function loads the help file. The apname parameter points to 
+the helpfile name without the .hlp extension.
+
+Call this function at the beginning of an application program or to
+change the help file midstream.
+
+-------------------------------------------------------------------
+void DisplayHelp(WINDOW wnd, char *Help)
+
+Display the help window identified by the Help parameter. See the
+comments in memopad.txt for the format of a help database. You can
+get the same effect by sending the DISPLAY_HELP message with a
+pointer to the Help string as the first parameter after the message
+id.
+
+-------------------------------------------------------------------
+char *HelpComment(char *Help)
+
+Retrieve a pointer to the comment text associated with the specified
+Help parameter.
+
+-------------------------------------------------------------------
+void UnLoadHelpFile(void);
+
+Call this function at the end of a D-Flat application to free the
+memory used by a help file.
+
+-------------------------------------------------------------------
+void SearchText(WINDOW wnd)
+
+Opens a dialog box for the user to enter a search string. Searches
+the wnd TEXTBOX for a match on the string.
+
+-------------------------------------------------------------------
+void ReplaceText(WINDOW wnd)
+
+Opens a dialog box for the user to enter search and replacement
+strings. Searches the wnd TEXTBOX for a match on the string and
+replaces it if found. The dialog box includes an option to replace
+all matches.
+
+-------------------------------------------------------------------
+void SearchNext(WINDOW wnd)
+
+Assumes that a previous SearchText call has found a match. Searches
+for the next match of the same string in the specified EDITBOX
+window.
+
+-------------------------------------------------------------------
+void WriteTextLine(WINDOW wnd, RECT *rcc, int y, int reverse)
+
+This function displays a text line from a TEXTBOX or derived window
+class. The text has already been added to the window with ADDTEXT,
+etc. The y parameter specifies which line (0, 1, ...) relative to the
+window's text buffer to display. If the specified line is not in
+view, the function does nothing. If the reverse parameter is true,
+the line displays in the reverse-video colors of the window. The rcc
+RECT pointer is usually NULL for applications calls. It points to a
+rectangle relative to the window outside of which displays will not
+occur. 
+
+-------------------------------------------------------------------
+void PutWindowLine(WINDOW wnd, void *s, int x, int y)
+
+This function writes a line of text to a window. The x and y
+coordinates point to the first character in the window's client area
+where the line is to be written. The text must be null-terminated.
+This function clips the line if it goes beyond the window or the
+screen. The function clips the line if it goes outside the borders of
+the window's parent. If other windows overlap the target window, the
+text is clipped. Do not use negative values in x or y.
+
+You can assign color values to the global variables foreground and
+background to affect the color of the line's display.
+
+-------------------------------------------------------------------
+void PutWindowChar(WINDOW wnd, int c, int x, int y)
+
+This function writes the character c to a window. The x and y
+coordinates are relative to the window's client area.
+
+The function performs clipping. If the character is beyond the
+window's or the screen's borders it is not written. If the window
+does not have the NOCLIP attribute, the character is not written if
+its coordinates are beyond the margins of its parent window (if the
+window has a parent). If other windows overlap the target window, the
+text is clipped. Do not use negative values in x or y.
+
+You can assign color values to the global variables foreground and
+background to affect the color of the character's display.
+
+-------------------------------------------------------------------
+void DrawVector(WINDOW wnd, int x, int y, int len, int hv)
+
+Draw a horizontal vector in a picture box. x and y are character
+coordinates relative to the starting position of the vector. len is
+the length. hv is TRUE for a horizontal vector and FALSE for a
+vertical vector. Sends a DRAWVECTOR message to the window.
+
+Send a PAINT message to the window to display the vectors.
+
+-------------------------------------------------------------------
+void DrawBox(WINDOW wnd, int x, int y, int ht, int wd)
+
+Draw a box in a picture box. x and y are character coordinates
+relative to the upper left corner of the box. ht and wd are the
+height and width of the box. Sends a DRAWBOX message to the window.
+
+Send a PAINT message to the window to display the box.
+
+-------------------------------------------------------------------
+void DrawBar(WINDOW wnd, enum VectTypes vt, int x, int y, int len, int hv)
+
+Draw a graph bar in a picture box. vt is one of the following values
+to specify the character box used to display the bar: SOLIDBAR,
+HEAVYBAR, CROSSBAR, LIGHTBAR. x and y are character coordinates
+relative to the starting position of the bar. len is the length. hv
+is TRUE for a horizontal bar and FALSE for a vertical bar. Sends a
+DRAWBAR message to the window.
+
+Send a PAINT message to the window to display the bars.
+
+-------------------------------------------------------------------
+void WindowClientColor(WINDOW wnd, int fg, int bg)
+
+Changes the window client space's foreground and background colors.
+-------------------------------------------------------------------
+void WindowReverseColor(WINDOW wnd, int fg, int bg)
+
+Changes the window's foreground and background reverse colors, which
+are used to display such things as selected text blocks.
+-------------------------------------------------------------------
+void WindowFrameColor(WINDOW wnd, int fg, int bg)
+
+Changes the window's foreground and background frame colors.
+-------------------------------------------------------------------
+void WindowHighlightColor(WINDOW wnd, int fg, int bg)
+
+Changes the window's foreground and background highlight colors,
+which are used to display highlighted items such as menu selector
+bars.
+-------------------------------------------------------------------
+void MarkTextBlock(WINDOW wnd, int BegLine, int BegCol,
+                               int EndLine, int EndCol)
+
+Marks a block in the specified TEXTBOX window.
+
+-------------------------------------------------------------------
+void ClearTextBlock(WINDOW wnd)
+
+Unmarks a marked block in the specified TEXTBOX window.
+
+-------------------------------------------------------------------
+void CopyToClipboard(WINDOW wnd)
+
+Copies the marked block from the WINDOW into the Clipboard.
+
+-------------------------------------------------------------------
+void CopyTextToClipboard(char *string)
+
+Copies a null-terminated string into the Clipboard.
+
+-------------------------------------------------------------------
+void PasteFromClipboard(WINDOW wnd)
+
+Pastes the Clipboard's contents into the specified EDITBOX window at
+the current cursor location.
+
+-------------------------------------------------------------------
+void ClearClipboard(void)
+
+Clears the clipboard and frees the memory allocated for it. Called by
+D-Flat when message processing terminates. 
+
+-------------------------------------------------------------------
+WINDOW WatchIcon(void)
+
+Displays a wristwatch icon on the screen. The icon has control of the
+keyboard and mouse. You must send the CLOSE_WINDOW message to the
+WINDOW handle that WatchIcon returns to get rid of the icon.
+
+Use this icon to tell the user to please stand by during long
+processes. Call handshake frequently during these processes to
+update the date display in the status bar and to allow the watch icon
+to move when the user moves the mouse.
+
+-------------------------------------------------------------------
+Configurable Items
+
+Global Symbol File      Value Description
+------------- --------- ----- ---------------------------------------
+MAXMESSAGES   DFLAT.H    50   Maximum D-Flat messages queued
+MAXCONTROLS   DIALBOX.H  26   Maximum Controls on a dialog box
+MAXRADIOS     DIALBOX.H  20   Maximum radio buttons in a group
+MAXSAVES      SYSTEM.H   50   Maximum cursor saves
+MAXPULLDOWNS  MENU.H     15   Maximum number of pull-down menus on
+                              a menu bar (including cascading menus)
+MAXSELECTIONS MENU.H     15   Maximum number of selections on 
+                              a pull-down menu (includes separators)
+MAXCASCADES   MENU.H      3   Maximum nesting level of cascaded menus
+MAXTEXTLEN    DFLAT.H 65000   Maximum text buffer
+EDITLEN       DFLAT.H  1024   Starting length for multiline EDITBOX
+ENTRYLEN      DFLAT.H   256   Starting length for single-line EDITBOX
+GROWLENGTH    DFLAT.H    64   EDITBOX buffers grow by this much
+
+
diff --git a/rosapps/dflat32/dflat.h b/rosapps/dflat32/dflat.h
new file mode 100644 (file)
index 0000000..fd391a1
--- /dev/null
@@ -0,0 +1,482 @@
+/* ------------- dflat.h ----------- */
+#ifndef DFLAT_H
+#define DFLAT_H
+
+//#ifdef BUILD_FULL_DFLAT
+#define INCLUDE_MULTI_WINDOWS
+#define INCLUDE_LOGGING
+#define INCLUDE_SHELLDOS
+#define INCLUDE_WINDOWOPTIONS
+#define INCLUDE_PICTUREBOX
+#define INCLUDE_MINIMIZE
+#define INCLUDE_MAXIMIZE
+#define INCLUDE_RESTORE
+#define INCLUDE_EXTENDEDSELECTIONS
+//#endif
+
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <dos.h>
+#include <process.h>
+#include <conio.h>
+#include <ctype.h>
+#include <io.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <time.h>
+#include <setjmp.h>
+
+#ifndef VERSION
+#define VERSION "Beta Version 0.3"
+#endif
+
+void *DFcalloc(size_t, size_t);
+void *DFmalloc(size_t);
+void *DFrealloc(void *, size_t);
+
+
+#define MAXMESSAGES 50
+#define DELAYTICKS 1
+#define FIRSTDELAY 7
+#define DOUBLETICKS 5
+
+#define MAXTEXTLEN 65000U /* maximum text buffer            */
+#define EDITLEN     1024  /* starting length for multiliner */
+#define ENTRYLEN     256  /* starting length for one-liner  */
+#define GROWLENGTH    64  /* buffers grow by this much      */
+
+#include "system.h"
+#include "config.h"
+#include "rect.h"
+#include "menu.h"
+#include "keys.h"
+#include "commands.h"
+#include "dialbox.h"
+
+/* ------ integer type for message parameters ----- */
+typedef long PARAM;
+
+enum Condition
+{
+    ISRESTORED, ISMINIMIZED, ISMAXIMIZED, ISCLOSING
+};
+
+typedef struct window
+{
+       DFCLASS class;          /* window class                  */
+       char *title;            /* window title                  */
+       int (*wndproc)(struct window *, enum messages, PARAM, PARAM);
+
+       /* ----------------- window colors -------------------- */
+       char WindowColors[4][2];
+
+       /* ---------------- window dimensions ----------------- */
+       DFRECT rc;              /* window coordinates (0/0 to 79/24) */
+       int ht, wd;             /* window height and width       */
+       DFRECT RestoredRC;      /* restored condition rect       */
+
+       /* -------------- linked list pointers ---------------- */
+       struct window *parent;      /* parent window            */
+       struct window *firstchild;  /* first child this parent  */
+       struct window *lastchild;   /* last child this parent   */
+       struct window *nextsibling; /* next sibling             */
+       struct window *prevsibling; /* previous sibling         */
+       struct window *childfocus;      /* child that ha(s/d) focus */
+
+       int attrib;                 /* Window attributes        */
+       PCHAR_INFO videosave;       /* video save buffer        */
+       enum Condition condition;   /* Restored, Maximized,
+                                      Minimized, Closing       */
+       enum Condition oldcondition;/* previous condition       */
+       int restored_attrib;        /* attributes when restored */
+       void *extension;      /* menus, dialogs, documents, etc */
+       struct window *PrevMouse;
+       struct window *PrevKeyboard;
+       struct window *MenuBarWnd;/* menu bar                   */
+       struct window *StatusBar; /* status bar                 */
+       int isHelping;          /* > 0 when help is being displayed */
+
+       /* ----------------- text box fields ------------------ */
+       int wlines;     /* number of lines of text              */
+       int wtop;       /* text line that is on the top display */
+       unsigned char *text; /* window text                     */
+       unsigned int textlen;  /* text length                   */
+       int wleft;      /* left position in window viewport     */
+       int textwidth;  /* width of longest line in textbox     */
+       int BlkBegLine; /* beginning line of marked block       */
+       int BlkBegCol;  /* beginning column of marked block     */
+       int BlkEndLine; /* ending line of marked block          */
+       int BlkEndCol;  /* ending column of marked block        */
+       int HScrollBox; /* position of horizontal scroll box    */
+       int VScrollBox; /* position of vertical scroll box      */
+       unsigned int *TextPointers; /* -> list of line offsets  */
+
+       /* ----------------- list box fields ------------------ */
+       int selection;  /* current selection                    */
+       BOOL AddMode;   /* adding extended selections mode      */
+       int AnchorPoint;/* anchor point for extended selections */
+       int SelectCount;/* count of selected items              */
+
+       /* ----------------- edit box fields ------------------ */
+       int CurrCol;      /* Current column                     */
+       int CurrLine;     /* Current line                       */
+       int WndRow;       /* Current window row                 */
+       BOOL TextChanged; /* TRUE if text has changed           */
+       unsigned char *DeletedText; /* for undo                 */
+       unsigned DeletedLength; /* Length of deleted field      */
+       BOOL InsertMode;   /* TRUE or FALSE for text insert     */
+       BOOL WordWrapMode; /* TRUE or FALSE for word wrap       */
+       unsigned int MaxTextLength; /* maximum text length      */
+
+       /* ---------------- dialog box fields ----------------- */
+       int ReturnCode;         /* return code from a dialog box */
+       BOOL Modal;             /* True if a modeless dialog box */
+       CTLWINDOW *ct;          /* control structure             */
+       struct window *dfocus;  /* control window that has focus */
+       /* -------------- popdownmenu fields ------------------ */
+       MENU *mnu;              /* points to menu structure             */
+       MBAR *holdmenu;         /* previous active menu                 */
+       struct window *oldFocus;
+
+       /* --------------- help box fields -------------------- */
+       void *firstword; /* -> first in list of key words       */
+       void *lastword;  /* -> last in list of key words        */
+       void *thisword;  /* -> current in list of key words     */
+       /* -------------- status bar fields ------------------- */
+       BOOL TimePosted; /* True if time has been posted        */
+#ifdef INCLUDE_PICTUREBOX
+       /* ------------- picture box fields ------------------- */
+       int VectorCount;  /* number of vectors in vector list   */
+       void *VectorList; /* list of picture box vectors        */
+#endif
+} * DFWINDOW;
+
+#include "classdef.h"
+#include "video.h"
+
+void LogMessages (DFWINDOW, DFMESSAGE, PARAM, PARAM);
+void MessageLog(DFWINDOW);
+/* ------- window methods ----------- */
+#define ICONHEIGHT 3
+#define ICONWIDTH  10
+#define WindowHeight(w)      ((w)->ht)
+#define WindowWidth(w)       ((w)->wd)
+#define BorderAdj(w)         (TestAttribute(w,HASBORDER)?1:0)
+#define BottomBorderAdj(w)   (TestAttribute(w,HASSTATUSBAR)?1:BorderAdj(w))
+#define TopBorderAdj(w)      ((TestAttribute(w,HASTITLEBAR) &&   \
+                              TestAttribute(w,HASMENUBAR)) ?  \
+                              2 : (TestAttribute(w,HASTITLEBAR | \
+                              HASMENUBAR | HASBORDER) ? 1 : 0))
+#define ClientWidth(w)       (WindowWidth(w)-BorderAdj(w)*2)
+#define ClientHeight(w)      (WindowHeight(w)-TopBorderAdj(w)-\
+                              BottomBorderAdj(w))
+#define WindowRect(w)        ((w)->rc)
+#define GetTop(w)            (RectTop(WindowRect(w)))
+#define GetBottom(w)         (RectBottom(WindowRect(w)))
+#define GetLeft(w)           (RectLeft(WindowRect(w)))
+#define GetRight(w)          (RectRight(WindowRect(w)))
+#define GetClientTop(w)      (GetTop(w)+TopBorderAdj(w))
+#define GetClientBottom(w)   (GetBottom(w)-BottomBorderAdj(w))
+#define GetClientLeft(w)     (GetLeft(w)+BorderAdj(w))
+#define GetClientRight(w)    (GetRight(w)-BorderAdj(w))
+#define GetTitle(w)          ((w)->title)
+#define GetParent(w)         ((w)->parent)
+#define FirstWindow(w)       ((w)->firstchild)
+#define LastWindow(w)        ((w)->lastchild)
+#define NextWindow(w)        ((w)->nextsibling)
+#define PrevWindow(w)        ((w)->prevsibling)
+#define GetClass(w)          ((w)->class)
+#define GetAttribute(w)      ((w)->attrib)
+#define AddAttribute(w,a)    (GetAttribute(w) |= a)
+#define ClearAttribute(w,a)  (GetAttribute(w) &= ~(a))
+#define TestAttribute(w,a)   (GetAttribute(w) & (a))
+#define isHidden(w)          (!(GetAttribute(w) & VISIBLE))
+#define SetVisible(w)        (GetAttribute(w) |= VISIBLE)
+#define ClearVisible(w)      (GetAttribute(w) &= ~VISIBLE)
+#define gotoxy(w,x,y) cursor(w->rc.lf+(x)+1,w->rc.tp+(y)+1)
+BOOL isVisible(DFWINDOW);
+DFWINDOW DfCreateWindow(DFCLASS,char *,int,int,int,int,void*,DFWINDOW,
+       int (*)(struct window *,enum messages,PARAM,PARAM),int);
+void AddTitle(DFWINDOW, char *);
+void InsertTitle(DFWINDOW, char *);
+void DisplayTitle(DFWINDOW, DFRECT *);
+void RepaintBorder(DFWINDOW, DFRECT *);
+void PaintShadow(DFWINDOW);
+void ClearWindow(DFWINDOW, DFRECT *, int);
+void writeline(DFWINDOW, char *, int, int, BOOL);
+void InitWindowColors(DFWINDOW);
+
+void SetNextFocus(void);
+void SetPrevFocus(void);
+void RemoveWindow(DFWINDOW);
+void AppendWindow(DFWINDOW);
+void ReFocus(DFWINDOW);
+void SkipApplicationControls(void);
+
+BOOL CharInView(DFWINDOW, int, int);
+void CreatePath(char *, char *, int, int);
+#define SwapVideoBuffer(wnd, ish, fh) swapvideo(wnd, wnd->videosave, ish, fh)
+int LineLength(char *);
+DFRECT AdjustRectangle(DFWINDOW, DFRECT);
+BOOL isDerivedFrom(DFWINDOW, DFCLASS);
+DFWINDOW GetAncestor(DFWINDOW);
+void PutWindowChar(DFWINDOW,char,int,int);
+void PutWindowLine(DFWINDOW, void *,int,int);
+#define BaseWndProc(class,wnd,msg,p1,p2)    \
+    (*classdefs[(classdefs[class].base)].wndproc)(wnd,msg,p1,p2)
+#define DefaultWndProc(wnd,msg,p1,p2)         \
+       (classdefs[wnd->class].wndproc == NULL) ? \
+       BaseWndProc(wnd->class,wnd,msg,p1,p2) :   \
+    (*classdefs[wnd->class].wndproc)(wnd,msg,p1,p2)
+struct LinkedList    {
+    DFWINDOW FirstWindow;
+    DFWINDOW LastWindow;
+};
+extern DFWINDOW ApplicationWindow;
+extern DFWINDOW inFocus;
+extern DFWINDOW CaptureMouse;
+extern DFWINDOW CaptureKeyboard;
+extern int foreground, background;
+extern BOOL WindowMoving;
+extern BOOL WindowSizing;
+extern BOOL VSliding;
+extern BOOL HSliding;
+extern char DFlatApplication[];
+extern char *Clipboard;
+extern unsigned ClipboardLength;
+extern BOOL ClipString;
+/* --------- space between menubar labels --------- */
+#define MSPACE 2
+/* --------------- border characters ------------- */
+#define FOCUS_NW      (unsigned char) '\xc9'
+#define FOCUS_NE      (unsigned char) '\xbb'
+#define FOCUS_SE      (unsigned char) '\xbc'
+#define FOCUS_SW      (unsigned char) '\xc8'
+#define FOCUS_SIDE    (unsigned char) '\xba'
+#define FOCUS_LINE    (unsigned char) '\xcd'
+#define NW            (unsigned char) '\xda'
+#define NE            (unsigned char) '\xbf'
+#define SE            (unsigned char) '\xd9'
+#define SW            (unsigned char) '\xc0'
+#define SIDE          (unsigned char) '\xb3'
+#define LINE          (unsigned char) '\xc4'
+#define LEDGE         (unsigned char) '\xc3'
+#define REDGE         (unsigned char) '\xb4'
+/* ------------- scroll bar characters ------------ */
+#define UPSCROLLBOX    (unsigned char) '\x1e'
+#define DOWNSCROLLBOX  (unsigned char) '\x1f'
+#define LEFTSCROLLBOX  (unsigned char) '\x11'
+#define RIGHTSCROLLBOX (unsigned char) '\x10'
+#define SCROLLBARCHAR  (unsigned char) 176 
+#define SCROLLBOXCHAR  (unsigned char) 178
+/* ------------------ menu characters --------------------- */
+#define CHECKMARK      (unsigned char) (SCREENHEIGHT==25?251:4)
+#define CASCADEPOINTER (unsigned char) '\x10'
+/* ----------------- title bar characters ----------------- */
+#define CONTROLBOXCHAR (unsigned char) '\xf0'
+#define MAXPOINTER     24      /* maximize token            */
+#define MINPOINTER     25      /* minimize token            */
+#define RESTOREPOINTER 18      /* restore token             */
+/* --------------- text control characters ---------------- */
+#define APPLCHAR     (unsigned char) 176 /* fills application window */
+#define SHORTCUTCHAR '~'    /* prefix: shortcut key display */
+#define CHANGECOLOR  (unsigned char) 174 /* prefix to change colors  */
+#define RESETCOLOR   (unsigned char) 175 /* reset colors to default  */
+#define LISTSELECTOR   4    /* selected list box entry      */
+/* --------- message prototypes ----------- */
+BOOL init_messages(void);
+void DfPostMessage (DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int DfSendMessage (DFWINDOW, DFMESSAGE, PARAM, PARAM);
+BOOL DfDispatchMessage (void);
+void handshake(void);
+
+/* ---- standard window message processing prototypes ----- */
+int ApplicationProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int NormalProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int TextBoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int ListBoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int EditBoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int PictureProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int MenuBarProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int PopDownProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int ButtonProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int ComboProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int TextProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int RadioButtonProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int CheckBoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int SpinButtonProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int BoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int DialogProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int SystemMenuProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int HelpBoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int MessageBoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int CancelBoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int ErrorBoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int YesNoBoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int StatusBarProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+int WatchIconProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+/* ------------- normal box prototypes ------------- */
+void SetStandardColor(DFWINDOW);
+void SetReverseColor(DFWINDOW);
+BOOL isAncestor(DFWINDOW, DFWINDOW);
+#define HitControlBox(wnd, p1, p2)     \
+     (TestAttribute(wnd, CONTROLBOX) && \
+     p1 == 2 && p2 == 0)
+#define WndForeground(wnd)             \
+       (wnd->WindowColors [STD_COLOR] [FG])
+#define WndBackground(wnd)             \
+       (wnd->WindowColors [STD_COLOR] [BG])
+#define FrameForeground(wnd)   \
+       (wnd->WindowColors [FRAME_COLOR] [FG])
+#define FrameBackground(wnd)   \
+       (wnd->WindowColors [FRAME_COLOR] [BG])
+#define SelectForeground(wnd)  \
+       (wnd->WindowColors [SELECT_COLOR] [FG])
+#define SelectBackground(wnd)  \
+       (wnd->WindowColors [SELECT_COLOR] [BG])
+#define HighlightForeground(wnd)       \
+       (wnd->WindowColors [HILITE_COLOR] [FG])
+#define HighlightBackground(wnd)       \
+       (wnd->WindowColors [HILITE_COLOR] [BG])
+#define WindowClientColor(wnd, fg, bg)         \
+               WndForeground(wnd) = fg, WndBackground(wnd) = bg
+#define WindowReverseColor(wnd, fg, bg) \
+               SelectForeground(wnd) = fg, SelectBackground(wnd) = bg
+#define WindowFrameColor(wnd, fg, bg) \
+               FrameForeground(wnd) = fg, FrameBackground(wnd) = bg
+#define WindowHighlightColor(wnd, fg, bg) \
+               HighlightForeground(wnd) = fg, HighlightBackground(wnd) = bg
+/* -------- text box prototypes ---------- */
+#define TextLine(wnd, sel) \
+      (wnd->text + *((wnd->TextPointers) + sel))
+void WriteTextLine(DFWINDOW, DFRECT *, int, BOOL);
+#define TextBlockMarked(wnd) (  wnd->BlkBegLine ||    \
+                                wnd->BlkEndLine ||    \
+                                wnd->BlkBegCol  ||    \
+                                wnd->BlkEndCol)
+void MarkTextBlock(DFWINDOW, int, int, int, int);
+#define ClearTextBlock(wnd) wnd->BlkBegLine = wnd->BlkEndLine =  \
+                        wnd->BlkBegCol  = wnd->BlkEndCol = 0;
+#define GetText(w)        ((w)->text)
+#define GetTextLines(w)   ((w)->wlines)
+void ClearTextPointers(DFWINDOW);
+void BuildTextPointers(DFWINDOW);
+int TextLineNumber(DFWINDOW, char *);
+/* ------------ Clipboard prototypes ------------- */
+void CopyTextToClipboard(char *);
+void CopyToClipboard(DFWINDOW);
+#define PasteFromClipboard(wnd) PasteText(wnd,Clipboard,ClipboardLength)
+BOOL PasteText(DFWINDOW, char *, unsigned);
+void ClearClipboard(void);
+/* --------- menu prototypes ---------- */
+int CopyCommand(unsigned char *, unsigned char *, int, int);
+void PrepFileMenu(void *, struct Menu *);
+void PrepEditMenu(void *, struct Menu *);
+void PrepSearchMenu(void *, struct Menu *);
+void PrepWindowMenu(void *, struct Menu *);
+void BuildSystemMenu(DFWINDOW);
+BOOL isActive(MBAR *, int);
+char *GetCommandText(MBAR *, int);
+BOOL isCascadedCommand(MBAR *,int);
+void ActivateCommand(MBAR *,int);
+void DeactivateCommand(MBAR *,int);
+BOOL GetCommandToggle(MBAR *,int);
+void SetCommandToggle(MBAR *,int);
+void ClearCommandToggle(MBAR *,int);
+void InvertCommandToggle(MBAR *,int);
+int BarSelection(int);
+/* ------------- list box prototypes -------------- */
+BOOL ItemSelected(DFWINDOW, int);
+/* ------------- edit box prototypes ----------- */
+#define CurrChar (TextLine(wnd, wnd->CurrLine)+wnd->CurrCol)
+#define WndCol   (wnd->CurrCol-wnd->wleft)
+#define isMultiLine(wnd) TestAttribute(wnd, MULTILINE)
+void DfSearchText(DFWINDOW);
+void DfReplaceText(DFWINDOW);
+void DfSearchNext(DFWINDOW);
+/* --------- message box prototypes -------- */
+DFWINDOW SliderBox(int, char *, char *);
+BOOL InputBox(DFWINDOW, char *, char *, char *, int);
+BOOL GenericMessage(DFWINDOW, char *, char *, int,
+       int (*)(struct window *, enum messages, PARAM, PARAM),
+       char *, char *, int, int, int);
+#define DfTestErrorMessage(msg)        \
+       GenericMessage(NULL, "Error", msg, 2, ErrorBoxProc,       \
+               Ok, Cancel, ID_OK, ID_CANCEL, TRUE)
+#define DfErrorMessage(msg) \
+       GenericMessage(NULL, "Error", msg, 1, ErrorBoxProc,   \
+               Ok, NULL, ID_OK, 0, TRUE)
+#define DfMessageBox(ttl, msg) \
+       GenericMessage(NULL, ttl, msg, 1, MessageBoxProc, \
+               Ok, NULL, ID_OK, 0, TRUE)
+#define DfYesNoBox(msg)        \
+       GenericMessage(NULL, NULL, msg, 2, YesNoBoxProc,   \
+               Yes, No, ID_OK, ID_CANCEL, TRUE)
+#define DfCancelBox(wnd, msg) \
+       GenericMessage(wnd, "Wait...", msg, 1, CancelBoxProc, \
+               Cancel, NULL, ID_CANCEL, 0, FALSE)
+void CloseCancelBox(void);
+DFWINDOW MomentaryMessage(char *);
+int MsgHeight(char *);
+int MsgWidth(char *);
+
+/* ------------- dialog box prototypes -------------- */
+BOOL DfDialogBox(DFWINDOW, DBOX *, BOOL,
+       int (*)(struct window *, enum messages, PARAM, PARAM));
+void ClearDialogBoxes(void);
+BOOL OpenFileDialogBox(char *, char *);
+BOOL SaveAsDialogBox(char *);
+void GetDlgListText(DFWINDOW, char *, enum commands);
+BOOL DfDlgDirList(DFWINDOW, char *, enum commands,
+                            enum commands, unsigned);
+BOOL RadioButtonSetting(DBOX *, enum commands);
+void PushRadioButton(DBOX *, enum commands);
+void PutItemText(DFWINDOW, enum commands, char *);
+void PutComboListText(DFWINDOW, enum commands, char *);
+void GetItemText(DFWINDOW, enum commands, char *, int);
+char *GetDlgTextString(DBOX *, enum commands, DFCLASS);
+void SetDlgTextString(DBOX *, enum commands, char *, DFCLASS);
+BOOL CheckBoxSetting(DBOX *, enum commands);
+CTLWINDOW *FindCommand(DBOX *, enum commands, int);
+DFWINDOW ControlWindow(DBOX *, enum commands);
+void SetScrollBars(DFWINDOW);
+void SetRadioButton(DBOX *, CTLWINDOW *);
+void ControlSetting(DBOX *, enum commands, int, int);
+void SetFocusCursor(DFWINDOW);
+
+#define GetControl(wnd)             (wnd->ct)
+#define GetDlgText(db, cmd)         GetDlgTextString(db, cmd, TEXT)
+#define GetDlgTextBox(db, cmd)      GetDlgTextString(db, cmd, TEXTBOX)
+#define GetEditBoxText(db, cmd)     GetDlgTextString(db, cmd, EDITBOX)
+#define GetComboBoxText(db, cmd)    GetDlgTextString(db, cmd, COMBOBOX)
+#define SetDlgText(db, cmd, s)      SetDlgTextString(db, cmd, s, TEXT)
+#define SetDlgTextBox(db, cmd, s)   SetDlgTextString(db, cmd, s, TEXTBOX)
+#define SetEditBoxText(db, cmd, s)  SetDlgTextString(db, cmd, s, EDITBOX)
+#define SetComboBoxText(db, cmd, s) SetDlgTextString(db, cmd, s, COMBOBOX)
+#define SetDlgTitle(db, ttl)        ((db)->dwnd.title = ttl)
+#define SetCheckBox(db, cmd)        ControlSetting(db, cmd, CHECKBOX, ON)
+#define ClearCheckBox(db, cmd)      ControlSetting(db, cmd, CHECKBOX, OFF)
+#define EnableButton(db, cmd)       ControlSetting(db, cmd, BUTTON, ON)
+#define DisableButton(db, cmd)      ControlSetting(db, cmd, BUTTON, OFF)
+
+/* ---- types of vectors that can be in a picture box ------- */
+enum VectTypes {VECTOR, SOLIDBAR, HEAVYBAR, CROSSBAR, LIGHTBAR};
+
+/* ------------- picture box prototypes ------------- */
+void DrawVector(DFWINDOW, int, int, int, int);
+void DrawBox(DFWINDOW, int, int, int, int);
+void DrawBar(DFWINDOW, enum VectTypes, int, int, int, int);
+DFWINDOW WatchIcon(void);
+
+/* ------------- help box prototypes ------------- */
+void LoadHelpFile(void);
+void UnLoadHelpFile(void);
+BOOL DisplayHelp(DFWINDOW, char *);
+
+extern char *ClassNames[];
+
+void BuildFileName(char *, char *);
+
+#endif
diff --git a/rosapps/dflat32/dflatmsg.h b/rosapps/dflat32/dflatmsg.h
new file mode 100644 (file)
index 0000000..cfca23e
--- /dev/null
@@ -0,0 +1,100 @@
+/* ----------- dflatmsg.h ------------ */
+
+/*
+ * message foundation file
+ * make message changes here
+ * other source files will adapt
+ */
+
+/* -------------- process communication messages ----------- */
+DFlatMsg(DFM_START)              /* start message processing     */
+DFlatMsg(DFM_STOP)               /* stop message processing      */
+DFlatMsg(DFM_COMMAND)            /* send a command to a window   */
+/* -------------- window management messages --------------- */
+DFlatMsg(CREATE_WINDOW)      /* create a window              */
+DFlatMsg(SHOW_WINDOW)        /* show a window                */
+DFlatMsg(DFM_HIDE_WINDOW)        /* hide a window                */
+DFlatMsg(CLOSE_WINDOW)       /* delete a window              */
+DFlatMsg(SETFOCUS)           /* set and clear the focus      */
+DFlatMsg(PAINT)              /* paint the window's data space*/
+DFlatMsg(BORDER)             /* paint the window's border    */
+DFlatMsg(TITLE)              /* display the window's title   */
+DFlatMsg(MOVE)               /* move the window              */
+DFlatMsg(DFM_SIZE)               /* change the window's size     */
+#ifdef INCLUDE_MAXIMIZE
+DFlatMsg(MAXIMIZE)           /* maximize the window          */
+#endif
+#ifdef INCLUDE_MINIMIZE
+DFlatMsg(MINIMIZE)           /* minimize the window          */
+#endif
+DFlatMsg(RESTORE)            /* restore the window           */
+DFlatMsg(INSIDE_WINDOW)      /* test x/y inside a window     */
+/* ---------------- clock messages ------------------------- */
+DFlatMsg(CLOCKTICK)          /* the clock ticked             */
+DFlatMsg(CAPTURE_CLOCK)      /* capture clock into a window  */
+DFlatMsg(RELEASE_CLOCK)      /* release clock to the system  */
+/* -------------- keyboard and screen messages ------------- */
+DFlatMsg(KEYBOARD)           /* key was pressed              */
+DFlatMsg(CAPTURE_KEYBOARD) /* capture keyboard into a window */
+DFlatMsg(RELEASE_KEYBOARD)   /* release keyboard to system   */
+DFlatMsg(KEYBOARD_CURSOR)    /* position the keyboard cursor */
+DFlatMsg(CURRENT_KEYBOARD_CURSOR) /*read the cursor position */
+DFlatMsg(HIDE_CURSOR)        /* hide the keyboard cursor     */
+DFlatMsg(SHOW_CURSOR)        /* display the keyboard cursor  */
+DFlatMsg(SAVE_CURSOR)      /* save the cursor's configuration*/
+DFlatMsg(RESTORE_CURSOR)     /* restore the saved cursor     */
+DFlatMsg(SHIFT_CHANGED)      /* the shift status changed     */
+DFlatMsg(WAITKEYBOARD)     /* waits for a key to be released */
+
+/* ---------------- mouse messages ------------------------- */
+DFlatMsg(MOUSE_TRAVEL)       /* set the mouse travel         */
+DFlatMsg(RIGHT_BUTTON)       /* right button pressed         */
+DFlatMsg(LEFT_BUTTON)        /* left button pressed          */
+DFlatMsg(DFM_DOUBLE_CLICK)       /* left button double-clicked   */
+DFlatMsg(DFM_MOUSE_MOVED)        /* mouse changed position       */
+DFlatMsg(DFM_BUTTON_RELEASED)    /* mouse button released        */
+DFlatMsg(WAITMOUSE)          /* wait until button released   */
+DFlatMsg(TESTMOUSE)          /* test any mouse button pressed*/
+DFlatMsg(CAPTURE_MOUSE)      /* capture mouse into a window  */
+DFlatMsg(RELEASE_MOUSE)      /* release the mouse to system  */
+
+/* ---------------- text box messages ---------------------- */
+DFlatMsg(ADDTEXT)            /* append text to the text box  */
+DFlatMsg(INSERTTEXT)            /* insert line of text          */
+DFlatMsg(DELETETEXT)         /* delete line of text          */
+DFlatMsg(CLEARTEXT)          /* clear the edit box           */
+DFlatMsg(SETTEXT)            /* copy text to text buffer     */
+DFlatMsg(SCROLL)             /* vertical line scroll         */
+DFlatMsg(HORIZSCROLL)        /* horizontal column scroll     */
+DFlatMsg(SCROLLPAGE)         /* vertical page scroll         */
+DFlatMsg(HORIZPAGE)          /* horizontal page scroll       */
+DFlatMsg(SCROLLDOC)          /* scroll to beginning/end      */
+/* ---------------- edit box messages ---------------------- */
+DFlatMsg(GETTEXT)            /* get text from an edit box    */
+DFlatMsg(SETTEXTLENGTH)                 /* set maximum text length      */
+/* ---------------- menubar messages ----------------------- */
+DFlatMsg(BUILDMENU)          /* build the menu display       */
+DFlatMsg(MB_SELECTION)       /* menubar selection            */
+/* ---------------- popdown messages ----------------------- */
+DFlatMsg(BUILD_SELECTIONS)   /* build the menu display       */
+DFlatMsg(CLOSE_POPDOWN)    /* tell parent popdown is closing */
+/* ---------------- list box messages ---------------------- */
+DFlatMsg(LB_SELECTION)       /* sent to parent on selection  */
+DFlatMsg(LB_CHOOSE)          /* sent when user chooses       */
+DFlatMsg(LB_CURRENTSELECTION)/* return the current selection */
+DFlatMsg(DFM_LB_GETTEXT)         /* return the text of selection */
+DFlatMsg(LB_SETSELECTION)    /* sets the listbox selection   */
+/* ---------------- dialog box messages -------------------- */
+DFlatMsg(INITIATE_DIALOG)    /* begin a dialog               */
+DFlatMsg(ENTERFOCUS)         /* tell DB control got focus    */
+DFlatMsg(LEAVEFOCUS)         /* tell DB control lost focus   */
+DFlatMsg(ENDDIALOG)          /* end a dialog                 */
+/* ---------------- help box messages ---------------------- */
+DFlatMsg(DISPLAY_HELP)
+/* --------------- application window messages ------------- */
+DFlatMsg(ADDSTATUS)
+/* --------------- picture box messages -------------------- */
+DFlatMsg(DRAWVECTOR)
+DFlatMsg(DRAWBOX)
+DFlatMsg(DRAWBAR)
+
diff --git a/rosapps/dflat32/dialbox.c b/rosapps/dflat32/dialbox.c
new file mode 100644 (file)
index 0000000..9e7fd3e
--- /dev/null
@@ -0,0 +1,792 @@
+/* ----------------- dialbox.c -------------- */
+
+#include "dflat.h"
+
+static int inFocusCommand(DBOX *);
+static void dbShortcutKeys(DBOX *, int);
+static int ControlProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+static void FirstFocus(DBOX *db);
+static void NextFocus(DBOX *db);
+static void PrevFocus(DBOX *db);
+static CTLWINDOW *AssociatedControl(DBOX *, enum commands);
+
+static BOOL SysMenuOpen;
+
+static DBOX **dbs = NULL;
+static int dbct = 0;
+
+/* --- clear all heap allocations to control text fields --- */
+void ClearDialogBoxes(void)
+{
+       int i;
+
+       for (i = 0; i < dbct; i++)
+       {
+               CTLWINDOW *ct = (*(dbs+i))->ctl;
+
+               while (ct->class)
+               {
+                       if ((ct->class == EDITBOX ||
+                            ct->class == COMBOBOX) &&
+                           ct->itext != NULL)
+                       {
+                               free(ct->itext);
+                       }
+                       ct++;
+               }
+       }
+
+       if (dbs != NULL)
+       {
+               free(dbs);
+               dbs = NULL;
+       }
+       dbct = 0;
+}
+
+
+/* -------- CREATE_WINDOW Message --------- */
+static int CreateWindowMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    DBOX *db = wnd->extension;
+    CTLWINDOW *ct = db->ctl;
+    DFWINDOW cwnd;
+    int rtn, i;
+    /* ---- build a table of processed dialog boxes ---- */
+    for (i = 0; i < dbct; i++)
+        if (db == dbs[i])
+            break;
+    if (i == dbct)    {
+        dbs = DFrealloc(dbs, sizeof(DBOX *) * (dbct+1));
+        *(dbs + dbct++) = db;
+    }
+    rtn = BaseWndProc(DIALOG, wnd, CREATE_WINDOW, p1, p2);
+    ct = db->ctl;
+    while (ct->class)    {
+        int attrib = 0;
+        if (TestAttribute(wnd, NOCLIP))
+            attrib |= NOCLIP;
+        if (wnd->Modal)
+            attrib |= SAVESELF;
+        ct->setting = ct->isetting;
+        if (ct->class == EDITBOX && ct->dwnd.h > 1)
+            attrib |= (MULTILINE | HASBORDER);
+        else if ((ct->class == LISTBOX || ct->class == TEXTBOX) &&
+                               ct->dwnd.h > 2)
+            attrib |= HASBORDER;
+        cwnd = DfCreateWindow(ct->class,
+                        ct->dwnd.title,
+                        ct->dwnd.x+GetClientLeft(wnd),
+                        ct->dwnd.y+GetClientTop(wnd),
+                        ct->dwnd.h,
+                        ct->dwnd.w,
+                        ct,
+                        wnd,
+                        ControlProc,
+                        attrib);
+        if ((ct->class == EDITBOX ||
+                ct->class == COMBOBOX) &&
+                    ct->itext != NULL)
+            DfSendMessage(cwnd, SETTEXT, (PARAM) ct->itext, 0);
+        ct++;
+    }
+    return rtn;
+}
+
+/* -------- LEFT_BUTTON Message --------- */
+static BOOL LeftButtonMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    DBOX *db = wnd->extension;
+    CTLWINDOW *ct = db->ctl;
+    if (WindowSizing || WindowMoving)
+        return TRUE;
+    if (HitControlBox(wnd, p1-GetLeft(wnd), p2-GetTop(wnd))) {
+        DfPostMessage(wnd, KEYBOARD, ' ', ALTKEY);
+        return TRUE;
+    }
+    while (ct->class)    {
+        DFWINDOW cwnd = ct->wnd;
+        if (ct->class == COMBOBOX)    {
+            if (p2 == GetTop(cwnd))    {
+                if (p1 == GetRight(cwnd)+1)    {
+                    DfSendMessage(cwnd, LEFT_BUTTON, p1, p2);
+                    return TRUE;
+                }
+            }
+            if (GetClass(inFocus) == LISTBOX)
+                DfSendMessage(wnd, SETFOCUS, TRUE, 0);
+        }
+        else if (ct->class == SPINBUTTON)    {
+            if (p2 == GetTop(cwnd))    {
+                if (p1 == GetRight(cwnd)+1 ||
+                        p1 == GetRight(cwnd)+2)    {
+                    DfSendMessage(cwnd, LEFT_BUTTON, p1, p2);
+                    return TRUE;
+                }
+            }
+        }
+        ct++;
+    }
+    return FALSE;
+}
+
+/* -------- KEYBOARD Message --------- */
+static BOOL KeyboardMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    DBOX *db = wnd->extension;
+    CTLWINDOW *ct;
+
+    if (WindowMoving || WindowSizing)
+        return FALSE;
+    switch ((int)p1)    {
+        case F1:
+            ct = GetControl(inFocus);
+            if (ct != NULL)
+                if (DisplayHelp(wnd, ct->help))
+                    return TRUE;
+            break;
+        case SHIFT_HT:
+        case BS:
+        case UP:
+            PrevFocus(db);
+            break;
+        case ALT_F6:
+        case '\t':
+        case FWD:
+        case DN:
+            NextFocus(db);
+            break;
+        case ' ':
+            if (((int)p2 & ALTKEY) &&
+                    TestAttribute(wnd, CONTROLBOX))    {
+                SysMenuOpen = TRUE;
+                BuildSystemMenu(wnd);
+            }
+            break;
+        case CTRL_F4:
+        case ESC:
+            DfSendMessage(wnd, DFM_COMMAND, ID_CANCEL, 0);
+            break;
+        default:
+            /* ------ search all the shortcut keys ----- */
+            dbShortcutKeys(db, (int) p1);
+            break;
+    }
+    return wnd->Modal;
+}
+
+/* -------- COMMAND Message --------- */
+static BOOL CommandMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    DBOX *db = wnd->extension;
+    switch ((int) p1)    {
+        case ID_OK:
+        case ID_CANCEL:
+            if ((int)p2 != 0)
+                return TRUE;
+            wnd->ReturnCode = (int) p1;
+            if (wnd->Modal)
+                DfPostMessage(wnd, ENDDIALOG, 0, 0);
+            else
+                DfSendMessage(wnd, CLOSE_WINDOW, TRUE, 0);
+            return TRUE;
+        case ID_HELP:
+            if ((int)p2 != 0)
+                return TRUE;
+            return DisplayHelp(wnd, db->HelpName);
+        default:
+            break;
+    }
+    return FALSE;
+}
+
+/* ----- window-processing module, DIALOG window class ----- */
+int DialogProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
+{
+       int rtn;
+    DBOX *db = wnd->extension;
+
+    switch (msg)    {
+        case CREATE_WINDOW:
+            return CreateWindowMsg(wnd, p1, p2);
+        case SHIFT_CHANGED:
+            if (wnd->Modal)
+                return TRUE;
+            break;
+        case LEFT_BUTTON:
+            if (LeftButtonMsg(wnd, p1, p2))
+                return TRUE;
+            break;
+        case KEYBOARD:
+            if (KeyboardMsg(wnd, p1, p2))
+                return TRUE;
+            break;
+        case CLOSE_POPDOWN:
+            SysMenuOpen = FALSE;
+            break;
+        case LB_SELECTION:
+        case LB_CHOOSE:
+            if (SysMenuOpen)
+                return TRUE;
+            DfSendMessage(wnd, DFM_COMMAND, inFocusCommand(db), msg);
+            break;
+        case DFM_COMMAND:
+            if (CommandMsg(wnd, p1, p2))
+                return TRUE;
+            break;
+        case PAINT:
+            p2 = TRUE;
+            break;
+               case MOVE:
+               case DFM_SIZE:
+                       rtn = BaseWndProc(DIALOG, wnd, msg, p1, p2);
+                       if (wnd->dfocus != NULL)
+                               DfSendMessage(wnd->dfocus, SETFOCUS, TRUE, 0);
+                       return rtn;
+
+               case CLOSE_WINDOW:
+                       if (!p1)
+                       {
+                DfSendMessage(wnd, DFM_COMMAND, ID_CANCEL, 0);
+                return TRUE;
+            }
+            break;
+
+        default:
+            break;
+    }
+    return BaseWndProc(DIALOG, wnd, msg, p1, p2);
+}
+
+/* ------- create and execute a dialog box ---------- */
+BOOL DfDialogBox(DFWINDOW wnd, DBOX *db, BOOL Modal,
+  int (*wndproc)(struct window *, enum messages, PARAM, PARAM))
+{
+    BOOL rtn;
+    int x = db->dwnd.x, y = db->dwnd.y;
+    DFWINDOW DialogWnd;
+
+    if (!Modal && wnd != NULL)
+    {
+        x += GetLeft(wnd);
+        y += GetTop(wnd);
+    }
+    DialogWnd = DfCreateWindow(DIALOG,
+                        db->dwnd.title,
+                        x, y,
+                        db->dwnd.h,
+                        db->dwnd.w,
+                        db,
+                        wnd,
+                        wndproc,
+                        Modal ? SAVESELF : 0);
+    DialogWnd->Modal = Modal;
+    FirstFocus(db);
+    DfPostMessage(DialogWnd, INITIATE_DIALOG, 0, 0);
+    if (Modal)
+    {
+        DfSendMessage(DialogWnd, CAPTURE_MOUSE, 0, 0);
+        DfSendMessage(DialogWnd, CAPTURE_KEYBOARD, 0, 0);
+        while (DfDispatchMessage ())
+            ;
+        rtn = DialogWnd->ReturnCode == ID_OK;
+        DfSendMessage(DialogWnd, RELEASE_MOUSE, 0, 0);
+        DfSendMessage(DialogWnd, RELEASE_KEYBOARD, 0, 0);
+        DfSendMessage(DialogWnd, CLOSE_WINDOW, TRUE, 0);
+        return rtn;
+    }
+    return FALSE;
+}
+
+/* ----- return command code of in-focus control window ---- */
+static int inFocusCommand(DBOX *db)
+{
+    CTLWINDOW *ct = db->ctl;
+    while (ct->class)    {
+        if (ct->wnd == inFocus)
+            return ct->command;
+        ct++;
+    }
+    return -1;
+}
+
+/* -------- find a specified control structure ------- */
+CTLWINDOW *FindCommand(DBOX *db, enum commands cmd, int class)
+{
+    CTLWINDOW *ct = db->ctl;
+    while (ct->class)
+    {
+        if (ct->class == class)
+            if (cmd == ct->command)
+                return ct;
+        ct++;
+    }
+    return NULL;
+}
+
+/* ---- return the window handle of a specified command ---- */
+DFWINDOW ControlWindow(DBOX *db, enum commands cmd)
+{
+    CTLWINDOW *ct = db->ctl;
+    while (ct->class)
+    {
+        if (ct->class != TEXT && cmd == ct->command)
+            return ct->wnd;
+        ct++;
+    }
+    return NULL;
+}
+
+/* --- return a pointer to the control structure that matches a window --- */
+CTLWINDOW *WindowControl(DBOX *db, DFWINDOW wnd)
+{
+    CTLWINDOW *ct = db->ctl;
+    while (ct->class)
+    {
+        if (ct->wnd == wnd)
+            return ct;
+        ct++;
+    }
+    return NULL;
+}
+
+/* ---- set a control ON or OFF ----- */
+void ControlSetting(DBOX *db, enum commands cmd,
+                                int class, int setting)
+{
+    CTLWINDOW *ct = FindCommand(db, cmd, class);
+    if (ct != NULL)    {
+        ct->isetting = setting;
+               if (ct->wnd != NULL)
+                       ct->setting = setting;
+       }
+}
+
+/* ---- return pointer to the text of a control window ---- */
+char *GetDlgTextString(DBOX *db,enum commands cmd,DFCLASS class)
+{
+    CTLWINDOW *ct = FindCommand(db, cmd, class);
+    if (ct != NULL)
+        return ct->itext;
+    else
+        return NULL;
+}
+
+/* ------- set the text of a control specification ------ */
+void SetDlgTextString(DBOX *db, enum commands cmd,
+                                    char *text, DFCLASS class)
+{
+    CTLWINDOW *ct = FindCommand(db, cmd, class);
+    if (ct != NULL)    {
+        ct->itext = DFrealloc(ct->itext, strlen(text)+1);
+        strcpy(ct->itext, text);
+    }
+}
+
+/* ------- set the text of a control window ------ */
+void PutItemText(DFWINDOW wnd, enum commands cmd, char *text)
+{
+    CTLWINDOW *ct = FindCommand(wnd->extension, cmd, EDITBOX);
+
+    if (ct == NULL)
+        ct = FindCommand(wnd->extension, cmd, TEXTBOX);
+    if (ct == NULL)
+        ct = FindCommand(wnd->extension, cmd, COMBOBOX);
+    if (ct == NULL)
+        ct = FindCommand(wnd->extension, cmd, LISTBOX);
+    if (ct == NULL)
+        ct = FindCommand(wnd->extension, cmd, SPINBUTTON);
+    if (ct == NULL)
+        ct = FindCommand(wnd->extension, cmd, TEXT);
+    if (ct != NULL)        {
+        DFWINDOW cwnd = (DFWINDOW) (ct->wnd);
+        switch (ct->class)    {
+            case COMBOBOX:
+            case EDITBOX:
+                DfSendMessage(cwnd, CLEARTEXT, 0, 0);
+                DfSendMessage(cwnd, ADDTEXT, (PARAM) text, 0);
+                if (!isMultiLine(cwnd))
+                    DfSendMessage(cwnd, PAINT, 0, 0);
+                break;
+            case LISTBOX:
+            case TEXTBOX:
+            case SPINBUTTON:
+                DfSendMessage(cwnd, ADDTEXT, (PARAM) text, 0);
+                break;
+            case TEXT:    {
+                DfSendMessage(cwnd, CLEARTEXT, 0, 0);
+                DfSendMessage(cwnd, ADDTEXT, (PARAM) text, 0);
+                DfSendMessage(cwnd, PAINT, 0, 0);
+                break;
+            }
+            default:
+                break;
+        }
+    }
+}
+
+/* ------- get the text of a control window ------ */
+void GetItemText(DFWINDOW wnd, enum commands cmd,
+                                char *text, int len)
+{
+    CTLWINDOW *ct = FindCommand(wnd->extension, cmd, EDITBOX);
+    unsigned char *cp;
+
+    if (ct == NULL)
+        ct = FindCommand(wnd->extension, cmd, COMBOBOX);
+    if (ct == NULL)
+        ct = FindCommand(wnd->extension, cmd, TEXTBOX);
+    if (ct == NULL)
+        ct = FindCommand(wnd->extension, cmd, TEXT);
+    if (ct != NULL)    {
+        DFWINDOW cwnd = (DFWINDOW) (ct->wnd);
+        if (cwnd != NULL)    {
+            switch (ct->class)    {
+                case TEXT:
+                    if (GetText(cwnd) != NULL)    {
+                        cp = strchr(GetText(cwnd), '\n');
+                        if (cp != NULL)
+                            len = (int) (cp - GetText(cwnd));
+                        strncpy(text, GetText(cwnd), len);
+                        *(text+len) = '\0';
+                    }
+                    break;
+                case TEXTBOX:
+                    if (GetText(cwnd) != NULL)
+                        strncpy(text, GetText(cwnd), len);
+                    break;
+                case COMBOBOX:
+                case EDITBOX:
+                    DfSendMessage(cwnd,GETTEXT,(PARAM)text,len);
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+}
+
+/* ------- set the text of a listbox control window ------ */
+void GetDlgListText(DFWINDOW wnd, char *text, enum commands cmd)
+{
+    CTLWINDOW *ct = FindCommand(wnd->extension, cmd, LISTBOX);
+    int sel = DfSendMessage(ct->wnd, LB_CURRENTSELECTION, 0, 0);
+    DfSendMessage(ct->wnd, DFM_LB_GETTEXT, (PARAM) text, sel);
+}
+
+/* -- find control structure associated with text control -- */
+static CTLWINDOW *AssociatedControl(DBOX *db,enum commands Tcmd)
+{
+    CTLWINDOW *ct = db->ctl;
+    while (ct->class)    {
+        if (ct->class != TEXT)
+            if (ct->command == Tcmd)
+                break;
+        ct++;
+    }
+    return ct;
+}
+
+/* --- process dialog box shortcut keys --- */
+static void dbShortcutKeys(DBOX *db, int ky)
+{
+    CTLWINDOW *ct;
+    int ch = AltConvert(ky);
+
+    if (ch != 0)    {
+        ct = db->ctl;
+        while (ct->class)    {
+            char *cp = ct->itext;
+            while (cp && *cp)    {
+                if (*cp == SHORTCUTCHAR &&
+                            tolower(*(cp+1)) == ch)    {
+                    if (ct->class == TEXT)
+                        ct = AssociatedControl(db, ct->command);
+                    if (ct->class == RADIOBUTTON)
+                        SetRadioButton(db, ct);
+                    else if (ct->class == CHECKBOX)    {
+                        ct->setting ^= ON;
+                        DfSendMessage(ct->wnd, PAINT, 0, 0);
+                    }
+                    else if (ct->class)    {
+                        DfSendMessage(ct->wnd, SETFOCUS, TRUE, 0);
+                        if (ct->class == BUTTON)
+                           DfSendMessage(ct->wnd,KEYBOARD,'\r',0);
+                    }
+                    return;
+                }
+                cp++;
+            }
+            ct++;
+        }
+    }
+}
+
+/* --- dynamically add or remove scroll bars
+                            from a control window ---- */
+void SetScrollBars(DFWINDOW wnd)
+{
+    int oldattr = GetAttribute(wnd);
+    if (wnd->wlines > ClientHeight(wnd))
+        AddAttribute(wnd, VSCROLLBAR);
+    else 
+        ClearAttribute(wnd, VSCROLLBAR);
+    if (wnd->textwidth > ClientWidth(wnd))
+        AddAttribute(wnd, HSCROLLBAR);
+    else 
+        ClearAttribute(wnd, HSCROLLBAR);
+    if (GetAttribute(wnd) != oldattr)
+        DfSendMessage(wnd, BORDER, 0, 0);
+}
+
+/* ------- CREATE_WINDOW Message (Control) ----- */
+static void CtlCreateWindowMsg(DFWINDOW wnd)
+{
+    CTLWINDOW *ct;
+    ct = wnd->ct = wnd->extension;
+    wnd->extension = NULL;
+    if (ct != NULL)
+        ct->wnd = wnd;
+}
+
+/* ------- KEYBOARD Message (Control) ----- */
+static BOOL CtlKeyboardMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    CTLWINDOW *ct = GetControl(wnd);
+    switch ((int) p1)    {
+        case F1:
+            if (WindowMoving || WindowSizing)
+                break;
+            if (!DisplayHelp(wnd, ct->help))
+                DfSendMessage(GetParent(wnd),DFM_COMMAND,ID_HELP,0);
+            return TRUE;
+        case ' ':
+            if (!((int)p2 & ALTKEY))
+                break;
+        case ALT_F6:
+        case CTRL_F4:
+        case ALT_F4:
+            DfPostMessage(GetParent(wnd), KEYBOARD, p1, p2);
+            return TRUE;
+        default:
+            break;
+    }
+    if (GetClass(wnd) == EDITBOX)
+        if (isMultiLine(wnd))
+            return FALSE;
+    switch ((int) p1)    {
+        case UP:
+            if (!isDerivedFrom(wnd, LISTBOX))    {
+                p1 = CTRL_FIVE;
+                p2 = LEFTSHIFT;
+            }
+            break;
+        case BS:
+            if (!isDerivedFrom(wnd, EDITBOX))    {
+                p1 = CTRL_FIVE;
+                p2 = LEFTSHIFT;
+            }
+            break;
+        case DN:
+            if (!isDerivedFrom(wnd, LISTBOX) &&
+                    !isDerivedFrom(wnd, COMBOBOX))
+                p1 = '\t';
+            break;
+        case FWD:
+            if (!isDerivedFrom(wnd, EDITBOX))
+                p1 = '\t';
+            break;
+        case '\r':
+            if (isDerivedFrom(wnd, EDITBOX))
+                if (isMultiLine(wnd))
+                    break;
+            if (isDerivedFrom(wnd, BUTTON))
+                break;
+            DfSendMessage(GetParent(wnd), DFM_COMMAND, ID_OK, 0);
+            return TRUE;
+        default:
+            break;
+    }
+    return FALSE;
+}
+
+/* ------- CLOSE_WINDOW Message (Control) ----- */
+static void CtlCloseWindowMsg(DFWINDOW wnd)
+{
+    CTLWINDOW *ct = GetControl(wnd);
+    if (ct != NULL)    {
+        ct->wnd = NULL;
+        if (GetParent(wnd)->ReturnCode == ID_OK)       {
+            if (ct->class == EDITBOX || ct->class == COMBOBOX) {
+               if (wnd->TextChanged)    {
+                       ct->itext=DFrealloc(ct->itext,strlen(wnd->text)+1);
+                       strcpy(ct->itext, wnd->text);
+                       if (!isMultiLine(wnd))    {
+                       char *cp = ct->itext+strlen(ct->itext)-1;
+                       if (*cp == '\n')
+                               *cp = '\0';
+                       }
+               }
+                       }
+            else if (ct->class == RADIOBUTTON || ct->class == CHECKBOX)
+                ct->isetting = ct->setting;
+        }
+    }
+}
+
+
+static void FixColors(DFWINDOW wnd)
+{
+       CTLWINDOW *ct = wnd->ct;
+
+       if (ct->class != BUTTON)
+       {
+               if (ct->class != SPINBUTTON && ct->class != COMBOBOX)
+               {
+                       wnd->WindowColors[FRAME_COLOR][FG] = 
+                               GetParent(wnd)->WindowColors[FRAME_COLOR][FG];
+                       wnd->WindowColors[FRAME_COLOR][BG] = 
+                               GetParent(wnd)->WindowColors[FRAME_COLOR][BG];
+                       if (ct->class != EDITBOX && ct->class != LISTBOX)
+                       {
+                               wnd->WindowColors[STD_COLOR][FG] = 
+                                       GetParent(wnd)->WindowColors[STD_COLOR][FG];
+                               wnd->WindowColors[STD_COLOR][BG] = 
+                                       GetParent(wnd)->WindowColors[STD_COLOR][BG];
+                       }
+               }
+       }
+}
+
+
+/* -- generic window processor used by dialog box controls -- */
+static int ControlProc(DFWINDOW wnd,DFMESSAGE msg,PARAM p1,PARAM p2)
+{
+    DBOX *db;
+
+    if (wnd == NULL)
+        return FALSE;
+    db = GetParent(wnd) ? GetParent(wnd)->extension : NULL;
+
+    switch (msg)    {
+        case CREATE_WINDOW:
+            CtlCreateWindowMsg(wnd);
+            break;
+        case KEYBOARD:
+            if (CtlKeyboardMsg(wnd, p1, p2))
+                return TRUE;
+            break;
+        case PAINT:
+                       FixColors(wnd);
+            if (GetClass(wnd) == EDITBOX ||
+                    GetClass(wnd) == LISTBOX ||
+                        GetClass(wnd) == TEXTBOX)
+                SetScrollBars(wnd);
+            break;
+        case BORDER:
+                       FixColors(wnd);
+            if (GetClass(wnd) == EDITBOX)    {
+                DFWINDOW oldFocus = inFocus;
+                inFocus = NULL;
+                DefaultWndProc(wnd, msg, p1, p2);
+                inFocus = oldFocus;
+                return TRUE;
+            }
+            break;
+        case SETFOCUS: {
+                       DFWINDOW pwnd = GetParent(wnd);
+                       if (p1)
+                       {
+                               DefaultWndProc(wnd, msg, p1, p2);
+                               if (pwnd != NULL)
+                               {
+                                       pwnd->dfocus = wnd;
+                                       DfSendMessage(pwnd, DFM_COMMAND,
+                                               inFocusCommand(db), ENTERFOCUS);
+                               }
+                return TRUE;
+            }
+            else
+                DfSendMessage(pwnd, DFM_COMMAND,
+                    inFocusCommand(db), LEAVEFOCUS);
+            break;
+               }
+        case CLOSE_WINDOW:
+            CtlCloseWindowMsg(wnd);
+            break;
+        default:
+            break;
+    }
+    return DefaultWndProc(wnd, msg, p1, p2);
+}
+
+/* ---- change the focus to the first control --- */
+static void FirstFocus(DBOX *db)
+{
+       CTLWINDOW *ct = db->ctl;
+       if (ct != NULL)
+       {
+               while (ct->class == TEXT || ct->class == BOX)   {
+                       ct++;
+                       if (ct->class == 0)
+                               return;
+               }
+               DfSendMessage(ct->wnd, SETFOCUS, TRUE, 0);
+       }
+}
+
+/* ---- change the focus to the next control --- */
+static void NextFocus(DBOX *db)
+{
+       CTLWINDOW *ct = WindowControl(db, inFocus);
+       int looped = 0;
+       if (ct != NULL)
+       {
+               do
+               {
+                       ct++;
+                       if (ct->class == 0)
+                       {
+                               if (looped)
+                                       return;
+                               looped++;
+                               ct = db->ctl;
+                       }
+               } while (ct->class == TEXT || ct->class == BOX);
+               DfSendMessage(ct->wnd, SETFOCUS, TRUE, 0);
+       }
+}
+
+/* ---- change the focus to the previous control --- */
+static void PrevFocus(DBOX *db)
+{
+       CTLWINDOW *ct = WindowControl(db, inFocus);
+       int looped = 0;
+       if (ct != NULL)
+       {
+               do
+               {
+                       if (ct == db->ctl)
+                       {
+                               if (looped)
+                                       return;
+                               looped++;
+                               while (ct->class)
+                                       ct++;
+                       }
+                       --ct;
+               } while (ct->class == TEXT || ct->class == BOX);
+               DfSendMessage(ct->wnd, SETFOCUS, TRUE, 0);
+       }
+}
+
+void SetFocusCursor(DFWINDOW wnd)
+{
+       if (wnd == inFocus)
+       {
+               DfSendMessage(NULL, SHOW_CURSOR, 0, 0);
+               DfSendMessage(wnd, KEYBOARD_CURSOR, 1, 0);
+       }
+}
+
+/* EOF */
diff --git a/rosapps/dflat32/dialbox.h b/rosapps/dflat32/dialbox.h
new file mode 100644 (file)
index 0000000..a32119d
--- /dev/null
@@ -0,0 +1,55 @@
+/* ----------------- dialbox.h ---------------- */
+
+#ifndef DIALOG_H
+#define DIALOG_H
+
+#include <stdio.h>
+
+#define MAXCONTROLS 30
+#define MAXRADIOS 20
+
+#define OFF FALSE
+#define ON  TRUE
+
+/* -------- dialog box and control window structure ------- */
+typedef struct  {
+    char *title;    /* window title         */
+    int x, y;       /* relative coordinates */
+    int h, w;       /* size                 */
+} DIALOGWINDOW;
+
+/* ------ one of these for each control window ------- */
+typedef struct {
+    DIALOGWINDOW dwnd;
+    DFCLASS class;    /* LISTBOX, BUTTON, etc */
+    char *itext;    /* initialized text     */
+    int command;    /* command code         */
+    char *help;     /* help mnemonic        */
+    BOOL isetting;  /* initially ON or OFF  */
+    BOOL setting;   /* ON or OFF            */
+    void *wnd;      /* window handle        */
+} CTLWINDOW;
+
+/* --------- one of these for each dialog box ------- */
+typedef struct {
+    char *HelpName;
+    DIALOGWINDOW dwnd;
+    CTLWINDOW ctl[MAXCONTROLS+1];
+} DBOX;
+
+/* -------- macros for dialog box resource compile -------- */
+#define DIALOGBOX(db) DBOX db={ #db,
+#define DB_TITLE(ttl,x,y,h,w) {ttl,x,y,h,w},{
+#define CONTROL(ty,tx,x,y,h,w,c)                                               \
+                               {{NULL,x,y,h,w},ty,                                             \
+                               (ty==EDITBOX||ty==COMBOBOX?NULL:tx),    \
+                               c,#c,(ty==BUTTON?ON:OFF),OFF,NULL},
+
+#define ENDDB {{NULL}} }};
+
+#define Cancel  " Cancel "
+#define Ok      "   OK   "
+#define Yes     "  Yes   "
+#define No      "   No   "
+
+#endif
diff --git a/rosapps/dflat32/dialogs.c b/rosapps/dflat32/dialogs.c
new file mode 100644 (file)
index 0000000..489b8a7
--- /dev/null
@@ -0,0 +1,160 @@
+/* ----------- dialogs.c --------------- */
+
+#include "dflat.h"
+
+/* -------------- the File Open dialog box --------------- */
+DIALOGBOX( FileOpen )
+    DB_TITLE(        "Open File",    -1,-1,19,48)
+    CONTROL(TEXT,    "~Filename",     2, 1, 1, 8, ID_FILENAME)
+    CONTROL(EDITBOX, NULL,           13, 1, 1,29, ID_FILENAME)
+    CONTROL(TEXT,    "Directory:",    2, 3, 1,10, 0)
+    CONTROL(TEXT,    NULL,           13, 3, 1,28, ID_PATH)
+    CONTROL(TEXT,    "F~iles",        2, 5, 1, 5, ID_FILES)
+    CONTROL(LISTBOX, NULL,            2, 6,11,16, ID_FILES)
+    CONTROL(TEXT,    "~Directories", 19, 5, 1,11, ID_DRIVE)
+    CONTROL(LISTBOX, NULL,           19, 6,11,16, ID_DRIVE)
+    CONTROL(BUTTON,  "   ~OK   ",    36, 7, 1, 8, ID_OK)
+    CONTROL(BUTTON,  " ~Cancel ",    36,10, 1, 8, ID_CANCEL)
+    CONTROL(BUTTON,  "  ~Help  ",    36,13, 1, 8, ID_HELP)
+ENDDB
+
+/* -------------- the Save As dialog box --------------- */
+DIALOGBOX( SaveAs )
+    DB_TITLE(        "Save As",    -1,-1,19,48)
+    CONTROL(TEXT,    "~Filename",   2, 1, 1, 8, ID_FILENAME)
+    CONTROL(EDITBOX, NULL,         13, 1, 1,29, ID_FILENAME)
+    CONTROL(TEXT,    "Directory:",  2, 3, 1,10, 0)
+    CONTROL(TEXT,    NULL,         13, 3, 1,28, ID_PATH)
+    CONTROL(TEXT,    "~Directories",2, 5, 1,11, ID_DRIVE)
+    CONTROL(LISTBOX, NULL,          2, 6,11,16, ID_DRIVE)
+    CONTROL(BUTTON,  "   ~OK   ",  36, 7, 1, 8, ID_OK)
+    CONTROL(BUTTON,  " ~Cancel ",  36,10, 1, 8, ID_CANCEL)
+    CONTROL(BUTTON,  "  ~Help  ",  36,13, 1, 8, ID_HELP)
+ENDDB
+
+/* -------------- The Printer Setup dialog box ------------------ */
+DIALOGBOX( PrintSetup )
+       DB_TITLE( "Printer Setup",   -1, -1, 17, 32)
+       CONTROL(BOX,      "Margins",  2,  3,  9, 26, 0 )
+       CONTROL(TEXT,     "~Port:",   4,  1,  1,  5, ID_PRINTERPORT)
+       CONTROL(COMBOBOX, NULL,      12,  1,  8,  9, ID_PRINTERPORT)
+       CONTROL(TEXT,     "~Left:",   6,  4,  1,  5, ID_LEFTMARGIN)
+       CONTROL(SPINBUTTON, NULL,    17,  4,  1,  6, ID_LEFTMARGIN)
+       CONTROL(TEXT,     "~Right:",  6,  6,  1,  6, ID_RIGHTMARGIN)
+       CONTROL(SPINBUTTON, NULL,    17,  6,  1,  6, ID_RIGHTMARGIN)
+       CONTROL(TEXT,     "~Top:",    6,  8,  1,  4, ID_TOPMARGIN)
+       CONTROL(SPINBUTTON, NULL,    17,  8,  1,  6, ID_TOPMARGIN)
+       CONTROL(TEXT,     "~Bottom:", 6, 10,  1,  7, ID_BOTTOMMARGIN)
+       CONTROL(SPINBUTTON, NULL,    17, 10,  1,  6, ID_BOTTOMMARGIN)
+    CONTROL(BUTTON, "   ~OK   ",  1, 13,  1,  8, ID_OK)
+    CONTROL(BUTTON, " ~Cancel ", 11, 13,  1,  8, ID_CANCEL)
+    CONTROL(BUTTON, "  ~Help  ", 21, 13,  1,  8, ID_HELP)
+ENDDB
+
+/* -------------- the Search Text dialog box --------------- */
+DIALOGBOX( SearchTextDB )
+    DB_TITLE(        "Search Text",    -1,-1,9,48)
+    CONTROL(TEXT,    "~Search for:",          2, 1, 1, 11, ID_SEARCHFOR)
+    CONTROL(EDITBOX, NULL,                   14, 1, 1, 29, ID_SEARCHFOR)
+    CONTROL(TEXT, "~Match upper/lower case:", 2, 3, 1, 23, ID_MATCHCASE)
+       CONTROL(CHECKBOX,  NULL,                 26, 3, 1,  3, ID_MATCHCASE)
+    CONTROL(BUTTON, "   ~OK   ",              7, 5, 1,  8, ID_OK)
+    CONTROL(BUTTON, " ~Cancel ",             19, 5, 1,  8, ID_CANCEL)
+    CONTROL(BUTTON, "  ~Help  ",             31, 5, 1,  8, ID_HELP)
+ENDDB
+
+/* -------------- the Replace Text dialog box --------------- */
+DIALOGBOX( ReplaceTextDB )
+    DB_TITLE(        "Replace Text",    -1,-1,12,50)
+    CONTROL(TEXT,    "~Search for:",          2, 1, 1, 11, ID_SEARCHFOR)
+    CONTROL(EDITBOX, NULL,                   16, 1, 1, 29, ID_SEARCHFOR)
+    CONTROL(TEXT,    "~Replace with:",        2, 3, 1, 13, ID_REPLACEWITH)
+    CONTROL(EDITBOX, NULL,                   16, 3, 1, 29, ID_REPLACEWITH)
+    CONTROL(TEXT, "~Match upper/lower case:", 2, 5, 1, 23, ID_MATCHCASE)
+       CONTROL(CHECKBOX,  NULL,                 26, 5, 1,  3, ID_MATCHCASE)
+    CONTROL(TEXT, "Replace ~Every Match:",    2, 6, 1, 23, ID_REPLACEALL)
+       CONTROL(CHECKBOX,  NULL,                 26, 6, 1,  3, ID_REPLACEALL)
+    CONTROL(BUTTON, "   ~OK   ",              7, 8, 1,  8, ID_OK)
+    CONTROL(BUTTON, " ~Cancel ",             20, 8, 1,  8, ID_CANCEL)
+    CONTROL(BUTTON, "  ~Help  ",             33, 8, 1,  8, ID_HELP)
+ENDDB
+
+/* -------------- generic message dialog box --------------- */
+DIALOGBOX( MsgBox )
+    DB_TITLE(       NULL,  -1,-1, 0, 0)
+    CONTROL(TEXT,   NULL,   1, 1, 0, 0, 0)
+    CONTROL(BUTTON, NULL,   0, 0, 1, 8, ID_OK)
+    CONTROL(0,      NULL,   0, 0, 1, 8, ID_CANCEL)
+ENDDB
+
+/* ----------- InputBox Dialog Box ------------ */
+DIALOGBOX( InputBoxDB )
+    DB_TITLE(        NULL,      -1,-1, 9, 0)
+    CONTROL(TEXT,    NULL,       1, 1, 1, 0, 0)
+       CONTROL(EDITBOX, NULL,       1, 3, 1, 0, ID_INPUTTEXT)
+    CONTROL(BUTTON, "   ~OK   ", 0, 5, 1, 8, ID_OK)
+    CONTROL(BUTTON, " ~Cancel ", 0, 5, 1, 8, ID_CANCEL)
+ENDDB
+
+/* ----------- SliderBox Dialog Box ------------- */
+DIALOGBOX( SliderBoxDB )
+    DB_TITLE(       NULL,      -1,-1, 9, 0)
+    CONTROL(TEXT,   NULL,       0, 1, 1, 0, 0)
+    CONTROL(TEXT,   NULL,       0, 3, 1, 0, 0)
+    CONTROL(BUTTON, " Cancel ", 0, 5, 1, 8, ID_CANCEL)
+ENDDB
+
+
+/* ------------ Display dialog box -------------- */
+DIALOGBOX( Display )
+    DB_TITLE(     "Display", -1, -1, 12, 35)
+
+       CONTROL(BOX,      "Window",    7, 1, 6,20, 0)
+    CONTROL(CHECKBOX,    NULL,     9, 2, 1, 3, ID_TITLE)
+    CONTROL(TEXT,     "~Title",   15, 2, 1, 5, ID_TITLE)
+    CONTROL(CHECKBOX,    NULL,     9, 3, 1, 3, ID_BORDER)
+    CONTROL(TEXT,     "~Border",  15, 3, 1, 6, ID_BORDER)
+    CONTROL(CHECKBOX,    NULL,     9, 4, 1, 3, ID_STATUSBAR)
+    CONTROL(TEXT,   "~Status bar",15, 4, 1,10, ID_STATUSBAR)
+    CONTROL(CHECKBOX,    NULL,     9, 5, 1, 3, ID_TEXTURE)
+    CONTROL(TEXT,     "Te~xture", 15, 5, 1, 7, ID_TEXTURE)
+
+    CONTROL(BUTTON, "   ~OK   ",   2, 8,1,8,ID_OK)
+    CONTROL(BUTTON, " ~Cancel ",  12, 8,1,8,ID_CANCEL)
+    CONTROL(BUTTON, "  ~Help  ",  22, 8,1,8,ID_HELP)
+ENDDB
+
+/* ------------ Windows dialog box -------------- */
+DIALOGBOX( Windows )
+    DB_TITLE(     "Windows", -1, -1, 19, 24)
+    CONTROL(LISTBOX, NULL,         1,  1,11,20, ID_WINDOWLIST)
+    CONTROL(BUTTON,  "   ~OK   ",  2, 13, 1, 8, ID_OK)
+    CONTROL(BUTTON,  " ~Cancel ", 12, 13, 1, 8, ID_CANCEL)
+    CONTROL(BUTTON,  "  ~Help  ",  7, 15, 1, 8, ID_HELP)
+ENDDB
+
+#ifdef INCLUDE_LOGGING
+/* ------------ Message Log dialog box -------------- */
+DIALOGBOX( Log )
+    DB_TITLE(    "D-Flat Message Log", -1, -1, 18, 41)
+    CONTROL(TEXT,  "~Messages",   10,   1,  1,  8, ID_LOGLIST)
+    CONTROL(LISTBOX,    NULL,     1,    2, 14, 26, ID_LOGLIST)
+    CONTROL(TEXT,    "~Logging:", 29,   4,  1, 10, ID_LOGGING)
+    CONTROL(CHECKBOX,    NULL,    31,   5,  1,  3, ID_LOGGING)
+    CONTROL(BUTTON,  "   ~OK   ", 29,   7,  1,  8, ID_OK)
+    CONTROL(BUTTON,  " ~Cancel ", 29,  10,  1,  8, ID_CANCEL)
+    CONTROL(BUTTON,  "  ~Help  ", 29,  13, 1,   8, ID_HELP)
+ENDDB
+#endif
+
+/* ------------ the Help window dialog box -------------- */
+DIALOGBOX( HelpBox )
+    DB_TITLE(         NULL,       -1, -1, 0, 45)
+    CONTROL(TEXTBOX, NULL,         1,  1, 0, 40, ID_HELPTEXT)
+    CONTROL(BUTTON,  "  ~Close ",  0,  0, 1,  8, ID_CANCEL)
+    CONTROL(BUTTON,  "  ~Back  ", 10,  0, 1,  8, ID_BACK)
+    CONTROL(BUTTON,  "<< ~Prev ", 20,  0, 1,  8, ID_PREV)
+    CONTROL(BUTTON,  " ~Next >>", 30,  0, 1,  8, ID_NEXT)
+ENDDB
+
+/* EOF */
\ No newline at end of file
diff --git a/rosapps/dflat32/direct.c b/rosapps/dflat32/direct.c
new file mode 100644 (file)
index 0000000..4635d44
--- /dev/null
@@ -0,0 +1,175 @@
+/* ---------- direct.c --------- */
+
+#include <direct.h>
+#include <io.h>
+
+#include "dflat.h"
+
+#define DRIVE          1
+#define DIRECTORY      2
+#define FILENAME       4
+#define EXTENSION      8
+
+static char path[MAX_PATH];
+static char drive[_MAX_DRIVE] = " :";
+static char dir[_MAX_DIR];
+static char name[_MAX_FNAME];
+static char ext[_MAX_EXT];
+
+/* ----- Create unambiguous path from file spec, filling in the
+     drive and directory if incomplete. Optionally change to
+     the new drive and subdirectory ------ */
+void CreatePath(char *path,char *fspec,int InclName,int Change)
+{
+    int cm = 0;
+    char currdir[MAX_PATH];
+    char *cp;
+
+       /* save the current directory */
+       if (!Change)
+               GetCurrentDirectory (MAX_PATH, currdir);
+
+    *drive = *dir = *name = *ext = '\0';
+    _splitpath(fspec, drive, dir, name, ext);
+    if (!InclName)
+        *name = *ext = '\0';
+    *drive = toupper(*drive);
+    if (*ext)
+        cm |= EXTENSION;
+    if (InclName && *name)
+        cm |= FILENAME;
+    if (*dir)
+        cm |= DIRECTORY;
+    if (*drive)
+        cm |= DRIVE;
+    if (cm & DRIVE)
+        _chdrive(*drive - '@');
+    else
+       {
+        *drive = _getdrive();
+        *drive += '@';
+    }
+    if (cm & DIRECTORY)
+    {
+        cp = dir+strlen(dir)-1;
+        if (*cp == '\\')
+            *cp = '\0';
+        chdir(dir);
+    }
+    getcwd(dir, sizeof dir);
+    memmove(dir, dir+2, strlen(dir+1));
+    if (InclName)    {
+        if (!(cm & FILENAME))
+            strcpy(name, "*");
+        if (!(cm & EXTENSION) && strchr(fspec, '.') != NULL)
+            strcpy(ext, ".*");
+    }
+    else
+        *name = *ext = '\0';
+    if (dir[strlen(dir)-1] != '\\')
+        strcat(dir, "\\");
+    memset(path, 0, sizeof path);
+    _makepath(path, drive, dir, name, ext);
+
+       if (!Change)
+               SetCurrentDirectory (currdir);
+}
+
+
+static int dircmp(const void *c1, const void *c2)
+{
+    return stricmp(*(char **)c1, *(char **)c2);
+}
+
+
+BOOL DfDlgDirList(DFWINDOW wnd, char *fspec,
+                enum commands nameid, enum commands pathid,
+                unsigned attrib)
+{
+    int ax, i = 0;
+    struct _finddata_t ff;
+    CTLWINDOW *ct = FindCommand(wnd->extension,nameid,LISTBOX);
+    DFWINDOW lwnd;
+    char **dirlist = NULL;
+
+       CreatePath(path, fspec, TRUE, TRUE);
+       if (ct != NULL)
+       {
+               lwnd = ct->wnd;
+               DfSendMessage(ct->wnd, CLEARTEXT, 0, 0);
+
+               if (attrib & 0x8000)
+               {
+                       DWORD cd, dr;
+
+                       cd = GetLogicalDrives ();
+                       for (dr = 0; dr < 26; dr++)
+                       {
+                               if (cd & (1 << dr))
+                               {
+                                       char drname[15];
+
+                                       sprintf(drname, "[%c:\\]", (char)(dr+'A'));
+#if 0
+                    /* ---- test for network or RAM disk ---- */
+                    regs.x.ax = 0x4409;     /* IOCTL func 9 */
+                    regs.h.bl = dr+1;
+                    int86(DOS, &regs, &regs);
+                    if (!regs.x.cflag)    {
+                        if (regs.x.dx & 0x1000)
+                            strcat(drname, " (Network)");
+                        else if (regs.x.dx == 0x0800)
+                            strcat(drname, " (RAMdisk)");
+                    }
+#endif
+                                       DfSendMessage(lwnd,ADDTEXT,(PARAM)drname,0);
+                               }
+                       }
+                       DfSendMessage(lwnd, PAINT, 0, 0);
+               }
+               ax = _findfirst(path, &ff);
+               if (ax == -1)
+                       return FALSE;
+               do
+               {
+            if (!((attrib & 0x4000) &&
+                 (ff.attrib & (attrib & 0x3f)) == 0) &&
+                 strcmp(ff.name, "."))
+                       {
+                char fname[MAX_PATH+2];
+                sprintf(fname, (ff.attrib & FILE_ATTRIBUTE_DIRECTORY) ?
+                                "[%s]" : "%s" , ff.name);
+                dirlist = DFrealloc(dirlist,
+                                    sizeof(char *)*(i+1));
+                dirlist[i] = DFmalloc(strlen(fname)+1);
+                if (dirlist[i] != NULL)
+                    strcpy(dirlist[i], fname);
+                i++;
+            }
+        }
+               while (_findnext(ax, &ff) == 0);
+               _findclose(ax);
+        if (dirlist != NULL)
+               {
+            int j;
+            /* -- sort file/drive/directory list box data -- */
+            qsort(dirlist, i, sizeof(void *), dircmp);
+
+            /* ---- send sorted list to list box ---- */
+            for (j = 0; j < i; j++)    {
+                DfSendMessage(lwnd,ADDTEXT,(PARAM)dirlist[j],0);
+                free(dirlist[j]);
+            }
+            free(dirlist);
+        }
+        DfSendMessage(lwnd, SHOW_WINDOW, 0, 0);
+    }
+    if (pathid)
+       {
+        _makepath(path, drive, dir, NULL, NULL);
+        PutItemText(wnd, pathid, path);
+    }
+    return TRUE;
+}
+
+/* EOF */
diff --git a/rosapps/dflat32/edit.c b/rosapps/dflat32/edit.c
new file mode 100644 (file)
index 0000000..4ae2d5d
--- /dev/null
@@ -0,0 +1,738 @@
+/* --------------- edit.c ----------- */
+
+#include "dflat.h"
+
+extern DBOX PrintSetup;
+
+char DFlatApplication[] = "Edit";
+
+static char Untitled[] = "Untitled";
+
+static int wndpos;
+
+static int MemoPadProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+static void NewFile(DFWINDOW,char *);
+static void SelectFile(DFWINDOW);
+static void PadWindow(DFWINDOW, char *);
+static void OpenPadWindow(DFWINDOW, char *,char *);
+static void LoadFile(DFWINDOW);
+static void PrintPad(DFWINDOW);
+static void SaveFile(DFWINDOW, int);
+static void EditDeleteFile(DFWINDOW);
+static int EditorProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+static char *NameComponent(char *);
+static int PrintSetupProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+static void FixTabMenu(void);
+#ifndef TURBOC
+void Calendar(DFWINDOW);
+#endif
+//void BarChart(DFWINDOW);
+char **Argv;
+
+#define CHARSLINE 80
+#define LINESPAGE 66
+
+int main (int argc, char *argv[])
+{
+       DFWINDOW wnd;
+       FILE *fp;
+       if (!init_messages())
+               return 1;
+       Argv = argv;
+       LoadConfig ();
+//     if (!LoadConfig())
+//             cfg.ScreenLines = SCREENHEIGHT;
+       wnd = DfCreateWindow (APPLICATION,
+                             "FreeDos Edit " VERSION,
+                             0, 0, -1, -1,
+                             &MainMenu,
+                             NULL,
+                             MemoPadProc,
+//                           MOVEABLE  |
+//                           SIZEABLE  |
+//                           HASBORDER |
+//                           MINMAXBOX |
+                             HASSTATUSBAR);
+
+       LoadHelpFile ();
+       DfSendMessage (wnd, SETFOCUS, TRUE, 0);
+
+       // Load the files from args - if the file does not exist, open a new window....
+       while (argc > 1)
+       {
+               // check if the file exists....
+               if (( fp = fopen(argv[1],"r")) == NULL )
+               {
+                       // file does not exist - create new window
+                       NewFile(wnd,argv[1]);
+               }
+               else
+                       PadWindow(wnd, argv[1]);
+               --argc;
+               argv++;
+       }
+
+       while (DfDispatchMessage ())
+               ;
+
+       return 0;
+}
+
+/* ------ open text files and put them into editboxes ----- */
+static void PadWindow(DFWINDOW wnd, char *FileName)
+{
+    int ax;
+    struct _finddata_t ff;
+    char path[MAX_PATH];
+    char *cp;
+
+    CreatePath(path, FileName, FALSE, FALSE);
+    cp = path+strlen(path);
+    CreatePath(path, FileName, TRUE, FALSE);
+    ax = _findfirst(path, &ff);
+    if (ax == -1)
+        return;
+    do
+    {
+        strcpy(cp, ff.name);
+        OpenPadWindow(wnd, path,NULL);
+    }
+       while (_findnext(ax, &ff) == 0);
+       _findclose (ax);
+}
+
+/* ------- window processing module for the
+                    Edit application window ----- */
+static int MemoPadProc(DFWINDOW wnd,DFMESSAGE msg,PARAM p1,PARAM p2)
+{
+       int rtn;
+       switch (msg)
+       {
+               case CREATE_WINDOW:
+                       rtn = DefaultWndProc(wnd, msg, p1, p2);
+                       if (cfg.InsertMode)
+                               SetCommandToggle(&MainMenu, ID_INSERT);
+                       if (cfg.WordWrap)
+                               SetCommandToggle(&MainMenu, ID_WRAP);
+                       FixTabMenu();
+                       return rtn;
+               case DFM_COMMAND:
+                       switch ((int)p1)
+                       {
+                               case ID_NEW:
+                                       NewFile(wnd,NULL);
+                                       return TRUE;
+
+                               case ID_OPEN:
+                                       SelectFile(wnd);
+                                       return TRUE;
+
+                               case ID_SAVE:
+                                       SaveFile(inFocus, FALSE);
+                                       return TRUE;
+
+                               case ID_SAVEAS:
+                                       SaveFile(inFocus, TRUE);
+                                       return TRUE;
+
+                               case ID_DELETEFILE:
+                                       EditDeleteFile(inFocus);
+                                       return TRUE;
+
+                               case ID_PRINTSETUP:
+                                       DfDialogBox(wnd, &PrintSetup, TRUE, PrintSetupProc);
+                                       return TRUE;
+
+                               case ID_PRINT:
+                                       PrintPad(inFocus);
+                                       return TRUE;
+
+                               case ID_EXIT:
+                                       if (!DfYesNoBox("Exit FreeDos Edit?"))
+                                               return FALSE;
+                                       break;
+
+                               case ID_WRAP:
+                                       cfg.WordWrap = GetCommandToggle(&MainMenu, ID_WRAP);
+                                       return TRUE;
+
+                               case ID_INSERT:
+                                       cfg.InsertMode = GetCommandToggle(&MainMenu, ID_INSERT);
+                                       return TRUE;
+
+                               case ID_TAB2:
+                                       cfg.Tabs = 2;
+                                       FixTabMenu();
+                                       return TRUE;
+
+                               case ID_TAB4:
+                                       cfg.Tabs = 4;
+                                       FixTabMenu();
+                                       return TRUE;
+
+                               case ID_TAB6:
+                                       cfg.Tabs = 6;
+                                       FixTabMenu();
+                                       return TRUE;
+
+                               case ID_TAB8:
+                                       cfg.Tabs = 8;
+                                       FixTabMenu();
+                                       return TRUE;
+
+                               case ID_CALENDAR:
+                                       Calendar(wnd);
+                                       return TRUE;
+
+//                             case ID_BARCHART:
+//                                     BarChart(wnd);
+//                                     return TRUE;
+
+                               case ID_ABOUT:
+                    DfMessageBox(
+                         "About D-Flat and FreeDos Edit",
+                        "   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
+                        "   ³    ÜÜÜ   ÜÜÜ     Ü    ³\n"
+                        "   ³    Û  Û  Û  Û    Û    ³\n"
+                        "   ³    Û  Û  Û  Û    Û    ³\n"
+                        "   ³    Û  Û  Û  Û Û  Û    ³\n"
+                        "   ³    ßßß   ßßß   ßß     ³\n"
+                        "   RÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU\n"
+                        "D-Flat implements the SAA/CUA\n"
+                        "interface in a public domain\n"
+                        "C language library originally\n"
+                        "published in Dr. Dobb's Journal\n"
+                        "    ------------------------ \n"
+                        "FreeDos Edit is a clone of MSDOS\n"
+                        "editor for the FREEDOS Project");
+                    return TRUE;
+
+                               default:
+                                       break;
+                       }
+                       break;
+
+               default:
+                       break;
+       }
+
+       return DefaultWndProc(wnd, msg, p1, p2);
+}
+
+/* --- The New command. Open an empty editor window --- */
+static void NewFile(DFWINDOW wnd, char *FileName)
+{
+       OpenPadWindow(wnd, Untitled,FileName);
+}
+
+/* --- The Open... command. Select a file  --- */
+static void SelectFile(DFWINDOW wnd)
+{
+       char FileName[MAX_PATH];
+
+       if (OpenFileDialogBox("*.*", FileName))
+       {
+               /* see if the document is already in a window */
+               DFWINDOW wnd1 = FirstWindow(wnd);
+               while (wnd1 != NULL)
+               {
+                       if (wnd1->extension &&
+                               stricmp(FileName, wnd1->extension) == 0)
+                       {
+                               DfSendMessage(wnd1, SETFOCUS, TRUE, 0);
+                               DfSendMessage(wnd1, RESTORE, 0, 0);
+                               return;
+                       }
+                       wnd1 = NextWindow(wnd1);
+               }
+               OpenPadWindow(wnd, FileName, NULL);
+       }
+}
+
+/* --- open a document window and load a file --- */
+static void OpenPadWindow(DFWINDOW wnd, char *FileName,char *NewFileName)
+{
+       static DFWINDOW wnd1 = NULL;
+       DFWINDOW wwnd;
+       struct stat sb;
+       char *Fname = FileName;
+       char *Fnewname = NewFileName;
+       char *ermsg;
+
+       if (strcmp(FileName, Untitled))
+       {
+               if (stat(FileName, &sb))
+               {
+                       ermsg = DFmalloc(strlen(FileName)+20);
+                       strcpy(ermsg, "No such file as\n");
+                       strcat(ermsg, FileName);
+                       DfErrorMessage(ermsg);
+                       free(ermsg);
+                       return;
+               }
+
+               Fname = NameComponent(FileName);
+
+               // check file size
+               if (sb.st_size > 64000)
+               {
+                       ermsg = DFmalloc(strlen(FileName)+20);
+                       strcpy(ermsg, "File too large for this version of Edit\n");
+                       DfErrorMessage(ermsg);
+                       free(ermsg);
+                       return;
+               }
+       }
+
+       wwnd = WatchIcon();
+       wndpos += 2;
+
+       if (NewFileName != NULL)
+               Fname = NameComponent(NewFileName);
+
+       if (wndpos == 20)
+               wndpos = 2;
+
+       wnd1 = DfCreateWindow(EDITBOX,
+                             Fname,
+                             (wndpos-1)*2, wndpos, 10, 40,
+                             NULL, wnd, EditorProc,
+                             SHADOW |
+                             MINMAXBOX |
+                             CONTROLBOX |
+                             VSCROLLBAR |
+                             HSCROLLBAR |
+                             MOVEABLE |
+                             HASBORDER |
+                             SIZEABLE |
+                             MULTILINE);
+
+       if (strcmp(FileName, Untitled))
+       {
+               wnd1->extension = DFmalloc(strlen(FileName)+1);
+               strcpy(wnd1->extension, FileName);
+               LoadFile(wnd1);
+       }
+       DfSendMessage(wwnd, CLOSE_WINDOW, 0, 0);
+       DfSendMessage(wnd1, SETFOCUS, TRUE, 0);
+       DfSendMessage(wnd1, MAXIMIZE, 0, 0);
+}
+
+/* --- Load the notepad file into the editor text buffer --- */
+static void LoadFile(DFWINDOW wnd)
+{
+       char *Buf = NULL;
+       int recptr = 0;
+       FILE *fp;
+
+       if ((fp = fopen(wnd->extension, "rt")) != NULL)
+       {
+               while (!feof(fp))
+               {
+                       handshake();
+                       Buf = DFrealloc(Buf, recptr+150);
+                       memset(Buf+recptr, 0, 150);
+                       fgets(Buf+recptr, 150, fp);
+                       recptr += strlen(Buf+recptr);
+               }
+               fclose(fp);
+               if (Buf != NULL)
+               {
+                       DfSendMessage(wnd, SETTEXT, (PARAM) Buf, 0);
+                       free(Buf);
+               }
+       }
+}
+
+static int LineCtr;
+static int CharCtr;
+
+/* ------- print a character -------- */
+static void PrintChar(FILE *prn, int c)
+{
+       int i;
+
+       if (c == '\n' || CharCtr == cfg.RightMargin)
+       {
+               fputs("\r\n", prn);
+               LineCtr++;
+               if (LineCtr == cfg.BottomMargin)
+               {
+                       fputc('\f', prn);
+                       for (i = 0; i < cfg.TopMargin; i++)
+                               fputc('\n', prn);
+                       LineCtr = cfg.TopMargin;
+               }
+               CharCtr = 0;
+               if (c == '\n')
+                       return;
+       }
+       if (CharCtr == 0)
+       {
+               for (i = 0; i < cfg.LeftMargin; i++)
+               {
+                       fputc(' ', prn);
+                       CharCtr++;
+               }
+       }
+       CharCtr++;
+       fputc(c, prn);
+}
+
+/* --- print the current notepad --- */
+static void PrintPad(DFWINDOW wnd)
+{
+       if (*cfg.PrinterPort)
+       {
+               FILE *prn;
+               if ((prn = fopen(cfg.PrinterPort, "wt")) != NULL)
+               {
+                       long percent;
+                       BOOL KeepPrinting = TRUE;
+                       unsigned char *text = GetText(wnd);
+                       unsigned oldpct = 100, cct = 0, len = strlen(text);
+                       DFWINDOW swnd = SliderBox(20, GetTitle(wnd), "Printing");
+                       /* ------- print the notepad text --------- */
+                       LineCtr = CharCtr = 0;
+                       while (KeepPrinting && *text)
+                       {
+                               PrintChar(prn, *text++);
+                               percent = ((long) ++cct * 100) / len;
+                               if ((int)percent != (int)oldpct)
+                               {
+                                       oldpct = (int) percent;
+                                       KeepPrinting = DfSendMessage(swnd, PAINT, 0, oldpct);
+                               }
+                       }
+                       if (KeepPrinting)
+                               /* ---- user did not cancel ---- */
+                               if (oldpct < 100)
+                                       DfSendMessage(swnd, PAINT, 0, 100);
+                       /* ------- follow with a form feed? --------- */
+                       if (DfYesNoBox("Form Feed?"))
+                               fputc('\f', prn);
+                       fclose(prn);
+               }
+               else
+                       DfErrorMessage("Cannot open printer file");
+       }
+       else
+               DfErrorMessage("No printer selected");
+}
+
+/* ---------- save a file to disk ------------ */
+static void SaveFile(DFWINDOW wnd, int Saveas)
+{
+    FILE *fp;
+    if (wnd->extension == NULL || Saveas)    {
+        char FileName[MAX_PATH];
+        if (SaveAsDialogBox(FileName))    {
+            if (wnd->extension != NULL)
+                free(wnd->extension);
+            wnd->extension = DFmalloc(strlen(FileName)+1);
+            strcpy(wnd->extension, FileName);
+            AddTitle(wnd, NameComponent(FileName));
+            DfSendMessage(wnd, BORDER, 0, 0);
+        }
+        else
+            return;
+    }
+    if (wnd->extension != NULL)
+    {
+        DFWINDOW mwnd = MomentaryMessage("Saving the file");
+        if ((fp = fopen(wnd->extension, "wt")) != NULL)
+        {
+            fwrite(GetText(wnd), strlen(GetText(wnd)), 1, fp);
+            fclose(fp);
+            wnd->TextChanged = FALSE;
+        }
+        DfSendMessage(mwnd, CLOSE_WINDOW, 0, 0);
+    }
+}
+/* -------- delete a file ------------ */
+static void EditDeleteFile(DFWINDOW wnd)
+{
+    if (wnd->extension != NULL)    {
+        if (strcmp(wnd->extension, Untitled))    {
+            char *fn = NameComponent(wnd->extension);
+            if (fn != NULL)    {
+                char msg[30];
+                sprintf(msg, "Delete %s?", fn);
+                if (DfYesNoBox(msg))    {
+                    unlink(wnd->extension);
+                    DfSendMessage(wnd, CLOSE_WINDOW, 0, 0);
+                }
+            }
+        }
+    }
+}
+/* ------ display the row and column in the statusbar ------ */
+static void ShowPosition(DFWINDOW wnd)
+{
+    char status[30];
+    sprintf(status, "Line:%4d  Column: %2d",
+        wnd->CurrLine, wnd->CurrCol);
+    DfSendMessage(GetParent(wnd), ADDSTATUS, (PARAM) status, 0);
+}
+
+/* window processing module for the editboxes */
+static int EditorProc(DFWINDOW wnd,DFMESSAGE msg,PARAM p1,PARAM p2)
+{
+       int rtn;
+
+       switch (msg)
+       {
+               case SETFOCUS:
+                       if ((int)p1)
+                       {
+                               wnd->InsertMode = GetCommandToggle(&MainMenu, ID_INSERT);
+                               wnd->WordWrapMode = GetCommandToggle(&MainMenu, ID_WRAP);
+                       }
+                       rtn = DefaultWndProc(wnd, msg, p1, p2);
+                       if ((int)p1 == FALSE)
+                               DfSendMessage(GetParent(wnd), ADDSTATUS, 0, 0);
+                       else
+                               ShowPosition(wnd);
+                       return rtn;
+
+               case KEYBOARD_CURSOR:
+                       rtn = DefaultWndProc(wnd, msg, p1, p2);
+                       ShowPosition(wnd);
+                       return rtn;
+
+               case DFM_COMMAND:
+                       switch ((int) p1)
+                       {
+                               case ID_SEARCH:
+                                       DfSearchText(wnd);
+                                       return TRUE;
+                               case ID_REPLACE:
+                                       DfReplaceText(wnd);
+                                       return TRUE;
+                               case ID_SEARCHNEXT:
+                                       DfSearchNext(wnd);
+                                       return TRUE;
+                               case ID_CUT:
+                                       CopyToClipboard(wnd);
+                                       DfSendMessage(wnd, DFM_COMMAND, ID_DELETETEXT, 0);
+                                       DfSendMessage(wnd, PAINT, 0, 0);
+                                       return TRUE;
+                               case ID_COPY:
+                                       CopyToClipboard(wnd);
+                                       ClearTextBlock(wnd);
+                                       DfSendMessage(wnd, PAINT, 0, 0);
+                                       return TRUE;
+                               case ID_PASTE:
+                                       PasteFromClipboard(wnd);
+                                       DfSendMessage(wnd, PAINT, 0, 0);
+                                       return TRUE;
+                               case ID_DELETETEXT:
+                               case ID_CLEAR:
+                                       rtn = DefaultWndProc(wnd, msg, p1, p2);
+                                       DfSendMessage(wnd, PAINT, 0, 0);
+                                       return rtn;
+                               case ID_HELP:
+                                       DisplayHelp(wnd, "MEMOPADDOC");
+                                       return TRUE;
+                               case ID_WRAP:
+                                       DfSendMessage(GetParent(wnd), DFM_COMMAND, ID_WRAP, 0);
+                                       wnd->WordWrapMode = cfg.WordWrap;
+                                       return TRUE;
+                               case ID_INSERT:
+                                       DfSendMessage(GetParent(wnd), DFM_COMMAND, ID_INSERT, 0);
+                                       wnd->InsertMode = cfg.InsertMode;
+                                       DfSendMessage(NULL, SHOW_CURSOR, wnd->InsertMode, 0);
+                                       return TRUE;
+                               default:
+                                       break;
+                       }
+                       break;
+
+               case CLOSE_WINDOW:
+                       if (wnd->TextChanged)
+                       {
+                               char *cp = DFmalloc(25+strlen(GetTitle(wnd)));
+                               DfSendMessage(wnd, SETFOCUS, TRUE, 0);
+                               strcpy(cp, GetTitle(wnd));
+                               strcat(cp, "\nText changed. Save it?");
+                               if (DfYesNoBox(cp))
+                                       DfSendMessage(GetParent(wnd), DFM_COMMAND, ID_SAVE, 0);
+                               free(cp);
+                       }
+                       wndpos = 0;
+                       if (wnd->extension != NULL)
+                       {
+                               free(wnd->extension);
+                               wnd->extension = NULL;
+                       }
+                       break;
+
+               default:
+                       break;
+       }
+
+       return DefaultWndProc(wnd, msg, p1, p2);
+}
+
+/* -- point to the name component of a file specification -- */
+static char *NameComponent(char *FileName)
+{
+    char *Fname;
+    if ((Fname = strrchr(FileName, '\\')) == NULL)
+        if ((Fname = strrchr(FileName, ':')) == NULL)
+            Fname = FileName-1;
+    return Fname + 1;
+}
+
+static char *ports[] = {
+       "Lpt1", "Lpt2", "Lpt3",
+       "Com1", "Com2", "Com3", "Com4",
+        NULL
+};
+
+static int PrintSetupProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
+{
+       int rtn, i = 0, mar;
+       char marg[10];
+       DFWINDOW cwnd;
+
+       switch (msg)
+       {
+               case CREATE_WINDOW:
+                       rtn = DefaultWndProc(wnd, msg, p1, p2);
+                       PutItemText(wnd, ID_PRINTERPORT, cfg.PrinterPort);
+                       while (ports[i] != NULL)
+                               PutComboListText(wnd, ID_PRINTERPORT, ports[i++]);
+                       for (mar = CHARSLINE; mar >= 0; --mar)
+                       {
+                               sprintf(marg, "%3d", mar);
+                               PutItemText(wnd, ID_LEFTMARGIN, marg);
+                               PutItemText(wnd, ID_RIGHTMARGIN, marg);
+                       }
+                       for (mar = LINESPAGE; mar >= 0; --mar)
+                       {
+                               sprintf(marg, "%3d", mar);
+                               PutItemText(wnd, ID_TOPMARGIN, marg);
+                               PutItemText(wnd, ID_BOTTOMMARGIN, marg);
+                       }
+                       cwnd = ControlWindow(&PrintSetup, ID_LEFTMARGIN);
+                       DfSendMessage(cwnd, LB_SETSELECTION,
+                               CHARSLINE-cfg.LeftMargin, 0);
+                       cwnd = ControlWindow(&PrintSetup, ID_RIGHTMARGIN);
+                       DfSendMessage(cwnd, LB_SETSELECTION,
+                               CHARSLINE-cfg.RightMargin, 0);
+                       cwnd = ControlWindow(&PrintSetup, ID_TOPMARGIN);
+                       DfSendMessage(cwnd, LB_SETSELECTION,
+                               LINESPAGE-cfg.TopMargin, 0);
+                       cwnd = ControlWindow(&PrintSetup, ID_BOTTOMMARGIN);
+                       DfSendMessage(cwnd, LB_SETSELECTION,
+                               LINESPAGE-cfg.BottomMargin, 0);
+                       return rtn;
+               case DFM_COMMAND:
+                       if ((int) p1 == ID_OK && (int) p2 == 0)
+                       {
+                               GetItemText(wnd, ID_PRINTERPORT, cfg.PrinterPort, 4);
+                               cwnd = ControlWindow(&PrintSetup, ID_LEFTMARGIN);
+                               cfg.LeftMargin = CHARSLINE -
+                                       DfSendMessage(cwnd, LB_CURRENTSELECTION, 0, 0);
+                               cwnd = ControlWindow(&PrintSetup, ID_RIGHTMARGIN);
+                               cfg.RightMargin = CHARSLINE -
+                                       DfSendMessage(cwnd, LB_CURRENTSELECTION, 0, 0);
+                               cwnd = ControlWindow(&PrintSetup, ID_TOPMARGIN);
+                               cfg.TopMargin = LINESPAGE -
+                                       DfSendMessage(cwnd, LB_CURRENTSELECTION, 0, 0);
+                               cwnd = ControlWindow(&PrintSetup, ID_BOTTOMMARGIN);
+                               cfg.BottomMargin = LINESPAGE -
+                                       DfSendMessage(cwnd, LB_CURRENTSELECTION, 0, 0);
+                       }
+                       break;
+               default:
+                       break;
+       }
+       return DefaultWndProc(wnd, msg, p1, p2);
+}
+
+static void FixTabMenu(void)
+{
+       char *cp = GetCommandText(&MainMenu, ID_TABS);
+       char *p;
+
+       if (cp != NULL)
+       {
+               p = strchr(cp, '(');
+               if (p != NULL)
+               {
+//                     *(p+1) = (char)(cfg.Tabs + '0');
+//                     if (GetClass(inFocus) == POPDOWNMENU)
+//                             DfSendMessage(inFocus, PAINT, 0, 0);
+               }
+       }
+}
+
+void PrepFileMenu(void *w, struct Menu *mnu)
+{
+       DFWINDOW wnd = w;
+       DeactivateCommand(&MainMenu, ID_SAVE);
+       DeactivateCommand(&MainMenu, ID_SAVEAS);
+       DeactivateCommand(&MainMenu, ID_DELETEFILE);
+       DeactivateCommand(&MainMenu, ID_PRINT);
+       if (wnd != NULL && GetClass(wnd) == EDITBOX)
+       {
+               if (isMultiLine(wnd))
+               {
+                       ActivateCommand(&MainMenu, ID_SAVE);
+                       ActivateCommand(&MainMenu, ID_SAVEAS);
+                       ActivateCommand(&MainMenu, ID_DELETEFILE);
+                       ActivateCommand(&MainMenu, ID_PRINT);
+               }
+       }
+}
+
+void PrepSearchMenu(void *w, struct Menu *mnu)
+{
+       DFWINDOW wnd = w;
+       DeactivateCommand(&MainMenu, ID_SEARCH);
+       DeactivateCommand(&MainMenu, ID_REPLACE);
+       DeactivateCommand(&MainMenu, ID_SEARCHNEXT);
+       if (wnd != NULL && GetClass(wnd) == EDITBOX)
+       {
+               if (isMultiLine(wnd))
+               {
+                       ActivateCommand(&MainMenu, ID_SEARCH);
+                       ActivateCommand(&MainMenu, ID_REPLACE);
+                       ActivateCommand(&MainMenu, ID_SEARCHNEXT);
+               }
+       }
+}
+
+void PrepEditMenu(void *w, struct Menu *mnu)
+{
+       DFWINDOW wnd = w;
+       DeactivateCommand(&MainMenu, ID_CUT);
+       DeactivateCommand(&MainMenu, ID_COPY);
+       DeactivateCommand(&MainMenu, ID_CLEAR);
+       DeactivateCommand(&MainMenu, ID_DELETETEXT);
+       DeactivateCommand(&MainMenu, ID_PARAGRAPH);
+       DeactivateCommand(&MainMenu, ID_PASTE);
+       DeactivateCommand(&MainMenu, ID_UNDO);
+       if (wnd != NULL && GetClass(wnd) == EDITBOX)
+       {
+               if (isMultiLine(wnd))
+               {
+                       if (TextBlockMarked(wnd))
+                       {
+                               ActivateCommand(&MainMenu, ID_CUT);
+                               ActivateCommand(&MainMenu, ID_COPY);
+                               ActivateCommand(&MainMenu, ID_CLEAR);
+                               ActivateCommand(&MainMenu, ID_DELETETEXT);
+                       }
+                       ActivateCommand(&MainMenu, ID_PARAGRAPH);
+                       if (!TestAttribute(wnd, READONLY) && Clipboard != NULL)
+                               ActivateCommand(&MainMenu, ID_PASTE);
+                       if (wnd->DeletedText != NULL)
+                               ActivateCommand(&MainMenu, ID_UNDO);
+               }
+       }
+}
+
+/* EOF */
diff --git a/rosapps/dflat32/edit.txt b/rosapps/dflat32/edit.txt
new file mode 100644 (file)
index 0000000..bbe007e
--- /dev/null
@@ -0,0 +1,1455 @@
+; ------------------------ MEMOPAD.TXT ---------------------
+;
+; This is the help text file for the MEMOPAD application. It 
+; includes the help text that a D-Flat application would use 
+; for the user interface.
+;
+; There can be a help window with a helptag name for each
+; command in commands.h, each menu label on the menu bar 
+; as defined in menus.c, and each dialog box name in dialogs.c
+;
+; There can be other help windows as well. Some of them will
+; be displayed as the result of hypertext and definition key 
+; words embedded in the help text of other help windows. Others
+; can be implemented from within an application software system.
+;
+; Following is the format for a help window:
+;
+; ÚÄÄ (1st column of each line)
+; \1f
+; ; anything with a semicolon in the 1st column is a comment
+; <helptag>                 (names the help window)
+; [<<]<helptag>             (names the previous window in chain)
+; [>>]<helptag>             (names the next window in chain)
+; Help Window Title         (displays in window's title bar)
+; Help text follows until next helptag occurs
+; Hypertext reference  [..keyword]<helptag> embedded in text
+; Definition reference [**keyword]<helptag> embedded in text
+; <helptag>                 (names another window)
+;
+; Notes: 
+;   1. A hypertext reference, when selected, causes the 
+;      associated help window named by the <helptag> to 
+;      become the active help window.
+;   2. A definition reference, when selected, displays
+;      a momentary window with the text of the associated
+;      help window named by the <helptag>. The window 
+;      closes when the user releases the Enter key or
+;      mouse button.
+;   3. A definition window has no title.
+;   4. The last window is followed by the <end> helptag.
+;   5. The window's height and width adjust to the text.
+;   6. The [..], [**], and <helptags> do not display and
+;      do not figure in the width of the line in which 
+;      they occur.
+;
+; -----------------------------------------
+<Application>
+[<<]<MEMOPAD>
+[>>]<Menubar>
+Application Window
+The Application Window is the desktop for the 
+application.
+
+The Application window contains the application's 
+[..Document Windows]<docwindow>. Before you open any documents,
+the Application window is empty.
+
+The application window has an [..Action Bar]<Menubar> just below
+its [..Title Bar]<titlebar> and a [..Status Bar]<statusbar> at the bottom.
+
+Note that there might not be a title or status bar
+depending on the [..Display]<ID_DISPLAY> option on the [..Options]<Options>
+menu.
+; -----------------------------------------
+<MEMOPAD>
+[>>]<Application>
+The MEMOPAD Application
+MEMOPAD is a multi-window notepad program that
+demonstrates the programmer's [**API]<API> to the D-Flat
+Common User Access interface library.
+; -----------------------------------------
+<MEMOPADDOC>
+[<<]<Application>
+The MEMOPAD Document Window
+This [..Document Window]<docwindow> is a basic notepad text editor. You can 
+have many of these windows open at one time.
+; -----------------------------------------
+<docwindow>
+Document Window
+A Document Window contains the data that you work
+on. It displays within the [..Application Window]<Application> and
+consists of these parts:
+
+  [..Client Area]<client>
+  [..Border]<border>
+  [..Title Bar]<titlebar>
+  [..Status Bar]<statusbar>
+  [..Scroll Bars]<scrollbar>
+  [..Control Box]<controlbox>
+  [..Minimize Box]<minbox>
+  [..Maximize Box]<maxbox>
+  [..Restore Box]<restorebox>
+  [..Resize Box]<sizebox>
+
+; -----------------------------------------
+<client>
+[<<]<docwindow>
+[>>]<border>
+Client Area
+The Client Area is the space inside the window's
+borders where the application's data values are
+displayed and manipulated.
+; -----------------------------------------
+<border>
+[<<]<client>
+[>>]<titlebar>
+Border
+The Border is the frame around a window. When the
+window has the focus, the border is a double line.
+When a different window has the focus, the border
+is a single line.
+
+The window's [..Scroll Bars]<scrollbar>, if any, are positioned
+in the right and bottom parts of the border.
+; -----------------------------------------
+<titlebar>
+[<<]<border>
+[>>]<statusbar>
+Title Bar
+The Title Bar is at the top of the window and 
+contains the window's title. When the window
+has the focus, the title is highlighted. The
+Title Bar includes these items as well:
+
+  [..Control Box]<controlbox>
+  [..Minimize Box]<minbox>
+  [..Maximize Box]<maxbox>
+  [..Restore Box]<restorebox> 
+
+You can move the window with the mouse by clicking
+the title bar and dragging the window to its new
+location.
+; -----------------------------------------
+<statusbar>
+[<<]<titlebar>
+[>>]<scrollbar>
+Status Bar
+The Status Bar is at the bottom of the application window.
+It displays the time and brief contextual messages about
+the menus and other application-dependent features.
+; ----------------------------------------- 
+<scrollbar>
+[<<]<statusbar>
+[>>]<controlbox>
+Scroll Bars
+You use Scroll Bars to scroll a window's data with the
+mouse. A window can have one or two Scroll Bars - one
+at the right and one at the bottom parts of the
+window's Border. The Scroll Bar at the right scrolls
+the document's data up and down.  The Scroll Bar on
+the bottom scrolls the window's data right and left.
+
+To scroll a window a line at a time, click the arrow
+tokens at either end of the Scroll Bar. The Scroll Bar
+includes a slider box that indicates the relative
+position of the window's display with respect to the
+total document. You can page to an approximate position
+within the document by clicking inside the Scroll Bar.
+You can drag the slider box in either direction to
+scroll the document.
+; -----------------------------------------
+<controlbox>
+[<<]<scrollbar>
+[>>]<minbox>
+Control Box
+The Control Box is indicated by the character (ð) at
+the left end of the window's [..Title Bar]<titlebar>. You can
+click it to select the System Menu or double click
+it to close the window.
+; -----------------------------------------
+<minbox>
+[<<]<controlbox>
+[>>]<maxbox>
+Minimize Box
+The Minimize Box is the \19 token at the right 
+end of the window's [..Title Bar]<titlebar>.
+
+When you click on the Minimize Box, the window
+is reduced to an icon at the bottom of the
+[..Application Window]<Application>
+; -----------------------------------------
+<maxbox>
+[<<]<minbox>
+[>>]<restorebox>
+Maximize Box
+The Maximize Box is the \18 token at the right 
+end of the window's [..Title Bar]<titlebar>.
+
+When you click on the Maximize Box, the window
+grows to occupy the entire [..Client Area]<client> of the
+[..Application Window]<Application>
+; -----------------------------------------
+<restorebox>
+[<<]<maxbox>
+[>>]<sizebox>
+Restore Box
+The Restore Box is the \18 token character at the right
+end of a minimized window's [..Title Bar]<titlebar> and the \12 token
+character at the right end of a maximized window's
+Title Bar. You click the Restore Box to restore the
+window to the position and size it had before it was
+minimized or maximized.
+; -----------------------------------------
+<sizebox>
+[<<]<restorebox>
+Resize Box
+The Resize Box is the lower right corner of the
+window's border. To change the window's size,
+drag the Resize Box. The window's upper left
+coordinates remain the same, and the lower right
+coordinates change as you drag the mouse around.
+; -----------------------------------------
+<Menubar>
+[<<]<application>
+[>>]<Pulldowns>
+The Action Bar
+To select the action bar, do one of these:
+  1. Press F10
+  2. Press and release the Alt key
+  3. Press Alt+the letter that is highlighted 
+     in a menu's title on the action bar. The 
+     selected menu will pull down.
+  4. Click the action bar. If you click a 
+     pull-down menu selection's title, that 
+     menu will pull down.
+
+To exit from the action bar and return to the
+document or application window, do one of these:
+  1. Press Esc
+  2. Press and release the Alt key
+; -----------------------------------------
+;
+;  Following are the Help system windows
+;
+; -----------------------------------------
+<HelpHelp>
+[<<]<Help>
+[>>]<ExtHelp>
+Help for Help
+Getting Into the Help System
+----------------------------
+There are three ways to get into the Help system:
+
+ 1. Execute commands on the [..Help]<Help> menu
+ 2. Press F1
+ 3. Press the Help command button on a dialog box.
+
+Contextual Help (F1)
+--------------------
+The F1 key provides contextual help--help for the
+part of the application that currently has the
+focus. You can press F1 with the action bar selected, 
+a pull-down menu displayed, a field on a dialog box
+selected, or a document window in focus.
+
+The Help Command Button
+-----------------------
+The Help command button on a dialog box displays
+information about the dialog box and its purpose.
+The help window that displays when you press F1 with
+a dialog box field selected relates to the field
+itself.
+
+References to Other Help Windows
+--------------------------------
+A Help window can include a reference to another
+help window. That reference is highlighted like
+this: 
+
+    [..Help]<Help>
+
+You can Tab to the highlighted reference and press
+the Enter key to select the referenced help window.
+You can select it with the mouse by double-clicking
+on it.
+
+Definitions
+-----------
+Some references, such as [**function key]<shortcut>, are
+definitions of terms. These definitions are
+highlighted the same as references. When you select
+the definition, a window displays in the upper left
+corner of the desktop. The window contains the
+definition of the selected term and stays in view
+until you release the Enter key or the mouse
+button.
+
+Command Buttons on the Help Windows
+-----------------------------------
+Each help window contains these [..command buttons]<cmdbuttons>:
+
+  Close  This button closes the help window and
+         exits from the help system.
+  Back   This button changes to the help window
+         that you viewed before the current one.
+  Prev   This button changes to the help window
+         that logically preceeds the current one.
+  Next   This button changes to the help window
+         that logically follows the current one.
+
+Exiting from the Help System
+----------------------------
+You exit from the Help system by closing the current
+help window in one of these three ways:
+
+  1. Press the Esc key
+  2. Use the Close command button on the Help
+     window.
+  5. Double click the window's [..Control Box]<controlbox>.
+  4. Close the help window from its [..System Menu]<sysmenu>.
+
+; -----------------------------------------
+<ExtHelp>
+[<<]<HelpHelp>
+[>>]<KeysHelp>
+Extended Help
+The MEMOPAD program has few features and procedures
+that are not taken directly from the SAA/CUA
+interface that D-Flat implements. The [..Log Messages]<ID_LOG>
+and [..Display]<ID_DISPLAY> selections on the [..Options]<Options> menu are
+unique to MEMOPAD and would not necessarily be in
+an application. Some of the Display features would
+be useful to a user who is not developing D-Flat
+programs. Others, such as the [..Title]<ID_TITLE>, [..Border]<ID_BORDER>,
+[..Status Bar]<ID_STATUSBAR>, and [..Texture]<ID_TEXTURE> check boxes on the [..Display]<Display>
+dialog box, are to allow a programmer to see how
+the screen looks with these features enabled and
+disabled. 
+; -----------------------------------------
+<KeysHelp>
+[<<]<ExtHelp>
+[>>]<HelpIndex>
+Keys Help
+From the Desktop
+----------------
+  Alt+Hyphen      Open the desktop's [..SystemMenu]<sysmenu>.
+  F10 or Alt      Activate the [..ActionBar]<menubar>.
+  Esc             Deactivate the Action Bar.
+  Alt+letter      Open the associated [..Pull-down menu]<Pulldowns>.
+  Alt+F6          Change focus to another document.
+  Alt+X           Exit the application.
+
+From a [..Document Window]<docwindow>
+----------------------
+  Alt+Spacebar    Open the window's [..System Menu]<sysmenu>
+  Alt+S           Save the document to a disk file.
+
+[..Edit Box]<editbox> Keys
+-----------
+  Arrow keys      Move the cursor one character.
+  Ctrl+arrow      Move the cursor one word.
+  Del             Delete character to the right of
+                  the cursor. If a [..block]<Block> is marked,
+                  delete the block.
+  Backspace       Delete character to the left of
+                  the cursor. If a block is marked,
+                  delete the block.
+  Alt+BackSpace   Undo the last block deletion.
+  PgUp/PgDn       Scroll forward and back one page.
+  Ctrl+PgUp/PgDn  Scroll horizontally one page.
+  Home/End        Move the cursor to the beginning
+                  and end of the line.
+  Ctrl+Home/End   Move the cursor to the beginning
+                  and end of the document.
+  Alt+P           Form a paragraph from the cursor 
+                  position to the next blank line.
+  Ins             Toggle Insert/Overstrike mode.
+  Tab             Tab to the next Tab Stop position.
+
+[..Clipboard]<clipboard> Keys
+--------------
+  Shift+Del       [..Cut]<ID_CUT> the marked text to the
+                  Clipboard
+  Ctrl+Ins        [..Copy]<ID_COPY> the marked text to the
+                  Clipboard.
+  Shift+Ins       [..Paste]<ID_PASTE> the contents of the
+                  Clipboard into the document.
+
+[..Dialog Box]<dialog> Keys
+---------------
+  Tab             Move to the next control.
+  Shift+Tab       Move to the previous control.
+  Enter           Execute the control.
+  Esc             Close the Dialog Box with no
+                  action.
+
+[..Listbox]<listbox> Keys
+------------
+  Up/down arrows  Move the selection cursor
+  Ctrl+arrows     Select a group of entries.
+  Enter           Choose the selected entry
+                  or entries.
+  Shift+F8        Toggle Add mode.
+  Spacebar        In Add mode, select/deselect an  
+                  entry.
+; -----------------------------------------
+<HelpIndex>
+[<<]<KeysHelp>
+Index of Help Titles
+Select (Tab then Enter or double-click) from these 
+titles to view the help screens related to each one.
+
+  [..Application Window]<Application>
+  [..Action Bar]<Menubar>
+  [..Pull-down Menus]<Pulldowns>
+    [..The File Menu]<File>
+    [..The Edit Menu]<Edit>
+    [..The Search Menu]<Search>
+    [..The Utilities Menu]<Utilities>
+    [..The Options Menu]<Options>
+    [..The Window Menu]<Window>
+    [..The Help Menu]<Help>
+  [..Dialog Boxes]<Dialog>
+    [..The File Open Dialog Box]<FileOpen>
+    [..The Save As Dialog Box]<SaveAs>
+    [..The MsgBox Dialog Box]<MsgBox>
+    [..The Display Dialog Box]<Display>
+    [..The Windows Dialog Box]<Windows>
+    [..The Log Dialog Box]<Log>
+  [..The Help System]<Help>
+    [..Help for help...]<ID_HELPHELP>
+    [..Extended help...]<ID_EXTHELP>
+    [..Keys help...]<ID_KEYSHELP>
+    [..Help index...]<ID_HELPINDEX>
+    [..Reload Help Database]<ID_LOADHELP>
+
+; -----------------------------------------
+;
+;  Following are menu command help windows
+;
+; -----------------------------------------
+<ID_NEW>
+[<<]<File>
+[>>]<ID_OPEN>
+The New Command
+This command opens a new, untitled document
+window. An untitled document is one that has 
+not been given a file name. When you use the 
+[..Save]<ID_SAVE> or [..Save as]<ID_SAVEAS> command on the File menu the 
+document gets a file name.
+; -----------------------------------------
+<ID_OPEN>
+[<<]<ID_NEW>
+[>>]<ID_SAVE>
+The Open Command
+This command opens an existing document and loads
+it into a window. You select the document by filling
+in the [..File Open]<FileOpen> dialog box.
+; -----------------------------------------
+<ID_SAVE>
+[<<]<ID_OPEN>
+[>>]<ID_SAVEAS>
+The Save Command
+This command saves the document in the currently
+active document window into a disk file. The file
+name is the same as when the file was loaded. If
+the window contains an untitled document, this
+command works just like the [..Save as]<ID_SAVEAS> command.
+; -----------------------------------------
+<ID_SAVEAS>
+[<<]<ID_SAVE>
+[>>]<ID_DELETEFILE>
+The Save As Command
+This command allows you to save the document in the
+currently active document window under a new file
+name. You specify the file's name by filling in the
+fields on the [..Save as]<SaveAs> dialog box. 
+
+The new file name becomes the title of the
+currently active document window where the file is
+displayed.
+; -----------------------------------------
+<ID_DELETEFILE>
+[<<]<ID_SAVEAS>
+[>>]<ID_PRINT>
+The Delete Command
+Use this command to delete the text file displayed
+in the active editbox window.
+; -----------------------------------------
+<ID_PRINT>
+[<<]<ID_DELETEFILE>
+[>>]<ID_PRINTSETUP>
+The Print Command
+This command prints the document in the
+currently-selected document window.
+; -----------------------------------------
+<ID_PRINTSETUP>
+[<<]<ID_PRINT>
+[>>]<ID_DOS>
+The Print Setup Command
+This command displays the [..Print Setup]<PrintSetup> dialog
+box to allow you to change the printer port
+and margins for the printout.
+; -----------------------------------------
+<ID_DOS>
+[<<]<ID_PRINT>
+[>>]<ID_EXIT>
+The DOS Command
+This command "shells" out to DOS. You return to the
+application from DOS by executing the DOS exit
+command at the DOS command line. 
+; -----------------------------------------
+<ID_EXIT>
+[<<]<ID_DOS>
+The Exit Command
+This command exits to DOS from the application. If
+there are any changed documents that you have not
+saved, the program will ask if you want to save
+them and allow you to do so, one at a time.
+; -----------------------------------------
+<ID_UNDO>
+[<<]<Edit>
+[>>]<ID_CUT>
+The Undo Command
+This command "undoes" the most recent [..Delete]<ID_DELETETEXT> or
+[..Clear]<ID_CLEAR> command. The text that was deleted by one of
+these commands is written into the document at the
+current cursor location.
+; -----------------------------------------
+<ID_CUT>
+[<<]<ID_UNDO>
+[>>]<ID_COPY>
+The Cut Command
+This command is active only when the current
+document window has a [..marked block]<Block>. The command
+deletes the text in the marked block, copies it to
+the [..Clipboard]<Clipboard>, and closes up the space in the
+document that the text previously occupied.
+; ----------------------------------------- 
+<ID_COPY>
+[<<]<ID_CUT>
+[>>]<ID_PASTE>
+The Copy Command
+This command is active only when the current
+document window has a [..marked block]<Block>. The command
+copies the text in the marked block to the 
+[..Clipboard]<Clipboard>, and closes up the space in the document 
+that the text previously occupied.
+; -----------------------------------------
+<ID_PASTE>
+[<<]<ID_COPY>
+[>>]<ID_CLEAR>
+The Paste Command
+This command is active only when the [..Clipboard]<Clipboard>
+contains text. The command inserts the text from the
+Clipboard into the currently active document window
+at the current cursor location.
+; -----------------------------------------
+<ID_CLEAR>
+[<<]<ID_PASTE>
+[>>]<ID_DELETETEXT>
+The Clear Command
+This command is active only when the current
+document window has a [..marked block]<Block>. The command
+deletes the block of text, leaving empty space in
+the document where the text had been.
+
+You can undo the text deletion with the
+[..Undo]<ID_UNDO> command.
+; -----------------------------------------
+<ID_DELETETEXT>
+[<<]<ID_CLEAR>
+[>>]<ID_PARAGRAPH>
+The Delete Command
+This command is active only when the current
+document window has a [..marked block]<Block>. The command
+deletes the block of text, closing the space in the
+document where the text had been.
+
+You can undo the text deletion with the
+[..Undo]<ID_UNDO> command.
+; -----------------------------------------
+<ID_PARAGRAPH>
+[<<]<ID_DELETETEXT>
+The Paragraph Command
+This command reforms a paragraph beginning at the
+current keyboard cursor position. The end of the
+paragraph is the last line preceding the next blank
+line.
+; -----------------------------------------
+<ID_SEARCH>
+[<<]<Search>
+[>>]<ID_REPLACE>
+The Search Command
+This command opens the [..Search Text]<SearchTextDB> Dialog Box to
+allow you to search the text for a
+matching string.
+; -----------------------------------------
+<ID_REPLACE>
+[<<]<ID_SEARCH>
+[>>]<ID_SEARCHNEXT>
+The Replace Command
+This command opens the [..Replace Text]<ReplaceText> Dialog Box to
+allow you to search the text for a
+matching string and replace it with a 
+different text string.
+; -----------------------------------------
+<ID_SEARCHNEXT>
+[<<]<ID_REPLACE>
+The Next Command
+This command continues the most recent [..Search]<ID_SEARCH>
+command beginning at the current cursor position.
+; -----------------------------------------
+<ID_INSERT>
+[<<]<Options>
+[>>]<ID_WRAP>
+The Insert Toggle
+This [**toggle]<toggle> command turns the editor's insert mode
+on and off. When insert mode is on, the editor
+inserts the text that you write. Otherwise each
+character typed overwrites the one at the current
+cursor position.
+; -----------------------------------------
+<ID_WRAP>
+[<<]<ID_INSERT>
+[>>]<ID_TABS>
+The Word Wrap Toggle
+This [**toggle]<toggle> command turns the editor's word wrap
+feature on and off. When word wrap is on, the editor
+will wrap words as you type at the right margin of
+the document window. When word wrap is off, the
+editor will scroll the display horizontally as you
+type beyond the right margin. 
+; -----------------------------------------
+<ID_TAB?>
+[<<]<ID_WRAP>
+[>>]<ID_DISPLAY>
+The Tabs Command
+This command allows you to
+change the editor's tab settings.
+; -----------------------------------------
+<ID_DISPLAY>
+[<<]<ID_TABS>
+[>>]<ID_LOG>
+The Display Command
+This command displays the [..Display]<Display> dialog box to
+allow you to modify the screen's colors and
+configuration.
+; -----------------------------------------
+<ID_LOG>
+[<<]<ID_DISPLAY>
+[>>]<ID_SAVEOPTIONS>
+The Log Messages Command
+This command is used primarily for debugging. It
+opens the [..Log Message]<Log> dialog box to allow the
+programmer to select the D-Flat messages to log and
+to turn message logging on and off.
+; -----------------------------------------
+<ID_SAVEOPTIONS>
+[<<]<ID_LOG>
+The Save Options Command
+This command saves the current options in a
+configuration file that the application reads when
+it first starts up.
+; -----------------------------------------
+<ID_CLOSEALL>
+[<<]<Window>
+[>>]<ID_WINDOW>
+The Close All Command
+This command closes all the document windows on the
+desktop.
+; -----------------------------------------
+<ID_WINDOW>
+[<<]<ID_CLOSEALL>
+[>>]<ID_MOREWINDOWS>
+The Open Window List
+The [..Window]<Window> menu displays a list of open document
+windows. You can select one of them as the current
+active window by selecting its title on the Window
+menu. When the menu first displays, the active
+window has a check mark (û) next to it.
+<ID_MOREWINDOWS>
+[<<]<ID_WINDOW>
+More Windows
+This command indicates that there are more open document
+windows than the [..Window]<Window> menu can display.
+Choose this command to see the [..Windows]<Windows> dialog box.
+; -----------------------------------------
+<ID_HELPHELP>
+[<<]<Help>
+[>>]<ID_EXTHELP>
+Help for Help
+This command describes how to use the Help system.
+; -----------------------------------------
+<ID_EXTHELP>
+[<<]<ID_HELPHELP>
+[>>]<ID_KEYSHELP>
+Extended Help
+Extended Help displays information about the
+application.
+; -----------------------------------------
+<ID_KEYSHELP>
+[<<]<ID_EXTHELP>
+[>>]<ID_HELPINDEX>
+Keys Help
+This command displays a help window that shows the
+keystrokes that you use to operate the application.
+; -----------------------------------------
+<ID_HELPINDEX>
+[<<]<ID_KEYSHELP>
+[>>]<ID_LOADHELP>
+Help Index
+The Help index lists the subjects covered in the
+Help database. You can go directly to a subject from
+the index by selecting the subject's name. 
+; -----------------------------------------
+<ID_LOADHELP>
+[<<]<ID_HELPINDEX>
+[>>]<ID_ABOUT>
+Reload Help Database
+This command allows you to reload the Help
+database. It is useful when you use the
+Memopad program to modify its Help database.
+You can change and save the MEMOPAD.TXT file,
+use this command to reload it, then use the
+Help system to view the results. Without this
+command, your changes would corrupt the
+current Memopad's picture of the database
+with respect to its pointers.
+
+You must delete the MEMOPAD.HLP compressed
+help database in order for this program to
+load the most recent changes.
+; -----------------------------------------
+<ID_ABOUT>
+[<<]<ID_LOADHELP>
+The About Command
+This command displays a message that tells you what
+the application is.
+; -----------------------------------------
+<ID_FILENAME>
+[>>]<ID_FILES>
+The Filename Field
+
+On the Open File dialog box:
+    Enter the name of the file you wish to
+    open into a document window, or enter
+    the file specification with wild cards
+    to display a list of files in the
+    [..Files]<ID_FILES> field.
+
+On the Save As dialog box:
+    Enter the name with which you wish to
+    save the file.
+; -----------------------------------------
+<ID_FILES>
+[<<]<ID_FILENAME>
+[>>]<ID_DRIVE>
+The Files Field
+Select a file from the listbox by using one
+of these methods:
+
+Keyboard:  Move the selection cursor to
+           the file name and press Enter.
+
+Mouse:     Double-click the file name.
+; -----------------------------------------
+<ID_DRIVE>
+[<<]<ID_FILES>
+The Directories Field
+Use this listbox to select a different
+drive or subdirectory. Select a drive or
+subdirectory from the listbox by using one
+of these methods:
+
+Keyboard:  Move the selection cursor to
+           the drive or subdirectory and 
+           press Enter.
+
+Mouse:     Double-click the drive or
+           subdirectory.
+; -----------------------------------------
+<ID_PRINTERPORT>
+[<<]<PrintSetup>
+[>>]<ID_LEFTMARGIN>
+The Printer Port Combo Box
+Use this combo box to change the printer
+port and to set the report's margins.
+; -----------------------------------------
+<ID_LEFTMARGIN>
+[<<]<ID_PRINTERPORT>
+[>>]<ID_RIGHTMARGIN>
+The Left Margin Spin Button
+Change the left margin by increasing
+and decreasing the value in this 
+spin box.
+; -----------------------------------------
+<ID_RIGHTMARGIN>
+[<<]<ID_LEFTMARGIN>
+[>>]<ID_TOPMARGIN>
+The Right Margin Spin Button
+Change the right margin by increasing
+and decreasing the value in this 
+spin box.
+; -----------------------------------------
+<ID_TOPMARGIN>
+[<<]<ID_RIGHTMARGIN>
+[>>]<ID_BOTTOMMARGIN>
+The Top Margin Spin Button
+Change the top margin by increasing
+and decreasing the value in this 
+spin box.
+; -----------------------------------------
+<ID_BOTTOMMARGIN>
+[<<]<ID_TOPMARGIN>
+The Bottom Margin Spin Button
+Change the bottom margin by increasing
+and decreasing the value in this 
+spin box.
+; -----------------------------------------
+<ID_SEARCHFOR>
+[>>]<ID_REPLACEWITH>
+The Search For Text Entry Box
+Enter the text you want to search for in this
+text box. Press Enter or the OK command button
+to begin the search. Press Esc to forget it.
+Use the [..Match Upper/Lower Case Check Box]<ID_MATCHCASE> to
+select whether the search will match only if
+the case matches or if the search is insensitive
+to the case of the two strings.
+; -----------------------------------------
+<ID_REPLACEWITH>
+[<<]<ID_SEARCHFOR>
+[>>]<ID_MATCHCASE>
+The Replace With Text Entry Box
+Enter the text string that will replace
+the matching text string in the
+[..Search For Text Entry Box]<ID_SEARCHFOR>.
+; -----------------------------------------
+<ID_MATCHCASE>
+[<<]<ID_REPLACEWITH>
+[>>]<ID_REPLACEALL>
+The Match Upper/Lower Case Check Box
+Use this checkbox to select whether the search 
+will match only if the case matches or if the 
+search is insensitive to the case of the two 
+strings.
+; -----------------------------------------
+<ID_REPLACEALL>
+[<<]<ID_MATCHCASE>
+The Replace Every Match Check Box
+Use this checkbox to select whether the search 
+will replace every match in the document.
+; -----------------------------------------
+<ID_TITLE>
+[<<]<Display>
+[>>]<ID_BORDER>
+The Title Check Box
+Select this Check Box to toggle the application
+window's title on and off. Without a title, the
+window also loses its [..Control Box]<controlbox>.
+; -----------------------------------------
+<ID_BORDER>
+[<<]<ID_TITLE>
+[>>]<ID_STATUSBAR>
+The Border Check Box
+Select this Check Box to toggle the application
+window's border on and off. Without a border, the
+window also loses its [..Status Bar]<statusbar>.
+; -----------------------------------------
+<ID_STATUSBAR>
+[<<]<ID_BORDER>
+[>>]<ID_TEXTURE>
+The Status Bar Check Box
+Select this Check Box to toggle the application
+window's [..Status Bar]<statusbar> on and off.
+; -----------------------------------------
+<ID_TEXTURE>
+[<<]<ID_STATUSBAR>
+[>>]<ID_COLOR>
+The Texture Check Box
+Select this Check Box to toggle the application
+window's background texture on and off.
+; -----------------------------------------
+<ID_COLOR>
+[<<]<ID_TEXTURE>
+[>>]<ID_MONO>
+The Color Option Button
+Select this option for a color display.
+; -----------------------------------------
+<ID_MONO>
+[<<]<ID_COLOR>
+[>>]<ID_REVERSE>
+The Mono Option Button
+Select this option for a monochrome display.
+; -----------------------------------------
+<ID_REVERSE>
+[<<]<ID_MONO>
+[>>]<ID_25LINES>
+The Reverse Option Button
+Select this option for a reverse monochrome
+display. You might find that this option
+works well with the LCD screens of some laptop
+computers, particularly when you turn off the
+[..Texture]<ID_TEXTURE> check box.
+; -----------------------------------------
+<ID_25LINES>
+[<<]<ID_REVERSE>
+[>>]<ID_43LINES>
+The 25 Lines Option Button
+Use this button to select a 25-line display.
+; -----------------------------------------
+<ID_43LINES>
+[<<]<ID_25LINES>
+[>>]<ID_50LINES>
+The 43 Lines Option Button
+Use this button to select a 43-line display.
+(EGA and VGA)
+; -----------------------------------------
+<ID_50LINES>
+[<<]<ID_43LINES>
+[>>]<ID_SNOWY>
+The 50 Lines Option Button
+Use this button to select a 50-line display.
+(VGA only)
+; -----------------------------------------
+<ID_SNOWY>
+[<<]<ID_50LINES>
+Snowy Display
+Select this check box if your display
+(usually a CGA) displays video snow when
+you change the screen.
+; -----------------------------------------
+<ID_LOGLIST>
+[<<]<Options>
+[>>]<ID_LOGGING>
+The Messages Listbox
+This is a list of D-Flat messages that
+you can log when the [..Logging]<ID_LOGGING> checkbox is
+selected. The list is a [..Multiple-Selection]<MultiSel>
+listbox. 
+; -----------------------------------------
+<ID_LOGGING> [<<]<ID_LOGLIST> The Logging
+CheckBox This checkbox turns message 
+logging on and off. ;
+-----------------------------------------
+<TEXTBOX> The TEXTBOX Window Class
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<LISTBOX>
+The LISTBOX Window Class
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<EDITBOX>
+The EDITBOX Window Class
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<Pulldowns>
+[<<]<menubar>
+[>>]<File>
+Pull-down Menus
+Pull-down menus contain the commands to operate
+the program. Read about the [..Action Bar]<menubar> to see
+how to select the pull-down menus. Following
+is a list of the pull-down menus.
+
+    [..The File Menu]<File>
+    [..The Edit Menu]<Edit>
+    [..The Search Menu]<Search>
+    [..The Options Menu]<Options>
+    [..The Window Menu]<Window>
+    [..The Help Menu]<Help>
+
+The [..System Menu]<sysmenu> is another kind of pull-down menu.
+; -----------------------------------------
+<File>
+[<<]<Pulldowns>
+[>>]<Edit>
+The File Menu
+The File menu contains commands that
+open, save, and print files. The menu
+also has the command that exits the
+program. Following are the commands
+and associated [**function keys]<shortcut>.
+
+    [..New]<ID_NEW>
+    [..Open]<ID_OPEN>
+    [..Save]<ID_SAVE>     (Alt+S)
+    [..Save as]<ID_SAVEAS>
+    [..Print]<ID_PRINT>
+    [..Exit]<ID_EXIT>     (Alt+X or Alt+F4)
+
+[**Inactive]<inactive> commands display in a dim font.
+; -----------------------------------------
+<Edit>
+[<<]<File>
+[>>]<Search>
+The Edit Menu
+The Edit menu contains commands that support
+text editing. Following are the commands and 
+associated [**function keys]<shortcut>.
+
+    [..Undo]<ID_UNDO>          (Alt+BS)
+    [..Cut]<ID_CUT>           (Shift+Del)
+    [..Copy]<ID_COPY>          (Ctrl+Ins)
+    [..Paste]<ID_PASTE>         (Shift+Ins)
+    [..Clear]<ID_CLEAR>
+    [..Delete]<ID_DELETETEXT>        (Del)
+    [..Paragraph]<ID_PARAGRAPH>     (Alt+P)
+
+[**Inactive]<inactive> commands display in a dim font.
+; -----------------------------------------
+<Search>
+[<<]<Edit>
+[>>]<Utilities>
+The Search Menu
+The Search menu allows you to search the text
+for a matching string. The commands are:
+
+    [..Search]<ID_SEARCH>
+    [..Next]<ID_SEARCHNEXT>    (F3)
+; -----------------------------------------
+<Utilities>
+[<<]<Search>
+[>>]<Options>
+The Utilities Menu
+The Utilities Menu has two commands that
+demonstrate the use of the PICTUREBOX window
+class. The commands are:
+
+    [..Calendar]<ID_CALENDAR>
+    [..Bar Chart]<ID_BARCHART>
+; -----------------------------------------
+<Options>
+[<<]<Utilities>
+[>>]<Window>
+The Options Menu
+The Options menu contains commands that let you
+control the editor's behavior, the video display
+characteristics, and whether to [**log]<logging> messages.
+You can save the options in a configuration file.
+Following are the commands on the Options menu.
+
+    [..Insert]<ID_INSERT>     (Ins)
+    [..Word wrap]<ID_WRAP>
+    [..Tabs]<ID_TABS>
+    [..Display]<ID_DISPLAY>
+    [..Log Messages]<ID_LOG>
+    [..Save Options]<ID_SAVEOPTIONS>
+; -----------------------------------------
+<Window>
+[<<]<Options>
+[>>]<Help>
+The Window Menu
+The Window menu has no selections unless the
+[..Application window]<Application> has one or more document
+windows displayed. When documents are displayed,
+the Window menu contains a [..Close All]<ID_CLOSEALL> command
+and an entry for the first nine document windows. 
+You can select a document window from the Window
+menu. If the Application window has more than nine
+document windows, the Window menu has the [**More Windows]<MoreWins>
+command, which displays the [..Windows]<Windows> dialog box.
+; -----------------------------------------
+<Help>
+[<<]<Window>
+The Help Menu
+The Help menu provides information about the 
+application and the desktop. The selections are:
+
+    [..Help for help...]<ID_HELPHELP>
+    [..Extended help...]<ID_EXTHELP>
+    [..Keys help...]<ID_KEYSHELP>
+    [..Help index...]<ID_HELPINDEX>
+    [..About...]<ID_ABOUT>
+
+; -----------------------------------------
+<sysmenu>
+[<<]<Pulldowns>
+[>>]<ID_SYSRESTORE>
+The System Menu
+Most windows have a system menu. If the window has a
+System Menu, the window will have a [..Control Box]<controlbox>. You
+can select the System Menu by clicking the control
+box or by pressing Alt+Spacebar for the application
+window's system menu and Alt+Hyphen for the system
+menu of other windows. 
+
+Following are the commands on the System Menu:
+
+    [..Restore]<ID_SYSRESTORE>
+    [..Move]<ID_SYSMOVE>
+    [..Size]<ID_SYSSIZE>
+    [..Minimize]<ID_SYSMINIMIZE>
+    [..Maximize]<ID_SYSMAXIMIZE>
+    [..Close]<ID_SYSCLOSE>
+
+; -----------------------------------------
+<ID_SYSRESTORE>
+[<<]<sysmenu>
+[>>]<ID_SYSMOVE>
+The Restore Command on the System Menu
+This command restores a [..Minimized]<ID_SYSMINIMIZE> or [..Maximized]<ID_SYSMAXIMIZE>
+window to the size and position it had before it
+was minimized or maximized.
+
+You can also restore a minimized or maximized 
+window by clicking its [..Restore Box]<restorebox>.
+; -----------------------------------------
+<ID_SYSMOVE>
+[<<]<ID_SYSRESTORE>
+[>>]<ID_SYSSIZE>
+The Move Command on the System Menu
+The Move command lets you move a window with the
+keyboard. Select the command from the System Menu. A
+movable window frame comes into view over the
+window's border. Use the up, down, left, and right
+arrow keys to move the frame to the new window
+position. Press the Enter key when the movable frame
+is where you want to move the window. Press the Esc
+key to ignore the movement.
+
+You can move a window with the mouse by clicking on
+the window's [..Title Bar]<titlebar> and dragging the window to
+the new location. 
+; -----------------------------------------
+<ID_SYSSIZE>
+[<<]<ID_SYSMOVE>
+[>>]<ID_SYSMINIMIZE>
+The Size Command on the System Menu
+The Size command lets you re-size a window with the
+keyboard. Select the command from the System Menu. 
+A sizeable window frame comes into view over the
+window's border. Use the up, down, left, and right
+arrow keys to change the frame to the new window
+size. Press the Enter key when the sizeable frame
+is the size you want for the window. Press the Esc
+key to ignore the size change.
+
+You can re-size a window with the mouse by clicking
+on the window border's [..Resize Box]<sizebox> and dragging the 
+window to the new size.
+; -----------------------------------------
+<ID_SYSMINIMIZE>
+[<<]<ID_SYSSIZE>
+[>>]<ID_SYSMAXIMIZE>
+The Minimize Command on the System Menu
+This command minimizes the window to an icon at the
+bottom of the application window.
+
+You can minimize a window with the mouse by clicking
+on the window's [..Minimize Box]<minbox>.
+
+The [..Restore]<ID_SYSRESTORE> command restores a minimized window to
+the size and position it had before it was
+minimized.
+; -----------------------------------------
+<ID_SYSMAXIMIZE>
+[<<]<ID_SYSMINIMIZE>
+[>>]<ID_SYSCLOSE>
+The Maximize Command on the System Menu
+This command maximizes the window to occupy all of
+the application window's client area.
+
+You can maximize a window with the mouse by clicking
+on the window's [..Maximize Box]<maxbox>.
+
+The [..Restore]<ID_SYSRESTORE> command restores a maximized window to
+the size and position it had before it was
+maximized.
+; -----------------------------------------
+<ID_SYSCLOSE>
+[<<]<ID_SYSMAXIMIZE>
+The Close Command on the System Menu
+This command closes the window with which the System
+Menu is associated.
+
+You can also close the window by double-clicking the
+[..Control Box]<controlbox> or pressing Ctrl+F4.
+; -----------------------------------------
+;
+;  Following are dialog box help windows
+;
+; -----------------------------------------
+<Dialog>
+[>>]<cmdbuttons>
+Dialog Boxes
+Dialog Boxes allow you to enter data into the
+application. A Dialog Box consists of these
+controls:
+
+    [..Command Buttons]<cmdbuttons>
+    [..Check Boxes]<checkboxes>
+    [..Option Buttons]<optbuttons>
+    [..Edit Boxes]<editboxes>
+    [..List Boxes]<listboxes>
+    [..Multiple-Selection Listboxes]<MultiSel>
+    [..Combo Boxes]<combobox>
+    [..Spin Buttons]<spinbutton>
+
+Move from control to control by using the Tab key
+or by pressing Alt+ the highlighted character in
+the control's label. Execute a control by pressing
+the Enter key. 
+
+Exit the Dialog Box and accept its data entries by
+executing the OK command button. 
+
+Exit the Dialog Box and reject its data entries by
+executing the Cancel command button. 
+; -----------------------------------------
+<cmdbuttons>
+[<<]<Dialog>
+[>>]<checkboxes>
+Command Buttons
+Select a command button to execute its
+command by using one of these procedures:
+
+  1. Click the button.
+  2. Press Alt+ the shortcut key.
+  3. Tab to the button and press Enter.
+; -----------------------------------------
+<checkboxes>
+[<<]<cmdbuttons>
+[>>]<optbuttons>
+Check Boxes
+A check box can be on [X] or off [ ].
+Toggle the check box with one of these
+procedures:
+
+  1. Click the check box.
+  2. Press Alt+ the shortcut key.
+; -----------------------------------------
+<optbuttons>
+[<<]<checkboxes>
+[>>]<editboxes>
+Option Buttons
+Option buttons are in groups of 2 or
+more. One option button in a group
+is on (\a) and the others are off ( ).
+Select the option button with one of
+these procedures:
+
+  1. Click the option button.
+  2. Press Alt+ the shortcut key.
+; -----------------------------------------
+<editboxes>
+[<<]<optbuttons>
+[>>]<listboxes>
+Edit Boxes
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<listboxes>
+[<<]<editboxes>
+[>>]<MultiSel>
+List Boxes
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<MultiSel>
+[<<]<listboxes>
+[>>]<combobox>
+Multiple-Selection Listboxes
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<combobox>
+[<<]<MultiSel>
+[>>]<spinbutton>
+Combo Boxes
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<spinbutton>
+[<<]<combobox>
+Spin Buttons
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<FileOpen>
+The File Open Dialog Box
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<SaveAs>
+The Save As Dialog Box
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<PrintSetup>
+The Print Setup Dialog Box
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<SearchTextDB>
+The Search Text Dialog Box
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<ReplaceTextDB>
+The Replace Text Dialog Box
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<MsgBox>
+The MsgBox Dialog Box
+
+     ======== Text needed =========
+
+; -----------------------------------------
+<Display>
+The Display Dialog Box
+
+     ======== Text needed =========
+
+    [..Title]<ID_TITLE>
+    [..Border]<ID_BORDER>
+    [..Status Bar]<ID_STATUSBAR>
+    [..Texture]<ID_TEXTURE>
+
+    [..Color]<ID_COLOR>
+    [..Mono]<ID_MONO>
+    [..Reverse]<ID_REVERSE>
+
+; -----------------------------------------
+<Windows>
+The Windows Dialog Box
+This dialog box lists all the open windows.
+Select one and choose OK to make that window
+the active one.
+; -----------------------------------------
+<Log>
+The Log Message Dialog Box
+
+     ======== Text needed =========
+
+; -----------------------------------------
+;
+;  Following are keyword reference definition windows
+;
+; -----------------------------------------
+<inactive>
+An inactive menu command is one that is, for
+the moment, not available. The command becomes
+active at another time when conditions within
+the program require or permit its use.
+; -----------------------------------------
+<shortcut>
+Function keys are key combinations that
+you can press to execute a menu command
+without selecting the pull-down menu 
+itself. Not all menu commands have 
+function keys. The most frequently used 
+operations do.
+; -----------------------------------------
+<logging>
+The message log is a debug tool. You should
+delete it from the system by turning off the
+INCLUDE_LOGGING global definition in dflat.h.
+You should then eliminate references to it in
+the MEMOPAD.TXT help database.
+; -----------------------------------------
+<MoreWins>
+A menu can have only so many selections.
+The length of the screen is the limiting
+factor. The CUA standard defines nine
+windows as the maximum number of windows
+that the Window menu can display. The 
+Windows menu has the More Windows command 
+to provide a way for you to choose from
+the rest of the document windows.
+; -----------------------------------------
+<API>
+Applications Program Interface (API):
+The functions, messages, macros, and 
+data structures that a programmer 
+uses to interface with the processes 
+of a function library.
+; -----------------------------------------
+<Block>
+Marking Text Blocks
+Marked text blocks affect the operation of these
+commands:
+
+    [..Cut]<ID_CUT>
+    [..Copy]<ID_COPY>
+    [..Paste]<ID_PASTE>
+    [..Clear]<ID_CLEAR>
+    [..Delete]<ID_DELETETEXT>
+    [..Paragraph]<ID_PARAGRAPH>
+
+Mark a text block by using one of these operations:
+
+   Keyboard:
+   ---------
+   Hold the Shift key down and move the
+   keyboard cursor. The block will be marked in
+   reverse video.
+
+   To clear the marked block, release the Shift 
+   key and press any text entry or cursor movement
+   key.
+
+   Mouse:
+   ------
+   Click on the first or last character of the 
+   block. Hold the mouse button down and move 
+   the mouse cursor around. The marked block
+   will follow the mouse cursor.
+
+   To clear the marked block, release the mouse
+   cursor and click anywhere.
+
+; -----------------------------------------
+<Clipboard>
+The Clipboard
+The Clipboard is a scratchpad where you can save
+text that can be pasted into a different location
+in the same or another document. You save text with
+the [..Copy]<ID_COPY> and [..Cut]<ID_CUT> commands, and you paste text into
+from the Clipboard into a document with the [..Paste]<ID_PASTE>
+command. 
+; -----------------------------------------
+<toggle>
+A toggle command is one that is
+either on or off. When it is on,
+its command on the menu is preceded
+by a check mark (û).
+<ID_CALENDAR>
+Calendar
+This command displays a calendar to demonstrate
+the use of the PICTUREBOX class to draw line
+vectors.
+<ID_BARCHART>
+Bar Chart
+This command displays a bar chart to demonstrate
+the use of the PICTUREBOX class to draw bars.
+<Calendar>
+Calendar
+This calendar is an example of a picture box
+with line vectors. The PgUp and PgDn keys
+will page through the months. You can close 
+the window from the [..System Menu]<sysmenu>.
+<BarChart>
+Bar Chart
+This window is an example of a bar chart. You 
+can close the window from the [..System Menu]<sysmenu>.
+<end>
diff --git a/rosapps/dflat32/editbox.c b/rosapps/dflat32/editbox.c
new file mode 100644 (file)
index 0000000..cb7dc47
--- /dev/null
@@ -0,0 +1,1113 @@
+/* ------------- editbox.c ------------ */
+#include "dflat.h"
+
+#define EditBufLen(wnd) (isMultiLine(wnd) ? EDITLEN : ENTRYLEN)
+#define SetLinePointer(wnd, ln) (wnd->CurrLine = ln)
+#define isWhite(c)     ((c)==' '||(c)=='\n')
+/* ---------- local prototypes ----------- */
+static void SaveDeletedText(DFWINDOW, char *, int);
+static void Forward(DFWINDOW);
+static void Backward(DFWINDOW);
+static void End(DFWINDOW);
+static void Home(DFWINDOW);
+static void Downward(DFWINDOW);
+static void Upward(DFWINDOW);
+static void StickEnd(DFWINDOW);
+static void NextWord(DFWINDOW);
+static void PrevWord(DFWINDOW);
+static void ModTextPointers(DFWINDOW, int, int);
+static void SetAnchor(DFWINDOW, int, int);
+/* -------- local variables -------- */
+static BOOL KeyBoardMarking, ButtonDown;
+static BOOL TextMarking;
+static int ButtonX, ButtonY;
+static int PrevY = -1;
+
+/* ----------- CREATE_WINDOW Message ---------- */
+static int CreateWindowMsg(DFWINDOW wnd)
+{
+    int rtn = BaseWndProc(EDITBOX, wnd, CREATE_WINDOW, 0, 0);
+    wnd->MaxTextLength = MAXTEXTLEN+1;
+    wnd->textlen = EditBufLen(wnd);
+    wnd->InsertMode = TRUE;
+       DfSendMessage(wnd, CLEARTEXT, 0, 0);
+    return rtn;
+}
+/* ----------- SETTEXT Message ---------- */
+static int SetTextMsg(DFWINDOW wnd, PARAM p1)
+{
+    int rtn = FALSE;
+    if (strlen((char *)p1) <= wnd->MaxTextLength)
+        rtn = BaseWndProc(EDITBOX, wnd, SETTEXT, p1, 0);
+    return rtn;
+}
+/* ----------- CLEARTEXT Message ------------ */
+static int ClearTextMsg(DFWINDOW wnd)
+{
+    int rtn = BaseWndProc(EDITBOX, wnd, CLEARTEXT, 0, 0);
+    unsigned blen = EditBufLen(wnd)+2;
+    wnd->text = DFrealloc(wnd->text, blen);
+    memset(wnd->text, 0, blen);
+    wnd->wlines = 0;
+    wnd->CurrLine = 0;
+    wnd->CurrCol = 0;
+    wnd->WndRow = 0;
+    wnd->wleft = 0;
+    wnd->wtop = 0;
+    wnd->textwidth = 0;
+    wnd->TextChanged = FALSE;
+    return rtn;
+}
+/* ----------- ADDTEXT Message ---------- */
+static int AddTextMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    int rtn = FALSE;
+    if (strlen((char *)p1)+wnd->textlen <= wnd->MaxTextLength) {
+        rtn = BaseWndProc(EDITBOX, wnd, ADDTEXT, p1, p2);
+        if (rtn != FALSE)    {
+            if (!isMultiLine(wnd))    {
+                wnd->CurrLine = 0;
+                wnd->CurrCol = strlen((char *)p1);
+                if (wnd->CurrCol >= ClientWidth(wnd))    {
+                    wnd->wleft = wnd->CurrCol-ClientWidth(wnd);
+                    wnd->CurrCol -= wnd->wleft;
+                }
+                wnd->BlkEndCol = wnd->CurrCol;
+                DfSendMessage(wnd, KEYBOARD_CURSOR,
+                                     WndCol, wnd->WndRow);
+            }
+        }
+    }
+    return rtn;
+}
+/* ----------- GETTEXT Message ---------- */
+static int GetTextMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    char *cp1 = (char *)p1;
+    char *cp2 = wnd->text;
+    if (cp2 != NULL)    {
+        while (p2-- && *cp2 && *cp2 != '\n')
+            *cp1++ = *cp2++;
+        *cp1 = '\0';
+        return TRUE;
+    }
+    return FALSE;
+}
+/* ----------- SETTEXTLENGTH Message ---------- */
+static int SetTextLengthMsg(DFWINDOW wnd, unsigned int len)
+{
+    if (++len < MAXTEXTLEN)    {
+        wnd->MaxTextLength = len;
+        if (len < wnd->textlen)    {
+            wnd->text=DFrealloc(wnd->text, len+2);
+            wnd->textlen = len;
+            *((wnd->text)+len) = '\0';
+            *((wnd->text)+len+1) = '\0';
+            BuildTextPointers(wnd);
+        }
+        return TRUE;
+    }
+    return FALSE;
+}
+/* ----------- KEYBOARD_CURSOR Message ---------- */
+static void KeyboardCursorMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    wnd->CurrCol = (int)p1 + wnd->wleft;
+    wnd->WndRow = (int)p2;
+    wnd->CurrLine = (int)p2 + wnd->wtop;
+    if (wnd == inFocus)        {
+               if (CharInView(wnd, (int)p1, (int)p2))
+               DfSendMessage(NULL, SHOW_CURSOR,
+                               (wnd->InsertMode && !TextMarking), 0);
+       else
+                       DfSendMessage(NULL, HIDE_CURSOR, 0, 0);
+       }
+}
+/* ----------- SIZE Message ---------- */
+int SizeMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    int rtn = BaseWndProc(EDITBOX, wnd, DFM_SIZE, p1, p2);
+    if (WndCol > ClientWidth(wnd)-1)
+        wnd->CurrCol = ClientWidth(wnd)-1 + wnd->wleft;
+    if (wnd->WndRow > ClientHeight(wnd)-1)    {
+        wnd->WndRow = ClientHeight(wnd)-1;
+        SetLinePointer(wnd, wnd->WndRow+wnd->wtop);
+    }
+    DfSendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
+    return rtn;
+}
+/* ----------- SCROLL Message ---------- */
+static int ScrollMsg(DFWINDOW wnd, PARAM p1)
+{
+    int rtn = FALSE;
+    if (isMultiLine(wnd))    {
+        rtn = BaseWndProc(EDITBOX,wnd,SCROLL,p1,0);
+        if (rtn != FALSE)    {
+            if (p1)    {
+                /* -------- scrolling up --------- */
+                if (wnd->WndRow == 0)    {
+                    wnd->CurrLine++;
+                    StickEnd(wnd);
+                }
+                else
+                    --wnd->WndRow;
+            }
+            else    {
+                /* -------- scrolling down --------- */
+                if (wnd->WndRow == ClientHeight(wnd)-1)    {
+                    if (wnd->CurrLine > 0)
+                        --wnd->CurrLine;
+                    StickEnd(wnd);
+                }
+                else
+                    wnd->WndRow++;
+            }
+            DfSendMessage(wnd,KEYBOARD_CURSOR,WndCol,wnd->WndRow);
+        }
+    }
+    return rtn;
+}
+/* ----------- HORIZSCROLL Message ---------- */
+static int HorizScrollMsg(DFWINDOW wnd, PARAM p1)
+{
+    int rtn = FALSE;
+    char *currchar = CurrChar;
+    if (!(p1 &&
+            wnd->CurrCol == wnd->wleft && *currchar == '\n'))  {
+        rtn = BaseWndProc(EDITBOX, wnd, HORIZSCROLL, p1, 0);
+        if (rtn != FALSE)    {
+            if (wnd->CurrCol < wnd->wleft)
+                wnd->CurrCol++;
+            else if (WndCol == ClientWidth(wnd))
+                --wnd->CurrCol;
+            DfSendMessage(wnd,KEYBOARD_CURSOR,WndCol,wnd->WndRow);
+        }
+    }
+    return rtn;
+}
+/* ----------- SCROLLPAGE Message ---------- */
+static int ScrollPageMsg(DFWINDOW wnd, PARAM p1)
+{
+    int rtn = FALSE;
+    if (isMultiLine(wnd))    {
+        rtn = BaseWndProc(EDITBOX, wnd, SCROLLPAGE, p1, 0);
+        SetLinePointer(wnd, wnd->wtop+wnd->WndRow);
+        StickEnd(wnd);
+        DfSendMessage(wnd, KEYBOARD_CURSOR,WndCol, wnd->WndRow);
+    }
+    return rtn;
+}
+/* ----------- HORIZSCROLLPAGE Message ---------- */
+static int HorizPageMsg(DFWINDOW wnd, PARAM p1)
+{
+    int rtn = BaseWndProc(EDITBOX, wnd, HORIZPAGE, p1, 0);
+    if ((int) p1 == FALSE)    {
+        if (wnd->CurrCol > wnd->wleft+ClientWidth(wnd)-1)
+            wnd->CurrCol = wnd->wleft+ClientWidth(wnd)-1;
+    }
+    else if (wnd->CurrCol < wnd->wleft)
+        wnd->CurrCol = wnd->wleft;
+    DfSendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
+    return rtn;
+}
+/* ----- Extend the marked block to the new x,y position ---- */
+static void ExtendBlock(DFWINDOW wnd, int x, int y)
+{
+    int bbl, bel;
+    int ptop = min(wnd->BlkBegLine, wnd->BlkEndLine);
+    int pbot = max(wnd->BlkBegLine, wnd->BlkEndLine);
+    char *lp = TextLine(wnd, wnd->wtop+y);
+    int len = (int) (strchr(lp, '\n') - lp);
+    x = max(0, min(x, len));
+    y = max(0, y);
+    wnd->BlkEndCol = min(len, x+wnd->wleft);
+    wnd->BlkEndLine = y+wnd->wtop;
+    DfSendMessage(wnd, KEYBOARD_CURSOR, wnd->BlkEndCol, wnd->BlkEndLine);
+    bbl = min(wnd->BlkBegLine, wnd->BlkEndLine);
+    bel = max(wnd->BlkBegLine, wnd->BlkEndLine);
+    while (ptop < bbl)    {
+        WriteTextLine(wnd, NULL, ptop, FALSE);
+        ptop++;
+    }
+    for (y = bbl; y <= bel; y++)
+        WriteTextLine(wnd, NULL, y, FALSE);
+    while (pbot > bel)    {
+        WriteTextLine(wnd, NULL, pbot, FALSE);
+        --pbot;
+    }
+}
+/* ----------- LEFT_BUTTON Message ---------- */
+static int LeftButtonMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    int MouseX = (int) p1 - GetClientLeft(wnd);
+    int MouseY = (int) p2 - GetClientTop(wnd);
+    DFRECT rc = ClientRect(wnd);
+    char *lp;
+    int len;
+    if (KeyBoardMarking)
+        return TRUE;
+    if (WindowMoving || WindowSizing)
+        return FALSE;
+    if (isMultiLine(wnd))    {
+        if (TextMarking)    {
+            if (!InsideRect(p1, p2, rc))    {
+                               int x = MouseX, y = MouseY;
+                               int dir;
+                               DFMESSAGE msg = 0;
+                if ((int)p2 == GetTop(wnd))
+                                       y++, dir = FALSE, msg = SCROLL;
+                else if ((int)p2 == GetBottom(wnd))
+                                       --y, dir = TRUE, msg = SCROLL;
+                else if ((int)p1 == GetLeft(wnd))
+                                       --x, dir = FALSE, msg = HORIZSCROLL;
+                else if ((int)p1 == GetRight(wnd))
+                                       x++, dir = TRUE, msg = HORIZSCROLL;
+                               if (msg != 0)   {
+                    if (DfSendMessage(wnd, msg, dir, 0))
+                        ExtendBlock(wnd, x, y);
+                       DfSendMessage(wnd, PAINT, 0, 0);
+                               }
+            }
+            return TRUE;
+        }
+        if (!InsideRect(p1, p2, rc))
+            return FALSE;
+        if (TextBlockMarked(wnd))    {
+            ClearTextBlock(wnd);
+            DfSendMessage(wnd, PAINT, 0, 0);
+        }
+        if (wnd->wlines)    {
+            if (MouseY > wnd->wlines-1)
+                return TRUE;
+            lp = TextLine(wnd, MouseY+wnd->wtop);
+            len = (int) (strchr(lp, '\n') - lp);
+            MouseX = min(MouseX, len);
+            if (MouseX < wnd->wleft)    {
+                MouseX = 0;
+                DfSendMessage(wnd, KEYBOARD, HOME, 0);
+            }
+            ButtonDown = TRUE;
+            ButtonX = MouseX;
+            ButtonY = MouseY;
+        }
+        else
+            MouseX = MouseY = 0;
+        wnd->WndRow = MouseY;
+        SetLinePointer(wnd, MouseY+wnd->wtop);
+    }
+    if (isMultiLine(wnd) ||
+        (!TextBlockMarked(wnd)
+            && (int)(MouseX+wnd->wleft) < (int)strlen(wnd->text)))
+        wnd->CurrCol = MouseX+wnd->wleft;
+    DfSendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
+    return TRUE;
+}
+/* ----------- MOUSE_MOVED Message ---------- */
+static int MouseMovedMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+    int MouseX = (int) p1 - GetClientLeft(wnd);
+    int MouseY = (int) p2 - GetClientTop(wnd);
+    DFRECT rc = ClientRect(wnd);
+    if (!InsideRect(p1, p2, rc))
+        return FALSE;
+    if (MouseY > wnd->wlines-1)
+        return FALSE;
+    if (ButtonDown)    {
+        SetAnchor(wnd, ButtonX+wnd->wleft, ButtonY+wnd->wtop);
+        TextMarking = TRUE;
+               rc = WindowRect(wnd);
+        DfSendMessage(NULL,MOUSE_TRAVEL,(PARAM) &rc, 0);
+        ButtonDown = FALSE;
+    }
+    if (TextMarking && !(WindowMoving || WindowSizing))    {
+        ExtendBlock(wnd, MouseX, MouseY);
+        return TRUE;
+    }
+    return FALSE;
+}
+static void StopMarking(DFWINDOW wnd)
+{
+    TextMarking = FALSE;
+    if (wnd->BlkBegLine > wnd->BlkEndLine)    {
+        swap(wnd->BlkBegLine, wnd->BlkEndLine);
+        swap(wnd->BlkBegCol, wnd->BlkEndCol);
+    }
+    if (wnd->BlkBegLine == wnd->BlkEndLine &&
+            wnd->BlkBegCol > wnd->BlkEndCol)
+        swap(wnd->BlkBegCol, wnd->BlkEndCol);
+}
+/* ----------- BUTTON_RELEASED Message ---------- */
+static int ButtonReleasedMsg(DFWINDOW wnd)
+{
+    if (isMultiLine(wnd))    {
+        ButtonDown = FALSE;
+        if (TextMarking && !(WindowMoving || WindowSizing))  {
+            /* release the mouse ouside the edit box */
+            DfSendMessage(NULL, MOUSE_TRAVEL, 0, 0);
+            StopMarking(wnd);
+            return TRUE;
+        }
+        else
+            PrevY = -1;
+    }
+    return FALSE;
+}
+/* ---- Process text block keys for multiline text box ---- */
+static void DoMultiLines(DFWINDOW wnd, int c, PARAM p2)
+{
+    if (isMultiLine(wnd) && !KeyBoardMarking)    {
+        if ((int)p2 & (LEFTSHIFT | RIGHTSHIFT))    {
+            switch (c)    {
+                case HOME:
+                case CTRL_HOME:
+                case CTRL_BS:
+                case PGUP:
+                case CTRL_PGUP:
+                case UP:
+                case BS:
+                case END:
+                case CTRL_END:
+                case PGDN:
+                case CTRL_PGDN:
+                case DN:
+                case FWD:
+                case CTRL_FWD:
+                    KeyBoardMarking = TextMarking = TRUE;
+                    SetAnchor(wnd, wnd->CurrCol, wnd->CurrLine);
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+}
+/* ---------- page/scroll keys ----------- */
+static int DoScrolling(DFWINDOW wnd, int c, PARAM p2)
+{
+    switch (c)    {
+        case PGUP:
+        case PGDN:
+            if (isMultiLine(wnd))
+                BaseWndProc(EDITBOX, wnd, KEYBOARD, c, p2);
+            break;
+        case CTRL_PGUP:
+        case CTRL_PGDN:
+            BaseWndProc(EDITBOX, wnd, KEYBOARD, c, p2);
+            break;
+        case HOME:
+            Home(wnd);
+            break;
+        case END:
+            End(wnd);
+            break;
+        case CTRL_FWD:
+            NextWord(wnd);
+            break;
+        case CTRL_BS:
+            PrevWord(wnd);
+            break;
+        case CTRL_HOME:
+            if (isMultiLine(wnd))    {
+                DfSendMessage(wnd, SCROLLDOC, TRUE, 0);
+                wnd->CurrLine = 0;
+                wnd->WndRow = 0;
+            }
+            Home(wnd);
+            break;
+        case CTRL_END:
+                       if (isMultiLine(wnd) &&
+                                       wnd->WndRow+wnd->wtop+1 < wnd->wlines
+                                               && wnd->wlines > 0) {
+                DfSendMessage(wnd, SCROLLDOC, FALSE, 0);
+                SetLinePointer(wnd, wnd->wlines-1);
+                wnd->WndRow =
+                    min(ClientHeight(wnd)-1, wnd->wlines-1);
+                Home(wnd);
+            }
+            End(wnd);
+            break;
+        case UP:
+            if (isMultiLine(wnd))
+                Upward(wnd);
+            break;
+        case DN:
+            if (isMultiLine(wnd))
+                Downward(wnd);
+            break;
+        case FWD:
+            Forward(wnd);
+            break;
+        case BS:
+            Backward(wnd);
+            break;
+        default:
+            return FALSE;
+    }
+    if (!KeyBoardMarking && TextBlockMarked(wnd))    {
+        ClearTextBlock(wnd);
+        DfSendMessage(wnd, PAINT, 0, 0);
+    }
+    DfSendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
+    return TRUE;
+}
+/* -------------- Del key ---------------- */
+static void DelKey(DFWINDOW wnd)
+{
+    char *currchar = CurrChar;
+    int repaint = *currchar == '\n';
+    if (TextBlockMarked(wnd))    {
+        DfSendMessage(wnd, DFM_COMMAND, ID_DELETETEXT, 0);
+        DfSendMessage(wnd, PAINT, 0, 0);
+        return;
+    }
+    if (isMultiLine(wnd) && *currchar == '\n' && *(currchar+1) == '\0')
+        return;
+    strcpy(currchar, currchar+1);
+    if (repaint)    {
+        BuildTextPointers(wnd);
+        DfSendMessage(wnd, PAINT, 0, 0);
+    }
+    else    {
+        ModTextPointers(wnd, wnd->CurrLine+1, -1);
+        WriteTextLine(wnd, NULL, wnd->WndRow+wnd->wtop, FALSE);
+    }
+    wnd->TextChanged = TRUE;
+}
+/* ------------ Tab key ------------ */
+static void TabKey(DFWINDOW wnd, PARAM p2)
+{
+    if (isMultiLine(wnd))    {
+        int insmd = wnd->InsertMode;
+        do  {
+            char *cc = CurrChar+1;
+            if (!insmd && *cc == '\0')
+                break;
+            if (wnd->textlen == wnd->MaxTextLength)
+                break;
+            DfSendMessage(wnd,KEYBOARD,insmd ? ' ' : FWD,0);
+        } while (wnd->CurrCol % cfg.Tabs);
+    }
+       else
+           DfPostMessage(GetParent(wnd), KEYBOARD, '\t', p2);
+}
+/* ------------ Shift+Tab key ------------ */
+static void ShiftTabKey(DFWINDOW wnd, PARAM p2)
+{
+    if (isMultiLine(wnd))    {
+        do  {
+            if (CurrChar == GetText(wnd))
+                break;
+            DfSendMessage(wnd,KEYBOARD,BS,0);
+        } while (wnd->CurrCol % cfg.Tabs);
+    }
+       else
+           DfPostMessage(GetParent(wnd), KEYBOARD, SHIFT_HT, p2);
+}
+/* --------- All displayable typed keys ------------- */
+static void KeyTyped(DFWINDOW wnd, int c)
+{
+    char *currchar = CurrChar;
+    if ((c != '\n' && c < ' ') || (c & 0x1000))
+        /* ---- not recognized by editor --- */
+        return;
+    if (!isMultiLine(wnd) && TextBlockMarked(wnd))    {
+               DfSendMessage(wnd, CLEARTEXT, 0, 0);
+        currchar = CurrChar;
+    }
+    /* ---- test typing at end of text ---- */
+    if (currchar == wnd->text+wnd->MaxTextLength)    {
+        /* ---- typing at the end of maximum buffer ---- */
+        beep();
+        return;
+    }
+    if (*currchar == '\0')    {
+        /* --- insert a newline at end of text --- */
+        *currchar = '\n';
+        *(currchar+1) = '\0';
+        BuildTextPointers(wnd);
+    }
+    /* --- displayable char or newline --- */
+    if (c == '\n' || wnd->InsertMode || *currchar == '\n') {
+        /* ------ inserting the keyed character ------ */
+        if (wnd->text[wnd->textlen-1] != '\0')    {
+            /* --- the current text buffer is full --- */
+            if (wnd->textlen == wnd->MaxTextLength)    {
+                /* --- text buffer is at maximum size --- */
+                beep();
+                return;
+            }
+            /* ---- increase the text buffer size ---- */
+            wnd->textlen += GROWLENGTH;
+            /* --- but not above maximum size --- */
+            if (wnd->textlen > wnd->MaxTextLength)
+                wnd->textlen = wnd->MaxTextLength;
+            wnd->text = DFrealloc(wnd->text, wnd->textlen+2);
+            wnd->text[wnd->textlen-1] = '\0';
+            currchar = CurrChar;
+        }
+        memmove(currchar+1, currchar, strlen(currchar)+1);
+        ModTextPointers(wnd, wnd->CurrLine+1, 1);
+        if (isMultiLine(wnd) && wnd->wlines > 1)
+            wnd->textwidth = max(wnd->textwidth,
+                (int) (TextLine(wnd, wnd->CurrLine+1)-
+                TextLine(wnd, wnd->CurrLine)));
+        else
+            wnd->textwidth = max((int)wnd->textwidth,
+                (int)strlen(wnd->text));
+        WriteTextLine(wnd, NULL,
+            wnd->wtop+wnd->WndRow, FALSE);
+    }
+    /* ----- put the char in the buffer ----- */
+    *currchar = c;
+    wnd->TextChanged = TRUE;
+    if (c == '\n')    {
+        wnd->wleft = 0;
+        BuildTextPointers(wnd);
+        End(wnd);
+        Forward(wnd);
+        DfSendMessage(wnd, PAINT, 0, 0);
+        return;
+    }
+    /* ---------- test end of window --------- */
+    if (WndCol == ClientWidth(wnd)-1)    {
+        if (!isMultiLine(wnd)) {
+                       if (!(currchar == wnd->text+wnd->MaxTextLength-2))
+            DfSendMessage(wnd, HORIZSCROLL, TRUE, 0);
+               }
+               else    {
+                       char *cp = currchar;
+               while (*cp != ' ' && cp != TextLine(wnd, wnd->CurrLine))
+                   --cp;
+               if (cp == TextLine(wnd, wnd->CurrLine) ||
+                       !wnd->WordWrapMode)
+                   DfSendMessage(wnd, HORIZSCROLL, TRUE, 0);
+               else    {
+                   int dif = 0;
+                   if (c != ' ')    {
+                       dif = (int) (currchar - cp);
+                       wnd->CurrCol -= dif;
+                       DfSendMessage(wnd, KEYBOARD, DEL, 0);
+                       --dif;
+                   }
+                   DfSendMessage(wnd, KEYBOARD, '\n', 0);
+                   currchar = CurrChar;
+                   wnd->CurrCol = dif;
+                   if (c == ' ')
+                       return;
+               }
+           }
+       }
+    /* ------ display the character ------ */
+    SetStandardColor(wnd);
+    PutWindowChar(wnd, c, WndCol, wnd->WndRow);
+    /* ----- advance the pointers ------ */
+    wnd->CurrCol++;
+}
+/* ------------ screen changing key strokes ------------- */
+static void DoKeyStroke(DFWINDOW wnd, int c, PARAM p2)
+{
+    switch (c)    {
+        case RUBOUT:
+                       if (wnd->CurrCol == 0 && wnd->CurrLine == 0)
+                               break;
+            Backward(wnd);
+        case DEL:
+            DelKey(wnd);
+            break;
+        case SHIFT_HT:
+            ShiftTabKey(wnd, p2);
+            break;
+        case '\t':
+            TabKey(wnd, p2);
+            break;
+        case '\r':
+            if (!isMultiLine(wnd))    {
+                DfPostMessage(GetParent(wnd), KEYBOARD, c, p2);
+                break;
+            }
+            c = '\n';
+        default:
+            if (TextBlockMarked(wnd))    {
+                DfSendMessage(wnd, DFM_COMMAND, ID_DELETETEXT, 0);
+                DfSendMessage(wnd, PAINT, 0, 0);
+            }
+            KeyTyped(wnd, c);
+            break;
+    }
+}
+/* ----------- KEYBOARD Message ---------- */
+static int KeyboardMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+       int c = (int) p1;
+
+       if (WindowMoving || WindowSizing || ((int)p2 & ALTKEY))
+               return FALSE;
+
+       switch (c)
+       {
+               /* these keys get processed by lower classes */
+               case ESC:
+               case F1:
+               case F2:
+               case F3:
+               case F4:
+               case F5:
+               case F6:
+               case F7:
+               case F8:
+               case F9:
+               case F10:
+               case INS:
+               case SHIFT_INS:
+               case SHIFT_DEL:
+                       return FALSE;
+
+               /* these keys get processed here */
+               case CTRL_FWD:
+               case CTRL_BS:
+               case CTRL_HOME:
+               case CTRL_END:
+               case CTRL_PGUP:
+               case CTRL_PGDN:
+                       break;
+
+               default:
+                       /* other ctrl keys get processed by lower classes */
+                       if ((int)p2 & CTRLKEY)
+                               return FALSE;
+                       /* all other keys get processed here */
+                       break;
+       }
+
+       DoMultiLines(wnd, c, p2);
+       if (DoScrolling(wnd, c, p2))
+       {
+               if (KeyBoardMarking)
+                       ExtendBlock(wnd, WndCol, wnd->WndRow);
+       }
+       else if (!TestAttribute(wnd, READONLY))
+       {
+               DoKeyStroke(wnd, c, p2);
+               DfSendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
+       }
+       else
+               beep();
+
+       return TRUE;
+}
+
+/* ----------- SHIFT_CHANGED Message ---------- */
+static void ShiftChangedMsg(DFWINDOW wnd, PARAM p1)
+{
+    if (!((int)p1 & (LEFTSHIFT | RIGHTSHIFT)) &&
+                                   KeyBoardMarking)    {
+        StopMarking(wnd);
+        KeyBoardMarking = FALSE;
+    }
+}
+/* ----------- ID_DELETETEXT Command ---------- */
+static void DeleteTextCmd(DFWINDOW wnd)
+{
+    if (TextBlockMarked(wnd))    {
+        char *bbl=TextLine(wnd,wnd->BlkBegLine)+wnd->BlkBegCol;
+        char *bel=TextLine(wnd,wnd->BlkEndLine)+wnd->BlkEndCol;
+        int len = (int) (bel - bbl);
+        SaveDeletedText(wnd, bbl, len);
+        wnd->TextChanged = TRUE;
+        strcpy(bbl, bel);
+        wnd->CurrLine = TextLineNumber(wnd, bbl-wnd->BlkBegCol);
+        wnd->CurrCol = wnd->BlkBegCol;
+        wnd->WndRow = wnd->BlkBegLine - wnd->wtop;
+        if (wnd->WndRow < 0)    {
+            wnd->wtop = wnd->BlkBegLine;
+            wnd->WndRow = 0;
+        }
+        DfSendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
+        ClearTextBlock(wnd);
+        BuildTextPointers(wnd);
+    }
+}
+/* ----------- ID_CLEAR Command ---------- */
+static void ClearCmd(DFWINDOW wnd)
+{
+    if (TextBlockMarked(wnd))    {
+        char *bbl=TextLine(wnd,wnd->BlkBegLine)+wnd->BlkBegCol;
+        char *bel=TextLine(wnd,wnd->BlkEndLine)+wnd->BlkEndCol;
+        int len = (int) (bel - bbl);
+        SaveDeletedText(wnd, bbl, len);
+        wnd->CurrLine = TextLineNumber(wnd, bbl);
+        wnd->CurrCol = wnd->BlkBegCol;
+        wnd->WndRow = wnd->BlkBegLine - wnd->wtop;
+        if (wnd->WndRow < 0)    {
+            wnd->WndRow = 0;
+            wnd->wtop = wnd->BlkBegLine;
+        }
+        /* ------ change all text lines in block to \n ----- */
+        while (bbl < bel)    {
+            char *cp = strchr(bbl, '\n');
+            if (cp > bel)
+                cp = bel;
+            strcpy(bbl, cp);
+            bel -= (int) (cp - bbl);
+            bbl++;
+        }
+        ClearTextBlock(wnd);
+        BuildTextPointers(wnd);
+        DfSendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
+        wnd->TextChanged = TRUE;
+    }
+}
+/* ----------- ID_UNDO Command ---------- */
+static void UndoCmd(DFWINDOW wnd)
+{
+    if (wnd->DeletedText != NULL)    {
+        PasteText(wnd, wnd->DeletedText, wnd->DeletedLength);
+        free(wnd->DeletedText);
+        wnd->DeletedText = NULL;
+        wnd->DeletedLength = 0;
+        DfSendMessage(wnd, PAINT, 0, 0);
+    }
+}
+/* ----------- ID_PARAGRAPH Command ---------- */
+static void ParagraphCmd(DFWINDOW wnd)
+{
+    int bc, fl;
+    char *bl, *bbl, *bel, *bb;
+
+    ClearTextBlock(wnd);
+    /* ---- forming paragraph from cursor position --- */
+    fl = wnd->wtop + wnd->WndRow;
+    bbl = bel = bl = TextLine(wnd, wnd->CurrLine);
+    if ((bc = wnd->CurrCol) >= ClientWidth(wnd))
+        bc = 0;
+    Home(wnd);
+    /* ---- locate the end of the paragraph ---- */
+    while (*bel)    {
+        int blank = TRUE;
+        char *bll = bel;
+        /* --- blank line marks end of paragraph --- */
+        while (*bel && *bel != '\n')    {
+            if (*bel != ' ')
+                blank = FALSE;
+            bel++;
+        }
+        if (blank)    {
+            bel = bll;
+            break;
+        }
+        if (*bel)
+            bel++;
+    }
+    if (bel == bbl)    {
+        DfSendMessage(wnd, KEYBOARD, DN, 0);
+        return;
+    }
+    if (*bel == '\0')
+        --bel;
+    if (*bel == '\n')
+        --bel;
+    /* --- change all newlines in block to spaces --- */
+    while (CurrChar < bel)    {
+        if (*CurrChar == '\n')    {
+            *CurrChar = ' ';
+            wnd->CurrLine++;
+            wnd->CurrCol = 0;
+        }
+        else
+            wnd->CurrCol++;
+    }
+    /* ---- insert newlines at new margin boundaries ---- */
+    bb = bbl;
+    while (bbl < bel)    {
+        bbl++;
+        if ((int)(bbl - bb) == ClientWidth(wnd)-1)    {
+            while (*bbl != ' ' && bbl > bb)
+                --bbl;
+            if (*bbl != ' ')    {
+                bbl = strchr(bbl, ' ');
+                if (bbl == NULL || bbl >= bel)
+                    break;
+            }
+            *bbl = '\n';
+            bb = bbl+1;
+        }
+    }
+    BuildTextPointers(wnd);
+    /* --- put cursor back at beginning --- */
+    wnd->CurrLine = TextLineNumber(wnd, bl);
+    wnd->CurrCol = bc;
+    if (fl < wnd->wtop)
+        wnd->wtop = fl;
+    wnd->WndRow = fl - wnd->wtop;
+    DfSendMessage(wnd, PAINT, 0, 0);
+    DfSendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
+    wnd->TextChanged = TRUE;
+    BuildTextPointers(wnd);
+}
+/* ----------- COMMAND Message ---------- */
+static int CommandMsg(DFWINDOW wnd, PARAM p1)
+{
+    switch ((int)p1)    {
+        case ID_DELETETEXT:
+            DeleteTextCmd(wnd);
+            return TRUE;
+        case ID_CLEAR:
+            ClearCmd(wnd);
+            return TRUE;
+        case ID_UNDO:
+            UndoCmd(wnd);
+            return TRUE;
+        case ID_PARAGRAPH:
+            ParagraphCmd(wnd);
+            return TRUE;
+        default:
+            break;
+    }
+    return FALSE;
+}
+/* ---------- CLOSE_WINDOW Message ----------- */
+static int CloseWindowMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
+{
+       int rtn;
+    DfSendMessage(NULL, HIDE_CURSOR, 0, 0);
+    if (wnd->DeletedText != NULL)
+        free(wnd->DeletedText);
+       if (wnd->text != NULL)
+       {
+               free(wnd->text);
+               wnd->text = NULL;
+       }
+    rtn = BaseWndProc(EDITBOX, wnd, CLOSE_WINDOW, p1, p2);
+    return rtn;
+}
+
+/* ------- Window processing module for EDITBOX class ------ */
+int EditBoxProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
+{
+    int rtn;
+    switch (msg)    {
+        case CREATE_WINDOW:
+            return CreateWindowMsg(wnd);
+        case ADDTEXT:
+            return AddTextMsg(wnd, p1, p2);
+        case SETTEXT:
+            return SetTextMsg(wnd, p1);
+        case CLEARTEXT:
+                       return ClearTextMsg(wnd);
+        case GETTEXT:
+            return GetTextMsg(wnd, p1, p2);
+        case SETTEXTLENGTH:
+            return SetTextLengthMsg(wnd, (unsigned) p1);
+        case KEYBOARD_CURSOR:
+            KeyboardCursorMsg(wnd, p1, p2);
+                       return TRUE;
+        case SETFOCUS:
+                       if (!(int)p1)
+                               DfSendMessage(NULL, HIDE_CURSOR, 0, 0);
+        case PAINT:
+        case MOVE:
+            rtn = BaseWndProc(EDITBOX, wnd, msg, p1, p2);
+            DfSendMessage(wnd,KEYBOARD_CURSOR,WndCol,wnd->WndRow);
+            return rtn;
+        case DFM_SIZE:
+            return SizeMsg(wnd, p1, p2);
+        case SCROLL:
+            return ScrollMsg(wnd, p1);
+        case HORIZSCROLL:
+            return HorizScrollMsg(wnd, p1);
+        case SCROLLPAGE:
+            return ScrollPageMsg(wnd, p1);
+        case HORIZPAGE:
+            return HorizPageMsg(wnd, p1);
+        case LEFT_BUTTON:
+            if (LeftButtonMsg(wnd, p1, p2))
+                return TRUE;
+            break;
+        case MOUSE_MOVED:
+            if (MouseMovedMsg(wnd, p1, p2))
+                return TRUE;
+            break;
+        case DFM_BUTTON_RELEASED:
+            if (ButtonReleasedMsg(wnd))
+                return TRUE;
+            break;
+        case KEYBOARD:
+            if (KeyboardMsg(wnd, p1, p2))
+                return TRUE;
+            break;
+        case SHIFT_CHANGED:
+            ShiftChangedMsg(wnd, p1);
+            break;
+        case DFM_COMMAND:
+            if (CommandMsg(wnd, p1))
+                return TRUE;
+            break;
+        case CLOSE_WINDOW:
+            return CloseWindowMsg(wnd, p1, p2);
+        default:
+            break;
+    }
+    return BaseWndProc(EDITBOX, wnd, msg, p1, p2);
+}
+/* ------ save deleted text for the Undo command ------ */
+static void SaveDeletedText(DFWINDOW wnd, char *bbl, int len)
+{
+    wnd->DeletedLength = len;
+    wnd->DeletedText=DFrealloc(wnd->DeletedText,len);
+    memmove(wnd->DeletedText, bbl, len);
+}
+/* ---- cursor right key: right one character position ---- */
+static void Forward(DFWINDOW wnd)
+{
+    char *cc = CurrChar+1;
+    if (*cc == '\0')
+        return;
+    if (*CurrChar == '\n')    {
+        Home(wnd);
+        Downward(wnd);
+    }
+    else    {
+        wnd->CurrCol++;
+        if (WndCol == ClientWidth(wnd))
+            DfSendMessage(wnd, HORIZSCROLL, TRUE, 0);
+    }
+}
+/* ----- stick the moving cursor to the end of the line ---- */
+static void StickEnd(DFWINDOW wnd)
+{
+    char *cp = TextLine(wnd, wnd->CurrLine);
+    char *cp1 = strchr(cp, '\n');
+    int len = cp1 ? (int) (cp1 - cp) : 0;
+    wnd->CurrCol = min(len, wnd->CurrCol);
+    if (wnd->wleft > wnd->CurrCol)    {
+        wnd->wleft = max(0, wnd->CurrCol - 4);
+        DfSendMessage(wnd, PAINT, 0, 0);
+    }
+    else if (wnd->CurrCol-wnd->wleft >= ClientWidth(wnd))    {
+        wnd->wleft = wnd->CurrCol - (ClientWidth(wnd)-1);
+        DfSendMessage(wnd, PAINT, 0, 0);
+    }
+}
+/* --------- cursor down key: down one line --------- */
+static void Downward(DFWINDOW wnd)
+{
+    if (isMultiLine(wnd) &&
+            wnd->WndRow+wnd->wtop+1 < wnd->wlines)  {
+        wnd->CurrLine++;
+        if (wnd->WndRow == ClientHeight(wnd)-1)
+            BaseWndProc(EDITBOX, wnd, SCROLL, TRUE, 0);
+        else
+            wnd->WndRow++;
+        StickEnd(wnd);
+    }
+}
+/* -------- cursor up key: up one line ------------ */
+static void Upward(DFWINDOW wnd)
+{
+    if (isMultiLine(wnd) && wnd->CurrLine != 0)    {
+        --wnd->CurrLine;
+        if (wnd->WndRow == 0)
+            BaseWndProc(EDITBOX, wnd, SCROLL, FALSE, 0);
+        else
+            --wnd->WndRow;
+        StickEnd(wnd);
+    }
+}
+/* ---- cursor left key: left one character position ---- */