Compile function NDW_5S_EVENTS(CtrlEntId, Event, @PARAMS)
/***********************************************************************************************************************

    This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
    permission from Infineon.

    Name        :   NDW_5S_Events

    Description :   This function acts as a commuter module for all events related to this window.

    Notes       :   Commuter Modules are automatically called from the Promoted_Events function which is called by the
                    application-specific promoted event handler. This makes it possible to add QuickEvents that need to
                    execute Basic+ logic without having use the Form Designer to make the association, although this is
                    limited to the events which are currently promoted.

                    If the form needs to call the commuter module directly then the QuickEvent parameters should be
                    formatted like this:

                        '@SELF','@EVENT',['@PARAM1','@PARAMx']

    Parameters  :
        CtrlEntId   [in] -- The fully qualified name of the control calling the promoted event
        Event       [in] -- The event being executed. See the Notes section regarding "PRE" events
        Param1-15   [in] -- Additional event parameter holders
        EventFlow  [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
                            EVENT_SETUP insert

    History     :   (Date, Initials, Notes)
        05/14/2025    djs     Modified edit table properties to fit longer descriptions

***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
#window NDW_5S

$Insert EVENT_SETUP
$Insert APP_INSERTS
$Insert PM_SPEC_EQUATES
$Insert PM_EQUATES
$Insert MSG_EQUATES

Declare function Get_Property, Pm_Services, obj_PM_Spec, Database_Services, SRP_Array, SRP_Datetime, Msg, Datetime
Declare function Memberof
Declare subroutine Set_Property, Pm_Services, Start_Window, Obj_Appwindow, PlaceDialog

// Columns in OLE Edit Table
EQU COL$PM_ID       TO 1
EQU COL$DESC        TO 2
EQU COL$LAST_PM     TO 3
EQU COL$EARLY_START TO 4
EQU COL$SCHED_START TO 5
EQU COL$LATE_START  TO 6
EQU COL$ACTION      TO 7

// Form colors
EQU RED$FIVES    TO '5924072'
EQU GREEN$FIVES  TO '7596927'
EQU YELLOW$FIVES TO '9109501'
EQU ORANGE$FIVES TO '4168946'

// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
If Event EQ 'OLE' then
    Transfer Event to OIEvent
    Transfer Param1 to Event
    Transfer Param2 to Param1
    Transfer Param3 to Param2
    Transfer Param4 to Param3
    Transfer Param5 to Param4
    Transfer Param6 to Param5
    Transfer Param7 to Param6
    Transfer Param8 to Param7
end

GoToEvent Event for CtrlEntId else
    // Event not implemented
end

Return EventFlow or 1

//-----------------------------------------------------------------------------
// EVENT HANDLERS
//-----------------------------------------------------------------------------

Event WINDOW.CREATE(CreateParam)
    SelectedArea = ''
    Begin Case
        Case CreateParam EQ 'CLEANROOM'
            SelectedArea = 'CLEANROOM'
        Case CreateParam EQ 'MAINTENANCE'
            SelectedArea = 'MAINTENANCE'
        Case CreateParam EQ 'SHIPPING/RECEIVING'
            SelectedArea = 'SHIPPING/RECEIVING'
        Case Otherwise$
            SelectedArea = 'CLEANROOM'
    End Case
    Set_Property(@Window : '.CMB_AREA', 'TEXT', SelectedArea)
    GoSub Setup_OLE_Controls
    GoSub SetupForm
    GoSub GetKeys
    stat = Set_Property(@WINDOW,'TIMER',10000:@FM:0)
    PlaceDialog(-2, -2)
    
End Event


Event CHK_ARCHIVED.CLICK()
    
    GoSub GetKeys
    
end event


Event CMB_AREA.CHANGED(NewData)
	
    GoSub GetKeys
    
end event


Event EDT_5S_TABLE.OnClick(Cell, Point, Button, Shift, Ctrl)
    
    EdtTableCtrl = @Window : '.EDT_5S_TABLE'
    RowClicked   = Field(Cell, ';' , 2)
    SelArray     = 1 : @FM : RowClicked
    Set_Property(@Window: '.EDT_SEL_ROW', "TEXT", RowClicked)
    Set_Property(@Window : '.PUB_VIEW_SELECTED', 'ENABLED', 1)
    
end event


Event EDT_5S_TABLE.OnButtonClick(Cell, Point, Button, Shift, Ctrl)
    
    EdtTableCtrl = @Window : '.EDT_5S_TABLE'
    TableData    = Get_Property(EdtTableCtrl, "OLE.ARRAY")
    TableData    = SRP_Array("Rotate", TableData)
    ColClicked   = Field(Cell, ';' , 1)
    Begin Case
        Case ColClicked EQ COL$ACTION
            //Clicked Complete Button
            RowNoClicked    = Field(Cell, ';' , 2)
            RowData         = TableData<RowNoClicked>
            MsgInfo         = ''
            MsgInfo<mcol$>  = -2
            MsgInfo<MTYPE$> = 'BNYC'
            MsgInfo<mrow$>  = -2
            MsgInfo<mtext$> = 'Are you sure you wish to mark this 5S task as complete?'
            Verify          = Msg(@Window, MsgInfo)
            If Verify EQ True$ then
                PMSID    = RowData<1,COL$PM_ID>
                PMSRec   = Database_Services('ReadDataRow', 'PM_SPEC', PMSID)
                CurrPMId = PMSRec<PM_SPEC_PM_KEYS$, 1>
                Pm_Services('CompleteNonToolPM', CurrPMId , @User4, Datetime())
                If Error_Services('NoError') then
                    MsgInfo         = ''
                    MsgInfo<mcol$>  = -2
                    MsgInfo<MTYPE$> = 'BO'
                    MsgInfo<mrow$>  = -2
                    MsgInfo<mtext$> = 'Task marked as complete!'
                    Msg(@Window, MsgInfo)
                    GoSub GetKeys
                end else
                    MsgInfo         = ''
                    MsgInfo<mcol$>  = -2
                    MsgInfo<MTYPE$> = 'BO'
                    MsgInfo<mrow$>  = -2
                    MsgInfo<mtext$> = Error_Services('GetMessage')
                    Msg(@Window, MsgInfo)
                    GoSub GetKeys
                end
            end else
                MsgInfo         = ''
                MsgInfo<mcol$>  = -2
                MsgInfo<MTYPE$> = 'BO'
                MsgInfo<mrow$>  = -2
                MsgInfo<mtext$> = 'Task NOT marked as complete!'
                Msg(@Window, MsgInfo)
                GoSub GetKeys
            end
        Case ColClicked EQ COL$PM_ID
            Null       
        Case Otherwise$
            Null
    End Case
    
end event


Event EDT_5S_TABLE.OnDblClick(Cell, Point, Button, Shift, Ctrl)
    
    EdtTableCtrl = @Window : '.EDT_5S_TABLE'
    TableData    = Get_Property(EdtTableCtrl, "OLE.ARRAY")
    TableData    = SRP_Array("Rotate", TableData)
    ColClicked   = Field(Cell, ';' , 1)
    Begin Case
        Case ColClicked EQ COL$PM_ID
            //Clicked PM ID column, bring up PM history for this PM ID
            RowNoClicked = Field(Cell, ';' , 2)
            RowData      = TableData<RowNoClicked>
            PMSID        = RowData<1,COL$PM_ID>
            PMSRec       = Database_Services('ReadDataRow', 'PM_SPEC', PMSID)
            CurrPMId     = PMSRec<PM_SPEC_PM_KEYS$, 1>
            
            Start_Window('NDW_PM_HISTORY', @Window, PMSID)
        Case Otherwise$
            Null
    End Case
    
end event


Event PUB_ADD_NEW_PM_SPEC.CLICK()
    
    Start_Window('PM_SPEC', @Window, '')
    
end event


Event PUB_VIEW_SELECTED.CLICK()
    
    EdtTableCtrl   = @Window : '.EDT_5S_TABLE'
    RowSelected    = Get_Property(@Window : '.EDT_SEL_ROW', 'TEXT')
    TableData      = Get_Property(EdtTableCtrl, "OLE.ARRAY")
    TableData      = SRP_Array("Rotate", TableData)
    SelectedPmsKey = TableData<RowSelected, 1>
    Set_Property(@Window : '.EDT_SEL_ROW', 'TEXT', ''); *Clear out selected row.
    Set_Property(@Window : '.PUB_VIEW_SELECTED', 'ENABLED', 0)
    if SelectedPmsKey NE '' then
        obj_AppWindow('ViewRelated','PM_SPEC':@RM:SelectedPmsKey)
    end
    
end event


Event WINDOW.TIMER()
    
    GoSub GetKeys
    
end event

//-----------------------------------------------------------------------------
// INTERNAL GOSUBS
//-----------------------------------------------------------------------------

GetKeys:
	
    ShowArchived = Get_Property(@Window : '.CHK_ARCHIVED', 'CHECK')
    SelectedArea = Get_Property(@Window : '.CMB_AREA', 'TEXT')
    FiveSPMKeys  = Pm_Services('Get5SPMs', ShowArchived, SelectedArea) 
    
    
FormatData:
    
    TableData = ''
    
    For each PMKey in FiveSPMKeys using @VM setting tPos
        //Record for the PM Specification
        PMSpecRecord  = Database_Services('ReadDataRow', 'PM_SPEC', PMKey)
        //Record for the currently scheduled PM for the specificed PM Spec.
        CurrPMKey     = PMSpecRecord<PM_SPEC_PM_KEYS$>
        CurrPMRecord  = Database_Services('ReadDataRow', 'PM', CurrPMKey)
        CurrPMDesc    = PMSpecRecord<PM_SPEC_DESC$>
        CurrPMLastPM  = OConv(PMSpecRecord<PM_SPEC_LAST_PM_COMP_DTM$>, 'DT')
        //Sched Calculation
        CurrPMSchedDT = CurrPMRecord<PM_SCHED_DT$>
        CurrPMSchedTM = CurrPMRecord<PM_SCHED_TM$>
        
        SchedStarts	= obj_PM_Spec('SchedStart',PMKey:@RM:PMSpecRecord)
        EarlyStarts	= obj_PM_Spec('EarlyStart',PMKey:@RM:PMSpecRecord)
        LateStarts	= obj_PM_Spec('LateStart',PMKey:@RM:PMSpecRecord)
        
        TableData<tPos, COL$PM_ID>       = PMKey
        TableData<tPos, COL$DESC>        = CurrPMDesc
        TableData<tPos, COL$LAST_PM>     = CurrPMLastPM
        TableData<tPos, COL$EARLY_START> = EarlyStarts
        TableData<tPos, COL$SCHED_START> = SchedStarts
        TableData<tPos, COL$LATE_START>  = LateStarts
    Next PMKey
    
    
PopulateTable:
    
    EdtTableCtrl = @Window : '.EDT_5S_TABLE'
    TableData    = SRP_Array("Rotate", TableData)
    Set_Property(EdtTableCtrl, "OLE.ARRAY", TableData)
    // Set last column in row to a PUB
    Set_Property(EdtTableCtrl, "OLE.CellType[7; ALL]", "Push Button")
    Set_Property(EdtTableCtrl, "OLE.CellText[7; ALL]", "Click To Complete")
    Set_Property(EdtTableCtrl, "OLE.CellImage[7; ALL]", 1)
    // Get All Cell Settings
    ColumnSettings      = Get_Property(EdtTableCtrl, "OLE.CellType[3; ALL]")
    ColumnSettings<2,3> = 0; *Turns off data from cell 7 of each row.
    Set_Property(EdtTableCtrl, "OLE.CellType[7; ALL]", ColumnSettings)
    
    
ColorCodeRows:
        
    // Here we color code all the rows based on whether they're not due, due, or overdue.
    TableData      = Get_Property(EdtTableCtrl, "OLE.ARRAY")
    TableData      = SRP_Array('Rotate', TableData)
    CurrDTM        = SRP_Datetime('Now')
    for each DataRow in TableData using @FM setting dPos
        EarlyStart = ''
        SchedStart = ''
        LateStart  = ''
        PMSpecID   = DataRow<1,COL$PM_ID>
        Units      = XLATE('PM_SPEC', PMSpecID, PM_SPEC_UNITS$, 'X')
        Begin Case
            Case Units EQ 'D'
                EarlyStart = ICONV(DataRow<1, COL$EARLY_START>, 'D')
                SchedStart = ICONV(DataRow<1, COL$SCHED_START>, 'D')
                LateStart  = ICONV(DataRow<1, COL$LATE_START>, 'D')
            Case Units EQ 'T'
                EarlyStart = ICONV(DataRow<1, COL$EARLY_START>, 'DT')
                SchedStart = ICONV(DataRow<1, COL$SCHED_START>, 'DT')
                LateStart  = ICONV(DataRow<1, COL$LATE_START>, 'DT')
        End Case
        Begin Case
            Case CurrDTM LT EarlyStart
                //Not Due Yet
                LineColor = GREEN$FIVES
            Case CurrDTM GT EarlyStart AND CurrDTM LT SchedStart
                //Within the early start window
                LineColor = YELLOW$FIVES
            Case CurrDTM GT SchedStart AND CurrDTM LT LateStart
                //Due
                LineColor = ORANGE$FIVES
            Case CurrDTM GT LateStart
                //Past Due
                LineColor = RED$FIVES
            Case 1
                LineColor = WHITE$
        End Case
        RowSettings    = Get_Property(EdtTableCtrl, "OLE.CellColors[1; ":dPos:"]")
        RowSettings<2> = LineColor
        Set_Property(EdtTableCtrl, "OLE.CellColors[ALL; ":dPos:"]", RowSettings)
    Next DataRow
    
return


SetupForm:
    
    If NOT(Memberof(@User4, 'SUPERVISOR')) then
        Set_Property(@Window : '.PUB_ADD_NEW_PM_SPEC', 'VISIBLE', 0)
        Set_Property(@Window : '.PUB_VIEW_SELECTED', 'VISIBLE', 0)
    end
    Set_Property(@Window : '.PUB_VIEW_SELECTED', 'ENABLED', 0)
    
return


Setup_OLE_Controls:
    
    EdtTableCtrl   = @Window : '.EDT_5S_TABLE'
    // Row Selection Settings
    RowSelArray    = Get_Property(EdtTableCtrl, "OLE.SelectionStyle")
    RowSelArray<7> = 'Header'
    RowSelArray<8> = True$;*Always show row selection
    Set_Property(EdtTableCtrl, "OLE.SelectionStyle", RowSelArray)
    Set_Property(EdtTableCtrl, 'OLE.Redraw', False$)
    // Set up columns
    Set_Property(EdtTableCtrl, "OLE.Dimension", 7);*Define number of columns
    
    HeaderTitles = 'PM ID':@VM:'Desc':@VM:'Last PM':@VM:'Early Start':@VM:'Sched Start':@VM:'Late Start':@VM:'Action'; *Define the column header titles
    Set_Property(EdtTableCtrl, "OLE.TitleList", HeaderTitles); *Set the column titles
    
    // Set the column Sizes
    Set_Property(EdtTableCtrl, "OLE.HeaderColumn[1]", '':@FM:False$)
    ColSize = Get_Property(EdtTableCtrl, "OLE.DataColumn[1]")
    // Column 1
    ColSize<1> = 45
    Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$PM_ID:"]", ColSize)
    // Column 2
    ColSize<1> = 200
    ColSize<4> = True$
    Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DESC:"]", ColSize)
    ColSize<4> = False$
    // Column 3
    ColSize<1> = 110
    Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$LAST_PM:"]", ColSize)
    // Column 4
    ColSize<1> = 110
    Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$EARLY_START:"]", ColSize)
    // Column 5
    ColSize<1> = 110
    Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$SCHED_START:"]", ColSize)
    //Column 6
    ColSize<1> = 110
    Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$LATE_START:"]", ColSize)
    //Column 7
    ColSize<1> = 110
    Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$ACTION:"]", ColSize)
    Set_Property(EdtTableCtrl, 'OLE.Border', 'XP Flat')
    Set_Property(EdtTableCtrl, 'OLE.Font', 'Segoe UI' : @SVM : '15')
    Set_Property(EdtTableCtrl, "OLE.CellProtection[All; All]", 'RO')
    Set_Property(EdtTableCtrl, 'OLE.Redraw', True$)
    
    // Qualify OLE events that we want to intercept
    Qualifier = ''
    Qualifier<1> = 1
    Qualifier<4> = 0 ; * process synchronously (i.e. immediately)
    Send_Message(EdtTableCtrl,  'QUALIFY_EVENT', 'OLE.OnClick', Qualifier)
    Send_Message(EdtTableCtrl,  'QUALIFY_EVENT', 'OLE.OnButtonClick', Qualifier)
    Send_Message(EdtTableCtrl,  'QUALIFY_EVENT', 'OLE.OnDblClick', Qualifier)
    Send_Message(EdtTableCtrl,  'QUALIFY_EVENT', 'OLE.OnLostFocus', Qualifier)
    
return

