Tools__StoreProjectBrowser.st
changeset 7008 1342e46cb074
parent 7006 68750ac4af53
child 7009 8664e1a7ac19
--- a/Tools__StoreProjectBrowser.st	Sat Aug 26 15:34:36 2006 +0200
+++ b/Tools__StoreProjectBrowser.st	Sat Aug 26 19:39:52 2006 +0200
@@ -11,6 +11,34 @@
 	category:'System-SourceCodeManagement'
 !
 
+Object subclass:#Pundle
+	instanceVariableNames:'name'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:StoreProjectBrowser
+!
+
+StoreProjectBrowser::Pundle subclass:#Package
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:StoreProjectBrowser
+!
+
+StoreProjectBrowser::Pundle subclass:#Bundle
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:StoreProjectBrowser
+!
+
+Object subclass:#PundleVersion
+	instanceVariableNames:'id pundle version user timestamp comment timestampInt commentId'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:StoreProjectBrowser
+!
+
 !StoreProjectBrowser class methodsFor:'documentation'!
 
 documentation
@@ -102,7 +130,7 @@
                           adjust: left
                         )
                        (InputFieldSpec
-                          name: 'EntryField1'
+                          name: 'PackageFilterEntryField'
                           layout: (LayoutFrame 2 0 30 0 -2 1 58 0)
                           model: packagesFilterHolder
                           immediateAccept: true
@@ -112,11 +140,12 @@
                           acceptOnPointerLeave: false
                         )
                        (SequenceViewSpec
-                          name: 'List1'
+                          name: 'PackageList'
                           layout: (LayoutFrame 0 0 60 0 0 1 0 1)
                           model: selectedPackageHolder
                           hasHorizontalScrollBar: true
                           hasVerticalScrollBar: true
+                          valueChangeSelector: packageSelectionChanged
                           useIndex: true
                           sequenceList: packagesList
                         )
@@ -149,6 +178,7 @@
                                 hasVerticalScrollBar: true
                                 useIndex: true
                                 sequenceList: versionsList
