home *** CD-ROM | disk | FTP | other *** search
/ PDA Software Library / pdasoftwarelib.iso / PILOT / support / GCM13 / CBASVIEW / CBASVIEW.FRM (.txt) next >
Encoding:
Visual Basic Form  |  1996-11-16  |  16.2 KB  |  498 lines

  1. VERSION 4.00
  2. Begin VB.Form Form1 
  3.    Caption         =   "cBasView 0.1"
  4.    ClientHeight    =   4860
  5.    ClientLeft      =   1140
  6.    ClientTop       =   1575
  7.    ClientWidth     =   6690
  8.    Height          =   5295
  9.    Left            =   1080
  10.    LinkMode        =   1  'Source
  11.    LinkTopic       =   "notify"
  12.    ScaleHeight     =   4860
  13.    ScaleWidth      =   6690
  14.    Top             =   1200
  15.    Width           =   6810
  16.    Begin VB.CommandButton btnOpen 
  17.       Caption         =   "&Open"
  18.       Height          =   375
  19.       Left            =   120
  20.       TabIndex        =   5
  21.       Top             =   120
  22.       Width           =   1335
  23.    End
  24.    Begin VB.TextBox Text1 
  25.       Height          =   4335
  26.       Left            =   2640
  27.       MultiLine       =   -1  'True
  28.       TabIndex        =   4
  29.       Text            =   "cBasView.frx":0000
  30.       Top             =   120
  31.       Width           =   3855
  32.    End
  33.    Begin VB.CommandButton btnDelete 
  34.       Caption         =   "D&elete"
  35.       Height          =   375
  36.       Left            =   1200
  37.       TabIndex        =   3
  38.       Top             =   4320
  39.       Width           =   975
  40.    End
  41.    Begin VB.CommandButton btnNew 
  42.       Caption         =   "&New"
  43.       Height          =   375
  44.       Left            =   120
  45.       TabIndex        =   2
  46.       Top             =   4320
  47.       Width           =   975
  48.    End
  49.    Begin VB.ListBox List1 
  50.       Height          =   2985
  51.       Left            =   120
  52.       TabIndex        =   1
  53.       Top             =   1200
  54.       Width           =   2055
  55.    End
  56.    Begin VB.Label lblStatus 
  57.       Caption         =   "Label2"
  58.       Height          =   255
  59.       Left            =   2640
  60.       TabIndex        =   6
  61.       Top             =   4560
  62.       Width           =   3855
  63.    End
  64.    Begin MSComDlg.CommonDialog CommonDialog1 
  65.       Left            =   1800
  66.       Top             =   120
  67.       _Version        =   65536
  68.       _ExtentX        =   847
  69.       _ExtentY        =   847
  70.       _StockProps     =   0
  71.    End
  72.    Begin VB.Line Line1 
  73.       X1              =   2400
  74.       X2              =   2400
  75.       Y1              =   120
  76.       Y2              =   4680
  77.    End
  78.    Begin VB.Label Label1 
  79.       Caption         =   "Programs:"
  80.       Height          =   255
  81.       Left            =   120
  82.       TabIndex        =   0
  83.       Top             =   840
  84.       Width           =   1695
  85.    End
  86. Attribute VB_Name = "Form1"
  87. Attribute VB_Creatable = False
  88. Attribute VB_Exposed = False
  89. Option Explicit
  90. Const TNAME = 0
  91. Const TCONDUIT = 1
  92. Const TMODULE = 2
  93. Const TCREATOR = 3
  94. Const TREMOTE = 4
  95. Const TDIRECTORY = 5
  96. Const TFILE = 6
  97. Const TBACKUPS = 7
  98. Const TSYNCSOURCE = 8
  99. Const TNEXTSYNCSOURCE = 9
  100. Const TNOTIFYAPPSERVICE = 10
  101. Const TNOTIFYAPPTOPIC = 11
  102. Const TAPPLICATIONX = 12
  103. Const TDISABLE = 13
  104. Dim nNextApp As Integer
  105. Dim bRecordDirty As Integer
  106. Dim nCurrListIndex As Integer
  107. Const REG_SZ As Long = 1
  108. Const REG_DWORD As Long = 4
  109. Const HKEY_CLASSES_ROOT = &H80000000
  110. Const HKEY_CURRENT_USER = &H80000001
  111. Const HKEY_LOCAL_MACHINE = &H80000002
  112. Const HKEY_USERS = &H80000003
  113. Const ERROR_NONE = 0
  114. Const ERROR_BADDB = 1
  115. Const ERROR_BADKEY = 2
  116. Const ERROR_CANTOPEN = 3
  117. Const ERROR_CANTREAD = 4
  118. Const ERROR_CANTWRITE = 5
  119. Const ERROR_OUTOFMEMORY = 6
  120. Const ERROR_INVALID_PARAMETER = 7
  121. Const ERROR_ACCESS_DENIED = 8
  122. Const ERROR_INVALID_PARAMETERS = 87
  123. Const ERROR_NO_MORE_ITEMS = 259
  124. Const KEY_ALL_ACCESS = &H3F
  125. Const REG_OPTION_NON_VOLATILE = 0
  126. Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
  127. Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias _
  128.    "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
  129.    ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions _
  130.    As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes _
  131.    As Long, phkResult As Long, lpdwDisposition As Long) As Long
  132. Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias _
  133.     "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
  134.     ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
  135. Private Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _
  136.     "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  137.     String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
  138.     As String, lpcbData As Long) As Long
  139. Private Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias _
  140.     "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  141.     String, ByVal lpReserved As Long, lpType As Long, lpData As _
  142.     Long, lpcbData As Long) As Long
  143. Private Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias _
  144.     "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
  145.     String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
  146.     As Long, lpcbData As Long) As Long
  147. Private Declare Function RegSetValueExString Lib "advapi32.dll" Alias _
  148.     "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
  149.     ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As _
  150.     String, ByVal cbData As Long) As Long
  151. Private Declare Function RegSetValueExLong Lib "advapi32.dll" Alias _
  152.     "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
  153.     ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, _
  154.     ByVal cbData As Long) As Long
  155. Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
  156.     (ByVal hKey As Long, ByVal lpSubKey As String) As Long
  157. Const sMainKey = "Software\Palm Computing\Pilot Desktop"
  158. Dim sFileName As String
  159. Private Type tHeader
  160.   sName As String * 32
  161.   dwUnknown1 As Long
  162.   dwTime1 As Long
  163.   dwTime2 As Long
  164.   dwTime3 As Long
  165.   dwLastSync As Long
  166.   ofsSort As Long
  167.   ofsCategories As Long
  168.   dwCreator As Long
  169.   dwType As Long
  170.   dwUnknown2  As Long
  171.   dwUnknown As Long
  172.   wNumRecs As Integer
  173. End Type
  174. Const kOfsSort = &H34
  175. Const kOfsCategories = &H38
  176. Const kOfsCreator = &H3C
  177. Const kOfsNumRecs = &H4C
  178. Const kOfsEntries = &H4E
  179. Private Type tRecEntry
  180.   ofs As Long
  181.   attrib As Long
  182. End Type
  183. Const DIRTY = &H40000000
  184. Const DELETED = &H80000000
  185. Dim head As tHeader
  186. 'these three arrays hold ALL the data, includind deleted entries
  187. Dim recIndex() As tRecEntry
  188. Dim attrib_data() As Byte
  189. Dim recs() As Variant
  190. Dim bDirty As Integer
  191. Dim bLoading As Integer 'works with to prevent spurious setting of bDirty
  192. Dim nCurrRec As Integer 'points to the current entry within the whold file
  193.     'on screen, List1 holds the non-deleted records
  194.     'List1.ItemData() holds the nCurrRec index, which points into the whole file arrays above
  195. Dim bEndianSwapped As Integer
  196.     'set when the numbers have been twisted into Mac format
  197. Public Sub AddCR(s As String)
  198.     Dim i As Integer
  199.     i = InStr(s, Chr(0))
  200.     If i Then s = Left(s, i - 1)
  201.     i = InStr(s, Chr(10))
  202.     While (i)
  203.         s = Left(s, i - 1) & Chr(13) & Mid(s, i)
  204.         i = InStr(i + 2, s, Chr(10))
  205.     Wend
  206. End Sub
  207. Private Function GetFileName() As String
  208.     GetFileName = ""
  209.     Dim lRetVal As Long
  210.     Dim hKey As Long
  211.     lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sMainKey & "\Preferences", 0, KEY_ALL_ACCESS, hKey)
  212.     If lRetVal = ERROR_NONE Then
  213.         Dim val As Variant
  214.         lRetVal = QueryValueEx(hKey, "LastUserDir", val)
  215.         If lRetVal = ERROR_NONE Then GetFileName = val & "\cbasview\cbasvw.dat"
  216.     End If
  217. End Function
  218. Function QueryValueEx(ByVal lhKey As Long, _
  219.     ByVal szValueName As String, _
  220.     vValue As Variant) As Long
  221.         Dim cch As Long
  222.         Dim lrc As Long
  223.         Dim lType As Long
  224.         Dim lValue As Long
  225.         Dim sValue As String
  226.         On Error GoTo QueryValueExError
  227.         ' Determine the size and type of data to be read
  228.         lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
  229.         If lrc <> ERROR_NONE Then Error 5
  230.         Select Case lType
  231.             ' For strings
  232.             Case REG_SZ:
  233.                 sValue = String(cch, 0)
  234.                 lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, sValue, cch)
  235.                 If lrc = ERROR_NONE Then
  236.                     vValue = Left$(sValue, cch - 1) 'RegQuery returns the 0 term
  237.                 Else
  238.                     vValue = Empty
  239.                 End If
  240.             ' For DWORDS
  241.             Case REG_DWORD:
  242.                 lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, lValue, cch)
  243.                 If lrc = ERROR_NONE Then vValue = lValue
  244.             Case Else
  245.                 'all other data types not supported
  246.                 lrc = -1
  247.         End Select
  248. QueryValueExExit:
  249.         QueryValueEx = lrc
  250.         Exit Function
  251.         
  252. QueryValueExError:
  253.         Resume QueryValueExExit
  254. End Function
  255.         
  256.         
  257. Private Sub LoadRecords()
  258.     bDirty = False
  259.     List1.Clear
  260.     On Error GoTo lr_err
  261.     Open sFileName For Binary Access Read As #1
  262.     Get #1, , head
  263.     head.wNumRecs = SwapWord(head.wNumRecs)
  264.     head.ofsSort = SwapLong(head.ofsSort)
  265.     Dim i As Integer
  266.     ReDim recIndex(head.wNumRecs) As tRecEntry
  267.     For i = 0 To head.wNumRecs - 1
  268.         Get #1, , recIndex(i)
  269.         recIndex(i).ofs = SwapLong(recIndex(i).ofs)
  270.         recIndex(i).attrib = SwapLong(recIndex(i).attrib)
  271.     Next
  272.     If head.ofsSort > recIndex(0).ofs Then head.ofsSort = recIndex(0).ofs
  273.     ReDim attrib_data(recIndex(0).ofs - head.ofsSort) As Byte
  274.     Seek #1, head.ofsSort + 1
  275.     Get #1, , attrib_data
  276.     ReDim recs(head.wNumRecs)
  277.     Dim dwFileLen
  278.     dwFileLen = FileLen(sFileName)
  279.     Dim r As String
  280.     For i = 0 To head.wNumRecs - 1
  281.         Seek #1, recIndex(i).ofs + 1
  282.         Dim dwLen
  283.         If i < head.wNumRecs - 1 Then
  284.             dwLen = recIndex(i + 1).ofs - recIndex(i).ofs
  285.         Else
  286.             dwLen = dwFileLen - recIndex(i).ofs
  287.         End If
  288.         r = Space(dwLen)
  289.         Seek #1, recIndex(i).ofs + 1
  290.         Get #1, , r
  291.         AddCR r
  292.         recs(i) = r
  293.         'if it's not deleted, show it
  294.         If (recIndex(i).attrib And DELETED) = 0 Then
  295.             List1.AddItem r
  296.             List1.ItemData(List1.ListCount - 1) = i
  297.         End If
  298.     Next
  299.     Close #1
  300.     'this is required to make sure the text swapping works
  301.     Text1.Enabled = False
  302.     nCurrRec = 0
  303.     If List1.ListCount > 0 Then
  304.         List1.ListIndex = 0
  305.         btnNew.Enabled = True
  306.         btnDelete.Enabled = True
  307.         List1.Enabled = True
  308.     End If
  309.     bDirty = False
  310. lr_err:
  311.     Close #1
  312.     On Error GoTo 0
  313. End Sub
  314. Public Sub RemoveCR(s As String)
  315.     Dim i As Integer
  316.     i = InStr(s, Chr(13))
  317.     While (i)
  318.         s = Left(s, i - 1) & Mid(s, i + 1)
  319.         i = InStr(i, s, Chr(13))
  320.     Wend
  321. End Sub
  322. Public Sub SaveRecords()
  323.     On Error GoTo lr_err
  324.     Open sFileName For Binary Access Write As #1
  325.     'restore mac patterns
  326.     Dim nRecs As Integer
  327.     nRecs = head.wNumRecs
  328.     head.wNumRecs = SwapWord(head.wNumRecs)
  329.     head.ofsSort = SwapLong(head.ofsSort)
  330.     Put #1, , head
  331.     'restore
  332.     head.wNumRecs = SwapWord(head.wNumRecs)
  333.     head.ofsSort = SwapLong(head.ofsSort)
  334.     Dim i As Integer
  335.     For i = 0 To nRecs - 1
  336.        recIndex(i).ofs = SwapLong(recIndex(i).ofs)
  337.        recIndex(i).attrib = SwapLong(recIndex(i).attrib)
  338.        Put #1, , recIndex(i)
  339.        'and restore
  340.        recIndex(i).ofs = SwapLong(recIndex(i).ofs)
  341.        recIndex(i).attrib = SwapLong(recIndex(i).attrib)
  342.     Next
  343.     Dim dwPos As Long
  344.     Dim dwPosEnd As Long
  345.     Dim s As String
  346.     'just after the rec index
  347.     dwPos = Seek(1) - 1
  348.     'save the sort data
  349.     Put #1, , attrib_data
  350.     'remember eof
  351.     dwPosEnd = Seek(1) - 1
  352.     'go back and write offset
  353.     Seek #1, kOfsSort + 1  'where the ofsSort data goes
  354.     dwPos = SwapLong(dwPos)
  355.     Put #1, , dwPos
  356.     For i = 0 To nRecs - 1
  357.         'go back to eof
  358.         Seek #1, dwPosEnd + 1
  359.         dwPos = dwPosEnd
  360.         s = recs(i)
  361.         RemoveCR s
  362.         Put #1, , s
  363.         s = Chr(0)
  364.         Put #1, , s 'zero terminate the strings
  365.         dwPosEnd = Seek(1) - 1
  366.         'back into the index
  367.         Seek #1, kOfsEntries + i * 8 + 1
  368.         dwPos = SwapLong(dwPos)
  369.         Put #1, , dwPos
  370.     Next
  371.     Reset
  372. lr_err:
  373.     Close #1
  374.     On Error GoTo 0
  375. End Sub
  376. Private Sub Status()
  377.     Dim s As String
  378.     s = "Status: rec #" & Format(nCurrRec) & "(" & Hex(recIndex(nCurrRec).attrib And &HFFFFFF)
  379.     s = s & ")  len: " & Format(Len(recs(nCurrRec)))
  380.     If recIndex(nCurrRec).attrib And DIRTY Then s = s & "   modified"
  381.     lblStatus.Caption = s
  382. End Sub
  383. Private Sub btnDelete_Click()
  384.     'check for empty list
  385.     If head.wNumRecs = 0 Then Exit Sub
  386.     'assert
  387.     If nCurrRec <> List1.ItemData(List1.ListIndex) Then
  388.         MsgBox "There is a problem with the internal operation of this program. The item has NOT been deleted. Please contact the author at patb@corel.com"
  389.         Exit Sub
  390.     End If
  391.     'clean up data structs, set the dirty bit
  392.     Dim i As Integer
  393.     i = List1.ItemData(List1.ListIndex)
  394.     recIndex(i).attrib = recIndex(i).attrib Or DELETED
  395.     'clean up list box
  396.     i = List1.ListIndex
  397.     List1.RemoveItem i
  398.     If List1.ListCount > 0 Then
  399.         If i = List1.ListCount Then
  400.             List1.ListIndex = i - 1
  401.         Else
  402.             List1.ListIndex = i
  403.         End If
  404.         nCurrRec = List1.ItemData(List1.ListIndex)
  405.     Else
  406.         Text1.Enabled = False
  407.     End If
  408.     bDirty = True
  409. End Sub
  410. Private Sub btnNew_Click()
  411.     head.wNumRecs = head.wNumRecs + 1
  412.     ReDim Preserve recIndex(head.wNumRecs)
  413.     ReDim Preserve recs(head.wNumRecs)
  414.     Dim n As Integer
  415.     n = head.wNumRecs - 1
  416.     nCurrRec = n
  417.     recIndex(n).attrib = DIRTY
  418.     recs(n) = "#enter text here"
  419.     List1.AddItem recs(n)
  420.     'note: must set itemdata first!
  421.     List1.ItemData(List1.NewIndex) = n
  422.     List1.ListIndex = List1.NewIndex
  423.     bDirty = True
  424.     Text1.SetFocus
  425. End Sub
  426. Private Sub btnOpen_Click()
  427.     On Error GoTo open_err
  428.     CommonDialog1.CancelError = True
  429.     ' **************open - aka input file**********************************
  430.     ' Set filters.
  431.     CommonDialog1.Filter = "cBasPadFiles (*.dat)|*.dat|cBasPad Files (*.pdb) |*.pdb| All Files (*.*) |*.*"
  432.     ' Specify default filter, .pdp files
  433.     CommonDialog1.FilterIndex = 1
  434.     CommonDialog1.DialogTitle = "Browse for Input File"
  435.     ' Set flags for open dialog
  436.     CommonDialog1.Flags = cdlOFNPathMustExist + cdlOFNFileMustExist + cdlOFNReadOnly
  437.     ' Display the File Open dialog box.
  438.     CommonDialog1.ShowOpen
  439.     sFileName = CommonDialog1.filename
  440.     LoadRecords
  441.     Exit Sub
  442. open_err:
  443.     On Error GoTo 0
  444. End Sub
  445. Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
  446.     Static sTitle As String
  447.     Select Case CmdStr
  448.         Case "sync start"
  449.             If bDirty Then SaveRecords
  450.             sTitle = Form1.Caption
  451.             Form1.Caption = sTitle & " (syncing)"
  452.             Me.Enabled = False
  453.         Case "sync finished"
  454.             Me.Enabled = True
  455.             Form1.Caption = sTitle
  456.             LoadRecords
  457.     End Select
  458. End Sub
  459. Public Function SwapWord(w As Integer)
  460.     Dim s As String
  461.     s = Right("000" & Hex(w), 4)
  462.     SwapWord = val("&H" & Mid(s, 3, 2) & Mid(s, 1, 2))
  463. End Function
  464. Public Function SwapLong(d As Long)
  465.     Dim s As String
  466.     s = Right("0000000" & Hex(d), 8)
  467.     SwapLong = val("&H" & Mid(s, 7, 2) & Mid(s, 5, 2) & Mid(s, 3, 2) & Mid(s, 1, 2))
  468. End Function
  469. Private Sub Form_Load()
  470.     btnNew.Enabled = False
  471.     btnDelete.Enabled = False
  472.     Text1.Enabled = False
  473.     List1.Enabled = False
  474.     sFileName = GetFileName
  475.     If sFileName <> "" Then
  476.         LoadRecords
  477.     End If
  478. End Sub
  479. Private Sub Form_Unload(Cancel As Integer)
  480.     If bDirty Then SaveRecords
  481. End Sub
  482. Private Sub List1_Click()
  483.     Text1.Enabled = True
  484.     bLoading = True
  485.     nCurrRec = List1.ItemData(List1.ListIndex)
  486.     Text1.Text = recs(nCurrRec)
  487.     bLoading = False
  488. End Sub
  489. Private Sub Text1_Change()
  490.     If Not bLoading Then
  491.         bDirty = True
  492.         recIndex(nCurrRec).attrib = recIndex(nCurrRec).attrib Or DIRTY
  493.         recs(nCurrRec) = Text1.Text
  494.         List1.List(List1.ListIndex) = Text1.Text
  495.     End If
  496.     Status
  497. End Sub
  498.