home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-05-12 | 25.2 KB | 1,155 lines |
- #import <objc/List.h>
- #import <appkit/Application.h>
- #import <apps/InterfaceBuilder.h>
- #import <appkit/Text.h>
- #import <appkit/TextField.h>
- #import <appkit/Font.h>
- #import <appkit/Matrix.h>
- #import <appkit/Box.h>
- #import <appkit/color.h>
- #import <appkit/drag.h>
-
- #import "misckit/MiscCalendarViewConstants.h"
- #import "misckit/DateDelegateProtocol.h"
- #import "misckit/MiscCalendarView.h"
-
- #import "DateSelectionCell.h"
- #import "MiscCalendarMatrix.h"
-
- typedef struct {
- int xdelta;
- int width;
- const char *value;
- } calHeaders;
-
-
- static calHeaders headerSpecs[] = {
- {0, 17, "S"},
- {16, 19, "M"},
- {17, 17, "T"},
- {16, 20, "W"},
- {18, 17, "T"},
- {18, 17, "F"},
- {17, 17, "S"},
- {-1, -1, ""},
- };
-
- @interface MiscCalendarView (TextDelegate)
-
- - (BOOL)textWillChange:sender;
- - textDidChange:sender;
- - (BOOL)textWillEnd:sender;
- - textDidEnd:sender endChar:(unsigned short)whyEnd;
- - textDidGetKeys:sender isEmpty:(BOOL)flag;
-
- @end
-
- @interface MiscCalendarView (Dragging)
-
- - (NXDragOperation)draggingEntered:(id <NXDraggingInfo>)sender;
- - draggingExited:(id <NXDraggingInfo>)sender;
- - (NXDragOperation)draggingUpdated:(id <NXDraggingInfo>)sender;
- - (BOOL)prepareForDragOperation:(id <NXDraggingInfo>)sender;
- - (BOOL)performDragOperation:(id <NXDraggingInfo>)sender;
- - concludeDragOperation:(id <NXDraggingInfo>)sender;
-
- @end
-
- @interface MiscCalendarView (IBView)
-
- - depositIBColor:(NXColor)aColor at:(NXPoint *)aPoint;
- - acceptsIBColorAt:(NXPoint *)aPoint;
-
- @end
-
- @interface MiscCalendarView (Private)
-
- - _createTextFieldWithFrame:(NXRect *)textFrame
- stringValue:(const char *)aString;
- - _acceptColor:(NXColor)aColor at:(NXPoint *)aPoint;
-
- @end
-
- /* This helps us get rid of unwanted compiler warnings and serves */
- /* no useful purpose */
-
- @protocol FAKEOUTCC
-
- - getInspectorFor:object owner:owner;
- - cellColorMatrix;
-
- @end
-
-
- @implementation MiscCalendarView
-
- - finishUnarchiving
- {
- /* This is called by IB In test interface mode. */
- /* Register a timed-entry to be called right after */
- /* this event-loop to do our final initialization. */
-
- /* only for IB */
-
- const char *pbTypes[] = {NXColorPboardType};
-
- [self registerForDraggedTypes:pbTypes count:1];
- [[self window] registerForDraggedTypes:pbTypes count:1];
-
- if([NXApp conformsTo:@protocol(IB)])
- {
- [self perform:@selector(awakeFromNib)
- with:nil afterDelay:0.01 cancelPrevious:NO];
- }
-
- return self;
- }
-
- - awakeFromNib
- {
- const char *pbTypes[] = {NXColorPboardType};
-
- [self registerForDraggedTypes:pbTypes count:1];
- [[self window] registerForDraggedTypes:pbTypes count:1];
-
- /* Setup standard calendar action method */
-
- [calendarMatrix setAction:@selector(updateDate:)];
- [calendarMatrix setTarget:self];
-
- /* If there is a date delegate, set it */
-
- if (dateDelegate)
- [calendarMatrix setDateDelegate:dateDelegate];
- else
- dateDelegate = [calendarMatrix dateDelegate];
-
- /* If there is an external month field, set its value to */
- /* the month value */
-
- if (monthField && [monthField respondsTo:@selector(setStringValue:)])
- [monthField setStringValue:[[calendarMatrix dateDelegate]
- monthStringValue]];
-
- /* If we are displaying the standard month header, set its value */
- /* to the month */
-
- if (displayMonthHeader)
- [monthSubview setStringValue:[[calendarMatrix dateDelegate]
- monthStringValue]];
-
- /* If there is an external year field, set its value to */
- /* the year value */
-
- if (yearField && [yearField respondsTo:@selector(setIntValue:)])
- [yearField setIntValue:[[calendarMatrix dateDelegate] year]];
-
- /* If we are displaying the standard year header, set its value */
- /* to the year */
-
- if (displayYearHeader)
- [yearSubview setIntValue:[[calendarMatrix dateDelegate]
- year]];
-
- if (displayMonthAndYearHeader)
- {
- [inlineMonthSubview setStringValue:[[calendarMatrix dateDelegate]
- monthStringValue]];
-
- [inlineYearSubview setIntValue:[[calendarMatrix dateDelegate]
- year]];
- }
-
- /* If there is a date field, set its value to the curent date */
-
- if (dateField && [dateField respondsTo:@selector(setStringValue:)])
- [dateField setStringValue:[[calendarMatrix dateDelegate]
- dateStringValue]];
-
- return self;
- }
-
- - initFrame:(const NXRect *)frameRect
- {
- NXRect subViewFrame;
- id newSubview;
- calHeaders *headers;
- const char *pbTypes[] = {NXColorPboardType};
-
- [super initFrame:frameRect];
-
- [self registerForDraggedTypes:pbTypes count:1];
- [[self window] registerForDraggedTypes:pbTypes count:1];
-
- colorDragAndDrop = NO;
-
- /* The list of textfield cells that holds the day of the week */
- /* headings */
-
- dowSubviewList = [[List alloc] init];
-
- displayDOWHeader = YES;
- displayMonthHeader = NO;
- displayYearHeader = NO;
- displayMonthAndYearHeader = NO;
-
- headers = headerSpecs;
-
- /* static view information for day-of-the-week textfield headers */
-
- NXSetRect(&subViewFrame, DEFAULT_MATRIX_XPOS+1, DEFAULT_HEADER_YPOS,
- DEFAULT_MATRIX_WIDTH, DEFAULT_HEADER_HEIGHT);
-
- /* Create the day of the week headers (S, M, T, W...) */
-
- while(headers->xdelta > -1)
- {
- NX_X(&subViewFrame) += headers->xdelta;
- NX_WIDTH(&subViewFrame) = headers->width;
-
- newSubview = [self _createTextFieldWithFrame:&subViewFrame
- stringValue:headers->value];
-
- [dowSubviewList addObject:newSubview];
-
- [self addSubview:newSubview];
-
- headers++;
- }
-
- /* Create the month and year textfield headers */
-
- NXSetRect(&subViewFrame, DEFAULT_MATRIX_XPOS+1, DEFAULT_HEADER_YPOS,
- DEFAULT_MATRIX_WIDTH, DEFAULT_HEADER_HEIGHT);
-
- monthSubview = [self _createTextFieldWithFrame:&subViewFrame
- stringValue:"Month"];
-
- yearSubview = [self _createTextFieldWithFrame:&subViewFrame
- stringValue:"Year"];
-
- [Font setUserFont:[Font newFont:"Helvetica" size:12 style:0
- matrix:NX_FLIPPEDMATRIX]];
-
- [monthSubview setFont:[Font boldSystemFontOfSize:12
- matrix:NX_FLIPPEDMATRIX]];
-
- [yearSubview setFont:[Font boldSystemFontOfSize:12
- matrix:NX_FLIPPEDMATRIX]];
-
- /* Create the month and year textfield headers, where the month */
- /* and year are on the same line */
-
- NXSetRect(&subViewFrame, DEFAULT_MATRIX_XPOS+1, DEFAULT_HEADER_YPOS,
- (int)(DEFAULT_MATRIX_WIDTH/2), DEFAULT_HEADER_HEIGHT);
-
- inlineMonthSubview = [self _createTextFieldWithFrame:&subViewFrame
- stringValue:"Month"];
-
- [inlineMonthSubview setAlignment:NX_LEFTALIGNED];
-
- [inlineMonthSubview setFont:[Font boldSystemFontOfSize:12
- matrix:NX_FLIPPEDMATRIX]];
-
- NXSetRect(&subViewFrame,
- ((DEFAULT_MATRIX_WIDTH - (int)(DEFAULT_MATRIX_WIDTH/2) +
- DEFAULT_MATRIX_XPOS+1)),
- DEFAULT_HEADER_YPOS, (int)(DEFAULT_MATRIX_WIDTH/2),
- DEFAULT_HEADER_HEIGHT);
-
- inlineYearSubview = [self _createTextFieldWithFrame:&subViewFrame
- stringValue:"Year"];
-
- [inlineYearSubview setAlignment:NX_RIGHTALIGNED];
-
- [inlineYearSubview setFont:[Font boldSystemFontOfSize:12
- matrix:NX_FLIPPEDMATRIX]];
-
- /* Create the actual calendar matrix view with the given */
- /* dimensions */
-
- NXSetRect(&subViewFrame, DEFAULT_MATRIX_XPOS, DEFAULT_MATRIX_YPOS,
- DEFAULT_MATRIX_WIDTH, DEFAULT_MATRIX_HEIGHT);
-
- calendarMatrix = [[MiscCalendarMatrix alloc] initFrame:&subViewFrame];
-
- [calendarMatrix setAutosizing:NX_MINYMARGINSIZABLE |
- NX_MAXYMARGINSIZABLE | NX_WIDTHSIZABLE | NX_HEIGHTSIZABLE];
-
- [calendarMatrix setAutosizeCells:YES];
-
- [calendarMatrix setAction:@selector(updateDate:)];
- [calendarMatrix setTarget:self];
-
- if (dateDelegate)
- [calendarMatrix setDateDelegate:dateDelegate];
- else
- dateDelegate = [calendarMatrix dateDelegate];
-
- previousDayCell = [calendarMatrix selectedCell];
-
- /* Added the calendar matrix to our view */
-
- [self addSubview:calendarMatrix];
-
- if (monthField && [monthField respondsTo:@selector(setStringValue:)])
- [monthField setStringValue:[[calendarMatrix dateDelegate]
- monthStringValue]];
-
- if (yearField && [yearField respondsTo:@selector(setIntValue:)])
- [yearField setIntValue:[[calendarMatrix dateDelegate] year]];
-
- if (dateField && [dateField respondsTo:@selector(setStringValue:)])
- [dateField setStringValue:[[calendarMatrix dateDelegate]
- dateStringValue]];
-
- NX_WIDTH(&defaultFrame) = frameRect->size.width;
- NX_HEIGHT(&defaultFrame) = frameRect->size.height;
-
- return self;
- }
-
- - getMinSize:(NXSize *)minSize maxSize:(NXSize *)maxSize from:(int)where
- {
- /* The view is not sizable at this time */
-
- minSize->width = NX_WIDTH(&defaultFrame);
- minSize->height = NX_HEIGHT(&defaultFrame);
-
- maxSize->width = NX_WIDTH(&defaultFrame);
- maxSize->height = NX_HEIGHT(&defaultFrame);
-
- return self;
- }
-
- - calendarMatrix
- {
- return calendarMatrix;
- }
-
- - preserveCellColors:(BOOL)yn
- {
- [calendarMatrix overwriteCellColors:yn];
-
- return self;
- }
-
- - (BOOL)cellColorsPreserved
- {
- return [calendarMatrix cellColorsOverwritten];
- }
-
- - setColorOf:(int)element to:(NXColor)aColor forCellAt:(int)xPos :(int)yPos
- {
- switch (element)
- {
- case MISC_CV_CELLBACKGROUND:
- [calendarMatrix setBackgroundColor:aColor forCellAt:xPos :yPos];
- [calendarMatrix display];
- break;
-
- case MISC_CV_CELLTEXT:
- [calendarMatrix setTextColor:aColor forCellAt:xPos :yPos];
- [calendarMatrix display];
- break;
-
- case MISC_CV_CELLHIGHLIGHT:
- [calendarMatrix setHighlightColor:aColor forCellAt:xPos :yPos];
- [calendarMatrix display];
- break;
-
- case MISC_CV_CELLTEXTHIGHLIGHT:
- [calendarMatrix setHighlightTextColor:aColor forCellAt:xPos :yPos];
- [calendarMatrix display];
- break;
-
- default:
- break;
- }
-
- return self;
- }
-
- - (NXColor)colorOf:(int)element forCellAt:(int)xPos :(int)yPos
- {
- NXColor color;
-
- color = NX_COLORBLACK;
-
- switch (element)
- {
- case MISC_CV_CELLBACKGROUND:
- color = [calendarMatrix backgroundColorForCellAt:xPos :yPos];
- break;
-
- case MISC_CV_CELLTEXT:
- color = [calendarMatrix textColorForCellAt:xPos :yPos];
- break;
-
- case MISC_CV_CELLHIGHLIGHT:
- color = [calendarMatrix highlightColorForCellAt:xPos :yPos];
- break;
-
- case MISC_CV_CELLTEXTHIGHLIGHT:
- color =[calendarMatrix highlightTextColorForCellAt:xPos :yPos];
- break;
-
- default:
- break;
- }
-
- return color;
- }
-
- - setColorOf:(int)element to:(NXColor)aColor
- {
- switch (element)
- {
- case MISC_CV_CELLBACKGROUND:
- [calendarMatrix setCellBackgroundColor:aColor];
- [calendarMatrix display];
- break;
-
- case MISC_CV_CELLTEXT:
- [calendarMatrix setCellTextColor:aColor];
- [calendarMatrix display];
- break;
-
- case MISC_CV_CELLHIGHLIGHT:
- [calendarMatrix setCellHighlightColor:aColor];
- [calendarMatrix display];
- break;
-
- case MISC_CV_CELLTEXTHIGHLIGHT:
- [calendarMatrix setCellHighlightTextColor:aColor];
- [calendarMatrix display];
- break;
-
- case MISC_CV_MONTHHEADER:
- [monthSubview setTextColor:aColor];
- [monthSubview display];
- break;
-
- case MISC_CV_YEARHEADER:
- [yearSubview setTextColor:aColor];
- [yearSubview display];
- break;
-
- case MISC_CV_INLINEMONTHHEADER:
- [inlineMonthSubview setTextColor:aColor];
- [inlineMonthSubview display];
- break;
-
- case MISC_CV_INLINEYEARHEADER:
- [inlineYearSubview setTextColor:aColor];
- [inlineYearSubview display];
- break;
-
- default:
- break;
- }
-
- return self;
- }
-
- - (NXColor)colorOf:(int)element
- {
- NXColor color;
-
- switch (element)
- {
- case MISC_CV_CELLBACKGROUND:
- color = [calendarMatrix cellBackgroundColor];
- break;
-
- case MISC_CV_CELLTEXT:
- color = [calendarMatrix cellTextColor];
- break;
-
- case MISC_CV_CELLHIGHLIGHT:
- color = [calendarMatrix cellHighlightColor];
- break;
-
- case MISC_CV_CELLTEXTHIGHLIGHT:
- color = [calendarMatrix cellHighlightTextColor];
- break;
-
- case MISC_CV_MONTHHEADER:
- color = [monthSubview textColor];
- break;
-
- case MISC_CV_YEARHEADER:
- color = [yearSubview textColor];
- break;
-
- case MISC_CV_INLINEMONTHHEADER:
- color = [inlineMonthSubview textColor];
- break;
-
- case MISC_CV_INLINEYEARHEADER:
- color = [inlineYearSubview textColor];
- break;
-
- default:
- color = NX_COLORBLACK;
- break;
- }
-
- return color;
- }
-
- - cellAt:(int)xPos :(int)yPos lock:(BOOL)yn
- {
- [[calendarMatrix cellAt:xPos :yPos] setEnabled:yn];
-
- return self;
- }
-
- - forRow:(int)row lock:(BOOL)yn
- {
- int i;
-
- for (i = 0; i < NUM_MATRIX_COLS; i++)
- [self cellAt:row :i lock:yn];
-
- return self;
- }
-
- - forColumn:(int)col lock:(BOOL)yn
- {
- int i;
-
- for (i = 0; i < NUM_MATRIX_ROWS; i++)
- [self cellAt:i :col lock:yn];
-
- return self;
- }
-
- - setHighlightMode:(int)mode
- {
- return [calendarMatrix setMode:mode];
- }
-
- - (int)highlightMode
- {
- return [calendarMatrix mode];
- }
-
- - allowColorDragAndDrop:(BOOL)yn
- {
- colorDragAndDrop = yn;
-
- return self;
- }
-
- - (BOOL)canDragAndDropColor
- {
- return colorDragAndDrop;
- }
-
- - forHeader:(int)aHeader display:(BOOL)doDisplay
- {
- int yOffset,
- i;
-
- NX_HEIGHT(&defaultFrame) += doDisplay ? DEFAULT_HEADER_HEIGHT :
- -DEFAULT_HEADER_HEIGHT;
-
- [self sizeBy:0 :(doDisplay ? DEFAULT_HEADER_HEIGHT :
- -DEFAULT_HEADER_HEIGHT)];
-
- yOffset = doDisplay ? DEFAULT_HEADER_HEIGHT :
- -DEFAULT_HEADER_HEIGHT;
-
- switch (aHeader)
- {
- case MISC_CV_DOWHEADER:
- displayDOWHeader = doDisplay;
-
- if (displayMonthAndYearHeader)
- {
- [inlineMonthSubview moveBy:0 :yOffset];
- [inlineYearSubview moveBy:0 :yOffset];
- }
-
- if (displayMonthHeader)
- [monthSubview moveBy:0 :yOffset];
-
- if (displayYearHeader)
- [yearSubview moveBy:0 :yOffset];
-
- if (displayDOWHeader)
- for (i = 0; i < [dowSubviewList count]; i++)
- [self addSubview:[dowSubviewList objectAt:i]];
- else
- for (i = 0; i < [dowSubviewList count]; i++)
- [[dowSubviewList objectAt:i] removeFromSuperview];
-
- break;
-
- case MISC_CV_MONTHANDYEARHEADER:
- displayMonthAndYearHeader = doDisplay;
-
- if (displayYearHeader)
- [yearSubview moveBy:0 :yOffset];
-
- if (displayMonthHeader)
- [monthSubview moveBy:0 :yOffset];
-
- if (displayDOWHeader)
- {
- [inlineMonthSubview moveBy:0 :yOffset];
- [inlineYearSubview moveBy:0 :yOffset];
- }
-
- if (displayMonthAndYearHeader)
- {
- [self addSubview:inlineMonthSubview];
- [self addSubview:inlineYearSubview];
- }
- else
- {
- [inlineMonthSubview removeFromSuperview];
- [inlineYearSubview removeFromSuperview];
- }
-
- break;
-
- case MISC_CV_MONTHHEADER:
- displayMonthHeader = doDisplay;
-
- if (displayYearHeader)
- [yearSubview moveBy:0 :yOffset];
-
- if (displayDOWHeader)
- [monthSubview moveBy:0 :yOffset];
-
- if (displayMonthAndYearHeader)
- [monthSubview moveBy:0 :yOffset];
-
- if (displayMonthHeader)
- [self addSubview:monthSubview];
- else
- [monthSubview removeFromSuperview];
-
- break;
-
- case MISC_CV_YEARHEADER:
- displayYearHeader = doDisplay;
-
- if (displayDOWHeader)
- [yearSubview moveBy:0 :yOffset];
-
- if (displayMonthAndYearHeader)
- [yearSubview moveBy:0 :yOffset];
-
- if (displayMonthHeader)
- [yearSubview moveBy:0 :yOffset];
-
- if (displayYearHeader)
- [self addSubview:yearSubview];
- else
- [yearSubview removeFromSuperview];
-
- break;
-
- default:
- NX_HEIGHT(&defaultFrame) += !doDisplay ? DEFAULT_HEADER_HEIGHT :
- -DEFAULT_HEADER_HEIGHT;
-
- [self sizeBy:0 :(!doDisplay ? DEFAULT_HEADER_HEIGHT :
- -DEFAULT_HEADER_HEIGHT)];
-
- break;
- }
-
- return self;
- }
-
- - (BOOL)isHeaderDisplayed:(int)aHeader;
- {
- switch (aHeader)
- {
- case MISC_CV_DOWHEADER:
- return displayDOWHeader;
- break;
-
- case MISC_CV_MONTHHEADER:
- return displayMonthHeader;
- break;
-
- case MISC_CV_YEARHEADER:
- return displayYearHeader;
- break;
-
- case MISC_CV_MONTHANDYEARHEADER:
- return displayMonthAndYearHeader;
- break;
-
- default:
- return NO;
- }
- }
-
- - setColorTo:(NXColor)aColor forDay:(MiscCVDays)aDay
- {
- return [[[dowSubviewList objectAt:aDay] setTextColor:aColor] display];
- }
-
- - (NXColor)colorForDay:(MiscCVDays)aDay
- {
- return [[dowSubviewList objectAt:aDay] textColor];
- }
-
- - incrementMonth:sender
- {
- id date;
-
- date = [calendarMatrix dateDelegate];
-
- [date incrementMonth];
-
- [self updateDate:self];
-
- previousDayCell = [calendarMatrix selectedCell];
-
- return self;
- }
-
- - decrementMonth:sender
- {
- id date;
-
- date = [calendarMatrix dateDelegate];
-
- [date decrementMonth];
-
- [self updateDate:self];
-
- previousDayCell = [calendarMatrix selectedCell];
-
- return self;
- }
-
- - incrementYear:sender
- {
- id date;
-
- date = [calendarMatrix dateDelegate];
-
- [date incrementYear];
-
- [self updateDate:self];
-
- previousDayCell = [calendarMatrix selectedCell];
-
- return self;
- }
-
- - decrementYear:sender
- {
- id date;
-
- date = [calendarMatrix dateDelegate];
-
- [date decrementYear];
-
- [self updateDate:self];
-
- previousDayCell = [calendarMatrix selectedCell];
-
- return self;
- }
-
- - updateDate:sender
- {
- DateSelectionCell *dayCell;
- id date;
- int day,
- month,
- year;
-
- if (!(dayCell = [calendarMatrix selectedCell]))
- {
- if (previousDayCell)
- [calendarMatrix selectCell:previousDayCell];
-
- return nil;
- }
-
- dayCell = [calendarMatrix selectedCell];
-
- previousDayCell = dayCell;
-
- date = [calendarMatrix dateDelegate];
-
- day = [dayCell intValue];
- month = [date month];
- year = [date year];
-
- [date setYear:year month:month day:day];
-
- [self displayDate:self];
-
- return self;
- }
-
- - displayDate:sender
- {
- if (monthField && [monthField respondsTo:@selector(setStringValue:)])
- [monthField setStringValue:[[calendarMatrix dateDelegate]
- monthStringValue]];
-
- if (displayMonthHeader)
- [monthSubview setStringValue:[[calendarMatrix dateDelegate]
- monthStringValue]];
-
- if (yearField && [yearField respondsTo:@selector(setIntValue:)])
- [yearField setIntValue:[[calendarMatrix dateDelegate] year]];
-
- if (displayYearHeader)
- [yearSubview setIntValue:[[calendarMatrix dateDelegate]
- year]];
-
- if (dateField && [dateField respondsTo:@selector(setStringValue:)])
- [dateField setStringValue:[[calendarMatrix dateDelegate]
- dateStringValue]];
-
- if (displayMonthAndYearHeader)
- {
- [inlineMonthSubview setStringValue:[[calendarMatrix dateDelegate]
- monthStringValue]];
-
- [inlineYearSubview setIntValue:[[calendarMatrix dateDelegate]
- year]];
- }
-
- [calendarMatrix displayDate:sender];
-
- return self;
- }
-
- - setDateDelegate:(id <DateDelegate>)anObject
- {
- dateDelegate = anObject;
-
- return self;
- }
-
- - (id <DateDelegate>)dateDelegate
- {
- return dateDelegate;
- }
-
- - (const char *)getInspectorClassName
- {
- return "MiscCalendarViewInspector";
- }
-
- - (const char *)getEditorClassName
- {
- return "MiscCalendarViewEditor";
- }
-
- - read:(NXTypedStream *)aStream
- {
- float width,
- height;
-
- [super read:aStream];
-
- NXReadTypes(aStream, "fficcccc@@@@@@@@@@@", &width, &height,
- &titleDisplayMode, &displayDOWHeader, &displayMonthHeader,
- &displayYearHeader, &displayMonthAndYearHeader,
- &colorDragAndDrop,
- &calendarMatrix, &monthField, &previousDayCell, &monthSubview,
- &dateDelegate, &yearField, &dateField, &dowSubviewList,
- &yearSubview, &inlineMonthSubview, &inlineYearSubview);
-
- NX_WIDTH(&defaultFrame) = width;
- NX_HEIGHT(&defaultFrame) = height;
-
- return self;
- }
-
- - write:(NXTypedStream *)aStream
- {
- [super write:aStream];
-
- NXWriteTypes(aStream, "fficcccc@@@@@@@@@@@", &(NX_WIDTH(&defaultFrame)),
- &(NX_HEIGHT(&defaultFrame)), &titleDisplayMode,
- &displayDOWHeader, &displayMonthHeader, &displayYearHeader,
- &displayMonthAndYearHeader, &colorDragAndDrop,
- &calendarMatrix, &monthField,
- &previousDayCell, &monthSubview, &dateDelegate, &yearField,
- &dateField, &dowSubviewList, &yearSubview,
- &inlineMonthSubview, &inlineYearSubview);
-
- return self;
- }
-
- @end
-
- @implementation MiscCalendarView (TextDelegate)
-
- - (BOOL)textWillChange:sender
- {
- if (textDelegate && [textDelegate respondsTo:@selector(textWillChange:)])
- return [textDelegate textWillChange:sender];
- else
- return NO;
- }
-
- - textDidChange:sender
- {
- if (textDelegate && [textDelegate respondsTo:@selector(textDidChange:)])
- return [textDelegate textDidChange:sender];
- else
- return self;
- }
-
- - (BOOL)textWillEnd:sender
- {
- if (textDelegate && [textDelegate respondsTo:@selector(textWillEnd:)])
- return [textDelegate textWillEnd:sender];
- else
- return NO;
- }
-
- - textDidEnd:sender endChar:(unsigned short)whyEnd
- {
- id retCode = self;
-
- if (textDelegate && [textDelegate
- respondsTo:@selector(textDidEnd:endChar:)])
- {
- retCode = [textDelegate textDidEnd:sender endChar:whyEnd];
-
- [self updateDate:self];
- }
-
- return retCode;
- }
-
- - textDidGetKeys:sender isEmpty:(BOOL)flag
- {
- if (textDelegate && [textDelegate
- respondsTo:@selector(textDidGetKeys:isEmpty:)])
- return [textDelegate textDidGetKeys:sender isEmpty:flag];
- else
- return self;
- }
-
- @end
-
- @implementation MiscCalendarView (Dragging)
-
- - (NXDragOperation)draggingEntered:(id <NXDraggingInfo>)sender
- {
- NXRect aRect;
- NXPoint mouseLocation;
-
- if (([sender draggingSourceOperationMask] & NX_DragOperationCopy) &&
- colorDragAndDrop)
- {
- NXSetRect(&aRect, DEFAULT_MATRIX_XPOS+1, DEFAULT_HEADER_YPOS,
- DEFAULT_MATRIX_WIDTH, 0);
-
- if (displayDOWHeader)
- NX_HEIGHT(&aRect) += DEFAULT_HEADER_HEIGHT;
-
- if (displayMonthAndYearHeader)
- NX_HEIGHT(&aRect) += DEFAULT_HEADER_HEIGHT;
-
- if (displayMonthHeader)
- NX_HEIGHT(&aRect) += DEFAULT_HEADER_HEIGHT;
-
- if (displayYearHeader)
- NX_HEIGHT(&aRect) += DEFAULT_HEADER_HEIGHT;
-
- mouseLocation = [sender draggingLocation];
-
- [self convertPoint:&mouseLocation toView:self];
-
- if (NXMouseInRect(&mouseLocation, &aRect, NO))
- return NX_DragOperationCopy;
- }
-
- return NX_DragOperationNone;
- }
-
- - draggingExited:(id <NXDraggingInfo>)sender
- {
- return self;
- }
-
- - (NXDragOperation)draggingUpdated:(id <NXDraggingInfo>)sender
- {
- return [self draggingEntered:sender];
- }
-
- - (BOOL)prepareForDragOperation:(id <NXDraggingInfo>)sender
- {
- if ([self draggingEntered:sender] == NX_DragOperationCopy)
- return YES;
-
- return NO;
- }
-
- - (BOOL)performDragOperation:(id <NXDraggingInfo>)sender
- {
- NXColor color;
- NXPoint mouseLocation;
-
- color = NXReadColorFromPasteboard([sender draggingPasteboard]);
-
- mouseLocation = [sender draggingLocation];
-
- if ([self _acceptColor:color at:&mouseLocation])
- return YES;
-
- return NO;
- }
-
- - concludeDragOperation:(id <NXDraggingInfo>)sender
- {
- return self;
- }
-
- @end
-
- /* Satan made me do it! Okay, well, maybe not, but jeez NeXT, if you */
- /* would just publish some of these APIs so us lowly end-user programmer */
- /* could do all the neat things you get to do, ugly rule-breaking hacks */
- /* like this would not happen. sigh.... Anyway, these two methods allow */
- /* my view to accept drag-and-drop color in IB, just like textfield does. */
- /* Thanks to the person who wrote ClassDump and Robert Nicholson for */
- /* helping me find these... */
-
- @implementation MiscCalendarView (IBView)
-
- - depositIBColor:(NXColor)aColor at:(NXPoint *)aPoint
- {
- NXPoint mouseLocation;
- int cellColorSelection;
-
- mouseLocation.x = aPoint->x;
- mouseLocation.y = aPoint->y;
-
- if (![self _acceptColor:aColor at:&mouseLocation])
- {
- cellColorSelection = [[[[NXApp getInspectorFor:self owner:self]
- cellColorMatrix] selectedCell] tag];
-
- [self setColorOf:cellColorSelection to:aColor];
- }
-
- return self;
- }
-
- - acceptsIBColorAt:(NXPoint *)aPoint;
- {
- return self;
- }
-
- @end
-
- @implementation MiscCalendarView (Private)
-
- - _createTextFieldWithFrame:(NXRect *)textFrame
- stringValue:(const char *)aString
- {
- TextField *textField;
-
- textField = [[TextField alloc] initFrame:textFrame];
- [textField setEditable:NO];
- [textField setBezeled:NO];
- [textField setBordered:NO];
- [textField setSelectable:NO];
- [textField setAlignment:NX_CENTERED];
- [textField setBackgroundGray:-1];
-
- [textField setAutosizing:NX_MINYMARGINSIZABLE |
- NX_MAXYMARGINSIZABLE | NX_WIDTHSIZABLE | NX_HEIGHTSIZABLE];
-
- [Font setUserFont:[Font newFont:"Helvetica" size:11 style:0
- matrix:NX_FLIPPEDMATRIX]];
-
- [textField setFont:[Font boldSystemFontOfSize:11
- matrix:NX_FLIPPEDMATRIX]];
-
- [textField setStringValue:aString];
-
- return textField;
- }
-
- - _acceptColor:(NXColor)aColor at:(NXPoint *)aPoint
- {
- TextField *textField;
- NXPoint mouseLocation;
- NXRect aRect;
- int i;
-
- mouseLocation.x = aPoint->x;
- mouseLocation.y = aPoint->y;
-
- textField = nil;
-
- [self convertPoint:&mouseLocation fromView:[self superview]];
-
- if (displayDOWHeader)
- for (i = 0; i < [dowSubviewList count]; i++)
- {
- [[dowSubviewList objectAt:i] getFrame:&aRect];
-
- if (NXMouseInRect(&mouseLocation, &aRect, NO))
- {
- textField = [dowSubviewList objectAt:i];
- i = [dowSubviewList count];
- }
- }
-
- if (!textField && displayMonthAndYearHeader)
- {
- [inlineMonthSubview getFrame:&aRect];
-
- if (NXMouseInRect(&mouseLocation, &aRect, NO))
- textField = inlineMonthSubview;
- }
-
- if (!textField && displayMonthAndYearHeader)
- {
- [inlineYearSubview getFrame:&aRect];
-
- if (NXMouseInRect(&mouseLocation, &aRect, NO))
- textField = inlineYearSubview;
- }
-
- if (!textField && displayMonthHeader)
- {
- [monthSubview getFrame:&aRect];
-
- if (NXMouseInRect(&mouseLocation, &aRect, NO))
- textField = monthSubview;
- }
-
- if (!textField && displayYearHeader)
- {
- [yearSubview getFrame:&aRect];
-
- if (NXMouseInRect(&mouseLocation, &aRect, NO))
- textField = yearSubview;
- }
-
- if (textField)
- {
- [textField setTextColor:aColor];
- return self;
- }
-
- return nil;
- }
-
- @end
-
-