Переглянути джерело

Update the tab label when a class or package is selected

Nicolas Petton 10 роки тому
батько
коміт
7f4bcbec5c
6 змінених файлів з 599 додано та 686 видалено
  1. 67 0
      src/Helios-Announcements.js
  2. 22 0
      src/Helios-Announcements.st
  3. 94 9
      src/Helios-Browser.js
  4. 30 2
      src/Helios-Browser.st
  5. 234 562
      src/Helios-Core.js
  6. 152 113
      src/Helios-Core.st

+ 67 - 0
src/Helios-Announcements.js

@@ -582,4 +582,71 @@ globals.HLShowTemplate);
 
 smalltalk.addClass('HLSourceCodeSaved', globals.HLAnnouncement, [], 'Helios-Announcements');
 
+
+smalltalk.addClass('HLTabLabelChanged', globals.HLAnnouncement, ['label', 'widget'], 'Helios-Announcements');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "label",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+var $1;
+$1=self["@label"];
+return $1;
+},
+args: [],
+source: "label\x0a\x09^ label",
+messageSends: [],
+referencedClasses: []
+}),
+globals.HLTabLabelChanged);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "label:",
+protocol: 'accessing',
+fn: function (aString){
+var self=this;
+self["@label"]=aString;
+return self},
+args: ["aString"],
+source: "label: aString\x0a\x09label := aString",
+messageSends: [],
+referencedClasses: []
+}),
+globals.HLTabLabelChanged);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "widget",
+protocol: 'accessing',
+fn: function (){
+var self=this;
+var $1;
+$1=self["@widget"];
+return $1;
+},
+args: [],
+source: "widget\x0a\x09^ widget",
+messageSends: [],
+referencedClasses: []
+}),
+globals.HLTabLabelChanged);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "widget:",
+protocol: 'accessing',
+fn: function (aWidget){
+var self=this;
+self["@widget"]=aWidget;
+return self},
+args: ["aWidget"],
+source: "widget: aWidget\x0a\x09widget := aWidget",
+messageSends: [],
+referencedClasses: []
+}),
+globals.HLTabLabelChanged);
+
+
 });

+ 22 - 0
src/Helios-Announcements.st

@@ -298,3 +298,25 @@ HLAnnouncement subclass: #HLSourceCodeSaved
 	instanceVariableNames: ''
 	package: 'Helios-Announcements'!
 
+HLAnnouncement subclass: #HLTabLabelChanged
+	instanceVariableNames: 'label widget'
+	package: 'Helios-Announcements'!
+
+!HLTabLabelChanged methodsFor: 'accessing'!
+
+label
+	^ label
+!
+
+label: aString
+	label := aString
+!
+
+widget
+	^ widget
+!
+
+widget: aWidget
+	widget := aWidget
+! !
+

+ 94 - 9
src/Helios-Browser.js

@@ -111,23 +111,23 @@ smalltalk.addMethod(
 smalltalk.method({
 selector: "model",
 protocol: 'accessing',
-fn: function () {
+fn: function (){
 var self=this;
 function $HLBrowserModel(){return globals.HLBrowserModel||(typeof HLBrowserModel=="undefined"?nil:HLBrowserModel)}
 return smalltalk.withContext(function($ctx1) { 
 var $2,$1;
 $2=self["@model"];
 if(($receiver = $2) == nil || $receiver == null){
-self["@model"]=_st($HLBrowserModel())._new();
+self._model_(_st($HLBrowserModel())._new());
 $1=self["@model"];
 } else {
 $1=$2;
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"model",{},globals.HLBrowser)});},
+}, function($ctx1) {$ctx1.fill(self,"model",{},globals.HLBrowser)})},
 args: [],
-source: "model\x0a\x09^ model ifNil: [ model := HLBrowserModel new ]",
-messageSends: ["ifNil:", "new"],
+source: "model\x0a\x09^ model ifNil: [ self model: HLBrowserModel new. model ]",
+messageSends: ["ifNil:", "model:", "new"],
 referencedClasses: ["HLBrowserModel"]
 }),
 globals.HLBrowser);
