Experimetal Woblink.
[redakcja.git] / src / redakcja / static / js / wiki / view_search.js
index b49671c..1421aa9 100644 (file)
@@ -3,13 +3,12 @@
     /*
      * Perspective
      */
-    function SearchPerspective(options){
-        var old_callback = options.callback || function() { };
+    class SearchPerspective extends $.wiki.SidebarPerspective {
+        vsplitbar = 'ZNAJDŹ I ZAMIEŃ';
+        options = Array();
 
-        this.noupdate_hash_onenter = true;
-        this.vsplitbar = 'ZNAJDŹ I ZAMIEŃ';
-
-        options.callback = function(){
+        constructor(options) {
+            super(options);
             var self = this;
 
             this.editor = null;
             this.$searchInput = $('#search-input', this.$element);
             this.$replaceInput = $('#replace-input', this.$element);
             this.$searchButton = $('#search-button', this.$element);
+            this.$searchPrevButton = $('#search-prev-button', this.$element);
             this.$replaceButton = $('#replace-button', this.$element);
 
             this.$replaceButton.attr("disabled","disabled");
-            this.options = Array();
 
             // handlers
             this.$searchInput.change(function(event){
                     alert('Brak wyników.');
             });
 
+            this.$searchPrevButton.click(function(){
+                if (!self.search(false))
+                    alert('Brak wyników.');
+            });
+
             this.$replaceButton.click(function(){
                 self.replace();
             });
+        }
 
-            old_callback.call(this);
-        };
-
-        $.wiki.Perspective.call(this, options);
-    };
-
-    SearchPerspective.prototype = new $.wiki.Perspective();
-
-    SearchPerspective.prototype.search = function(){
-        var self = this;
-        var query = self.$searchInput.val();
+        search(forward=true) {
+            var self = this;
+            var query = self.$searchInput.val();
+
+            if (!self.editor)
+                self.editor = $.wiki.perspectiveForTab('#CodeMirrorPerspective').codemirror
+
+            if (!self.searchCursor) {
+                var options = {};
+                options.caseFold = !self.options['search-case-sensitive'];
+                var start = 0;
+                if (self.options['search-from-cursor']) {
+                    start = self.editor.getCursor();
+                }
+                self.searchCursor = self.editor.getSearchCursor(
+                    self.$searchInput.val(),
+                    start,
+                    options
+                );
+            }
+            if (forward ? self.searchCursor.findNext() : self.searchCursor.findPrevious()) {
+                self.editor.setSelection(self.searchCursor.from(), self.searchCursor.to());
+                self.editor.scrollIntoView({from: self.searchCursor.from(), to: self.searchCursor.to()}, 20);
+                self.$replaceButton.removeAttr("disabled");
+                return true;
+            }
+            else {
+                self.searchCursor = null;
+                this.$replaceButton.attr("disabled","disabled");
+                return false;
+            }
+        }
 
-        if (!self.editor)
-            self.editor = $.wiki.perspectiveForTab('#CodeMirrorPerspective').codemirror
+        replace() {
+            var self = this;
+            var query = self.$replaceInput.val();
 
-        if (!self.searchCursor) {
-            self.searchCursor = self.editor.getSearchCursor(
-                self.$searchInput.val(), 
-                self.options['search-from-cursor'], 
-                !self.options['search-case-sensitive']
-            );
-        }
-        if (self.searchCursor.findNext()) {
-            self.searchCursor.select();
-            self.$replaceButton.removeAttr("disabled");
-            return true;
-        }
-        else {
-            self.searchCursor = null;
-            this.$replaceButton.attr("disabled","disabled");
-            return false;
-        }
-    };
+            if (!self.searchCursor) {
+                self.search();
+            }
+            else {}
 
-    SearchPerspective.prototype.replace = function(){
-        var self = this;
-        var query = self.$replaceInput.val();
+            self.editor.setSelection(self.searchCursor.from(), self.searchCursor.to());
+            self.editor.scrollIntoView({from: self.searchCursor.from(), to: self.searchCursor.to()}, 20);
 
-        if (!self.searchCursor) {
-            self.search();
-        }
-        else {}
-        self.searchCursor.select();
-        self.searchCursor.replace(query);
-        if(self.search() && self.options['replace-all']) {
-            self.replace();
+            self.searchCursor.replace(query);
+            if(self.search() && self.options['replace-all']) {
+                self.replace();
+            }
         }
-    };
-
-    SearchPerspective.prototype.onEnter = function(success, failure){
-        var self = this;
 
-        $.wiki.Perspective.prototype.onEnter.call(this);
-        self.$searchCursor = null;
+        onEnter(success, failure) {
+            var self = this;
 
-        $('.vsplitbar').not('.active').trigger('click');
-        $(".vsplitbar-title").html("↓ ZNAJDŹ I ZAMIEŃ ↓");        
-        
-        if ($.wiki.activePerspective() != 'CodeMirrorPerspective')
-            $.wiki.switchToTab('#CodeMirrorPerspective');
-    };
+            super.onEnter();
+            self.$searchCursor = null;
 
-    SearchPerspective.prototype.onExit = function(success, failure) {
+            if ($.wiki.activePerspective() != 'CodeMirrorPerspective')
+                $.wiki.switchToTab('#CodeMirrorPerspective');
+        }
 
-    };
+        onExit(success, failure) {
+        }
+    }
 
     $.wiki.SearchPerspective = SearchPerspective;