setupinf.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,908 行 · 第 1/5 页

C
1,908
字号
            def_ret = TRUE;
        }
        id = set_dlg_push_button( line_start, line_start, dlg->curr_dialog->controls, dlg->array.num-1, dlg->row_num,
                             dlg->num_push_buttons, W/BW - 1, W, BW );
        if( def_ret ) dlg->curr_dialog->ret_val = IdToDlgState( id );
        dlg->max_width = max( dlg->max_width, dlg->num_push_buttons * ( ( 3*BW ) / 2 ) );
        line = next; next = NextToken( line, ',' );
        if( line != NULL ) {
            // condition for visibility (dynamic)
            GUIStrDup( line,
                       &dlg->curr_dialog->pVisibilityConds[ dlg->curr_dialog->num_controls ] );
        }
    } else {
        rc = FALSE;
    }
    return( rc );
}

static bool dialog_edit_button( char *next, DIALOG_INFO *dlg )
/*************************************************************/
{
    int                 len;
    char                *line;
    char                *vbl_name;
    char                *val;
    char                *section;
    char                *button_text;
    char                *dialog_name;
#if defined( __NT__ )
    char                *value;
#endif
    vhandle             var_handle;
    vhandle             var_handle_2;
    char                buff[MAXBUF];
    bool                rc = TRUE;
    char                dummy_var[ DUMMY_VAR_SIZE ];

    line = next; next = NextToken( line, ',' );
    GUIStrDup( line, &vbl_name );
    var_handle = AddVariable( vbl_name );
    line = next; next = NextToken( line, ',' );
    val = NULL;
    if( line[ 0 ] != '\0' ) {
        if( line[0] == '%' ) {
            val = GetVariableStrVal( &line[1] );
        } else if( line[0] == '@' ) {
            // support @envvar@section:value - 2nd part is optional
            section = strchr( &line[1], '@' );
            if( section != NULL ) {
                // terminate envvar
                *section = '\0';
#if defined( __NT__ )
                ++section;
                value = strchr( section, ':' );
                if( value != NULL ) {
                    *value = '\0';
                    ++value;
                    if( GetRegString( HKEY_CURRENT_USER, section, value, buff, MAXBUF ) ) {
                        val = buff;
                    }
                }
#endif
            }
            if( val == NULL && line[1] != '\0' ) {
                val = getenv( &line[1] );
            }
        } else {
            val = line;
        }
    }
    if( val == NULL || val[0] == '\0' ) val = VarGetStrVal( var_handle );
    SetVariableByHandle( var_handle, val );
    if( VariablesFile != NULL ) {
        ReadVariablesFile( VarGetName( var_handle ) );
    }
    line = next; next = NextToken( line, '"' );
    line = next; next = NextToken( line, '"' );
    ReplaceVars( buff, line );
    line = next; next = NextToken( line, ',' );
    line = next; next = NextToken( line, ',' );

    line = TrimQuote( line );
    var_handle_2 = AddVariable( line );
    len = max( BW, strlen( line + 2 ) );
    button_text = line;
    line = next; next = NextToken( line, ',' );
    dialog_name = line;
    line = next; next = NextToken( line, ',' );

    if( line == NULL || *line == '\0' || EvalCondition( line ) ) {
        dlg->curr_dialog->pVariables[dlg->num_variables] = var_handle;
        dlg->num_variables += 1;
        line = next; next = NextToken( line, ',' );
        if( line != NULL ) {
            // condition for visibility (dynamic)
            GUIStrDup( line,
                       &dlg->curr_dialog->pVisibilityConds[ dlg->curr_dialog->num_controls ] );
            GUIStrDup( line,
                       &dlg->curr_dialog->pVisibilityConds[ dlg->curr_dialog->num_controls + 1 ] );
        }
        MakeDummyVar( dummy_var );
        var_handle_2 = AddVariable( dummy_var );
        SetVariableByHandle( var_handle_2, dialog_name );

        set_dlg_push_button( dummy_var, button_text, dlg->curr_dialog->controls, dlg->array.num-1, dlg->row_num,
                                 4, 4, W, BW );
        BumpArray( &dlg->array );
        set_dlg_edit( dlg->curr_dialog->controls, dlg->array.num-1,
                      buff, VarGetId( var_handle ), C0, dlg->row_num, C0 + BW - 1 );
        if( buff[0] != '\0' ) {
            BumpArray( &dlg->array );
            if( line != NULL ) {
                // condition for visibility (dynamic)
                GUIStrDup( line,
                           &dlg->curr_dialog->pVisibilityConds[ dlg->curr_dialog->num_controls + 2 ] );

            }
            MakeDummyVar( dummy_var );
            // dummy_var allows control to have an id - used by dynamic visibility feature
            var_handle = AddVariable( dummy_var );
            set_dlg_dynamstring( dlg->curr_dialog->controls, dlg->array.num-1, buff, var_handle,
                      C0, dlg->row_num, C0 + strlen( buff ) );
        }
        dlg->max_width = max( dlg->max_width, 2*strlen( buff ) );
    } else {
        rc = FALSE;
    }
    GUIMemFree( vbl_name );
    return( rc );
}

