#help_index "DolDoc/Misc"

U8 *ctrl_L_footer =
                                        "\n$MU-X+Q,\"Abort\",LE=DOCM_CANCEL$\n"
                                        "\n\n$LK+PU,\"Click for Help\",A=\"FI:::/Doc/Widget.DD\"$\n";

I64 PopUpLinkType(Bool include_anchor)
{
        I64   i;
        CDoc *doc = DocNew;

        DocPrint(doc,   "$PURPLE$$TX+CX,\"Link Type Menu\"$\n"
                                        "\n$LTBLUE$$MU,\"To file\",LE=LK_FILE$\n"
                                        "$MU,\"To anchor in file\",LE=LK_FILE_ANCHOR$\n"
                                        "$MU,\"To str in file\",LE=LK_FILE_FIND$\n"
                                        "$MU,\"To line in file\",LE=LK_FILE_LINE$\n"
                                        "$MU,\"To man page\",LE=LK_MAN_PAGE$\n"
                                        "$MU,\"To plain-text file\",LE=LK_PLAIN$\n"
                                        "$MU,\"To Bible chapter line and verse\",LE=LK_BIBLE_FIND$\n"
                                        "$MU,\"To str in plain-text file\",LE=LK_PLAIN_FIND$\n"
                                        "$MU,\"To line in plain-text file\",LE=LK_PLAIN_LINE$\n"
                                        "$MU,\"To Dictionary Definition\",LE=LK_DEF$\n"
                                        "$MU,\"To Help Index\",LE=LK_HELP_INDEX$\n"
                                        "$MU,\"To Addr\",LE=LK_ADDR$\n");

        if (include_anchor)
                DocPrint(doc, "$MU,\"Place Anchor\",LE=LK_PLACE_ANCHOR$\n");

        DocPrint(doc, "%s", ctrl_L_footer);
        i = PopUpMenu(doc);
        DocDel(doc);

        return i;
}

class CEdFileLink
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n",
                        file[512]               format "$DA-P,A=\"File          :%s\"$\n";
        I64     book;
        U8              aux[512];
        I64     num;
        U8              html_link[512]  format "$DA-P,A=\"Html Link     :%s\"$\n";
        Bool    pop_up                  format "$CB,\"PopUp\"$\n",
                        quote                   format "$CB,\"Quote\"$\n",
                        hide;
};

class CEdFileAnchorLink
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n",
                        file[512]               format "$DA-P,A=\"File          :%s\"$\n";
        I64     book;
        U8              aux[512]                format "$DA-P,A=\"Anchor Label  :%s\"$\n";
        I64     num;
        U8              html_link[512]  format "$DA-P,A=\"Html Link     :%s\"$\n";
        Bool    pop_up                  format "$CB,\"PopUp\"$\n",
                        quote                   format "$CB,\"Quote\"$\n",
                        hide;
};

class CEdFileFindLink
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n",
                        file[512]               format "$DA-P,A=\"File          :%s\"$\n";
        I64     book;
        U8              aux[512]                format "$DA-P,A=\"Str        :%s\"$\n";
        I64     num                     format "$DA-TRM,A=\"Occurrence Num:%04d\"$\n";
        U8              html_link[512]  format "$DA-P,A=\"Html Link     :%s\"$\n";
        Bool    pop_up                  format "$CB,\"PopUp\"$\n",
                        quote                   format "$CB,\"Quote\"$\n",
                        hide;
};

class CEdFileLineLink
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n",
                        file[512]               format "$DA-P,A=\"File          :%s\"$\n";
        I64     book;
        U8              aux[512];
        I64     num                     format "$DA-TRM,A=\"Line Num      :%04d\"$\n";
        U8              html_link[512]  format "$DA-P,A=\"Html Link     :%s\"$\n";
        Bool    pop_up                  format "$CB,\"PopUp\"$\n",
                        quote                   format "$CB,\"Quote\"$\n",
                        hide;
};

class CEdManPageLink
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n",
                        file[512];
        I64     book;
        U8              aux[512]                format "$DA-P,A=\"Label         :%s\"$\n";
        I64     num;
        U8              html_link[512]  format "$DA-P,A=\"Html Link     :%s\"$\n";
        Bool    pop_up                  format "$CB,\"PopUp\"$\n",
                        quote                   format "$CB,\"Quote\"$\n",
                        hide;
};

class CEdAddrLink
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n",
                        file[512];
        I64     book;
        U8              aux[512]                format "$DA-P,A=\"Addr Exp   :%s\"$\n";
        I64     num                     format "$DA-TRM,A=\"Bin Size      :%04d\"$\n";
        U8              html_link[512]  format "$DA-P,A=\"Html Link     :%s\"$\n";
        Bool    pop_up                  format "$CB,\"PopUp\"$\n",
                        quote                   format "$CB,\"Quote\"$\n",
                        hide;
};

class CEdPlaceAnchor
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n",
                        file[512];
        I64     book;
        U8              aux[512]                format "$DA-P,A=\"Anchor Label  :%s\"$\n";
        I64     num;
        U8              html_link[512]  format "$DA-P,A=\"Html Link     :%s\"$\n";
        Bool    pop_up,
                        quote                   format "$CB,\"Quote\"$\n",
                        hide                    format "$CB,\"Hide\"$\n";
};

class CEdBibleLink
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n",
                        file[512];
        I64             book                    format "$LS,D=\"ST_BIBLE_BOOKS\"$\n";
        U8              aux[512]                format "$DA-P,A=\"Chapter Verse :%s\"$\n";
        I64             num;
        U8              html_link[512]  format "$DA-P,A=\"Html Link     :%s\"$\n";
        Bool    pop_up                  format "$CB,\"PopUp\"$\n",
                        quote                   format "$CB,\"Quote\"$\n",
                        hide;
};