+                                valueChangeSelector: versionSelectionChanged
                               )
                              (ViewSpec
                                 name: 'Box2'
@@ -301,6 +331,27 @@
     ^ newApp
 ! !
 
+!StoreProjectBrowser methodsFor:'actions'!
+
+packageSelectionChanged
+    |newest selectedItem|
+
+    selectedItem := packagesList value at:(selectedPackageHolder value).
+    self updateVersionsListFor:selectedItem.
+
+    versionsList notEmptyOrNil ifTrue:[
+        newest := versionsList value first.
+        self updateCommentFor:selectedItem
+    ].
+!
+
+versionSelectionChanged
+    |selectedItem|
+
+    selectedItem := versionsList value at:(selectedVersionHolder value).
+    self updateCommentFor:selectedItem
+! !
+
 !StoreProjectBrowser methodsFor:'aspects'!
 
 commentTextHolder
@@ -424,8 +475,131 @@
 
 !StoreProjectBrowser methodsFor:'db access'!
 
+getBlob:id
+    |item cursor row blobType blobData|
+
+    item := Set new.
+    cursor := connection 
+                execute:'SELECT blobtype,blobdata FROM tw_blob where primarykey = ',id printString,';'
+                release:false.
+
+    cursor next notNil ifTrue:[
+        row := cursor rowAsArray.
+        blobType := (row at:1).
+        blobData := Base64Coder decode:(row at:2).
+    ].
+    cursor release.
+
+    blobType == 1 ifTrue:[
+        "binary"
+        ^ blobData
+    ].
+    blobType == 2 ifTrue:[
+        "string"
+        ^ blobData asString
+    ].
+    blobType == 3 ifTrue:[
+        "2-byte string"
+self halt.
+        ^ nil
+    ].
+self halt.
+    ^ nil
+!
+
+getBundles
+    |items cursor row|
+
+    items := Set new.
+    cursor := connection 
+                execute:'SELECT DISTINCT name FROM tw_bundle;'
+                release:false.
+
+    [cursor next notNil] whileTrue:[
+        row := cursor rowAsArray.
+        Transcript showCR:row.
+        items add:(Bundle new name:(row at:1)).
+    ].
+    cursor release.
+    ^ items asOrderedCollection sort:[:a :b| a name < b name]
+!
+
+getPackages
+    |items cursor row|
+
+    items := Set new.
+    cursor := connection 
+                execute:'SELECT DISTINCT name FROM tw_package;'
+                release:false.
+
+    [cursor next notNil] whileTrue:[
+        row := cursor rowAsArray.
+        Transcript showCR:row.
+        items add:(Package new name:(row at:1)).
+    ].
+    cursor release.
+    ^ items asOrderedCollection sort:[:a :b| a name < b name]
+!
+
+getVersionsForBundle:aBundle
+    |items cursor row|
+
+    connection isNil ifTrue:[^ self ].
+
+    items := Set new.
+    cursor := connection 
+                execute:'SELECT version,username,timestamp,commentid FROM tw_bundle WHERE name = ''',aBundle name,''';'
+                release:false.
+
+    [cursor next notNil] whileTrue:[
+        |v|
+
+        row := cursor rowAsArray.
+        Transcript showCR:row.
+        v := PundleVersion new.
+        v pundle:aBundle version:(row at:1) user:(row at:2).
+        v timestampInt:(row at:3) commentId:(row at:4).
+        items add:v.
+    ].
+    cursor release.
+    ^ items asOrderedCollection sort:[:a :b| a isVersionAfter: b]
+!
+
+getVersionsForPackage:aPackage
+    connection isNil ifTrue:[^ self ].
+self halt.
+!
+
+updateCommentFor:aPundleVersion
+    |comment|
+
+    comment := self getBlob:(aPundleVersion commentId).
+    self commentTextHolder value:comment.
+!
+
 updatePackagesList
-    self halt.
+    |bundles packages|
+
+    connection isNil ifTrue:[^ self ].
+
+    self withReadCursorDo:[
+        bundles := self getBundles.
+        packages := self getPackages.
+    ].
+    packagesList value:(bundles , packages).
+!
+
+updateVersionsListFor:aBundleOrPackage
+    |items|
+
+    self withReadCursorDo:[
+        aBundleOrPackage isBundle ifTrue:[
+            items := self getVersionsForBundle:aBundleOrPackage
+        ] ifFalse:[
+            items := self getVersionsForPackage:aBundleOrPackage
+        ].
+    ].
+    versionsList value:items.
 ! !
 
 !StoreProjectBrowser methodsFor:'help'!
@@ -455,7 +629,7 @@
     ^ self
 !
 
-postBuildWith:aBuilder
+postOpenWith:aBuilder
     self updatePackagesList.
 !
 
@@ -506,8 +680,140 @@
     "/ HTMLDocumentView openFullOnDocumentationFile:'help/<MyApplication>/TOP.html'.
 ! !
 
+!StoreProjectBrowser::Pundle methodsFor:'accessing'!
+
+name
+    ^ name
+!
+
+name:something
+    name := something.
+! !
+
+!StoreProjectBrowser::Pundle methodsFor:'printing'!
+
+displayString
+    ^ name
+! !
+
+!StoreProjectBrowser::Pundle methodsFor:'testing'!
+
+isBundle
+    ^ false
+!
+
+isPackage
+    ^ false
+! !
+
+!StoreProjectBrowser::Package methodsFor:'testing'!
+
+isPackage
+    ^ true
+! !
+
+!StoreProjectBrowser::Bundle methodsFor:'printing'!
+
+displayString
+    ^ name ,' (Bundle)'
+! !
+
+!StoreProjectBrowser::Bundle methodsFor:'testing'!
+
+isBundle
+    ^ true
+! !
+
+!StoreProjectBrowser::PundleVersion methodsFor:'accessing'!
+
+commentId
+    ^ commentId
+!
+
+id
+    ^ id
+!
+
+id:something
+    id := something.
+!
+
+pundle
+    ^ pundle
+!
+
+pundle:pundleArg version:versionArg user:userArg 
+    pundle := pundleArg.
+    version := versionArg.
+    user := userArg.
+!
+
+timestamp
+    |deltaSeconds|
+
+    timestamp isNil ifTrue:[
+        "/ to compute the timestamp, we have to do this:
+        "/   the timestampInt are seconds since 1993 + 10d + 19min + 47sec"
+        "/   can anyone explain this ????
+        deltaSeconds := 23*365 * 24*60*60.                  "/ 23 years
+        deltaSeconds := deltaSeconds + (233*24*60*60).      "/ 10 days
+        deltaSeconds := deltaSeconds + (19*60).             "/ 19 minutes
+        deltaSeconds := deltaSeconds + (47).                "/ 47 seconds
+
+        timestamp := Timestamp secondsSince1970:(timestampInt + deltaSeconds).
+    ].
+    ^ timestamp
+!
+
+timestampInt:timestampIntArg commentId:commentIdArg 
+    timestampInt := timestampIntArg.
+    commentId := commentIdArg.
+!
+
+user
+    ^ user
+!
+
+version
+    ^ version
+! !
+
+!StoreProjectBrowser::PundleVersion methodsFor:'comparing'!
+
+isVersionAfter:anotherVersion
+    |myMajor othersMajor myMinor othersMinor|
+
+    myMajor := self majorVersion.
+    othersMajor := anotherVersion majorVersion.
+
+    myMajor > othersMajor ifTrue:[^ true].
+    myMajor < othersMajor ifTrue:[^ false].
+
+    myMinor := self minorVersion.
+    othersMinor := anotherVersion minorVersion.
+
+    myMinor > othersMinor ifTrue:[^ true].
+    myMinor < othersMinor ifTrue:[^ false].
+
+    ^ version > anotherVersion version
+!
+
+majorVersion
+    ^ Integer readFrom:(version upTo:$:)
+!
+
+minorVersion
+    ^ Integer readFrom:((version restAfter:$.) upTo:$.)
+! !
+
+!StoreProjectBrowser::PundleVersion methodsFor:'printing'!
+
+displayString
+    ^ version , ' (',user,') ' , self timestamp printString
+! !
+
 !StoreProjectBrowser class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/Tools__StoreProjectBrowser.st,v 1.1 2006-08-26 13:32:45 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/Tools__StoreProjectBrowser.st,v 1.2 2006-08-26 17:39:52 cg Exp $'
 ! !