// Text of project protoOverview written on 2/19/96 at 9:17 PM
// Beginning of text file constants.f
// Copyright ©1996 by Apple Computer, Inc. All rights reserved.

// total number of items to create
constant kNumItems := 40 ;


// indent for text in the shape displayed in the overview
constant kTextIndent := 5 ;
// End of text file constants.f
// Beginning of file protoOverview.t

// Before Script for "_view000"
// Copyright ©1996 by Apple Computer, Inc. All rights reserved.
nil

_view000 :=
    {title: "protoOverview",
     viewBounds: {left: 0, top: 0, right: 224, bottom: 310},
     viewFormat: 83951953,
     ReorientToScreen: ROM_DefRotateFunc,
     viewSetupFormScript:
       func()
       begin
       	// Resize the app to fill the screen.
       	// This will look very odd on watch-size or whiteboard-sized Newton
       	// devices, but then again this sample isn't exactly useful to a user...
       	local l := GetAppParams() ;
       	self.viewBounds := RelBounds(l.appAreaLeft, l.appAreaTop, l.appAreaWidth, l.appAreaHeight);
       end,
     _proto: @157
    };

theOverview :=
    {viewBounds: {left: 5, top: 20, right: -5, bottom: -25},
     viewFlags: 517,
     viewJustify: 240,
     Abstract:
       // required function
       // returns the shape to show for an individual item in the overview
       func(item,bbox)
       begin
       	// this is the basic form of a displayed item, just some text
       	local result := [MakeText(item.data,
       			bbox.left + kTextIndent, bbox.top, bbox.right,
       			bbox.bottom-8),
       		MakeRect(bbox.left,bbox.top,bbox.right,bbox.bottom)];
       
       	result;
       end,
     viewSetupChildrenScript:
       // Required
       // use SetupAbstracts to setup the pictures shown
       func()
       begin
       	// can get called when a scroll occurs
       	// so clone off the cursor and move
       	// it so that the first item is the
       	// current top of the displayed items
       	local curs := cursor:Clone();
       
       	curs:Reset();
       	curs:Move(topIndex);
       	:SetupAbstracts(curs);
       end,
     HitItem:
       // Required method
       // called when an item is clicked on.
       // NOTE: the hitIndex is relative to the top of the list
       //       i.e., the item at the top is considered to be hitIndex 0.
       //	     This func therefore has to compensate for scrolling.
       func(hitIndex, xcoord, ycoord)
       begin
       	// check if it is a click in the checkbox
       	if xcoord < selectIndent then
       		inherited:HitItem(hitIndex, xcoord, ycoord) ;
       	else begin
       	
       		// check hiliting state
       		if myHilitedIndex <> hitIndex then
       		begin
       			hilitedIndex := hitIndex ;
       			myHilitedIndex := hitIndex ;
       		end ;
       		else begin
       			hilitedIndex := myHilitedIndex := nil ;
       		end;
       		:Dirty();
       
       		// find the actual item hit
       		// i.e., compensate for any scrolling offset
       		local realIndex := hitIndex + topIndex;
       
       		print("hit item" && realIndex & ":" && cursor:GetIndexEntry(realIndex).data);
       	end ;
       end,
     Scroller:
       // Required
       // This method just updates the savedIndex slot that keeps
       // track of the real index of the topmost displayed item.
       //
       // The viewSetupChildrenScript will refresh the display and put 
       // the item with the topIndex at the top of the displayed items.
       func(dir)
       begin
       	local newIndex := Min(Max(topIndex + dir, 0), kNumItems-1);
       	local realDir := topIndex - newIndex ;
       
       	// can get called when the list is at the top or
       	// bottom, so check if we need to do real work
       	if realDir <> 0 then
       	begin
       		// update the index for the item at the top of the display
       		topIndex := newIndex ;
       
       		// update the hilitedIndex if there is one
       		// use my value since protoOverview tends to 
       		// reset the hilitedIndex when not appropriate
       		if myHilitedIndex then
       		begin
       			myHilitedIndex := myHilitedIndex + realDir ;
       			hilitedIndex := myHilitedIndex ;
       		end;		
       
       		// let viewSetupChildrenScript do the work
       		:RedoChildren();
       	end ;
       end,
     cursor:
       // this is the encapsulating cursor object
       // this is required since protoOverivew assumes that a
       // cursor exists.
       // The GetIndexEntry method is optional but very useful.
       {
       	items: nil,
       
       	index: 0,
       
       	Entry: func()
       	begin
       		if index < Length(items) then
       		items[index];
       	end,
       
       	Next: func()
       		if index < Length(items)-1 then
       		begin
       			index := index + 1;
       			items[index];
       		end,
       		
       	Move: func(delta)
       	begin
       		index := Min(Max(index + delta, 0), kNumItems-1) ;
       		items[index];
       	end,
       	
       	Reset: func()
       		index := 0,
       
       	Clone: func()
       		Clone(self),
       		
       	GetIndexEntry: func(theIndex)
       		items[theIndex],
       },
     SelectItem:
       // Required
       // Toggle the selected state of an item
       func(hitIndex)
       	selectedStateArray[hitIndex + topIndex] :=
       		NOT selectedStateArray[hitIndex + topIndex],
     IsSelected:
       // required
       // Returns true if the particular "entry" is selected
       
       // Simple check. However, this is a really inefficient way of doing things
       func(entry)
       	if selectedStateArray then
       		selectedStateArray[entry.index],
     viewSetupFormScript:
       func()
       begin
       	// only need to setup cursor if not already there
       	if IsReadOnly(cursor) then	
       	begin
       		cursor := {_proto: cursor};
       		local array := cursor.items := Array(kNumItems, nil) ;
       
       		for i := 0 to kNumItems - 1 do
       			array[i] := {data: GetRandomWord(5,15), index: nil} ;
       
       		array := cursor.items := Sort(array, '|str<|, 'data);
       		
       		for i := 0 to kNumItems - 1 do
       			array[i].index := i ;
       		
       		selectedStateArray := Array(kNumItems, nil);
       	end;
       end,
     selectedStateArray:
       // An inefficient way to track the selected items
       nil,
     myHilitedIndex:
       // Need to separately track the hilited item since 
       // protoOverview will sometimes clear the hilitedIndex slot
       
       // This will track the real index of the hilited index. It is updated by scrolling.
       nil,
     topIndex:
       // index of the item that is currently at the top of the displayed items
       0,
     debug: "theOverview",
     _proto: @191
    };
AddStepForm(_view000, theOverview);




constant |layout_protoOverview.t| := _view000;
// End of file protoOverview.t



