RAD - Case Study Version 2

J. Landman Gay jacque at hyperactivesw.com
Sat Mar 25 14:50:52 EST 2006


I've done version 2. It took me longer to figure out your scripts than 
to write my own. Total scripting time was actually about ten minutes, 
the rest was in trying to decipher yours so as to figure out what I 
needed to do.

> Using ISM all I had to do was this:
> 
> 1. Copy and Paste the existing groups in question -  Group_SelectFolder, 
> Group_SelectFile and Group_FileContents so there  were now two of each.
> 
> 2. Arrange the new groups nicely in the window.
> 
> 3. Change any user visible text to read A and B as appropriate.
> 
> 4. Change the custom properties "cpFolderKind" and "cpFileKind" so  that 
> the new groups now read FolderKindB and FileKindB.
> 
> That's all I needed to do to get the basic functionality of having 2  x 
> Base Folders, 2 x FIle Lists and 2 x File Contents working. (I  repeated 
> this action just now in a test stack and it took less than 5  minutes).

I did exactly the same thing, but I didn't need to do step 4 because my 
method uses no custom properties. I option-dragged the existing group to 
create a duplicate. Took 2 seconds, and that is all that was required.

> 
> With this working, I needed to add a new Group to do the compare. The  
> pseudo code for this (very close to the real code) is shown below  
> marked as Version 2.


I only added a single button, not in any group, called "Compare". It has 
a one-liner script:

on mouseup
  compareFiles
end mouseup

After that, all I needed to do was alter the master stack script. I 
needed to add 1 line to the existing script, and add two new handlers 
and a constant. Here is what I did:

constant kCompareNumber

on setfolder tFolder -- this one is unchanged
   put the ID of the owner of the target into tGrp
   put tFolder into fld "basefolder" of grp ID tGrp
   put the directory into tOldDir
   set the directory to tFolder
   put the files into fld "folderContents" of grp ID tGrp
   put "" into fld "fileContents" of grp ID tGrp
   set the directory to tOldDir
end setfolder

on putFileContents tFile -- added 1 line at end
   put the ID of the owner of the target into tGrp
   put fld "basefolder" of grp ID tGrp & slash & tFile into tFilePath
   put url ("file:"&tFilePath) into fld "fileContents" of grp ID tGrp
   set the enabled of btn  "Compare" to (the number of items in \
        validFlds() = kCompareNumber)
end putFileContents

on compareFiles -- new handler
   put validFlds() into tFldList
   if the number of items in tFldList <> kCompareNumber
   then exit compareFiles
   repeat for each item i in tFldList
     set the hilitedlines of fld id i to calcCompare(tFldList)
   end repeat
end compareFiles

function validFlds -- new hander
   repeat with x = 1 to the number of grps
     if there is a fld "fileContents" of grp x and fld "fileContents" of 
grp x <> ""
     then put the ID of fld "fileContents" of grp x & comma after tFldList
   end repeat
   delete last char of tFldList
   return tFldList
end validFlds

Because these handlers are all in the same script, changing it affects 
all existing groups and any new groups that are cloned from the 
existing. I have made the new handlers extensible so that you could 
compare 3 or 4 or any number of text fields simply by changing the 
number of items required, which is stored in the constant kCompareNumber.

You didn't show the actual handler that compares the files, but that's 
okay, presumably mine and yours would be fairly similar and do the same 
thing, so we don't have to consider that in our comparison.

I didn't have to change anything in the existing groups, and my scripts 
are (to my eyes, anyway) easier to follow and debug later. They are much 
shorter. They don't require any custom properties or special treatment.

Seems easier to me, but maybe I'm just too used to the xtalk paradigm. 
By comparison, your way looks complex, difficult to debug, and there are 
scripts in so very many places that following the messaging path in a 
debugging session seems harder than it really has to be. Again, maybe 
it's just my own perception.

It's been an interesting exercise for a Saturday afternoon, thanks for 
the opportunity. I'll bow out now.


