Browse Source

Helios: uses ctrl+> and ctrl+< to switch tabs

Nicolas Petton 11 years ago
parent
commit
1aaa98f651
2 changed files with 102 additions and 24 deletions
  1. 81 20
      src/Helios-Core.js
  2. 21 4
      src/Helios-Core.st

+ 81 - 20
src/Helios-Core.js

@@ -3411,6 +3411,43 @@ referencedClasses: []
 }),
 globals.HLManager);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "activatePreviousTab",
+protocol: 'actions',
+fn: function (){
+var self=this;
+var previousTab;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$5,$4,$3;
+var $early={};
+try {
+$1=self._tabs();
+$ctx1.sendIdx["tabs"]=1;
+_st($1)._ifEmpty_((function(){
+throw $early=[self];
+}));
+$2=self._tabs();
+$ctx1.sendIdx["tabs"]=2;
+$5=self._tabs();
+$ctx1.sendIdx["tabs"]=3;
+$4=_st($5)._indexOf_(self._activeTab());
+$3=_st($4).__minus((1));
+previousTab=_st($2)._at_ifAbsent_($3,(function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(self._tabs())._last();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)})}));
+self._activate_(previousTab);
+return self}
+catch(e) {if(e===$early)return e[0]; throw e}
+}, function($ctx1) {$ctx1.fill(self,"activatePreviousTab",{previousTab:previousTab},globals.HLManager)})},
+args: [],
+source: "activatePreviousTab\x0a\x09| previousTab |\x0a\x09\x0a\x09self tabs ifEmpty: [ ^ self ].\x0a\x09\x0a\x09previousTab := self tabs \x0a\x09\x09at: (self tabs indexOf: self activeTab) - 1 \x0a\x09\x09ifAbsent: [ self tabs last ].\x0a\x09\x09\x0a\x09self activate: previousTab",
+messageSends: ["ifEmpty:", "tabs", "at:ifAbsent:", "-", "indexOf:", "activeTab", "last", "activate:"],
+referencedClasses: []
+}),
+globals.HLManager);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "activeTab",
@@ -4135,42 +4172,66 @@ protocol: 'private',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$3,$4,$5,$6;
+var $1,$3,$4,$5,$2,$7,$6,$8,$9,$10,$11,$12;
 $1="body"._asJQuery();
 $ctx1.sendIdx["asJQuery"]=1;
-_st($1)._keydown_((function(event){
+_st($1)._keypress_((function(event){
 return smalltalk.withContext(function($ctx2) {
-$2=_st(_st(_st(event)._which()).__eq((9)))._and_((function(){
+$3=_st(event)._ctrlKey();
+$ctx2.sendIdx["ctrlKey"]=1;
+$2=_st($3)._and_((function(){
 return smalltalk.withContext(function($ctx3) {
-return _st(event)._shiftKey();
+$4=_st(event)._which();
+$ctx3.sendIdx["which"]=1;
+$5="<"._asciiValue();
+$ctx3.sendIdx["asciiValue"]=1;
+return _st($4).__eq($5);
+$ctx3.sendIdx["="]=1;
 }, function($ctx3) {$ctx3.fillBlock({},$ctx2,2)})}));
+$ctx2.sendIdx["and:"]=1;
 if(smalltalk.assert($2)){
-self._activateNextTab();
+self._activatePreviousTab();
 _st(event)._preventDefault();
+$ctx2.sendIdx["preventDefault"]=1;
 };
-$3=_st(event)._ctrlKey();
-if(smalltalk.assert($3)){
-$4="body"._asJQuery();
-$ctx2.sendIdx["asJQuery"]=2;
-return _st($4)._addClass_("navigation");
+$7=_st(event)._ctrlKey();
+$ctx2.sendIdx["ctrlKey"]=2;
+$6=_st($7)._and_((function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(_st(event)._which()).__eq(">"._asciiValue());
+}, function($ctx3) {$ctx3.fillBlock({},$ctx2,4)})}));
+if(smalltalk.assert($6)){
+self._activateNextTab();
+return _st(event)._preventDefault();
 };
 }, function($ctx2) {$ctx2.fillBlock({event:event},$ctx1,1)})}));
-$5="body"._asJQuery();
-$ctx1.sendIdx["asJQuery"]=3;
-_st($5)._keyup_((function(event){
+$8="body"._asJQuery();
+$ctx1.sendIdx["asJQuery"]=2;
+_st($8)._keydown_((function(event){
 return smalltalk.withContext(function($ctx2) {
-$6="body"._asJQuery();
-$ctx2.sendIdx["asJQuery"]=4;
-return _st($6)._removeClass_("navigation");
-}, function($ctx2) {$ctx2.fillBlock({event:event},$ctx1,5)})}));
+$9=_st(event)._ctrlKey();
+if(smalltalk.assert($9)){
+$10="body"._asJQuery();
+$ctx2.sendIdx["asJQuery"]=3;
+return _st($10)._addClass_("navigation");
+};
+}, function($ctx2) {$ctx2.fillBlock({event:event},$ctx1,6)})}));
+$11="body"._asJQuery();
+$ctx1.sendIdx["asJQuery"]=4;
+_st($11)._keyup_((function(event){
+return smalltalk.withContext(function($ctx2) {
+$12="body"._asJQuery();
+$ctx2.sendIdx["asJQuery"]=5;
+return _st($12)._removeClass_("navigation");
+}, function($ctx2) {$ctx2.fillBlock({event:event},$ctx1,8)})}));
 _st(_st(window)._asJQuery())._resize_((function(event){
 return smalltalk.withContext(function($ctx2) {
 return self._refresh();
-}, function($ctx2) {$ctx2.fillBlock({event:event},$ctx1,6)})}));
+}, function($ctx2) {$ctx2.fillBlock({event:event},$ctx1,9)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"setupEvents",{},globals.HLManager)})},
 args: [],
