1 line
13 KiB
C
Executable File
1 line
13 KiB
C
Executable File
/* Copyright (c) 2017, Computer History Museum
|
|
All rights reserved.
|
|
Redistribution and use in source and binary forms, with or without modification, are permitted (subject to
|
|
the limitations in the disclaimer below) provided that the following conditions are met:
|
|
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
|
* 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.
|
|
* Neither the name of Computer History Museum nor the names of its contributors may be used to endorse or promote products
|
|
derived from this software without specific prior written permission.
|
|
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE
|
|
COPYRIGHT HOLDERS AND CONTRIBUTORS "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 THE COPYRIGHT
|
|
HOLDER OR CONTRIBUTORS 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. */
|
|
|
|
#ifndef LISTVIEW_H
|
|
#define LISTVIEW_H
|
|
|
|
// VLNodeID - identifies a particular node in the list. Client specifies format for fields.
|
|
// Can use menu ID, file folder it, etc.
|
|
typedef long VLNodeID;
|
|
|
|
// VLCallbackMessage - Callback messages for list view
|
|
typedef enum
|
|
{
|
|
kLVAddNodeItems, // data = node ID
|
|
kLVDeleteItem, // data = 0, use selected items
|
|
kLVMoveItem, // data = VLNodeInfo *
|
|
kLVCopyItem, // data = VLNodeInfo *
|
|
kLVOpenItem, // data = 0, use selected items
|
|
kLVRenameItem, // data = StringPtr to new name, use selected item
|
|
kLVExpandCollapseItem, // data = VLNodeInfo *
|
|
kLVGetParentID, // data = VLNodeInfo *
|
|
kLVQueryItem, // data = VLNodeInfo *
|
|
kLVSendDragData, // data = SendDragDataInfo *
|
|
kLVGetFlags, // data = 0
|
|
kLVAddDragItem, // data = SendDragDataInfo *
|
|
kLVSelectItem, // data = VLNodeInfo *
|
|
kLVUnselectItem, // data = VLNodeInfo *
|
|
kLVDragDrop // data = SendDragDataInfo *
|
|
} VLCallbackMessage;
|
|
|
|
// Queries
|
|
enum { kQuerySelect, kQueryDrag, kQueryRename, kQueryDrop,
|
|
kQueryDragExpand, kQueryDropParent, kQueryDCOpens };
|
|
|
|
// Flags
|
|
enum
|
|
{
|
|
kfAutoSelectAll = 0x0001, // Auto select all when initialized
|
|
kfAutoSelectChild = 0x0002, // Set to automatically select child if parent is selected
|
|
kfListSupportsFocus = 0x0004, // Draw the list with a focus rectangle when appropriate
|
|
kfSupportsSelectCallbacks = 0x0008, // Supports list item select and unselect callbacks
|
|
kfSupportsMondoBigList = 0x0010, // Supports lists containing more data than the List Manager was designed for
|
|
kfManualRowAddsExpected = 0x0020, // Expects to perform its own LAddRow's in bulk
|
|
kfSingleSelection = 0x0040, // Only 1 item selected at a time
|
|
kfDropRoot = 0x0080 // Allow dropping items at root level
|
|
};
|
|
|
|
// Focus
|
|
typedef enum
|
|
{
|
|
kFocusNone = 0,
|
|
kFocusList,
|
|
kFocusEdit
|
|
} ListFocusType;
|
|
|
|
// Data for certain callbacks
|
|
typedef enum
|
|
{
|
|
dataDeleteFromKeyboard,
|
|
dataDeleteFromDrag
|
|
} DataCallbackType;
|
|
|
|
// Use this constant on LVNew to indicate you want to add the
|
|
// drag flavors yourself
|
|
#define kLVDoOwnDragAdd -1
|
|
|
|
typedef struct CellRec CellRec;
|
|
|
|
// Prototype for callback function
|
|
typedef struct ViewListRec *ViewListPtr;
|
|
typedef long (*ViewListCallBackPtr)(ViewListPtr pView, VLCallbackMessage message, long data);
|
|
|
|
// Prototype for drawing callback function
|
|
typedef Boolean (*DrawItemCallBackPtr)(ViewListPtr pView,short item,Rect *pRect,CellRec *pCellData,Boolean select,Boolean eraseName);
|
|
typedef Boolean (*FillBlankCallbackPtr)(ViewListPtr pView);
|
|
typedef Boolean (*GetDragRegionCallbackPtr)(ViewListPtr pView, CellRec *cellData, Rect *cellRect, Rect *iconRect, Rect *nameRect);
|
|
typedef Boolean (*InterestingClickCallbackPtr)(ViewListPtr pView, CellRec *cellData, Rect *cellRect, Point pt);
|
|
|
|
/**********************************************************************
|
|
* DrawDetails - details for list drawing
|
|
**********************************************************************/
|
|
typedef struct DrawDetails
|
|
{
|
|
short arrowLeft;
|
|
short iconTop;
|
|
short iconLeft; // First icon level
|
|
short iconLevelWidth;
|
|
short textBottom;
|
|
short rowHt; // Hieght of a row
|
|
short nameAddMargin; // Add to name width when drawing
|
|
short maxNameWidth; // Approximate maximum name width
|
|
short keyNavTicks; // Delay accepted between navigation keys
|
|
|
|
|
|
DrawItemCallBackPtr DrawRowCallback; // callback to draw an individual row
|
|
FillBlankCallbackPtr FillBlankCallback; // callback to fill empty space at end of list
|
|
GetDragRegionCallbackPtr GetCellRectsCallBack; // callback to calculate the drag region
|
|
InterestingClickCallbackPtr InterestingClickCallback; // callback to tell if a point is interesting
|
|
|
|
} DrawDetailsStruct, *DrawDetailsPtr;
|
|
|
|
typedef struct {
|
|
VLNodeID nodeID; // ID of this selected node
|
|
short row; // List row (zero based)
|
|
} SelectedListRec, *SelectedListPtr, **SelectedListHandle;
|
|
|
|
/**********************************************************************
|
|
* ViewListRec - Main record for a view list
|
|
**********************************************************************/
|
|
typedef struct ViewListRec
|
|
{
|
|
Rect bounds; // List bounds, includes vertical scroll bar on right
|
|
short selectCount; // # of items currently selected
|
|
SelectedListHandle hSelectList; // List of row numbers (0-based) and nodeID's of selected items
|
|
MyWindowPtr wPtr; // The window containing the list
|
|
VLNodeID rootNodeID; // ID of root directory of list
|
|
ViewListCallBackPtr pCallBack; // Callback function
|
|
ListHandle hList; // List handle
|
|
OSType dragFlavor; // Flavor of items dragged out of list
|
|
short dragHiliteRow; // Row currently highlighted during a drag
|
|
PETEHandle pte; // pte for renaming
|
|
short renameRow; // Row # of item being renamed
|
|
short listStatus; // Zero if draw list
|
|
short maxLevel; // Deepest level
|
|
short maxNameWidth; // Width of widest name
|
|
short font; // List font
|
|
short fontSize; // List font size
|
|
long flags; // See flags enum
|
|
long dragGroup; // What group do these drag items belong to?
|
|
Boolean dragSelect; // Is a drag selection in progress?
|
|
ListFocusType listFocus; // Where should the focus be?
|
|
DrawDetailsStruct details; // constants for list drawing
|
|
} ViewList,*ViewListPtr;
|
|
|
|
// SICN for triangle icon
|
|
enum
|
|
{
|
|
kRightOutlineSICN=0,
|
|
kRightSICN,
|
|
kDiagonalSICN,
|
|
kDownSICN,
|
|
kDownOutlineSICN
|
|
};
|
|
|
|
/**********************************************************************
|
|
* VLNodeInfo - Info requested by view list manager
|
|
**********************************************************************/
|
|
typedef struct
|
|
{
|
|
short iconID;
|
|
VLNodeID nodeID;
|
|
Boolean isParent; // Set if is a parent
|
|
Boolean isCollapsed; // Set if parent and collapsed
|
|
Boolean useLevelZero; // Used for adding items
|
|
short query; // Used for kLVQueryItem
|
|
short rowNum; // 1-based
|
|
Style style; // Style for drawing name
|
|
long refCon;
|
|
Str32 name;
|
|
} VLNodeInfo;
|
|
|
|
/**********************************************************************
|
|
* SendDragDataInfo - Info for sending drag data
|
|
**********************************************************************/
|
|
typedef struct
|
|
{
|
|
DragReference drag;
|
|
ItemReference itemRef;
|
|
FlavorType flavor;
|
|
VLNodeInfo *info;
|
|
|
|
} SendDragDataInfo;
|
|
|
|
/**********************************************************************
|
|
* CellRec - Info contained in each cell
|
|
**********************************************************************/
|
|
typedef struct CellRec
|
|
{
|
|
short iconID;
|
|
VLNodeID nodeID;
|
|
struct
|
|
{
|
|
short fParent:1;
|
|
short fCollapsed:1;
|
|
short fHaveChildren:1;
|
|
short level:5;
|
|
short style:8;
|
|
} misc;
|
|
long refCon;
|
|
Str32 name;
|
|
} CellRec;
|
|
|
|
/**********************************************************************
|
|
* Prototypes
|
|
**********************************************************************/
|
|
|
|
// Create a new list view. Pass ID of node of root folder.
|
|
OSErr LVNew(ViewListPtr pView,MyWindowPtr wPtr,Rect *pBounds,VLNodeID rootNodeID,
|
|
ViewListCallBackPtr pCallBack,OSType dragFlavor);
|
|
|
|
// Create a new list view. More control
|
|
OSErr LVNewWithDetails(ViewListPtr pView,MyWindowPtr wPtr,Rect *pBounds,VLNodeID rootNodeID,
|
|
ViewListCallBackPtr pCallBack,OSType dragFlavor,DrawDetailsPtr details);
|
|
|
|
// Initialize details for LVNewWithDetails
|
|
void LVInitDetails(DrawDetailsPtr details);
|
|
|
|
// Dispose of a list view
|
|
void LVDispose(ViewListPtr pView);
|
|
|
|
// Add items to a list view. Should only be called in response to a kLVAddNodeItems request
|
|
OSErr LVAdd(ViewListPtr pView, VLNodeInfo *pInfo);
|
|
|
|
// Call when there is a click in the window, even if not in the list view
|
|
// Returns true if handled
|
|
Boolean LVClick(ViewListPtr pView,EventRecord *event);
|
|
|
|
// Call on a key event. Returns true if key event was handled
|
|
Boolean LVKey(ViewListPtr pView,EventRecord *event);
|
|
|
|
// Draw the list view. Call on update events.
|
|
void LVDraw(ViewListPtr pView, RgnHandle hRgn, Boolean checkList, Boolean fDrawFrame);
|
|
|
|
// Activate/deactivate list view.
|
|
void LVActivate(ViewListPtr pView, Boolean activate);
|
|
|
|
// Resize list view. pHeightAdjustment returns with a value indicating the differenct between the
|
|
// height as indicated with pRect and the actual height. The actual height may be different because the
|
|
// list height is an even multiple of the row height of each entry.
|
|
void LVSize(ViewListPtr pView,Rect *pRect,short *pHeightAdjustment);
|
|
|
|
// Returns the number of items currently selected.
|
|
short LVCountSelection(ViewListPtr pView);
|
|
|
|
// Returns the cell data for the indicated item. item is either the nth item (1-based) in the
|
|
// list or the nth item in the current selection.
|
|
Boolean LVGetItem(ViewListPtr pView,short item,VLNodeInfo *pInfo,Boolean fFromSelection);
|
|
|
|
// Returns the cell data for the item matching a particular nodeID.
|
|
Boolean LVGetItemWithNodeID(ViewListPtr pView,VLNodeID nodeID,VLNodeInfo *pInfo);
|
|
|
|
// Sets the cell data for the item matching a particular nodeID.
|
|
Boolean LVSetItemWithNodeID(ViewListPtr pView,VLNodeID nodeID,VLNodeInfo *pInfo, Boolean update);
|
|
|
|
// Force the entire list to be regenerated.
|
|
void InvalidListView(ViewListPtr pView);
|
|
|
|
// Process a Drag Manager message
|
|
OSErr LVDrag(ViewListPtr pView,DragTrackingMessage which,DragReference drag);
|
|
|
|
// Check to see if the list view is doing a drag slection
|
|
Boolean LVDragSelectInProgress (ViewListPtr pView);
|
|
|
|
// finish up drag and return item dropped on
|
|
Boolean LVDrop(ViewListPtr pView,VLNodeInfo *pInfo);
|
|
|
|
// update the text style for an item
|
|
void LVUpdateStyle(ViewListPtr pView,VLNodeID id,StringPtr sName,Style theStyle,Boolean fDraw);
|
|
|
|
// Rename a list view item
|
|
void LVRename(ViewListPtr pView,VLNodeID id,StringPtr sName,Boolean openAfterRename,Boolean hahaOnlyKidding);
|
|
|
|
// Expand/collapse a list view item
|
|
void LVExpand(ViewListPtr pView,VLNodeID id,StringPtr sName,Boolean expand);
|
|
|
|
// Select a list view item
|
|
Boolean LVSelect(ViewListPtr pView,VLNodeID id,StringPtr sName,Boolean addToSelection);
|
|
|
|
// Unselect a list view item
|
|
Boolean LVUnselect(ViewListPtr pView,VLNodeID id,StringPtr sName,Boolean removeFromSelection);
|
|
|
|
// Make sure our internal selection tables are correct
|
|
void LVUpdateSelection(ViewListPtr pView);
|
|
|
|
// See if "checkInfo" is a descendent of "inInfo".
|
|
// Return 0 if not or generation if it is: 1=child, 2=grandchild, etc
|
|
short LVDescendant(ViewListPtr pView,VLNodeInfo *checkInfo,VLNodeInfo *inInfo);
|
|
|
|
// Get the size of the list. Used to determine the maximum size to zoom the window.
|
|
void LVMaxSize(ViewListPtr pView, short *pWd, short *pHt);
|
|
|
|
// Return the drag flavor if currently dragging
|
|
OSType LVDragFlavor(void);
|
|
|
|
// Is the indicated row selected?
|
|
Boolean LVIsSelected(ViewListPtr pView,short row);
|
|
|
|
// Calculate the adjust size the list will be
|
|
void LVCalcSize(ViewListPtr pView, Rect *r);
|
|
|
|
// Select all selectable items in list
|
|
Boolean LVSelectAll(ViewListPtr pView);
|
|
|
|
// Scroll a list to the top automagically
|
|
void ScrollTopListView(ViewListPtr pView);
|
|
|
|
// Scroll a list up or down
|
|
void LVScroll(ViewListPtr pView,SInt32 lines);
|
|
|
|
// Copy selected item names to clipboard
|
|
void LVCopy(ViewListPtr pView);
|
|
|
|
// Draw the focus
|
|
void LVChangeFocus(ViewListPtr pView, ListFocusType newFocus);
|
|
Boolean LVSetKeyboardFocus(ViewListPtr pView, Boolean getFocus);
|
|
Boolean LVAdvanceKeyboardFocus (ViewListPtr pView);
|
|
Boolean LVReverseKeyboardFocus (ViewListPtr pView);
|
|
void LVDrawFocus(ViewListPtr pView);
|
|
|
|
short LVGetNextRowToAdd (void);
|
|
|
|
#endif
|
|
|