> Version 2 - Compare files
> There are two versions of each of the groups shown in Version 1  already 
> in the card/stack.
> 
> Please note that the setting of the CustomProperties "cpFolderKind"  and 
> "cpFileKind" are shown here as being initialized in the Script.  In 
> reality this is commented out and they are set by the developer in  the 
> Property Inspector.
> 
> Also note that this uses "me" as in "put empty into me", this causes  
> problems when sending messages to multiple cards and in the real code  
> it now reads "set the text of the long id of me to empty". I didn't  
> bother to change it here as the former style is easier to read.
> ------------------------------------
>  [Field_FileCompareResults]   (Button_FileCompare)
> 
> Group_FileCompare
> 
> Script for Group_FileCompare:
> 
> on ISM_InitializeObject
> set the cpFolderKindA of me to "FolderKindA"
> set the cpFolderKindB of me to "FolderKindB"
> 
> set the cpFileAValidFlag of me to false
> set the cpFileBValidFlag of me to false
> end ISM_InitializeObject
> 
> 
> Script for Button_FileCompare:
> 
> on ISM_InitializeObject
> disable me
> get ISM_ListenForMessages("msg_FolderSelected",the cpFolderKindA of  the 
> long owner of me)
> get ISM_ListenForMessages("msg_FolderSelected",the cpFolderKindB of  the 
> long owner of me)
> 
> get ISM_ListenForMessages("msg_FileSelected",the cpFileKindA of the  
> long owner of me)
> get ISM_ListenForMessages("msg_FileSelected",the cpFileKindB of the  
> long owner of me)
> end ISM_InitializeObject
> 
> on msg_FolderSelected theMessageID, theMessageKind, theFolderPathName
> disable me
> if theMessageKind = the cpFolderKindA of the long owner of me then
>   set the cpFileAValidFlag of the long owner of me to false
> else
>   set the cpFileBValidFlag of the long owner of me to false
> end if
> end msg_FolderSelected
> 
> on msg_FileSelected theMessageID, theMessageKind, theFilePathName
> if theMessageKind = the cpFileKindA of the long owner of me then
>   set the cpFileAPathName of the long owner of me to theFilePathName
>   set the cpFileAValidFlag of the long owner of me to true
> else
>   set the cpFileBPathName of the long owner of me to theFilePathName
>   set the cpFileBValidFlag of the long owner of me to true
> end if
> 
> if (the cpFileAValidFlag of the long owner of me = true) and (the  
> cpFileBValidFlag of the long owner of me = true) then
>   enable me
> else
>   disable me
> end if
> end msg_FileSelected
> 
> on mouseUp
> get ISM_PutMessage("msg_FileCompare", "KindCompareLines", the  
> cpFileAPathName of the long owner of me & "|" & the cpFileBPathName  of 
> the long owner of me)
> end mouseUp
> 
> Script for Field_FileContents:
> 
> on ISM_InitializeObject
> put empty into me
> get ISM_ListenForMessages("msg_FileCompare","KindCompareLines")
> end ISM_InitializeObject
> 
> on msg_FileCompare theMessageID, theMessageKind, theFilesToCompare
> set the itemDelimiter to "|"
> put CompareFiles(item 1 of theFilesToCompare,item 2 of  
> theFilesToCompare) into myDifferentLinesList
> set the hilitedlines of the text of me to myDifferentLinesList
> end msg_FileCompare
> 
> on msg_FolderSelected theMessageID, theMessageKind, theFolderPathName
> put empty into me
> if theMessageKind = the cpFolderKindA of the long owner of me then
>   set the cpFileAValidFlag of the long owner of me to false
> else
>   set the cpFileBValidFlag of the long owner of me to false
> end if
> end msg_FolderSelected
> 
> on msg_FileSelected theMessageID, theMessageKind, theFilePathName
> put empty into me
> end msg_FolderSelected
> 
> 
> _______________________________________________
> use-revolution mailing list
> use-revolution at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your 
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-revolution
> 
> 
> 


-- 
Jacqueline Landman Gay         |     jacque at hyperactivesw.com
HyperActive Software           |     http://www.hyperactivesw.com



More information about the Use-livecode mailing list