class CEdDefLink
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n",
                        file[512];
        I64     book;
        U8              aux[512]                format "$DA-P,A=\"Word          :%s\"$\n";
        I64     num                     format "$DA-TRM,A=\"Def Num       :%4d\"$\n";
        U8              html_link[512]  format "$DA-P,A=\"Html Link     :%s\"$\n";
        Bool    pop_up                  format "$CB,\"PopUp\"$\n",
                        quote                   format "$CB,\"Quote\"$\n",
                        hide;
};

class CEdProject
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n",
                        file[512]               format "$DA-P,A=\"File          :%s\"$\n";
        I64     book;
        U8              aux[512];
        I64     num;
        U8              html_link[512]  format "$DA-P,A=\"Html Link     :%s\"$\n";
        Bool    pop_up                  format "$CB,\"PopUp\"$\n",
                        quote                   format "$CB,\"Quote\"$\n",
                        hide;
};

Bool GetLink(I64 type, U8 **_tag, U8 **_link, Bool *_pop_up, Bool *_quote, U8 **_html_link)
{
        CEdFileLink     *e = CAlloc(sizeof(CEdFileLink));
        Bool res = FALSE;

        if (type >= 0)
        {
                e->num = 1;
                switch (type)
                {
                        case LK_FILE:
                                if (DocForm(e,,,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (!*e->tag)
                                                *_tag = StrNew(e->file);
                                        else
                                                *_tag = StrNew(e->tag);
                                        *_link = MStrPrint("FI:%s", e->file);
                                }
                                break;

                        case LK_PLAIN:
                                if (DocForm(e,,,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (!*e->tag)
                                                *_tag = StrNew(e->file);
                                        else
                                                *_tag = StrNew(e->tag);
                                        *_link = MStrPrint("PI:%s", e->file);
                                }
                                break;

                        case LK_FILE_ANCHOR:
                                if (DocForm(e, "CEdFileAnchorLink",,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (!*e->tag)
                                                *_tag = StrNew(e->aux);
                                        else
                                                *_tag = StrNew(e->tag);
                                        *_link = MStrPrint("FA:%s,%s", e->file, e->aux);
                                }
                                break;

                        case LK_FILE_FIND:
                                if (DocForm(e, "CEdFileFindLink",,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (e->num == 1)
                                        {
                                                if (!*e->tag)
                                                        *_tag = StrNew(e->aux);
                                                else
                                                        *_tag = StrNew(e->tag);
                                                *_link = MStrPrint("FF:%s,%s", e->file, e->aux);
                                        }
                                        else
                                        {
                                                if (!*e->tag)
                                                        *_tag = StrNew(e->aux);
                                                else
                                                        *_tag = StrNew(e->tag);
                                                *_link = MStrPrint("FF:%s,%s:%d", e->file, e->aux, e->num);
                                        }
                                }
                                break;

                        case LK_PLAIN_FIND:
                                if (DocForm(e, "CEdFileFindLink",,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (e->num == 1)
                                        {
                                                if (!*e->tag)
                                                        *_tag = StrNew(e->aux);
                                                else
                                                        *_tag = StrNew(e->tag);
                                                *_link = MStrPrint("PF:%s,%s", e->file, e->aux);
                                        }
                                        else
                                        {
                                                if (!*e->tag)
                                                        *_tag = StrNew(e->aux);
                                                else
                                                        *_tag = StrNew(e->tag);
                                                *_link = MStrPrint("PF:%s,%s:%d", e->file, e->aux, e->num);
                                        }
                                }
                                break;

                        case LK_FILE_LINE:
                                if (DocForm(e, "CEdFileLineLink",,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (!*e->tag)
                                                *_tag = StrNew(e->file);
                                        else
                                                *_tag = StrNew(e->tag);
                                        *_link = MStrPrint("FL:%s,%d", e->file, e->num);
                                }
                                break;

                        case LK_PLAIN_LINE:
                                if (DocForm(e, "CEdFileLineLink",,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (!*e->tag)
                                                *_tag = StrNew(e->file);
                                        else
                                                *_tag = StrNew(e->tag);
                                        *_link = MStrPrint("PL:%s,%d", e->file, e->num);
                                }
                                break;

                        case LK_MAN_PAGE:
                                if (DocForm(e, "CEdManPageLink",,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (!*e->tag)
                                                *_tag = StrNew(e->aux);
                                        else
                                                *_tag = StrNew(e->tag);
                                        *_link = MStrPrint("MN:%s", e->aux);
                                }
                                break;

                        case LK_PLACE_ANCHOR:
                                if (DocForm(e, "CEdPlaceAnchor",,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (!*e->tag)
                                        {
                                                if (e->hide)
                                                        *_tag = StrNew("");
                                                else
                                                        *_tag = StrNew(e->aux);
                                        }
                                        else
                                                *_tag = StrNew(e->tag);
                                        *_link = StrNew(e->aux);
                                }
                                break;

                        case LK_BIBLE_FIND:
                                if (DocForm(e, "CEdBibleLink",,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (!*e->tag)
                                                *_tag = MStrPrint("%Z,%s", e->book, "ST_BIBLE_BOOKS", e->aux);
                                        else
                                                *_tag = StrNew(e->tag);
                                        *_link = MStrPrint("BF:%Z,%s", e->book, "ST_BIBLE_BOOKS", e->aux);
                                }
                                break;

                        case LK_DEF:
                                e->num = -1;
                                if (DocForm(e, "CEdDefLink",,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (!*e->tag)
                                                *_tag = StrNew(e->aux);
                                        else
                                                *_tag = StrNew(e->tag);
                                        if (e->num < 0)
                                                *_link = MStrPrint("DN:%s", e->aux);
                                        else
                                                *_link = MStrPrint("DN:%s,%d", e->aux, e->num);

                                }
                                break;

                        case LK_HELP_INDEX:
                                if (DocForm(e, "CEdManPageLink",,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (!*e->tag)
                                                *_tag = StrNew(e->aux);
                                        else
                                                *_tag = StrNew(e->tag);
                                        *_link = MStrPrint("HI:%s", e->aux);
                                }
                                break;

                        case LK_ADDR:
                                e->num = DEFAULT_ADDR_LINK_BIN_SIZE;
                                if (DocForm(e, "CEdAddrLink",,, ctrl_L_footer))
                                {
                                        res = TRUE;
                                        if (e->num == DEFAULT_ADDR_LINK_BIN_SIZE)
                                        {
                                                if (!*e->tag)
                                                        *_tag = StrNew(e->aux);
                                                else
                                                        *_tag = StrNew(e->tag);
                                                *_link = MStrPrint("AD:%s", e->aux);
                                        }
                                        else
                                        {
                                                if (!*e->tag)
                                                        *_tag = MStrPrint("%s,%d", e->aux, e->num);
                                                else
                                                        *_tag = StrNew(e->tag);
                                                *_link = MStrPrint("AD:%s,%d", e->aux, e->num);
                                        }
                                }
                                break;
                }
        }
        if (*e->html_link)
                *_html_link = StrNew(e->html_link);
        else
                *_html_link = NULL;
        if (e->pop_up)
                *_pop_up = TRUE;
        else
                *_pop_up = FALSE;
        if (e->quote)
                *_quote = TRUE;
        else
                *_quote = FALSE;
        Free(e);

        return res;
}

U0 EdInsLink()
{
        U8      *tag = NULL, *link = NULL, *st = NULL, *html_link = NULL, *pop_up_st;
        Bool pop_up = FALSE, quote = FALSE;
        I64  type = PopUpLinkType(TRUE);

        if (type >= 0)
        {
                if (GetLink(type, &tag, &link, &pop_up, &quote, &html_link))
                {
                        if (pop_up)
                                pop_up_st = "+PU";
                        else
                                pop_up_st = "";
                        switch (type)
                        {
                                case LK_PLACE_ANCHOR:
                                        if (html_link)
                                                st = MStrPrint("$AN,\"%$Q\",A=\"%$Q\",HTML=\"%$Q\"$", tag, link, html_link);
                                        else
                                                st = MStrPrint("$AN,\"%$Q\",A=\"%$Q\"$", tag, link);
                                        break;

                                default:
                                        if (html_link)
                                                st = MStrPrint("$LK%s,\"%$Q\",A=\"%$Q\",HTML=\"%$Q\"$", pop_up_st, tag, link, html_link);
                                        else
                                                st = MStrPrint("$LK%s,\"%$Q\",A=\"%$Q\"$", pop_up_st, tag, link);
                        }
                }
        }
        if (st)
        {
                if (quote)
                        "%$Q", st;
                else
                        "%s", st;
        }
        Free(tag);
        Free(link);
        Free(html_link);
        Free(st);
}

I64 PopUpColorType()
{
        I64   i;
        CDoc *doc = DocNew;

        DocPrint(doc,   "$PURPLE$$TX+CX,\"Color Type Menu\"$\n"
                                        "\n$LTBLUE$$MU,\"Foreground\",LE=DOCT_FOREGROUND$\n"
                                        "$MU,\"Background\",LE=DOCT_BACKGROUND$\n"
                                        "$MU,\"Default Foreground\",LE=DOCT_DEFAULT_FOREGROUND$\n"
                                        "$MU,\"Default Background\",LE=DOCT_DEFAULT_BACKGROUND$\n"
                                        "%s", ctrl_L_footer);
        i = PopUpMenu(doc);
        DocDel(doc);

        return i;
}

I64 PopUpPageSettingType()
{
        I64   i;
        CDoc *doc = DocNew;

        DocPrint(doc,   "$PURPLE$$TX+CX,\"Page Setting Menu\"$\n"
                                        "\n$LTBLUE$$MU,\"Page Length\",LE=DOCT_PAGE_LEN$\n"
                                        "$MU,\"Page Header\",LE=DOCT_HEADER$\n"
                                        "$MU,\"Page Footer\",LE=DOCT_FOOTER$\n"
                                        "$MU,\"Left Margin\",LE=DOCT_LEFT_MARGIN$\n"
                                        "$MU,\"Right Margin\",LE=DOCT_RIGHT_MARGIN$\n"
                                        "%s", ctrl_L_footer);
        i = PopUpMenu(doc);
        DocDel(doc);

        return i;
}

U0 EdInsColor()
{
        I64 type = PopUpColorType, col = DOC_DEFAULT;

        if (type >= 0)
        {
                col = PopUpColor(, FALSE);
                if (col == DOC_DEFAULT)
                        "$%Z$", type, "ST_DOC_CMDS";
                else if (col >= 0)
                        "$%Z,%d$", type, "ST_DOC_CMDS", col;
        }
}

class CEdPageSetting1
{
        U8              val[512]        format "$DA-P,A=\"Setting Val:%s\"$\n";
        Bool    winrel;
};

class CEdPageSetting2
{
        U8              val[512]        format "$DA-P,A=\"Setting Val:%s\"$\n";
        Bool    winrel          format "$CB,\"Win Relative\"$\n";
};

U0 EdInsPageSetting()
{
        I64                              type = PopUpPageSettingType;
        CEdPageSetting1 *e = CAlloc(sizeof(CEdPageSetting1));

        if (type >= 0)
        {
                if (type == DOCT_RIGHT_MARGIN || type == DOCT_PAGE_LEN)
                {
                        if (DocForm(e(CEdPageSetting2 *)))
                        {
                                if (e->winrel)
                                {
                                        if (*e->val)
                                                "$%Z+WR,%s$", type, "ST_DOC_CMDS", e->val;
                                        else
                                                "$%Z+WR,0$", type, "ST_DOC_CMDS";
                                }
                                else
                                {
                                        if (*e->val)
                                                "$%Z,%s$", type, "ST_DOC_CMDS", e->val;
                                        else
                                                "$%Z$", type, "ST_DOC_CMDS";
                                }
                        }
                }
                else
                {
                        if (DocForm(e))
                        {
                                if (*e->val)
                                        "$%Z,%s$", type, "ST_DOC_CMDS", e->val;
                                else
                                        "$%Z$", type, "ST_DOC_CMDS";
                        }
                }
        }
        Free(e);
}

#define WIZ_HIGHLIGHT_ON        (DOCT_ERROR + 1)
#define WIZ_HIGHLIGHT_OFF       (DOCT_ERROR + 2)

I64 PopUpWidgetType()
{
        I64   i;
        CDoc *doc = DocNew;

        DocPrint(doc,   "$PURPLE$$TX+CX,\"Text Widgets Menu\"$\n"
                                        "\n$LTBLUE$$MU,\"Link\",LE=DOCT_LINK$\n"
                                        "$MU,\"Text\",LE=DOCT_TEXT$\n"
                                        "$MU,\"Tree Branch\",LE=DOCT_TREE$\n"
                                        "$MU,\"Color\",LE=DOCT_FOREGROUND$\n"
                                        "$MU,\"Page Settings\",LE=DOCT_PAGE_LEN$\n"
                                        "$MU,\"Cursor Movement\",LE=DOCT_CURSOR_MOVEMENT$\n"
                                        "$MU,\"Macro\",LE=DOCT_MACRO$\n"
                                        "$MU,\"Bttn\",LE=DOCT_BTTN$\n"
                                        "$MU,\"Check Box\",LE=DOCT_CHECK_BOX$\n"
                                        "$MU,\"List\",LE=DOCT_LIST$\n"
                                        "$MU,\"Menu Val\",LE=DOCT_MENU_VAL$\n"
                                        "$MU,\"Data\",LE=DOCT_DATA$\n"
                                        "$MU,\"Hex Edit\",LE=DOCT_HEX_ED$\n"
                                        "$MU,\"Syntax Highlight ON\",LE=WIZ_HIGHLIGHT_ON$\n"
                                        "$MU,\"Syntax Highlight OFF\",LE=WIZ_HIGHLIGHT_OFF$\n"
                                        "$MU,\"HTML\",LE=DOCT_HTML_CODE$\n"
                                        "$MU,\"Song\",LE=DOCT_SONG$\n"
                                        "%s", ctrl_L_footer);
        i = PopUpMenu(doc);
        DocDel(doc);

        return i;
}

class CEdText
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n";
        Bool    left_x                  format "$CB,\"Left X\"$\n",
                        center_x                format "$CB,\"Center X\"$\n",
                        right_x                 format "$CB,\"Right X\"$\n",
                        margin_rel              format "$CB,\"Margin Rel X\"$\n",
                        blink                   format "$CB,\"Blink\"$\n",
                        invert                  format "$CB,\"Invert\"$\n",
                        underline               format "$CB,\"Underline\"$\n",
                        tree                    format "$CB,\"Tree\"$\n",
                        collapsed               format "$CB,\"Collapsed\"$\n";
        U8              scroll_x [512]  format "$DA-P,A=\"Scroll X Length Expression:%s\"$\n",
                        shift_x  [512]  format "$DA-P,A=\"X Offset Expression       :%s\"$\n",
                        shift_y  [512]  format "$DA-P,A=\"Y Offset Expression       :%s\"$\n",
                        define_str[512] format "$DA-P,A=\"Define Str                :%s\"$\n",
                        html_link[512]  format "$DA-P,A=\"Html Link                 :%s\"$\n";
};

U0 EdInsText()
{
        U8              *st, buf[512];
        CEdText *e = CAlloc(sizeof(CEdText));

        if (DocForm(e,,,, ctrl_L_footer))
        {
                *buf = 0;
                if (e->left_x)          CatPrint(buf, "+LX");
                if (e->center_x)        CatPrint(buf, "+CX");
                if (e->right_x )        CatPrint(buf, "+RX");
                if (e->margin_rel)      CatPrint(buf, "+MRX");
                if (e->blink)           CatPrint(buf, "+BK");
                if (e->invert)          CatPrint(buf, "+IV");
                if (e->underline)       CatPrint(buf, "+UL");
                if (e->tree)            CatPrint(buf, "+TR");
                if (e->collapsed)       CatPrint(buf, "+C");

                st = MStrPrint("%q", e->tag);
                "$TX%s,\"%$Q\"", buf, st;
                Free(st);
                if (*e->shift_x)
                        ",SX=%s", e->shift_x;
                if (*e->shift_y)
                        ",SY=%s", e->shift_y;
                if (*e->scroll_x)
                        ",SCX=%s", e->scroll_x;
                if (*e->define_str)
                {
                        st = MStrPrint("%q", e->define_str);
                        ",D=\"%$Q\"", st;
                        Free(st);
                }
                if (*e->html_link)
                {
                        st = MStrPrint("%q", e->html_link);
                        ",HTML=\"%$Q\"", st;
                        Free(st);
                }
                "$";
        }
        Free(e);
}

class CEdSong
{
        U8              tag[512]        format "$DA-P,A=\"Tag Text      :%s\"$\n",
                        song[512]       format "$DA-P,A=\"Song          :%s\"$\n";
};

U0 EdInsSong()
{
        CEdSong *e = CAlloc(sizeof(CEdSong));

        if (DocForm(e,,,, ctrl_L_footer))
                "$SO,\"%$Q\",A=\"%s\"$", e->tag, e->song;
        Free(e);
}

class CEdHtmlCode
{
        U8              tag[512]        format "$DA-P,A=\"Html Code:%s\"$\n";
};

U0 EdInsHtml()
{
        CEdHtmlCode *e = CAlloc(sizeof(CEdHtmlCode));

        if (DocForm(e,,,, ctrl_L_footer))
                "$HC,\"%$Q\"$", e->tag;
        Free(e);
}

class CEdMacroMenu
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text                  :%s\"$\n",
                        left_macro[512] format "$DA-P,A=\"Left Click Macro          :%s\"$\n",
                        left_exp[512]   format "$DA-P,A=\"Left Click Expression     :%s\"$\n";
        Bool    popup                   format "$CB,\"PopUp\"$\n",
                        left_is_in_str  format "$CB,\"Left is InStr\"$\n",
                        left_x                  format "$CB,\"Left X \"$\n",
                        center_x                format "$CB,\"Center X \"$\n",
                        right_x                 format "$CB,\"Right X \"$\n",
                        margin_rel              format "$CB,\"Margin Rel X\"$\n",
                        blink                   format "$CB,\"Blink\"$\n",
                        invert                  format "$CB,\"Invert\"$\n",
                        underline               format "$CB,\"Underline\"$\n",
                        escape                  format "$CB,\"Escape\"$\n";
        U8              scroll_x[512]   format "$DA-P,A=\"Scroll X Length Expression:%s\"$\n",
                        shift_x[512]    format "$DA-P,A=\"X Offset Expression       :%s\"$\n",
                        shift_y[512]    format "$DA-P,A=\"Y Offset Expression       :%s\"$\n";
};

U0 EdInsMacroMenu(Bool is_macro)
{
        U8                              *st, buf[512];
        CEdMacroMenu    *e = CAlloc(sizeof(CEdMacroMenu));

        e->underline = TRUE;
        e->escape        = TRUE;
        if (DocForm(e,,,, ctrl_L_footer))
        {
                *buf = 0;
                if (e->popup)                   CatPrint(buf, "+PU-X");
                if (e->left_x)                  CatPrint(buf, "+LX");
                if (e->center_x)                CatPrint(buf, "+CX");
                if (e->right_x )                CatPrint(buf, "+RX");
                if (e->margin_rel)              CatPrint(buf, "+MRX");
                if (e->blink)                   CatPrint(buf, "+BK");
                if (e->invert)                  CatPrint(buf, "+IV");
                if (!e->underline)              CatPrint(buf, "-UL");
                if (!e->escape)                 CatPrint(buf, "-X");
                if (e->left_is_in_str)  CatPrint(buf, "+LIS");
                if (*e->tag || is_macro)
                {
                        if (is_macro)
                        {
                                if (*e->tag)
                                {
                                        st = MStrPrint("%q", e->tag);
                                        "$MA%s,\"%$Q\"", buf, st;
                                        Free(st);
                                }
                                else
                                        "$MA%s", buf;
                        }
                        else
                        {
                                st = MStrPrint("%q", e->tag);
                                "$MU%s,\"%$Q\"", buf, st;
                                Free(st);
                        }
                        if (*e->left_exp)
                                ",LE=%s", e->left_exp;
                        if (*e->left_macro)
                        {
                                st = MStrPrint("%q", e->left_macro);
                                ",LM=\"%$Q\"", st;
                                Free(st);
                        }
                        if (*e->shift_x)
                                ",SX=%s", e->shift_x;
                        if (*e->shift_y)
                                ",SY=%s", e->shift_y;
                        if (*e->scroll_x)
                                ",SCX=%s", e->scroll_x;
                        "$";
                }
        }
        Free(e);
}

class CEdBttn
{
        U8              tag[512]                format "$DA-P,A=\"Tag Text      :%s\"$\n";
        Bool    popup                   format "$CB,\"PopUp\"$\n",
                        left_x                  format "$CB,\"Left X \"$\n",
                        center_x                format "$CB,\"Center X \"$\n",
                        right_x                 format "$CB,\"Right X \"$\n",
                        margin_rel              format "$CB,\"Margin Rel X\"$\n",
                        escape                  format "$CB,\"Escape\"$\n";
        U8              left_macro[512] format "$DA-P,A=\"Left Click Macro:%s\"$\n";
        Bool    left_is_in_str  format "$CB,\"Left is InStr\"$\n";
        U8              left_exp[512]   format "$DA-P,A=\"Left Click Expression:%s\"$\n";
        Bool    quote                   format "$CB,\"Quote\"$\n";
};

U0 EdInsBttn()
{
        U8              *st, buf[512];
        CEdBttn *e = CAlloc(sizeof(CEdBttn));

        e->escape = TRUE;
        if (DocForm(e,,,, ctrl_L_footer))
        {
                *buf = 0;
                if (e->popup)                   CatPrint(buf, "+PU-X");
                if (e->left_x)                  CatPrint(buf, "+LX");
                if (e->center_x)                CatPrint(buf, "+CX");
                if (e->right_x )                CatPrint(buf, "+RX");
                if (e->margin_rel)              CatPrint(buf, "+MRX");
                if (!e->escape)                 CatPrint(buf, "-X");
                if (e->left_is_in_str)  CatPrint(buf, "+LIS");
                if (*e->tag)
                {
                        if (e->quote)
                        {
                                st = MStrPrint("%q", e->tag);
                                "$$BT%s,\\\"%$Q\\\"", buf, st;
                                Free(st);
                                if (*e->left_exp)
                                        ",LE=%s", e->left_exp;
                                if (*e->left_macro)
                                {
                                        st = MStrPrint("%q", e->left_macro);
                                        ",LM=\\\"%$Q\\\"", st;
                                        Free(st);
                                }
                                "$$";
                        }
                        else
                        {
                                st = MStrPrint("%q", e->tag);
                                "$BT%s,\"%$Q\"", buf, st;
                                Free(st);
                                if (*e->left_exp)
                                        ",LE=%s", e->left_exp;
                                if (*e->left_macro)
                                {
                                        st = MStrPrint("%q", e->left_macro);
                                        ",LM=\"%$Q\"", st;
                                        Free(st);
                                }
                                "$";
                        }
                }
        }
        Free(e);
}

class CEdCursorMovement
{
        U8              left_exp[512]   format "$DA-P,A=\"X Expression (LE):%s\"$\n",
                        right_exp[512]  format "$DA-P,A=\"Y Expression (RE):%s\"$\n";
        Bool    left_x                  format "$CB,\"Left   X \"$\n",
                        center_x                format "$CB,\"Center X \"$\n",
                        right_x                 format "$CB,\"Right  X \"$\n",
                        margin_rel              format "$CB,\"Margin Rel X\"$\n",
                        top_y                   format "$CB,\"Top    Y \"$\n",
                        center_y                format "$CB,\"Center Y \"$\n",
                        bottom_y                format "$CB,\"Bottom Y \"$\n",
                        page_rel                format "$CB,\"Page Rel Y\"$\n",
                        quote                   format "$CB,\"Quote\"$\n";
};

U0 EdInsCursorMovement()
{
        U8                                       buf[512];
        CEdCursorMovement       *e = CAlloc(sizeof(CEdCursorMovement));

        if (DocForm(e,,,, ctrl_L_footer))
        {
                *buf = 0;
                if (e->left_x)          CatPrint(buf, "+LX");
                if (e->center_x)        CatPrint(buf, "+CX");
                if (e->right_x)         CatPrint(buf, "+RX");
                if (e->margin_rel)      CatPrint(buf, "+MRX");
                if (e->top_y)           CatPrint(buf, "+TY");
                if (e->center_y)        CatPrint(buf, "+CY");
                if (e->bottom_y)        CatPrint(buf, "+BY");
                if (e->page_rel)        CatPrint(buf, "+PRY");
                if (!*e->left_exp)      CatPrint(buf, "-LE");
                if (!*e->right_exp)     CatPrint(buf, "-RE");
                if (e->quote)
                        "$";
                "$CM%s", buf;
                if (*e->left_exp)
                        ",LE=%s", e->left_exp;
                if (*e->right_exp)
                        ",RE=%s", e->right_exp;
                "$";
                if (e->quote)
                        "$";
        }
        Free(e);
}

class CEdDataNum
{
        U8              format_str[512] format "$DA-P,A=\"Format Str:%s\"$\n";
        I64     len;
        Bool    term                    format "$CB,\"Form Field Terminator\"$\n",
                        remalloc,
                        refresh                 format "$CB,\"Refresh Data\"$\n",
                        update                  format "$CB,\"Update Data\"$\n";
};

class CEdDataStr
{
        U8              format_str[512] format "$DA-P,A=\"Format Str:%s\"$\n";
        I64     len                     format "$DA,A=\"Length:%d\"$\n";
        Bool    term                    format "$CB,\"Zero Terminator\"$\n",
                        remalloc                format "$CB,\"Remalloc for Unlimited Length\"$\n",
                        refresh                 format "$CB,\"Refresh Data\"$\n",
                        update                  format "$CB,\"Update Data\"$\n";
};

U0 EdInsData()
{
        I64                      i, type = RT_I64;
        U8                      *st, buf[512], raw_type[16];
        CEdDataNum      *e = CAlloc(sizeof(CEdDataNum));

        e->term = TRUE;
        e->len  = DOCE_LEN_DEFAULT;
        if ((i = PopUpPickDefineSub("ST_NATURAL_TYPES")) >= 0)
        {
                *buf = 0;
                i += RT_I8;
                if (i == RT_F32)
                        i = RT_F64;
                if (i == RT_UF32)
                {//U8 *
                        i = DocForm(e(CEdDataStr *),,,, ctrl_L_footer);
                        if (e->remalloc)
                        {
                                CatPrint(buf, "+M");
                                e->term = TRUE;
                        }
                        else
                                CatPrint(buf, "-P");
                }
                else
                {
                        type = i;
                        i = DocForm(e,,,, ctrl_L_footer);
                }
                if (i)
                {
                        if (type == RT_I64)
                                *raw_type = 0;
                        else
                                StrPrint(raw_type, ",RT=%Z", type, "ST_RAW_TYPES");

                        if (!e->term)   CatPrint(buf, "-TRM");
                        if (e->refresh) CatPrint(buf, "+RD");
                        if (e->update)  CatPrint(buf, "+UD");

                        st = MStrPrint("%q", e->format_str);
                        if (e->remalloc)
                                "$$DA%s,A=\\\"%$Q\\\"$$", buf, st;
                        else if (e->len == DOCE_LEN_DEFAULT)
                                "$$DA%s%s,A=\\\"%$Q\\\"$$", buf, raw_type, st;
                        else
                                "$$DA%s,LEN=%d%s,A=\\\"%$Q\\\"$$", buf, e->len, raw_type, st;
                        Free(st);
                }
        }
        Free(e);
}

class CEdCheckBox
{
        U8              tag[512]        format "$DA-P,A=\"Tag Text      :%s\"$\n";
        Bool    refresh         format "$CB,\"Refresh Data\"$\n";
        I64     type            format "$LS,D=\"ST_INT_SIZE_TYPES\"$\n";
};

U0 EdInsCheckBox()
{
        U8                      *st, buf[512], raw_type[16];
        CEdCheckBox     *e = CAlloc(sizeof(CEdCheckBox));

        e->type = RT_I8 - RT_I8;
        if (DocForm(e,,,, ctrl_L_footer))
        {
                *buf = 0;
                e->type += RT_I8;
                if (e->type == RT_I8)
                        *raw_type = 0;
                else
                        StrPrint(raw_type, ",RT=%Z", e->type, "ST_RAW_TYPES");
                if (e->refresh)
                        CatPrint(buf, "+RD");
                st = MStrPrint("%q", e->tag);
                "$$CB%s%s,\\\"%$Q\\\"$$", buf, raw_type, st;
                Free(st);
        }
        Free(e);
}

class CEdList
{
        U8              tag[512]                format "$DA-P,A=\"Default Sel    :%s\"$\n",
                        define_str[512] format "$DA-P,A=\"Define Str    :%s\"$\n";
        Bool    refresh                 format "$CB,\"Refresh Data\"$\n";
        I64     type                    format "$LS,D=\"ST_INT_SIZE_TYPES\"$\n";
};

U0 EdInsList()
{
        U8              *st1, *st2, buf[512], raw_type[16];
        CEdList *e = CAlloc(sizeof(CEdList));

        e->type = RT_I64 - RT_I8;
        if (DocForm(e,,,, ctrl_L_footer))
        {
                *buf = 0;
                e->type += RT_I8;
                if (e->type == RT_I64)
                        *raw_type = 0;
                else
                        StrPrint(raw_type, ",RT=%Z", e->type, "ST_RAW_TYPES");
                if (e->refresh)
                        CatPrint(buf, "+RD");
                if (!*e->tag)
                        st1 = NULL;
                else
                        st1 = MStrPrint("%q", e->tag);
                st2 = MStrPrint("%q", e->define_str);
                if (st1)
                        "$$LS%s%s,\\\"%$Q\\\",D=\\\"%$Q\\\"$$", buf, raw_type, st1, st2;
                else
                        "$$LS%s%s,D=\\\"%$Q\\\"$$", buf, raw_type, st2;
                Free(st1);
                Free(st2);
        }
        Free(e);
}

class CEdHexEd
{
        I64     count           format "$DA,A=\"Count:%d\"$\n",
                        cols            format "$DA,A=\"Columns:%d\"$\n";
        Bool    zero            format "$CB,\"Zero Based\"$\n",
                        refresh         format "$CB,\"Refresh Data\"$\n";
};

U0 EdInsHexEd()
{
        U8                       buf[512];
        CEdHexEd        *e = CAlloc(sizeof(CEdHexEd));

        e->count = 128;
        e->cols  = 4;
        e->zero  = TRUE;
        if (DocForm(e,,,, ctrl_L_footer))
        {
                *buf = 0;
                if (!e->zero)   CatPrint(buf, "-Z");
                if (e->refresh) CatPrint(buf, "+RD");
                "$$HX%s,%d,%d$$", buf, e->count, e->cols;
        }
        Free(e);
}

class CEdBin
{
        U8              tag[512]                                format "$DA-P,A=\"Tag Text      :%s\"$\n";
        I64     bin_num                                 format "$DA,A=\"Bin Num:%d\"$\n";
        U8              bin_ptr_link_file[512]  format "$DA-P,A=\"File:%s\"$\n";
        I64     bin_ptr_link_bin_num    format "$DA,A=\"File Bin Num:%d\"$\n";
        U8              bin_ptr_link_tag[512]   format "$DA-P,A=\"File Bin Tag:%s\"$\n";
};

U0 EdInsBin(I64 bin_num,I64 type)
{
        CEdBin *e = CAlloc(sizeof(CEdBin));

        StrPrint(e->tag, "<%d>", bin_num);
        e->bin_num                              = bin_num;
        e->bin_ptr_link_bin_num = 1;
        if (DocForm(e,,,
                                "Note: Normally, you enter no file,\n"
                                "just a bin num.  If You enter a\n"
                                "file, enter a file bin num or a file\n"
                                "bin tag.\n\n", ctrl_L_footer))
        {
                if (*e->bin_ptr_link_file)
                {
                        if (*e->bin_ptr_link_tag)
                                "$%Z,\"%$Q\",BI=%d,BP=\"%s,%s\"$",
                                        type, "ST_DOC_CMDS", e->tag, e->bin_num, e->bin_ptr_link_file, e->bin_ptr_link_tag;
                        else
                                "$%Z,\"%$Q\",BI=%d,BP=\"%s,%d\"$",
                                        type, "ST_DOC_CMDS", e->tag, e->bin_num, e->bin_ptr_link_file, e->bin_ptr_link_bin_num;
                }
                else
                {
                        if (DocBinFindNum(DocPut, e->bin_num))
                                "$%Z,\"%$Q\",BI=%d$", type, "ST_DOC_CMDS", e->tag, e->bin_num;
                        else
                                PopUpOk("Invalid Binary Num");
                }
        }
        Free(e);
}

class CEdTree
{
        U8              tag[512]        format "$DA-P,A=\"Tag Text      :%s\"$\n";
        I64     indent          format "$DA,A=\"Indention:%d\"$\n";
        Bool    collapsed       format "$CB,\"Collapsed\"$\n";
};

U0 EdInsTree()
{
        U8              *st1, *st2, buf[512];
        CEdTree *e = CAlloc(sizeof(CEdTree));

        e->collapsed = TRUE;
        e->indent        = 2;
        if (DocForm(e,,,, ctrl_L_footer))
        {
                *buf = 0;
                if (!e->collapsed)
                        CatPrint(buf, "-C");
                st1 = MStrPrint("%q", e->tag);
                st2 = MStrPrint("$TR%s,\"%$Q\"$\n$ID,%d$*\n$ID,%d$", buf, st1, e->indent, -e->indent);
                DocPrintAtomic(DocPut, "%s", st2);
                Free(st1);
                Free(st2);
        }
        Free(e);
}

U0 EdInsWidgetWiz()
{
        I64 type = PopUpWidgetType;
        switch (type)
        {
                case DOCT_FOREGROUND:
                        EdInsColor;
                        break;

                case DOCT_PAGE_LEN:
                        EdInsPageSetting;
                        break;

                case DOCT_LINK:
                        EdInsLink;
                        break;

                case DOCT_TEXT:
                        EdInsText;
                        break;

                case DOCT_TREE:
                        EdInsTree;
                        break;

                case DOCT_MACRO:
                        EdInsMacroMenu(TRUE);
                        break;

                case DOCT_MENU_VAL:
                        EdInsMacroMenu(FALSE);
                        break;

                case DOCT_CURSOR_MOVEMENT:
                        EdInsCursorMovement;
                        break;

                case DOCT_BTTN:
                        EdInsBttn;
                        break;

                case DOCT_DATA:
                        EdInsData;
                        break;

                case DOCT_CHECK_BOX:
                        EdInsCheckBox;
                        break;

                case DOCT_LIST:
                        EdInsList;
                        break;

                case DOCT_HEX_ED:
                        EdInsHexEd;
                        break;

                case DOCT_SONG:
                        EdInsSong;
                        break;

                case WIZ_HIGHLIGHT_ON:
                        "$HL,1$";
                        break;

                case WIZ_HIGHLIGHT_OFF:
                        "$HL,0$";
                        break;

                case DOCT_HTML_CODE:
                        EdInsHtml;
        }
}

#define EST_SPRITE                      0
#define EST_SPRITE_PTR          1
#define EST_DUP_SPRITE          2
#define EST_SPRITE_SIZE         3
#define EST_SPRITE_MACRO        4
#define EST_SPRITE_MENU         5
#define EST_SPRITE_LINK         6

I64 PopUpSpriteType()
{
        I64   i;
        CDoc *doc = DocNew;

        DocPrint(doc,   "$PURPLE$$TX+CX,\"Graphic Sprite Resource Menu\"$\n"
                                        "$LK+PU+CX,\"Click for Help\",A=\"FI:::/Doc/Resource.DD\"$\n\n"
                                        "$LTBLUE$$MU,\"Make Sprite\",LE=EST_SPRITE$$FG$\t "
                                        "Start by making a sprite.\n"
                                        "$LTBLUE$$MU,\"Ptr to Sprite\",LE=EST_SPRITE_PTR$$FG$\t "
                                        "Insert pointer into src code.\n"
                                        "$LTBLUE$$MU,\"Duplicate Sprite\",LE=EST_DUP_SPRITE$$FG$ "
                                        "Make dup image for in a doc.\n"
                                        "$LTBLUE$$MU,\"Sprite Size\",LE=EST_SPRITE_SIZE$$FG$\t "
                                        "Insert size of a sprite into src code.\n"
                                        "$LTBLUE$$MU,\"Sprite Macro\",LE=EST_SPRITE_MACRO$$FG$\t "
                                        "Create icon with auto-text payload.\n"
                                        "$LTBLUE$$MU,\"Sprite Menu Item\",LE=EST_SPRITE_MENU$$FG$ "
                                        "Create icon with numeric payload.\n"
                                        "$LTBLUE$$MU,\"Sprite Link\",LE=EST_SPRITE_LINK$$FG$\t "
                                        "Create icon with link payload.\n\n"
                                        "$LTBLUE$$MU,\"Abort\",LE=DOCM_CANCEL$\n\n");
        i = PopUpMenu(doc);
        DocDel(doc);

        return i;
}

class CEdMacroSprite
{
        U8              tag[512]        format "$DA-P,A=\"Tag Text       :%s\"$\n",
                        exp[512]        format "$DA-P,A=\"Macro          :%s\"$\n";
        Bool    escape          format "$CB,\"Escape\"$\n",
                        popup           format "$CB,\"PopUp\"$\n",
                        is_in_str       format "$CB,\"InStr\"$\n";
};

class CEdMenuSprite
{
        U8              tag[512]        format "$DA-P,A=\"Tag Text       :%s\"$\n",
                        exp[512]        format "$DA-P,A=\"Expression     :%s\"$\n";
        Bool    escape          format "$CB,\"Escape\"$\n",
                        popup,
                        is_in_str;
};

U8 *EdSpriteLink(Bool *_pop_up, U8 **_html_link)
{
        U8      *res = NULL, *tag = NULL, *link = NULL;
        Bool quote = FALSE;
        I64  type = PopUpLinkType(FALSE);

        *_html_link = NULL;
        if (type >= 0 && GetLink(type, &tag, &link, _pop_up, &quote, _html_link))
                res = MStrPrint("\"%$Q\",A=\"%$Q\"", tag, link);
        Free(tag);
        Free(link);

        return res;
}

U8 *EdSprite(I64 bin_num)
{
        I64                              type = PopUpSpriteType;
        Bool                     pop_up;
        U8                              *st, *st1 = NULL, *st2 = NULL, buf[1024], *html_link = NULL;
        CEdMacroSprite  *e = CAlloc(sizeof(CEdMacroSprite));

        *buf = 0;
        switch (type)
        {
                case EST_SPRITE:
                        st1 = MStrPrint("\"<%d>\"", bin_num);
                        break;

                case EST_SPRITE_MACRO:
                        e->escape = TRUE;
                        if (DocForm(e,,,, ctrl_L_footer))
                        {
                                CatPrint(buf, "+UL");
                                if (e->is_in_str)       CatPrint(buf, "+LIS");
                                if (e->popup)           CatPrint(buf, "+PU");
                                if (e->escape)          CatPrint(buf, "+X");
                                st = MStrPrint("%q", e->exp);
                                st1 = MStrPrint("\"%$Q\",LM=\"%$Q\"", e->tag, st);
                                Free(st);
                        }
                        break;

                case EST_SPRITE_MENU:
                        e->escape = TRUE;
                        if (DocForm(e, "CEdMenuSprite",,, ctrl_L_footer))
                        {
                                if (e->escape)
                                        CatPrint(buf, "+X");
                                st1 = MStrPrint("\"%$Q\",LE=%s", e->tag, e->exp);
                        }
                        break;

                case EST_SPRITE_LINK:
                        CatPrint(buf, "+L");
                        st1 = EdSpriteLink(&pop_up, &html_link);
                        if (pop_up)
                                CatPrint(buf, "+PU");
                        break;

                case EST_SPRITE_PTR:
                        EdInsBin(--bin_num, DOCT_INS_BIN);
                        break;

                case EST_SPRITE_SIZE:
                        EdInsBin(--bin_num, DOCT_INS_BIN_SIZE);
                        break;

                case EST_DUP_SPRITE:
                        EdInsBin(--bin_num, DOCT_SPRITE);
                        break;
        }
        if (st1)
        {
                if (html_link)
                        st2 = MStrPrint("$SP%s,%s,HTML=\"%$Q\",BI=%d$", buf, st1, html_link, bin_num);
                else
                        st2 = MStrPrint("$SP%s,%s,BI=%d$", buf, st1, bin_num);
                Free(st1);
        }
        Free(e);
        Free(html_link);

        return st2;
}