Option Explicit

Private Sub Command1_Click()
    End
End Sub

Private Sub Form_Load()
    Dim ItemIndex As Integer
    Dim Dt As Date
    Dim S As String
    
    Text1.Text = "In this example, the first column uses a SftMask/OCX Masked Edit control " & _
      "to enter an amount.  Try entering a new amount, then type + or - to access the built-in " & _
      "popup calculator." & vbCr & vbLf & vbCr & vbLf & _
      "The second column uses a SftBox/OCX Combo Box control." & vbCr & vbLf & vbCr & vbLf & _
      "The last column again uses a SftMask/OCX Masked Edit control to enter a date.  Click on the " & _
      "drop down button to access the popup calendar."
      
    ItemIndex = SftTree1.Items.Add("Edit cells" & vbCr & vbLf & "using SftMask/OCX:")
    SftTree1.Item(ItemIndex).EditIgnore = True
    SftTree1.Cell(ItemIndex, 1).Text = vbCr & vbLf & "using SftBox/OCX:"
    SftTree1.Cell(ItemIndex, 2).Text = "and again" & vbCr & vbLf & "using SftMask/OCX:"
    
    ItemIndex = SftTree1.Items.Add("5.33")
    SftTree1.Cell(ItemIndex, 0).TextHAlign = halignSftTreeDefaultRight
    SftTree1.Cell(ItemIndex, 1).Text = "Option 1"
    Dt = Date - 1
    S = "short"
    SftMaskDateTime.Calendar.FormatDate Dt, S
    SftTree1.Cell(ItemIndex, 2).Text = S
    SftTree1.Cell(ItemIndex, 2).DataTag = Dt
    
    ItemIndex = SftTree1.Items.Add("122.33")
    SftTree1.Cell(ItemIndex, 0).TextHAlign = halignSftTreeDefaultRight
    SftTree1.Cell(ItemIndex, 1).Text = "Option 3"
    Dt = Date
    S = "short"
    SftMaskDateTime.Calendar.FormatDate Dt, S
    SftTree1.Cell(ItemIndex, 2).Text = S
    SftTree1.Cell(ItemIndex, 2).DataTag = Dt
    
    ItemIndex = SftTree1.Items.Add("66.05")
    SftTree1.Cell(ItemIndex, 0).TextHAlign = halignSftTreeDefaultRight
    SftTree1.Cell(ItemIndex, 1).Text = "Option 2"
    Dt = Date + 1
    S = "short"
    SftMaskDateTime.Calendar.FormatDate Dt, S
    SftTree1.Cell(ItemIndex, 2).Text = S
    SftTree1.Cell(ItemIndex, 2).DataTag = Dt
        
    SftTree1.ColumnsObj.MakeOptimal
    SftTree1.RowHeaders.MakeOptimal
    SftTree1.Items.RecalcHorizontalExtent

    SftTree1.Item(0).Selected = True
End Sub

Private Sub SftTree1_ItemClick(ByVal ItemIndex As Long, ByVal ColIndex As Integer, ByVal AreaType As Integer, ByVal Button As Integer, ByVal Shift As Integer)
    ' User clicked on a cell
    If AreaType = constSftTreeCellText Then
        SftTree1.Cell(ItemIndex, ColIndex).Edit 0, 0
    End If
End Sub

Private Sub SftTree1_EditAllowed(ByVal ItemIndex As Long, ByVal ColIndex As Integer, Allowed As Boolean)
    ' Last chance to suppress cell editing for a cell
    'If ItemIndex = 1 And ColIndex = 1 Then
    '    Allowed = False
    'End If
End Sub

