/*
 *  (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents
 *  pending in the U.S. and foreign countries. See LEGAL NOTICE
 *  file for terms of the license.
 */

/*
 *  (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents
 *  pending in the U.S. and foreign countries. See LEGAL NOTICE
 *  file for terms of the license.
 */

#ifndef __openwin_impl_h
#define __openwin_impl_h

/*
 * Package:     openwin
 *
 * Module:  ow_impl.h
 *
 * Description: defines internal data structures for managing openlook windows
 *
 */

#include <xview/xview.h>
#include <xview/openwin.h>
#include <xview/scrollbar.h>
#include <xview/sel_svc.h>
#include <xview/rect.h>

/*
 * Global Defines:
 */

/* macros to convert variable from/to public/private form */
#define OPENWIN_PRIVATE(win)  \
    XV_PRIVATE(Xv_openwin_info, Xv_openwin, win)
#define OPENWIN_PUBLIC(win)   XV_PUBLIC(win)

#define OPENWIN_REGULAR_VIEW_MARGIN 2
#define OPENWIN_VIEW_BORDER_WIDTH 2

#define OPENWIN_SPLIT_VERTICAL_MINIMUM  50
#define OPENWIN_SPLIT_HORIZONTAL_MINIMUM  50

#define OPENWIN_SCROLLBAR_LEFT 0
#define OPENWIN_SCROLLBAR_RIGHT 1

#define openwin_sb(view, direction)    \
    ((view)->sb[((direction) == SCROLLBAR_VERTICAL) ? 0 : 1])

#define openwin_set_sb(view, direction, sb) \
    openwin_sb((view), (direction)) = sb

/*
 * Typedefs:
 */

typedef struct  openwin_view_struct     Openwin_view_info;
typedef struct  openwin_info_struct     Xv_openwin_info;

struct openwin_view_struct
{
    Xv_opaque   view;
    Scrollbar   sb[2]; /* 0 -> vertical 1 -> horizontal */
    Rect        enclosing_rect; /* full area the view takes up --
                   includes margins, borders and scrollabrs */

    int         right_edge; /* view against openwin's right edge */
    int         bottom_edge; /* view against bottom edge */
    Openwin_view_info   *next_view;
    Xv_openwin_info       *owin;
};

#define STATUS(ow, field)           ((ow)->status_bits.field)
#define STATUS_SET(ow, field)       STATUS(ow, field) = TRUE
#define STATUS_RESET(ow, field)     STATUS(ow, field) = FALSE
#define BOOLEAN_FIELD(field)        unsigned field : 1

struct openwin_info_struct
{
    Openwin     public_self;        /* Back pointer */

    Xv_pkg      *view_class;
    Openwin_view_info   *views;
    int     margin;
    Rect        cached_rect;
    Scrollbar   vsb_on_create;  /* cached scrollbar until view is */
    Scrollbar   hsb_on_create;  /* created */
    Attr_avlist view_avlist;    /* cached view avlist on create */
    Attr_avlist view_end_avlist;
#ifdef SELECTABLE_VIEWS
    Seln_client seln_client;        /* selection svc client id */
    Openwin_view_info   *seln_view; /* selected view, if any */
#endif /* SELECTABLE_VIEWS */
    struct
    {
        BOOLEAN_FIELD(auto_clear);
        BOOLEAN_FIELD(adjust_vertical);
        BOOLEAN_FIELD(adjust_horizontal);
        BOOLEAN_FIELD(no_margin);
        BOOLEAN_FIELD(created);
        BOOLEAN_FIELD(show_borders);
        BOOLEAN_FIELD(removing_scrollbars);
        BOOLEAN_FIELD(mapped);
        BOOLEAN_FIELD(left_scrollbars);
#ifndef NO_OPENWIN_PAINT_BG
        BOOLEAN_FIELD(paint_bg);
#endif /* NO_OPENWIN_PAINT_BG */
    } status_bits;
    int     nbr_cols;       /* WIN_COLUMNS specified by client */
    int     nbr_rows;       /* WIN_ROWS specified by client */
    int (*layout_proc)();
    void (*split_init_proc)();
    void (*split_destroy_proc)();
#ifndef NO_OPENWIN_PAINT_BG
    XColor      background;
#endif /* NO_OPENWIN_PAINT_BG */
};

/*
 * Global Variable Declarations:
 */
extern  Attr_attribute openwin_view_context_key;

/*
 * Package private function declarations:
 */

/* openwin.c */
Pkg_private int openwin_init();
Pkg_private int openwin_destroy();

/* ow_get.c */
Pkg_private Xv_opaque openwin_get();

/* ow_set.c */
Pkg_private Xv_opaque openwin_set();

/* ow_evt.c */
Pkg_private Notify_value openwin_event();
Pkg_private Notify_value openwin_view_event();

/* ow_resize.c */
Pkg_private int  openwin_adjust_views();
Pkg_private void openwin_adjust_view();
Pkg_private void openwin_place_scrollbar();

/* ow_paint.c */
Pkg_private void openwin_clear_damage();

#ifdef SELECTABLE_VIEWS
/* openwin_seln.c */
extern void  openwin_seln_function();
extern Xv_opaque openwin_seln_reply();
extern void  openwin_select();
extern void  openwin_select_view();
#endif /* SELECTABLE_VIEWS */

/* openwin_view.c */
extern  void                openwin_create_initial_view();
extern  void                openwin_destroy_views();
extern  int             openwin_count_views();
extern Openwin_view_info *openwin_nth_view();
extern  int             openwin_viewdata_for_view();
extern  void                openwin_split_view();
extern  int             openwin_fill_view_gap();
extern  void                openwin_copy_scrollbar();

#endif  /* __openwin_impl_h */
