SysTools
/*
FAR Manager ASCII Table Plugin
(c) SysTools 2016
http://systools.losthost.org/?misc#asciitab
ASCII Table plugin like one from DOS Navigator.
Tested under FAR Manager 1.70 and 3.xx
*/
#include <windows.h>
// FAR Fanager Plugins SDK
#include "far170hd/plugin.hpp"
#include "far170hd/farcolor.hpp"
#include "far170hd/farkeys.hpp"
#define EXPORT __declspec(dllexport)
// const structs
const static char InfoFmtStr[] = "#Char: # Decimal: ### Hex: ## \xFE ";
const static char PluginInfo[] = "http://systools.losthost.org";
const static char PluginName[] = "ASCII Table";
const static char *PluginMenuStrings[1];
#define MAX_ELEM 4
static struct PluginStartupInfo FARAPI;
static struct FarDialogItem DialogItems[MAX_ELEM];
static CHAR_INFO vb[256 + 32]; // table + info
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
return(TRUE);
}
// The SetStartupInfo function is called once, after the DLL module is loaded to memory.
// This function gives the plugin information necessary for further operation.
EXPORT void WINAPI SetStartupInfo(const struct PluginStartupInfo *Info) {
DWORD i;
CopyMemory(&FARAPI, Info, sizeof(FARAPI));
// initialization code
ZeroMemory(DialogItems, sizeof(DialogItems[0]) * MAX_ELEM);
// dialog box
DialogItems[0].Type = DI_DOUBLEBOX;
DialogItems[0].X1 = 0;
DialogItems[0].Y1 = 0;
DialogItems[0].X2 = 33;
DialogItems[0].Y2 = 11;
// separator
DialogItems[1].Type = DI_SINGLEBOX;
DialogItems[1].X1 = 1;
DialogItems[1].Y1 = 9;
DialogItems[1].X2 = 32;
DialogItems[1].Y2 = 9;
DialogItems[1].Flags = DIF_SEPARATOR;
// information text
DialogItems[2].Type = DI_USERCONTROL;
DialogItems[2].X1 = 1;
DialogItems[2].Y1 = 10;
DialogItems[2].X2 = 32;
DialogItems[2].Y2 = 10;
DialogItems[2].VBuf = &vb[256];
// characters table
DialogItems[3].Type = DI_USERCONTROL;
DialogItems[3].X1 = 1;
DialogItems[3].Y1 = 1;
DialogItems[3].X2 = 32;
DialogItems[3].Y2 = 8;
DialogItems[3].VBuf = vb;
// init table
ZeroMemory(vb, sizeof(vb[0]) * (256 + 32));
// characters table
vb[0].Attributes = FARAPI.AdvControl(FARAPI.ModuleNumber, ACTL_GETCOLOR, (void *) COL_DIALOGTEXT);
for (i = 0; i < 256; i++) {
vb[i].Char.AsciiChar = i;
vb[i].Attributes = vb[0].Attributes;
}
// information text
vb[256].Attributes = FARAPI.AdvControl(FARAPI.ModuleNumber, ACTL_GETCOLOR, (void *) COL_DIALOGHIGHLIGHTTEXT);
for (i = 0; i < 32; i++) {
if (InfoFmtStr[i] == '#') {
vb[256 + i].Char.AsciiChar = ' ';
vb[256 + i].Attributes = vb[256].Attributes;
} else {
vb[256 + i].Char.AsciiChar = InfoFmtStr[i];
vb[256 + i].Attributes = vb[0].Attributes;
}
}
}
// The GetPluginInfo function is called to get general plugin information
EXPORT void WINAPI GetPluginInfo(struct PluginInfo *pi) {
pi->StructSize = sizeof(pi[0]);
pi->Flags = PF_EDITOR | PF_VIEWER;
PluginMenuStrings[0] = PluginName;
pi->PluginMenuStrings = PluginMenuStrings;
pi->PluginMenuStringsNumber = 1;
}
void UpdateInfoLine(HANDLE hDlg, COORD *c) {
CHAR_INFO *v;
DWORD r;
FARAPI.SendDlgMessage(hDlg, DM_SETCURSORPOS, 3, (long) c);
r = ((c->Y * 32) + c->X) & 0xFF;
v = &vb[256];
// char
v[7].Char.AsciiChar = r ? r : ' ';
// digit
if (r >= 100) { v[18].Char.AsciiChar = '0' + (r/100); } else { v[18].Char.AsciiChar = ' '; }
if (r >= 10) { v[19].Char.AsciiChar = '0' + ((r/10)%10); } else { v[19].Char.AsciiChar = ' '; }
v[20].Char.AsciiChar = '0' + (r%10);
// hex
v[27].Char.AsciiChar = '0' + (r >> 4);
v[28].Char.AsciiChar = '0' + (r & 0x0F);
v[27].Char.AsciiChar += (v[27].Char.AsciiChar > '9') ? 7 : 0;
v[28].Char.AsciiChar += (v[28].Char.AsciiChar > '9') ? 7 : 0;
// update color character
v[30].Attributes = r ? r : vb[0].Attributes;
// force information text to redraw
FARAPI.SendDlgMessage(hDlg, DM_SETDLGITEM, 2, (long) &DialogItems[2]);
}
long WINAPI DlgPrc(HANDLE hDlg, int Msg, int Param1, long Param2) {
COORD c;
switch (Msg) {
case DN_INITDIALOG:
// set dialog title and also restore it after F1
FARAPI.SendDlgMessage(hDlg, DM_SETTEXTPTR, 0, (long) &PluginName);
// center of the table
c.X = 16;
c.Y = 4;
// set focus to characters table
FARAPI.SendDlgMessage(hDlg, DM_SETFOCUS, 3, 0);
// make cursor big
FARAPI.SendDlgMessage(hDlg, DM_SETCURSORSIZE, 3, MAKELONG(1, 99));
// show information text
UpdateInfoLine(hDlg, &c);
// save character address pointer
FARAPI.SendDlgMessage(hDlg, DM_SETDLGDATA, 0, Param2);
// tell FAR that information text was updated
return(TRUE);
break;
// do not allow to change focus
// to any other element except
// the characters table
case DN_KILLFOCUS:
return(3);
break;
// walk through characters
case DN_KEY:
if (Param1 == 3) {
FARAPI.SendDlgMessage(hDlg, DM_GETCURSORPOS, 3, (long) &c);
switch (Param2) {
case KEY_UP:
c.Y -= (c.Y ? 1 : 0);
break;
case KEY_DOWN:
c.Y += ((c.Y < 7) ? 1 : 0);
break;
case KEY_LEFT:
c.X -= (c.X ? 1 : 0);
break;
case KEY_RIGHT:
c.X += ((c.X < 31) ? 1 : 0);
break;
case KEY_HOME:
c.X = 0;
break;
case KEY_END:
c.X = 31;
break;
case KEY_PGUP:
c.Y = 0;
break;
case KEY_PGDN:
c.Y = 7;
break;
}
UpdateInfoLine(hDlg, &c);
}
// about
if (Param2 == KEY_F1) {
// set text to dialog title
FARAPI.SendDlgMessage(hDlg, DM_SETTEXTPTR, 0, (long) &PluginInfo);
}
break;
// mouse clicked
case DN_MOUSECLICK:
if (Param1 == 3) {
UpdateInfoLine(hDlg, &((MOUSE_EVENT_RECORD *) Param2)->dwMousePosition);
}
break;
// on close - return selected character
case DN_CLOSE:
if (Param1 == 3) {
FARAPI.SendDlgMessage(hDlg, DM_GETCURSORPOS, 3, (long) &c);
c.X = ((c.Y * 32) + c.X) & 0xFF;
// return selected character
*((DWORD *) FARAPI.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0)) = c.X;
}
break;
}
// default dialogue procedure
return(FARAPI.DefDlgProc(hDlg, Msg, Param1, Param2));
}
// The OpenPlugin is called to create a new plugin instance.
EXPORT HANDLE WINAPI OpenPlugin(int OpenFrom, int item) {
DWORD pchr;
if (FARAPI.DialogEx(FARAPI.ModuleNumber, -1, -1, 32+2, 8+2+2, NULL, DialogItems, MAX_ELEM, 0, 0, &DlgPrc, (long) &pchr) != -1) {
// insert character only in editor or file panel
if (OpenFrom != OPEN_VIEWER) {
if (OpenFrom == OPEN_EDITOR) {
FARAPI.EditorControl(ECTL_INSERTTEXT, (void *) &pchr);
} else {
FARAPI.Control(INVALID_HANDLE_VALUE, FCTL_INSERTCMDLINE, (void *) &pchr);
}
}
}
return(INVALID_HANDLE_VALUE);
}
// this plugin will work only in FAR Manager version 1.70 and later
EXPORT int WINAPI GetMinFarVersion(void) {
return(MAKEFARVERSION(1, 70, 0));
}
2016.03.07