/* 
 * FontSBP.h
 *
 * (c) Copyright 1991-1994 Adobe Systems Incorporated.
 * All rights reserved.
 * 
 * Permission to use, copy, modify, distribute, and sublicense this software
 * and its documentation for any purpose and without fee is hereby granted,
 * provided that the above copyright notices appear in all copies and that
 * both those copyright notices and this permission notice appear in
 * supporting documentation and that the name of Adobe Systems Incorporated
 * not be used in advertising or publicity pertaining to distribution of the
 * software without specific, written prior permission.  No trademark license
 * to use the Adobe trademarks is hereby granted.  If the Adobe trademark
 * "Display PostScript"(tm) is used to describe this software, its
 * functionality or for any other purpose, such use shall be limited to a
 * statement that this software works in conjunction with the Display
 * PostScript system.  Proper trademark attribution to reflect Adobe's
 * ownership of the trademark shall be given whenever any such reference to
 * the Display PostScript system is made.
 * 
 * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
 * ANY PURPOSE.  IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
 * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NON- INFRINGEMENT OF THIRD PARTY RIGHTS.  IN NO EVENT SHALL ADOBE BE LIABLE
 * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  ADOBE WILL NOT
 * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
 * 
 * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
 * Incorporated which may be registered in certain jurisdictions
 * 
 * Author:  Adobe Systems Incorporated
 */
/* $XFree86$ */

#ifndef _FontSelectionBoxP_H
#define _FontSelectionBoxP_H

#include <DPS/FontSB.h>

/* Typedefs used in private fields */

#define MAX_AXES 4
#define MAX_BLENDS 16	/* = 2**MAX_AXES */

typedef struct _BlendRec {
    char *blend_name;
    char *font_name;
    XmString CS_blend_name;
    XmString CS_space_blend_name;
    float data[MAX_AXES];
    struct _BlendRec *next;
} BlendRec;

typedef struct {
    int num_axes, num_designs;
    int min[MAX_AXES], max[MAX_AXES];
    String name[MAX_AXES];
    int internal_points[MAX_AXES];
    int *internal_break[MAX_AXES];
    float *internal_value[MAX_AXES];
    float *design_positions;
    BlendRec *blends;
} BlendDataRec;

typedef struct _FontRec {
    char *font_name;
    char *face_name;
    XmString CS_face_name;
    char *full_name;
    Boolean resident;
    Boolean temp_resident;
    struct _FontRec *pending_delete_next;
    struct _FontRec *next;
    int blend_count;
    Boolean in_font_creator;
    BlendDataRec *blend_data;
} FontRec;

typedef struct _FontFamilyRec {
    char *family_name;
    char *sort_key;
    FontRec *fonts;
    int font_count;
    struct _FontFamilyRec *next;
    int blend_count;
} FontFamilyRec;

typedef struct {
    DPSContext context;
    String preview_string;
    float *sizes;
    int size_count;
    String default_resource_path;
    String resource_path_override;
    String font_name;
    String font_family;
    String font_face;
    float font_size;
    Boolean use_font_name;
    Boolean font_name_multiple;
    Boolean font_family_multiple;
    Boolean font_face_multiple;
    Boolean font_size_multiple;
    Boolean get_server_fonts;
    Boolean get_afm;
    Boolean auto_preview;
    Boolean preview_on_change;
    Boolean undef_unused_fonts;
    Boolean make_fonts_shared;
    Boolean show_sampler;
    Boolean show_sampler_button;
    Cardinal max_pending_deletes;
    XtCallbackList ok_callback;
    XtCallbackList apply_callback;
    XtCallbackList reset_callback;
    XtCallbackList cancel_callback;
    XtCallbackList validate_callback;
    XtCallbackList face_select_callback;
    XtCallbackList create_sampler_callback;
    Widget pane_child;
    Widget preview_child;
    Widget panel_child;
    Widget family_label_child;
    Widget family_multiple_label_child;
    Widget family_scrolled_list_child;
    Widget face_label_child;
    Widget face_multiple_label_child;
    Widget face_scrolled_list_child;
    Widget size_label_child;
    Widget size_text_field_child;
    Widget size_option_menu_child;
    Widget size_multiple_label_child;
    Widget sampler_button_child;
    Widget preview_button_child;
    Widget separator_child;
    Widget ok_button_child;
    Widget apply_button_child;
    Widget reset_button_child;
    Widget cancel_button_child;

 /* Private fields */

    DPSGState gstate;
    Widget other_size;
    Widget size_menu;
    Widget sampler;
    FontFamilyRec *known_families;
    int family_count;
    Boolean preview_fixed;
    Boolean current_family_multiple, current_face_multiple;
    Boolean current_size_multiple;
    FontRec *pending_delete_font;
    int pending_delete_count;
    FontRec *currently_previewed;
    FontRec *currently_selected_face;
    FontFamilyRec *currently_selected_family;
    float currently_previewed_size;
    float currently_selected_size;

 /* New resource fields */

    String font_blend;
    Boolean typographic_sort;
    XtCallbackList create_creator_callback;
    XtCallbackList value_changed_callback;
    Widget multiple_master_button_child;

 /* New private fields */

    Widget creator, creator_shell;
    BlendRec *currently_previewed_blend;
    BlendRec *currently_selected_blend;
    Boolean blends_changed;
    Boolean old_server;
} FontSelectionBoxPart;

typedef struct _FontSelectionBoxRec {
    CorePart			core;
    CompositePart		composite;
    ConstraintPart		constraint;
    XmManagerPart		manager;
    FontSelectionBoxPart	fsb;
} FontSelectionBoxRec;

#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif

/* Note use of Bool and double in prototypes:  this makes the library
   work correctly when linked with no-prototype compiled objects */

typedef void (*FSBSetFontNameProc) (Widget w,
				    String font_name,
				    Bool font_name_multiple);

typedef void (*FSBSetFontFamilyFaceProc) (Widget w,
					  String font_family,
					  String font_face,
					  Bool font_family_multiple,
					  Bool font_face_multiple);

typedef void (*FSBSetFontSizeProc) (Widget w,
				    double font_size,
				    Bool font_size_multiple);

typedef void (*FSBRefreshFontListProc) (Widget w);

typedef void (*FSBGetFamilyListProc) (Widget w, int *count_return,
				      String **family_return);

typedef void (*FSBGetFaceListProc) (Widget w, String family, int *count_return,
				    String **face_return,
				    String **font_return);

typedef void (*FSBUndefUnusedFontsProc) (Widget w);

typedef Boolean (*FSBDownloadFontNameProc) (Widget w, String font_name);

typedef Boolean (*FSBMatchFontFaceProc) (Widget w, String old_face,
					 String new_family, String *new_face);

typedef void (*FSBFontNameToFamilyFaceProc) (Widget w, String font_name,
					     String *family, String *face);

typedef void (*FSBFontFamilyFaceToNameProc) (Widget w, String family,
					     String face, String *font_name);

typedef String (*FSBFindAFMProc) (Widget w, String font_name);

typedef String (*FSBFindFontFileProc) (Widget w, String font_name);

typedef void (*FSBGetTextDimensionsProc) (Widget w, String text, String font,
					  double size, double x, double y,
					  float *dx, float *dy,
					  float *left, float *right,
					  float *top, float *bottom);

typedef void (*FSBSetFontFamilyFaceBlendProc) (Widget w,
					       String font_family,
					       String font_face,
					       String font_blend,
					       Bool font_family_multiple,
					       Bool font_face_multiple);
typedef void (*FSBFontNameToFamilyFaceBlendProc) (Widget w, String font_name,
						  String *family, String *face,
						  String *blend);
typedef void (*FSBFontFamilyFaceBlendToNameProc) (Widget w, String family,
						  String face, String blend,
						  String *font_name);
typedef void (*FSBGetBlendListProc) (Widget w, String name,
				     int *count_return, String **blend_return,
				     String **font_name_return,
				     float **axis_values_return);
typedef void (*FSBGetBlendInfoProc) (Widget w, String name,
				     int *num_axes_return,
				     int *num_designs_return,
				     String **axis_names_return, 
				     float **blend_positions_return,
				     int **blend_map_count_return,
				     int **blend_design_coords_return,
				     float **blend_normalized_coords_return);
typedef Boolean (*FSBChangeBlendsProc) (Widget w, String base_name,
					String blend_name,
					FSBBlendAction action,
					int *axis_values,
					float *axis_percents);
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif

#define InheritSetFontName ((FSBSetFontNameProc) _XtInherit)
#define InheritSetFontFamilyFace ((FSBSetFontFamilyFaceProc) _XtInherit)
#define InheritSetFontSize ((FSBSetFontSizeProc) _XtInherit)
#define InheritRefreshFontList ((FSBRefreshFontListProc) _XtInherit)
#define InheritGetFamilyList ((FSBGetFamilyListProc) _XtInherit)
#define InheritGetFaceList ((FSBGetFaceListProc) _XtInherit)
#define InheritUndefUnusedFonts ((FSBUndefUnusedFontsProc) _XtInherit)
#define InheritDownloadFontName ((FSBDownloadFontNameProc) _XtInherit)
#define InheritMatchFontFace ((FSBMatchFontFaceProc) _XtInherit)
#define InheritFontNameToFamilyFace ((FSBFontNameToFamilyFaceProc) _XtInherit)
#define InheritFontFamilyFaceToName ((FSBFontFamilyFaceToNameProc) _XtInherit)
#define InheritFindAFM ((FSBFindAFMProc) _XtInherit)
#define InheritFindFontFile ((FSBFindFontFileProc) _XtInherit)
#define InheritGetTextDimensions ((FSBGetTextDimensionsProc) _XtInherit)
#define InheritSetFontFamilyFaceBlend \
	((FSBSetFontFamilyFaceBlendProc) _XtInherit)
#define InheritFontNameToFamilyFaceBlend  \
	((FSBFontNameToFamilyFaceBlendProc) _XtInherit)
#define InheritFontFamilyFaceBlendToName \
	((FSBFontFamilyFaceBlendToNameProc) _XtInherit)
#define InheritGetBlendList ((FSBGetBlendListProc) _XtInherit)
#define InheritGetBlendInfo ((FSBGetBlendInfoProc) _XtInherit)
#define InheritChangeBlends ((FSBChangeBlendsProc) _XtInherit)

typedef struct {
    FSBSetFontNameProc		set_font_name;
    FSBSetFontFamilyFaceProc	set_font_family_face;
    FSBSetFontSizeProc		set_font_size;
    FSBRefreshFontListProc	refresh_font_list;
    FSBGetFamilyListProc	get_family_list;
    FSBGetFaceListProc		get_face_list;
    FSBUndefUnusedFontsProc	undef_unused_fonts;
    FSBDownloadFontNameProc	download_font_name;
    FSBMatchFontFaceProc	match_font_face;
    FSBFontNameToFamilyFaceProc font_name_to_family_face;
    FSBFontFamilyFaceToNameProc font_family_face_to_name;
    FSBFindAFMProc		find_afm;
    FSBFindFontFileProc		find_font_file;
    FSBGetTextDimensionsProc	get_text_dimensions;
    FSBSetFontFamilyFaceBlendProc	set_font_family_face_blend;
    FSBFontNameToFamilyFaceBlendProc	font_name_to_family_face_blend;
    FSBFontFamilyFaceBlendToNameProc	font_family_face_blend_to_name;
    FSBGetBlendListProc		get_blend_list;
    FSBGetBlendInfoProc		get_blend_info;
    FSBChangeBlendsProc		change_blends;
    XtPointer			extension;
} FontSelectionBoxClassPart;

typedef struct _FontSelectionBoxClassRec {
    CoreClassPart		core_class;
    CompositeClassPart		composite_class;
    ConstraintClassPart		constraint_class;
    XmManagerClassPart		manager_class;
    FontSelectionBoxClassPart	fsb_class;
} FontSelectionBoxClassRec, *FontSelectionBoxWidgetClass;

extern FontSelectionBoxClassRec fontSelectionBoxClassRec;

#endif /* _FontSelectionBoxP_H */
/* DON'T ADD ANYTHING AFTER THIS #endif */
