Пример #1
0
static void setstartline( a_list *list )
{
    int             maxline;
    a_list_info     *box;

    maxline = uilistsize( list );
    box = list->box;

    if( box->line + box->area.height > maxline ) {
        if( maxline > box->area.height ) {
            box->line = maxline - box->area.height;
        } else {
            box->line = 0;
        }
    }
}
Пример #2
0
a_list_info *uibeglistbox( VSCREEN *vs, SAREA *area, a_list *list )
{
    a_list_info     *box;
    unsigned        maxline;

    box = uicalloc( 1, sizeof( a_list_info ) );
    if( box == NULL ) {
        return( NULL );
    }
    if( list->get == NULL ) {
        list->get = ( bool (*) ( void *, unsigned, char *, unsigned ) )
                        uigetlistelement;
    }

    box->vs     = vs;
    box->area   = *area;
    box->line   = list->choice;
    box->row    = list->choice;
    box->attr   = ATTR_EDIT;

    maxline = uilistsize( list );

    box->gadget.win = box->vs;          // Initialize gadget
    box->gadget.dir = VERTICAL;
    box->gadget.anchor = box->area.col + box->area.width + 1;
    box->gadget.start = box->area.row + 1;
    box->gadget.end = box->area.row + box->area.height;
    box->gadget.forward = EV_SCROLL_LINE_DOWN;
    box->gadget.backward = EV_SCROLL_LINE_UP;
    box->gadget.slider = EV_SCROLL_VERTICAL,
    box->gadget.pageforward = EV_SCROLL_PAGE_DOWN;
    box->gadget.pagebackward = EV_SCROLL_PAGE_UP;
    box->gadget.total_size = (int)maxline;
    if( box->gadget.total_size < (int)box->area.height )
        box->gadget.total_size = (int)box->area.height;
    box->gadget.page_size = box->area.height;
    box->gadget.pos = 0;
    box->gadget.flags = GADGET_NONE;
    uiinitgadget( &box->gadget );

    list->box = box;
    setstartline( list );
    uipaintlistbox( list );

    return( box );
}
Пример #3
0
void uiupdatelistbox( a_list *list )
{
    int     maxline;

    if( list->box == NULL ) {
        return;
    }
    maxline = uilistsize( list );
    list->box->row = list->choice;
    list->box->gadget.total_size = maxline;
    if( list->box->gadget.total_size < (int)list->box->area.height )
        list->box->gadget.total_size = (int)list->box->area.height;
    uisetgadget( &list->box->gadget, list->choice );
    setstartline( list );
    if( selectoutofrange( list->box ) ) {
        list->box->line = list->box->row;
    }
    setstartline( list );
    uidrawgadget( &list->box->gadget );
    uipaintlistbox( list );
}
Пример #4
0
EVENT charselect( EVENT ev, a_list *list )
{
    int         num;
    int         i;
    char        typed;

    typed = (char)ev;
    if( isupper( typed ) ) {
        typed = tolower( typed );
    }
    num = uilistsize( list );
    for( i = list->choice + 1; i < num; i++ ) {
        if( checkitem( list, typed, i ) ) {
            return( EV_LIST_BOX_CHANGED );
        }
    }
    for( i = 0; i < list->choice; i++ ) {
        if( checkitem( list, typed, i ) ) {
            return( EV_LIST_BOX_CHANGED );
        }
    }
    return( EV_NO_EVENT );
}
Пример #5
0
static int getmouseregion( a_list *list, int *row, int *col )
{
    a_list_info     *box;

    box  = list->box;

    uimousepos( box->vs, row, col );

    if( *row - box->area.row >= (int)uilistsize( list ) ) {
        return( R_UNS );
    }
    if( *row >= box->area.height + box->area.row ) {
        return( R_DOWN );
    }
    if( *row < box->area.row ) {
        return( R_UP );
    }
    if( ( *col >= box->area.col + box->area.width ) ||
        ( *col <  box->area.col ) ) {
        return( R_UNS );
    }
    return( R_SEL );
}
Пример #6
0
int GUIListSize( a_list *list )
{
    return( uilistsize( list ) );
}
Пример #7
0
EVENT uilistbox( EVENT ev, a_list *list, bool permanent )
{
    int             listsize;
    int             maxline;
    int             newevent;
    a_list_info     *box;
    int             old_line;
    ORD             old_row;
    bool            close;

    if( Dclick ) {
        switch( ev ) {
        case EV_MOUSE_PRESS :
            Dclick = FALSE; /* must have gotten dlick without release */
            /* fall through */
        case EV_SCROLL_LINE_UP :
        case EV_SCROLL_LINE_DOWN :
        case EV_SCROLL_PAGE_UP :
        case EV_SCROLL_PAGE_DOWN :
        case EV_PAGE_UP :
        case EV_PAGE_DOWN :
        case EV_CURSOR_UP :
        case EV_CURSOR_DOWN :
            SelStart = FALSE;
            break;
        case EV_MOUSE_RELEASE :
            Dclick = FALSE;
            /* fall through */
        default :
            return( ev );
        }
    }
    close = FALSE;
    box = list->box;
    old_line = box->line;
    old_row = box->row;
    listsize = uilistsize( list );

    if( listsize > box->area.height ) {
        maxline = listsize - box->area.height;
    } else {
        maxline = 0;
    }

    if( maxline > 0 ) {
        ev = uigadgetfilter( ev, &box->gadget );
    }

    newevent = EV_NO_EVENT;
    switch( ev ) {
        case EV_MOUSE_DCLICK:
            Dclick = TRUE;
        case EV_MOUSE_PRESS:
        case EV_MOUSE_RELEASE:
        case EV_MOUSE_REPEAT:
        case EV_MOUSE_DRAG:
            {
                int         row, col, mpos;

                mpos = getmouseregion( list, &row, &col );
                newevent = ev;
                if( mpos == R_SEL ) {
                    SelStart = TRUE;
                    box->row  = (ORD) row - box->area.row;
                    box->row += box->line;
                }
                if( ev == EV_MOUSE_RELEASE ) {
                    if( mpos == R_SEL ) {
                        list->choice = list->box->row;
                        newevent = EV_LIST_BOX_CHANGED;
                    }
                    if( SelStart ) {
                        close = TRUE;
                        SelStart = FALSE;
                    }
                } else if( ev == EV_MOUSE_PRESS || ev == EV_MOUSE_DCLICK ) {
                    if( mpos == R_SEL ) {
                        if( ev == EV_MOUSE_DCLICK ) {
                            newevent = EV_LIST_BOX_DCLICK;
                        }
                    } else {
                        close = TRUE;
                    }
                } else if( mpos == R_UP  &&  box->line > 0  &&  SelStart ) {
                    box->line--;
                    box->row--;
                } else if( mpos == R_DOWN  &&  box->line < maxline ) {
                    box->line++;
                    box->row++;
                }
            }
            break;
        case EV_CURSOR_UP :
            if( box->row > 0 ) {
                if( box->row == box->line ) {
                    box->line--;
                }
                box->row--;
                list->choice = box->row;
                newevent = EV_LIST_BOX_CHANGED;
            }
            if( selectoutofrange( box ) ) {
                box->line = box->row;
                setstartline( list );
            }
            break;
        case EV_SCROLL_LINE_UP :
            if( box->line > 0 ) {
                box->line--;
            }
            break;
        case EV_CURSOR_DOWN :
            if( box->row < listsize - 1 ) {
                if( box->row - box->line == box->area.height - 1
                    && box->line < maxline ) {
                        ++box->line;
                }
                ++box->row;
                list->choice = box->row;
                newevent = EV_LIST_BOX_CHANGED;
            }
            if( selectoutofrange( box ) ) {
                box->line = box->row;
                setstartline( list );
            }
            break;
        case EV_SCROLL_LINE_DOWN :
            if( box->line < maxline ) {
                box->line++;
            }
            break;
        case EV_PAGE_UP :
            if( box->row == box->line ) {
                if( box->line < ( box->area.height - 1 ) ) {
                    box->line = 0;
                } else {
                    box->line -= ( box->area.height - 1 );
                }
                box->row -= old_line - box->line;
            } else {
                box->row = box->line;
            }
            if( box->row != old_row ) {
                list->choice = box->row;
                newevent = EV_LIST_BOX_CHANGED;
            }
            break;
        case EV_SCROLL_PAGE_UP :
            if( box->line < box->area.height ) {
                box->line = 0;
            } else {
                box->line -= box->area.height;
            }
            break;
        case EV_PAGE_DOWN :
            if( box->row == ( box->line + box->area.height - 1 ) ) {
                box->line += box->area.height - 1;
                if( box->line > maxline ) {
                    box->line = maxline;
                }
                box->row += ( box->line - old_line );
            } else {
                box->row = box->line + box->area.height - 1;
            }
            if( box->row != old_row ) {
                list->choice = box->row;
                newevent = EV_LIST_BOX_CHANGED;
            }
            break;
        case EV_SCROLL_PAGE_DOWN :
            box->line += box->area.height;
            if( box->line > maxline ) {
                box->line = maxline;
            }
            break;
        case EV_SCROLL_VERTICAL :
            box->line = box->gadget.pos;
            break;
        case EV_ALT_CURSOR_UP :
            close = TRUE;
            break;
        default :
            if( isalpha( ev ) ) {
                newevent = charselect( ev, list );
            } else {
                newevent = ev;
            }
            break;
    }
    if( ( old_line != box->line ) && ( maxline > 0 ) ) {
        uisetgadget( &box->gadget, box->line );
    }
    if( box->line != old_line || box->row != old_row ) {
        uipaintlistbox( list );
    }

    if( !permanent && close ) {
        uiendlistbox( list );
        newevent = EV_LIST_BOX_CLOSED;
    }
    return( newevent );
}
Пример #8
0
gui_ctl_idx GUIListSize( a_list *list )
{
    return( uilistsize( list ) );
}