754 lines
20 KiB
C
754 lines
20 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/*******************************************************************************
|
|
**
|
|
** select.c
|
|
**
|
|
** $TOG: select.c /main/4 1998/08/18 17:32:33 samborn $
|
|
**
|
|
** RESTRICTED CONFIDENTIAL INFORMATION:
|
|
**
|
|
** The information in this document is subject to special
|
|
** restrictions in a confidential disclosure agreement between
|
|
** HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
|
|
** document outside HP, IBM, Sun, USL, SCO, or Univel without
|
|
** Sun's specific written approval. This document and all copies
|
|
** and derivative works thereof must be returned or destroyed at
|
|
** Sun's request.
|
|
**
|
|
** Copyright 1993 Sun Microsystems, Inc. All rights reserved.
|
|
**
|
|
*******************************************************************************/
|
|
|
|
/* *
|
|
* (c) Copyright 1993, 1994 Hewlett-Packard Company *
|
|
* (c) Copyright 1993, 1994 International Business Machines Corp. *
|
|
* (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
|
|
* (c) Copyright 1993, 1994 Novell, Inc. *
|
|
*/
|
|
|
|
#ifndef lint
|
|
static char sccsid[] = "@(#)select.c 1.24 95/02/21 Copyr 1994 Sun Microsystems, Inc.";
|
|
#endif
|
|
|
|
#include <EUSCompat.h>
|
|
#include <stdio.h>
|
|
#include <Xm/Xm.h>
|
|
#include "util.h"
|
|
#include "select.h"
|
|
/*
|
|
#include "graphics.h"
|
|
*/
|
|
#include "calendar.h"
|
|
#include "timeops.h"
|
|
#include "browser.h"
|
|
#include "todo.h"
|
|
#include "dayglance.h"
|
|
#include "weekglance.h"
|
|
#include "monthglance.h"
|
|
#include "yearglance.h"
|
|
#include "datefield.h"
|
|
#include "props.h"
|
|
|
|
static void select_weekhotbox();
|
|
|
|
/* Highlight thickness - mghis */
|
|
#define STDTTT 3 /* default */
|
|
#define WEEKLTTT 2 /* of hour slots in week glance view */
|
|
|
|
extern int
|
|
selection_active (Selection *s)
|
|
{
|
|
return (s->active);
|
|
}
|
|
|
|
extern void
|
|
deactivate_selection (Selection *s)
|
|
{
|
|
s->active=0;
|
|
}
|
|
|
|
extern void
|
|
activate_selection (Selection *s)
|
|
{
|
|
s->active=1;
|
|
}
|
|
|
|
extern void
|
|
weekchart_deselect(Calendar *c)
|
|
{
|
|
int h, i, j, k, index, wi, x, y, chart_x, chart_y;
|
|
Week *w = (Week *)c->view->week_info;
|
|
Selection *sel = (Selection *) w->current_selection;
|
|
XFontSetExtents fontextents;
|
|
int char_height;
|
|
Colormap cms;
|
|
|
|
CalFontExtents(w->font, &fontextents);
|
|
char_height = fontextents.max_ink_extent.height;
|
|
|
|
XtVaGetValues(c->canvas, XmNcolormap, &cms, NULL);
|
|
|
|
if (!selection_active (sel)) return;
|
|
|
|
j = sel->col;
|
|
k = sel->row;
|
|
|
|
/* dissolves box around weekday letter over chart */
|
|
chart_x = w->chart_x + (j * w->chart_day_width);
|
|
chart_y = w->chart_y - char_height - 4;
|
|
gr_dissolve_box(c->xcontext, chart_x, chart_y - 6,
|
|
w->chart_day_width, char_height + 6, 2);
|
|
|
|
x = (j*w->chart_day_width) + w->chart_x + 1;
|
|
y = (k * (w->chart_hour_height + w->add_pixels)) + w->chart_y + 1;
|
|
h = (w->chart_hour_height/BOX_SEG);
|
|
wi = w->chart_day_width-2;
|
|
|
|
gr_clear_area(c->xcontext, x, y, w->chart_day_width-1,
|
|
w->chart_hour_height-1 + w->add_pixels);
|
|
gr_draw_box(c->xcontext, x - 1, y - 1, w->chart_day_width,
|
|
w->chart_hour_height + w->add_pixels, NULL);
|
|
index = j * (w->segs_in_array / 7) + (BOX_SEG * k);
|
|
for (i = index; i < (index + BOX_SEG); i++) {
|
|
/* compensate for the added pixel for displaying chart */
|
|
if ((i+1) == (index + BOX_SEG)) h += w->add_pixels;
|
|
if (w->time_array[i] == 1) {
|
|
if ((c->xcontext->screen_depth < 8) || FAKE_MONOCHROME)
|
|
gr_make_gray(c->xcontext, x, y, wi+1, h, 25);
|
|
else
|
|
gr_make_grayshade(c->xcontext, x, y, wi+1, h,
|
|
LIGHTGREY);
|
|
}
|
|
else if (w->time_array[i] == 2) {
|
|
if ((c->xcontext->screen_depth < 8) || FAKE_MONOCHROME)
|
|
gr_make_gray(c->xcontext, x, y,
|
|
wi+1, h, 50);
|
|
else
|
|
gr_make_rgbcolor(c->xcontext, cms, x, y, wi+1, h,
|
|
MIDGREY, MIDGREY, MIDGREY);
|
|
}
|
|
else if (w->time_array[i] >= 3) {
|
|
if ((c->xcontext->screen_depth < 8) || FAKE_MONOCHROME)
|
|
gr_make_gray(c->xcontext, x, y, wi+1, h, 75);
|
|
else
|
|
gr_make_grayshade(c->xcontext, x, y, wi+1, h,
|
|
DIMGREY);
|
|
}
|
|
/* compensate for grid line pixel */
|
|
if (i == (index+BOX_SEG-2))
|
|
y += (h-1);
|
|
else
|
|
y += h;
|
|
}
|
|
deactivate_selection (sel);
|
|
}
|
|
|
|
/* selects day in chart */
|
|
extern void
|
|
weekchart_select(Calendar *c)
|
|
{
|
|
int i, j, chart_x, chart_y;
|
|
Week *w = (Week *)c->view->week_info;
|
|
Selection *sel = (Selection *) w->current_selection;
|
|
Colormap cms;
|
|
Pixel background_pixel;
|
|
XFontSetExtents fontextents;
|
|
int char_height;
|
|
|
|
CalFontExtents(w->font, &fontextents);
|
|
char_height = fontextents.max_ink_extent.height;
|
|
|
|
XtVaGetValues(c->canvas, XmNcolormap, &cms, NULL);
|
|
/*
|
|
XtVaGetValues(c->frame, XmNbackground, &background_pixel, NULL);
|
|
*/
|
|
background_pixel = c->xcontext->hilight_color;
|
|
|
|
i = sel->col;
|
|
j = sel->row;
|
|
if (j >= 0) {
|
|
chart_x = w->chart_x + (i * w->chart_day_width);
|
|
chart_y = w->chart_y - char_height - 4;
|
|
if (c->xcontext->screen_depth < 8) {
|
|
gr_draw_box(c->xcontext, (i * w->chart_day_width) +
|
|
w->chart_x + 1, (j * w->chart_hour_height) +
|
|
(j * w->add_pixels) + w->chart_y + 1,
|
|
w->chart_day_width - 2,
|
|
w->chart_hour_height - 2 + w->add_pixels, NULL);
|
|
gr_draw_box(c->xcontext, chart_x, chart_y,
|
|
w->chart_day_width, char_height + 1, NULL);
|
|
}
|
|
else {
|
|
/* Select time slot */
|
|
gr_draw_rgb_box(c->xcontext, (i * w->chart_day_width)
|
|
+ w->chart_x, (j * w->chart_hour_height)
|
|
+ (j * w->add_pixels) + w->chart_y,
|
|
w->chart_day_width, w->chart_hour_height
|
|
+ w->add_pixels, WEEKLTTT, background_pixel,
|
|
cms);
|
|
|
|
/* Select weekday letter over chart */
|
|
gr_draw_rgb_box(c->xcontext, chart_x, chart_y - 6,
|
|
w->chart_day_width, char_height + 6, WEEKLTTT,
|
|
background_pixel, cms);
|
|
}
|
|
sel->nunits = 1;
|
|
activate_selection(sel);
|
|
}
|
|
}
|
|
|
|
/* selects day is main boxes: not chart */
|
|
static void
|
|
select_weekday(Calendar *c, Boolean select)
|
|
{
|
|
int n, x, y;
|
|
new_XContext*xc = c->xcontext;
|
|
Week *w = (Week *)c->view->week_info;
|
|
Pixel foreground_pixel;
|
|
|
|
|
|
foreground_pixel = xc->hilight_color;
|
|
|
|
/* Draw selection feedback on week view */
|
|
(n = dow(c->view->date)) == 0 ? n = 6 : n--;
|
|
|
|
if (n < 5) {
|
|
x = w->x + n * w->day_width + 2;
|
|
y = w->y + w->label_height + 2;
|
|
} else {
|
|
n -= (5 - 3);
|
|
x = w->x + n * w->day_width + 2;
|
|
y = w->y + w->day_height + w->label_height + 2;
|
|
}
|
|
|
|
if (select) {
|
|
if (c->xcontext->screen_depth < 8) {
|
|
gr_draw_box(xc, x, y, w->day_width - 2,
|
|
w->day_height - w->label_height - 2, NULL);
|
|
}
|
|
else {
|
|
Colormap cms;
|
|
|
|
XtVaGetValues(c->canvas, XmNcolormap, &cms, NULL);
|
|
gr_draw_rgb_box(xc, x - 2, y - 2, w->day_width,
|
|
w->day_height - w->label_height, STDTTT,
|
|
foreground_pixel, cms);
|
|
}
|
|
weekchart_select(c);
|
|
} else {
|
|
gr_draw_box(xc, x - 2, y - 2, w->day_width,
|
|
w->day_height - w->label_height, NULL);
|
|
gr_dissolve_box(xc, x - 1, y - 1, w->day_width - 2,
|
|
w->day_height - w->label_height - 2, 2);
|
|
weekchart_deselect(c);
|
|
}
|
|
|
|
}
|
|
|
|
/* selection service for all views. ref is a client_data
|
|
field which is cast depending on the selection unit. if
|
|
it's a daySelect, ref contains the number of weeks in the
|
|
month. if it's a monthSelect, ref contains a point to x,y
|
|
coordinates. ref is NULL on a weekSelect. */
|
|
|
|
extern void
|
|
calendar_select (Calendar *c, Selection_unit unit, caddr_t ref)
|
|
{
|
|
int i, j;
|
|
int xpos, boxw, boxh, margin, topoff, date;
|
|
Selection *sel;
|
|
new_XContext *xc;
|
|
Colormap cms;
|
|
Pixel foreground_pixel;
|
|
int dayname_height;
|
|
|
|
date = c->view->date;
|
|
sel = (Selection *) c->view->current_selection;
|
|
boxw = c->view->boxw;
|
|
boxh = c->view->boxh;
|
|
margin = c->view->outside_margin;
|
|
topoff = c->view->topoffset;
|
|
xc = c->xcontext;
|
|
|
|
XtVaGetValues(c->canvas, XmNcolormap, &cms, NULL);
|
|
/*
|
|
XtVaGetValues(c->canvas, XmNforeground, &foreground_pixel, NULL);
|
|
*/
|
|
foreground_pixel = xc->hilight_color;
|
|
switch (unit) {
|
|
/* day selection on month glance */
|
|
case daySelect:
|
|
dayname_height = ((Month *) c->view->month_info)->dayname_height;
|
|
i=dow(date);
|
|
j=wom(date);
|
|
if (j >= 0) {
|
|
sel->row=j-1;
|
|
sel->col=i;
|
|
sel->nunits=1;
|
|
if (c->xcontext->screen_depth < 8)
|
|
gr_draw_box(xc, (i*boxw)+margin+
|
|
1, (sel->row*boxh)+topoff+
|
|
dayname_height+1, boxw-2, boxh-2, NULL);
|
|
else {
|
|
gr_draw_rgb_box(xc, (i*boxw)
|
|
+margin,
|
|
(sel->row*boxh)+topoff+
|
|
dayname_height, boxw,
|
|
boxh, STDTTT,
|
|
foreground_pixel, cms);
|
|
}
|
|
activate_selection (sel);
|
|
|
|
}
|
|
break;
|
|
/* week selection on month glance view */
|
|
case weekSelect:
|
|
#ifdef NEVER
|
|
i=0; j=7;
|
|
sel->row=(int)ref;
|
|
sel->col=i;
|
|
sel->nunits=j-i;
|
|
while (i < j) {
|
|
if (c->xcontext->screen_depth < 8)
|
|
gr_draw_box(xc, i*boxw+margin+1,
|
|
(int)ref*boxh+margin+topoff+1,
|
|
boxw-2, boxh-2, NULL);
|
|
else {
|
|
gr_draw_rgb_box(xc, i*boxw+margin+2,
|
|
(int)ref*boxh+margin+topoff+2,
|
|
boxw-4, boxh-4, STDTTT,
|
|
foreground_pixel, cms);
|
|
gr_draw_rgb_box(xc, i*boxw+margin+1,
|
|
(int)ref*boxh+margin+topoff+1,
|
|
boxw-2, boxh-2, 1,
|
|
foreground_pixel, cms);
|
|
}
|
|
i++;
|
|
}
|
|
activate_selection (sel);
|
|
#endif
|
|
break;
|
|
/* month selection on year glance view */
|
|
case monthSelect:
|
|
if (ref != NULL) {
|
|
i=((pr_pos *)ref)->x;
|
|
j=((pr_pos *)ref)->y;
|
|
}
|
|
else {
|
|
i = sel->col;
|
|
j = sel->row;
|
|
}
|
|
if (c->xcontext->screen_depth < 8)
|
|
gr_draw_box(xc, i*boxw+margin+10,
|
|
j*boxh+topoff-4, boxw-4, boxh-4, NULL);
|
|
else {
|
|
if (i == 0)
|
|
xpos = margin-5;
|
|
else if (i == 1)
|
|
xpos = i*(boxw-18);
|
|
else
|
|
xpos = i*(boxw-24);
|
|
/*
|
|
gr_draw_rgb_box(xc, xpos,
|
|
j*boxh+topoff+10, boxw-2, boxh-2, 1,
|
|
foreground_pixel, cms);
|
|
*/
|
|
gr_draw_rgb_box(xc, xpos,
|
|
j*boxh+topoff+10, boxw-56, boxh+2, STDTTT,
|
|
foreground_pixel, cms);
|
|
}
|
|
sel->row=j;
|
|
sel->col=i;
|
|
sel->nunits=1;
|
|
activate_selection (sel);
|
|
break;
|
|
/* hour box selection day glance view */
|
|
case hourSelect:
|
|
if (ref != NULL)
|
|
j=((pr_pos *)ref)->y;
|
|
else
|
|
j = sel->row;
|
|
if (c->xcontext->screen_depth < 8)
|
|
gr_draw_box(xc, MOBOX_AREA_WIDTH+5,
|
|
j*boxh+topoff+1, c->view->boxw-4,
|
|
c->view->boxh-2, NULL);
|
|
else {
|
|
gr_draw_rgb_box(xc, MOBOX_AREA_WIDTH+3,
|
|
j*boxh+topoff,
|
|
c->view->boxw - 2,
|
|
c->view->boxh,
|
|
STDTTT,
|
|
foreground_pixel, cms);
|
|
}
|
|
sel->row=j;
|
|
sel->col=MOBOX_AREA_WIDTH+4;
|
|
sel->nunits=1;
|
|
activate_selection(sel);
|
|
break;
|
|
/* day selection on week glance */
|
|
case weekdaySelect:
|
|
select_weekday(c, True);
|
|
activate_selection (sel);
|
|
break;
|
|
/* hotbox selection on week glance */
|
|
case weekhotboxSelect:
|
|
select_weekhotbox(c);
|
|
activate_selection (sel);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
/*
|
|
common_update_lists(c);
|
|
*/
|
|
}
|
|
|
|
extern void
|
|
calendar_deselect (Calendar *c)
|
|
{
|
|
int i, j, k, xpos;
|
|
int x, y;
|
|
int boxh = c->view->boxh;
|
|
int boxw = c->view->boxw;
|
|
int margin = c->view->outside_margin;
|
|
int topoff = c->view->topoffset;
|
|
Selection *s = (Selection *) c->view->current_selection;
|
|
int nunits = s->nunits;
|
|
new_XContext *xc = c->xcontext;
|
|
int dayname_height;
|
|
int nop;
|
|
Cal_Font *pf = c->fonts->boldfont;
|
|
Props *p = (Props*)c->properties;
|
|
DisplayType disp_t = get_int_prop(p, CP_DEFAULTDISP);
|
|
|
|
if (selection_active(s)) {
|
|
j=s->col;
|
|
k=s->row;
|
|
switch(c->view->glance) {
|
|
case weekGlance:
|
|
select_weekday(c, False);
|
|
deactivate_selection (s);
|
|
break;
|
|
case dayGlance: {
|
|
int hrbox_margin;
|
|
int num_hrs = get_int_prop(p, CP_DAYEND) -
|
|
get_int_prop(p, CP_DAYBEGIN) + 1;
|
|
|
|
for (i=0; i < nunits; i++) {
|
|
gr_dissolve_box(xc, MOBOX_AREA_WIDTH+3,
|
|
k*boxh+topoff + 1, boxw-3, boxh-2, 3);
|
|
x = MOBOX_AREA_WIDTH + 2;
|
|
y = k * boxh + topoff;
|
|
|
|
gr_draw_line(xc, x, y, x + boxw, y,
|
|
gr_solid, NULL);
|
|
y += boxh;
|
|
gr_draw_line(xc, x, y, x + boxw, y,
|
|
gr_solid, NULL);
|
|
}
|
|
|
|
if (disp_t == HOUR12)
|
|
CalTextExtents(pf, "12pm", 4, &nop, &nop,
|
|
&hrbox_margin, &nop);
|
|
else
|
|
CalTextExtents(pf, "24 ", 3, &nop, &nop,
|
|
&hrbox_margin, &nop);
|
|
|
|
/* draw vertical line */
|
|
gr_draw_line(xc, MOBOX_AREA_WIDTH+2+hrbox_margin,
|
|
c->view->topoffset, MOBOX_AREA_WIDTH+2+hrbox_margin,
|
|
c->view->topoffset + num_hrs * c->view->boxh,
|
|
gr_solid, NULL);
|
|
break;
|
|
}
|
|
case monthGlance:
|
|
dayname_height =
|
|
((Month *) c->view->month_info)->dayname_height;
|
|
|
|
for (i=0; i<nunits; i++) {
|
|
gr_dissolve_box(xc,
|
|
(j * boxw) + margin + 1,
|
|
(k * boxh) + topoff + dayname_height + 1,
|
|
boxw - 2, boxh - 2, 2);
|
|
gr_draw_box(xc,
|
|
(j * boxw) + margin,
|
|
(k * boxh) + topoff + dayname_height,
|
|
boxw, boxh, NULL);
|
|
j++;
|
|
}
|
|
break;
|
|
case yearGlance:
|
|
for (i=0; i<nunits; i++) {
|
|
if (j == 0)
|
|
xpos = margin-5;
|
|
else if (j == 1)
|
|
xpos = j*(boxw-18);
|
|
else
|
|
xpos = j*(boxw-24);
|
|
|
|
/*
|
|
gr_dissolve_box(xc, (j*boxw)+margin+10,
|
|
k*boxh+topoff-5,
|
|
boxw-2, boxh-2, 1);
|
|
*/
|
|
gr_dissolve_box(xc, xpos,
|
|
k*boxh+topoff+10, boxw-56, boxh+2, 1);
|
|
|
|
/*
|
|
gr_dissolve_box(xc, (j*boxw)+margin+11,
|
|
k*boxh+topoff-4,
|
|
boxw-2, boxh-2, 1);
|
|
*/
|
|
j++;
|
|
}
|
|
break;
|
|
}
|
|
deactivate_selection (s);
|
|
}
|
|
}
|
|
extern void
|
|
monthbox_deselect(Calendar *c)
|
|
{
|
|
char buf[3];
|
|
Day *day_info = (Day *)c->view->day_info;
|
|
int x, y;
|
|
|
|
if (day_info->day_selected == -1)
|
|
return;
|
|
|
|
x = day_info->day_selected_x + 2;
|
|
y = day_info->day_selected_y + 2;
|
|
|
|
if (c->xcontext->screen_depth < 8)
|
|
gr_make_gray(c->xcontext,
|
|
x,
|
|
y,
|
|
day_info->col_w+1,
|
|
day_info->row_h-1, 25);
|
|
else
|
|
gr_make_grayshade(c->xcontext,
|
|
x,
|
|
y,
|
|
day_info->col_w+1,
|
|
day_info->row_h-1, LIGHTGREY);
|
|
buf [0] = '\0';
|
|
sprintf(buf, "%d", day_info->day_selected);
|
|
gr_text(c->xcontext, day_info->day_selected_x2+2,
|
|
day_info->day_selected_y2,
|
|
c->fonts->viewfont, buf, NULL);
|
|
}
|
|
extern void
|
|
monthbox_select(Calendar *c)
|
|
{
|
|
char buf[3];
|
|
Day *day_info = (Day *)c->view->day_info;
|
|
int x, y;
|
|
|
|
x = day_info->day_selected_x + 2;
|
|
y = day_info->day_selected_y + 2;
|
|
|
|
gr_clear_box(c->xcontext,
|
|
x,
|
|
y,
|
|
day_info->col_w,
|
|
day_info->row_h-3);
|
|
gr_draw_box(c->xcontext,
|
|
x,
|
|
y,
|
|
day_info->col_w,
|
|
day_info->row_h-3, NULL);
|
|
buf [0] = '\0';
|
|
sprintf(buf, "%d", day_info->day_selected);
|
|
gr_text(c->xcontext, day_info->day_selected_x2+2,
|
|
day_info->day_selected_y2,
|
|
c->fonts->viewfont, buf, NULL);
|
|
}
|
|
|
|
extern void
|
|
browser_deselect (Calendar *c, Browser *b)
|
|
{
|
|
int h, i, j, k, index, w, x, y;
|
|
Selection *sel = (Selection *) b->current_selection;
|
|
Colormap cms;
|
|
|
|
XtVaGetValues(c->canvas, XmNcolormap, &cms, NULL);
|
|
if (!selection_active (sel))
|
|
return;
|
|
j = sel->col;
|
|
k = sel->row;
|
|
x = (j*b->boxw) + b->chart_x + 1;
|
|
y = (k*b->boxh) + b->chart_y + 1;
|
|
h = (b->boxh/BOX_SEG);
|
|
w = b->boxw-2;
|
|
gr_clear_area(b->xcontext, x, y, b->boxw-1, b->boxh-1);
|
|
index = j * (b->segs_in_array / 7) + (BOX_SEG * k);
|
|
for (i = index; i < (index + BOX_SEG); i++) {
|
|
if (b->multi_array[i] == 1) {
|
|
if ((c->xcontext->screen_depth < 8) || FAKE_MONOCHROME)
|
|
gr_make_gray(b->xcontext, x, y, w+1,
|
|
h, 25);
|
|
else
|
|
gr_make_grayshade(b->xcontext, x, y,
|
|
w+1, h, LIGHTGREY);
|
|
}
|
|
else if (b->multi_array[i] == 2) {
|
|
if ((c->xcontext->screen_depth < 8) || FAKE_MONOCHROME)
|
|
gr_make_gray(b->xcontext, x, y,
|
|
w+1, h, 50);
|
|
else
|
|
gr_make_rgbcolor(b->xcontext, cms, x, y,
|
|
w+1, h, MIDGREY, MIDGREY, MIDGREY);
|
|
}
|
|
else if (b->multi_array[i] >= 3) {
|
|
if ((c->xcontext->screen_depth < 8) || FAKE_MONOCHROME)
|
|
gr_make_gray(b->xcontext, x, y,
|
|
w+1, h, 75);
|
|
else
|
|
gr_make_grayshade(b->xcontext, x, y,
|
|
w+1, h, DIMGREY);
|
|
}
|
|
/* compensate for grid line pixel */
|
|
if (i == (index+BOX_SEG-2))
|
|
y += (h-1);
|
|
else
|
|
y += h;
|
|
}
|
|
deactivate_selection (sel);
|
|
}
|
|
|
|
|
|
extern void
|
|
browser_select(Calendar *c, Browser *b, pr_pos *xy)
|
|
{
|
|
int i, j;
|
|
Selection *sel = (Selection *) b->current_selection;
|
|
Colormap cms;
|
|
Pixel pixel;
|
|
|
|
if (xy != NULL) {
|
|
i = xy->x;
|
|
j = xy->y;
|
|
}
|
|
else {
|
|
i = sel->col;
|
|
j = sel->row;
|
|
}
|
|
if (j >= 0) {
|
|
if (c->xcontext->screen_depth < 8) {
|
|
gr_draw_box(b->xcontext, (i * b->boxw) +
|
|
b->chart_x + 2, (j * b->boxh) + b->chart_y
|
|
+ 2, b->boxw - 4, b->boxh - 4, NULL);
|
|
}
|
|
else {
|
|
pixel = c->xcontext->hilight_color;
|
|
XtVaGetValues(b->canvas, XmNcolormap, &cms, NULL);
|
|
gr_draw_rgb_box(b->xcontext, (i * b->boxw) +
|
|
b->chart_x + 2, (j * b->boxh) + b->chart_y
|
|
+ 2, b->boxw - 4, b->boxh - 4, STDTTT,
|
|
pixel, cms);
|
|
gr_draw_rgb_box(b->xcontext, (i * b->boxw) +
|
|
b->chart_x + 1, (j * b->boxh) + b->chart_y
|
|
+ 1, b->boxw - 2, b->boxh - 2, STDTTT,
|
|
pixel, cms);
|
|
}
|
|
sel->row = j;
|
|
sel->col = i;
|
|
sel->nunits = 1;
|
|
activate_selection(sel);
|
|
}
|
|
}
|
|
|
|
static void
|
|
select_weekhotbox(Calendar *c)
|
|
{
|
|
int n, x, y;
|
|
new_XContext*xc = c->xcontext;
|
|
Week *w = (Week *)c->view->week_info;
|
|
long date = c->view->date;
|
|
Colormap cms;
|
|
Pixel background_pixel;
|
|
|
|
XtVaGetValues(c->canvas, XmNcolormap, &cms, NULL);
|
|
XtVaGetValues(c->frame, XmNbackground, &background_pixel, NULL);
|
|
|
|
/* Draw selection feedback on week view */
|
|
if ((n = dow(date)) == 0)
|
|
n = 6;
|
|
else
|
|
n--;
|
|
|
|
if (n < 5) {
|
|
x = w->x + n * w->day_width + 2;
|
|
y = w->y + 2;
|
|
}
|
|
else {
|
|
n -= (5 - 3);
|
|
x = w->x + n * w->day_width + 2;
|
|
y = w->y + w->day_height + 2;
|
|
}
|
|
|
|
if (c->xcontext->screen_depth < 8)
|
|
gr_draw_box(xc, x, y, w->day_width - 4, w->label_height - 4, NULL);
|
|
else {
|
|
gr_draw_rgb_box(xc, x, y,
|
|
w->day_width - 4, w->label_height - 4, STDTTT,
|
|
background_pixel, cms);
|
|
gr_draw_rgb_box(xc, x-1, y-1,
|
|
w->day_width-2, w->label_height - 2, STDTTT,
|
|
background_pixel, cms);
|
|
}
|
|
}
|
|
|
|
extern void
|
|
paint_selection(Calendar *c)
|
|
{
|
|
Props *p = (Props*)c->properties;
|
|
Selection *sel;
|
|
int d, mo, beg = get_int_prop(p, CP_DAYBEGIN);
|
|
Week *w = (Week *)c->view->week_info;
|
|
pr_pos xy;
|
|
|
|
switch ((Glance)c->view->glance) {
|
|
case monthGlance:
|
|
calendar_select(c, daySelect, (caddr_t)NULL);
|
|
break;
|
|
case dayGlance:
|
|
sel = (Selection *) c->view->current_selection;
|
|
sel->row = hour(c->view->date) - beg + 1;
|
|
calendar_select(c, hourSelect, (caddr_t)NULL);
|
|
break;
|
|
case weekGlance:
|
|
sel = (Selection*)w->current_selection;
|
|
sel->row = hour(c->view->date) - beg;
|
|
sel->col = (d = dow(c->view->date)) == 0 ? 6 : --d; calendar_select(c, weekdaySelect, (caddr_t)NULL);
|
|
break;
|
|
case yearGlance:
|
|
mo = month(c->view->date);
|
|
xy.y = month_row_col[mo-1][ROW];
|
|
xy.x = month_row_col[mo-1][COL];
|
|
calendar_select(c, monthSelect, (caddr_t)&xy);
|
|
break;
|
|
}
|
|
}
|