uipopup.c

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

C
651
字号
        } else {
            default_event = EV_NO_EVENT;
        }
        ev = uicreatesubpopup( curr_popup, &sub_desc, left, right,
                               default_event, keep_inside, desc, ScrollPos );
        ScrollPos = this_scroll_pos;
        PrevScrollPos = this_prev_scroll_pos;
        switch( ev ) {
        case EV_MOUSE_DRAG :
        case EV_MOUSE_DRAG_R :
        case EV_MOUSE_PRESS:
        case EV_MOUSE_PRESS_R:
        case EV_MOUSE_RELEASE:
        case EV_MOUSE_RELEASE_R:
            uivmousepos( NULL, &row, &col );
            if( ( col > desc->area.col ) &&
                ( col < ( desc->area.col + desc->area.width - 1 ) ) ) {
                curr_row = row - desc->area.row - 1;
                num = desc->area.height - 2;
                if( ( curr_row >= 0 ) && ( curr_row < num ) ) {
                    if( curr_row != ScrollPos ) {
                        Scroll( curr_row, num, menu, desc );
                        *new_ev = ev; // JD - send event back up to parent
                    }
                }
            }
            break;
        case EV_CURSOR_LEFT :
        case EV_CURSOR_RIGHT :
            break;
        default :
            if( ev != EV_NO_EVENT ) {
                DoEnd( window );
                *new_ev = ev;
                return( TRUE );
            }
        }
        uidrawmenu( menu, desc, ScrollPos + 1 );
    }
    return( FALSE );
}

/*
 *  uiposfloatingpopup
 *
 */

bool uiposfloatingpopup( MENUITEM *menu, DESCMENU *desc, ORD row, ORD col,
                         SAREA *keep_inside, SAREA *keep_visible )
{
    desc->area.row = row;
    desc->area.col = col;
    desc->titlecol = 0;
    desc->titlewidth = 0;
    desc->flags = 0;
    uidescmenu( menu, desc );
    if( !RepositionBox( &desc->area, keep_inside, keep_visible ) ) {
        return( FALSE );
    }
    return( TRUE );
}

