home *** CD-ROM | disk | FTP | other *** search
/ Bila Vrana / BILA_VRANA.iso / 028A / MEDIT151.ZIP / MGUI / MEDIT / OBJATTR.C < prev    next >
C/C++ Source or Header  |  1996-08-20  |  10KB  |  348 lines

  1. /*
  2.  * This file is part of the M-Edit program (Copyright 1996 by Vincenzo Morello)
  3.  * Permission to use is hereby granted for any purpose.
  4.  *
  5.  * Contains Object attribute settings utility functions.
  6.  */
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <errno.h>
  11.  
  12. #include "mgui.h"
  13.  
  14. #define N_FONTS    8
  15.  
  16. struct {
  17.     char    *name;
  18.     MTFont    font;
  19. } oa_fonts[N_FONTS] = {
  20.     {"SMALL_FONT", SMALL_FONT},
  21.     {"MEDIUM_FONT", MEDIUM_FONT},
  22.     {"DEFAULT_FONT", DEFAULT_FONT},
  23.     {"LARGE_FONT", LARGE_FONT},
  24.     {"TIMES_N_FONT", TIMES_N_FONT},
  25.     {"TIMES_L_FONT", TIMES_L_FONT},
  26.     {"HELV_N_FONT", HELV_N_FONT},
  27.     {"HELV_L_FONT", HELV_L_FONT}
  28. };
  29.  
  30. void RefreshColPickCB(MOBJECT p, void *s, void *v);
  31. void ChangeColorCellCB(MOBJECT o, MVALUE s, void *v);
  32. void AssignForegroundCB(MOBJECT o, void *s, void *v);
  33. void AssignBackgroundCB(MOBJECT o, void *s, void *v);
  34. void CellExposeCB(MOBJECT o, MEvent *pe, void *a_data);
  35. void CellResizeCB(MOBJECT o, DRAWAREA_PREF *pref, void *a_data);
  36. void ColorMapExposeCB(MOBJECT o, MEvent *pexp, void *a_data);
  37. void ColorMapInputCB(MOBJECT o, MEvent *pe, void *a_data);
  38. void ColorMapResizeCB(MOBJECT o, DRAWAREA_PREF *pref, void *a_data);
  39.  
  40. static MOBJECT r_sbar, g_sbar, b_sbar, sample;
  41. static MOBJECT r_label, g_label, b_label, drawa, cell_drawa;
  42. static MTColor cell_color;
  43. static int sel_cell, sel_x, sel_y, r_c, g_c, b_c;
  44.  
  45. static MTColor drawarea_bgc;
  46. static long NColors;
  47.  
  48. static void CloseCB(MOBJECT obj, void *s, void *v)
  49. {
  50.     MFreeColor(drawarea_bgc);
  51.     MFreeCell(cell_color);
  52.  
  53.     MShellDestroy(obj);
  54. }
  55.  
  56. static void ApplyCB(MOBJECT obj, void *s, void *adata)
  57. {
  58.     MTColor bgc, fgc;
  59.  
  60.     bgc = MObjectBackgroundColor(sample);
  61.     fgc = MObjectForegroundColor(sample);
  62.     MObjectSetColor((MOBJECT)adata, bgc, fgc);
  63.     MObjectSetFont((MOBJECT)adata, MObjectGetFont(sample), False);
  64.     MFreeColor(drawarea_bgc);
  65.     MFreeCell(cell_color);
  66.  
  67.     MShellDestroy(obj);
  68. }
  69.  
  70. static char *FontIdToName(MTFont fid)
  71. {
  72.     int ii;
  73.  
  74.     for (ii=0; ii < N_FONTS; ii++)
  75.         if (fid == oa_fonts[ii].font)
  76.             return oa_fonts[ii].name;
  77.     return "DEFAULT_FONT";
  78. }
  79.  
  80. MTFont FontNameToId(char *name)
  81. {
  82.     int ii;
  83.  
  84.     for (ii=0; ii < N_FONTS; ii++)
  85.         if (!strcmp(oa_fonts[ii].name, name))
  86.             return oa_fonts[ii].font;
  87.     return DEFAULT_FONT;
  88. }
  89.  
  90. static void NewFontCB(MOBJECT obj, char *newtext, void *ad)
  91. {
  92.     MTFont font;
  93.  
  94.     font = FontNameToId(newtext);
  95.     MObjectSetFont(sample, font, False);
  96. }
  97.  
  98. void ObjAttrPick(MOBJECT obj)
  99. {
  100.     MOBJECT    shell, form, pb, form2, label, list, opt_font;
  101.     int        r, g, b, ii;
  102.     MTColor    bgc, fgc;
  103.     char    *font_name;
  104.  
  105.     bgc = MObjectBackgroundColor(obj);
  106.     fgc = MObjectForegroundColor(obj);
  107.  
  108.     MGetDefaultBackgroundRGB(&r, &g, &b);
  109.     drawarea_bgc = MAllocColor(r, g, b);
  110.     NColors = MGetNColors();
  111.  
  112.     shell = MCreateShell("Object Attributes", SF_MODAL);
  113.     MShellSetWMCloseCallback(shell, CloseCB, NULL);
  114.  
  115.     form2 = MCreateColForm(shell);
  116.  
  117.     MFormSetSpacing(form2, 0);
  118.  
  119.     form = MCreateRowForm(form2);
  120.  
  121.     sample = MCreateLabel(form, "Sample", MObjectGetFont(obj));
  122.     MObjectSetShadow(sample, WS_ETCHED_IN, 1, 1);
  123.     MObjectSetColor(sample, bgc, fgc);
  124.  
  125.     pb = MCreatePButton(form, "Assign Foreground", TIMES_L_FONT);
  126.     MPButtonSetCallback(pb, AssignForegroundCB, sample);
  127.     pb = MCreatePButton(form, "Assign Background", TIMES_L_FONT);
  128.     MPButtonSetCallback(pb, AssignBackgroundCB, sample);
  129.  
  130.     font_name = FontIdToName(MObjectGetFont(obj));
  131.     opt_font = MCreateOptionEdit(form, font_name, 12, 12, 7, DEFAULT_FONT);
  132.     MEditSetNewValueCallback(opt_font, NewFontCB, NULL);
  133.     MObjectSetUnsensitive(opt_font);
  134.     list = MOptionEditGetList(opt_font);
  135.     for (ii=0; ii < N_FONTS; ii++)
  136.         MSListAddItem(list, oa_fonts[ii].name, (void *)oa_fonts[ii].font);
  137.  
  138.     if (MPaletteMode()) {
  139.         form = MCreateRowForm(form2);
  140.         MFormSetFocusHighlight(form, True);
  141.         drawa = MCreateDrawArea(form, 208, 208);
  142.         MObjectSetResize(drawa, True, True);
  143.         MDrawAreaSetExposeCallback(drawa, ColorMapExposeCB, 0L);
  144.         MDrawAreaSetInputCallback(drawa, ColorMapInputCB, 0L);
  145.         MDrawAreaSetResizeCallback(drawa, ColorMapResizeCB, 0L);
  146.     }
  147.  
  148.     form = MCreateRowForm(shell);
  149.     cell_drawa = MCreateDrawArea(form, 256, 30);
  150.     MDrawAreaSetExposeCallback(cell_drawa, CellExposeCB, 0L);
  151.     MObjectSetResize(cell_drawa, True, False);
  152.     r_c = g_c = b_c = 0;
  153.     cell_color = MAllocCell(0, 0, 0);
  154.  
  155.     form2 = MCreateRowForm(form);
  156.     MFormSetPrefAtt(form2, F_PREF_ATT_COL);
  157.     label = MCreateLabel(form2, "Red:   ", DEFAULT_FONT);
  158.     r_label = MCreateLabel(form2, "00", DEFAULT_FONT);
  159.     MObjectSetResize(label, False, False);
  160.     MObjectSetResize(r_label, False, False);
  161.     r_sbar = MCreateScrollBar(form2, SBT_HOR, (long)32, (long)255+32);
  162.     MScrollBarSetPosCallback(r_sbar, ChangeColorCellCB, 0L);
  163.  
  164.     form2 = MCreateRowForm(form);
  165.     MFormSetPrefAtt(form2, F_PREF_ATT_COL);
  166.     label = MCreateLabel(form2, "Green: ", DEFAULT_FONT);
  167.     g_label = MCreateLabel(form2, "00", DEFAULT_FONT);
  168.     MObjectSetResize(label, False, False);
  169.     MObjectSetResize(g_label, False, False);
  170.     g_sbar = MCreateScrollBar(form2, SBT_HOR, (long)32, (long)255+32);
  171.     MScrollBarSetPosCallback(g_sbar, ChangeColorCellCB, (void *)1);
  172.  
  173.     form2 = MCreateRowForm(form);
  174.     MFormSetPrefAtt(form2, F_PREF_ATT_COL);
  175.     label = MCreateLabel(form2, "Blue:  ", DEFAULT_FONT);
  176.     b_label = MCreateLabel(form2, "00", DEFAULT_FONT);
  177.     MObjectSetResize(label, False, False);
  178.     MObjectSetResize(b_label, False, False);
  179.     b_sbar = MCreateScrollBar(form2, SBT_HOR, (long)32, (long)255+32);
  180.     MScrollBarSetPosCallback(b_sbar, ChangeColorCellCB, (void *)2);
  181.  
  182.     form = MCreateColForm(shell);
  183.  
  184.     pb = MCreatePButton(form, "Apply", TIMES_L_FONT);
  185.     MPButtonSetCallback(pb, ApplyCB, obj);
  186.  
  187.     pb = MCreatePButton(form, "Cancel", TIMES_L_FONT);
  188.     MPButtonSetCallback(pb, CloseCB, NULL);
  189.  
  190.     sel_cell = sel_x = sel_y = 0;
  191.     MShellRealize(shell);
  192. }
  193.  
  194. void ChangeColorCellCB(MOBJECT o, MVALUE o_data, void *a_data)
  195. {
  196.     char str[16];
  197.  
  198.     switch ((int)a_data) {
  199.         case 0:
  200.             r_c = (int)o_data;
  201.             sprintf(str, "%02x", r_c);
  202.             MObjectSetText(r_label, str);
  203.             break;
  204.         case 1:
  205.             g_c = (int)o_data;
  206.             sprintf(str, "%02x", g_c);
  207.             MObjectSetText(g_label, str);
  208.             break;
  209.         case 2:
  210.             b_c = (int)o_data;
  211.             sprintf(str, "%02x", b_c);
  212.             MObjectSetText(b_label, str);
  213.             break;
  214.     }
  215.     if (MPaletteMode())
  216.         MSetCellColor(cell_color, r_c, g_c, b_c);
  217.     else
  218.         MObjectSetBackgroundRGB(cell_drawa, r_c, g_c, b_c);
  219. }
  220.  
  221. void AssignBackgroundCB(MOBJECT o, void *o_data, void *a_data)
  222. {
  223.     MObjectSetBackgroundRGB((MOBJECT )a_data, r_c, g_c, b_c);
  224.  
  225. #ifdef WINDOWS
  226. /*
  227.  *   Windows palette is indirect, so it is
  228.  *   necessary to redraw rectangles with a new color
  229.  */
  230.     if (MPaletteMode())
  231.         ColorMapExposeCB(drawa, NULL, 0L);
  232. #endif
  233. }
  234.  
  235. void AssignForegroundCB(MOBJECT o, void *o_data, void *a_data)
  236. {
  237.     MObjectSetForegroundRGB((MOBJECT )a_data, r_c, g_c, b_c);
  238.  
  239. #ifdef WINDOWS
  240. /*
  241.  *   Windows palette is indirect, so it is
  242.  *   necessary to redraw rectangles with a new color
  243.  */
  244.     if (MPaletteMode())
  245.         ColorMapExposeCB(drawa, NULL, 0L);
  246. #endif
  247. }
  248.  
  249. void ColorPickCB(MOBJECT o, void *o_data, void *a_data)
  250. {
  251.     MOBJECT p = (MOBJECT )a_data;
  252.     int r, g, b;
  253.  
  254.     MQueryColor(MObjectBackgroundColor(p), &r, &g, &b);
  255.     MScrollBarSetPos(r_sbar, (long)r);
  256.     MScrollBarSetPos(g_sbar, (long)g);
  257.     MScrollBarSetPos(b_sbar, (long)b);
  258. }
  259.  
  260. void CellExposeCB(MOBJECT obj, MEvent *pexp, void *a_data)
  261. {
  262.     int hsize, wsize;
  263.  
  264.     wsize = MObjectWidth(obj);
  265.     hsize = MObjectHeight(obj);
  266.     if (MPaletteMode())
  267.         MDrawFilledBox(obj, 0, 0, wsize, hsize, cell_color);
  268. }
  269.  
  270. void ColorMapExposeCB(MOBJECT obj, MEvent *pexp, void *a_data)
  271. {
  272.     int n, hsize, wsize, i, j;
  273.  
  274.     n = (NColors == 16 ? 4 : 16);
  275.     wsize = MObjectWidth(obj)/n;
  276.     hsize = MObjectHeight(obj)/n;
  277.     for (i=0; i<n; i++)
  278.         for (j=0; j<n; j++)
  279.             MDrawFilledBox(obj, wsize*j+1, hsize*i+1, wsize-2, hsize-2, i*n+j);
  280.     MDrawBox(obj, sel_x, sel_y, wsize, hsize, MWhiteColor());
  281. }
  282.  
  283. void ColorMapResizeCB(MOBJECT obj, DRAWAREA_PREF *pref, void *a_data)
  284. {
  285.     int n, new_hsize, new_wsize, old_hsize, old_wsize;
  286.  
  287.     n = (NColors == 16 ? 4 : 16);
  288.     old_wsize = pref->old_w/n;
  289.     old_hsize = pref->old_h/n;
  290.     new_wsize = pref->new_w