Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
SampleUtils.c
/* |
File: SampleUtils.c |
Description: |
This file contains a number of utility routines used by this |
sample application. These routines have been moved |
here to a separate file to simplify the example. |
Copyright: |
© Copyright 2000 Apple Computer, Inc. All rights reserved. |
Disclaimer: |
IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. |
("Apple") in consideration of your agreement to the following terms, and your |
use, installation, modification or redistribution of this Apple software |
constitutes acceptance of these terms. If you do not agree with these terms, |
please do not use, install, modify or redistribute this Apple software. |
In consideration of your agreement to abide by the following terms, and subject |
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs |
copyrights in this original Apple software (the "Apple Software"), to use, |
reproduce, modify and redistribute the Apple Software, with or without |
modifications, in source and/or binary forms; provided that if you redistribute |
the Apple Software in its entirety and without modifications, you must retain |
this notice and the following text and disclaimers in all such redistributions of |
the Apple Software. Neither the name, trademarks, service marks or logos of |
Apple Computer, Inc. may be used to endorse or promote products derived from the |
Apple Software without specific prior written permission from Apple. Except as |
expressly stated in this notice, no other rights or licenses, express or implied, |
are granted by Apple herein, including but not limited to any patent rights that |
may be infringed by your derivative works or by other works in which the Apple |
Software may be incorporated. |
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO |
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED |
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN |
COMBINATION WITH YOUR PRODUCTS. |
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR |
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION |
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT |
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN |
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
Change History (most recent first): |
Tue, Feb 8, 2000 -- created |
*/ |
#include "SampleUtils.h" |
#include <string.h> |
#ifdef __APPLE_CC__ |
#include <Carbon/Carbon.h> |
#else |
#include <Carbon.h> |
#endif |
/* SetWindowStandardStateSize sets the window's standard state rectangle |
to a rectangle of the size suggested in the width and height parameters. |
In the end, it may set the standard size to something smaller than the |
width and height parameters so the entire window remains visible. The |
standard rectangle is also centered on the main screen. The window's |
standard state rectangle is used by ZoomWindow whenever when it |
is called with the inZoomOut partcode. */ |
void SetWindowStandardStateSize(WindowPtr window, short width, short height) { |
Rect standard, stdRect, global, device, c, s, diffs; |
RgnHandle tempRgn; |
GDHandle theDevice; |
CGrafPtr wport; |
Point origin; |
/* make the window's port the current port */ |
wport = GetWindowPort(window); |
SetPort(wport); |
SetPt(&origin, 0, 0); |
LocalToGlobal(&origin); |
/* find the window's global coordinates */ |
GetPortBounds(wport, &global); |
OffsetRect(&global, origin.h, origin.v); |
/* get the maximum intersecting screen */ |
theDevice = GetMaxDevice(&global); |
device = (**theDevice).gdRect; |
/* if it's the main screen, adjust it for the menu bar height */ |
if (theDevice == GetMainDevice()) |
device.top += GetMBarHeight(); |
/* calculate the difference between the window's content rectangle and its frame */ |
tempRgn = NewRgn(); |
GetWindowRegion(window, kWindowContentRgn, tempRgn); |
GetRegionBounds(tempRgn, &c); |
GetWindowRegion(window, kWindowStructureRgn, tempRgn); |
GetRegionBounds(tempRgn, &s); |
DisposeRgn(tempRgn); |
SetRect(&diffs, c.left - s.left + 2, c.top - s.top + 2, s.right - c.right + 2, s.bottom - c.bottom + 2); |
/* calculate the maximum bounds for the standard rectangle */ |
SetRect(&standard, device.left + diffs.left, device.top + diffs.top, device.right - diffs.right, device.bottom - diffs.bottom); |
/* set up our 'desired' rectangle */ |
SetRect(&stdRect, 0, 0, width, height); |
OffsetRect(&stdRect, standard.left, standard.top); |
/* fit it inside of the maximum allowable rectangle */ |
SectRect(&stdRect, &standard, &stdRect); |
/* center it in the maximum allowable rectangle */ |
OffsetRect(&stdRect, (standard.right - stdRect.right)/2, (standard.bottom - stdRect.bottom)/2); |
/* set the standard state rectangle */ |
SetWindowStandardState(window, &stdRect); |
} |
#include <StdIO.h> |
#include <StdArg.h> |
#ifdef __APPLE_CC__ |
#include <Carbon/Carbon.h> |
#else |
#include <Carbon.h> |
#endif |
/* GetApplicationFolder returns the volume reference number and |
directory id of the folder containing the application. */ |
OSStatus GetApplicationFolder(FSSpec *spec) { |
OSStatus err; |
FCBPBRec fcpb; |
Str255 name; |
CInfoPBRec cat; |
Handle h; |
h = GetResource('vTeZ', 0); |
if (h == NULL) return resNotFound; |
memset(&fcpb, 0, sizeof(fcpb)); |
fcpb.ioVRefNum = 0; |
fcpb.ioNamePtr = name; |
fcpb.ioFCBParID = 0; |
fcpb.ioRefNum = HomeResFile(h); |
fcpb.ioFCBIndx = 0; |
if ((err = PBGetFCBInfoSync(&fcpb)) != noErr) return err; |
memset(&cat, 0, sizeof(cat)); |
cat.dirInfo.ioNamePtr = name; |
cat.dirInfo.ioVRefNum = fcpb.ioFCBVRefNum; |
cat.dirInfo.ioFDirIndex = -1; |
cat.dirInfo.ioDrDirID = fcpb.ioFCBParID; |
err = PBGetCatInfoSync(&cat); |
if (err != noErr) return err; |
err = FSMakeFSSpec(fcpb.ioFCBVRefNum, cat.dirInfo.ioDrParID, name, spec); |
if (err != noErr) return err; |
return noErr; |
} |
/* DrawGrowIconWithoutScrollLines draws the grow icon in the bottom |
right corner of the frontmost window without drawing the scroll bar |
lines. It does this by setting the clip region to the bottom right corner |
before calling DrawGrowIcon. */ |
void DrawGrowIconWithoutScrollLines(WindowPtr window) { |
RgnHandle clip; |
CGrafPtr wport; |
Rect r = { 0, 0, 16, 16 }, pbox; |
/* set the window to the current port */ |
wport = GetWindowPort(window); |
SetPort(wport); |
GetPortBounds(wport, &pbox); |
/* save the old clipping region */ |
clip = NewRgn(); |
if (clip == NULL) return; |
GetClip(clip); |
/* set the clipping region to the bottom right corner of the window */ |
OffsetRect(&r, pbox.right-15, pbox.bottom-15); |
ClipRect(&r); |
/* draw the grow icon */ |
DrawGrowIcon(window); |
SetPort(wport); |
SetClip(clip); |
DisposeRgn(clip); |
} |
/* GrayOutBox grays out an area of the screen in the current grafport. |
*theBox is in local coordinates in the current grafport. This routine |
is for direct screen drawing only. */ |
void GrayOutBox(Rect *theBox) { |
long response; |
Rect globalBox; |
GDHandle maxDevice; |
RGBColor rgbWhite = {0xFFFF, 0xFFFF, 0xFFFF}, rgbBlack = {0, 0, 0}, sForground, sBackground; |
PenState penSave; |
Pattern qdgray, qdblack; |
/* save the current drawing state */ |
GetPenState(&penSave); |
/* if no color quickdraw, fail...*/ |
if (Gestalt(gestaltQuickdrawVersion, &response) != noErr) response = 0; |
if (response >= gestalt8BitQD) { |
/* get the device for the rectangle */ |
globalBox = *theBox; |
LocalToGlobal((Point*) &globalBox.top); |
LocalToGlobal((Point*) &globalBox.bottom); |
maxDevice = GetMaxDevice(&globalBox); |
if (maxDevice != NULL) { |
/* calculate the best gray */ |
if ( GetGray(maxDevice, &rgbWhite, &rgbBlack)) { |
/* draw over the area in gray using addMax transfer mode */ |
GetForeColor(&sForground); |
GetBackColor(&sBackground); |
RGBForeColor(&rgbBlack); |
RGBBackColor(&rgbWhite); |
PenMode(addMax); |
PenPat(GetQDGlobalsBlack(&qdblack)); |
PaintRect(theBox); |
RGBForeColor(&sForground); |
RGBBackColor(&sBackground); |
/* restore the pen state and leave */ |
SetPenState(&penSave); |
return; |
} |
} |
} |
/* fall through to using the gray pattern */ |
GetQDGlobalsGray(&qdgray); |
PenPat(&qdgray); |
PenMode(notPatBic); |
PaintRect(theBox); |
SetPenState(&penSave); |
} |
/* RgnUnionRect adds the rectangle into the region. This routine works |
by creating a temporary rectangular region equivalent to srcRect |
and then calling UnionRgn. It's purpose is simply to stand in as a |
shorthand for that sequence of calls. */ |
void RgnUnionRect(RgnHandle theRegion, Rect* srcRect) { |
RgnHandle temp; |
temp = NewRgn(); |
RectRgn(temp, srcRect); |
UnionRgn(theRegion, temp, theRegion); |
DisposeRgn(temp); |
} |
/* SetScrollBarCursor sets the cursor according to the mouse position |
over a scroll bar. If the cursor is over the scroll bar, then the routine |
will return true and it will set the region mouseRgn to a region where |
the mouse should remain as it has been set. This region will be in global |
coordinates suitable for passing to WaitNextEvent in the mouse region |
parameter. */ |
Boolean SetScrollBarCursor(ControlHandle scrollBar, Point where, RgnHandle mouseRgn) { |
Rect bounds; |
GetControlBounds(scrollBar, &bounds); |
if (PtInRect(where, &bounds)) { |
RgnHandle temp; |
temp = NewRgn(); |
GetControlRegion(scrollBar, kControlIndicatorPart, temp); |
if (PtInRgn(where, temp)) { |
CopyRgn(temp, mouseRgn); |
SetThemeCursor(kThemeOpenHandCursor); |
} else { |
RectRgn(mouseRgn, &bounds); |
XorRgn(mouseRgn, temp, mouseRgn); |
SetThemeCursor(kThemePointingHandCursor); |
} |
DisposeRgn(temp); |
return true; |
} else return false; |
} |
/* GetMenuBarRegion sets the region mBarRgn to the global coordinates |
of the menu bar. */ |
void GetMenuBarRegion(RgnHandle mBarRgn) { |
GDHandle mainDevice; |
Rect bounds; |
mainDevice = GetMainDevice(); |
bounds = (**mainDevice).gdRect; |
bounds.bottom = bounds.top + GetMBarHeight(); |
RectRgn(mBarRgn, &bounds); |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-30