home *** CD-ROM | disk | FTP | other *** search
- //************************************************************************
- //
- // Copyright 1987-1992 Data Access Corporation, Miami FL, USA
- // All Rights reserved
- // DataFlex is a registered trademark of Data Access Corporation.
- //
- //
- // $Source: /u3/source.30/product/pkg/RCS/sellist.pkg,v $
- // $Revision: 1.1 $
- // $State: Exp $
- // $Author: james $
- // $Date: 1992/09/08 14:43:08 $
- // $Locker: $
- //
- // $Log: sellist.pkg,v $
- //Revision 1.1 1992/09/08 14:43:08 james
- //Initial revision
- //
- //Revision 1.12 92/07/01 01:42:42 lee
- //first_selected_item now returns -1 if no items/records are selected.
- //,
- //
- //Revision 1.11 92/05/29 14:06:02 lee
- //removed end_construct_* messages from mixins; now, classes that use the mixin
- //send the message that used to be sent by the end_construct_* message (for
- //efficiency).
- //
- //Revision 1.10 92/05/14 17:17:26 SWM
- //Updated Copyright slug.
- //
- //Revision 1.9 92/04/01 00:33:40 lee
- //removed navstart and liststart (unused), renamed bind_main_file and bind_index
- //in datalist to bind_list_main_file and bind_list_index to avoid conflict with
- //commands used by data_set, moved bind_static from sellist to datalist as it
- //only sets properties defined in datalist (not sellist).
- //
- //Revision 1.8 92/03/29 18:45:11 lee
- //added MSG_END_CONSTRUCT_OBJECT, moved ENDMAC macro stuff into END_CONSTRUCT-
- //OBJECT procedures (in .pkgs). moved Flag_ITems to list.pkg after generalizing
- //it based on PROTOTYPE_OBJECT instead of Whether or not it is a table-oriented
- //object. Moved define_access_keys mechanism completely into actionbr.pkg.
- //fixed two typos: import_class_protocol used !# instead of !3, and register-
- //procedure used !1 instead of !2.
- //
- //Revision 1.7 92/03/27 16:21:42 steve-l
- //CANCEL altered to properly refind parent-records
- //
- //Revision 1.6 92/03/18 12:39:15 steve-l
- //altered all calls to vfind to perform a relate if successful
- //
- //Revision 1.5 92/03/09 19:04:18 james
- //Added #CHKSUB directive to insure source
- //only compiled with correct revision of
- //compiler.
- //
- //Revision 1.4 92/01/15 18:12:41 steve-l
- //DAR# 2440 - FIRST_CHARACTER search mode supported for virtual lists
- //
- //Revision 1.3 92/01/13 17:38:48 steve-l
- //DAR 2241: send entering retval changed to get msg_entering to retval.
- //
- //Revision 1.2 91/11/08 09:22:28 steve-l
- //it
- //
- //************************************************************************/
-
- //************************************************************************
- // File Name: SelList.Pkg
- // Creation Date: January 1, 1991
- // Modified Date: January 15, 1992
- // Author(s): Steven A. Lowe
- //
- // This module contains the Selection_List class definition.
- //************************************************************************/
-
- #CHKSUB 1 1 // Verify the UI subsystem.
-
- use Set
- use DataList
- use List
-
- register_procedure refind_Records
- register_function current_record returns integer
-
- class Selection_List is a Data_List STARTMAC slStart
-
- procedure construct_object integer img
- forward send construct_object img
- on_key kBegin_of_Data SEND Beginning_of_Data PRIVATE
- on_key kEnd_of_Data SEND End_of_Data PRIVATE
- object Selected_Items is a Set
- end_object
- send define_list //invoke constructor for list support
- end_procedure
-
- IMPORT_CLASS_PROTOCOL LIST_Mixin //include list support module
-
- function select_count returns integer
- local integer retval
- if (Batch_State(current_object)) forward get select_count to retval
- else move (item_count(Selected_Items(current_object))) to retval
- function_return retval
- end_function
-
- procedure set select_count integer newval
- forward set select_count to newval
- if (Batch_State(current_object) = 0) ;
- set item_count of (Selected_Items(current_object)) to newval
- end_procedure
-
- function first_selected_item returns integer
- local integer count maxx
- if (Batch_State(current_object)) begin
- move (item_count(current_object) - 1) to maxx
- for count from 0 to maxx
- if (select_state(current_object,count)) function_Return count
- loop
- end
- else begin
- if (select_count(current_object) > 0) begin
- get array_Value of (Selected_Items(current_object)) item 0 to count
- function_Return count
- end
- end
- function_return -1 // no selected items/records
- end_function
-
- procedure move_value_out
- local integer item# srvr# obj# oldDisp mainfile
- local string val
- get first_selected_item to item#
- get Invoking_Object_ID to obj#
- if (Batch_State(current_object)) begin
- get value item item# to val
- set value of obj# item CURRENT to val
- set item_changed_state of obj# item CURRENT to TRUE
- end
- else begin
- get Server to srvr#
- get main_file to mainfile
- if srvr# ne 0 begin
- get line_display_State to oldDisp
- set line_display_State to true
- send Find_by_RecNum to srvr# mainfile item#
- set line_display_State to oldDisp
- end
- else if mainfile ne 0 begin
- move mainfile to filenumber
- move 0 to fieldindex
- clear Indirect_File
- move item# to Indirect_File.RECNUM
- find eq Indirect_File.RECNUM
- end
- [found] if obj# ne 0 begin
- send entry_display to obj# 0 0
- if (Export_Item_State(current_object)) begin
- get value item (base_item(current_object)) to val
- set value of obj# item CURRENT to val
- set item_changed_state of obj# item CURRENT to TRUE
- end
- end
- end
- set changed_state to false //list not changed after value exported
- end_procedure
-
- procedure Entering returns integer
- local integer retval obj#
- get Server to obj#
- if (Batch_State(current_object)) begin
- forward get msg_Entering to retval
- set Original_Selection to (current_item(current_object))
- end
- else begin
- if obj# ne 0 set Original_Selection to (Current_Record(obj#))
- else begin
- get main_file to filenumber
- if filenumber ne 0 begin
- move 0 to fieldindex
- set Original_Selection to Indirect_File.RECNUM
- end
- else set Original_Selection to 0
- end
- forward get msg_Entering to retval
- end
- if (Select_Mode(current_object) = AUTO_SELECT) ;
- set select_state item CURRENT to true
- procedure_return retval
- end_procedure
-
- procedure CANCEL returns integer
- local integer srvr# rec# file# oldinuse
- if (Batch_State(current_object)) begin
- set current_item to (Original_Selection(current_object))
- send request_cancel
- end
- else begin
- send request_cancel
- get main_file to file#
- if file# ne 0 begin
- get Server to srvr#
- get Original_Selection to rec#
- if (srvr# <> 0 AND current_record(srvr#) = rec#) begin
- send refind_records to srvr#
- if (oldinuse = False) set in_use_state of srvr# to False
- end
- else begin //no server or server's curRec <> OrigSel rec#
- move file# to FILENUMBER
- move 0 to FIELDINDEX
- clear Indirect_File
- if rec# ne 0 begin
- move rec# to Indirect_File.RECNUM
- find eq Indirect_File.RECNUM
- end
- relate Indirect_File
- end
- end
- end
- end_procedure
-
- procedure Initialize_List
- forward send initialize_list
- if (static_state(current_object)) set entry_msg to msg_none
- end_procedure
-
- Procedure SET SELECT_STATE integer item# integer newState
- local integer rowID itemID selMode selArr
- get select_mode to selMode
- if selMode eq NO_SELECT procedure_return //do nothing
- if item# eq CURRENT get current_item to item#
- if newState eq TOGGLE_STATE ;
- move (not(select_State(current_object,item#))) to newState
- Forward set select_State item item# to newState
- if (not(Batch_State(current_object))) begin
- get row item item# to rowID
- get record_number item rowID to itemID
- move (Selected_Items(current_object)) to selArr
- if (select_State(current_object,item#)) begin
- if ((selMode = AUTO_SELECT) ;
- OR (selMode = SINGLE_SELECT)) ;
- set item_count of selArr to 0
- send Add_Element to selArr itemID
- end
- else send Remove_Element to selArr itemID
- end
- End_Procedure
-
- function next_selection returns integer //returns -1 if no selections
- local integer rec# SelArrID selCounter obj# retval maxx
- move (Selected_Items(current_object)) to SelArrID
- get Enumeration_Counter to selCounter
- if (Batch_State(current_object)) begin
- calc (item_count(current_object) - 1) to maxx
- if selCounter le maxx begin
- for retval from selCounter to maxx
- if (select_state(current_object,retval)) begin
- set Enumeration_Counter to (retval + 1)
- set current_item to retval
- function_return retval
- end
- loop
- function_Return -1 //no more items
- end
- end
- else if selCounter lt (select_count(current_object)) begin
- get array_value of SelArrID item selCounter to rec#
- set array_value of SelArrID item selCounter to 0 //deselect item
- set Enumeration_Counter to (selCounter + 1)
- get server to obj#
- if obj# ne 0 send read_by_recnum to obj# (main_file(current_object)) rec#
- function_return rec#
- end
- else function_Return -1
- end_function
-
- procedure entry_update integer mfile# integer flag
- local integer item# file# selMode
- local string astr
- get target_file to file#
- get select_mode to selMode
- if ((SelMode = SINGLE_SELECT OR SelMode = AUTO_SELECT) AND ;
- Select_Count(current_object) > 0 AND ;
- (mfile# = 0 OR mfile# = file#)) begin
- if (Batch_State(current_object)) begin
- get first_selected_item to item#
- get value item item# to astr
- move file# to filenumber
- if file# gt 0 begin
- get target_field to fieldindex
- move astr to Indirect_File.RECNUM
- end
- end
- end
- end_procedure
-
- // procedure INSERT_NEW_ROW integer row# //insert & display row before specified row#
- // local integer rec#
- // forward send insert_new_row row#
- // get record_number item row# to rec#
- // get find_element of (Selected_Items(current_object)) item rec# to rec#
- // if rec# ne -1 ;
- // set select_state item (row# * item_limit(current_object)) to TRUE
- // end_procedure
-
- // procedure append_new_row //add row at end of item list & display
- // local integer rec# row#
- // forward send append_new_row
- // move (row_count(current_object) - 1) to row#
- // get record_number item row# to rec#
- // get find_element of (Selected_Items(current_object)) item rec# to rec#
- // if rec# ne -1 ;
- // set select_state item (row# * item_limit(current_object)) to TRUE
- // end_procedure
-
- //
- // replacement for commented-out augmentations, above; purpose is to ensure
- // item's select_state set according to row membership in selected_items
- //
-
- procedure display_row integer row#
- local integer rec#
- forward send display_row row#
- get record_number item row# to rec#
- get find_element of (Selected_Items(current_object)) item rec# to rec#
- if rec# ne -1 ;
- set select_state item (row# * item_limit(current_object)) to TRUE
- end_procedure
-
-
- //
- // created to empty selected_items array along with list item data
- //
- procedure empty_list
- local integer obj#
- forward send empty_list
- move (Selected_Items(current_object)) to obj#
- if obj# ne 0 send delete_data to obj#
- end_procedure
-
-
- //
- // created for Bottom_of_Panel support
- //
- function last_panel_item returns integer
- local integer lastitem maxitem topItem
- get top_item to topItem
- calc (topItem + Display_Size(current_object) - 1) to lastitem
- get item_count to maxitem
- if lastItem gt maxitem move (maxitem - 1) to lastitem
- while (record_number(current_object,(row(current_object,lastitem))) = 0 ;
- AND lastitem > topItem)
- decrement lastitem
- end
- function_return lastitem
- end_function
-
- //
- // created to support FIRST_CHARACTER searching
- //
- procedure key integer keyval
- local integer ser# file# retval rec# ordr# oldCol mainfile curi bits
- local string lookStr
- if (keyval <= 255 AND search_mode(current_object) = FIRST_CHARACTER) begin
-
- move -1 to retval
-
- get current_item to curi
-
- move (character(keyval)) to lookStr
-
- get item_option of current_object item curi 19 to bits
- if bits uppercase lookStr //CAPSLOCK check
-
- get data_file to file#
- if file# le 0 begin
- forward send key keyval
- procedure_return //can't find if no valid main file
- end
-
- get Server to ser#
- get main_file to mainfile
- move (current_item(current_object) - base_item(current_object)) ;
- to oldCol
- move file# to filenumber
- move 0 to fieldindex
- move Indirect_File.RECNUM to rec#
- move 0 to Indirect_File.RECNUM //hold recbuf
- move rec# to Indirect_File.RECNUM //replace rec#
- get data_field to fieldindex
-
- move lookStr to Indirect_File.RECNUM
- if mainfile ne file# begin //find in parent-file
- if ser# ne 0 begin //has a server
- send Request_Superfind to ser# GE file# ;
- (data_field(current_object,CURRENT))
- [found] move (oldCol+top_item(current_object)) to retval //current item
- end
- else begin //no server
- send entry_superfind GE mainfile
- if [found] begin
- send display
- move (oldCol+top_item(current_object)) to retval //current item
- indicate found true
- end
- else begin
- move file# to filenumber
- move 0 to fieldindex
- clear Indirect_File
- move rec# to Indirect_File.RECNUM
- find eq Indirect_File.RECNUM
- end
- end
- end
- else begin //find in main-file
- get Ordering to ordr#
- if ser# ne 0 begin
- if (Deferred_State(current_object)) begin
- send Request_Read to ser# GE file# ordr#
- if [found] begin
- send display
- move (oldCol+top_item(current_object)) to retval //current item
- indicate found true
- end
- end
- else begin
- send Request_Find to ser# GE file# ordr#
- [found] move (oldCol+top_item(current_object)) to retval //current item
- end
- end
- else begin
- if ordr# lt 0 move 0 to ordr#
- vfind file# ordr# GE
- if [found] begin
- move file# to filenumber
- move 0 to fieldindex
- relate Indirect_File.RECNUM
- send display
- move (oldCol+top_item(current_object)) to retval //current item
- indicate found true
- end
- end
- [not found] begin
- move file# to filenumber
- move 0 to fieldindex
- clear Indirect_File
- move rec# to Indirect_File.RECNUM
- find eq Indirect_File.RECNUM
- end
- end
- if retval ge 0 set current_item to retval
- end
- else forward send key keyval
- end_procedure
-
- procedure End_Construct_Object
- send Flag_Items // mark checkbox items
- forward send End_Construct_Object
- end_procedure
-
- end_class
-
- //
- // Support Commands
- //
-
- //
- // slStart <class> <image> { ACTION_BAR <actionbar#> } { POP_UP } { RING }
- // { VIRTUAL | BATCH } { USING <ServerID> } { MAIN_FILE <FileName> }
- // { BY <Index> } { FOR <File.Field> } { STATIC } { RADIO }
- //
- #COMMAND slStart R R
- FORWARD_BEGIN_CONSTRUCT !1 !2 !3 !4 !5 !6 !7 !8 !9
- Bind_SelList_PopUp !3 !4 !5 !6 !7 !8 !9
- Bind_Target !3 !4 !5 !6 !7 !8 !9
- Bind_Static !3 !4 !5 !6 !7 !8 !9
- Bind_Radio !3 !4 !5 !6 !7 !8 !9
- #ENDCOMMAND
-
- #COMMAND Bind_SelList_PopUp //relies on inherited bind_popup to
- //actually set popup state
- #IF (!0>0)
- #IFSAME !1 POP_UP POPUP
- set Deferred_State to true
- set Auto_Fill_State to false
- #ELSE
- Bind_SelList_PopUp !2 !3 !4 !5 !6 !7 !8 !9
- #ENDIF
- #ENDIF
- #ENDCOMMAND
-