void TStatusLine::handleEvent( TEvent& event ) { TView::handleEvent(event); switch (event.what) { case evMouseDown: { TStatusItem *T = 0; do { TPoint mouse = makeLocal( event.mouse.where ); if( T != itemMouseIsIn(mouse) ) drawSelect( T = itemMouseIsIn(mouse) ); } while( mouseEvent( event, evMouseMove ) ); if( T != 0 && commandEnabled(T->command) ) { event.what = evCommand; event.message.command = T->command; event.message.infoPtr = 0; putEvent(event); } clearEvent(event); drawView(); break; } case evKeyDown: { for( TStatusItem *T = items; T != 0; T = T->next ) { if( event.keyDown.keyCode == T->keyCode && commandEnabled(T->command)) { event.what = evCommand; event.message.command = T->command; event.message.infoPtr = 0; return; } } break; } case evBroadcast: if( event.message.command == cmCommandSetChanged ) drawView(); break; } }
void TStatusLine::drawSelect( TStatusItem *selected ) { TDrawBuffer b; ushort color; char hintBuf[256]; ushort cNormal = getColor(0x0301); ushort cSelect = getColor(0x0604); ushort cNormDisabled = getColor(0x0202); ushort cSelDisabled = getColor(0x0505); b.moveChar( 0, ' ', cNormal, size.x ); TStatusItem *T = items; ushort i = 0; while( T != 0 ) { if( T->text != 0 ) { ushort l = cstrlen( T->text ); if( i + l < size.x ) { if( commandEnabled( T->command) ) if( T == selected ) color = cSelect; else color = cNormal; else if( T == selected ) color = cSelDisabled; else color = cNormDisabled; b.moveChar( i, ' ', color, 1 ); b.moveCStr( i+1, T->text, color ); b.moveChar( i+l+1, ' ', color, 1 ); } i += l+2; } T = T->next; } if( i < size.x - 2 ) { strcpy( hintBuf, hint( helpCtx ) ); if( *hintBuf != EOS ) { b.moveStr( i, hintSeparator, cNormal ); i += 2; if( strlen(hintBuf) + i > size.x ) hintBuf[size.x-i] = EOS; b.moveStr( i, hintBuf, cNormal ); i += strlen(hintBuf); } } writeLine( 0, 0, size.x, 1, b ); }
void TMenuView::do_a_select( TEvent& event ) { putEvent( event ); event.message.command = owner->execView(this); if( event.message.command != 0 && commandEnabled(event.message.command) ) { event.what = evCommand; event.message.infoPtr = 0; putEvent(event); } clearEvent(event); }
TButton::TButton( const TRect& bounds, const char *aTitle, ushort aCommand, ushort aFlags) : TView( bounds ), flags( aFlags ), amDefault( Boolean( (aFlags & bfDefault) != 0 ) ), title( newStr( aTitle ) ), command( aCommand ) { options |= ofSelectable | ofFirstClick | ofPreProcess | ofPostProcess; eventMask |= evBroadcast; if( !commandEnabled(aCommand) ) state |= sfDisabled; }
Boolean TMenuView::updateMenu( TMenu *menu ) { Boolean res = False; for( TMenuItem *p = menu->items; p != 0; p = p->next ) { if( p->name != 0 ) if( p->command == 0 ) { if (updateMenu(p->subMenu) == True) res = True; } else { Boolean commandState = commandEnabled(p->command); if( p->disabled == commandState ) { p->disabled = Boolean(!commandState); res = True; } } } return res; }
void TMenuView::handleEvent( TEvent& event ) { if( menu != 0 ) switch (event.what) { case evMouseDown: do_a_select(event); break; case evKeyDown: if( findItem(getAltChar(event.keyDown.keyCode)) != 0 ) do_a_select(event); else { TMenuItem *p = hotKey(event.keyDown.keyCode); if( p != 0 && commandEnabled(p->command)) { event.what = evCommand; event.message.command = p->command; event.message.infoPtr = 0; putEvent(event); clearEvent(event); } } break; case evCommand: if( event.message.command == cmMenu ) do_a_select(event); break; case evBroadcast: if( event.message.command == cmCommandSetChanged ) { if( updateMenu(menu) ) drawView(); } break; } }
ushort TMenuView::execute() { Boolean autoSelect = False; menuAction action; char ch; ushort result = 0; TMenuItem *itemShown = 0; TMenuItem *p; TMenuView *target; TRect r; TEvent e; current = menu->deflt; do { action = doNothing; getEvent(e); switch (e.what) { case evMouseDown: if( mouseInView(e.mouse.where) || mouseInOwner(e) ) { trackMouse(e); if( size.y == 1 ) autoSelect = True; } else action = doReturn; break; case evMouseUp: trackMouse(e); if( mouseInOwner(e) ) current = menu->deflt; else if( current != 0 && current->name != 0 ) action = doSelect; else action = doReturn; break; case evMouseMove: if( e.mouse.buttons != 0 ) { trackMouse(e); if( !(mouseInView(e.mouse.where) || mouseInOwner(e)) && mouseInMenus(e) ) action = doReturn; } break; case evKeyDown: switch( ctrlToArrow(e.keyDown.keyCode) ) { case kbUp: case kbDown: if( size.y != 1 ) trackKey(Boolean(ctrlToArrow(e.keyDown.keyCode) == kbDown)); else if( e.keyDown.keyCode == kbDown ) autoSelect = True; break; case kbLeft: case kbRight: if( parentMenu == 0 ) trackKey(Boolean(ctrlToArrow(e.keyDown.keyCode) == kbRight)); else action = doReturn; break; case kbHome: case kbEnd: if( size.y != 1 ) { current = menu->items; if( e.keyDown.keyCode == kbEnd ) trackKey(False); } break; case kbEnter: if( size.y == 1 ) autoSelect = True; action = doSelect; break; case kbEsc: action = doReturn; if( parentMenu == 0 || parentMenu->size.y != 1 ) clearEvent(e); break; default: target = this; ch = getAltChar(e.keyDown.keyCode); if( ch == 0 ) ch = e.keyDown.charScan.charCode; else target = topMenu(); p = target->findItem(ch); if( p == 0 ) { p = topMenu()->hotKey(e.keyDown.keyCode); if( p != 0 && commandEnabled(p->command) ) { result = p->command; action = doReturn; } } else if( target == this ) { if( size.y == 1 ) autoSelect = True; action = doSelect; current = p; } else if( parentMenu != target || parentMenu->current != p ) action = doReturn; } break; case evCommand: if( e.message.command == cmMenu ) { autoSelect = False; if (parentMenu != 0 ) action = doReturn; } else action = doReturn; break; } if( itemShown != current ) { itemShown = current; drawView(); } if( (action == doSelect || (action == doNothing && autoSelect)) && current != 0 && current->name != 0 ) if( current->command == 0 ) { if( (e.what & (evMouseDown | evMouseMove)) != 0 ) putEvent(e); r = getItemRect( current ); r.a.x = r.a.x + origin.x; r.a.y = r.b.y + origin.y; r.b = owner->size; if( size.y == 1 ) r.a.x--; target = topMenu()->newSubView(r, current->subMenu,this); result = owner->execView(target); destroy( target ); } else if( action == doSelect ) result = current->command; if( result != 0 && commandEnabled(result) ) { action = doReturn; clearEvent(e); } } while( action != doReturn ); if( e.what != evNothing && (parentMenu != 0 || e.what == evCommand)) putEvent(e); if( current != 0 ) { menu->deflt = current; current = 0; drawView(); } return result; }
void TButton::handleEvent( TEvent& event ) { TPoint mouse; TRect clickRect; clickRect = getExtent(); clickRect.a.x++; clickRect.b.x--; clickRect.b.y--; if( event.what == evMouseDown ) { mouse = makeLocal( event.mouse.where ); if( !clickRect.contains(mouse) ) clearEvent( event ); } TView::handleEvent(event); switch( event.what ) { case evMouseDown: clickRect.b.x++; Boolean down = False; do { mouse = makeLocal( event.mouse.where ); if( down != clickRect.contains( mouse ) ) { down = Boolean( !down ); drawState( down ); } } while( mouseEvent( event, evMouseMove ) ); if( down ) { press(); drawState( False ); } clearEvent( event ); break; case evKeyDown: char c = hotKey( title ); if( event.keyDown.keyCode == getAltCode(c) || ( owner->phase == phPostProcess && c != 0 && toupper(event.keyDown.charScan.charCode) == c ) || ( (state & sfFocused) != 0 && event.keyDown.charScan.charCode == ' ' ) ) { press(); clearEvent( event ); } break; case evBroadcast: switch( event.message.command ) { case cmDefault: if( amDefault ) { press(); clearEvent(event); } break; case cmGrabDefault: case cmReleaseDefault: if( (flags & bfDefault) != 0 ) { amDefault = Boolean(event.message.command == cmReleaseDefault); drawView(); } break; case cmCommandSetChanged: setState(sfDisabled,Boolean(!commandEnabled(command))); drawView(); break; } break; } }