www.pudn.com > SmartFDISK.zip > help.cc


#define HELPEXTENSIONS 
/*------------------------------------------------------------*/ 
/* filename -       Help.cpp                                  */ 
/*                                                            */ 
/* function(s)                                                */ 
/*                  Member function(s) of following classes   */ 
/*                      THelpViewer                           */ 
/*                      THelpWindow                           */ 
/*------------------------------------------------------------*/ 
 
/*------------------------------------------------------------*/ 
/*                                                            */ 
/*    Turbo Vision -  Version 1.0                             */ 
/*                                                            */ 
/*                                                            */ 
/*    Copyright (c) 1991 by Borland International             */ 
/*    All Rights Reserved.                                    */ 
/*                                                            */ 
/*------------------------------------------------------------*/ 
 
#define Uses_TStreamableClass 
#define Uses_TPoint 
#define Uses_TStreamable 
#define Uses_ipstream 
#define Uses_opstream 
#define Uses_fpstream 
#define Uses_TRect 
#define Uses_TScrollBar 
#define Uses_TScroller 
#define Uses_TDrawBuffer 
#define Uses_TEvent 
#define Uses_TWindow 
#define Uses_TKeys 
#define Uses_TPalette 
#include  
 
#if !defined( __HELP_H ) 
#include "Help.h" 
#endif  // __HELP_H 
 
#if !defined( __UTIL_H ) 
#include "Util.h" 
#endif  // __UTIL_H 
 
#if !defined( __STRING_H ) 
#include  
#endif  // __STRING_H 
 
#if !defined( __LIMITS_H ) 
#include  
#endif  // __LIMITS_H 
 
#if !defined( __STAT_H ) 
#include  
#endif  // __STAT_H 
 
#if !defined( __CTYPE_H ) 
#include  
#endif  // __CTYPE_H 
 
#if !defined( __IO_H ) 
#include  
#endif  // __IO_H 
 
#pragma warn -dsz 
 
// THelpViewer 
 
 
#ifdef HELPEXTENSIONS 
    int THelpViewer::oldSelected[THelpFile::maxOldTopics+1]; 
#endif 
 
 
THelpViewer::THelpViewer( const TRect& bounds, TScrollBar* aHScrollBar, 
    TScrollBar* aVScrollBar, THelpFile *aHelpFile, ushort context ) 
    : TScroller( bounds, aHScrollBar, aVScrollBar ) 
{ 
    options = (options | ofSelectable); 
    growMode = gfGrowHiX | gfGrowHiY; 
    hFile = aHelpFile; 
    topic = aHelpFile->getTopic(context); 
    topic->setWidth(size.x); 
    setLimit(78, topic->numLines()); 
    selected = 1; 
} 
 
THelpViewer::~THelpViewer() 
{ 
    delete hFile; 
    delete topic; 
} 
 
void THelpViewer::changeBounds( const TRect& bounds )   // fix Help-3 
{ 
    TScroller::changeBounds(bounds); 
    topic->setWidth(size.x); 
    setLimit(limit.x, topic->numLines()); 
} 
 
void THelpViewer::draw() 
{ 
    TDrawBuffer b; 
    char line[256]; 
    char buffer[256]; 
    char *bufPtr; 
    int i, j, l; 
    int keyCount; 
    ushort normal, keyword, selKeyword, c; 
    TPoint keyPoint; 
    uchar keyLength; 
    int keyRef; 
 
    normal = getColor(1); 
    keyword = getColor(2); 
    selKeyword = getColor(3); 
    keyCount = 0; 
    keyPoint.x = 0; 
    keyPoint.y = 0; 
    topic->setWidth(size.x); 
    if (topic->getNumCrossRefs() > 0) 
        { 
        do 
            {                   // fix Help-2 
            topic->getCrossRef(keyCount, keyPoint, keyLength, keyRef); 
            ++keyCount; 
            } while ( (keyCount < topic->getNumCrossRefs()) && (keyPoint.y <= delta.y)); 
/************************************ 
            { 
            ++keyCount; 
            topic->getCrossRef(keyCount-1, keyPoint, keyLength, keyRef); 
            } while ( (keyCount <= topic->getNumCrossRefs()) && (keyPoint.y < delta.y)); 
*************************************/ 
        } 
    for (i = 1; i <= size.y; ++i) 
        { 
        b.moveChar(0, ' ', normal, size.x); 
        strcpy(line, topic->getLine(i + delta.y)); 
        if (strlen(line) > (uint32)delta.x) 
            { 
            bufPtr = line + delta.x;  
            strncpy(buffer, bufPtr, size.x); 
            buffer[size.x] = 0; 
            b.moveStr(0, buffer, normal); 
            } 
        else 
            b.moveStr(0, "", normal); 
        while (i + delta.y == keyPoint.y) 
            { 
            l = keyLength; 
            if (keyPoint.x < delta.x ) 
                { 
                l -= (delta.x - keyPoint.x); 
                keyPoint.x = delta.x; 
                } 
            if (keyCount == selected) 
                c = selKeyword; 
            else 
                c = keyword; 
            for(j = 0; j < l; ++j) 
                b.putAttribute((keyPoint.x - delta.x + j),c); 
/*********************************************** 
            ++keyCount; 
            if (keyCount <= topic->getNumCrossRefs()) 
                topic->getCrossRef(keyCount-1, keyPoint, keyLength, keyRef); 
            else 
************************************************/ 
            if ( keyCount < topic->getNumCrossRefs() )           // fix Help-2 
               { 
               topic->getCrossRef(keyCount, keyPoint, keyLength, keyRef); 
               ++keyCount; 
               } 
            else 
                keyPoint.y = 0; 
            } 
        writeLine(0, i-1, size.x, 1, b); 
        } 
} 
 
