// vi:set ts=8 sts=4 sw=4 noet:
// MODIFIED ATHENA SCROLLBAR (USING ARROWHEADS AT ENDS OF TRAVEL)
// Modifications Copyright 1992 by Mitch Trachtenberg
// Rights, permissions, and disclaimer of warranty are as in the
// DEC and MIT notice below.  See usage warning in .c file.
/*
 * $XConsortium: ScrollbarP.h,v 1.3 94/04/17 20:12:42 jim Exp $
 */


/***********************************************************

Copyright (c) 1987, 1988  X Consortium

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of the X Consortium shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from the X Consortium.


Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.

			All Rights Reserved

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
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 Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.

DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL 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.

******************************************************************/

#ifndef _Scrollbar_h
#define _Scrollbar_h

/****************************************************************
 *
 * Scrollbar Widget
 *
 ****************************************************************/

#include <X11/IntrinsicP.h>
#include <X11/Xaw/SimpleP.h>
#include <X11/Xmu/Converters.h>

/*
 * Most things we need are in StringDefs.h
 */
#define XtCMinimumThumb		"MinimumThumb"
#define XtCShown		"Shown"
#define XtCTopOfThumb		"TopOfThumb"
#define XtCMaxOfThumb		"MaxOfThumb"
#define XtCShadowWidth		"ShadowWidth"
#define XtCTopShadowPixel	"TopShadowPixel"
#define XtCBottomShadowPixel	"BottomShadowPixel"
#define XtCLimitThumb		"LimitThumb"

#define XtNminimumThumb		"minimumThumb"
#define XtNtopOfThumb		"topOfThumb"
#define XtNmaxOfThumb		"maxOfThumb"
#define XtNshadowWidth		"shadowWidth"
#define XtNtopShadowPixel	"topShadowPixel"
#define XtNbottomShadowPixel	"bottomShadowPixel"
#define XtNlimitThumb		"limitThumb"

typedef struct _ScrollbarRec	  *ScrollbarWidget;
typedef struct _ScrollbarClassRec *ScrollbarWidgetClass;

extern WidgetClass vim_scrollbarWidgetClass;

extern void vim_XawScrollbarSetThumb(Widget, double, double, double);

typedef struct
{
     // public
    Pixel	  foreground;	// thumb foreground color
    XtOrientation orientation;	// horizontal or vertical
    XtCallbackList scrollProc;	// proportional scroll
    XtCallbackList thumbProc;	// jump (to position) scroll
    XtCallbackList jumpProc;	// same as thumbProc but pass data by ref
    Pixmap	  thumb;	// thumb color
    float	  top;		// What percent is above the win's top
    float	  shown;	// What percent is shown in the win
    float	  max;		// Maximum value for top
    Dimension	  length;	// either height or width
    Dimension	  thickness;	// either width or height
    Dimension	  min_thumb;	// minimum size for the thumb.

     // private
    XtIntervalId  timer_id;	// autorepeat timer; remove on destruction
    char	  scroll_mode;	// see below
    float	  scroll_off;	// offset from event to top of thumb
    GC		  gc;		// a (shared) gc
    Position	  topLoc;	// Pixel that corresponds to top
    Dimension	  shownLength;	// Num pixels corresponding to shown

    // From 3d widget
    Dimension	shadow_width;
    Pixel	top_shadow_pixel;
    Pixel	bot_shadow_pixel;
    Bool	limit_thumb;	// limit thumb to inside scrollbar
    int		top_shadow_contrast;
    int		bot_shadow_contrast;
    GC		top_shadow_GC;
    GC		bot_shadow_GC;
} ScrollbarPart;

#define SMODE_NONE		0
#define SMODE_CONT		1
#define SMODE_PAGE_UP		2
#define SMODE_PAGE_DOWN		3
#define SMODE_LINE_UP		4
#define SMODE_LINE_DOWN		5

#define ONE_LINE_DATA		1
#define ONE_PAGE_DATA		10
#define END_PAGE_DATA		9999

typedef struct _ScrollbarRec {
    CorePart		core;
    SimplePart		simple;
    ScrollbarPart	scrollbar;
} ScrollbarRec;

typedef struct {int empty;} ScrollbarClassPart;

typedef struct _ScrollbarClassRec {
    CoreClassPart		core_class;
    SimpleClassPart		simple_class;
    ScrollbarClassPart		scrollbar_class;
} ScrollbarClassRec;

extern ScrollbarClassRec vim_scrollbarClassRec;

#endif // _Scrollbar_h
