// This may look like C code, but it is really -*- C++ -*-

/*
 * $XConsortium: PannerP.h,v 1.18 90/04/11 17:05:11 jim Exp $
 *
 * Copyright 1989 Massachusetts Institute of Technology
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of M.I.T. not be used in advertising or
 * publicity pertaining to distribution of the software without specific,
 * written prior permission.  M.I.T. makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 *
 * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * Author:  Jim Fulton, MIT X Consortium
 *
 * C++ Interface Author: Roman J. Budzianowski - Project Athena MIT
 */

#ifndef _XawPanner_h
#define _XawPanner_h

#include <xt++/Xaw/Simple.h>		/* parent */

#include <xt++/Xaw/Reports.h>

/*****************************************************************************
 * 
 * Panner Widget (subclass of Simple)
 * 
 * This widget is used to represent navigation in a 2d coordinate system.
 * 
 * Parameters:
 * 
 *  Name		Class		Type		Default
 *  ----		-----		----		-------
 * 
 *  allowOff		AllowOff	Boolean		FALSE
 *  background		Background	Pixel		XtDefaultBackground
 *  backgroundStipple	BackgroundStipple	String	NULL
 *  canvasWidth		CanvasWidth	Dimension	0
 *  canvasHeight	CanvasHeight	Dimension	0
 *  defaultScale	DefaultScale	Dimension	8 percent
 *  foreground		Foreground	Pixel		XtDefaultBackground
 *  internalSpace	InternalSpace	Dimension	4
 *  lineWidth		LineWidth	Dimension	0
 *  reportCallback	ReportCallback	XtCallbackList	NULL
 *  resize		Resize		Boolean		TRUE
 *  rubberBand		RubberBand	Boolean		FALSE
 *  shadowColor		ShadowColor	Pixel		XtDefaultForeground
 *  shadowThickness	ShadowThickness	Dimension	2
 *  sliderX		SliderX		Position	0
 *  sliderY		SliderY		Position	0
 *  sliderWidth		SliderWidth	Dimension	0
 *  sliderHeight	SliderHeight	Dimension	0
 * 
 *****************************************************************************/

					/* new instance and class names */
#define XtNallowOff "allowOff"
#define XtCAllowOff "AllowOff"
#define XtNbackgroundStipple "backgroundStipple"
#define XtCBackgroundStipple "BackgroundStipple"
#define XtNdefaultScale "defaultScale"
#define XtCDefaultScale "DefaultScale"
#define XtNcanvasWidth "canvasWidth"
#define XtCCanvasWidth "CanvasWidth"
#define XtNcanvasHeight "canvasHeight"
#define XtCCanvasHeight "CanvasHeight"
#define XtNinternalSpace "internalSpace"
#define XtCInternalSpace "InternalSpace"
#define XtNlineWidth "lineWidth"
#define XtCLineWidth "LineWidth"
#define XtNresize "resize"
#define XtCResize "Resize"
#define XtNrubberBand "rubberBand"
#define XtCRubberBand "RubberBand"
#define XtNshadowThickness "shadowThickness"
#define XtCShadowThickness "ShadowThickness"
#define XtNshadowColor "shadowColor"
#define XtCShadowColor "ShadowColor"
#define XtNsliderX "sliderX"
#define XtCSliderX "SliderX"
#define XtNsliderY "sliderY"
#define XtCSliderY "SliderY"
#define XtNsliderWidth "sliderWidth"
#define XtCSliderWidth "SliderWidth"
#define XtNsliderHeight "sliderHeight"
#define XtCSliderHeight "SliderHeight"

					/* external declarations */
extern WidgetClass pannerWidgetClass;

class PannerWidget;

// we have to use the C approach because of the alignment of doubles
// if PannerPart is compiled as a separate structure additional padding
// is added in this structure because some doubles don't fall on the 8 byte
// boundary.
// if PannerWidget is a simple subclass of Simple those doubles do fall on the
// 8 byte boundary and no padding is necessary, and the C++ class doesn't map
// into C struct
//
class PannerPart  { 			/* new fields in widget */
friend class PannerWidget;
   /* resources... */
   XtCallbackList report_callbacks;	/* callback/Callback */
   Boolean allow_off;			/* allowOff/AllowOff */
   Boolean resize_to_pref;		/* resizeToPreferred/Boolean */
   Pixel foreground;			/* foreground/Foreground */
   Pixel shadow_color;			/* shadowColor/ShadowColor */
   Dimension shadow_thickness;		/* shadowThickness/ShadowThickness */
   Dimension default_scale;		/* defaultScale/DefaultScale */
   Dimension line_width;		/* lineWidth/LineWidth */
   Dimension canvas_width;		/* canvasWidth/CanvasWidth */
   Dimension canvas_height;		/* canvasHeight/CanvasHeight */
   Position slider_x;			/* sliderX/SliderX */
   Position slider_y;			/* sliderY/SliderY */
   Dimension slider_width;		/* sliderWidth/SliderWidth */
   Dimension slider_height;		/* sliderHeight/SliderHeight */
   Dimension internal_border;		/* internalBorderWidth/BorderWidth */
   String stipple_name;		/* backgroundStipple/BackgroundStipple */
   /* private data... */
   GC slider_gc;			/* background of slider */
   GC shadow_gc;			/* edge of slider and shadow */
   GC xor_gc;				/* for doing XOR tmp graphics */
   double haspect, vaspect;		/* aspect ratio of core to canvas */
   Boolean rubber_band;		/* true = rubber band, false = move */
   struct {
      Boolean doing;			/* tmp graphics in progress */
      Boolean showing;		/* true if tmp graphics displayed */
      Position startx, starty;	/* initial position of slider */
      Position dx, dy;		/* offset loc for tmp graphics */
      Position x, y;			/* location for tmp graphics */
   } tmp;
   Position knob_x, knob_y;		/* real upper left of knob in canvas */
   Dimension knob_width, knob_height;	/* real size of knob in canvas */
   Boolean shadow_valid;		/* true if rects are valid */
   XRectangle shadow_rects[2];		/* location of shadows */
   Position last_x, last_y;		/* previous location of knob */
};

class PannerWidget : public SimpleWidget {
 protected:
   PannerPart panner;
 public:
   Constructors(Panner,panner) {}
};

#endif /* _XawPanner_h */
