⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 applicat.c

📁 edit 0.82 freedos中的文本编辑器
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ------------- applicat.c ------------- */

#include "dflat.h"

static int ScreenHeight;
static BOOL DisplayModified=FALSE;
WINDOW ApplicationWindow;

extern DBOX Display;

#ifdef INCLUDE_MULTI_WINDOWS
extern DBOX Windows;
#endif

#ifdef INCLUDE_LOGGING
extern DBOX Log;
#endif

#ifdef INCLUDE_SHELLDOS
static void ShellDOS(WINDOW);
#endif
static void CreateMenu(WINDOW);
static void CreateStatusBar(WINDOW);
static void SelectColors(WINDOW);
static void SetScreenHeight(int);
static void SelectLines(WINDOW);
static void SelectLoadBlank(void);

#ifdef INCLUDE_WINDOWOPTIONS
static void SelectTexture(void);
static void SelectBorder(WINDOW);
static void SelectTitle(WINDOW);
static void SelectStatusBar(WINDOW);
#endif

static WINDOW oldFocus;
#ifdef INCLUDE_MULTI_WINDOWS
static void CloseAll(WINDOW, int);
static void MoreWindows(WINDOW);
static void ChooseWindow(WINDOW, int);
static int WindowSel;
static char *Menus[9]={
    "~1.                      ",
    "~2.                      ",
    "~3.                      ",
    "~4.                      ",
    "~5.                      ",
    "~6.                      ",
    "~7.                      ",
    "~8.                      ",
    "~9.                      "
};
#endif

static char Cwd[65];

#ifdef ENABLEGLOBALARGV
char **Argv;
#endif

/* --------------- CREATE_WINDOW Message -------------- */
static int CreateWindowMsg(WINDOW wnd)
{
    int rtn;

    ApplicationWindow=wnd;
    ScreenHeight=SCREENHEIGHT;
    getcwd(Cwd, 64);
    if (!DisplayModified)
        {
       	int i;
       	CTLWINDOW *ct, *ct1;

        ct=FindCommand(&Display, ID_SNOWY, CHECKBOX);
    	if (!isVGA())
            {
            /* ---- Modify Display Dialog Box for EGA, CGA ---- */
            if (isEGA())
                ct1=FindCommand(&Display,ID_50LINES,RADIOBUTTON);
            else
                {
            	CTLWINDOW *ct2;

                ct2=FindCommand(&Display,ID_COLOR,RADIOBUTTON)-1;
                if (ct2)
                    {
                    ct2->dwnd.w++;
                    for (i=0;i<7;i++)
                        (ct2+i)->dwnd.x += 8;

                    }

                ct1=FindCommand(&Display,ID_25LINES,RADIOBUTTON)-1;
        	}

            if (ct && ct1)
                for (i=0;i<6;i++)
                    *ct1++ = *ct++;

            }

    	if (isVGA() || isEGA())
            {
            /* Eliminate the snowy check box */
            ct=FindCommand(&Display, ID_SNOWY, CHECKBOX);
            if (ct != NULL)
                for (i=0;i<4;i++)
                    *(ct+i) = *(ct+2+i);

            }

        DisplayModified=TRUE;
        }
#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
    if (cfg.mono==1)
        PushRadioButton(&Display, ID_MONO);
    else if (cfg.mono==2)
        PushRadioButton(&Display, ID_REVERSE);
    else
        PushRadioButton(&Display, ID_COLOR);
    if (cfg.ScreenLines==25)
        PushRadioButton(&Display, ID_25LINES);
    else if (cfg.ScreenLines==43)
        PushRadioButton(&Display, ID_43LINES);
    else if (cfg.ScreenLines==50)
        PushRadioButton(&Display, ID_50LINES);
    if (cfg.snowy)
        SetCheckBox(&Display, ID_SNOWY);
    if (cfg.loadblank)
        SetCheckBox(&Display, ID_LOADBLANK);
    if (SCREENHEIGHT != cfg.ScreenLines)
        {
        SetScreenHeight(cfg.ScreenLines);
        if (WindowHeight(wnd)==ScreenHeight || SCREENHEIGHT-1 < GetBottom(wnd))
            {
            WindowHeight(wnd)=SCREENHEIGHT;
            GetBottom(wnd)=GetTop(wnd)+WindowHeight(wnd)-1;
            wnd->RestoredRC=WindowRect(wnd);
            }

        }

    SelectColors(wnd);
#ifdef INCLUDE_WINDOWOPTIONS
    SelectBorder(wnd);
    SelectTitle(wnd);
    SelectStatusBar(wnd);
#endif
    rtn=BaseWndProc(APPLICATION, wnd, CREATE_WINDOW, 0, 0);
    if (wnd->extension != NULL)
        CreateMenu(wnd);

    CreateStatusBar(wnd);
    SendMessage(NULL, SHOW_MOUSE, 0, 0);
    return rtn;

}

/* --------- ADDSTATUS Message ---------- */
static void AddStatusMsg(WINDOW wnd, PARAM p1)
{
    if (wnd->StatusBar != NULL)
        {
        if (p1 && *(char *)p1)
            SendMessage(wnd->StatusBar, SETTEXT, p1, 0);
        else 
            SendMessage(wnd->StatusBar, CLEARTEXT, 0, 0);

        SendMessage(wnd->StatusBar, PAINT, 0, 0);
        }

}