@@ -136,13 +136,98 @@ smalltalk.addMethod(
 smalltalk.method({
 selector: "model:",
 protocol: 'accessing',
-fn: function (aModel) {
+fn: function (aModel){
 var self=this;
+return smalltalk.withContext(function($ctx1) { 
 self["@model"]=aModel;
-return self;},
+self._observeModel();
+return self}, function($ctx1) {$ctx1.fill(self,"model:",{aModel:aModel},globals.HLBrowser)})},
 args: ["aModel"],
-source: "model: aModel\x0a\x09model := aModel",
-messageSends: [],
+source: "model: aModel\x0a\x09model := aModel.\x0a\x09self observeModel",
+messageSends: ["observeModel"],
+referencedClasses: []
+}),
+globals.HLBrowser);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "observeModel",
+protocol: 'actions',
+fn: function (){
+var self=this;
+function $HLPackageSelected(){return globals.HLPackageSelected||(typeof HLPackageSelected=="undefined"?nil:HLPackageSelected)}
+function $HLClassSelected(){return globals.HLClassSelected||(typeof HLClassSelected=="undefined"?nil:HLClassSelected)}
+return smalltalk.withContext(function($ctx1) { 
+var $2,$1;
+$2=self._model();
+$ctx1.sendIdx["model"]=1;
+$1=_st($2)._announcer();
+$ctx1.sendIdx["announcer"]=1;
+_st($1)._on_send_to_($HLPackageSelected(),"onPackageSelected:",self);
+$ctx1.sendIdx["on:send:to:"]=1;
+_st(_st(self._model())._announcer())._on_send_to_($HLClassSelected(),"onClassSelected:",self);
+return self}, function($ctx1) {$ctx1.fill(self,"observeModel",{},globals.HLBrowser)})},
+args: [],
+source: "observeModel\x0a\x09self model announcer\x0a\x09\x09on: HLPackageSelected\x0a\x09\x09send: #onPackageSelected:\x0a\x09\x09to: self.\x0a\x09\x09\x0a\x09self model announcer\x0a\x09\x09on: HLClassSelected\x0a\x09\x09send: #onClassSelected:\x0a\x09\x09to: self",
+messageSends: ["on:send:to:", "announcer", "model"],
+referencedClasses: ["HLPackageSelected", "HLClassSelected"]
+}),
+globals.HLBrowser);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "onClassSelected:",
+protocol: 'reactions',
+fn: function (anAnnouncement){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$3,$2;
+$1=_st(anAnnouncement)._item();
+if(($receiver = $1) == nil || $receiver == null){
+$3=_st(self._model())._selectedPackage();
+if(($receiver = $3) == nil || $receiver == null){
+$2=self._defaultTabLabel();
+} else {
+var package_;
+package_=$receiver;
+$2=_st(package_)._name();
+$ctx1.sendIdx["name"]=1;
+};
+self._setTabLabel_($2);
+$ctx1.sendIdx["setTabLabel:"]=1;
+} else {
+var item;
+item=$receiver;
+self._setTabLabel_(_st(item)._name());
+};
+return self}, function($ctx1) {$ctx1.fill(self,"onClassSelected:",{anAnnouncement:anAnnouncement},globals.HLBrowser)})},
+args: ["anAnnouncement"],
+source: "onClassSelected: anAnnouncement\x0a\x09anAnnouncement item \x0a\x09\x09ifNil: [ self setTabLabel: (self model selectedPackage \x0a\x09\x09\x09ifNil: [ self defaultTabLabel ]\x0a\x09\x09\x09ifNotNil: [ :package | package name ]) ] \x0a\x09\x09ifNotNil: [ :item | self setTabLabel: item name ]",
+messageSends: ["ifNil:ifNotNil:", "item", "setTabLabel:", "selectedPackage", "model", "defaultTabLabel", "name"],
+referencedClasses: []
+}),
+globals.HLBrowser);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "onPackageSelected:",
+protocol: 'reactions',
+fn: function (anAnnouncement){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(anAnnouncement)._item();
+if(($receiver = $1) == nil || $receiver == null){
+$1;
+} else {
+var item;
+item=$receiver;
+self._setTabLabel_(_st(item)._name());
+};
+return self}, function($ctx1) {$ctx1.fill(self,"onPackageSelected:",{anAnnouncement:anAnnouncement},globals.HLBrowser)})},
+args: ["anAnnouncement"],
+source: "onPackageSelected: anAnnouncement\x0a\x09anAnnouncement item ifNotNil: [ :item |\x0a\x09self setTabLabel: item name ]",
+messageSends: ["ifNotNil:", "item", "setTabLabel:", "name"],
 referencedClasses: []
 }),
 globals.HLBrowser);

+ 30 - 2
src/Helios-Browser.st

@@ -12,11 +12,12 @@ environment
 !
 
 model
