/*------------------------------------------------------------*/ /* filename - colorsel.cpp */ /* */ /* function(s) */ /* Member function(s) of following classes */ /* TColorSelector */ /* TMonoSelector */ /* TColorDisplay */ /* TColorItem */ /* TColorItemList */ /* TColorGroup */ /* TColorGroupList */ /* TColorDialog */ /*------------------------------------------------------------*/ /*------------------------------------------------------------*/ /* */ /* Turbo Vision - Version 1.0 */ /* */ /* */ /* Copyright (c) 1991 by Borland International */ /* All Rights Reserved. */ /* */ /*------------------------------------------------------------*/ #define Uses_TKeys #define Uses_TColorSelector #define Uses_TMonoSelector #define Uses_TColorDisplay #define Uses_TColorItem #define Uses_TColorItemList #define Uses_TColorGroup #define Uses_TColorGroupList #define Uses_TColorDialog #define Uses_TEvent #define Uses_TDrawBuffer #define Uses_TGroup #define Uses_TSItem #define Uses_TScrollBar #define Uses_TLabel #define Uses_TButton #define Uses_TRect #define Uses_opstream #define Uses_ipstream #include #include TColorItem::TColorItem( const char *nm, uchar idx, TColorItem *nxt ) { index = idx; next = nxt; name = newStr( nm ); } TColorItem::~TColorItem() { delete (char *)name; } TColorGroup::TColorGroup( const char *nm, TColorItem *itm, TColorGroup *nxt ) { items = itm; next = nxt; name = newStr( nm ); } TColorGroup::~TColorGroup() { delete (char *)name; } TColorItem& operator + ( TColorItem& i1, TColorItem& i2 ) { TColorItem *cur = &i1; while( cur->next != 0 ) cur = cur->next; cur->next = &i2; return i1; } TColorGroup& operator + ( TColorGroup& g, TColorItem& i ) { TColorGroup *grp = &g; while( grp->next != 0 ) grp = grp->next; if( grp->items == 0 ) grp->items = &i; else { TColorItem *cur = grp->items; while( cur->next != 0 ) cur = cur->next; cur->next = &i; } return g; } TColorGroup& operator + ( TColorGroup& g1, TColorGroup& g2 ) { TColorGroup *cur = &g1; while( cur->next != 0 ) cur = cur->next; cur->next = &g2; return g1; } TColorSelector::TColorSelector( const TRect& bounds, ColorSel aSelType ) : TView( bounds ) { options |= ofFramed; eventMask |= evBroadcast; selType = aSelType; color = 0; } void TColorSelector::draw() { TDrawBuffer b; b.moveChar( 0, ' ', 0x70, size.x ); for(int i = 0; i <= size.y; i++ ) { if( i < 4 ) { for( int j = 0; j < 4; j++ ) { int c = i*4+j; b.moveChar( j*3, icon, c, 3 ); if( c == color ) { b.putChar( j*3+1, 8 ); if( c == 0 ) b.putAttribute( j*3+1, 0x70 ); } } } writeLine( 0, i, size.x, 1, b ); } } void TColorSelector::colorChanged() { int msg; if( selType == csForeground ) msg = cmColorForegroundChanged; else msg = cmColorBackgroundChanged; message( owner, evBroadcast, msg, (void *)color ); } void TColorSelector::handleEvent( TEvent& event ) { const width = 4; TView::handleEvent( event ); switch( event.what ) { case evMouseDown: { uchar oldColor = color; do { if ( mouseInView( event.mouse.where ) ) { TPoint mouse = makeLocal( event.mouse.where ); color = mouse.y*4 + mouse.x/3; } else color = oldColor; colorChanged(); drawView(); } while( mouseEvent( event, evMouseMove ) ); } break; case evKeyDown: { int maxCol = (selType == csBackground) ? 7 : 15; switch( ctrlToArrow( event.keyDown.keyCode ) ) { case kbLeft: if( color > 0 ) color--; else color = maxCol; break; case kbRight: if( color < maxCol ) color++; else color = 0; break; case kbUp: if( color > width-1 ) color -= width; else if( color == 0 ) color = maxCol; else color += maxCol - width; break; case kbDown: if( color < maxCol - (width-1) ) color += width; else if( color == maxCol ) color = 0; else color -= maxCol - width; break; default: return; } } break; case evBroadcast: if( event.message.command == cmColorSet ) { if( selType == csBackground ) color = event.message.infoByte >> 4; else color = event.message.infoByte & 0x0F; drawView(); return ; } else return; default: return ; } drawView(); colorChanged(); clearEvent( event ); } #ifndef NO_TV_STREAMS void TColorSelector::write( opstream& os ) { TView::write( os ); os << color << (int)selType; } void *TColorSelector::read( ipstream& is ) { int temp; TView::read( is ); is >> color >> temp; selType = ColorSel(temp); return this; } TStreamable *TColorSelector::build() { return new TColorSelector( streamableInit ); } TColorSelector::TColorSelector( StreamableInit ) : TView( streamableInit ) { } #endif // ifndef NO_TV_STREAMS const uchar monoColors[] = { 0x07, 0x0F, 0x01, 0x70, 0x09 }; TMonoSelector::TMonoSelector( const TRect& bounds ) : TCluster( bounds, new TSItem( normal, new TSItem( highlight, new TSItem( underline, new TSItem( inverse, 0 ))))) { eventMask |= evBroadcast; } void TMonoSelector::draw() { drawBox( button, 0x07 ); } void TMonoSelector::handleEvent( TEvent& event ) { TCluster::handleEvent( event ); if( event.what == evBroadcast && event.message.command == cmColorSet ) { value = event.message.infoByte; drawView(); } } Boolean TMonoSelector::mark( int item ) { return Boolean(monoColors[item] == value); } void TMonoSelector::newColor() { message( owner, evBroadcast, cmColorForegroundChanged, (void *)(value & 0x0F) ); message( owner, evBroadcast, cmColorBackgroundChanged, (void *)((value >> 4) & 0x0F)); } void TMonoSelector::press( int item ) { value = monoColors[item]; newColor(); } void TMonoSelector::movedTo( int item ) { value = monoColors[item]; newColor(); } #ifndef NO_TV_STREAMS TStreamable *TMonoSelector::build() { return new TMonoSelector( streamableInit ); } TMonoSelector::TMonoSelector( StreamableInit ) : TCluster( streamableInit ) { } #endif // ifndef NO_TV_STREAMS TColorDisplay::TColorDisplay( const TRect& bounds, const char *aText ) : TView( bounds ), text( newStr( aText ) ), color( 0 ) { eventMask |= evBroadcast; } TColorDisplay::~TColorDisplay() { delete (char *)text; } void TColorDisplay::draw() { uchar c = *color; #ifndef __IDA__ if( c == 0 ) c = errorAttr; #endif const int len = strlen( text ); TDrawBuffer b; for( int i = 0; i <= size.x/len; i++ ) b.moveStr( i*len, text, c ); writeLine( 0, 0, size.x, size.y, b ); } void TColorDisplay::handleEvent( TEvent& event ) { TView::handleEvent( event ); if( event.what == evBroadcast ) switch( event.message.command ) { case cmColorBackgroundChanged: *color = (*color & 0x0F) | ((event.message.infoByte << 4) & 0xF0); drawView(); break; case cmColorForegroundChanged: *color = (*color & 0xF0) | (event.message.infoByte & 0x0F); drawView(); } } void TColorDisplay::setColor( uchar *aColor ) { color = aColor; message( owner, evBroadcast, cmColorSet, (void *)(*color) ); drawView(); } #ifndef NO_TV_STREAMS void TColorDisplay::write( opstream& os ) { TView::write( os ); os.writeString( text ); } void *TColorDisplay::read( ipstream& is ) { TView::read( is ); text = is.readString(); color = 0; return this; } TStreamable *TColorDisplay::build() { return new TColorDisplay( streamableInit ); } TColorDisplay::TColorDisplay( StreamableInit ) : TView( streamableInit ) { } #endif // ifndef NO_TV_STREAMS TColorGroupList::TColorGroupList( const TRect& bounds, TScrollBar *aScrollBar, TColorGroup *aGroups ) : TListViewer( bounds, 1, 0, aScrollBar ), groups( aGroups ) { int i = 0; while( aGroups != 0 ) { aGroups = aGroups->next; i++; } setRange(i); } static void freeItems( TColorItem *curItem ) { while( curItem != 0 ) { TColorItem *p = curItem; curItem = curItem->next; delete p; } } static void freeGroups( TColorGroup *curGroup ) { while( curGroup != 0 ) { TColorGroup *p = curGroup; freeItems( curGroup->items ); curGroup = curGroup->next; delete p; } } TColorGroupList::~TColorGroupList() { freeGroups( groups ); } void TColorGroupList::focusItem( int item ) { TListViewer::focusItem( item ); TColorGroup *curGroup = groups; while( item-- > 0 ) curGroup = curGroup->next; message( owner, evBroadcast, cmNewColorItem, curGroup->items); } void TColorGroupList::getText( char *dest, int item, int maxChars ) { TColorGroup *curGroup = groups; while( item-- > 0 ) curGroup = curGroup->next; strncpy( dest, curGroup->name, maxChars ); dest[maxChars] = '\0'; } #ifndef NO_TV_STREAMS void TColorGroupList::writeItems( opstream& os, TColorItem *items ) { int count = 0; TColorItem *cur; for( cur = items; cur != 0; cur = cur->next ) count++; os << count; for( cur = items; cur != 0; cur = cur->next ) { os.writeString( cur->name ); os << cur->index; } } void TColorGroupList::writeGroups( opstream& os, TColorGroup *groups ) { int count = 0; TColorGroup *cur; for( cur = groups; cur != 0; cur = cur->next ) count++; os << count; for( cur = groups; cur != 0; cur = cur->next ) { os.writeString( cur->name ); writeItems( os, cur->items ); } } void TColorGroupList::write( opstream& os ) { TListViewer::write( os ); writeGroups( os, groups ); } TColorItem *TColorGroupList::readItems( ipstream& is ) { int count; is >> count; TColorItem *items = 0; TColorItem **cur = &items; while( count-- > 0 ) { /* const */ char *nm = is.readString(); uchar index; is >> index; *cur = new TColorItem( nm, index ); delete nm; // BF cur = &((*cur)->next); } *cur = 0; return items; } TColorGroup *TColorGroupList::readGroups( ipstream& is ) { int count; is >> count; TColorGroup *groups = 0; TColorGroup **cur = &groups; while( count-- > 0 ) { /* const */ char *nm = is.readString(); TColorItem *grp = readItems( is ); *cur = new TColorGroup( nm, grp ); delete nm; // BF cur = &((*cur)->next); } *cur = 0; return groups; } void *TColorGroupList::read( ipstream& is ) { TListViewer::read( is ); groups = readGroups( is ); return this; } TStreamable *TColorGroupList::build() { return new TColorGroupList( streamableInit ); } TColorGroupList::TColorGroupList( StreamableInit ) : TListViewer( streamableInit ) { } #endif // ifndef NO_TV_STREAMS TColorItemList::TColorItemList( const TRect& bounds, TScrollBar *aScrollBar, TColorItem *aItems ) : TListViewer( bounds, 1, 0, aScrollBar ), items( aItems ) { eventMask |= evBroadcast; int i = 0; while( aItems != 0 ) { aItems = aItems->next; i++; } setRange( i ); } void TColorItemList::focusItem( int item ) { TListViewer::focusItem( item ); TColorItem *curItem = items; while( item-- > 0 ) curItem = curItem->next; message( owner, evBroadcast, cmNewColorIndex, (void *)(curItem->index)); } void TColorItemList::getText( char *dest, int item, int maxChars ) { TColorItem *curItem = items; while( item-- > 0 ) curItem = curItem->next; strncpy( dest, curItem->name, maxChars ); dest[maxChars] = '\0'; } void TColorItemList::handleEvent( TEvent& event ) { TListViewer::handleEvent( event ); if( event.what == evBroadcast && event.message.command == cmNewColorItem ) { items = (TColorItem *)event.message.infoPtr; TColorItem *curItem = items; int i = 0; while( curItem != 0 ) { curItem = curItem->next; i++; } setRange( i ); focusItem( 0 ); drawView(); } } #ifndef NO_TV_STREAMS TStreamable *TColorItemList::build() { return new TColorItemList( streamableInit ); } TColorItemList::TColorItemList( StreamableInit ) : TListViewer( streamableInit ) { } #endif // ifndef NO_TV_STREAMS TColorDialog::TColorDialog( TPalette *aPalette, TColorGroup *aGroups ): #ifndef __IDA__ #define SELEND 11 #else #define SELEND 11+2 #endif TDialog( TRect( 0, 0, 61, SELEND+7 ), colors ), TWindowInit( TColorDialog::initFrame ) { options |= ofCentered; pal = aPalette; TScrollBar *sb = new TScrollBar( TRect( 18, 3, 19, SELEND+3 ) ); insert( sb ); groups = new TColorGroupList( TRect( 3, 3, 18, SELEND+3 ), sb, aGroups); insert( groups ); insert( new TLabel( TRect( 2, 2, 8, 3 ), groupText, groups ) ); sb = new TScrollBar( TRect( 41, 3, 42, SELEND+3 ) ); insert( sb ); TView *p = new TColorItemList( TRect( 21, 3, 41, SELEND+3 ), sb, aGroups->items ); insert( p ); insert( new TLabel( TRect( 20, 2, 25, 3 ), itemText, p ) ); forSel = new TColorSelector( TRect( 45, 3, 57, 7 ), TColorSelector::csForeground ); insert( forSel ); forLabel = new TLabel( TRect( 45, 2, 57, 3 ), forText, forSel ); insert( forLabel ); bakSel = new TColorSelector( TRect( 45, 9, 57, SELEND ), TColorSelector::csBackground ); insert( bakSel ); bakLabel = new TLabel( TRect( 45, 8, 57, 9 ), bakText, bakSel ); insert( bakLabel ); display = new TColorDisplay( TRect( 44, SELEND+1, 58, SELEND+3 ), textText ); insert( display ); monoSel = new TMonoSelector( TRect( 44, 3, 59, 7 ) ); // was 8 monoSel->hide(); insert( monoSel ); monoLabel = new TLabel( TRect( 43, 2, 49, 3 ), colorText, monoSel ); monoLabel->hide(); insert( monoLabel ); if( aGroups != 0 && aGroups->items != 0 ) display->setColor( (uchar *)&pal->data[ aGroups->items->index ] ); insert( new TButton( TRect( 36, SELEND+4, 46, SELEND+6 ), okText, cmOK, bfDefault ) ); insert( new TButton( TRect( 48, SELEND+4, 58, SELEND+6 ), cancelText, cmCancel, bfNormal ) ); selectNext( False ); } void TColorDialog::handleEvent( TEvent& event ) { TDialog::handleEvent( event ); if( event.what==evBroadcast && event.message.command==cmNewColorIndex ) display->setColor( (uchar *)&pal->data[event.message.infoByte] ); } size_t TColorDialog::dataSize() { return *pal->data + 1; } void TColorDialog::getData( void *rec ) { memcpy( rec, pal->data, *pal->data+1 ); } void TColorDialog::setData( void *rec) { TPalette *p = (TPalette *)rec; memcpy( pal->data, p->data, *p->data+1 ); display->setColor( (uchar *)&pal->data[1] ); groups->focusItem( 0 ); if( showMarkers ) { forLabel->hide(); forSel->hide(); bakLabel->hide(); bakSel->hide(); monoLabel->show(); monoSel->show(); } groups->select(); } #ifndef NO_TV_STREAMS void TColorDialog::write( opstream& os ) { TDialog::write( os ); os << display << groups << forLabel << forSel << bakLabel << bakSel << monoLabel << monoSel; } void *TColorDialog::read( ipstream& is ) { TDialog::read( is ); is >> display >> groups >> forLabel >> forSel >> bakLabel >> bakSel >> monoLabel >> monoSel; pal = 0; return this; } TStreamable *TColorDialog::build() { return new TColorDialog( streamableInit ); } TColorDialog::TColorDialog( StreamableInit ) : TDialog( streamableInit ), // TWindowInit( streamableInit ) Bugfix JS 20.10.93 Who typed that? TWindowInit( 0 ) { } #endif // ifndef NO_TV_STREAMS