static bool dialog_other_button( char *next, DIALOG_INFO *dlg )
/*************************************************************/
{
    char                dummy_var[ DUMMY_VAR_SIZE ];
    char                *line, *button_text, *next_copy, *text, *dialog_name;
    char                *condition, *vis_condition;
    vhandle             var_handle;
    bool                rc = TRUE;

    line = next; next = NextToken( line, ',' );
    button_text = TrimQuote( line );
    line = next; next = NextToken( line, ',' );
    dialog_name = line;
    GUIStrDup( next, &next_copy );
    line = next; next = NextToken( line, ',' );
    text = line;
    line = next; next = NextToken( line, ',' );
    condition = line;
    line = next; next = NextToken( line, ',' );
    vis_condition = line;

    if( condition == NULL || *condition == '\0' || EvalCondition( condition ) ) {
        MakeDummyVar( dummy_var );
        var_handle = AddVariable( dummy_var );
        SetVariableByHandle( var_handle, dialog_name );
        set_dlg_push_button( dummy_var, button_text, dlg->curr_dialog->controls, dlg->array.num-1, dlg->row_num,
                             4, 4, W, BW );
        if( text != NULL ) {
            BumpArray( &dlg->array );
            dlg->col_num = 1;
            dialog_static( next_copy, dlg );
        }
        if( vis_condition != NULL ) {
   // condition for visibility (dynamic)
            GUIStrDup( vis_condition,
                       &dlg->curr_dialog->pVisibilityConds[ dlg->curr_dialog->num_controls ] );
            if( text != NULL ) {
                GUIStrDup( vis_condition,
                           &dlg->curr_dialog->pVisibilityConds[ dlg->curr_dialog->num_controls + 1 ] );
            }
        }
    } else {
        rc = FALSE;
    }
    GUIMemFree( next_copy );
    return( rc );
}


static vhandle dialog_set_variable( DIALOG_INFO *dlg, char *vbl_name,
                                    char *init_cond )
/*********************************************************************************/
{
    vhandle     var_handle;

    dlg=dlg;
    var_handle = AddVariable( vbl_name );
    dlg->curr_dialog->pVariables[dlg->num_variables] = var_handle;
    if( *init_cond == '\0' ) {
        dlg->curr_dialog->pConditions[dlg->num_variables] = NULL;
    } else {
        GUIStrDup( init_cond, &dlg->curr_dialog->pConditions[dlg->num_variables] );
        if( SkipDialogs ) {
            if( stricmp( init_cond, "true" ) == 0 ) {
                SetVariableByHandle( var_handle, "1" );
            } else if( stricmp( init_cond, "false" ) == 0 ) {
                SetVariableByHandle( var_handle, "0" );
            } else {
                SetVariableByHandle( var_handle, init_cond );
            }
        }
    }
    dlg->num_variables += 1;
    return( var_handle );
}


static bool dialog_radiobutton( char *next, DIALOG_INFO *dlg )
/************************************************************/
{
    int                 len;
    char                *line;
    char                *vbl_name;
    vhandle             var_handle;
    char                *text;
    char                *init_cond;
    bool                rc = TRUE;

    line = next; next = NextToken( line, ',' );
    GUIStrDup( line, &vbl_name );
    line = next; next = NextToken( line, ',' );
    GUIStrDup( line, &init_cond );
    line = next; next = NextToken( line, '"' );
    line = next; next = NextToken( line, '"' );
    GUIStrDup( line, &text );
    line = next; next = NextToken( line, ',' );
    line = next; next = NextToken( line, ',' );
    if( line == NULL || *line == '\0' || EvalCondition( line ) ) {
        var_handle = dialog_set_variable( dlg, vbl_name, init_cond );
        dlg->num_radio_buttons += 1;
        len = strlen( text ) + 4; // room for button
        line = next; next = NextToken( line, ',' );
        if( line != NULL ) {
            // condition for visibility (dynamic)
            GUIStrDup( line,
                       &dlg->curr_dialog->pVisibilityConds[ dlg->curr_dialog->num_controls ] );
        }
        set_dlg_radio( dlg->curr_dialog->controls, dlg->array.num-1,
                       dlg->num_radio_buttons, text, VarGetId( var_handle ), C0, dlg->row_num, C0 + len );
        dlg->max_width = max( dlg->max_width, len );
    } else {
        rc = FALSE;
    }
    GUIMemFree( init_cond );
    GUIMemFree( vbl_name );
    GUIMemFree( text );
    return( rc );
}


