home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume17 / calentool / part13 / wpaint.c < prev   
C/C++ Source or Header  |  1991-04-06  |  11KB  |  381 lines

  1. /*
  2.  * $Header: wpaint.c,v 2.5 91/03/27 16:46:49 billr Exp $
  3.  */
  4. /*
  5.  * wpaint.c
  6.  *
  7.  * Author: Philip Heller, Sun Microsystems. Inc. <terrapin!heller@sun.com>
  8.  *
  9.  * Original source Copyright (C) 1987, Sun Microsystems, Inc.
  10.  *    All Rights Reserved
  11.  * Permission is hereby granted to use and modify this program in source
  12.  * or binary form as long as it is not sold for profit and this copyright
  13.  * notice remains intact.
  14.  *
  15.  *
  16.  * Changes/additions by: Bill Randle, Tektronix, Inc. <billr@saab.CNA.TEK.COM>
  17.  *
  18.  * Changes and additions Copyright (C) 1988, 1989, 1991 Tektronix, Inc.
  19.  *    All Rights Reserved
  20.  * Permission is hereby granted to use and modify the modifications in source
  21.  * or binary form as long as they are not sold for profit and this copyright
  22.  * notice remains intact.
  23.  */
  24. /***************************************************
  25.  *                           *
  26.  *    Artistic routines that draw in the main    *
  27.  * subwindow for the week display.           *
  28.  *                           *
  29.  ***************************************************/
  30.  
  31. #include <suntool/sunview.h>
  32. #include <suntool/canvas.h>
  33. #include <ctype.h>
  34. #include <stdio.h>
  35. #include "ct.h"
  36. #include "paint.h"
  37.  
  38. extern int week_message_size;
  39.  
  40. /*
  41.  * Routine to draw "Week-at-a-Glance".
  42.  */
  43.  
  44. draw_week()
  45. {
  46.     struct tm Save;
  47.     extern void fix_current_day();
  48.  
  49.     lock_cursors();
  50.     /* destory future appts popup, if it exists */
  51.     if (fframe) {
  52.         window_destroy(fframe);
  53.         fframe = 0;
  54.     }
  55.     fix_current_day();
  56.     Save = current;
  57.     current.tm_mday -= current.tm_wday; /* Sunday of this week */
  58.     if (monday_first)  {
  59.         if (current.tm_wday == SUN)
  60.             current.tm_mday -= 7;
  61.         if (nr_weekdays == 7)
  62.             current.tm_mday++; /* start on Monday */
  63.     }
  64.     fix_current_day();
  65.     if (nr_weekdays < 7) {
  66.         current.tm_mday++;
  67.         fix_current_day();
  68.     }
  69.     working(TRUE);
  70.     get_week_appts();
  71.     working(FALSE);
  72.     pw_batch_on(main_pixwin);
  73.     paint_week_outline();
  74.     paint_week_trim();
  75.     working(TRUE);
  76.     draw_week_appts();
  77.     pw_batch_off(main_pixwin);
  78.     /*
  79.     (void)win_post_id(canvas, WIN_REPAINT, NOTIFY_SAFE);
  80.     */
  81.     free_week_appts();
  82.     current = Save;
  83.     (void)get_day_appts();
  84.     working(FALSE);
  85.     unlock_cursors();
  86. }
  87.  
  88.  
  89. /* Paint the outline for "Week-at-a-Glance". */
  90. paint_week_outline()
  91. {
  92.     Rect *rect;
  93.         int x, y, i, j, colx;
  94.  
  95.         rect = (Rect *) window_get(canvas, WIN_RECT);
  96.         pw_writebackground(main_pixwin,0,0,rect->r_width,rect->r_height,PIX_CLR);
  97.         startx = (rect->r_width - nr_weekdays*weekslot_width) / 2;
  98.     starty = 10 + (rect->r_height - (n_slots*(weekslot_height+1))) / 2;
  99.  
  100.     First = current;
  101.         for (i=0; i<nr_weekdays; i++) {
  102.                 x = startx + i*weekslot_width;
  103.         y = starty;
  104.                 week_boxes[i].wday_pos.left = x;
  105.                 week_boxes[i].wday_pos.top = y;
  106.                 week_boxes[i].wday_pos.right = x + weekslot_width;
  107.                 week_boxes[i].wday_pos.bottom = starty + n_slots*weekslot_height;
  108.         week_boxes[i].moreb_pos.left = x + (weekslot_width - morebutton->pr_size.x) / 2;
  109.         week_boxes[i].moreb_pos.top = week_boxes[i].wday_pos.bottom + font->pf_defaultsize.y + font->pf_defaultsize.y/2;
  110.         week_boxes[i].moreb_pos.right = week_boxes[i].moreb_pos.left + morebutton->pr_size.x;
  111.         week_boxes[i].moreb_pos.bottom = week_boxes[i].moreb_pos.top + morebutton->pr_size.y;
  112.                 for (j=0; j<n_slots; j++) {
  113.             if (ymd_compare(today, current) == 0)
  114.                 pw_write(main_pixwin,x,y,weekslot_width,
  115.                   weekslot_height,PIX_SRC,weekslot_td_pr,0,0);
  116.             else
  117.                 pw_write(main_pixwin,x,y,weekslot_width,
  118.                   weekslot_height,PIX_SRC,weekslot_pr,0,0);
  119.                         y += weekslot_height;
  120.         }
  121.         current.tm_mday++;
  122.         fix_current_day();
  123.         }
  124.     pw_vector(main_pixwin,startx,starty,startx+nr_weekdays*weekslot_width,starty,PIX_SET,1);
  125.         pw_vector(main_pixwin,startx,y-1,startx+nr_weekdays*weekslot_width,y-1,PIX_SET,1);
  126.     current = First;
  127.     sun_moon_buttons(FALSE);
  128.     print_button(TRUE);
  129. }
  130.  
  131.  
  132. paint_week_trim()
  133. {
  134.     int i, j, x, y, month, day, rightx;
  135.     char c[8];
  136.         
  137.     First = current;
  138.         for (i=0; i<nr_weekdays; i++) {
  139.                 x = startx + i*weekslot_width + (weekslot_width - 2*(font->pf_defaultsize.x+2))/2;
  140.         if (monday_first && i == 6)
  141.             sprintf(c, "%3.3s", daynames[SUN]);
  142.         else
  143.             sprintf(c, "%3.3s", daynames[First.tm_wday + i]);
  144.                 pw_text(main_pixwin, x, starty-5, PIX_SRC, font, c);
  145.         }
  146.         
  147.         y = starty + weekslot_height - 4;
  148.         rightx = startx + nr_weekdays*weekslot_width + 10;
  149.     for (i=0; i<n_slots; i++) {
  150.         if (i < n_tslots) {
  151.             if (hour24)
  152.                 sprintf(c, "%2d:%s",
  153.                     start_hour+(i/2),
  154.                     i%2 == 0 ? "00" : "30");
  155.             else
  156.                 sprintf(c, "%2d:%s%s",
  157.                     (start_hour+(i/2))%12 == 0 ? 12 : (start_hour+(i/2))%12,
  158.                     i%2 == 0 ? "00" : "30", (start_hour+(i/2) < 12 ? "am" : "pm"));
  159.         } else if (i == n_tslots) {
  160.             sprintf(c, (hour24 ? "Notes" : " Notes"));
  161.         } else {
  162.             sprintf(c, "     ");
  163.         }
  164.         if (hour24) {
  165.             pw_text(main_pixwin, startx-7*font->pf_defaultsize.x, y, PIX_SRC, font, c);
  166.             pw_text(main_pixwin, rightx, y, PIX_SRC, font, c);
  167.         } else {
  168.             pw_text(main_pixwin, startx-8*font->pf_defaultsize.x, y, PIX_SRC, font, c);
  169.             pw_text(main_pixwin, rightx-font->pf_defaultsize.x, y, PIX_SRC, font, c);
  170.         }
  171.                 y += weekslot_height;
  172.     }
  173.  
  174.         x = startx + (weekslot_width - 7*(font->pf_defaultsize.x+2))/2 + font->pf_defaultsize.x+7;
  175.  
  176.     sprintf(c, "%d", 1900 + current.tm_year);
  177.     pw_text(main_pixwin, startx-3*font->pf_defaultsize.x,
  178.       y+weekslot_height, PIX_SRC, font, c);
  179.  
  180.     sprintf(c, "Week: %d", week_number());
  181.     pw_text(main_pixwin, startx+nr_weekdays*weekslot_width-2*font->pf_defaultsize.x,
  182.       y+weekslot_height, PIX_SRC, font, c);
  183.  
  184.     /* display week dates (month, day) */
  185.         for (i=0; i<nr_weekdays; i++) {
  186.         if (day_first)
  187.             sprintf(c, "%2d %3.3s",
  188.                 current.tm_mday, monthnames[current.tm_mon]);
  189.         else
  190.             sprintf(c, "%3.3s %2d",
  191.                 monthnames[current.tm_mon], current.tm_mday);
  192.         pw_text(main_pixwin, x, y, PIX_SRC, font, c);
  193.                 x += weekslot_width;
  194.         current.tm_mday++;
  195.         fix_current_day();
  196.         }
  197.     current = First;
  198.     fix_current_day();
  199. }       
  200.  
  201.  
  202. get_week_appts()
  203. {
  204.     int i, j, save_read;
  205.     struct tm Current;
  206.  
  207.     save_read = read_only;
  208.     read_only = 1;
  209.     Current = current;
  210.     for (i=0; i<nr_weekdays; i++) {
  211.         get_day_appts();    /* fills in slots[] array */
  212.         for (j=0; j<n_slots; j++)
  213.             week_boxes[i].weekslots[j] = slots[j];
  214.         current.tm_mday++;
  215.         fix_current_day();
  216.     }
  217.     read_only = save_read;
  218.     current = Current;
  219.     fix_current_day();
  220. }                       
  221.  
  222. /* draw in week appointments */
  223. draw_week_appts()
  224. {
  225.     int index, slotno, offset, i;
  226.     int narrows, pixoffset;
  227.     struct dayslot *slptr;
  228.  
  229.     for (index=0; index<nr_weekdays; index++) {
  230.         /* clear all arrow position information */
  231.         for (slotno=0; slotno<n_slots; slotno++)
  232.             week_boxes[index].weekslots[slotno].arrow_pos = 0;
  233.         week_boxes[index].more = 0;
  234.         for (slotno=0; slotno<n_slots; slotno++) {
  235.             slptr = &week_boxes[index].weekslots[slotno];
  236.             if (slptr->active) {
  237.                 x_coord = week_boxes[index].wday_pos.left;
  238.                 y_coord = week_boxes[index].wday_pos.top +
  239.                   slotno*weekslot_height;
  240.                 write_week_str(index, slotno);
  241.                 if ((narrows = slptr->cur_appt->arrows) > 0) {
  242.                     /* find first free position for arrow */
  243.                     offset = 0;
  244.                     while (slptr->arrow_pos & 1<<offset)
  245.                         offset++;
  246.                     slptr->arrow_pos |= 1<<offset;
  247.                     i = slotno + narrows;
  248.                     week_boxes[index].weekslots[i].arrow_pos |= 1<<offset;
  249.                     draw_weekarrowhead(index, i, offset, FALSE);
  250.                     while (--narrows > 0) {
  251.                         week_boxes[index].weekslots[--i].arrow_pos
  252.                           |= 1<<offset;
  253.                         draw_weekarrowshaft(index, i, offset, FALSE);
  254.                     }
  255.                 }
  256.                 wmore_check(index, slotno);
  257.             }
  258.         }
  259.     }
  260. }
  261.  
  262. draw_weekarrowshaft(day, bi, offset, gray)
  263. int day, bi;
  264. int offset, gray;
  265. {
  266.     int x, y;
  267.     int pixoffset;
  268.  
  269.     /* mark this position as used */
  270.     week_boxes[day].weekslots[bi].arrow_pos |= 1<<offset;
  271.     pixoffset = (offset + 1) * 16;
  272.     if (pixoffset > weekslot_width - 16)
  273.         pixoffset = weekslot_width - 16;
  274.     y = week_boxes[day].wday_pos.top + bi*weekslot_height;
  275.     x = week_boxes[day].wday_pos.left;
  276.     pw_write(main_pixwin, x+1+pixoffset, y, 14, weekslot_height,
  277.         PIX_SRC|PIX_DST, (gray ? gr_weekarrowshaft_pr : weekarrowshaft_pr), 0, 0);
  278. }
  279.  
  280. draw_weekarrowhead(day, bi, offset, gray)
  281. int day, bi;
  282. int offset, gray;
  283. {
  284.     int x, y;
  285.     int pixoffset;
  286.  
  287.     /* mark this position as used */
  288.     week_boxes[day].weekslots[bi].arrow_pos |= 1<<offset;
  289.     pixoffset = (offset + 1) * 16;
  290.     if (pixoffset > weekslot_width - 16)
  291.         pixoffset = weekslot_width - 16;
  292.     y = week_boxes[day].wday_pos.top + bi*weekslot_height;
  293.     x = week_boxes[day].wday_pos.left;
  294.     pw_write(main_pixwin, x+1+pixoffset, y, 14, weekslot_height,
  295.         PIX_SRC|PIX_DST, (gray ? gr_weekarrowhead_pr : weekarrowhead_pr), 0, 0);
  296. }
  297.  
  298. write_week_str(day, bi)
  299. int day;
  300. int bi;
  301. {
  302.     char slot_str[MAX_STRLEN];
  303.     char *ptr;
  304.     int strl;
  305.  
  306.     strl = strlen(week_boxes[day].weekslots[bi].cur_appt->str);
  307.     if (strl <= week_message_size)
  308.         strcpy(slot_str, week_boxes[day].weekslots[bi].cur_appt->str);
  309.     else {
  310.         /* show leading part */
  311.         
  312.         strncpy(slot_str, week_boxes[day].weekslots[bi].cur_appt->str, week_message_size);
  313.         slot_str[week_message_size+1] = '\0';
  314.     }
  315.     pw_write(main_pixwin, x_coord+1, y_coord+1, weekslot_width-2,
  316.         weekslot_height-2, PIX_SET, NULL, 0, 0);
  317.     pw_text(main_pixwin, x_coord+4, y_coord+font->pf_defaultsize.y, PIX_NOT(PIX_SRC),
  318.         font, slot_str);
  319. }
  320.  
  321. /* free memory alloc'd for appts */
  322. free_week_appts()
  323. {
  324.     int index, slotno;
  325.     struct appt_entry *aptr, *optr;
  326.  
  327.     for (index=0; index<nr_weekdays; index++) {
  328.         for (slotno=0; slotno<n_slots; slotno++) {
  329.             if (week_boxes[index].weekslots[slotno].first)
  330.                 for (aptr=week_boxes[index].weekslots[slotno].first; aptr; ) {
  331.                     optr = aptr;
  332.                     aptr = aptr->next;
  333.                     free(optr);
  334.                 }
  335.         }
  336.     }
  337. }
  338.  
  339. /* display "more" button if necessary */
  340. wmore_check(day, bi)
  341. int day, bi;
  342. {
  343.     int i, narrows, offset;
  344.     int x, y;
  345.     struct appt_entry *aptr;
  346.     struct dayslot *slptr;
  347.  
  348.     slptr = &week_boxes[day].weekslots[bi];
  349.     if (slptr->active > 1) {
  350.         for (aptr=slptr->first; aptr; aptr=aptr->next) {
  351.             if (aptr == slptr->cur_appt)
  352.                 continue;  /* already did this one */
  353.             if (chk_deleted(slptr, aptr))
  354.                 continue;
  355.             if ((narrows = aptr->arrows) > 0) {
  356.                 /* find first free position for arrow */
  357.                 offset = 0;
  358.                 while (slptr->arrow_pos & 1<<offset)
  359.                     offset++;
  360.                 slptr->arrow_pos |= 1<<offset;
  361.                 i = bi + narrows;
  362.                 week_boxes[day].weekslots[i].arrow_pos |= 1<<offset;
  363.                 draw_weekarrowhead(day, i, offset, TRUE);
  364.                 while (--narrows > 0) {
  365.                     week_boxes[day].weekslots[--i].arrow_pos
  366.                       |= 1<<offset;
  367.                     draw_weekarrowshaft(day, i, offset, TRUE);
  368.                 }
  369.             }
  370.         }
  371.         x = morebutton->pr_size.x;
  372.         y = morebutton->pr_size.y;
  373.         week_boxes[day].more = 1;
  374.         /* display more button at bottom of slot */
  375.         pw_write(main_pixwin, week_boxes[day].moreb_pos.left,
  376.             week_boxes[day].moreb_pos.top,
  377.             x, y, PIX_SRC, morebutton, 0, 0);
  378.     }
  379. }
  380.  
  381.