TPalette& THelpViewer::getPalette() const 
{ 
    static TPalette palette(cHelpViewer, sizeof( cHelpViewer)-1); 
    return palette; 
} 
 
void THelpViewer::makeSelectVisible( int selected, TPoint& keyPoint, 
         uchar& keyLength, int& keyRef ) 
{ 
    TPoint d; 
 
    topic->getCrossRef(selected, keyPoint, keyLength, keyRef); 
    d = delta; 
    if (keyPoint.x < d.x) 
        d.x = keyPoint.x; 
    if (keyPoint.x > d.x + size.x) 
        d.x = keyPoint.x - size.x; 
    if (keyPoint.y < d.y) 
        d.y = keyPoint.y - 1;        // fix Help-2 
    if (keyPoint.y > d.y + size.y) 
	d.y = keyPoint.y - size.y; 
    if ((d.x != delta.x) || (d.y != delta.y)) 
	 scrollTo(d.x, d.y); 
} 
 
void THelpViewer::switchToTopic( int keyRef ) 
{ 
#ifdef HELPEXTENSIONS 
    if (hFile->helpAlreadyPopped) 
      oldSelected[THelpFile::oldCount] = selected; 
 
    if (owner!=0) 
      owner->lock(); 
#endif 
 
    if (topic != 0) 
	delete topic; 
    topic = hFile->getTopic( keyRef & 0x0000FFFF ); 
    topic->setWidth(size.x); 
    scrollTo(0, 0); 
    setLimit(limit.x, topic->numLines()); 
    selected = 1; 
 
#ifdef HELPEXTENSIONS 
    if ((keyRef == previousTopic) && (oldSelected[THelpFile::oldCount]!=0)) 
    { 
        selected = oldSelected[THelpFile::oldCount]; 
        drawView(); 
        if (selected <= topic->getNumCrossRefs()) 
        { 
	    TPoint keyPoint; 
	    uchar keyLength; 
	    makeSelectVisible(selected-1,keyPoint,keyLength,keyRef); 
        } 
    } 
    else 
        drawView(); 
 
    if (owner!=0) 
        owner->unlock(); 
#else 
      drawView(); 
#endif 
} 
 
void THelpViewer::handleEvent( TEvent& event ) 
{ 
 
    TPoint keyPoint, mouse; 
    uchar keyLength; 
    int keyRef; 
    int keyCount; 
 
 
    TScroller::handleEvent(event); 
    switch (event.what) 
        { 
 
        case evKeyDown: 
            switch (event.keyDown.keyCode) 
                { 
                case kbTab: 
                    ++selected; 
                    if (selected > topic->getNumCrossRefs()) 
                        selected = 1; 
                    if ( topic->getNumCrossRefs() != 0 ) 
                        makeSelectVisible(selected-1,keyPoint,keyLength,keyRef); 
                    break; 
                case kbShiftTab: 
                    --selected; 
                    if (selected == 0) 
                        selected = topic->getNumCrossRefs(); 
                    if ( topic->getNumCrossRefs() != 0 ) 
                        makeSelectVisible(selected-1,keyPoint,keyLength,keyRef); 
                    break; 
                case kbEnter: 
                    if (selected <= topic->getNumCrossRefs()) 
                        { 
                        topic->getCrossRef(selected-1, keyPoint, keyLength, keyRef); 
                        switchToTopic( keyRef ); 
                        } 
                    break; 
                case kbEsc: 
                    event.what = evCommand; 
                    event.message.command = cmClose; 
                    putEvent(event); 
                    break; 
                default: 
                    return; 
                } 
            drawView(); 
            clearEvent(event); 
            break; 
 
        case evMouseDown: 
            mouse = makeLocal(event.mouse.where); 
            mouse.x += delta.x; 
            mouse.y += delta.y; 
            keyCount = 0; 
 
            do 
            { 
                ++keyCount; 
                if (keyCount > topic->getNumCrossRefs()) 
                    return; 
                topic->getCrossRef(keyCount-1, keyPoint, keyLength, keyRef); 
	    } while (!((keyPoint.y == mouse.y+1) && (mouse.x >= keyPoint.x) && 
                  (mouse.x < keyPoint.x + keyLength))); 
            selected = keyCount; 
            drawView(); 
            if (event.mouse.doubleClick) 
                switchToTopic( keyRef ); 
            clearEvent(event); 
            break; 
 
        case evCommand: 
            if ((event.message.command == cmClose) && ((owner->state && sfModal) != 0))  // fix Help-5 
		{ 
#ifdef HELPEXTENSIONS 
		oldSelected[THelpFile::oldCount] = selected; 
#endif 
		endModal(cmClose); 
		clearEvent(event); 
		} 
#ifdef HELPEXTENSIONS 
	    else 
		if (event.message.command == cmSwitchToTopic) 
                    { 
		    switchToTopic( event.message.infoInt ); 
		    clearEvent(event); 
                    } 
#endif 
	    break; 
        } 
} 
 
// THelpWindow  
 
THelpWindow::THelpWindow( THelpFile *hFile, ushort context ): 
       TWindow( TRect(0,0,50,18), "Help", wnNoNumber ), 
       TWindowInit( &THelpWindow::initFrame) 
{ 
    TRect r(0, 0, 50, 18); 
    options = (options | ofCentered); 
    r.grow(-2,-1); 
    insert(new THelpViewer (r, 
      standardScrollBar(sbHorizontal | sbHandleKeyboard), 
      standardScrollBar(sbVertical | sbHandleKeyboard), hFile, context)); 
} 
 
TPalette& THelpWindow::getPalette() const 
{ 
    static TPalette palette(cHelpWindow, sizeof( cHelpWindow)-1); 
    return palette; 
} 
 
#pragma warn .dsz