/* -------- SETFOCUS Message -------- */
static void SetFocusMsg(WINDOW wnd, BOOL p1)
{
    if (p1)
        SendMessage(inFocus, SETFOCUS, FALSE, 0);

    inFocus=p1 ? wnd : NULL;
    SendMessage(NULL, HIDE_CURSOR, 0, 0);
    if (isVisible(wnd))
        SendMessage(wnd, BORDER, 0, 0);
    else 
        SendMessage(wnd, SHOW_WINDOW, 0, 0);

}

/* ------- SIZE Message -------- */
static void SizeMsg(WINDOW wnd, PARAM p1, PARAM p2)
{
    BOOL WasVisible;

    WasVisible=isVisible(wnd);
    if (WasVisible)
        SendMessage(wnd, HIDE_WINDOW, 0, 0);

    if (p1-GetLeft(wnd) < 30)
        p1=GetLeft(wnd)+30;

    BaseWndProc(APPLICATION, wnd, SIZE, p1, p2);
    CreateMenu(wnd);
    CreateStatusBar(wnd);
    if (WasVisible)
        SendMessage(wnd, SHOW_WINDOW, 0, 0);

}

/* ----------- KEYBOARD Message ------------ */
static int KeyboardMsg(WINDOW wnd, PARAM p1, PARAM p2)
{
    if (WindowMoving || WindowSizing || (int) p1==F1)
        return BaseWndProc(APPLICATION, wnd, KEYBOARD, p1, p2);

    switch ((int) p1)
        {
        case ALT_F4:
            if (TestAttribute(wnd, CONTROLBOX))
                PostMessage(wnd, CLOSE_WINDOW, 0, 0);

            return TRUE;
#ifdef INCLUDE_MULTI_WINDOWS
        case ALT_F6:
            SetNextFocus();
            return TRUE;
#endif
        case ALT_HYPHEN:
            if (TestAttribute(wnd, CONTROLBOX))
                BuildSystemMenu(wnd);

            return TRUE;
        default:
            break;

        }

    PostMessage(wnd->MenuBarWnd, KEYBOARD, p1, p2);
    return TRUE;

}

/* --------- SHIFT_CHANGED Message -------- */
static void ShiftChangedMsg(WINDOW wnd, PARAM p1)
{
    extern BOOL AltDown;
    if ((int)p1 & ALTKEY)
        AltDown=TRUE;
    else if (AltDown)
        {
        AltDown=FALSE;
        if (wnd->MenuBarWnd != inFocus)
            SendMessage(NULL, HIDE_CURSOR, 0, 0);

        SendMessage(wnd->MenuBarWnd, KEYBOARD, F10, 0);
        }

}

/* -------- COMMAND Message ------- */
static void CommandMsg(WINDOW 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 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:
            PostMessage(wnd, CLOSE_WINDOW, 0, 0);
            break;
        case ID_DISPLAY:
            if (DialogBox(wnd, &Display, TRUE, NULL))
                {
                if (inFocus==wnd->MenuBarWnd || inFocus==wnd->StatusBar)
                    oldFocus=ApplicationWindow;
                else 
                    oldFocus=inFocus;

                SendMessage(wnd, HIDE_WINDOW, 0, 0);
                SelectColors(wnd);
                SelectLines(wnd);
                SelectLoadBlank();
#ifdef INCLUDE_WINDOWOPTIONS
                SelectBorder(wnd);
                SelectTitle(wnd);
                SelectStatusBar(wnd);
                SelectTexture();
#endif
                CreateMenu(wnd);
                CreateStatusBar(wnd);
                SendMessage(wnd, SHOW_WINDOW, 0, 0);
                SendMessage(oldFocus, SETFOCUS, TRUE, 0);
                }
            break;
        case ID_SAVEOPTIONS:
            SaveConfig();
            break;
#ifdef INCLUDE_MULTI_WINDOWS
        case ID_WINDOW:
            ChooseWindow(wnd, CurrentMenuSelection-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, COMMAND, p1, p2);
            break;
        default:
            if (inFocus != wnd->MenuBarWnd && inFocus != wnd)
                PostMessage(inFocus, COMMAND, p1, p2);

            break;

        }

}

/* --------- CLOSE_WINDOW Message -------- */
static int CloseWindowMsg(WINDOW wnd)
{
    int rtn;
#ifdef INCLUDE_MULTI_WINDOWS
    CloseAll(wnd, TRUE);
    WindowSel=0;
#endif
    PostMessage(NULL, STOP, 0, 0);
    rtn=BaseWndProc(APPLICATION, wnd, CLOSE_WINDOW, 0, 0);
    if (ScreenHeight != SCREENHEIGHT)
        SetScreenHeight(ScreenHeight);

    UnLoadHelpFile();
    DisplayModified=FALSE;
    ApplicationWindow=NULL;
    setdisk(toupper(*Cwd) - 'A');
    chdir(Cwd+2);
    return rtn;

}

/* --- APPLICATION Window Class window processing module --- */
int ApplicationProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
{
    switch (msg)
        {
        case CREATE_WINDOW:
            return CreateWindowMsg(wnd);
        case 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 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))
                {
                int cl=cfg.Texture ? APPLCHAR : ' ';

                ClearWindow(wnd, (RECT *)p1, cl);
                }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -