home *** CD-ROM | disk | FTP | other *** search
/ Nebula / nebula.bin / SourceCode / Classes / IconView / IconView.m < prev    next >
Text File  |  1992-04-19  |  8KB  |  432 lines

  1. /* NAME:
  2. **    IconView:View
  3. **
  4. **     COPYRIGHT 1992, BY PLEXUS SOFTWARE
  5. **    ALL RIGHTS RESERVED.
  6. **
  7. ** SOURCE:
  8. **    IconView.m
  9. **     By Jayson Adams, NeXT Developer Support Team
  10. **
  11. ** REVISION HISTORY:
  12. **    92/04/16    Mark Onyschuk    starting point
  13. **
  14. ** DESCRIPTION:
  15. **    IconView is a view which accepts icons dragged from the desktop.
  16. **
  17. */
  18.  
  19.  
  20. #import "CopyIcon.h"
  21. #import "IconView.h"
  22.  
  23.  
  24. /* APPKIT INCLUDES ******************************************************/
  25.  
  26.  
  27. #import <appkit/NXImage.h>
  28.  
  29. #import <appkit/Speaker.h>
  30. #import <appkit/Listener.h>
  31.  
  32. #import <appkit/Application.h>
  33.  
  34. #import <appkit/publicWraps.h>
  35.  
  36.  
  37. /* OTHER INCLUDES *******************************************************/
  38.  
  39.  
  40. #import <stdlib.h>
  41. #import <strings.h>
  42.  
  43. #import <dpsclient/psops.h>
  44. #import <dpsclient/wraps.h>
  45.  
  46.  
  47. /* IMPLEMENTATION *******************************************************/
  48.  
  49.  
  50. @implementation IconView
  51.  
  52. static NXRect fileRect = {{8.0, 8.0}, {48.0, 48.0}};
  53.  
  54.  
  55. /* CONSTRUCTOR, DESTRUCTOR **********************************************/
  56.  
  57.  
  58. /* NAME:
  59. **    - initFrame:(const NXRect *)frameRect;
  60. **
  61. ** DESCRIPTION:
  62. **    Initializes the receiver by allocating an NXImage to contain
  63. **    icon images, and a Listener to listen for mice entering the
  64. **    receiver's parent window.
  65. **
  66. ** RETURNS:
  67. **    self.
  68. */
  69.  
  70. - initFrame:(const NXRect *)frameRect
  71. {
  72.     NXSize myImageSize = {48.0, 48.0};
  73.     
  74.     [super initFrame:frameRect];
  75.     
  76.     myListener = [[Listener alloc] init];
  77.     myImage    = [[NXImage alloc] initSize:&myImageSize];
  78.  
  79.     delegate   = nil;
  80.     
  81.     [self clear];
  82.     return self;
  83. }
  84.  
  85.  
  86.  
  87. /* NAME:
  88. **    - free;
  89. **
  90. ** DESCRIPTION:
  91. **    Frees the NXImage and Listener associated with the receiver.
  92. **
  93. ** RETURNS:
  94. **    nil.
  95. */
  96.  
  97. - free
  98. {
  99.     [myListener free];
  100.     [myImage    free];
  101.     
  102.     return [super free];
  103. }
  104.  
  105.  
  106. /* ACTION METHODS ********************************************************/
  107.  
  108.  
  109. /* NAME:
  110. **    - (BOOL)acceptsFirstMouse;
  111. **
  112. ** DESCRIPTION:
  113. **    Indicates that the receiver accepts mouse-down events.
  114. **
  115. ** RETURNS:
  116. **    YES.
  117. */
  118.  
  119. - (BOOL)acceptsFirstMouse
  120. {
  121.     return YES;
  122. }
  123.  
  124.  
  125.  
  126. /* NAMES:
  127. **    - setDelegate:anObject;
  128. **    - delegate;
  129. **
  130. ** DESCRIPTION:
  131. **    Sets and returns the receiver's delegate.
  132. **
  133. ** RETURNS:
  134. **    self, in the first case.
  135. **
  136. **    the receiver's delegate in the second if a delegate exists, or
  137. **    nil otherwise.
  138. **
  139. */
  140.  
  141. - setDelegate:anObject
  142. {
  143.     delegate = anObject;
  144.     return self;
  145. }
  146.  
  147. - delegate
  148. {
  149.     return delegate;
  150. }
  151.  
  152.  
  153.  
  154. /* NAME:
  155. **    - beginListening;
  156. **
  157. ** DESCRIPTION:
  158. **    Instructs the receiver to initialize its Listener and so, begin
  159. **    allowing the user to drag items into its window.
  160. **
  161. ** RETURNS:
  162. **    self.
  163. */
  164.  
  165. - beginListening
  166. {
  167.     unsigned int myWindowID;
  168.  
  169.     [myListener setDelegate:self];
  170.     [myListener usePrivatePort];
  171.     [myListener addPort];
  172.  
  173.  
  174.     NXConvertWinNumToGlobal([[self window] windowNum], &myWindowID);
  175.  
  176.     
  177.     [[NXApp appSpeaker]    setSendPort:
  178.                 NXPortFromName(NX_WORKSPACEREQUEST, NULL)];
  179.     [[NXApp appSpeaker] registerWindow: myWindowID
  180.                                 toPort: [myListener listenPort]];
  181.  
  182.     return self;
  183. }
  184.  
  185.  
  186. /* NAME:
  187. **    - setFilename:(const char *)fileName andRedraw:(BOOL)redraw;
  188. **
  189. ** DESCRIPTION:
  190. **    Sets the filePath associated with the receiver to <name>.
  191. **    If <redraw> is set to YES, then setFilename attempts to obtain
  192. **    icon information from Workspace Manager. Be sure not to call
  193. **    setFilename with <redraw> set to YES while inside an
  194. **    iconEntered::::::::: or iconDropped::: method.
  195. **
  196. ** OUTLINE:
  197. **    if filePath is not NULL
  198. **        free filePath
  199. **    set it to NULL
  200. **
  201. **    if fileName is NULL
  202. **        clear the image and redraw
  203. **    else
  204. **        get a new image from the Workspace Manager and redraw
  205. **        set filePath to fileName
  206. **      return self
  207. **
  208. ** RETURNS:
  209. **     self.
  210. */
  211.  
  212. - setFilename:(const char *)filename andRedraw:(BOOL)redraw
  213. {
  214.     if(filePath)
  215.         free(filePath);
  216.  
  217.     filePath = NULL;
  218.     
  219.     if(filename == NULL)
  220.     {
  221.     [myImage lockFocus];
  222.     PSsetgray(NX_LTGRAY); NXRectFill(&bounds);
  223.     [myImage unlockFocus];
  224.  
  225.     [self display];
  226.     }
  227.     else
  228.     {
  229.         int      ok,
  230.           length;
  231.     
  232.     char     *tiffData;
  233.     NXStream *imageStream;
  234.     
  235.  
  236.     if(redraw)
  237.     {
  238.         [[NXApp appSpeaker] setSendPort:
  239.                 NXPortFromName(NX_WORKSPACEREQUEST, NULL)];
  240.  
  241.         [[NXApp appSpeaker] getFileIconFor: filename
  242.                                       TIFF: &tiffData
  243.                                 TIFFLength: &length
  244.                                         ok: &ok];
  245.     
  246.         if(!ok)
  247.             return self;
  248.         
  249.         imageStream = NXOpenMemory(tiffData,length,NX_READONLY);
  250.         
  251.         if(!imageStream)
  252.             return self;
  253.  
  254.         [myImage free];
  255.  
  256.         myImage = [[NXImage alloc] initFromStream:imageStream];
  257.  
  258.         NXClose(imageStream);
  259.  
  260.         [self display];
  261.     }
  262.     
  263.     filePath = (char *)malloc(sizeof(char) * (strlen(filename) + 1));
  264.     strcpy(filePath, filename);
  265.     }
  266.     
  267.     return self;
  268. }
  269.  
  270.  
  271.  
  272. /* NAME:
  273. **    - (const char *)filename;
  274. **
  275. ** DESCRIPTION:
  276. **    Reports the filename associated with the receiver. Multiple files
  277. **    are returned as a tab-separated list of pathnames.
  278. **
  279. ** RETURNS:
  280. **    filename associated with the receiver, or
  281. **    null if the receiver is empty.
  282. */
  283.  
  284. - (const char *)filename
  285. {
  286.     return filePath;
  287. }
  288.  
  289.  
  290.  
  291. /* NAME:
  292. **    - clear;
  293. **
  294. ** DESCRIPTION:
  295. **    Clears <myImage> and sets <filePath> to NULL, then redisplays the
  296. **    receiver.
  297. **
  298. ** RETURNS:
  299. **    self.
  300. */
  301.  
  302. - clear
  303. {
  304.     [self setFilename: NULL
  305.             andRedraw: YES];
  306.  
  307.     return self;
  308. }
  309.  
  310.  
  311. /* PRIVATE METHODS *****************************************************/
  312.  
  313.  
  314. /* NAME:
  315. **    - takeIconFromWindow:(int)windowNumber
  316. **                        :(float)x :(float)y
  317. **                :(float)width :(float)height;
  318. **
  319. ** DESCRIPTION:
  320. **    Copies the icon from the window numbered <windowNumber> at
  321. **    coordinates <x>, <y>, <width>, <height>, into <myImage>, then
  322. **    redisplays the receiver.
  323. **
  324. ** RETURNS:
  325. **     self.
  326. */
  327.  
  328. - takeIconFromWindow:(int)windowNumber
  329.                     :(float)x :(float)y
  330.             :(float)width :(float)height
  331. {
  332.     [myImage lockFocus];
  333.     copyIconPicture(windowNumber, x, y, width, height);
  334.     [myImage unlockFocus];
  335.     
  336.     [self display];
  337.     return self;
  338. }
  339.  
  340.  
  341.  
  342. /* NAME:
  343. **    - mouseDown:(NXEvent *)theEvent;
  344. **
  345. ** RETURNS:
  346. **    self.
  347. */
  348.     
  349. - mouseDown:(NXEvent *)theEvent
  350. {
  351.     if(filePath)
  352.     [self    dragFile: filePath
  353.          fromRect: &fileRect
  354.         slideBack: YES
  355.             event: theEvent];
  356.  
  357.     return self;
  358. }
  359.  
  360.  
  361.  
  362. /* NAME:
  363. **    - drawSelf:(NXRect *)rects :(int)rectCount;
  364. **
  365. ** RETURNS:
  366. **    self.
  367. */
  368.  
  369. - drawSelf:(NXRect *)rects :(int)rectCount
  370. {    
  371.     NXDrawGrayBezel(&bounds, NULL);
  372.     [myImage composite:NX_SOVER toPoint:&(fileRect.origin)];
  373.     
  374.     return self;
  375. }
  376.  
  377.  
  378. /* LISTENER DELEGATE METHODS *******************************************/
  379.  
  380.  
  381. -  (int)iconEntered: (int)windowNum
  382.  
  383.                  at: (double)x
  384.             : (double)y
  385.  
  386.          iconWindow: (int)iconWindowNum
  387.     
  388.           iconX: (double)iconX
  389.           iconY: (double)iconY
  390.           iconWidth: (double)iconWidth
  391.       iconHeight: (double)iconHeight
  392.  
  393.            pathList: (char *)pathList;
  394. {
  395.     /* Here we don't redraw to avoid deadlock where the Workspace Manager
  396.     ** waits to hear back from us while we wait to hear back from it.
  397.     */
  398.     
  399.     [self setFilename: pathList
  400.             andRedraw: NO];
  401.        
  402.        
  403.     [self takeIconFromWindow: iconWindowNum
  404.                     : (float)iconX
  405.                 : (float)iconY
  406.                 : (float)iconWidth
  407.                 : (float)iconHeight];
  408.     
  409.     return 0;
  410. }
  411.  
  412.  
  413. - (int)iconReleasedAt: (double)x
  414.                      : (double)y
  415.              
  416.            ok: (int*)flag;
  417. {
  418.     if([delegate respondsTo:@selector(willAcceptIcon:ok:)])
  419.     {  
  420.     [delegate willAcceptIcon:self ok:flag];
  421.     
  422.     if(!*flag)
  423.         [self setFilename: NULL
  424.                 andRedraw: YES];
  425.     }
  426.     else
  427.         *flag = 1;
  428.  
  429.     return 0;
  430. }
  431.  
  432. @end