static bool dialog_checkbox( char *next, DIALOG_INFO *dlg )
/*********************************************************/
{
    int                 len;
    char                *line;
    char                *vbl_name;
    vhandle             var_handle;
    char                *text;
    char                *init_cond;
    bool                rc = TRUE;

    line = next; next = NextToken( line, ',' );
    GUIStrDup( line, &vbl_name );
    line = next; next = NextToken( line, ',' );
    GUIStrDup( line, &init_cond );
    line = next; next = NextToken( line, '"' );
    line = next; next = NextToken( line, '"' );
    GUIStrDup( line, &text );
    line = next; next = NextToken( line, ',' );
    line = next; next = NextToken( line, ',' );
    if( line == NULL || *line == '\0' || EvalCondition( line ) ) {
        var_handle = dialog_set_variable( dlg, vbl_name, init_cond );
        len = strlen( text ) + 4; // room for button
        line = next; next = NextToken( line, ',' );
        if( line != NULL ) {
            // condition for visibility (dynamic)
            GUIStrDup( line,
                       &dlg->curr_dialog->pVisibilityConds[ dlg->curr_dialog->num_controls ] );
        }
        set_dlg_check( dlg->curr_dialog->controls, dlg->array.num-1, text, VarGetId( var_handle ), dlg->col_num, dlg->row_num, dlg->col_num + len );
        if( dlg->col_num == C0 ) {
            // 1st check-box on line
            dlg->max_width = max( dlg->max_width, len );
            dlg->col_num += len + 1;    // update col_num for next time
        } else {
            // 2nd check-box
            len = max( dlg->col_num - 1, len );
            dlg->max_width = max( dlg->max_width, 2 * len + 1 );  // add 1 for space
        }
    } else {
        rc = FALSE;
    }
    GUIMemFree( init_cond );
    GUIMemFree( vbl_name );
    GUIMemFree( text );
    return( rc );
}


static bool dialog_detail_check( char *next, DIALOG_INFO *dlg )
/*************************************************************/
{
    char        *line;
    char        *next2_org;
    char        *next2;
    vhandle     var_handle;
    bool        added;

    line = next; next = NextToken( line, ',' );
    line = TrimQuote( line );
    var_handle = AddVariable( line );
    SetVariableByHandle( var_handle, line );
    line = next; next = NextToken( line, ',' );
    GUIStrDup( next, &next2_org );
    next2 = next2_org;
    added = dialog_checkbox( next, dlg );
    if( added ) {
        BumpArray( &dlg->array );
        set_dlg_push_button( VarGetName( var_handle ), line,
                             dlg->curr_dialog->controls, dlg->array.num-1, dlg->row_num,
                             4, 4, W, BW );
    }
    line = next2; next2 = NextToken( line, ',' );
    line = next2; next2 = NextToken( line, ',' );
    line = next2; next2 = NextToken( line, ',' );
    line = next2; next2 = NextToken( line, ',' );
    if( next2 != NULL ) {
        // condition for visibility (dynamic)
        GUIStrDup( next2,
                   &dlg->curr_dialog->pVisibilityConds[ dlg->curr_dialog->num_controls ] + 1 );
    }
    GUIMemFree( next2_org );
    return( added );
}

extern void SimSetNeedGetDiskSizes()
/**********************************/
{
    NeedGetDiskSizes = TRUE;
}


static bool dialog_editcontrol( char *next, DIALOG_INFO *dlg )
/************************************************************/
{
    char                *line;
    char                *vbl_name;
    char                *val;
    char                *section;
#if defined( __NT__ )
    char                *value;
#endif
    vhandle             var_handle;
    char                buff[MAXBUF];
    bool                rc = TRUE;
    char                dummy_var[ DUMMY_VAR_SIZE ];

    line = next; next = NextToken( line, ',' );
    GUIStrDup( line, &vbl_name );
    var_handle = AddVariable( vbl_name );
    line = next; next = NextToken( line, ',' );
    val = NULL;
    if( line[ 0 ] != '\0' ) {
        if( line[0] == '%' ) {
            val = GetVariableStrVal( &line[1] );
        } else if( line[0] == '@' ) {
            // support @envvar@section:value - 2nd part is optional
            section = strchr( &line[1], '@' );
            if( section != NULL ) {
                // terminate envvar
                *section = '\0';
#if defined( __NT__ )
                ++section;
                value = strchr( section, ':' );
                if( value != NULL ) {
                    *value = '\0';
                    ++value;
                    if( GetRegString( HKEY_CURRENT_USER, section, value, buff, MAXBUF ) ) {
                        val = buff;
                    }
                }

⌨️ 快捷键说明

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