home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 26
/
CD_ASCQ_26_1295.iso
/
vrac
/
tvme30.zip
/
TMSGVIEW.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1995-08-02
|
5KB
|
203 lines
// File : TMSGVIEW.CPP
// Author : Eric Woodruff, CIS ID: 72134,1150
// Updated : Wed 08/02/95 17:54:19
// Note : Copyright 1994-95, Eric Woodruff, All rights reserved
// Compiler: Borland C++ 3.1 to 4.xx
//
// This file contains the message viewer class.
//
#include <stdio.h>
#include <string.h>
#define Uses_TDeskTop
#define Uses_TEvent
#define Uses_TKeys
#define Uses_TListViewer
#define Uses_TNSCollection
#define Uses_TProgram
#define Uses_TScrollBar
#define Uses_TWindow
#define Uses_TVCOLR
#include <tv.h>
#if !defined(cpDefSize)
// Use this if you chose not to modify the Turbo Vision files.
#include <tvcolr.h>
#endif
#include <tvmedit.h>
#define Uses_TMsgViewWindow
#include <tmsgview.h>
// ============================================================================
//
// Message list viewer window.
//
TMsgViewWindow::TMsgViewWindow(const TRect &bounds, const char *aTitle,
Boolean HideOnly) :
TWindow(bounds, aTitle, wnNoNumber),
TWindowInit(&TMsgViewWindow::initFrame),
isValid(True),
HideOnClose(HideOnly)
{
options |= ofTileable;
growMode |= gfGrowAll;
TScrollBar *vScrollBar = standardScrollBar(sbVertical | sbHandleKeyboard);
TScrollBar *hScrollBar = standardScrollBar(sbHorizontal | sbHandleKeyboard);
if(!vScrollBar || !hScrollBar)
isValid = False;
else
{
enableCommand(cmPrevMsg);
enableCommand(cmNextMsg);
TRect r = getClipRect(); // Get exposed view bounds
r.grow(-1, -1); // Shrink to fit inside window frame
msgList = (TMsgListViewer *)new TMsgListViewer(r, hScrollBar,
vScrollBar);
insert(msgList);
}
}
TMsgViewWindow::~TMsgViewWindow()
{
disableCommand(cmPrevMsg);
disableCommand(cmNextMsg);
}
#pragma argsused
Boolean TMsgViewWindow::valid(ushort command)
{
return isValid;
}
void TMsgViewWindow::close()
{
if(HideOnClose)
hide(); // Never really closed, just hidden.
else
TWindow::close();
}
char cpMsgWindow[] = { cMsgFramePassive, cMsgFrameActive, cMsgFrameIcon,
cMsgSBPage, cMsgSBCtrl, cMsgNText, cMsgSText,
cMsgSelected };
TPalette &TMsgViewWindow::getPalette() const
{
// No "- 1" because it's an array!
static TPalette palette(cpMsgWindow, sizeof(cpMsgWindow));
return palette;
}
// ============================================================================
//
// Message list viewer class.
//
TMsgListViewer::TMsgListViewer(const TRect &bounds, TScrollBar *aHScrollBar,
TScrollBar *aVScrollBar) :
TListViewer(bounds, 1, aHScrollBar, aVScrollBar)
{
growMode = gfGrowHiY | gfGrowHiX;
Msgs = new TNSCollection(5, 5);
setRange(0);
hScrollBar->setParams(0, 0, 249, hScrollBar->pgStep, hScrollBar->arStep);
}
void TMsgListViewer::shutDown(void)
{
destroy(Msgs);
TListViewer::shutDown();
}
void TMsgListViewer::getText(char *dest, short item, short maxLen)
{
memset(dest, 0, 250);
if(item < Msgs->getCount() && maxLen < 250)
{
TMessage *mp = (TMessage *)Msgs->at(item);
strncpy(dest, mp->MsgEntry, maxLen);
dest[maxLen] = EOS;
}
}
void TMsgListViewer::handleEvent(TEvent &event)
{
TMessage *mp;
short curItem = focused;
TListViewer::handleEvent(event);
// These need to be broadcast events so that they can be handled
// even when the viewer is not the active window. The application
// must convert them to broadcast events.
if(event.what == evBroadcast)
switch(event.message.command)
{
case cmPrevMsg:
clearEvent(event);
focusItemNum(focused - 1);
break;
case cmNextMsg:
clearEvent(event);
focusItemNum(focused + 1);
break;
}
// Selected item changed so tell the editor to change lines.
if(curItem != focused)
{
mp = (TMessage *)Msgs->at(focused);
// Only broadcast when there is a row to jump to.
if(mp->Line)
message(TProgram::deskTop, evBroadcast, cmSetLine, &mp->Line);
}
}
#define cpMsgListViewer "\x06\x06\x07\x08"
TPalette &TMsgListViewer::getPalette() const
{
// Must include "- 1" to ignore NULL byte in string.
static TPalette palette(cpMsgListViewer, sizeof(cpMsgListViewer) - 1);
return palette;
}
void TMsgListViewer::setState(ushort aState, Boolean enable)
{
TListViewer::setState(aState, enable);
// If focused, activated, selected, or exposed, highlight the line.
if((aState &= (sfFocused | sfActive | sfSelected | sfExposed)) &&
enable && Msgs->getCount())
{
TMessage *mp = (TMessage *)Msgs->at(focused);
// Only broadcast when there is a row to jump to.
if(mp->Line)
message(TProgram::deskTop, evBroadcast, cmSetLine, &mp->Line);
}
}
void TMsgListViewer::insertMsg(long Line, char *Message)
{
TMessage *mp = new TMessage;
mp->Line = Line;
strcpy(mp->MsgEntry, Message);
Msgs->insert(mp);
setRange(Msgs->getCount());
drawView();
}