Private Sub SftTree1_EditInitializing(Window As stdole.OLE_HANDLE, vData As Variant, ByVal EditIndex As Long, ByVal EditCol As Integer, LeftPix As stdole.OLE_XPOS_PIXELS, TopPix As stdole.OLE_YPOS_PIXELS, WidthPix As stdole.OLE_XSIZE_PIXELS, HeightPix As stdole.OLE_YSIZE_PIXELS)
    Dim ctrl As Control
    
    ' Choose a control based on current column being edited
    If EditCol = 0 Then
        Set ctrl = SftMaskAmount
    ElseIf EditCol = 1 Then
        Set ctrl = SftBox1
    Else
        Set ctrl = SftMaskDateTime
    End If

    Dim TextHeight As Integer
    ' LeftPix/TopPix/WidthPix/HeightPix describes the current cell area
    ' we need to return the position and size needed for editing.
    ' In this example, we use the height of the control on the form
    ' and center it over the cell.

    TextHeight = ctrl.Height / Screen.TwipsPerPixelX
    TopPix = TopPix + (HeightPix - TextHeight) / 2
    HeightPix = TextHeight

    ' Set the text in the control used for cell editing and
    ' set other control-specific properties
    If ctrl Is SftMaskAmount Then
        SftMaskAmount.Text = SftTree1.Cell(EditIndex, EditCol).Text
        SftMaskAmount.SelStart = 0
        SftMaskAmount.SelLength = 999
    ElseIf ctrl Is SftMaskDateTime Then
        SftMaskDateTime.Contents.DateTime = SftTree1.Cell(EditIndex, EditCol).DataTag
    Else
        SftBox1.Items.Clear
        Dim ItemIndex As Long
        ItemIndex = SftBox1.Items.Add("Option 1")
         SftBox1.Cell(ItemIndex, 1).Text = "Description for option 1"
        ItemIndex = SftBox1.Items.Add("Option 2")
         SftBox1.Cell(ItemIndex, 1).Text = "Description for option 2"
        ItemIndex = SftBox1.Items.Add("Option 3")
         SftBox1.Cell(ItemIndex, 1).Text = "Description for option 3"
        Dim S As String
        S = SftTree1.Cell(EditIndex, EditCol).Text
        If SftBox1.Items.Find(S, 0, 0, False, True, True) < 0 Then
            ItemIndex = SftBox1.Items.Add(S)
             SftBox1.Cell(ItemIndex, 1).Text = "Description for " & S
        End If
        SftBox1.Columns.MakeOptimal 0
        SftBox1.RecalcHorizontalExtent 0
        SftBox1.Edit.Text = SftTree1.Cell(EditIndex, EditCol).Text
    End If

    ' Return the control's window handle
    Window = ctrl.Window

    ' Define navigation keys
    ' VK_TAB
    SftTree1.CellEditIntercept Asc(vbTab), cellEditInterceptSftTreeChar + cellEditInterceptSftTreeControlChar + cellEditInterceptSftTreeShiftChar
    ' VK_RETURN
    SftTree1.CellEditIntercept Asc(vbCr), cellEditInterceptSftTreeChar + cellEditInterceptSftTreeControlChar + cellEditInterceptSftTreeShiftChar
    ' VK_HOME
    SftTree1.CellEditIntercept 36, cellEditInterceptSftTreeControlChar
    ' VK_END
    SftTree1.CellEditIntercept 35, cellEditInterceptSftTreeControlChar
    
    If ctrl Is SftMaskAmount Then
        ' We want these keys just for the amount edit control.
        ' VK_UP
        SftTree1.CellEditIntercept 38, cellEditInterceptSftTreeChar + cellEditInterceptSftTreeControlChar + cellEditInterceptSftTreeShiftChar
        ' VK_DOWN
        SftTree1.CellEditIntercept 40, cellEditInterceptSftTreeChar + cellEditInterceptSftTreeControlChar + cellEditInterceptSftTreeShiftChar
    End If
End Sub

Private Sub SftTree1_EditInitialized(ByVal Window As stdole.OLE_HANDLE, ByVal vData As Variant, ByVal EditIndex As Long, ByVal EditCol As Integer, ByVal ParentWindow As stdole.OLE_HANDLE, ByVal LeftPix As Long, ByVal TopPix As Long, ByVal WidthPix As Long, ByVal HeightPix As Long, Positioned As Boolean)
    ' We position the control (ActiveX controls must be positioned using the EditInitialized event)
    Positioned = True
    
    If Window = SftMaskAmount.hWnd Then
        SftMaskAmount.Left = LeftPix * Screen.TwipsPerPixelX
        SftMaskAmount.Top = TopPix * Screen.TwipsPerPixelY
        SftMaskAmounZen.TwipsPerPixelX
        SftMaskAmount.Height = HeightPix * Screen.TwipsPerPixelY
        SftMaskAmount.Enabled = True
        SftMaskAmount.Visible = True
        SftMaskAmount.SetFocus
    ElseIf Window = SftMaskDateTime.hWnd Then
        SftMaskDateTime.Left = LeftPix * Screen.TwipsPerPixelX
        SftMaskDateTime.Top = TopPix * Screen.TwipsPerPixelY
        SftMaskDateTime.Width = WidthPix * Screen.TwipsPerPixelX
        SftMaskDateTime.Height = HeightPix * Screen.TwipsPerPixelY
        SftMaskDateTime.Enabled = True
        SftMaskDateTime.Visible = True
        SftMaskDateTime.SetFocus
    Else
        SftBox1.Left = LeftPix * Screen.TwipsPerPixelX
        SftBox1.Zeen.TwipsPerPixelY
        SftBox1.Width = WidthPix * Screen.TwipsPerPixelX
        SftBox1.Height = HeightPix * Screen.TwipsPerPixelY
        SftBox1.Enabled = True
        SftBox1.Visible = True
        SftBox1.SetFocus
        SftBox1.Edit.SetSelection 0, -1
        SftBox1.DropDown.Dropped = True
    End If
