home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer) / NeXT_Developer-3.3.iso / NextDeveloper / Examples / AppKit / Draw / Graphic.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-09  |  9.8 KB  |  331 lines

  1. @class GraphicView;
  2.  
  3. #define KNOB_DY_ONCE  0x1
  4. #define KNOB_DY_TWICE 0x2
  5. #define KNOB_DX_ONCE  0x4
  6. #define KNOB_DX_TWICE 0x8
  7.  
  8. /* corners */
  9.  
  10. #define LOWER_LEFT    (0x10)
  11. #define LEFT_SIDE    (KNOB_DY_ONCE)
  12. #define UPPER_LEFT    (LEFT_SIDE|KNOB_DY_TWICE)
  13. #define TOP_SIDE    (UPPER_LEFT|KNOB_DX_ONCE)
  14. #define UPPER_RIGHT    (TOP_SIDE|KNOB_DX_TWICE)
  15. #define BOTTOM_SIDE    (KNOB_DX_ONCE)
  16. #define LOWER_RIGHT    (BOTTOM_SIDE|KNOB_DX_TWICE)
  17. #define RIGHT_SIDE    (LOWER_RIGHT|KNOB_DY_ONCE)
  18.  
  19. /* special corner which means upper right, but also note that we're creating */
  20.  
  21. #define CREATE        (0x20)
  22.  
  23. /* corner mask values */
  24.  
  25. #define LOWER_LEFT_MASK        (1 << LOWER_LEFT)
  26. #define LEFT_SIDE_MASK        (1 << LEFT_SIDE)
  27. #define UPPER_LEFT_MASK        (1 << UPPER_LEFT)
  28. #define TOP_SIDE_MASK        (1 << TOP_SIDE)
  29. #define UPPER_RIGHT_MASK    (1 << UPPER_RIGHT)
  30. #define BOTTOM_SIDE_MASK    (1 << BOTTOM_SIDE)
  31. #define LOWER_RIGHT_MASK    (1 << LOWER_RIGHT)
  32. #define RIGHT_SIDE_MASK        (1 << RIGHT_SIDE)
  33. #define ALL_CORNERS        0xffffffff
  34.  
  35. /* arrows */
  36.  
  37. #define ARROW_AT_START    1
  38. #define ARROW_AT_END    2
  39. #define ARROW_AT_BOTH    3
  40.  
  41. /* Fills - These must match up with the order in the PopUpList in the Inspector Panel */
  42.  
  43. #define FILL_NONE    0
  44. #define FILL_EO        1
  45. #define FILL_NZWR    2
  46.  
  47. extern id CrossCursor;
  48.  
  49. @interface Graphic : Object
  50. {
  51.     NXRect bounds;            /* the bounds */
  52.     float linewidth;            /* linewidth */
  53.     struct _gFlags {
  54. #ifdef __BIG_ENDIAN__
  55.     unsigned int selected:1;    /* whether selected */
  56.     unsigned int active:1;        /* whether to really draw in draw: */
  57.     unsigned int eofill:1;        /* whether eofilled */
  58.     unsigned int fillColorSet:1;    /* whether to put frame around fill */
  59.     unsigned int downhill:1;    /* Line: direction line goes */
  60.     unsigned int initialized:1;    /* subclass specific */
  61.     unsigned int linewidthSet:1;    /* used when archiving only */
  62.     unsigned int lineColorSet:1;    /* used when archiving only */
  63.     unsigned int linejoin:2;    /* line join */
  64.     unsigned int linecap:2;        /* line cap */
  65.     unsigned int fill:1;        /* whether filled */
  66.     unsigned int locked:1;        /* locked down? */
  67.     unsigned int arrow:2;        /* arrow position */
  68.     unsigned int nooutline:1;    /* whether the graphic is outlined */
  69.     unsigned int isFormEntry:1;    /* whether the graphic is a form entry (TextGraphic only) */
  70.     unsigned int localizeFormEntry:1; /* whether to localize a form entry (TextGraphic only) */
  71.     unsigned int mightBeLinked:1;    /* set if Graphic has ever had a link associated with it */
  72.     unsigned int padding:12;
  73. #else
  74.     unsigned int padding:12;
  75.     unsigned int mightBeLinked:1;    /* set if Graphic has ever had a link associated with it */
  76.     unsigned int localizeFormEntry:1; /* whether to localize a form entry (TextGraphic only) */
  77.     unsigned int isFormEntry:1;    /* whether the graphic is a form entry (TextGraphic only) */
  78.     unsigned int nooutline:1;    /* whether the graphic is outlined */
  79.     unsigned int arrow:2;        /* arrow position */
  80.     unsigned int locked:1;        /* locked down? */
  81.     unsigned int fill:1;        /* whether filled */
  82.     unsigned int linecap:2;        /* line cap */
  83.     unsigned int linejoin:2;    /* line join */
  84.     unsigned int lineColorSet:1;    /* used when archiving only */
  85.     unsigned int linewidthSet:1;    /* used when archiving only */
  86.     unsigned int initialized:1;    /* subclass specific */
  87.     unsigned int downhill:1;    /* Line: direction line goes */
  88.     unsigned int fillColorSet:1;    /* whether to put frame around fill */
  89.     unsigned int eofill:1;        /* whether eofilled */
  90.     unsigned int active:1;        /* whether to really draw in draw: */
  91.     unsigned int selected:1;    /* whether selected */
  92. #endif
  93.     } gFlags;
  94.     NXColor *lineColor;
  95.     NXColor *fillColor;
  96.     int identifier;            /* unique identifier */
  97. }
  98.  
  99. /* Factory methods */
  100.  
  101. + showFastKnobFills;
  102. + initialize;
  103. + (BOOL)isEditable;
  104. + cursor;
  105.  
  106. + (int)currentGraphicIdentifier;
  107. + updateCurrentGraphicIdentifier:(int)newMaxIdentifier;
  108.  
  109. /* Initialization method */
  110.  
  111. - init;
  112.  
  113. /* Called when a GraphicView is unarchived */
  114.  
  115. - awake;
  116.  
  117. /* Private methods (for subclassers only) */
  118.  
  119. - setGraphicsState;
  120. - setLineColor;
  121. - setFillColor;
  122. - (int)cornerMask;
  123.  
  124. /* Data link methods */
  125.  
  126. - setLink:(NXDataLink *)aLink;
  127. - (NXDataLink *)link;
  128. - (Graphic *)graphicLinkedBy:(NXDataLink *)aLink;
  129. - reviveLink:(NXDataLinkManager *)linkManager;
  130. - (NXSelection *)selection;
  131. - (BOOL)mightBeLinked;
  132. - readLinkFromPasteboard:(Pasteboard *)pboard usingManager:(NXDataLinkManager *)linkManager useNewIdentifier:(BOOL)useNewIdentifier;
  133.  
  134. /* Notification from GraphicView */
  135.  
  136. - wasRemovedFrom:(GraphicView *)sender;
  137. - wasAddedTo:(GraphicView *)sender;
  138.  
  139. /* Methods for uniquely identifying a Graphic. */
  140.  
  141. - resetIdentifier;
  142. - (int)identifier;
  143. - writeIdentifierTo:(char *)buffer;
  144. - (Graphic *)graphicIdentifiedBy:(int)anIdentifier;
  145.  
  146. /* Event handling */
  147.  
  148. - (BOOL)handleEvent:(NXEvent *)event at:(const NXPoint *)p inView:(View *)view;
  149.  
  150. /* Number of Graphics this Graphic represents (1 for non-Group). */
  151.  
  152. - (int)graphicCount;
  153.  
  154. /* Public routines (called mostly by a GraphicView or subclassers). */
  155.  
  156. - (const char *)title;
  157. - (BOOL)isSelected;
  158. - (BOOL)isActive;
  159. - (BOOL)isLocked;
  160. - select;
  161. - deselect;
  162. - activate;
  163. - deactivate;
  164. - lock;
  165. - unlock;
  166.  
  167. - (BOOL)isFormEntry;
  168. - setFormEntry:(int)flag;
  169. - (BOOL)hasFormEntries;
  170. - (BOOL)writeFormEntryToStream:(NXStream *)stream;
  171.  
  172. - setCacheable:(BOOL)flag;
  173. - (BOOL)isCacheable;
  174.  
  175. - getBounds:(NXRect *)theRect;
  176. - setBounds:(const NXRect *)aRect;
  177. - (NXRect *)getExtendedBounds:(NXRect *)theRect;
  178.  
  179. - (int)knobHit:(const NXPoint *)point;
  180.  
  181. - draw:(const NXRect *)rect;
  182.  
  183. - (BOOL)canEmitEPS;
  184. - (BOOL)canEmitTIFF;
  185.  
  186. - moveLeftEdgeTo:(const NXCoord *)x;
  187. - moveRightEdgeTo:(const NXCoord *)x;
  188. - moveTopEdgeTo:(const NXCoord *)y;
  189. - moveBottomEdgeTo:(const NXCoord *)y;
  190. - moveHorizontalCenterTo:(const NXCoord *)x;
  191. - moveVerticalCenterTo:(const NXCoord *)y;
  192. - moveBaselineTo:(const NXCoord *)y;
  193. - (NXCoord)baseline;
  194.  
  195. - moveBy:(const NXPoint *)offset;
  196. - moveTo:(const NXPoint *)p;
  197. - centerAt:(const NXPoint *)center;
  198. - sizeTo:(const NXSize *)size;
  199. - sizeToNaturalAspectRatio;
  200. - alignToGrid:(GraphicView *)graphicView;
  201. - sizeToGrid:(GraphicView *)graphicView;
  202.  
  203. /* Compatibility methods */
  204.  
  205. - replaceWithImage;
  206.  
  207. /* Public routines (called mostly by inspectors and the like). */
  208.  
  209. - setLineWidth:(const float *)value;
  210. - (float)lineWidth;
  211. - setLineColor:(const NXColor *)color;
  212. - (Graphic *)colorAcceptorAt:(const NXPoint *)point;
  213. - (NXColor)lineColor;
  214. - setFillColor:(const NXColor *)color;
  215. - (NXColor)fillColor;
  216. - changeFont:sender;
  217. - (Font *)font;
  218. - setGray:(const float *)value;
  219. - (float)gray;
  220. - setFill:(int)mode;
  221. - (int)fill;
  222. - setOutlined:(BOOL)outlinedFlag;
  223. - (BOOL)isOutlined;
  224. - setLineCap:(int)capValue;
  225. - (int)lineCap;
  226. - setLineArrow:(int)arrowValue;
  227. - (int)lineArrow;
  228. - setLineJoin:(int)joinValue;
  229. - (int)lineJoin;
  230.  
  231. /* Archiving (must be overridden by subclasses with instance variables) */
  232.  
  233. - write:(NXTypedStream *)stream;
  234. - read:(NXTypedStream *)stream;
  235.  
  236. /* Routines intended to be subclassed for different types of Graphics. */
  237.  
  238. /*
  239.  * Can be overridden to provide more sophisticated size constraining
  240.  * than an aspect ratio (though that is almost always sufficient).
  241.  * For example, Line overrides this to constrain to closes 15 degree angle.
  242.  * constrainByDefault says whether constraining is the default or not for
  243.  * the receiving kind of Graphic.
  244.  */
  245.  
  246. - (BOOL)constrainByDefault;
  247. - constrainCorner:(int)corner toAspectRatio:(float)aspect;
  248.  
  249. /*
  250.  * Can be overridden to resize the Graphic differently than the
  251.  * default (which is to drag out the bounds), or to do something
  252.  * before and/or after the subclass is resized.  This is called
  253.  * during the default creation method as well (create:in:).
  254.  */
  255.  
  256. - resize:(NXEvent *)event by:(int)corner in:(GraphicView *)view;
  257.  
  258. /*
  259.  * Possible override candidate for different types of Graphics.
  260.  * Should return YES if the Graphic got created okay.
  261.  * The most common need to override this method is if the creation
  262.  * of the Graphic requires multiple mouseUps and mouseDowns (for
  263.  * an arbitrary arc, for example).
  264.  */
  265.  
  266. - (BOOL)create:(NXEvent *)event in:(GraphicView *)view;
  267.  
  268. /*
  269.  * Override hit: if you want your subclass to only get selected when the
  270.  * mouse goes down in certain parts of the bounds (not the whole bounds).
  271.  * e.g. Lines only get selected if you click close to them.
  272.  */
  273.  
  274. - (BOOL)hit:(const NXPoint *)point;
  275.  
  276. /*
  277.  * Returns YES if this Graphic can't be seen through.
  278.  * Default behaviour is to return YES if the Graphic isFilled.
  279.  */
  280.  
  281. - (BOOL)isOpaque;
  282.  
  283. /*
  284.  * Returns YES if the Graphic is properly formed (usually this just
  285.  * refers to whether it is big enough to be a real graphic during creation).
  286.  * This is called by create:in:.  By default it returns YES if the Graphic
  287.  * is at least 10.0 by 10.0 pixels in size.
  288.  */
  289.  
  290. - (BOOL)isValid;
  291.  
  292. /*
  293.  * This is the Graphic's natural aspect ratio.  If it doesn't have a natural
  294.  * aspect ratio, then this method should return zero (the default return).
  295.  */
  296.  
  297. - (float)naturalAspectRatio;
  298.  
  299. /*
  300.  * Called repeatedly as the user drags the mouse to create or resize
  301.  * the Graphic.  The default implementation does the right thing.
  302.  * The specified corner should be moved to the specified point.
  303.  */
  304.  
  305. - (int)moveCorner:(int)corner to:(const NXPoint *)point constrain:(BOOL)flag;
  306.  
  307. /*
  308.  * This routine actually draws the graphic.  It should be draw to fit the
  309.  * bounds instance variable.  Be sure to use all the parameters listed in
  310.  * the instance variable list (e.g. linewidth, fillgray, etc.) that are
  311.  * appropriate to this object.  It is probably a good idea to do a newpath
  312.  * and a closepath at the beginning and the end of draw.
  313.  * If a sublcass just wants to draw a unit-sized version of itself
  314.  * (i.e. it draws itself in a bounding box of {{0.0,0.0},{1.0,1.0}})
  315.  * it can just override unitDraw (and not draw).
  316.  */
  317.  
  318. - unitDraw;
  319. - draw;
  320.  
  321. /*
  322.  * Should return YES iff the Graphic can be "edited."  It is up to the
  323.  * subclass of Graphic to determine what this means for it.  Usually
  324.  * it means that it has text and allows that text to be edited by the
  325.  * user (e.g. TextGraphic).  Default is to do nothing and return NO.
  326.  */
  327.  
  328. - (BOOL)edit:(NXEvent *)event in:(View *)view;
  329.  
  330. @end
  331.