home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 1B
/
DATAFILE_PDCD1B.iso
/
_pocketbk
/
pocketbook
/
002
/
cword_zip
/
CWORDSRC.TXT
< prev
next >
Wrap
Text File
|
1994-07-17
|
3KB
|
137 lines
Comments on source code for CWORD.DYL
-------------------------------------
The .CAT file just defines one class which in turn only has one
method:
LIBRARY cword
EXTERNAL olib
INCLUDE olib.g
CLASS cword root
{
ADD cword_count
}
The working of the "hook" command (via the ws_launch_dyl method of
the WSERV class) is that the named DYL is loaded, then the first
class in that DYL is instantiated, and then the first method of that
object is invoked.
The basic supplied code
-----------------------
/* CWORDC.C
Copyright (C) Psion PLC 1994
Started by : DavidW
Started on: 17/7/94
*/
#include <p_std.h>
#include <epoc.h>
#include <edit.g>
#include <scrimg.g>
#include <edwin.g>
#include <cword.g>
GLREF_D PR_EDWIN *DatApp1;
LOCAL_C INT IsWordProcess(VOID)
{
TEXT pName[E_MAX_NAME+2];
p_pname(p_getpid(),&pName[0]);
return(pName[0]=='W' && pName[1]=='O' && pName[2]=='R'
&& pName[3]=='D' && pName[4]=='.');
}
LOCAL_C UINT CountWordsInSelectBlock(VOID)
{
UWORD selLen;
UWORD pos;
UWORD selEnd;
UWORD count;
VOID *doc;
selLen=p_send3(DatApp1->edwin.scrimg,O_SI_GET_SELECT,&pos);
if (!selLen)
return(0);
selEnd=pos+selLen;
doc=DatApp1->edwin.doc;
count=1;
FOREVER
{
p_send4(doc,O_EP_SCAN_WORD,&pos,EP_SCAN_TO_BEGIN|EP_SCAN_JOIN_DELIM);
if (pos>selEnd)
break;
count++;
}
return(count);
}
LOCAL_C VOID TellUser(UINT count)
{
TEXT buf[8];
buf[p_itob(&buf[0],count)]=0;
wInfoMsg(&buf[0]);
}
#pragma METHOD_CALL
METHOD INT cword_cword_count(PR_CWORD *self,HANDLE cathand)
{
if (IsWordProcess())
TellUser(CountWordsInSelectBlock());
return(TRUE); /* system will tidy everything up */
}
How this works
--------------
The only knowledge this code has about the Word Processor is that
1. The main Word Processor editing window is a subclass of EDWIN
2. The handle of this object is written to DatApp1
Before looking at DatApp1, however, the code checks that it has been
invoked from within an instance of the Word Processor. (The macro
launching this DYL could include a line "xpWORD" to much the same
effect.)
On establishing that the process is a Word Processor, the code finds
the two ends of the current selected region of text (if any), and
then uses EP_SCAN_WORD to walk along this region, word at a time.
Telling the user the result
---------------------------
The above version of the routine TellUser results in a barely
noticeable InfoPrint. Better alternatives would include
* building up a longer text string to display
* using p_notify to obtain a dialog with the result
* use a little more knowledge about the Word Processor
The third option is what is adopted in the actual shipped version of
CWORD.DYL, in which the code for TellUser is as follows:
LOCAL_C VOID TellUser(UINT count)
{
hErrorDialog(0,105,count);
}
which also requires the additional header declaration
#include <hwim.h>
This relies on the facts that
1. hErrorDialog(0,...) functions like a kind of dialog version of puts
2. Resource 105 for the word processor is (in English) the format
string "%d Words"
(strictly speaking an f_leave should be done on the result of
hErrorDialog).