home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / xdme_1.84_src.lha / XDME / Src / prefs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-04  |  13.8 KB  |  533 lines

  1. /******************************************************************************
  2.  
  3.     MODUL
  4.     $Id: prefs.c 1.2 1994/09/09 12:31:30 digulla Exp digulla $
  5.  
  6.     DESCRIPTION
  7.     Everything to set, edit, get, load and save settings !
  8.  
  9.     HISTORY
  10.     14. Nov 1992    ada created
  11.     $Log: prefs.c $
  12.  * Revision 1.2  1994/09/09  12:31:30  digulla
  13.  * added function tas_flag() to set a flag and display the result in the title
  14.  * added new style Prototypes, DEFCMD and DEFHELP
  15.  * added functions for several flags
  16.  *
  17.  * Revision 1.1  1994/08/14  12:30:15  digulla
  18.  * Initial revision
  19.  *
  20.  
  21. ******************************************************************************/
  22.  
  23. /**************************************
  24.         Includes
  25. **************************************/
  26. #include "defs.h"
  27.  
  28.  
  29. /**************************************
  30.         Globale Variable
  31. **************************************/
  32.  
  33.  
  34. /**************************************
  35.       Interne Defines & Strukturen
  36. **************************************/
  37.  
  38.  
  39. /**************************************
  40.         Interne Variable
  41. **************************************/
  42.  
  43.  
  44. /**************************************
  45.        Interne Prototypes
  46. **************************************/
  47. Prototype int tas_flag (char * what, int old, char * prefix);
  48. static void SetXDMEPen (UBYTE other, UBYTE * set);
  49. static void CheckExt (char * str, char * ext);
  50.  
  51.  
  52. int tas_flag (char * what, int old, char * prefix)
  53. {
  54.     int ret = test_arg (what, old);
  55.  
  56. DEFMESSAGE( _PREF__is_now_, "%s is now %s" )
  57.     title (_PREF__is_now_, prefix, ret ? "ON" : "OFF");
  58.  
  59.     return (ret);
  60. } /* tas_flag */
  61.  
  62.  
  63. static void SetXDMEPen (UBYTE other, UBYTE * set)
  64. {
  65.     int pen;
  66.  
  67.     pen = atoi((char *)av[1]);
  68.  
  69.     if (pen != other)
  70.     {
  71.     *set = pen;
  72.     text_redisplay ();
  73.     } else
  74.     error ("%s:\n"
  75.            "Cannot choose same color\n"
  76.            "for both back- and fore-\n"
  77.            "ground", av[0]);
  78. } /* SetXDMEPen */
  79.  
  80.  
  81. static void CheckExt (char * str, char * ext)
  82. {
  83.     int len, extlen;
  84.  
  85.     len = strlen (str);
  86.     extlen = strlen (ext);
  87.  
  88.     if (len < extlen || strcmp (str+len-extlen, ext))
  89.     strcat (str, ext);
  90.  
  91. } /* CheckExt */
  92.  
  93.  
  94. /*DEFHELP #cmd prefs MARGIN n - set WordWrap and paragraph formatting margin (related to WORDWRAP and REFORMAT) */
  95.  
  96. DEFUSERCMD("margin", 1, CF_VWM|CF_ICO|CF_COK, void, do_margin, (void),)
  97. {
  98.     Ep->config.margin = atoi((char *)av[1]);
  99. } /* do_margin */
  100.  
  101.  
  102. /*DEFHELP #cmd prefs WORDWRAP what - set word wrap mode (related to MARGIN) */
  103.  
  104. DEFUSERCMD("wordwrap", 1, CF_VWM|CF_COK|CF_ICO, void, do_wordwrap, (void),)
  105. {
  106.     SETF_WORDWRAP(Ep, tas_flag (av[1], GETF_WORDWRAP(Ep), "WordWrap"));
  107. } /* do_wordwrap() */
  108.  
  109.  
  110. /*DEFHELP #cmd searchreplace,prefs GLOBAL what - turn global search on/off. If XDME cannot find a string in one window, it will continue with the next one. */
  111.  
  112. DEFUSERCMD("global", 1, CF_VWM|CF_COK|CF_ICO, void, do_global, (void),)
  113. {
  114.     SETF_GLOBALSEARCH(Ep,tas_flag (av[1], GETF_GLOBALSEARCH(Ep), "Global search"));
  115. } /* global_search */
  116.  
  117.  
  118. /*DEFHELP #cmd prefs SETPARCOL col - Set the LEFT margin for word wrap mode paragraphing & reformat. MUST be less than MARGIN. */
  119.  
  120. DEFUSERCMD("setparcol", 1, CF_VWM|CF_COK|CF_ICO, void, do_setparcol, (void),)
  121. {
  122.     Ep->config.wwcol = atoi ((char *)av[1]);
  123. } /* do_setparcol() */
  124.  
  125.  
  126. /*DEFHELP #cmd prefs TABSTOP n - Set tab stops every @{B}n@{UB}. does not effect text load. */
  127.  
  128. DEFUSERCMD("tabstop", 1, CF_VWM|CF_COK|CF_ICO, void, do_tabstop, (void),)
  129. {
  130.     Ep->config.tabstop = atoi ((char *)av[1]);
  131. } /* do_tabstop() */
  132.  
  133.  
  134. /*DEFHELP #cmd prefs INSERTMODE what - set INSERTMODE. */
  135.  
  136. DEFUSERCMD("insertmode", 1, CF_VWM|CF_COK|CF_ICO, void, do_insertmode, (void),)
  137. {
  138.     SETF_INSERTMODE(Ep, test_arg (av[1], GETF_INSERTMODE(Ep)));
  139.  
  140.     window_title ();
  141. } /* do_insertmode() */
  142.  
  143.  
  144. /*DEFHELP #cmd prefs,io CHFILENAME name - change the name of the working file */
  145.  
  146. DEFUSERCMD("chfilename", 1, CF_VWM|CF_ICO, void, do_chfilename, (void),)
  147. {
  148.     BPTR    new_lock;
  149.     UBYTE * ptr;
  150.  
  151.     text_sync ();
  152.  
  153.     getpathto (Ep->dirlock, av[1], tmp_buffer);
  154.  
  155.     ptr = FilePart (tmp_buffer);
  156.     if (ptr != tmp_buffer)
  157.     {
  158.     char c = *ptr;
  159.     *ptr = 0;
  160.  
  161.     if (new_lock = Lock (tmp_buffer, SHARED_LOCK))
  162.     {
  163.         UnLock (Ep->dirlock);
  164.  
  165.         Ep->dirlock = new_lock;
  166.     } else
  167.     {
  168.         error ("%s:\nCannot get lock for\n`%s'.", av[0], tmp_buffer);
  169.  
  170.         return;
  171.     }
  172.  
  173.     *ptr = c;
  174.     }
  175.  
  176.     strncpy ((char *)Ep->name, ptr, 63);
  177.     Ep->name[63] = 0;
  178.  
  179.     SETF_MFORCETITLE(Ep,1);
  180. } /* do_chfilename */
  181.  
  182.  
  183. /*DEFHELP #cmd prefs SAVETABS what - Optimize file saves by crunching spaces to tabs. The default is OFF. */
  184.  
  185. DEFUSERCMD("savetabs", 1, CF_VWM|CF_COK|CF_ICO, void, do_savetabs, (void),)
  186. {
  187.     SETF_SAVETABS(Ep,test_arg (av[1], GETF_SAVETABS(Ep)));
  188. } /* do_savetabs() */
  189.  
  190.  
  191. /*DEFHELP #cmd prefs SETFONT font sz - Set the window's font. @{B}setfont topaz 11@{UB} */
  192.  
  193. DEFUSERCMD("setfont", 2, CF_VWM, void, do_setfont, (void),)
  194. {
  195.     FONT * font;
  196.     ED     * ep    = Ep;
  197.     ULONG  size;
  198.  
  199.     size = atoi ((char *)av[2]);
  200.  
  201.     if (size > MAX_FONT_SIZE)
  202.     {
  203.     error ("setfont:\nSize %ld too large !", size);
  204.     return;
  205.     }
  206.  
  207.     strcpy (tmp_buffer, av[1]);
  208.     CheckExt (tmp_buffer, ".font");
  209.  
  210.     font = (FONT *)GetFont (tmp_buffer, size);
  211.  
  212.     if (font)
  213.     {
  214.     if (ep->font)
  215.         CloseFont (ep->font);
  216.  
  217.     ep->font = font;
  218.  
  219.     SetFont (ep->win->RPort, font);
  220.     SetRast (ep->win->RPort, 0);
  221.     RefreshWindowFrame (ep->win);
  222.     set_window_params ();
  223.     text_adjust (TRUE);
  224.     }
  225.     else
  226.     {
  227. DEFMESSAGE( _PREF_cant_find_font, "%s:\nUnable to find font\n%s/%ld" )
  228.     error (_PREF_cant_find_font, av[0], tmp_buffer, size);
  229.     }
  230. } /* do_setfont */
  231.  
  232.  
  233. /*DEFHELP #cmd prefs IGNORECASE what -set case ignore for seaches. */
  234.  
  235. DEFUSERCMD("ignorecase", 1, CF_VWM|CF_COK|CF_ICO, void, do_ignorecase, (void),)
  236. {
  237.     SETF_IGNORECASE(Ep, tas_flag (av[1], GETF_IGNORECASE(Ep), "Ignore case"));
  238. } /* do_ignorecase */
  239.  
  240.  
  241. /*DEFHELP #cmd prefs,io SAVECONFIG -save current editor configuration to @{I}s:XDME.prefs@{UI} */
  242.  
  243. DEFUSERCMD("saveconfig", 0, CF_VWM|CF_COK|CF_ICO, void, do_saveconfig, (void),)
  244. {
  245.     ED     * ep = Ep;
  246.     FILE * fi;
  247.     WIN  * win = ep->win;
  248.  
  249.    if (GETF_ICONMODE(ep))
  250.    {
  251.     ep->config.iwinx = win->LeftEdge;
  252.     ep->config.iwiny = win->TopEdge;
  253.    } else
  254.    {
  255.     ep->config.winx      = win->LeftEdge;
  256.     ep->config.winy      = win->TopEdge;
  257.     ep->config.winwidth  = win->Width;
  258.     ep->config.winheight = win->Height;
  259.    }
  260.  
  261.     if (fi = fopen (XDME_CONFIG, "w"))
  262.     {
  263.     fwrite (CONFIG_VERSION, sizeof(CONFIG_VERSION)-1, 1, fi);
  264.     fwrite (&ep->beginconfig, CONFIG_SIZE, 1, fi);
  265.     fclose (fi);
  266.     }
  267. } /* do_saveconfig */
  268.  
  269.  
  270. Prototype void loadconfig (ED * ep);
  271.  
  272. void loadconfig (ED * ep)
  273. {
  274.     static int showed_error = 0;
  275.     FILE * fi;
  276.  
  277.     /* Always init the fields */
  278.     movmem (&default_config, &ep->beginconfig, CONFIG_SIZE);
  279.  
  280.     if (fi = fopen (XDME_CONFIG, "r"))
  281.     {
  282.     fread (tmp_buffer, sizeof(CONFIG_VERSION)-1, 1, fi);
  283.  
  284.     if (strncmp (CONFIG_VERSION, tmp_buffer, sizeof(CONFIG_VERSION)-1) )
  285.     {
  286.         if (!showed_error)
  287.         {
  288.         error ("loadconfig:\n"
  289.             "Wrong version for\n"
  290.             "configuration file !\n"
  291.             "Using defaults");
  292.         showed_error = 1;
  293.         }
  294.     } else
  295.         fread (&ep->beginconfig, 1, CONFIG_SIZE, fi);
  296.  
  297.     fclose (fi);
  298.     }
  299. } /* loadconfig */
  300.  
  301.  
  302. /*DEFHELP #cmd prefs FGPEN pen - Set pen for text */
  303.  
  304. DEFUSERCMD("fgpen", 1, CF_VWM, void, do_fgpen, (void),)
  305. {
  306.     SetXDMEPen (TEXT_BPEN(Ep), &TEXT_FPEN(Ep));
  307. } /* do_fgpen */
  308.  
  309.  
  310. /*DEFHELP #cmd prefs TFPEN pen - set pen for title bar text */
  311.  
  312. DEFUSERCMD("tfpen", 1, CF_VWM, void, do_tfpen, (void),)
  313. {
  314.     SetXDMEPen (TITLE_BPEN(Ep), &TITLE_FPEN(Ep));
  315. } /* do_tfpen */
  316.  
  317.  
  318. /*DEFHELP #cmd prefs TBPEN pen - set pen for title bar background */
  319.  
  320. DEFUSERCMD("tbpen", 1, CF_VWM, void, do_tbpen, (void),)
  321. {
  322.     SetXDMEPen (TITLE_FPEN(Ep), &TITLE_BPEN(Ep));
  323. } /* do_tfpen */
  324.  
  325.  
  326. /*DEFHELP #cmd prefs BGPEN pen - set background pen for text */
  327.  
  328. DEFUSERCMD("bgpen", 1, CF_VWM, void, do_bgpen, (void),)
  329. {
  330.     SetXDMEPen (TEXT_FPEN(Ep), &TEXT_BPEN(Ep));
  331. } /* do_bgpen */
  332.  
  333.  
  334. /*DEFHELP #cmd prefs HGPEN pen - set highlight (block) pen */
  335.  
  336. DEFUSERCMD("hgpen", 1, CF_VWM, void, do_hgpen, (void),)
  337. {
  338.     SetXDMEPen (BLOCK_BPEN(Ep), &BLOCK_FPEN(Ep));
  339. } /* do_hgpen */
  340.  
  341.  
  342. /*DEFHELP #cmd prefs BBPEN pen - selects @{B}pen@{UB} as the block-background-pen */
  343.  
  344. DEFUSERCMD("bbpen", 1, CF_VWM, void, do_bbpen, (void),)
  345. {
  346.     SetXDMEPen (BLOCK_FPEN(Ep), &BLOCK_BPEN(Ep));
  347. } /* do_hgpen */
  348.  
  349.  
  350. /*DEFHELP #cmd prefs MODIFIED what - set modified flag manually (what={on,off,toggle}) */
  351.  
  352. DEFUSERCMD("modified", 1, CF_ICO, void, do_modified, (void),)
  353. {
  354.     SETF_MODIFIED(Ep, test_arg (av[1], GETF_MODIFIED(Ep)));
  355. } /* do_modified */
  356.  
  357.  
  358. /*DEFHELP #cmd prefs AUTOINDENT what - (De)Activate autoindent with RETURN */
  359.  
  360. DEFUSERCMD("autoindent", 1, CF_VWM|CF_ICO, void, do_autoindent, (void),)
  361. {
  362.     SETF_AUTOINDENT(Ep, test_arg ((char *)av[1], GETF_AUTOINDENT(Ep)));
  363. } /* do_autoindent */
  364.  
  365.  
  366. /*DEFHELP #cmd prefs,win SIZEWINDOW geo - change size and position of the current window to @{B}geo@{UB} */
  367.  
  368. DEFUSERCMD("sizewindow", 1, CF_VWM|CF_COK, void, do_sizewindow, (void),)
  369. {
  370.     WIN * win = Ep->win;
  371.     struct NewWindow nw;
  372.     int mdx, mdy;
  373.  
  374.     GeometryToNW (av[1], &nw);
  375.  
  376.     if (nw.LeftEdge + nw.Width <= win->WScreen->Width &&
  377.         nw.TopEdge + nw.Height <= win->WScreen->Height &&
  378.         nw.Width >= win->MinWidth &&
  379.         nw.Height >= win->MinHeight)
  380.     {
  381.     mdx = nw.LeftEdge - win->LeftEdge;
  382.     mdy = nw.TopEdge - win->TopEdge;
  383.  
  384.     if (mdx > 0)
  385.         mdx = 0;
  386.  
  387.     if (mdy > 0)
  388.         mdy = 0;
  389.  
  390.     MoveWindow (win, mdx, mdy);
  391.     SizeWindow (win, nw.Width - win->Width, nw.Height - win->Height);
  392.     MoveWindow (win, nw.LeftEdge - win->LeftEdge, nw.TopEdge - win->TopEdge);
  393.     }
  394. } /* do_sizewindow */
  395.  
  396.  
  397. /*DEFHELP #cmd prefs AUTOSPLIT what - (De)Activate autosplit. This is an alternative to WORDWRAP. AUTOSPLIT only breaks the line if it gets too long and doesn't touch the rest of the text. */
  398.  
  399. DEFUSERCMD("autosplit", 1, CF_VWM|CF_ICO, void, do_autosplit, (void),)
  400. {
  401.     SETF_AUTOSPLIT(Ep, test_arg (av[1], GETF_AUTOSPLIT(Ep)));
  402. } /* do_autosplit */
  403.  
  404.  
  405. /*DEFHELP #cmd prefs TASKPRI n - Set the priority of XDME to @{B}n@{UB} (-5..5) */
  406.  
  407. DEFUSERCMD("taskpri", 1, CF_VWM|CF_COK|CF_ICO, void, do_taskpri, (void),)
  408. {
  409.     LONG pri;
  410.  
  411.     pri = atoi (av[1]);
  412.  
  413.     if (pri > 5 || pri < -5)
  414.     error ("%s:\n"
  415.         "Wrong TaskPri %ld. Taskpri must\n"
  416.         "be between -5 and 5 !", av[0], pri);
  417.     else
  418.     SetTaskPri (FindTask (NULL), pri);
  419.  
  420. } /* do_taskpri */
  421.  
  422.  
  423. /*DEFHELP #cmd prefs DEBUG what - @{U}For programmers only@{UB} Allows to set a flag for testing code */
  424.  
  425. DEFUSERCMD("debug", 1, CF_VWM|CF_ICO, void, do_debug, (void),)
  426. {
  427.     SETF_DEBUG(Ep, tas_flag (av[1], GETF_DEBUG(Ep), "DEBUG"));
  428. } /* do_debug */
  429.  
  430.  
  431. /*DEFHELP #cmd prefs DOBACKUP what - specifies if XDME creates a .bak file before actually saving the text */
  432.  
  433. DEFUSERCMD("dobackup", 1, CF_VWM|CF_ICO, void, do_dobackup, (void),)
  434. {
  435.     SETF_DOBACK(Ep, tas_flag (av[1], GETF_DOBACK(Ep), "DoBackup"));
  436. } /* do_debug */
  437.  
  438.  
  439. /*DEFHELP #cmd prefs,block AUTOUNBLOCK what - clear old selection when a new block is defined (on) or give an error */
  440.  
  441. DEFUSERCMD("autounblock", 1, CF_VWM|CF_ICO, void, do_autounblock, (void),)
  442. {
  443.     SETF_AUTOUNBLOCK(Ep, test_arg (av[1], GETF_AUTOUNBLOCK(Ep)));
  444. } /* do_autounblock */
  445.  
  446.  
  447. /*DEFHELP #cmd prefs FOLLOWCURSOR what - XDME will make sure the cursor is visible if you switch it on with this command. Usefull on screens that extend over the visual area. */
  448.  
  449. DEFUSERCMD("followcursor", 1, CF_VWM|CF_COK|CF_ICO, void, do_followcursor, (void),)
  450. {
  451.     SETF_FOLLOWCURSOR(Ep,tas_flag (av[1], GETF_FOLLOWCURSOR(Ep), "Follow cursor"));
  452. } /* do_followcursor */
  453.  
  454.  
  455. /*DEFHELP #cmd prefs NICEPAGING what - Should @{B}PAGEUP@{UB} and @{B}PAGEDOWN@{UB} scroll the page immediately (@{B}on@{UB}) or jump to the border first */
  456.  
  457. DEFUSERCMD("nicepaging", 1, CF_VWM|CF_COK|CF_ICO, void, do_nicepaging, (void),)
  458. {
  459.     SETF_NICEPAGING(Ep, tas_flag (av[1], GETF_NICEPAGING(Ep), "DME-like paging"));
  460. } /* do_nicepaging */
  461.  
  462.  
  463. /*DEFHELP #cmd prefs ICONACTIVE what - Should XDME activate the iconified window */
  464.  
  465. DEFUSERCMD("iconactive", 1, CF_VWM|CF_COK|CF_ICO, void, do_iconactive, (void),)
  466. {
  467.     SETF_ICONACTIVE(Ep, tas_flag (av[1], GETF_ICONACTIVE(Ep), "Activate icon"));
  468. } /* do_iconactive */
  469.  
  470.  
  471. // /*D.E.F.H.E.L.P #cmd prefs BLOCKENDSFLOAT what - Should @{B}BSTART@{UB} always appear above @{B}BEND@{UB} (@{B}on@{UB}) or remain static */
  472. //
  473. // DEFUSERCMD("blockendsfloat", 1, CF_VWM|CF_COK|CF_ICO, void, do_blockendsfloat, (void),)
  474. // {
  475. //     SETF_BLOCKENDSFLOAT(Ep, tas_flag (av[1], GETF_BLOCKENDSFLOAT(Ep), "Block ends float"));
  476. //     set_block_start (-2,-2);
  477. // } /* do_blockendsfloat */
  478. //
  479.  
  480. /*DEFHELP #cmd prefs SLINE what - Should XDME not allow to go beyond the end of line and preserve the length of lines (default: no) */
  481.  
  482. DEFUSERCMD("sline", 1, CF_VWM|CF_COK|CF_ICO, void, do_sline, (void),)
  483. {
  484.     SETF_SLINE(Ep, tas_flag (av[1], GETF_SLINE(Ep), "Preserve linelength"));
  485. } /* do_blockendsfloat */
  486.  
  487.  
  488. /*****************************************************************************
  489.  
  490.     NAME
  491.     do_setlinedistance
  492.  
  493.     PARAMETER
  494.     av[1] : integer offset (>= 0)
  495.  
  496.     DESCRIPTION
  497.     Sets the LineDistance. The offset must be positive.
  498.  
  499. ******************************************************************************/
  500.  
  501. /*DEFHELP #cmd prefs SPACING n - Insert a gap of @{B}n@{UB} pixels between lines */
  502.  
  503. DEFUSERCMD("spacing", 1, CF_VWM, void, do_setlinedistance, (void),)
  504. {
  505.     int offset = strtol (av[1], NULL, 0);
  506.  
  507.     if (offset < 0)
  508.     error ("%s:\nYou cannot set a negative\n"
  509.         "space between the lines", av[0]);
  510.     else if (offset > Xsize)
  511.     error ("%s:\n"
  512.         "What you want to do ? Add space\n"
  513.         "for handwritten comments ?", av[0]);
  514.     else
  515.     {
  516.     LineDistance = offset;
  517.  
  518.     SetAPen (Ep->win->RPort, TEXT_BPEN(Ep));
  519.     SetWrMsk (Ep->win->RPort, BLOCK_MASK(Ep));
  520.  
  521.     /* Clear window */
  522.     RectFill (Ep->win->RPort, Xbase, Ybase, Xpixs, Ypixs);
  523.  
  524.     set_window_params ();       /* recalc new offsets */
  525.     text_adjust (TRUE);         /* redraw text */
  526.     }
  527. } /* do_setlinedistance */
  528.  
  529.  
  530. /******************************************************************************
  531. *****  ENDE prefs.c
  532. ******************************************************************************/
  533.