-	^ model ifNil: [ model := HLBrowserModel new ]
+	^ model ifNil: [ self model: HLBrowserModel new. model ]
 !
 
 model: aModel
-	model := aModel
+	model := aModel.
+	self observeModel
 ! !
 
 !HLBrowser methodsFor: 'actions'!
@@ -25,6 +26,18 @@ focus
 	^ self packagesListWidget focus
 !
 
+observeModel
+	self model announcer
+		on: HLPackageSelected
+		send: #onPackageSelected:
+		to: self.
+		
+	self model announcer
+		on: HLClassSelected
+		send: #onClassSelected:
+		to: self
+!
+
 openClassNamed: aString
 	self model openClassNamed: aString
 !
@@ -61,6 +74,21 @@ registerBindingsOn: aBindingGroup
 		for: self model
 ! !
 
+!HLBrowser methodsFor: 'reactions'!
+
+onClassSelected: anAnnouncement
+	anAnnouncement item 
+		ifNil: [ self setTabLabel: (self model selectedPackage 
+			ifNil: [ self defaultTabLabel ]
+			ifNotNil: [ :package | package name ]) ] 
+		ifNotNil: [ :item | self setTabLabel: item name ]
+!
+
+onPackageSelected: anAnnouncement
+	anAnnouncement item ifNotNil: [ :item |
+	self setTabLabel: item name ]
+! !
+
 !HLBrowser methodsFor: 'rendering'!
 
 renderContentOn: html

Різницю між файлами не показано, бо вона завелика
+ 234 - 562
src/Helios-Core.js


+ 152 - 113
src/Helios-Core.st

@@ -491,115 +491,6 @@ do: aBlock on: aCollection displaying: aString
 		displaying: aString
 ! !
 
-Widget subclass: #HLTabWidget
-	instanceVariableNames: 'widget label root'
-	package: 'Helios-Core'!
-!HLTabWidget commentStamp!
-I am a widget specialized into building another widget as an Helios tab.
-
-I should not be used directly, `HLWidget class >> #openAsTab` should be used instead.
-
-## Example
-
-    HLWorkspace openAsTab!
-
-!HLTabWidget methodsFor: 'accessing'!
-
-activate
-	self manager activate: self
-!
-
-add
-	self manager addTab: self
-!
-
-cssClass
-	^ self widget tabClass
-!
-
-displayLabel
-	^ self label size > 20 
-		ifTrue: [ (self label first: 20), '...' ]
-		ifFalse: [ self label ]
-!
-
-focus
-	self widget canHaveFocus ifTrue: [
-		self widget focus ]
-!
-
-label
-	^ label ifNil: [ '' ]
-!
-
-label: aString
-	label := aString
-!
-
-manager
-	^ HLManager current
-!
-
-widget
-	^ widget
-!
-
-widget: aWidget
-	widget := aWidget
-! !
-
-!HLTabWidget methodsFor: 'actions'!
-
-hide
-	root ifNotNil: [ root asJQuery css: 'visibility' put: 'hidden' ]
-!
-
-registerBindings
-	self widget registerBindings
-!
-
-remove
-	self widget unregister.
-	root ifNotNil: [ root asJQuery remove ]
-!
-
-show
-	root
-		ifNil: [ self appendToJQuery: 'body' asJQuery ]
-		ifNotNil: [ root asJQuery css: 'visibility' put: 'visible' ]
-! !
-
-!HLTabWidget methodsFor: 'rendering'!
-
-renderOn: html
-	root := html div
-		class: 'tab';
-		yourself.
-	self renderTab
-!
-
-renderTab
-	root contents: [ :html |
-		html div
-			class: 'amber_box';
-			with: [ self widget renderOn: html ] ]
-! !
-
-!HLTabWidget methodsFor: 'testing'!
-
-isActive
-	^ self manager activeTab = self
-! !
-
-!HLTabWidget class methodsFor: 'instance creation'!
-
-on: aWidget labelled: aString
-	^ self new
-		widget: aWidget;
-		label: aString;
-		yourself
-! !
-
 Widget subclass: #HLWidget
 	instanceVariableNames: 'wrapper'
 	package: 'Helios-Core'!
@@ -644,6 +535,13 @@ manager
 	^ HLManager current
 !
 
+setTabLabel: aString
+	self manager announcer announce: (HLTabLabelChanged new
+		widget: self;
+		label: aString;
+		yourself)
+!
+
 tabClass
 	^ self class tabClass
 !
@@ -676,7 +574,8 @@ inform: aString
 !
 
 openAsTab
-	HLManager current addTab: (HLTabWidget on: self labelled: self class tabLabel)
+	(HLTabWidget on: self labelled: self defaultTabLabel)
+		add
 !
 
 request: aString do: aBlock
@@ -695,6 +594,12 @@ unregister
 	Widgets subscribing to announcements should unregister there"
 ! !
 
+!HLWidget methodsFor: 'defaults'!
+
+defaultTabLabel
+	^ self class tabLabel
+! !
+
 !HLWidget methodsFor: 'keybindings'!
 
 bindKeyDown: keyDownBlock keyUp: keyUpBlock
@@ -749,9 +654,9 @@ openAsTab
 	| instance |
 	
 	instance := self new.
-	HLManager current addTab: (HLTabWidget 
+	(HLTabWidget 
 		on: instance 
-		labelled: self tabLabel).
+		labelled: instance defaultTabLabel) add.
 	^ instance
 !
 
@@ -1259,7 +1164,7 @@ renderContentOn: html
 ! !
 
 HLWidget subclass: #HLManager
-	instanceVariableNames: 'tabs activeTab environment history'
+	instanceVariableNames: 'tabs activeTab environment history announcer'
 	package: 'Helios-Core'!
 
 !HLManager methodsFor: 'accessing'!
@@ -1268,6 +1173,10 @@ activeTab
 	^ activeTab
 !
 
+announcer
+	^ announcer ifNil: [ announcer := Announcer new ]
+!
+
 environment
 	"The default environment used by all Helios objects"
     
@@ -2082,3 +1991,133 @@ default
 	^ default ifNil: [ default := self new ]
 ! !
 
+HLWidget subclass: #HLTabWidget
+	instanceVariableNames: 'widget label root'
+	package: 'Helios-Core'!
+!HLTabWidget commentStamp!
+I am a widget specialized into building another widget as an Helios tab.
+
+I should not be used directly, `HLWidget class >> #openAsTab` should be used instead.
+
+## Example
+
+    HLWorkspace openAsTab!
+
+!HLTabWidget methodsFor: 'accessing'!
+
+activate
+	self manager activate: self
+!
+
+cssClass
+	^ self widget tabClass
+!
+
+displayLabel
+	^ self label size > 20 
+		ifTrue: [ (self label first: 20), '...' ]
+		ifFalse: [ self label ]
+!
+
+focus
+	self widget canHaveFocus ifTrue: [
+		self widget focus ]
+!
+
+label
+	^ label ifNil: [ '' ]
+!
+
+label: aString
+	label := aString
+!
+
+manager
+	^ HLManager current
+!
+
+widget
+	^ widget
+!
+
+widget: aWidget
+	widget := aWidget
+! !
+
+!HLTabWidget methodsFor: 'actions'!
+
+add
+	self manager addTab: self.
+	self observeManager
+!
+
+hide
+	root ifNotNil: [ root asJQuery css: 'visibility' put: 'hidden' ]
+!
+
+observeManager
+	self manager announcer 
+		on: HLTabLabelChanged
+		send: #onTabLabelChanged:
+		to: self
+!
+
+registerBindings
+	self widget registerBindings
+!
+
+remove
+	self unregister.
+	self widget unregister.
+	root ifNotNil: [ root asJQuery remove ]
+!
+
+show
+	root
+		ifNil: [ self appendToJQuery: 'body' asJQuery ]
+		ifNotNil: [ root asJQuery css: 'visibility' put: 'visible' ]
+!
+
+unregister
+	self manager announcer unsubscribe: self
+! !
+
+!HLTabWidget methodsFor: 'reactions'!
+
+onTabLabelChanged: anAnnouncement
+	anAnnouncement widget = self widget ifTrue: [
+		self label: anAnnouncement label.
+		self manager refresh]
+! !
+
+!HLTabWidget methodsFor: 'rendering'!
+
+renderOn: html
+	root := html div
+		class: 'tab';
+		yourself.
+	self renderTab
+!
+
+renderTab
+	root contents: [ :html |
+		html div
+			class: 'amber_box';
+			with: [ self widget renderOn: html ] ]
+! !
+
+!HLTabWidget methodsFor: 'testing'!
+
+isActive
+	^ self manager activeTab = self
+! !
+
+!HLTabWidget class methodsFor: 'instance creation'!
+
+on: aWidget labelled: aString
+	^ self new
+		widget: aWidget;
+		label: aString;
+		yourself
+! !
+

Деякі файли не було показано, через те що забагато файлів було змінено