-source: "setupEvents\x0a\x09'body' asJQuery keydown: [ :event |\x0a\x09\x0a\x09\x09\x22shift+tab\x22\x0a\x09\x09(event which = 9 and: [ event shiftKey ]) ifTrue: [\x0a\x09\x09\x09self activateNextTab.\x0a\x09\x09\x09event preventDefault ].\x0a\x09\x09\x09\x0a\x09\x09\x22On ctrl keydown, adds a 'navigation' css class to <body>\x0a\x09\x09for the CodeMirror navigation links. See `HLCodeWidget`.\x22\x0a\x09\x09event ctrlKey ifTrue: [\x0a\x09\x09\x09'body' asJQuery addClass: 'navigation' ] ].\x0a\x09\x09\x09\x0a\x09'body' asJQuery keyup: [ :event |\x0a\x09\x09'body' asJQuery removeClass: 'navigation' ].\x0a\x09\x09\x0a\x09window asJQuery resize: [ :event |\x0a\x09\x09self refresh ]",
-messageSends: ["keydown:", "asJQuery", "ifTrue:", "and:", "=", "which", "shiftKey", "activateNextTab", "preventDefault", "ctrlKey", "addClass:", "keyup:", "removeClass:", "resize:", "refresh"],
+source: "setupEvents\x0a\x09'body' asJQuery keypress: [ :event |\x0a\x09\x0a\x09\x09\x22ctrl+> and ctrl+<\x22\x0a\x09\x09(event ctrlKey and: [ event which = '<' asciiValue ]) ifTrue: [\x0a\x09\x09\x09self activatePreviousTab.\x0a\x09\x09\x09event preventDefault ].\x0a\x09\x09(event ctrlKey and: [ event which = '>' asciiValue ]) ifTrue: [\x0a\x09\x09\x09self activateNextTab.\x0a\x09\x09\x09event preventDefault ] ].\x0a\x0a\x09'body' asJQuery keydown: [ :event |\x0a\x09\x09\x09\x0a\x09\x09\x22On ctrl keydown, adds a 'navigation' css class to <body>\x0a\x09\x09for the CodeMirror navigation links. See `HLCodeWidget`.\x22\x0a\x09\x09event ctrlKey ifTrue: [\x0a\x09\x09\x09'body' asJQuery addClass: 'navigation' ] ].\x0a\x09\x09\x09\x0a\x09'body' asJQuery keyup: [ :event |\x0a\x09\x09'body' asJQuery removeClass: 'navigation' ].\x0a\x09\x09\x0a\x09window asJQuery resize: [ :event |\x0a\x09\x09self refresh ]",
+messageSends: ["keypress:", "asJQuery", "ifTrue:", "and:", "ctrlKey", "=", "which", "asciiValue", "activatePreviousTab", "preventDefault", "activateNextTab", "keydown:", "addClass:", "keyup:", "removeClass:", "resize:", "refresh"],
 referencedClasses: []
 }),
 globals.HLManager);

+ 21 - 4
src/Helios-Core.st

@@ -1232,6 +1232,18 @@ activateNextTab
 	self activate: nextTab
 !
 
+activatePreviousTab
+	| previousTab |
+	
+	self tabs ifEmpty: [ ^ self ].
+	
+	previousTab := self tabs 
+		at: (self tabs indexOf: self activeTab) - 1 
+		ifAbsent: [ self tabs last ].
+		
+	self activate: previousTab
+!
+
 addTab: aTab
 	self tabs add: aTab.
     self activate: aTab
@@ -1345,12 +1357,17 @@ registerServices
 !
 
 setupEvents
-	'body' asJQuery keydown: [ :event |
+	'body' asJQuery keypress: [ :event |
 	
-		"shift+tab"
-		(event which = 9 and: [ event shiftKey ]) ifTrue: [
-			self activateNextTab.
+		"ctrl+> and ctrl+<"
+		(event ctrlKey and: [ event which = '<' asciiValue ]) ifTrue: [
+			self activatePreviousTab.
 			event preventDefault ].
+		(event ctrlKey and: [ event which = '>' asciiValue ]) ifTrue: [
+			self activateNextTab.
+			event preventDefault ] ].
+
+	'body' asJQuery keydown: [ :event |
 			
 		"On ctrl keydown, adds a 'navigation' css class to <body>
 		for the CodeMirror navigation links. See `HLCodeWidget`."