This is PageScrollView.m in view mode; [Download] [Up]
/* PageScrollView.m * Purpose: A subclass of ScrollView which adds controls to the scroller area. * * You may freely copy, distribute, and reuse the code in this example. * NeXT disclaims any warranty of any kind, expressed or implied, as to its fitness * for any particular use. * */ #import <appkit/Application.h> #import <appkit/Button.h> #import <appkit/ButtonCell.h> #import <dpsclient/psops.h> #import "PageScrollView.h" #define GADGET_HEIGHT 16.0 @implementation PageScrollView : ScrollView /* We need the popup list to be smaller than IB will allow to fit comfortably */ /* into the scroller. */ - setZoomPopUpList: anObject { NXRect aRect; zoomPopUpList = anObject; [zoomPopUpList getFrame: &aRect]; aRect.size.height = GADGET_HEIGHT; [zoomPopUpList setFrame: &aRect]; return self; } /* We need the page form cell to be smaller than IB will allow to fit comfortably */ /* into the scroller */ - setPageForm: anObject { NXRect aRect; pageForm = anObject; [pageForm getFrame: &aRect]; aRect.size.height = GADGET_HEIGHT + 4.0; [pageForm setFrame: &aRect]; return self; } /* We need the page label to be smaller than IB will allow to fit comfortably */ /* into the scroller. */ - setPageLabel: anObject { NXRect aRect; pageLabel = anObject; [pageForm getFrame: &aRect]; aRect.size.height = GADGET_HEIGHT + 2.0; [pageForm setFrame: &aRect]; return self; } - initFrame: (const NXRect *)frameRect { [super initFrame: frameRect]; /* load our gadgets in */ [NXApp loadNibSection: "ScrollerGadgets.nib" owner:self]; /* Add the page up button at the bottom of the vertical scroller */ [self addSubview:pageUpButton]; /* Add the page down button at the bottom of the vertical scroller, */ /* below the page up button */ [self addSubview:pageDownButton]; /* Add the page number cell and it's label */ [self addSubview:pageLabel]; [self addSubview:pageForm]; /* Add the zoom list */ [self addSubview: zoomPopUpList]; /* Now that I've added all my subviews to my ScrollView, free the window */ [[pageUpButton window] free]; return self; } /* - tile * Override the tile method to draw the subviews in the scroll bars correctly. * * From the ScrollView spec sheet: * Tiles the subviews of the ScrollView. You never send a tile message directly, * but you may override it if you need to have the ScrollView manage additional views. * When tile is invoked, it's responsible for sizing each of the subviews of the ScrollView, * including the content view. This is accomplished by sending each of its subviews a * setFrame: message. The width of the vertical scroller and the height of the horizontal * scroller (if present) are set to NX_SCROLLERWIDTH. A tile message is sent whenever * the ScrollView is resized, or a vertical or horizontal scroller is added or removed. * The method invoking tile should then send a display message to the ScrollView. * Returns self. */ - tile { NXRect aRect, ctlRect; float zoom_width, page_label_width, page_cell_width; [super tile]; /* take the zoom popup list & page display into account on the horizontal scroller */ [hScroller getFrame: &aRect]; [zoomPopUpList getFrame: &ctlRect]; zoom_width = ctlRect.size.width; [pageLabel getFrame: &ctlRect]; page_label_width = ctlRect.size.width; [pageForm getFrame: &ctlRect]; page_cell_width = ctlRect.size.width; aRect.size.width -= zoom_width + page_label_width + page_cell_width; [hScroller setFrame: &aRect]; /* position the zoom popup list in the correct place */ aRect.origin.x += aRect.size.width; aRect.size.width = zoom_width; horzScrollerArea = aRect; horzScrollerArea.size.width += page_label_width + page_cell_width; [zoomPopUpList moveTo: aRect.origin.x : aRect.origin.y +1.0]; /* position the page display after the popuplist in the horizontal scroller */ aRect.origin.x += zoom_width; aRect.size.width = page_label_width; [pageLabel moveTo:aRect.origin.x :aRect.origin.y]; aRect.origin.x += page_label_width; aRect.size.width = page_cell_width; [pageForm moveTo: aRect.origin.x :aRect.origin.y]; /* take the page up/down buttons into account on the vertical scroller */ [vScroller getFrame: &aRect]; aRect.size.height -= (2.0 * GADGET_HEIGHT) + 2.0; [vScroller setFrame: &aRect]; /* position the buttons in the correct place */ aRect.origin.y += aRect.size.height; vertScrollerArea = aRect; aRect.size.height = (2.0 * GADGET_HEIGHT) + 2.0; [pageUpButton moveTo:1.0 :aRect.origin.y]; [pageDownButton moveTo:1.0 :aRect.origin.y + GADGET_HEIGHT + 1.0]; return self; } /* We need to override drawSelf to make the background behind the new gadgets */ /* grey instead of the default white */ - drawSelf:(const NXRect *)rects :(int)rectCount { PSsetgray(NX_LTGRAY); NXRectFill(&vertScrollerArea); NXRectFill(&horzScrollerArea); [super drawSelf:rects:rectCount]; return self; } /* This action is connected to the page up/down buttons in the vertical scroller */ - pageButton:sender { fprintf(stderr,"page up/down!\n"); return self; } /* This action is connected to the page formCell in the horizontal scroller */ - pageTo:sender { fprintf(stderr,"move to page!\n"); return self; } /* This action is connected to the zoom popup list in the horizontal scroller */ - zoomTo:sender { fprintf(stderr,"zoom in/out!\n"); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.