📄 windiff.c
字号:
bOK = fBusy;
WDLeave();
return(bOK);
} /* IsBusy */
/***************************************************************************
* Function: BusyError
*
* Purpose:
*
* Puts up message box that system is busy.
*/
void
BusyError(void)
{
windiff_UI(TRUE);
MessageBox(hwndClient,
LoadRcString(IDS_PLEASE_WAIT),
"WinDiff", MB_OK|MB_ICONSTOP);
windiff_UI(FALSE);
} /* BusyError */
/* --- colour scheme --------------------------------------------------- */
/***************************************************************************
* Function: StateToColour
*
* Purpose:
*
* Map the state given into a foreground and a background colour
* for states that are highlighted. Return P_FCOLOUR if the foreground
* colour (put in *foreground) is to be used, return P_FCOLOUR|P_BCOLOUR if
* both *foreground and *background are to be used, or 0 if the default
* colours are to be used.
*/
UINT
StateToColour(int state, int col, DWORD FAR * foreground, DWORD FAR * background)
{
switch (state) {
case STATE_DIFFER:
/* files that differ are picked out in a foreground highlight,
* with the default background
*/
*foreground = rgb_outlinehi;
return(P_FCOLOUR);
case STATE_LEFTONLY:
/* lines only in the left file */
*foreground = rgb_leftfore;
*background = rgb_leftback;
return(P_FCOLOUR|P_BCOLOUR);
case STATE_RIGHTONLY:
/* lines only in the right file */
*foreground = rgb_rightfore;
*background = rgb_rightback;
return(P_FCOLOUR|P_BCOLOUR);
case STATE_MOVEDLEFT:
/* displaced lines in both files - left file version */
*foreground = rgb_mleftfore;
*background = rgb_mleftback;
return(P_FCOLOUR|P_BCOLOUR);
case STATE_MOVEDRIGHT:
/* displaced lines in both files - right file version */
*foreground = rgb_mrightfore;
*background = rgb_mrightback;
return(P_FCOLOUR|P_BCOLOUR);
default:
/* no highlighting - default colours */
return(0);
}
}
/* table window communication routines ---------------------------------*/
/***************************************************************************
* Function: SetSelection
*
* Purpose:
*
* Set a given row as the selected row in the table window
*/
void
SetSelection(long rownr)
{
TableSelection select;
select.startrow = rownr;
select.startcell = 0;
select.nrows = 1;
select.ncells = 1;
SendMessage(hwndRCD, TM_SELECT, 0, (long) (LPSTR)&select);
}
/***************************************************************************
* Function: do_gethdr
*
* Purpose:
*
* Handle table class call back to get nr of rows and columns,
* and properties for the whole table.
* The 'table id' is either TABID_PRINTER - meaning we are
* printing the current_view, or it is the view to
* use for row/column nr information
*/
long
do_gethdr(HWND hwnd, lpTableHdr phdr)
{
VIEW view;
BOOL bIsPrinter = FALSE;
if (phdr->id == TABID_PRINTER) {
view = current_view;
bIsPrinter = TRUE;
} else {
view = (VIEW) phdr->id;
}
if (view == NULL) {
return(FALSE);
}
phdr->nrows = view_getrowcount(view);
/* three columns: line nr, tag and rest of line */
/*
* if IDM_NONRS (no line numbers) is selected, suppress the
* line-nr column entirely to save screen space
*/
if (line_numbers == IDM_NONRS) {
phdr->ncols = 2;
phdr->fixedcols = 0;
} else {
phdr->ncols = 3;
phdr->fixedcols = 1;
}
phdr->fixedrows = 0;
phdr->fixedselectable = FALSE;
phdr->hseparator = TRUE;
phdr->vseparator = TRUE;
phdr->selectmode = TM_ROW | TM_SINGLE;
/*
* find if we are in expand mode - ask for the item we are expanding.
*/
if (view_isexpanded(view) == TRUE) {
/* use focus rect as selection mode in expand mode
* so as not to interfere with background colours.
*/
phdr->selectmode |= TM_FOCUS;
} else {
/* use default solid inversion when possible as it is clearer.*/
phdr->selectmode |= TM_SOLID;
}
/* please send TQ_SCROLL notifications when the table is scrolled */
phdr->sendscroll = TRUE;
phdr->props.valid = 0;
return TRUE;
}
/***************************************************************************
* Function: do_getprops
*
* Purpose:
*
* Respond to table callback asking for the size and properties
* of each column. Table id is either TABID_PRINTER (meaning the
* current_view, for printing) or it is the view to be used.
*/
long
do_getprops(HWND hwnd, lpColPropsList propslist)
{
int i, cell;
BOOL bIsPrinter = FALSE;
VIEW view;
if (propslist->id == TABID_PRINTER) {
view = current_view;
bIsPrinter = TRUE;
} else {
view = (VIEW) propslist->id;
}
if (view == NULL) {
return(FALSE);
}
/* The table inteface is slightly confused here. we are not
* guaranteed which columns we are being asked about, so instead
* of just setting each column cols[0], cols[1] etc, we need
* to loop through, looking at each column in the table and
* seeing which it is.
*/
for (i = 0; i < propslist->ncols; i++) {
cell = i + propslist->startcol;
propslist->plist[i].props.valid = 0;
/* for all column widths, add on 1 for the NULL char. */
/*
* skip the line nr column if IDM_NONRS
*/
if (line_numbers == IDM_NONRS) {
cell++;
}
if (cell == 0) {
/* properties for line nr column */
propslist->plist[i].nchars = view_getwidth(view, 0)+1;
propslist->plist[i].props.valid |= P_ALIGN;
propslist->plist[i].props.alignment = P_CENTRE;
} else if (cell == 1) {
/* properties for tag field */
propslist->plist[i].nchars = view_getwidth(view, 1)+1;
propslist->plist[i].props.valid |= P_ALIGN;
propslist->plist[i].props.alignment = P_LEFT;
} else {
/* properties for main text column -
* use a fixed font unless printing (if
* printing, best to use the default font, because
* of resolution differences.
* add on 8 chars to the width to ensure that
* the width of lines beginning with tabs
* works out ok
*/
propslist->plist[i].nchars = view_getwidth(view, 2)+1;
propslist->plist[i].props.valid |= P_ALIGN;
propslist->plist[i].props.alignment = P_LEFT;
if (!bIsPrinter) {
propslist->plist[i].props.valid |= P_FONT;
propslist->plist[i].props.hFont =
GetStockObject(SYSTEM_FIXED_FONT);
}
}
}
return (TRUE);
}
/***************************************************************************
* Function: do_getdata
*
* Purpose:
*
* Respond to a table callback asking for the contents of individual cells.
* table id is either TABID_PRINTER, or it is a pointer to the view
* to use for data. If going to the printer, don't set the
* colours (stick to black and white).
*/
long
do_getdata(HWND hwnd, lpCellDataList cdlist)
{
int start, endcell, col, i;
lpCellData cd;
VIEW view;
LPSTR textp;
BOOL bIsPrinter = FALSE;
if (cdlist->id == TABID_PRINTER) {
view = current_view;
bIsPrinter = TRUE;
} else {
view = (VIEW) cdlist->id;
}
start = cdlist->startcell;
endcell = cdlist->ncells + start;
if (cdlist->row >= view_getrowcount(view)) {
return(FALSE);
}
for (i = start; i < endcell; i++) {
cd = &cdlist->plist[i - start];
/* skip the line number column if IDM_NONRS */
if (line_numbers == IDM_NONRS) {
col = i+1;
} else {
col = i;
}
/* set colour of text to mark out
* lines that are changed, if not printer - for the
* printer everything should stay in the default colours
*/
if (!bIsPrinter) {
/* convert the state of the requested row into a
* colour scheme. returns P_FCOLOUR and/or
* P_BCOLOUR if it sets either of the colours
*/
cd->props.valid |=
StateToColour(view_getstate(view, cdlist->row), col,
&cd->props.forecolour,
&cd->props.backcolour);
}
textp = view_gettext(view, cdlist->row, col);
if (cd->nchars != 0) {
if (textp == NULL) {
cd->ptext[0] = '\0';
} else {
strncpy(cd->ptext, textp, cd->nchars -1);
cd->ptext[cd->nchars - 1] = '\0';
}
}
}
return(TRUE);
}
/***************************************************************************
* Function: SvrClose
*
* Purpose:
*
* Table window has finished with this view. It can be deleted.
*/
void
SvrClose(void)
{
view_delete(current_view);
current_view = NULL;
/* hide picture - only visible when we are in MODE_EXPAND */
DisplayMode = MODE_NULL;
DoResize(hwndClient);
/* if we already busy when closing this view (ie
* we are in the process of starting a new scan,
* then leave the status bar alone, otherwise
* we should clean up the state of the status bar
*/
if (!fBusy) {
SetButtonText(LoadRcString(IDS_EXIT));
SetNames(NULL);
SetStatus(NULL);
}
} /* SvrClose */
/***************************************************************************
* Function: TableServer
*
* Purpose:
*
* Handle callbacks and notifications from the table class
*/
long
TableServer(HWND hwnd, UINT cmd, long lParam)
{
lpTableHdr phdr;
lpColPropsList proplist;
lpCellDataList cdlist;
lpTableSelection pselect;
switch(cmd) {
case TQ_GETSIZE:
/* get the nr of rows and cols in this table */
phdr = (lpTableHdr) lParam;
return(do_gethdr(hwnd, phdr));
case TQ_GETCOLPROPS:
/* get the size and properties of each column */
proplist = (lpColPropsList) lParam;
return (do_getprops(hwnd, proplist));
case TQ_GETDATA:
/* get the contents of individual cells */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -