\begindata{text,538429080} \textdsversion{12} \template{default} \define{programexample menu:[Region,ProgramExample] attr:[Justification LeftJustified Point 0] attr:[FontFamily Helvetica Int 0]} \define{itemize menu:[Region,Itemize] attr:[LeftMargin LeftMargin Inch 32768]} \define{enumerate menu:[Region,Enumerate] attr:[LeftMargin LeftMargin Inch 32768]} \define{notetotypesetter menu:[Region,NoteToTypesetter] attr:[Flags PassThru Int Set]} \define{title menu:[Heading,Title] attr:[Justification Centered Point 0] attr:[FontSize PreviousFontSize Point 4]} \define{appendix menu:[Heading,Appendix] attr:[FontFace Bold Int Set] attr:[FontSize PreviousFontSize Point 4]} \define{ibm menu:[Font,IBM] attr:[FontFamily ibm Int 0]} \define{centre menu:[Region,Centre] attr:[Justification Centered Point 0]} \define{passthrough menu:[Region,Passthrough] attr:[Flags PassThru Int Set]} \define{sans menu:[Font,Sans] attr:[FontFamily AndySans Int 0] attr:[FontSize PreviousFontSize Point -2]} \define{block menu:[Region,Block] attr:[LeftMargin LeftMargin Inch 81920]} \center{ \bigger{\bigger{\bold{\bigger{\bigger{Chart}} Programming Guide}}} Information Technology Center Carnegie Mellon University TC Peters (3/1/89) 9/6/89 \bold{(c) IBM Corporation 1989}} \begindata{bp,539404616} Version 2 n 0 \enddata{bp,539404616} \view{bpv,539404616,1,0,0} \bold{Preface} This document presents the Concepts and Facilities of the \bold{Chart} class. This class provides interactive views upon data collections via an extensible set of Chart formats. A given collection of data can be displayed in different Chart formats simply by changing the Chart \italic{type}; similarly, Chart \italic{filigree}, such as Titles, Coordinates, Ticks, and Fonts can be changed from their defaults to desired alternatives. Editing facilities provided by the Chart class support both data-entry and Chart styling, as well as facilities for introducing new Chart Presentation classes. The Chart class is a sub-class of the \italic{aptview} class (see the\italic{ Apt Programming Guide} for details regarding built-in Iconification, Help, and other common features). The Chart class provides both a Data-object and a View-object: it supports the standard DataObject and View class operations, such as Read, Write, FullUpdate, ReceiveInputFocus, Update, etc, including the Print operation. As a generic class, it is meant to be used by client-programs to provide a variety of interactive visual interfaces to Charts. \begindata{bp,539405864} Version 2 n 0 \enddata{bp,539405864} \view{bpv,539405864,2,0,0} \bold{Introduction} xxx \begindata{bp,539406344} Version 2 n 0 \enddata{bp,539406344} \view{bpv,539406344,3,0,0} \chapter{1 Concepts} The \bold{Chart} class supports interactive views upon \italic{Charts} of zero or more \italic{Items}. The Chart visual is an optionally bordered rectangle; this area is termed the \italic{Container}. Chart Items are arranged within the Container in various fashions, as specified by the Client-program. \center{ ********************************* * * * * * * * * * * * * * * * * * * CONTAINER * * * * * * * * * * * * * * * * * * * * * * ********************************* }\center{ \begindata{bp,539407688} Version 2 n 0 \enddata{bp,539407688} \view{bpv,539407688,4,0,0}} Although you can set various attributes to tailor the manner in which a Chart and its Items are displayed and manipulated, all have defaults that should yield acceptable formatting. You should begin with the defaults, and subsequently try experimentation with the attributes. (See the first example in the section \italic{Sample Programs}.) Some typical Chart views: \center{ ********************************* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ********************************* } (See the chapter \italic{Sample Programs} for additional Chart visuals.) \begindata{bp,539408312} Version 2 n 0 \enddata{bp,539408312} \view{bpv,539408312,5,0,0} By way of example, the following is a complete program (\italic{\sans{chartx1a}}) employing the Chart class. Its functionality is rather simple: it shows the proportion of houshold income apportioned to several categories. \center{\typewriter{ ************************************** * * * * * * * * * * * * * * * * * * ************************************** }} \sans{\leftindent{ #include <andrewos.h> #include <im.ih> #include <frame.ih> #include <chart.ih> #include <chartv.ih> #include <chartx1a.eh> #define Chart (self->chart_data_object) #define ChartView #define Frame #define Im (self->chart_view_object) (self->frame) (self->im) boolean \ chartx1app__InitializeObject( classID, self ) register struct classheader *classID; register struct chartx1app *self; \{ chartx1app_SetMajorVersion( self, 0 ); chartx1app_SetMinorVersion( self, 0 ); Chart = chart_New(); ChartView = chartv_New(); return TRUE; \} boolean chartx1app__Start( self ) struct chartx1app *self; \{ long status = TRUE; super_Start( self ); if ( Chart && ChartView ) \{ Frame = frame_New(); frame_SetView( Frame, ChartView ); Im = im_Create(NULL); im_SetView( Im, Frame ); chart_SetChartAttribute( Chart, chart_Type( "Pie" ) ); chart_SetChartAttribute( Chart, chart_TitleCaption( "Home Budget" ) ); chart_SetItemAttribute( Chart, chart_CreateItem( Chart, "Mortgage", NULL ), chart_ItemValue( 28 ) ); chart_SetItemAttribute( Chart, chart_CreateItem( Chart, "Food", NULL ), chart_ItemValue( 32 ) ); chart_SetItemAttribute( Chart, chart_CreateItem( Chart, "Insurance", NULL ), chart_ItemValue( 7 ) ); chart_SetItemAttribute( Chart, chart_CreateItem( Chart, "Entertainment", NULL ), chart_ItemValue( 8 ) ); chart_SetItemAttribute( Chart, chart_CreateItem( Chart, "Savings", NULL ), chart_ItemValue( 5 ) ); chart_SetItemAttribute( Chart, chart_CreateItem( Chart, "Education", NULL ), chart_ItemValue( 10 ) ); chart_SetItemAttribute( Chart, chart_CreateItem( Chart, "Vacation", NULL ), chart_ItemValue( 10 ) ); chartv_SetDataObject( ChartView, Chart ); chartv_WantInputFocus( ChartView, ChartView ); return status; \} else \ \{ printf( "ChartX1: Failed to Create objects\\n" ); return FALSE; \} \} }} The attributes are discussed in the sections \italic{Chart Specifications} and \italic{Item Specifications}. Other sections detail usage of interactive programming through \italic{Handlers}, procedures that react to User selection of Items. You can print Charts in various fashions, as detailed in the section on \italic{Printing}. \section{1.1 Data/View Dichotomy} \section{1.2 Data Specifications} \subsection{1.2.1 Chart Data Attributes} The fashion in which Charts are displayed, as well as the nature and format of its Items, is governed by the Specification argument optionally provided when the Chart object is created. (See the \sans{Create} facility, discussed in the chapter \italic{Facilities.}) The syntax of a specification is best shown through an example. Chart is produced through the following specification: This XXXX \begindata{bp,539410952} Version 2 n 0 \enddata{bp,539410952} \view{bpv,539410952,6,0,0} The Specification is composed of macros, each requiring an argument. The argument is sometimes a \italic{symbolic} (eg, \sans{chart_RoundAngle}), sometimes a \italic{numeric value} (eg, the value 3 in \sans{chart_BorderSize}), sometimes a \italic{character-string} (eg, the quoted characters \italic{Production Options} in \sans{chart_TitleCaption}), and sometimes a \italic{procedure-pointer} (eg, \sans{Option_Procedure} in \sans{chart_HitHandler}). Note that all symbolics are prefixed with \sans{ chart_ } to avoid name-clashes within the Client-program. There is no required ordering amongst the items in the Specification structure: it is parsed sequentially, such that a subsequent attribute overrides an earlier conflicting attribute. See chapter \italic{Sample Programs} for more complete examples. The attributes of the Chart and its Items, their defaults and alternatives, are discussed below. (Attributes are listed \italic{alphabetically}, for ease of reference.) \bold{\sans{chart_Datum}} \indent{Any Client-program datum (eg, a scalar or a pointer to a Client-program defined structure). Dynamically accessible via the \sans{SetChartAttribute} and \sans{ChartAttribute} facilities. (Also see the \sans{ItemDatum }attribute, which provides the item-specific data attribute.)} \sans{\bold{chart_FileName}} \indent{For 'stand-alone' (application) usage, the anme of the file in which the Chart Datastream is to be stored.} \bold{\sans{chart_TitleCaption}} \indent{A Chart may contain a \italic{Title}. The Title may be a caption or an Inset. By default, the Title is centered at the top of the Container, within the Container's Border. A Title caption may contain \italic{new-line} characters: the Title then occupies multiple vertical lines. (See \sans{TitlePlacement}.)} \sans{ }\bold{\sans{chart_TitleDataObjectName}} \indent{Instead of a caption, any ATK \italic{inset} can be specified as the substance of a Title. The object name is a character-string.} \bold{\sans{chart_TitleViewObjectName}} \indent{Where a \sans{TitleDataObjectName} is specified, an associated \sans{TitleViewObjectName} may be specified; in the absence of a specified\italic{ }\sans{TitleViewObjectName}, the default \sans{TitleViewObjectName} implied by the \sans{TitleDataObjectName} will be employed.} \sans{\bold{chart_Type}} \indent{The Chart Type attribute, which defaults to \sans{chart_Histogram}, specifies the Chart Presentation class to be employed to display the Chart. This attribute may be re-set dynamically. \indent{\sans{chart_Pie chart_Histogram chart_StackedHistogram chart_EKG chart_Dot chart_Cartesian chart_Polar chart_Map chart_xxx}}} XXX \subsection{1.2.2 Item Data Attributes} \sans{\bold{chart_ItemDatum}} \indent{Each Item has a \italic{Datum} attribute, initialized to Null (zero).} \sans{\bold{chart_ItemName}} \indent{Each Item has a \italic{Name} attribute, initialized to Null (zero). } \sans{\bold{chart_ItemPosition}} \indent{Each Item has a \italic{Position} attribute, indicating its position within the set of Items. The first Item is at Position-1, the nth at Position-n.} \sans{\bold{chart_ItemValue}} \indent{Each Item has a \italic{Value} attribute, initialized to Null (zero), subsequently modified by User interaction. The Values of a Chart's Items comprises the semantics of a Chart.} \section{1.3 View Specifications} \subsection{1.3.1 Chart View Attributes} \sans{\bold{chartv_Arrangement}} \indent{By default, charts are drawn Vertically (eg, Histogram bars are vertical); ...} \sans{\bold{chartv_BackgroundShade}} \indent{...} \bold{\sans{chartv_BorderStyle}} \indent{The Container may be bordered; by default, the border is a \sans{Rectangle}, whose line-width is one. Its style may be specified in various other fashions: \indent{ \sans{chartv_Rectangle} \sans{chartv_Invisible} \sans{chartv_None} \sans{chartv_Roundangle} \sans{chartv_Circle} \sans{chartv_Oval}}} \bold{\sans{chartv_BorderSize}} \indent{Where the \sans{BorderStyle} is other than \sans{None}, the pixel-width of the line may be specified (default is one).} \bold{\sans{chartv_Cursor}} \indent{The cursor for the entire Chart may be specified; the value specified is a single character. If the \sans{CursorFontName} is not specified, the default font is \italic{icon12}. The default cursor is the standard Arrow. Example: \sans{chartv_Cursor( 'E' )}} \bold{\sans{chartv_CursorName}} \indent{The cursor for the entire Chart may be specified; the value specified is one of the standard cursor names -- eg, \sans{Cursor_Arrow}, \sans{Cursor_Gunsight}, etc. If the \sans{CursorFontName} is not specified, the default font is \italic{icon12}. Example: \sans{chartv_CursorName( Cursor_Gunsight )}} \bold{\sans{chartv_CursorFontName}} \indent{The font for the Chart's cursor may be specified. The default font is \italic{icon12}. Example \sans{chartv_CursorFontName( "charticon20" )}} \bold{\sans{chartv_Datum}} \indent{Any Client-program datum (eg, a scalar or a pointer to a Client-program defined structure). Dynamically accessible via the \sans{SetChartAttribute} and \sans{ChartAttribute} facilities. (Also see the \sans{ItemDatum }attribute, which provides the item-specific data attribute.)} \bold{\sans{chartv_HitHandler}} \indent{A Chart may specify a Client-program procedure to be invoked whenever any area within the Container is hit. (See the section \italic{Handlers}.)} \bold{\sans{chartv_ItemBorderStyle}} \indent{Items may be styled with or without Borders; by default, the border is a \sans{Rectangle}, whose line-width is one. Borders may be one of the styles: \indent{\sans{chartv_Rectangle} \sans{chartv_Invisible} \sans{chartv_None} \sans{chartv_Roundangle} \sans{chartv_Circle} \sans{chartv_Oval}} }\bold{\sans{chartv_ItemBorderSize}} \indent{Where the \sans{ItemBorderStyle} is other than \sans{None}, the pixel-width of the line may be specified (default is one).} \bold{\sans{chartv_ItemHighlightStyle}} \indent{Items may be highlighted, either upon User selection or through Client-program request. The styles for Highlighting, which may be used in combination, are: \indent{\sans{chartv_Invert} \sans{chartv_Border} \sans{chartv_Bold} \sans{chartv_Italic}} To combine several styles, the syntax is -\sans{chartv_ItemHighlightStyle( chartv_Bold | chartv_Italic)}} \bold{\sans{chartv_LabelFontName}} \indent{The font used to display Labels may be specified. By default, the \sans{LabelFontName} is that specified via the preference for "bodyfont"} \ \bold{\sans{chartv_ScaleFontName}} \indent{The font used to display Scales may be specified. By default, the \sans{ScaleFontName} is that specified via the preference for "bodyfont"} \ \bold{\sans{chartv_TitleBorderStyle}} \indent{The Title may be bordered; by default, the border is Invisible. Its style may instead be specified in other fashions: \indent{ \sans{chartv_Rectangle} \sans{chartv_Invisible} \sans{chartv_None} \sans{chartv_Roundangle} \sans{chartv_Circle} \sans{chartv_Oval}}} \bold{\sans{chartv_TitleBorderSize}} \indent{Where the \sans{TitleBorderStyle} is not \sans{Invisible}, the pixel-width of the line (default is one) may be specified.} \bold{\sans{chartv_TitleCaptionFontName}} \indent{Given a Title that is a Caption, its font may be specified. By default, the \sans{TitleCaptionFontName} is that specified via the preference for "bodyfont"} \ \bold{\sans{chartv_TitleDataObjectHandler}} \indent{A \sans{procedure} may be specified to be associated with the Title Data-object. That procedure is invoked upon instantiation of the object.} \bold{\sans{chartv_TitleHighlightStyle}} \indent{Titles may be highlighted, either upon User selection or through Client-program request. The styles for Highlighting, which may be used in combination, are: \indent{\sans{chartv_Invert} \sans{chartv_Border} \sans{chartv_Bold} \sans{chartv_Italic}}} \bold{\sans{chartv_TitleHitHandler}} \indent{A Chart may specify a Client-program \sans{procedure} to be invoked whenever the Chart \italic{Title} transitions from un-selected to selected. (See below, \italic{Handlers}.)} \bold{\sans{chartv_TitlePlacement}} \indent{The Title may be placed at the \ \indent{\sans{chartv_Top} \sans{chartv_Bottom} \sans{chartv_Left} \sans{chartv_Right} \sans{chartv_Line} }\ of the Container. The Title can be separated from the Item-area by a dividing line.} \bold{\sans{chartv_TitleViewObjectHandler}} \indent{A \sans{procedure} may be specified to be associated with the Title View-object. That procedure is invoked upon instantiation of the object.} \subsection{1.3.2 Item View Attributes} \section{1.4 Handlers} Whereas the Chart class provides appropriate housekeeeping to reflect User interaction with a Chart through its view, it is the Client-program's Handlers (also known as "call-back procedures") that effect whatever functionality such interaction implies. There are various interactions and events that will cause a Handler to be invoked. There are two kinds of Handlers: those that cope with Hits and those that deal with Titles, etc, specified as Objects (ie, not simply Captions). \subsection{1.4.1 Hit Handlers} Upon invocation, a Hit Handler is passed these arguments: \indent{\bold{Argument-1:} The Client-program Anchor associated with the Chart View (as provided via the \sans{chartv_Create} facility). \bold{Argument-2:} Identifier of the Chart View-object. \bold{Argument-3:} Identifier of the object hit. \bold{Argument-4:} Hit-object type (\sans{chartv_ItemObject}, \sans{chartv_TitlteObject}, or \sans{Null}) \bold{Arguments 5-8:} Standard ATK Mouse inchartation -- action, x, y, clicks.} Thus, a typical Hit Handler would be written: \indent{\sans{My_Hit_Handler( self, chart, object, object-type, action, x, y, clicks )}} (The parameter \sans{self} is the value specified as the \italic{Anchor} by the Client-program via \sans{chartv_Create}.) Note that all mouse-actions (including DownMovement) are passed through to the HitHandler, whether or not an Item or Title is affected. \subsection{1.4.2 Object Handlers} Handlers may specified to deal with instantiation of Title Data and View objects. ... \ Upon invocation, an Object Handler is passed these arguments: \indent{\bold{Argument-1:} The Anchor associated with the Chart. \bold{Argument-2:} Identifier of the Chart. \bold{Argument 3:} Identifier of the object \bold{Argument 4:} Object-type (\sans{chartv_TitleObject} or Null). } Thus, a typical Object Handler would be written: \sans{\indent{My_Object_Handler( self, chart, item, type )}} \section{1.5 Printing} Printed output is in PostScript chart. xxx \begindata{bp,539442536} Version 2 n 0 \enddata{bp,539442536} \view{bpv,539442536,7,0,0} \chapter{2 Facilities} Facilities are ClassProcedures, Methods, or MacroMethods provided by a Class to facilitate communication between an object and its creator. There are two groups of facilities: those for the Chart itself, and those for the Items of the Chart. The facilities are presented in a standard chart: A brief \italic{\bold{description}}\bold{ }of the facility, followed by these topics -\italic{\bold{Synopsis }} arguments. \italic{\bold{Returns}} returned. Prototype statement syntax and data-types of Data-type and description of value \italic{\bold{Exceptions}} Name of any exceptions raised. \italic{\bold{Discussion}} its role and usage. Elaboration of the nature of the facility, \bold{Syntax Conventions} To provide examples of their usage, both sample statements and a chapter of Sample Programs are listed; these are shown in the syntax of the ATK \italic{Class} extension. Of particular interest are certain implications upon naming-conventions and required arguments: \description{\indent{ o The ATK Class feature requires methods to be prefixed with the name of the Class to which they belong. Further, it requires that the first argument always be the Identifier (handle or pointer) of the instantiated Object being invoked. Thus -\sans{\bold{\indent{chart_SetChartAttribute( \italic{object}, chart_TitleCaption( \italic{title} ) );}}} \indent{ where : \sans{\bold{object}} is the Identifier of the instance of the Class (as returned from the \sans{chart_Create} facility); \sans{\bold{title}} is a pointer to a character-string} }}\indent{ o }\description{\indent{All symbolic-names (eg, those of the options and exception-codes) are prefixed with the character "chart_" or "chartv_" to preclude name-clashes with Client-program names.}} \section{2.1 Data Object Facilities} \subsection{2.1.1 Object Instantiation} Chart Data-objects are instantiated through either the \sans{Create} or the \sans{New} facility. Where the \sans{Create} facility is employed, you can override the default object attributes. \paragraph{2.1.1.1 Create} Creates an instance of the chart Data-object. Parses the optional Specification to establish initial attributes; reserves the requesting object's Identifier (for subsequent call-backs).. \bold{Synopsis}\block{ \sans{chart_Create( specification, anchor ) chart_Specification specification struct basicobject \bold{Returns}\block{ object identifier.}} *anchor | | NULL NULL}} \sans{struct chart *} \italic{Chart Data- \bold{Exceptions}\block{ \sans{InsufficientSpace, AttributeConflict}} \bold{Discussion}\block{ Chart The \sans{Create} facility establishes a Data-object through an optional Chart Specification. This \sans{specification} argument is a pointer to a vector of symbolics, values, or pointers to values. Such vectors are specified within the Client program through special Chart macros, such as chart_BorderStyle, chart_HitHandler, etc. (See section \italic{Chart Specifications}; also chapter \italic{Sample Programs} for illustrations.) The \sans{anchor} argument is usually the instance-pointer of the object requesting the creation of an Chart object; this argument may be NULL. The Attribute-Names are symbolics, the Attribute-Values are of the data-type appropriate to the specific Attribute. The Attributes and associated Values are discussed in the \italic{Concepts} chapter.} \subsection{2.1.2 Chart Attributes} Chart attributes may be set either at compile-time, through the static declaration of the Specification vector passed as an optional argument to the \sans{Create} facility, or dynamically through the \sans{SetChartAttribute} facility. In most instances, the static fashion suffices. Changing attributes does not result in immediate changes to the Chart display: only upon the next FullUpdate are the changes reflected. There are, however, several facilities provided to effect immediate visual changes for certain attributes. These facilities all have the verbprefix \sans{Change (eg, chart_ChangeTitle).} \paragraph{2.1.2.1 SetChartAttribute} Sets the specifed attribute to the given value. \bold{Synopsis}\block{ \sans{chart_SetChartAttribute( object, attribute_value) struct chart long *object attribute_value}} \bold{Returns}\block{ \sans{long} \italic{ \bold{Exceptions}\block{ None.} Result-code.}} \bold{Discussion}\block{ Each of the attributes listed in the section \italic{Chart Specifications} can be set either statically or dynamically. The syntax for this facility is that employed in the static declaration of attributes, for example -\sans{ chart_SetChartAttribute( object, chart_TitleCaption( "Hourly Weather" ) );} Note that those Attributes that have an impact upon the Chart display do not take effect until either the next FullUpdate or Update request is effected.} \paragraph{2.1.2.2 ChartAttribute} Yields the value of the given Chart attribute. \bold{Synopsis}\block{ \sans{chart_ChartAttribute( object, struct chart long attribute) *object attribute }} \bold{Returns}\block{ \sans{long} \italic{ \bold{Exceptions}\block{ Value.}} None.} \bold{Discussion}\block{ Each of the attributes listed in the section \italic{Chart Specifications} can be queried. The syntax of this facility is similar to that of the \sans{SetChartAttribute} facility, but differs in that the parenthesized argument is 0 (Null) -\sans{chart_ChartAttribute( object, chart_Datum(0) );} } \subsection{2.1.3 Chart Manipulation} These facilities deal with the Chart's entire set of Items. \paragraph{2.1.3.1 Reset} Resets the Chart to its initial state -- in particular, Normalizes and Activates all Items. \bold{Synopsis}\block{ \sans{chart_Reset( object) struct chart *object}} \bold{Returns}\block{ \sans{long} \italic{ \bold{Exceptions}\block{ Result-code.}} None.} \bold{Discussion}\block{ See also: \sans{ chart_Clear}, \sans{chart_ClearItems}, and \sans{chart_DestroyItem}.} \paragraph{2.1.3.2 Apply} Iterates across each of the Chart's \sans{Items}, invoking the given \sans{procedure} for each \sans{Item }in turn. \ \bold{Synopsis}\block{ \sans{chart_Apply( object, procedure, anchor, datum ) struct chart *object long(*)() procedure struct dataobject long *anchor datum}} \bold{Returns}\block{ value.}} \sans{long} \italic{ \bold{Exceptions}\block{ Client returned- \sans{ApplyInterrupte}d} \bold{Discussion}\block{ The \sans{procedure} is invoked with these arguments, in the order shown: \indent{\sans{anchor} \sans{object} \sans{item} Given \sans{anchor}-value Identifier of the Chart object Identifier of present Item \sans{datum} Given \sans{datum}-value} Within the \sans{procedure}, all Chart facilities may be employed; note that alteration of the Chart will affect subsequent invocations to the procedure. The order in which the Items are accessed is that specified when the Chart was created, or the order in which they were dynamically created. The invoked procedure breaks the scan by returning a non-zero value (a zero-value continues the scan); the \sans{Apply} facility returns this value as the scan stops. Where the scan stops because it reaches the end of the Items, Null is returned.} \subsection{2.1.4 Item Attributes} Item attributes may be set either at compile-time, through the static declaration of the Specification vector passed as an optional argument to the \sans{Create} facility, or dynamically through the \sans{SetItemAttribute} facility. In most instances, the static fashion suffices. Changing attributes does not result in immediate changes to the Chart display: only upon the next FullUpdate are the changes reflected. There are, however, several facilities provided to effect immediate visual changes for certain attributes. These facilities all have the verbprefix \sans{Change (eg, chart_ChangeItemCaption).} \paragraph{2.1.4.1 SetItemAttribute} Sets the specifed attribute of the given Item to the given value. \bold{Synopsis}\block{ \sans{chart_SetItemAttribute( object, item, attribute_value) struct chart *object struct chart_item *item chart_Specification }} \bold{Returns}\block{ attribute_value \sans{long} \italic{ \bold{Exceptions}\block{ Result-code.}} None.} \bold{Discussion}\block{ Each of the attributes listed in the section \italic{Item Specifications} can be set either statically or dynamically. The syntax for this facility is that employed in the static declaration of attributes, for example: \sans{\description{chart_SetItemAttribute( object, item, chart_ItemValue( 2351 ) );} } Note that those Attributes that have an impact upon the Chart display do not take effect until either the next FullUpdate or Update request is effected.} \paragraph{2.1.4.2 ItemAttribute} Yields the value of the given attribute for the given Item. \bold{Synopsis}\block{ \sans{chart_ItemAttribute( object, item, attribute) struct chart *object struct chart_item *item long attribute }} \bold{Returns}\block{ \sans{long} \italic{ \bold{Exceptions}\block{ Value.}} None.} \bold{Discussion}\block{ Each of the attributes listed in the section \italic{Item Specifications} can be queried. The syntax of this facility is similar to that of the \sans{SetItemAttribute} facility, but differs in that the parenthesized argument is 0 (Null): \sans{\description{chart_ItemAttribute( object, item, chart_ItemValue(0) );} }} \subsection{2.1.5 Item Identification} Identifiers of individual Items may be obtained through facilities that scan the Item set to locate one that matches a given value. These facilities need only be employed in those instances that a particular Item is to be located -- in most instances, such as HitHandlers, you will find that the identifier of the Item passed to such procedures suffices. Some of the location facilities (eg, \sans{ItemsOfName}) returns a pointer to a null-terminated vector of Item identifiers; others return a Item identifier. \paragraph{2.1.5.1 ItemOfDatum} Yields Identifier of the Item whose Datum attribute matches the given Datum. \bold{Synopsis}\block{ \sans{chart_ItemOfDatum( object, datum ) struct chart long *object datum}} \bold{Returns}\block{ Identifier}} \sans{struct chart_item *} \bold{Exceptions}\block{ \italic{ Item None.} \bold{Discussion}\block{ Where no Item Datum matches the given Datum, the value Null is returned. Where Null Datum is given, the first Item whose Datum is Null is returned.} \paragraph{2.1.5.2 ItemsOfDatum} Yields Identifier(s) of the Item(s) whose Datum attribute matches the given Datum. \bold{Synopsis}\block{ \sans{chart_ItemsOfDatum( object, datum ) struct chart *object long datum}} \bold{Returns}\block{ Identifier vector}} \sans{struct chart_item **} \italic{Item \bold{Exceptions}\block{ None.} \bold{Discussion}\block{ Where no Item Datum matches the given Datum, the value Null is returned. Where Null Datum is given, Items whose Datum is Null are returned.} \paragraph{2.1.5.3 ItemOfName} Yields Identifier of the Item whose Name field matches the given Name. \bold{Synopsis}\block{ \sans{chart_ItemOfName( object, name ) struct chart char *object *name}} \bold{Returns}\block{ Identifier.}} \sans{struct chart_item *} \italic{ Item \bold{Exceptions}\block{ None.} \bold{Discussion}\block{ the Where no Item Name matches the given Name, value Null is returned. Where the Null Name is given, the first Item whose Name is Null is returned.} \paragraph{2.1.5.4 ItemsOfName} Yields Identifier(s) of the Item(s) whose Name field matches the given Name. \bold{Synopsis}\block{ \sans{chart_ItemOfName( object, name ) struct chart char *object *name}} \bold{Returns}\block{ Identifier vector.}} \sans{struct chart_item **} \italic{Item \bold{Exceptions}\block{ None.} \bold{Discussion}\block{ Where no Item Name matches the given Name, the value Null is returned. Where the Null Name is given, Items whose Name is Null are returned.} \subsection{2.1.6 Item Selection} Items are selected by the User through mouse-hits within their borders. In general, control is passed for only for Up-transition mouse-actions; see the \italic{Concepts} discussion regarding \sans{Inclusive} versus \sans{Exclusive} Charts, as well as \sans{ReadWrite} Items. \paragraph{2.1.6.1 HighlightItem} Highlights the given Item, in the HighlightStyle specified. \bold{Synopsis}\block{ \sans{chart_HighlightItem( object, item ) struct chart *object struct chart_item *item \bold{Returns}\block{ code.}} \sans{boolean} \bold{Exceptions}\block{ | NULL}} \italic{Result- \sans{NonExistentItem}} \bold{Discussion}\block{ This method is only employed when the Client-program needs to set an Item's highlight, since the appropriate highlighting is automatically provided by the Chart whenever the User selects that Item.} \paragraph{2.1.6.2 ItemHighlighted} Yields \sans{true} if the given Item is highlighted, otherwise \sans{false}. \bold{Synopsis}\block{ \sans{chart_ItemHighlighted( object, item ) struct chart *object struct chart_Item *item \bold{Returns}\block{ code.}} | NULL}} \sans{boolean} \italic{Result- \bold{Exceptions}\block{ }None. \bold{Discussion}\block{ \sans{false} is returned.} Where the given \sans{Item} is Null, \paragraph{2.1.6.3 NormalizeItem} Normalizes the given Item, with reference to the HighlightStyle specified. \bold{Synopsis}\block{ \sans{chart_NormalizeItem( object, item ) struct chart *object struct chart_item *item \bold{Returns}\block{ code.}} \sans{boolean} \bold{Exceptions}\block{ | NULL}} \italic{Result- \sans{NonExistentItem}} \bold{Discussion}\block{ This method is only employed when the Client-program needs to normalize an Item, since the appropriate normalizing is automatically provided by the Chart's view-mechanism whenever the User de-selects that Item.} \subsection{2.1.7 Exception Handling} All Chart facilities return either a \italic{result-code}, indicating the success or failure of an operation, or a \italic{function value} such as an Item identifier, a scalar, or a pointer. In the charter case, you may test the result-code for success or failure; in the latter, the Null value is returned for exceptional conditions. When an exception is raised, you can use the Exception facilities to determine its nature. You may elect to rely upon the default responses to run-time exceptions or you may specify a procedure to be invoked whenever such conditions are detected. \paragraph{2.1.7.1 SetExceptionHandler} Sets the given procedure as the ExceptionHandler. \bold{Synopsis}\block{ \sans{chart_SetExceptionHandler( object, procedure ) struct chart long(*)() }} \bold{Returns}\block{ *object procedure | NULL \sans{long} \italic{ \bold{Exceptions}\block{ None.} Result-code}} \bold{Discussion}\block{ Where the \sans{procedure} is NULL, reverts to default Exception-handling operation. Upon an exception, the \sans{procedure} is invoked with these arguments: \indent{ \sans{anchor} Chart's Anchor attribute \sans{object} Identifier of the Chart object \sans{item} Identifier of present Item \sans{exception } Numeric-code } Where the \sans{item} argument identifies the Item (if any) for which the exception was raised. The \sans{exception} argument is one of the codes described in the chapter \italic{Problem Determination}. } \paragraph{2.1.7.2 ExceptionCode} Yields the result-code of the most recent exception. \bold{Synopsis}\block{ \sans{chart_ExceptionCode( object,) struct chart *object }} \bold{Returns}\block{ \sans{long} \italic{ \bold{Exceptions}\block{ Result-code}} None.} \bold{Discussion}\block{ The \sans{exception_code} is one of the codes described in the chapter \italic{Problem Determination}. } \paragraph{2.1.7.3 ExceptionItem} Yields the identifier of the Item that suffered the most recent exceptional condition. \bold{Synopsis}\block{ \sans{chart_ExceptionItem( object) struct chart *object }} \bold{Returns}\block{ identifier}} \sans{struct chart_item *} \bold{Exceptions}\block{ None.} \bold{Discussion}\block{ None. \italic{Item } \section{2.2 View Object Facilities} These facilities deal with the Chart View-object. \subsection{2.2.1 Object Instantiation} Chart View-objects are instantiated through either the \sans{Create} or the \sans{New} facility. Where the \sans{Create} facility is employed, you can override the default object attributes. \paragraph{2.2.1.1 Create} Creates an instance of the Chart View-object. Parses the optional Specification to establish initial attributes. \bold{Synopsis}\block{ \sans{chartv_Create( specification, anchor ) chart_Specification specification struct basicobject \bold{Returns}\block{ object identifier.}} *anchor | | NULL}} \sans{struct chartv *} \bold{Exceptions}\block{ NULL \italic{Chart view- \sans{InsufficientSpace, AttributeConflict}} \bold{Discussion}\block{ The \sans{Create} facility establishes a Chart view-object through an optional Chart Specification. This \sans{specification} argument is a pointer to a vector of symbolics, values, or pointers to values. Such vectors are specified within the Client program through special Chart macros, such as chart_BorderStyle, chart_HitHandler, etc. (See section \italic{Chart Specifications}; also chapter \italic{Sample Programs} for illustrations.) The \sans{anchor} argument is usually the instance-pointer of the object requesting the creation of an Chart view-object; this argument may be NULL. The Attribute-Names are symbolics, the Attribute-Values are of the data-type appropriate to the specific Attribute. The Attributes and associated Values are discussed in the \italic{Concepts} chapter.} \subsection{2.2.2 Chart Attributes} \paragraph{2.2.2.1 SetChartAttribute} Sets the specifed attribute to the given value. \bold{Synopsis}\block{ \sans{chartv_SetChartAttribute( object, attribute_value) struct chartv long *object attribute_value}} \bold{Returns}\block{ \sans{long} \italic{ \bold{Exceptions}\block{ Result-code.}} None.} \bold{Discussion}\block{ Each of the attributes listed in the section \italic{Chart View Specifications} can be set either statically or dynamically. The syntax for this facility is that employed in the static declaration of attributes, for example -\sans{ chartv_SetChartAttribute( object, chart_BorderStyle( chartv_Roundangle ) );} Note that those Attributes that have an impact upon the Chart display do not take effect until either the next FullUpdate or Update request is effected.} \paragraph{2.2.2.2 ChartAttribute} Yields the value of the given Chart attribute. \bold{Synopsis}\block{ \sans{chartv_ChartAttribute( object, struct chartv long attribute) *object attribute }} \bold{Returns}\block{ \sans{long} \italic{ \bold{Exceptions}\block{ Value.}} None.} \bold{Discussion}\block{ Each of the attributes listed in the section \italic{Chart View Specifications} can be queried. The syntax of this facility is similar to that of the \sans{SetChartAttribute} facility, but differs in that the parenthesized argument is 0 (Null) -\sans{chart_ChartAttribute( object, chart_HighlightStyle(0) );} } \begindata{bp,539493128} Version 2 n 0 \enddata{bp,539493128} \view{bpv,539493128,8,0,0} \chapter{3 Sample Programs} Rather diverse displays can be developed for Charts. A potpourri to stimulate the imagination: \center{ ********************************* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ********************************* } See \italic{Sample Programs}, following. \begindata{bp,539493944} Version 2 n 0 \enddata{bp,539493944} \view{bpv,539493944,9,0,0} \section{3.1 Simple Chart} Given the program -\sans{void char Flavor_Choice (); *list [] = \{"Vanilla","Strawberry","Chocolate","Grape","Fudge", "Licorice","Caramel","Lemon","Orange", 0 \}; chart_Specification flavors[] = \{ chart_HitHandler (Flavor_Choice), chart_ItemCaptionList ( list ), 0 \}; ClientProcedure () \{ chart_Create ( flavors, self ); \}} this view results (assuming appropriate height and width of the viewing rectangle): \center{ ********************************* * * * * * * * * * * * * * * * * * * * * * * ********************************* } Another sample chart is available here \begindata{link,539845336} Datastream version: 3 $ANDREWDIR/doc/atk/chart/sample.cht 0 0 \begindata{link,539845336} Datastream version: 2 sample 2 black white \enddata{link,539845336} \enddata{link,539845336} \view{linkview,539845336,24,0,0}. \begindata{bp,539495048} Version 2 n 0 \enddata{bp,539495048} \view{bpv,539495048,10,0,0} \chapter{4 Problem Determination} Compile-time problems are usually merely syntactic difficulties, and these would most likely occur in the declaration of a Specification structure vector. That structure is built up through macros, which expect single arguments. In particular, be sure to use Null as the last item in the vector. Run-time problems can occur at several points: \indent{When creating the Chart object; When setting Chart or Item Attributes; Within HitHandlers.} All Chart facilities return either an identifier, a scalar, or a Result-code. Where a Result-code is returned, it should assist you in tracking down the difficulty. Where an identifier or other value is returned, you can still access a exception-code that should aid in problem determination. Such a code, as well as other inchartation, is available through the \sans{Exception} facilities; see the section \italic{Exception Handling}. There is also a built-in tracing feature, used primarily for development. You can turn it on and off via the \sans{SetDebug} facility. \bold{Exception Codes} \sans{NonExistentItem} \sans{InsufficientSpace} \sans{AttributeConflict} xxx \begindata{bp,539496632} Version 2 n 0 \enddata{bp,539496632} \view{bpv,539496632,11,0,0} \chapter{5 Appendices} \section{5.1 Available Chart Classes} The initial set of Chart Presentation classes include: \bold{\sans{chartpie}} Displays data collection as a Pie-chart. outjogged. Specified slices may be \bold{\sans{charthst}} Displays data collection as a Histrogram. \ \bold{\sans{chartdot}} Displays data collection as Dot-chart. Dots may be connected. \bold{\sans{chartstk}} Displays data collection as Stacked-Histogram-chart. \bold{\sans{chartmap}} Displays data collection as Map-chart. \bold{\sans{chartcsn}} Displays data collection as Cartesian-chart. \section{5.2 Extending the Chart Classes} This section need only be read by those who intend to extend the set of \italic{Chart Presentation} classes. None of this material is necessary for those intending only to use the Chart Inset. The Chart classes consists of not only the usual Inset pair DataObject (\sans{chart}) and View(\sans{chartv}) subclasses, but also an extensible set of specialized chart viewers: \sans{chartpie}, \sans{charthst}, \sans{chartdot}, etc., known as \italic{Chart Presentation} classes Additionally, an Application subclass (\sans{charta}) exists to support "stand-alone" operation. Instantiated Chart objects are dynamically related according to this structure: \indent{\sans{ charta chart \ chartpie chartv charthst chartobj chartdot ...}} (In place of \sans{charta}, the Chart Application object, EZ or any other object might stand. Note that this diagram does not represent a \italic{class hierarchy}, except insofaras \sans{chartpie},\sans{ charthst}, and \sans{chartdot} are subclasses of the abstract class \sans{chartobj}.) The \sans{chart }and \sans{chartv} objects comprise the usual Inset pair; \sans{ chartpie}, etc, are instantiated by \sans{chartv} to support each particular type of Chart Presentation. Each Chart Presentation class is a subclass of the \italic{abstract} class \sans{chartobj}. The set \sans{chartpie}, etc, can be augmented by other Chart Presentation classes. The nature of these Chart Presentation classes, their interfaces and their functionality, is covered below. As usual, the abstract class \sans{chartobj} provides \italic{default} procedures for all the facilities required of any Chart Presentation subclass. Implementation of a Chart Presentation class is effected through the usual technique of \italic{overriding} some or all of the methods of the \sans{chartobj} super-class. (Note that the class \sans{chartobj} is itself a subclass of \sans{aptview}, which is in turn a subclass of the standard abstract class \sans{view}; accordingly, methods such as \sans{SetDataObject}, \sans{FullUpdate}, \sans{Hit}, etc, as well as those provided by \sans{aptview --} \sans{PrintObject}, etc -- are not discussed.) A Chart Presentation class depends upon the facilities provided by both the \sans{chartv} and the \sans{chartobj} classes. These classes are designed such that the programming required of each Presentation is minimal. Specifically, a Presentation class is expected to override the following \sans{chartobj} methods -\sans{\leftindent{DrawChart PrintChart HitChart Moniker}} Given all the housekeeping performed by the \sans{chartv} and \sans{chartobj} classes in behalf of Chart Presentation classes, the effort to program a Presentation is confined to the special visuals peculiar to each such class. (Examples such as \sans{charthst} or \sans{chartdot} should be studied.) The information required by a Chart Presentation class is found within its associated Data-object (\sans{chartv} invokes an instantiated Chart Presentation object with the standard \sans{SetDataObject }request to effect this association). Queries issued by the Chart Presentation object to its associated Data-object yield the information needed to determine parameters such as the number of Items, the value of each Item, the Low and High value range for the Item set, etc. Similarly, as the User edits a chart via a Chart Presentation object, the modifications are reflected into the associated Data-object; the Data-object's standard \sans{NotifyObservers} method is called upon at appropriate times. Beyond the specifications obtained from the associated \sans{chart} Data-object, a Chart Presentation object should override various \sans{chartobj} methods to provide appropriate visual support for dynamic customizations such as User-specified fonts, Foreground and Background color, etc. \begindata{bp,539506136} Version 2 n 0 \enddata{bp,539506136} \view{bpv,539506136,12,0,0} By way of example, the chart -\center{\typewriter{ ************************************** * Inches of Rainfall * * * * * * *** 1980 * * * * ******** 1981 * * * * ********************* 1982 * * * ****** 1983 * * * * *********** 1984 * * * * * * ******************** 1985 * * ************************************** }} would be produced by the display class \sans{\bold{charthst}} upon being associated with a Chart Data-object whose specifications were generated through these requests: \indent{\sans{SetChartAttribute( object, Rainfall" ) ) CreateItem( object, "1980", ); CreateItem( object, "1981", ); CreateItem( object, "1982", ); CreateItem( object, "1983", ); CreateItem( object, "1984", ); CreateItem( object, "1985", );}} chart_TitleCaption( "Inches of In the same vein, these same specifications (ie, the same Chart Data-object) could be viewed by the Chart Presentation class \sans{\bold{chartdot}}, with this result -\center{\typewriter{ ************************************** * Inches of Rainfall * * * * * * * * . * . * . * . * * * . * * * . . * * . * . . . . . * . . * * * * * . . * * * * * * * * * * 1980 1981 1982 1983 1984 1985 * * * ************************************** }} Depending upon the semantics of the individual Chart Presentation classes, these particular requests might or might not result in a meaningful display. \begindata{bp,539507912} Version 2 n 0 \enddata{bp,539507912} \view{bpv,539507912,13,0,0} \bold{Chart Presentation Editing} In addition to the requirements that a Chart Presentation class implement both the operations needed to generate a screen visual and those needed to generate the appropriate PrintStream, each such class is required to support \italic{interactive editing} of its associated \sans{chart} Data-object. This requirement is by far the most difficult to meet. There is a \italic{style} for editing Charts. While the following points attempt to describe that style, the best recourse is extensive use and study of those Chart Presentation classes distributed with the system. The intent is to offer the User a homogeneous collection of diverse charting features, each developed according to the \italic{Principle of Least Surprise}. Among other factors, this principle guarantees the User that the techniques learned to work with one Chart Presentation class can be employed to manipulate any other Chart Presentation class. (Developers who ignore this consideration might find their audience considerably diminished.) x \begindata{bp,539508872} Version 2 n 0 \enddata{bp,539508872} \view{bpv,539508872,14,0,0} Copyright 1992 Carnegie Mellon University and IBM. All rights reserved. \smaller{\smaller{$Disclaimer: 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 IBM not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ANY COPYRIGHT HOLDER 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. $ }}\enddata{text,538429080}