End Sub

Private Sub SftTree1_EditNavigating(ByVal Key As Long, ByVal Shift As Integer, ByVal ItemIndex As Long, ByVal ColIndex As Integer)
    ' Process key pressed
    SftTree1.EditNavigate Key, Shift
End Sub

Private Sub SftTree1_EditValidate(ByVal Window As stdole.OLE_HANDLE, ByVal vData As Variant, ByVal EditIndex As Long, ByVal EditCol As Integer, InputValid As Boolean)
    ' Validate the new cell contents
    Dim S As String
    If Window = SftMaskAmount.hWnd Then
        If Not SftMaskAmount.Contents.Valid Then
            ' could validate
        End If
        S = SftMaskAmount.TextDisplay
    ElseIf Window = SftMaskDateTime.hWnd Then
        If Not SftMaskDateTime.Contents.Valid Then
            MsgBox ("Please enter a valid date.")
            InputValid = False
            Exit Sub
        End If
        S = SftMaskDateTime.TextDisplay
    Else
        S = SftBox1.Edit.Text
    End If
    S = Trim(S)
    If Len(S) <= 0 Then
        MsgBox ("Just to demonstrate data input validation, this example rejects empty cells.  Please enter some data.")
        InputValid = False
    End If
End Sub

Private Sub SftTree1_EditEnding(ByVal Window As stdole.OLE_HANDLE, ByVal vData As Variant, ByVal EditIndex As Long, ByVal EditCol As Integer, ByVal SaveInput As Boolean)
    ' Save the new cell contents
    If Window = SftMaskAmount.hWnd Then
        SftMaskAmount.Visible = False
        SftMaskAmount.Enabled = False
        If SaveInput Then
            SftTree1.Cell(EditIndex, EditCol).Text = SftMaskAmount.TextDisplay
        End If
    ElseIf Window = SftMaskDateTime.hWnd Then
        SftMaskDateTime.Visible = False
        SftMaskDateTime.Enabled = False
        If SaveInput Then
            SftTree1.Cell(EditIndex, EditCol).Text = SftMaskDateTime.TextDisplay
            SftTree1.Cell(EditIndex, EditCol).DataTag = SftMaskDateTime.Contents.DateTime
        End If
    Else
        SftBox1.Visible = False
        SftBox1.Enabled = False
        If SaveInput Then
            SftTree1.Cell(EditIndex, EditCol).Text = SftBox1.Edit.Text
        End If
    End If
End Sub

Private Sub SftTree1_ToolTipVScroll(Text As String, ByVal ItemIndex As Long, ByVal ColIndex As Integer)
    Text = "Item " & ItemIndex & " - " & Text
End Sub

Private Sub SftMaskAmount_UpDownPress(ByVal Up As Boolean, ByVal FieldStart As Long, ByVal FieldEnd As Long, ByVal Counter As Long, Field As String)
    Dim Increment As Single
    If Counter = 0 Or Counter > 5 Then
        If Val(Field) = 0 Then
            Field = 0
        End If
        Increment = 0.01
        If Counter > 14 Then Increment = 0.1
        If Counter > 23 Then Increment = 1
        If Counter > 52 Then Increment = 10
        If Up Then
            Field = Field + Increment
        Else
            Field = Field - Increment
        End If
        ' If Field > yourMaximum Then Field = yourMaximum
        ' If Field < -yourMaximum Then Field = -yourMaximum
        Field = Format(Field, "###0.00")
    End If
End Sub