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 + -
显示快捷键?