static EVENT createpopupinarea( MENUITEM *menu, DESCMENU *desc,
                                bool left, bool right,
                                EVENT curr_item, SAREA *keep_inside,
                                SAREA *return_inside, SAREA *return_exclude,
                                bool sub )
{
    EVENT       ev;
    EVENT       new_ev;
    int         curr_row;
    bool        done;
    bool        no_select;
    bool        select_default;
    bool        no_move;
    int         new;
    UI_WINDOW   window;
    int         num;
    int         i;
    ORD         row;
    ORD         col;
    bool        disabled;

    num = desc->area.height - 2;
    if( num <= 0 ) {
        return( EV_NO_EVENT );
    }
    uiopenpopup( desc, &window );
    ScrollPos = NO_SELECT;
    if( curr_item != 0 ) {
        for( i=0; i< num; i++ ) {
            if( ( !MENUSEPARATOR( menu[i] ) ) && ( !MENUGRAYED( menu[i] ) ) &&
                ( menu[i].event == curr_item ) ) {
                ScrollPos = i;
                break;
            }
        }
    }
    uidrawmenu( menu, desc, ScrollPos + 1 );
    if( ScrollPos != NO_SELECT ) {
        uimenucurr( &menu[ScrollPos] );
    }

    uipushlist( ListToClose );
    uipushlist( PopupEvents );
    disabled = uimenuisdisabled(); // JD - keep menus from intercepting alt keys
    uimenudisable( TRUE );
    if( left ) {
        uipushlist( LeftMouseEvents );
    }
    if( right ) {
        uipushlist( RightMouseEvents );
    }

    PrevScrollPos = ScrollPos;
    no_move = TRUE;
    done = FALSE;
    new_ev = EV_NO_EVENT;
    while( !done ) {
        select_default = FALSE;
        ev = uivgetevent( NULL );

        switch( ev ) {
        case EV_CURSOR_LEFT :
            if( !sub ) {
                break;
            }
            /* fall through */
        case EV_ALT_PRESS :
            new_ev = ev;
            done = TRUE;
            DoEnd( &window );
            break;
        case EV_ALT_RELEASE :
            uimenusetaltpressed( FALSE );
            break;
        case EV_CURSOR_UP :
            new = SkipSeparators( -1, num, menu );
            Scroll( new, num, menu, desc );
            break;
        case EV_CURSOR_DOWN :
            new = SkipSeparators( 1, num, menu );
            Scroll( new, num, menu, desc );
            break;
        case EV_MENU_ACTIVE :
            new_ev = ev;
            /* fall through */
        case EV_ESCAPE :
            DoEnd( &window );
            done = TRUE;
            break;
        case EV_MOUSE_MOVE :
            no_move = FALSE;
            break;
        case EV_MOUSE_DCLICK :
        case EV_MOUSE_DCLICK_R :
            if( no_move ) {
                new_ev = ev;
                DoEnd( &window );
                done = TRUE;
            }
            break;
        case EV_MOUSE_DRAG :
        case EV_MOUSE_DRAG_R :
            no_move = FALSE;   /* break intentionally left out */
        case EV_MOUSE_PRESS:
        case EV_MOUSE_PRESS_R:
        case EV_MOUSE_RELEASE:
        case EV_MOUSE_RELEASE_R:
            for( ;; ) { // JD - loop to get subsequent popup created if
                        //      we went directly from one cascaded menu to another
                no_select = TRUE;
                uivmousepos( NULL, &row, &col );
                if( ( return_inside != NULL ) && ( return_exclude != NULL ) ) {
                    if( !InArea( row, col, &desc->area ) &&
                        InArea( row, col, return_inside ) &&
                        !InArea( row, col, return_exclude ) ) {
                        done = TRUE;
                        new_ev = ev;
                        DoEnd( &window );
                    }
                }
                if( !done ) {
                    if( ( col > desc->area.col ) &&
                        ( col < ( desc->area.col + desc->area.width - 1 ) ) ) {
                        curr_row = row - desc->area.row - 1;
                        if( ( curr_row >= 0 ) && ( curr_row < num ) ) {
                            no_select = FALSE;
                            if( curr_row != ScrollPos ) {
                                Scroll( curr_row, num, menu, desc );
                            }
                            if( ( ev == EV_MOUSE_RELEASE ) || ( ev == EV_MOUSE_RELEASE_R ) ) {
                                done = SendEvent( num, menu, row - desc->area.row - 1, &window, &new_ev );
                            } else {
                                new_ev = EV_NO_EVENT; // JD - break loop if no popup created
                                done = createsubpopup( menu, left, right, keep_inside,
                                                       &new_ev, &window, desc, FALSE );
                                if( !done && new_ev != EV_NO_EVENT ) {
                                    continue; // JD - see if we need to create another popup
                                }
                            }
                        }
                    }
                }
                if( ( ev == EV_MOUSE_RELEASE ) || ( ev == EV_MOUSE_RELEASE_R ) ) {
                    if( no_move ) {     /* mouse up and down on same spot */
                        no_select = FALSE;
                        Scroll( 0, num, menu, desc );
                    } else {
                        if( !done ) {
                            done = TRUE;
                            DoEnd( &window );
                        }
                    }
                }
                if( no_select && !done ) {  /* no item is selected */
                    if( ScrollPos != NO_SELECT ) {
                        DrawMenuText( ScrollPos, menu, FALSE, desc );
                        uimenucurr( NULL );
                    }
                    ScrollPos = NO_SELECT;
                }
                break;
            }
            break;
        case EV_RETURN :
            if( ScrollPos != NO_SELECT && menu[ScrollPos].popup != NULL ) { // JD
                done = createsubpopup( menu, left, right, keep_inside,
                                       &new_ev, &window, desc, TRUE );
            } else {
                done = SendEvent( num, menu, ScrollPos, &window, &new_ev );
            }
            break;
        case EV_CURSOR_RIGHT :
            if( ScrollPos != NO_SELECT && menu[ScrollPos].popup != NULL ) { // JD
                done = createsubpopup( menu, left, right, keep_inside,
                                       &new_ev, &window, desc, TRUE );
            } else {
                if( sub ) {
                    new_ev = ev;
                    done = TRUE;
                    DoEnd( &window );
                }
            }
            break;
        case EV_KILL_UI:
            new_ev = ev;
            DoEnd( &window );
            done = TRUE;
            break;
        default :
            if( ev <= EV_LAST_KEYBOARD ) {
                if( KeyboardSelect( ev, num, menu, desc ) ) {
                    if( ScrollPos != NO_SELECT && menu[ScrollPos].popup != NULL ) { // JD
                        done = createsubpopup( menu, left, right, keep_inside,
                                               &new_ev, &window, desc, TRUE );
                    } else {
                        done = SendEvent( num, menu, ScrollPos, &window,
                                          &new_ev );
                    }
                }
            }
            break;
        }
    }
    if( left ) {
        uipoplist( /* LeftMouseEvents*/ );
    }
    if( right ) {
        uipoplist( /* RightMouseEvents*/ );
    }
    uimenudisable( disabled ); // JD
    uipoplist( /* PopupEvents */ );
    uipoplist( /* ListToClose */ );
    return( new_ev );
}

global EVENT uicreatepopupinarea( MENUITEM *menu, DESCMENU *desc, bool left,
                                  bool right, EVENT curr_item,
                                  SAREA *keep_inside, bool sub )
{
    return( createpopupinarea( menu, desc, left, right, curr_item,
                               keep_inside, NULL, NULL, sub ) );
}

global EVENT uicreatesubpopup( MENUITEM *menu, DESCMENU *desc, bool left,
                               bool right, EVENT curr_item, SAREA *keep_inside,
                               DESCMENU *parent_menu, int index )
{
    SAREA       return_exclude;

    return_exclude.row = parent_menu->area.row + index + 1;
    return_exclude.col = parent_menu->area.col;
    return_exclude.width = parent_menu->area.width;
    return_exclude.height = 1;

    return( uicreatesubpopupinarea( menu, desc, left, right, curr_item,
                                    keep_inside, &parent_menu->area,
                                    &return_exclude ) );
}

global EVENT uicreatesubpopupinarea( MENUITEM *menu, DESCMENU *desc, bool left,
                                     bool right, EVENT curr_item, SAREA *keep_inside,
                                     SAREA *return_inside, SAREA *return_exclude )
{
    return( createpopupinarea( menu, desc, left, right, curr_item, keep_inside,
                               return_inside, return_exclude, TRUE ) );
}

global EVENT uicreatepopup( ORD row, ORD col, MENUITEM *menu, int left, int right,
                            EVENT curr_item )
{
    DESCMENU    desc;
    SAREA       keep_inside;

    keep_inside.row = 0;
    keep_inside.col = 0;
    keep_inside.width = UIData->width;
    keep_inside.height = UIData->height;
    if( uiposfloatingpopup( menu, &desc, row, col, &keep_inside, NULL ) ) {
        return( uicreatepopupdesc( menu, &desc, left, right, curr_item, FALSE ) );
    }
    return( EV_NO_EVENT );
}

⌨️ 快捷键说明

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