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

📄 dialog.cxx

📁 eCos1.31版
💻 CXX
📖 第 1 页 / 共 2 页
字号:
//{{{  Banner                           //============================================================================////     dialog.cxx////     Implementation of the CdlDialog class////============================================================================//####COPYRIGHTBEGIN####//                                                                          // ----------------------------------------------------------------------------// Copyright (C) 1999, 2000 Red Hat, Inc.//// This file is part of the eCos host tools.//// This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation; either version 2 of the License, or (at your option) // any later version.// // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for // more details.// // You should have received a copy of the GNU General Public License along with// this program; if not, write to the Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.//// ----------------------------------------------------------------------------//                                                                          //####COPYRIGHTEND####//============================================================================//#####DESCRIPTIONBEGIN####//// Author(s):   bartv// Contact(s):  bartv// Date:        1999/03/01// Version:     0.01////####DESCRIPTIONEND####//============================================================================//}}}//{{{  #include's                       // ----------------------------------------------------------------------------#include "cdlconfig.h"// Get the infrastructure types, assertions, tracing and similar// facilities.#include <cyg/infra/cyg_ass.h>#include <cyg/infra/cyg_trac.h>// <cdlcore.hxx> defines everything implemented in this module.// It implicitly supplies <string>, <vector> and <map> because// the class definitions rely on these headers.#include <cdlcore.hxx>//}}}//{{{  Class statics                    // ----------------------------------------------------------------------------CYGDBG_DEFINE_MEMLEAK_COUNTER(CdlDialogBody);// The application code can specify whether or not it supports custom// dialogs. This affects the internals of e.g.// CdlValuable::get_widget_hint(). For now err on the side of caution.bool CdlDialogBody::dialogs_enabled     = false;voidCdlDialogBody::disable_dialogs(){    CYG_REPORT_FUNCNAME("CdlDialog::disable_dialogs");    dialogs_enabled = false;    CYG_REPORT_RETURN();}voidCdlDialogBody::enable_dialogs(){    CYG_REPORT_FUNCNAME("CdlDialog::enable_dialogs");    dialogs_enabled = true;    CYG_REPORT_RETURN();}boolCdlDialogBody::dialogs_are_enabled(){    CYG_REPORT_FUNCNAMETYPE("CdlDialog::dialogs_are_enabled", "result %d");    bool result = dialogs_enabled;    CYG_REPORT_RETVAL(result);    return result;}//}}}//{{{  Constructor                      // ----------------------------------------------------------------------------// Constructor. The real work is actually done in the parse routine.//// There is no data associated with a custom dialog object.CdlDialogBody::CdlDialogBody(std::string name_arg)    : CdlNodeBody(name_arg),      CdlParentableBody(),      CdlUserVisibleBody(){    CYG_REPORT_FUNCNAME("CdlDialogBody:: constructor");    CYG_REPORT_FUNCARG1XV(this);    cdldialogbody_cookie = CdlDialogBody_Magic;    CYGDBG_MEMLEAK_CONSTRUCTOR();        CYG_POSTCONDITION_THISC();    CYG_REPORT_RETURN();}//}}}//{{{  Destructor                       // ----------------------------------------------------------------------------// The real work is done in the base classes.CdlDialogBody::~CdlDialogBody(){    CYG_REPORT_FUNCNAME("CdlDialogBody:: destructor");    CYG_REPORT_FUNCARG1XV(this);    CYG_PRECONDITION_THISC();    cdldialogbody_cookie = CdlDialogBody_Invalid;    CYGDBG_MEMLEAK_DESTRUCTOR();        CYG_REPORT_RETURN();}//}}}//{{{  parse_dialog()                   // ----------------------------------------------------------------------------// Parsing a dialog definition.intCdlDialogBody::parse_dialog(CdlInterpreter interp, int argc, char** argv){    CYG_REPORT_FUNCNAMETYPE("CdlDialog::parse_dialog", "result %d");    CYG_REPORT_FUNCARG1("argc %d", argc);    CYG_PRECONDITION_CLASSC(interp);        const char* diag_argv0      = CdlParse::get_tcl_cmd_name(argv[0]);    CdlLoadable  loadable       = interp->get_loadable();    CdlContainer parent         = interp->get_container();           CdlToplevel  toplevel       = interp->get_toplevel();    std::string filename        = interp->get_filename();    CYG_ASSERT_CLASSC(loadable);        // There should always be a loadable during parsing    CYG_ASSERT_CLASSC(parent);    CYG_ASSERT_CLASSC(toplevel);    CYG_ASSERTC("" != filename);    // The new dialog should be created and added to the loadable    // early on. If there is a parsing error it will get cleaned up    // automatically as a consequence of the loadable destructor.    // However it is necessary to validate the name first. Errors    // should be reported via CdlParse::report_error(), which    // may result in an exception.    CdlDialog    new_dialog     = 0;    CdlNode      old_node       = 0;    std::vector<CdlInterpreterCommandEntry>* old_commands = 0;    int          result         = TCL_OK;        // Currently there are no command-line options. This may change in future.    if (3 != argc) {        CdlParse::report_error(interp, std::string("Incorrect number of arguments to ") + diag_argv0 +                               "\n    Expecting name and properties list.");    } else if (!Tcl_CommandComplete(argv[2])) {        CdlParse::report_error(interp, std::string("Invalid property list for cdl_dialog ") + argv[1]);    } else if (0 != toplevel->lookup(argv[1])) {        CdlParse::report_error(interp, std::string("Dialog ") + argv[1] + " cannot be loaded.\n" +                               "    The name is already in use.");    } else {        try {            new_dialog = new CdlDialogBody(argv[1]);            toplevel->add_node(loadable, parent, new_dialog);            // Push the dialog as the current base object early on.            // This aids diagnostics.            old_node = interp->push_node(new_dialog);            std::string tcl_result;            std::vector<CdlInterpreterCommandEntry>  new_commands;            static CdlInterpreterCommandEntry commands[] =            {                CdlInterpreterCommandEntry("init_proc",          &CdlWizardBody::parse_init_proc    ),                CdlInterpreterCommandEntry("update_proc",        &CdlDialogBody::parse_update_proc  ),                CdlInterpreterCommandEntry("display_proc",       &CdlDialogBody::parse_display_proc ),                CdlInterpreterCommandEntry("confirm_proc",       &CdlWizardBody::parse_confirm_proc ),                CdlInterpreterCommandEntry("cancel_proc",        &CdlWizardBody::parse_cancel_proc  ),                CdlInterpreterCommandEntry("",                   0                                  ),            };            int i;            for (i = 0; 0 != commands[i].command; i++) {                new_commands.push_back(commands[i]);            }            CdlParentableBody::add_property_parsers(new_commands);            CdlUserVisibleBody::add_property_parsers(new_commands);            CdlNodeBody::add_property_parsers(new_commands);                // Now evaluate the body. If an error occurs then typically            // this will be reported via CdlParse::report_error(),            // but any exceptions will have been intercepted and            // turned into a Tcl error.            old_commands = interp->push_commands(new_commands);            result = interp->eval(argv[2], tcl_result);            interp->pop_commands(old_commands);            old_commands = 0;            interp->pop_node(old_node);            old_node = 0;                    if (TCL_OK == result) {                // Even if there were errors, they were not fatal. There may                // now be a number of properties for this option, and some                // validation should take place. Start with the base classes.                new_dialog->CdlNodeBody::check_properties(interp);                new_dialog->CdlUserVisibleBody::check_properties(interp);                new_dialog->CdlParentableBody::check_properties(interp);                // The init_proc and update_proc properties are optional.                // The display_proc, confirm_proc and cancel_proc properties                // are compulsory.                if (new_dialog->count_properties(CdlPropertyId_InitProc) > 1) {                    CdlParse::report_error(interp, "A dialog should have only one `init_proc' property.");                }                if (new_dialog->count_properties(CdlPropertyId_UpdateProc) > 1) {

⌨️ 快捷键说明

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