This is DPFontPanel.m in view mode; [Download] [Up]
/* This file has been modified by Rohit Khare, 10/31/94 */ /* * Copyright (c) 1992 Athena Design, Inc. and David Pollak * * ALL RIGHTS RESERVED * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the company (Athena Design) nor the names of its * employees may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY ATHENA DESIGN ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL ATHENA DESIGN BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #import "DPFontPanel.h" #import "FontWell.h" #import "ENXCP.h" #import <appkit/Window.h> #import <appkit/View.h> #import <appkit/Application.h> #import <libc.h> #import <appkit/FontManager.h> #import <appkit/NXBrowser.h> #import <appkit/NXBrowserCell.h> #import <appkit/TextField.h> #import <appkit/Font.h> #import <appkit/publicWraps.h> #import <objc/List.h> #import <dpsclient/psops.h> #import <dpsclient/wraps.h> #import <appkit/Panel.h> static id doHitTest(id rootView, const NXPoint *aPoint) { id subviews, subview; int i; NXPoint point; NXRect rect; point = *aPoint; [rootView convertPoint:&point fromView:nil]; [rootView getBounds:&rect]; if (NXMouseInRect(&point, &rect, [rootView isFlipped])) { subviews = [rootView subviews]; for (i = [subviews count] - 1; i >= 0; i--) { subview = [subviews objectAt:i]; if ((subview = doHitTest(subview, aPoint))) return subview; } return rootView; } else return nil; } @implementation DPFontPanel + new { DPFontPanel *dfp; id tid,tid2; NXRect re; dfp = [super new]; tid2 = dfp -> preview; //tid2 = dfp -> current; [tid2 getBounds:&re]; tid = [[FontWell alloc] initFrame:&re]; [tid setAutosizing:NX_WIDTHSIZABLE | NX_HEIGHTSIZABLE]; [tid2 setAutoresizeSubviews:YES]; [tid setFontObj:&(dfp -> selFont)]; [tid setLastPreview:&(dfp -> lastPreview)]; [tid setAction:@selector(changeFont:)]; [tid setAction:NULL]; [tid setTarget:NULL]; [tid2 addSubview:tid]; [tid2 display]; return dfp; } + dragFont:font withEvent:(NXEvent *)ev fromView:view { id imageWindow,localWindow,tv,myView; NXRect windowRect,rect; NXPoint mouseDownPoint,currentPoint,upPoint; int mask; unsigned int hitWindow,wNum; float dx,dy; if ([font matrix] != NX_IDENTITYMATRIX) font = [Font newFont:[font name] size:[font pointSize] matrix:NX_IDENTITYMATRIX]; [[view window] convertBaseToScreen:&(ev -> location)]; // added upPoint initialization to cure dps bug if there was a quick click and no drag upPoint = mouseDownPoint = ev->location; windowRect.origin = ev -> location; windowRect.size.width = windowRect.size.height = 16.0; windowRect.origin.x -= 8.0; windowRect.origin.y -= 8.0; /* create an image window in the same location as our image */ imageWindow = [[Window alloc] initContent:&windowRect style:NX_PLAINSTYLE backing:NX_BUFFERED buttonMask:0 defer:YES]; [imageWindow orderFront:NULL]; PSsetwindowlevel(NX_MAINMENULEVEL + 5,[imageWindow windowNum]); [imageWindow orderWindow:NX_ABOVE relativeTo:0]; rect.origin.x = rect.origin.y = 0.0; rect.size.height = rect.size.width = 16.0; myView = [[View alloc] initFrame:&rect]; [[imageWindow setContentView:myView]free]; [myView lockFocus]; NXSetColor(NX_COLORWHITE); PSrectfill(0.,0.,16.,16.); NXSetColor(NX_COLORBLACK); PSrectstroke(0.,1.,15.,15.); PSmoveto(2,3); [font set]; PSshow("F"); PSflush(); [myView unlockFocus]; [imageWindow flushWindow]; NXPing(); dx = (NX_X(&windowRect) - mouseDownPoint.x); dy = (NX_Y(&windowRect) - mouseDownPoint.y); /* get mouse-dragged events also (and save original mask for later) */ mask = [[view window] addToEventMask:NX_MOUSEDRAGGEDMASK]; do { /* wait for the next important event */ ev = [NXApp getNextEvent:NX_MOUSEDRAGGEDMASK|NX_MOUSEUPMASK]; /* move the window to its new position */ [[view window] convertBaseToScreen:&(ev -> location)]; if (ev->type == NX_MOUSEDRAGGED) upPoint = ev -> location; currentPoint = ev->location; [imageWindow moveTo:(currentPoint.x + dx) :(currentPoint.y + dy)]; /* convert the current mouse location to screen coordinates */ } while (ev->type == NX_MOUSEDRAGGED); /* no longer need mouse dragged events, so reset the event mask */ [[view window] setEventMask:mask]; [[imageWindow orderOut:self] free]; PSWfindownedwindow(upPoint.x,upPoint.y,&mouseDownPoint.x,&mouseDownPoint.y,&hitWindow); if (hitWindow) { NXConvertGlobalToWinNum(hitWindow,&wNum); localWindow = [NXApp findWindow:wNum]; tv = doHitTest([localWindow contentView], &mouseDownPoint); if (tv != view && [tv respondsTo:@selector(acceptFont:atPoint:)]) { [tv acceptFont:font atPoint:&mouseDownPoint]; [[tv window] makeKeyWindow]; } } return self; } - free {return self;} @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.