#help_index "DolDoc"

public I64 DocEntryRun(CDoc *doc, CDocEntry *doc_e, Bool exited, I64 *_has_action=NULL)
{//Do action on final entry sel by user.
//Sometimes returns locked, sometimes unlocked
        U8                               ch = doc->cmd_U8, *st;
        I64                              res = DOCM_CANCEL, has_action = FALSE;
        CHashDefineStr  *tmph;

        DocLock(doc);
        if (!exited)
        {
                if (doc_e->de_flags & DOCEF_ESC)
                {
                        Message(MESSAGE_KEY_DOWN, CH_ESC, 0, 1 << JOBf_DONT_FILTER);
                        has_action = TRUE;
                        goto er_done;
                }
                if (doc_e->de_flags & DOCEF_QUIT)
                {
                        Message(MESSAGE_KEY_DOWN, CH_SHIFT_ESC, 0, 1 << JOBf_DONT_FILTER);
                        has_action = TRUE;
                        goto er_done;
                }
                else if (doc_e->de_flags & DOCEF_CHECK_COLLAPSABLE)
                {
                        doc_e->de_flags ^= DOCEF_CHECKED_COLLAPSED;
                        has_action = TRUE;
                }
        }
        try
        {
                if (ch == CH_SPACE)
                {
                        if (doc_e->de_flags & DOCEF_LINK && doc->left_click_link)
                        {
                                res = (*doc->left_click_link)(doc, doc_e);
                                has_action = TRUE;
                        }
                        if (doc_e->de_flags & DOCEF_LEFT_EXP)
                        {
                                res = doc_e->left_exp;
                                has_action = TRUE;
                                Message(MESSAGE_CMD, res, 0, 1 << JOBf_DONT_FILTER);
                        }
                        if (doc_e->de_flags & DOCEF_LEFT_CB && doc_e->left_cb)
                        {
                                DocUnlock(doc);
                                res = (*doc_e->left_cb)(doc, doc_e);
                                has_action = TRUE;
                                Message(MESSAGE_CMD, res, 0, 1 << JOBf_DONT_FILTER);
                        }
                        if (doc_e->de_flags & DOCEF_LEFT_MACRO)
                        {
                                if (doc_e->de_flags & DOCEF_POPUP)
                                {
                                        st = StrNew(doc_e->left_macro);
                                        DocUnlock(doc);
                                        PopUp(st, Fs);
                                        Free(st);
                                }
                                else
                                {
                                        if (doc_e->de_flags & DOCEF_LEFT_IN_STR)
                                                InStr("%s", doc_e->left_macro);
                                        else
                                                In("%s", doc_e->left_macro);
                                }
                                has_action = TRUE;
                        }
                        if (!exited &&
                                doc_e->de_flags & DOCEF_LIST   &&
                                doc_e->de_flags & DOCEF_DEFINE &&
                                (tmph = HashFind(doc_e->define_str, doc->win_task->hash_table, HTT_DEFINE_STR)) &&
                                (res  = PopUpPickList(tmph->data)) != DOCM_CANCEL)
                        {
                                DocDataFormat(doc, doc_e,res);
                                DocDataScan(doc, doc_e);
                                has_action = TRUE;
                        }
                }
                else if (ch == '\n')
                {
                        if (doc_e->de_flags & DOCEF_LINK && doc->right_click_link)
                        {
                                res = (*doc->right_click_link)(doc, doc_e);
                                has_action = TRUE;
                        }
                        if (doc_e->de_flags & DOCEF_RIGHT_EXP)
                        {
                                res = doc_e->right_exp;
                                has_action = TRUE;
                                Message(MESSAGE_CMD, res, 0, 1 << JOBf_DONT_FILTER);
                        }
                        if (doc_e->de_flags & DOCEF_RIGHT_CB && doc_e->right_cb)
                        {
                                DocUnlock(doc);
                                res = (*doc_e->right_cb)(doc, doc_e);
                                has_action = TRUE;
                                Message(MESSAGE_CMD, res, 0, 1 << JOBf_DONT_FILTER);
                        }
                        if (doc_e->de_flags & DOCEF_RIGHT_MACRO)
                        {
                                if (doc_e->de_flags & DOCEF_POPUP)
                                {
                                        st = StrNew(doc_e->right_macro);
                                        DocUnlock(doc);
                                        PopUp(st, Fs);
                                        Free(st);
                                }
                                else
                                {
                                        if (doc_e->de_flags & DOCEF_RIGHT_IN_STR)
                                                InStr("%s", doc_e->right_macro);
                                        else
                                                In("%s", doc_e->right_macro);
                                }
                                has_action = TRUE;
                        }
                }
        }
        catch
                DocBottom(doc);
        doc->cmd_U8 = CH_SPACE;
er_done:
        if (_has_action)
                *_has_action = has_action;

        return res;
}