home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1991 / 08 / dflat5 / dflat.h < prev    next >
Text File  |  1991-06-28  |  16KB  |  403 lines

  1. /* ------------- dflat.h ----------- */
  2. #ifndef WINDOW_H
  3. #define WINDOW_H
  4.  
  5. #define VERSION "Version 5"
  6.  
  7. #define TRUE 1
  8. #define FALSE 0
  9.  
  10. #define DFLAT_APPLICATION "MEMOPAD"
  11.  
  12. #define INCLUDE_SYSTEM_MENUS
  13. #define INCLUDE_CLOCK
  14. #define INCLUDE_MULTIDOCS
  15. #define INCLUDE_SHADOWS
  16. #define INCLUDE_DIALOG_BOXES
  17. #define INCLUDE_HELP
  18. #define INCLUDE_STATUSBAR
  19. #define PUSHBUTTON_DEPRESS
  20. #define INCLUDE_COMPRESS_HELPFILE
  21. #define INCLUDE_CLIPBOARD
  22. #define INCLUDE_SCROLLBARS
  23. #define INCLUDE_MULTILINE
  24.  
  25. #ifdef TESTING_DFLAT
  26. #define INCLUDE_LOGGING
  27. #define INCLUDE_RELOADHELP
  28. #endif
  29.  
  30. #define MAXMESSAGES 50
  31. #define DELAYTICKS 1
  32. #define FIRSTDELAY 7
  33. #define DOUBLETICKS 5
  34.  
  35. typedef enum messages {
  36.     #undef DFlatMsg
  37.     #define DFlatMsg(m) m,
  38.     #include "dflatmsg.h"
  39.     MESSAGECOUNT
  40. } MESSAGE;
  41.  
  42. typedef enum window_class    {
  43.     #define ClassDef(c,b,p,a) c,
  44.     #include "classes.h"
  45.     CLASSCOUNT
  46. } CLASS;
  47.  
  48. #include "system.h"
  49. #include "config.h"
  50. #include "rect.h"
  51. #include "menu.h"
  52. #include "keys.h"
  53. #include "commands.h"
  54. #include "dialbox.h"
  55.  
  56. /* ------ integer type for message parameters ----- */
  57. typedef long PARAM;
  58.  
  59. typedef struct window {
  60.     CLASS class;           /* window class                  */
  61.     char *title;           /* window title                  */
  62.     struct window *parent; /* parent window                 */
  63.     int (*wndproc)
  64.         (struct window *, enum messages, PARAM, PARAM);
  65.     /* ---------------- window dimensions ----------------- */
  66.     RECT rc;               /* window coordinates
  67.                                             (0/0 to 79/24)  */
  68.     int ht, wd;            /* window height and width       */
  69.     RECT RestoredRC;       /* restored condition rect       */
  70.     /* -------------- linked list pointers ---------------- */
  71.     struct window *nextfocus;   /* next window on screen    */
  72.     struct window *prevfocus;   /* previous window on screen*/
  73.     struct window *nextbuilt;   /* next window built        */
  74.     struct window *prevbuilt;   /* previous window built    */
  75.  
  76.     int attrib;                 /* Window attributes        */
  77.     char *videosave;            /* video save buffer        */
  78.     int condition;              /* Restored, Maximized,
  79.                                    Minimized, Closing       */
  80.     int restored_attrib;        /* attributes when restored */
  81.     void *extension;      /* menus, dialogs, documents, etc */
  82.     struct window *PrevMouse;
  83.     struct window *PrevKeyboard;
  84.     struct window *MenuBar;   /* menu bar                   */
  85.     struct window *StatusBar; /* status bar                 */
  86.     /* ----------------- text box fields ------------------ */
  87.     int wlines;     /* number of lines of text              */
  88.     int wtop;       /* text line that is on the top display */
  89.     unsigned char *text;   /* window text                   */
  90.     unsigned int textlen;  /* text length                   */
  91.     int wleft;      /* left position in window viewport     */
  92.     int textwidth;  /* width of longest line in textbox     */
  93.     int BlkBegLine; /* beginning line of marked block       */
  94.     int BlkBegCol;  /* beginning column of marked block     */
  95.     int BlkEndLine; /* ending line of marked block          */
  96.     int BlkEndCol;  /* ending column of marked block        */
  97.     int HScrollBox; /* position of horizontal scroll box    */
  98.     int VScrollBox; /* position of vertical scroll box      */
  99.     unsigned int *TextPointers; /* -> list of line offsets    */
  100.     /* ----------------- list box fields ------------------ */
  101.     int selection;  /* current selection                    */
  102.     int AddMode;    /* adding extended selections mode      */
  103.     int AnchorPoint;/* anchor point for extended selections */
  104.     int SelectCount;/* count of selected items              */
  105.     /* ----------------- edit box fields ------------------ */
  106.     int CurrCol;    /* Current column                       */
  107.     int CurrLine;   /* Current line                         */
  108.     int WndRow;     /* Current window row                   */
  109.     int TextChanged; /* TRUE if text has changed            */
  110.     unsigned char *DeletedText; /* for undo                 */
  111.     int DeletedLength; /*  "   "                            */
  112.     /* ---------------- dialog box fields ----------------- */
  113.     struct window *dFocus; /* control that has the focus    */
  114.     int ReturnCode;        /* return code from a dialog box */
  115.     int Modal;               /* True if a modeless dialog box */
  116.     /* -------------- popdownmenu fields ------------------ */
  117.     MENU *mnu;        /* points to menu structure             */
  118.     MENU *holdmenu; /* previous active menu                 */
  119.     /* --------------- help box fields -------------------- */
  120.     void *firstword; /* -> first in list of key words       */
  121.     void *lastword;  /* -> last in list of key words        */
  122.     void *thisword;  /* -> current in list of key words     */
  123.     /* -------------- status bar fields ------------------- */
  124.     int TimePosted;  /* True if time has been posted        */
  125. } * WINDOW;
  126.  
  127. #include "classdef.h"
  128. #include "video.h"
  129.  
  130. enum Condition     {
  131.     ISRESTORED, ISMINIMIZED, ISMAXIMIZED, ISCLOSING
  132. };
  133.  
  134. void LogMessages (WINDOW, MESSAGE, PARAM, PARAM);
  135. void MessageLog(WINDOW);
  136. /* ------- window methods ----------- */
  137. #define ICONHEIGHT 3
  138. #define ICONWIDTH  10
  139. #define WindowHeight(w)      ((w)->ht)
  140. #define WindowWidth(w)       ((w)->wd)
  141. #define BorderAdj(w)         (TestAttribute(w,HASBORDER)?1:0)
  142. #define TopBorderAdj(w)      ((TestAttribute(w,HASTITLEBAR) &&   \
  143.                               TestAttribute(w,HASMENUBAR)) ?  \
  144.                               2 : (TestAttribute(w,HASTITLEBAR | \
  145.                               HASMENUBAR | HASBORDER) ? 1 : 0))
  146. #define ClientWidth(w)       (WindowWidth(w)-BorderAdj(w)*2)
  147. #define ClientHeight(w)      (WindowHeight(w)-TopBorderAdj(w)-\
  148.                               BorderAdj(w))
  149. #define WindowRect(w)        ((w)->rc)
  150. #define GetTop(w)            (RectTop(WindowRect(w)))
  151. #define GetBottom(w)         (RectBottom(WindowRect(w)))
  152. #define GetLeft(w)           (RectLeft(WindowRect(w)))
  153. #define GetRight(w)          (RectRight(WindowRect(w)))
  154. #define GetClientTop(w)      (GetTop(w)+TopBorderAdj(w))
  155. #define GetClientBottom(w)   (GetBottom(w)-BorderAdj(w))
  156. #define GetClientLeft(w)     (GetLeft(w)+BorderAdj(w))
  157. #define GetClientRight(w)    (GetRight(w)-BorderAdj(w))
  158. #define GetParent(w)         ((w)->parent)
  159. #define GetTitle(w)          ((w)->title)
  160. #define NextWindow(w)        ((w)->nextfocus)
  161. #define PrevWindow(w)        ((w)->prevfocus)
  162. #define NextWindowBuilt(w)   ((w)->nextbuilt)
  163. #define PrevWindowBuilt(w)   ((w)->prevbuilt)
  164. #define GetClass(w)          ((w)->class)
  165. #define GetAttribute(w)      ((w)->attrib)
  166. #define AddAttribute(w,a)    (GetAttribute(w) |= a)
  167. #define ClearAttribute(w,a)  (GetAttribute(w) &= ~(a))
  168. #define TestAttribute(w,a)   (GetAttribute(w) & (a))
  169. #define isWndVisible(w)      (GetAttribute(w) & VISIBLE)
  170. #define SetVisible(w)        (GetAttribute(w) |= VISIBLE)
  171. #define ClearVisible(w)      (GetAttribute(w) &= ~VISIBLE)
  172. #define gotoxy(w,x,y) cursor(w->rc.lf+(x)+1,w->rc.tp+(y)+1)
  173. WINDOW CreateWindow(CLASS,char *,int,int,int,int,void*,WINDOW,
  174.        int (*)(struct window *,enum messages,PARAM,PARAM),int);
  175. void AddTitle(WINDOW, char *);
  176. void InsertTitle(WINDOW, char *);
  177. void DisplayTitle(WINDOW, RECT *);
  178. void RepaintBorder(WINDOW, RECT *);
  179. void ClearWindow(WINDOW, RECT *, int);
  180. #ifdef INCLUDE_SYSTEM_MENUS
  181. void clipline(WINDOW, int, char *);
  182. #else
  183. #define clipline(w,x,c) /**/
  184. #endif
  185. void writeline(WINDOW, char *, int, int, int);
  186.  
  187. void SetNextFocus(WINDOW);
  188. void SetPrevFocus(WINDOW);
  189. void RemoveFocusWindow(WINDOW);
  190. void AppendFocusWindow(WINDOW);
  191. void RemoveBuiltWindow(WINDOW);
  192. void AppendBuiltWindow(WINDOW);
  193. WINDOW SearchFocusNext(WINDOW, WINDOW);
  194. WINDOW GetFirstChild(WINDOW);
  195. WINDOW GetNextChild(WINDOW, WINDOW);
  196. WINDOW GetLastChild(WINDOW);
  197. WINDOW GetPrevChild(WINDOW, WINDOW);
  198. WINDOW GetFirstFocusChild(WINDOW);
  199. WINDOW GetNextFocusChild(WINDOW, WINDOW);
  200.  
  201. int isVisible(WINDOW);
  202. int CharInView(WINDOW, int, int);
  203. void PutWindowChar(WINDOW, int, int, int);
  204. void GetVideoBuffer(WINDOW);
  205. void RestoreVideoBuffer(WINDOW);
  206. void CreatePath(char *, char *, int, int);
  207. int LineLength(char *);
  208. RECT AdjustRectangle(WINDOW, RECT);
  209. #define DefaultWndProc(wnd,msg,p1,p2)    \
  210.     (*classdefs[wnd->class].wndproc)(wnd,msg,p1,p2)
  211. #define BaseWndProc(class,wnd,msg,p1,p2)    \
  212.     (*classdefs[DerivedClass(class)].wndproc)(wnd,msg,p1,p2)
  213. #define NULLWND ((WINDOW) 0)
  214. struct LinkedList    {
  215.     WINDOW FirstWindow;
  216.     WINDOW LastWindow;
  217. };
  218. extern struct LinkedList Focus;
  219. extern struct LinkedList Built;
  220. extern WINDOW inFocus;
  221. extern WINDOW CaptureMouse;
  222. extern WINDOW CaptureKeyboard;
  223. extern int foreground, background;
  224. extern int WindowMoving;
  225. extern int WindowSizing;
  226. extern int HScrolling;
  227. extern int VScrolling;
  228. extern int TextMarking;
  229. extern char *Clipboard;
  230. /* --------- space between menubar labels --------- */
  231. #define MSPACE 2
  232. /* --------------- border characters ------------- */
  233. #define FOCUS_NW      (unsigned char) '\xc9'
  234. #define FOCUS_NE      (unsigned char) '\xbb'
  235. #define FOCUS_SE      (unsigned char) '\xbc'
  236. #define FOCUS_SW      (unsigned char) '\xc8'
  237. #define FOCUS_SIDE    (unsigned char) '\xba'
  238. #define FOCUS_LINE    (unsigned char) '\xcd'
  239. #define NW            (unsigned char) '\xda'
  240. #define NE            (unsigned char) '\xbf'
  241. #define SE            (unsigned char) '\xd9'
  242. #define SW            (unsigned char) '\xc0'
  243. #define SIDE          (unsigned char) '\xb3'
  244. #define LINE          (unsigned char) '\xc4'
  245. #define LEDGE         (unsigned char) '\xc3'
  246. #define REDGE         (unsigned char) '\xb4'
  247. /* ------------- scroll bar characters ------------ */
  248. #define UPSCROLLBOX    (unsigned char) '\x1e'
  249. #define DOWNSCROLLBOX  (unsigned char) '\x1f'
  250. #define LEFTSCROLLBOX  (unsigned char) '\x11'
  251. #define RIGHTSCROLLBOX (unsigned char) '\x10'
  252. #define SCROLLBARCHAR  (unsigned char) 176 
  253. #define SCROLLBOXCHAR  (unsigned char) 178
  254. #define CHECKMARK      (unsigned char) 251 /* menu toggle   */
  255. /* ----------------- title bar characters ----------------- */
  256. #define CONTROLBOXCHAR (unsigned char) '\xf0'
  257. #define MAXPOINTER     24      /* maximize token            */
  258. #define MINPOINTER     25      /* minimize token            */
  259. #define RESTOREPOINTER 18      /* restore token             */
  260. /* --------------- text control characters ---------------- */
  261. #define APPLCHAR     (unsigned char) 176 /* fills application window */
  262. #define SHORTCUTCHAR '~'    /* prefix: shortcut key display */
  263. #define CHANGECOLOR  (unsigned char) 174 /* prefix to change colors  */
  264. #define RESETCOLOR   (unsigned char) 175 /* reset colors to default  */
  265. #define LISTSELECTOR   4    /* selected list box entry      */
  266. /* --------- message prototypes ----------- */
  267. void init_messages(void);
  268. void PostMessage(WINDOW, MESSAGE, PARAM, PARAM);
  269. int SendMessage(WINDOW, MESSAGE, PARAM, PARAM);
  270. int dispatch_message(void);
  271. int TestCriticalError(void);
  272. /* ---- standard window message processing prototypes ----- */
  273. int ApplicationProc(WINDOW, MESSAGE, PARAM, PARAM);
  274. int NormalProc(WINDOW, MESSAGE, PARAM, PARAM);
  275. int TextBoxProc(WINDOW, MESSAGE, PARAM, PARAM);
  276. int ListBoxProc(WINDOW, MESSAGE, PARAM, PARAM);
  277. int EditBoxProc(WINDOW, MESSAGE, PARAM, PARAM);
  278. int MenuBarProc(WINDOW, MESSAGE, PARAM, PARAM);
  279. int PopDownProc(WINDOW, MESSAGE, PARAM, PARAM);
  280. int ButtonProc(WINDOW, MESSAGE, PARAM, PARAM);
  281. int DialogProc(WINDOW, MESSAGE, PARAM, PARAM);
  282. int SystemMenuProc(WINDOW, MESSAGE, PARAM, PARAM);
  283. int HelpBoxProc(WINDOW, MESSAGE, PARAM, PARAM);
  284. int MessageBoxProc(WINDOW, MESSAGE, PARAM, PARAM);
  285. int ErrorBoxProc(WINDOW, MESSAGE, PARAM, PARAM);
  286. int YesNoBoxProc(WINDOW, MESSAGE, PARAM, PARAM);
  287. int StatusBarProc(WINDOW, MESSAGE, PARAM, PARAM);
  288. /* ------------- normal box prototypes ------------- */
  289. int isWindow(WINDOW);
  290. WINDOW inWindow(int, int);
  291. int WndForeground(WINDOW);
  292. int WndBackground(WINDOW);
  293. int FrameForeground(WINDOW);
  294. int FrameBackground(WINDOW);
  295. int SelectForeground(WINDOW);
  296. int SelectBackground(WINDOW);
  297. void SetStandardColor(WINDOW);
  298. void SetReverseColor(WINDOW);
  299. void SetClassColors(CLASS);
  300. #define HitControlBox(wnd, p1, p2)     \
  301.     (TestAttribute(wnd, HASTITLEBAR)   && \
  302.      TestAttribute(wnd, CONTROLBOX) && \
  303.      p1 == 2 && p2 == 0)
  304. #define WndForeground(wnd)         \
  305.     (cfg.clr [GetClass(wnd)] [STD_COLOR] [FG])
  306. #define WndBackground(wnd)         \
  307.     (cfg.clr [GetClass(wnd)] [STD_COLOR] [BG])
  308. #define FrameForeground(wnd)     \
  309.     (cfg.clr [GetClass(wnd)] [FRAME_COLOR] [FG])
  310. #define FrameBackground(wnd)     \
  311.     (cfg.clr [GetClass(wnd)] [FRAME_COLOR] [BG])
  312. #define SelectForeground(wnd)     \
  313.     (cfg.clr [GetClass(wnd)] [SELECT_COLOR] [FG])
  314. #define SelectBackground(wnd)     \
  315.     (cfg.clr [GetClass(wnd)] [SELECT_COLOR] [BG])
  316. /* -------- text box prototypes ---------- */
  317. #define TextLine(wnd, sel) \
  318.       (wnd->text + *((wnd->TextPointers) + sel))
  319. void WriteTextLine(WINDOW, RECT *, int, int);
  320. void SetAnchor(WINDOW, int, int);
  321. #define BlockMarked(wnd) (  wnd->BlkBegLine ||    \
  322.                             wnd->BlkEndLine ||    \
  323.                             wnd->BlkBegCol  ||    \
  324.                             wnd->BlkEndCol)
  325. #define ClearBlock(wnd) wnd->BlkBegLine = wnd->BlkEndLine =  \
  326.                         wnd->BlkBegCol  = wnd->BlkEndCol = 0;
  327. #define GetText(w)        ((w)->text)
  328. void ClearTextPointers(WINDOW);
  329. void BuildTextPointers(WINDOW);
  330. /* --------- menu prototypes ---------- */
  331. int CopyCommand(unsigned char *, unsigned char *, int, int);
  332. void PrepFileMenu(void *, struct Menu *);
  333. void PrepEditMenu(void *, struct Menu *);
  334. void PrepSearchMenu(void *, struct Menu *);
  335. void PrepWindowMenu(void *, struct Menu *);
  336. void BuildSystemMenu(WINDOW);
  337. int isActive(MENU *, int);
  338. void ActivateCommand(MENU *,int);
  339. void DeactivateCommand(MENU *,int);
  340. int GetCommandToggle(MENU *,int);
  341. void SetCommandToggle(MENU *,int);
  342. void ClearCommandToggle(MENU *,int);
  343. void InvertCommandToggle(MENU *,int);
  344. int BarSelection(int);
  345. /* ------------- list box prototypes -------------- */
  346. int ItemSelected(WINDOW, int);
  347. /* ------------- edit box prototypes ----------- */
  348. #ifdef INCLUDE_MULTILINE
  349. #define isMultiLine(wnd)     TestAttribute(wnd, MULTILINE)
  350. #else
  351. #define isMultiLine(wnd)     FALSE
  352. #endif
  353. /* --------- message box prototypes -------- */
  354. int GenericMessage(char *, char *, int,
  355.     int (*)(struct window *, enum messages, PARAM, PARAM),
  356.     char *, char *);
  357. #define TestErrorMessage(msg)    \
  358.     GenericMessage("Error", msg, 2, ErrorBoxProc,   Ok, Cancel)
  359. #define ErrorMessage(msg) \
  360.     GenericMessage("Error", msg, 1, ErrorBoxProc,   Ok, NULL)
  361. #define MessageBox(ttl, msg) \
  362.     GenericMessage(ttl,     msg, 1, MessageBoxProc, Ok, NULL)
  363. #define YesNoBox(msg)    \
  364.     GenericMessage(NULL,    msg, 2, YesNoBoxProc,  Yes, No)
  365. WINDOW MomentaryMessage(char *);
  366. int MsgHeight(char *);
  367. int MsgWidth(char *);
  368.  
  369. #ifdef INCLUDE_DIALOG_BOXES
  370. /* ------------- dialog box prototypes -------------- */
  371. int DialogBox(WINDOW, DBOX *, int,
  372.        int (*)(struct window *, enum messages, PARAM, PARAM));
  373. int DlgOpenFile(char *, char *);
  374. int DlgSaveAs(char *);
  375. void GetDlgListText(WINDOW, char *, enum commands);
  376. int DlgDirList(WINDOW, char *, enum commands,
  377.                             enum commands, unsigned);
  378. int RadioButtonSetting(DBOX *, enum commands);
  379. void PushRadioButton(DBOX *, enum commands);
  380. void PutItemText(WINDOW, enum commands, char *);
  381. void GetItemText(WINDOW, enum commands, char *, int);
  382. char *GetEditBoxText(DBOX *, enum commands);
  383. void SetEditBoxText(DBOX *, enum commands, char *);
  384. void SetCheckBox(DBOX *, enum commands);
  385. void ClearCheckBox(DBOX *, enum commands);
  386. int CheckBoxSetting(DBOX *, enum commands);
  387. WINDOW ControlWindow(DBOX *, enum commands);
  388. CTLWINDOW *ControlBox(DBOX *, WINDOW);
  389. void EnableButton(DBOX *, enum commands);
  390. void DisableButton(DBOX *, enum commands);
  391. #endif
  392.  
  393. /* ------------- help box prototypes ------------- */
  394. void LoadHelpFile(void);
  395. void UnLoadHelpFile(void);
  396. int DisplayHelp(WINDOW, char *);
  397.  
  398. #ifdef INCLUDE_HELP
  399. extern char *ClassNames[];
  400. #endif
  401.  
  402. #endif
  403.