Merge branch 'master' of stigma.nowoczesnapolska.org.pl:platforma
authorzuber <marek@stepniowski.com>
Tue, 6 Oct 2009 11:44:35 +0000 (13:44 +0200)
committerzuber <marek@stepniowski.com>
Tue, 6 Oct 2009 11:44:35 +0000 (13:44 +0200)
apps/explorer/context_processors.py
project/static/js/button_scripts.js
project/static/js/lib/codemirror/editor.js
project/static/js/views/button_toolbar.js
project/static/js/views/flash.js
project/static/js/views/html.js
project/static/js/views/xml.js
project/templates/explorer/editor.html
project/templates/html4print.html [new file with mode: 0644]

index 634b015..eff3032 100755 (executable)
@@ -4,6 +4,8 @@ __date__ ="$2009-09-03 08:34:10$"
 
 def settings(request):
     from django.conf import settings
-    return {'MEDIA_URL': settings.MEDIA_URL, 'STATIC_URL': settings.STATIC_URL}
+    return {'MEDIA_URL': settings.MEDIA_URL, 
+            'STATIC_URL': settings.STATIC_URL,
+            'REDMINE_URL': settings.REDMINE_URL }
 
 
index ca37eb4..40f45f6 100644 (file)
@@ -42,11 +42,11 @@ function ScriptletCenter()
             output = start_tag + end_tag;
         }
 
-        if (text.length === 0) {
-            this.XMLEditorMoveCursorForward(context, params.tag.length + 2);
-        }
-
         this.XMLEditorReplaceSelectedText(context, output);
+
+        if (text.length == 0) {
+            this.XMLEditorMoveCursorForward(context, -params.tag.length-3);
+        }        
     }.bind(this);
 
     this.scriptlets['lineregexp'] = function(context, params) {
index b7c53c7..3d7a205 100644 (file)
@@ -658,7 +658,7 @@ var Editor = (function(){
     // Intercept enter and tab, and assign their new functions.
     keyDown: function(event) {
       if (this.frozen == "leave") this.frozen = null;
-      if (this.frozen && (!this.keyFilter || this.keyFilter(event.keyCode))) {
+      if (this.frozen && (!this.keyFilter || this.keyFilter(event))) {
         event.stop();
         this.frozen(event);
         return;
index 71bfa97..7e4b6ea 100644 (file)
@@ -39,23 +39,30 @@ var ButtonToolbarView = View.extend({
             $(self.element).trigger('resize');
         });
     
-        $('.buttontoolbarview-button', this.element).bind('click.buttontoolbarview', function(event) {
-            var groupIndex = parseInt($(this).attr('ui:groupindex'), 10);
-            var buttonIndex = parseInt($(this).attr('ui:buttonindex'), 10);
-            var button = self.get('buttons')[groupIndex].buttons[buttonIndex];
-            var scriptletId = button.scriptlet_id;
-            var params = eval('(' + button.params + ')'); // To nie powinno być potrzebne
-
-            console.log('Executing', scriptletId, 'with params', params);
-            try {
-                scriptletCenter.scriptlets[scriptletId](self.parent, params);
-            } catch(e) {
-                console.log("Scriptlet", scriptletId, "failed.");
-            }
-        });
-    
+        $('.buttontoolbarview-button', this.element).
+        bind('click.buttontoolbarview', this.buttonPressed.bind(this) );
+            
         $(this.element).trigger('resize');
     },
+
+    buttonPressed: function(event)
+    {
+        var target = event.target;
+        
+        var groupIndex = parseInt($(target).attr('ui:groupindex'), 10);
+        var buttonIndex = parseInt($(target).attr('ui:buttonindex'), 10);
+        var button = this.get('buttons')[groupIndex].buttons[buttonIndex];
+        var scriptletId = button.scriptlet_id;
+        var params = eval('(' + button.params + ')'); // To nie powinno być potrzebne
+
+        console.log('Executing', scriptletId, 'with params', params);
+        try {
+            scriptletCenter.scriptlets[scriptletId](this.parent, params);
+        } catch(e) {
+            console.log("Scriptlet", scriptletId, "failed.");
+        }
+
+    },
   
     dispose: function() {
         $('.buttontoolbarview-tab', this.element).unbind('click.buttontoolbarview');
index 3f4f475..b2240e4 100644 (file)
@@ -27,9 +27,14 @@ var FlashView = View.extend({
   
   modelFirstFlashMessageChanged: function(property, value) {
     this.element.fadeOut('slow', function() {
+      this.element.css({'z-index': 0});
       this.shownMessage = value;
       this.render();
-      this.element.fadeIn('slow');
+
+      if(this.shownMessage) {
+        this.element.css({'z-index': 1000});
+        this.element.fadeIn('slow');
+      }
     }.bind(this));
   }
 });
index 4dc3d54..a8eb4d0 100644 (file)
@@ -20,6 +20,9 @@ var HTMLView = View.extend({
   
   modelDataChanged: function(property, value) {
     $('.htmlview', this.element).html(value);
+
+    var base = this.$printLink.attr('ui:baseref');
+    this.$printLink.attr('href', base + "?revision=" + this.model.get('revision'));
   },
   
   modelStateChanged: function(property, value) {
@@ -38,21 +41,9 @@ var HTMLView = View.extend({
 
 
   render: function() {
-      $('.html-print-link', this.element).unbind();
-
+      if(this.$printLink) this.$printLink.unbind();
       this._super();
-
-      $('.html-print-link', this.element).mouseover(
-            this.printView.bind(this)
-      );
-  },
-
-
-  printView: function(event) {
-      var base = $(event.target).attr('ui:baseref');
-      $(event.target).attr('href', base + "?revision=" + this.model.get('revision') );
-
-      return true;
+      this.$printLink = $('.html-print-link', this.element);
   },
   
   reload: function() {
index caafa71..0215472 100644 (file)
 /*global View CodeMirror ButtonToolbarView render_template panels */
 var XMLView = View.extend({
-  _className: 'XMLView',
-  element: null,
-  model: null,
-  template: 'xml-view-template',
-  editor: null,
-  buttonToolbar: null,
+    _className: 'XMLView',
+    element: null,
+    model: null,
+    template: 'xml-view-template',
+    editor: null,
+    buttonToolbar: null,
   
-  init: function(element, model, parent, template) {
-    this._super(element, model, template);
-    this.parent = parent;
-    this.buttonToolbar = new ButtonToolbarView(
-      $('.xmlview-toolbar', this.element), 
-      this.model.toolbarButtonsModel, parent);
+    init: function(element, model, parent, template) {
+        this._super(element, model, template);
+        this.parent = parent;
+        this.buttonToolbar = new ButtonToolbarView(
+            $('.xmlview-toolbar', this.element),
+            this.model.toolbarButtonsModel, parent);
 
-    $('.xmlview-toolbar', this.element).bind('resize.xmlview', this.resized.bind(this));
+        this.hotkeys = [];
+        var self = this;
+
+        $('.xmlview-toolbar', this.element).bind('resize.xmlview', this.resized.bind(this));
+   
     
-    this.parent.freeze('Ładowanie edytora...');
-       this.editor = new CodeMirror($('.xmlview', this.element).get(0), {
-      parserfile: 'parsexml.js',
-      path: "/static/js/lib/codemirror/",
-      stylesheet: "/static/css/xmlcolors.css",
-      parserConfig: {useHTMLKludges: false},
-      textWrapping: false,
-      tabMode: 'spaces',
-      indentUnit: 0,
-      onChange: this.editorDataChanged.bind(this),
-      initCallback: this.editorDidLoad.bind(this)
-    });
-  },
+        this.parent.freeze('Ładowanie edytora...');
+        this.editor = new CodeMirror($('.xmlview', this.element).get(0), {
+            parserfile: 'parsexml.js',
+            path: "/static/js/lib/codemirror/",
+            stylesheet: "/static/css/xmlcolors.css",
+            parserConfig: {
+                useHTMLKludges: false
+            },
+            textWrapping: false,
+            tabMode: 'spaces',
+            indentUnit: 0,
+            onChange: this.editorDataChanged.bind(this),
+            initCallback: this.editorDidLoad.bind(this)
+        });
+    },
   
-  resized: function(event) {
-    var height = this.element.height() - $('.xmlview-toolbar', this.element).outerHeight();
-    $('.xmlview', this.element).height(height);
-  },
+    resized: function(event) {
+        var height = this.element.height() - $('.xmlview-toolbar', this.element).outerHeight();
+        $('.xmlview', this.element).height(height);
+    },
   
-  reload: function() {
-    this.model.load(true);
-  },
+    reload: function() {
+        this.model.load(true);
+    },
   
-  editorDidLoad: function(editor) {
-    $(editor.frame).css({width: '100%', height: '100%'});
-    this.model
-      .addObserver(this, 'data', this.modelDataChanged.bind(this))
-      .addObserver(this, 'state', this.modelStateChanged.bind(this))
-      .load();
+    editorDidLoad: function(editor) {
+        $(editor.frame).css({
+            width: '100%',
+            height: '100%'
+        });
+        this.model
+        .addObserver(this, 'data', this.modelDataChanged.bind(this))
+        .addObserver(this, 'state', this.modelStateChanged.bind(this))
+        .load();
     
-    this.parent.unfreeze();
+        this.parent.unfreeze();
       
-    this.editor.setCode(this.model.get('data'));
-    this.modelStateChanged('state', this.model.get('state'));
+        this.editor.setCode(this.model.get('data'));
+        this.modelStateChanged('state', this.model.get('state'));
         
-    // editor.grabKeys(
-    //   $.fbind(self, self.hotkeyPressed),
-    //   $.fbind(self, self.isHotkey)
-    // );
-  },
+        editor.grabKeys(
+            this.hotkeyPressed.bind(this),
+            this.isHotkey.bind(this)
+            );
+    },
   
-  editorDataChanged: function() {
-    this.model.set('data', this.editor.getCode());
-  },
+    editorDataChanged: function() {
+        this.model.set('data', this.editor.getCode());
+    },
   
-  modelDataChanged: function(property, value) {
-    if (this.editor.getCode() != value) {
-      this.editor.setCode(value);
-    }
-  },
+    modelDataChanged: function(property, value) {
+        if (this.editor.getCode() != value) {
+            this.editor.setCode(value);
+        }
+    },
   
-  modelStateChanged: function(property, value) {
-    if (value == 'synced' || value == 'dirty') {
-      this.unfreeze();
-    } else if (value == 'unsynced') {
-      this.freeze('Niezsynchronizowany...');
-    } else if (value == 'loading') {
-      this.freeze('Ładowanie...');
-    } else if (value == 'saving') {
-      this.freeze('Zapisywanie...');
-    } else if (value == 'error') {
-      this.freeze(this.model.get('error'));
-    }
-  },
+    modelStateChanged: function(property, value) {
+        if (value == 'synced' || value == 'dirty') {
+            this.unfreeze();
+        } else if (value == 'unsynced') {
+            this.freeze('Niezsynchronizowany...');
+        } else if (value == 'loading') {
+            this.freeze('Ładowanie...');
+        } else if (value == 'saving') {
+            this.freeze('Zapisywanie...');
+        } else if (value == 'error') {
+            this.freeze(this.model.get('error'));
+        }
+    },
     
-  dispose: function() {
-    this.model.removeObserver(this);
-    $(this.editor.frame).remove();
-    this._super();
-  }
+    dispose: function() {
+        this.model.removeObserver(this);
+        $(this.editor.frame).remove();
+        this._super();
+    },    
+
+    getHotkey: function(event) {
+        var code = event.keyCode;
+        if(!((code >= 97 && code <= 122)
+           || (code >= 65 && code <= 90)) ) return null;
+
+        var ch = String.fromCharCode(code & 0xff).toLowerCase();
+        console.log(ch.charCodeAt(0), '#', buttons);
+
+        var buttons = $('.buttontoolbarview-button[title='+ch+']', this.element);
+        var mod = 0;
+            
+        if(event.altKey) mod |= 0x01;
+        if(event.ctrlKey) mod |= 0x02;
+        if(event.shiftKey) mod |= 0x04;
+
+        if(buttons.length) {
+            var match = null;
+
+            buttons.each(function() {
+                if( parseInt($(this).attr('ui:hotkey_mod')) == mod ) {
+                    match = this;
+                    return;
+                }
+            })
+
+            return match;
+        }
+        else {
+            return null;
+        }
+    },
+
+    isHotkey: function() {
+        console.log(arguments);
+        
+        if(this.getHotkey.apply(this, arguments))
+            return true;
+        else
+            return false;
+    },
+
+    hotkeyPressed: function() {
+        var button = this.getHotkey.apply(this, arguments);
+        this.buttonToolbar.buttonPressed({
+            target: button
+        });
+    }
+
 });
 
+function Hotkey(code) {
+    this.code = code;
+    this.has_alt = ((code & 0x01 << 8) !== 0);
+    this.has_ctrl = ((code & 0x01 << 9) !== 0);
+    this.has_shift = ((code & 0x01 << 10) !== 0);
+    this.character = String.fromCharCode(code & 0xff);
+}
+
+Hotkey.prototype.toString = function() {
+    var mods = [];
+    if(this.has_alt) mods.push('Alt');
+    if(this.has_ctrl) mods.push('Ctrl');
+    if(this.has_shift) mods.push('Shift');
+    mods.push('"'+this.character+'"');
+    return mods.join('+');
+};
+
 // Register view
 panels['xml'] = XMLView;
index 7d288d3..edb3bfc 100644 (file)
                                <div class="buttontoolbarview-group toolbar-buttons-container" ui:groupIndex="<%= i %>" style="display: none">
                                        <% for (var j=0; j < buttons[i].buttons.length; j++) { %>
                                                <% if (buttons[i].buttons[j].scriptlet_id) { %>
-                                               <button type="button" class="buttontoolbarview-button" ui:groupindex="<%= i %>" ui:buttonindex="<%= j %>">
+                                               <button type="button" class="buttontoolbarview-button" 
+                                                    title="<%= buttons[i].buttons[j].key %>"
+                                                    ui:hotkey_mod="<%= buttons[i].buttons[j].key_mod %>"
+                                                    ui:groupindex="<%= i %>" ui:buttonindex="<%= j %>">
                                                        <%= buttons[i].buttons[j].label %>
                                                </button>
                                                <% } %>
 {% block breadcrumbs %}<a href="{% url file_list %}">Platforma Redakcyjna</a> &gt; {{ fileid }}{% endblock breadcrumbs %}
 
 {% block header-toolbar %}
-       <button id="action-merge">Merge</button> <button id="action-update">Update</button> <button id="action-commit">Commit</button> <button id="action-quick-save">Quick Save</button>
+    <a href="http://stigma.nowoczesnapolska.org.pl/platforma-hg/ksiazki/log/tip/{{ fileid }}.xml" target="_new" >Historia</a>
+       <button id="action-merge">Merge</button>
+        <button id="action-update">Update</button>
+        <button id="action-commit">Commit</button>
+        <button id="action-quick-save">Quick Save</button>
 {% endblock %}
 
 {% block maincontent %}
             <textarea cols="60" rows="10" name="message" id="commit-dialog-message"></textarea>
             <p id="commit-dialog-error-empty-message">Wiadomość nie może być pusta.</p>                
             <fieldset id="commit-dialog-related-issues" 
-                      ui:ajax-src="http://localhost:3000/publications/issues/{{fileid}}">
+                      ui:ajax-src="{{REDMINE_URL}}/publications/issues/{{fileid}}">
                 <legend>Related issues</legend>
                 <div class="loading-box" style="display: none;">
                     <p>Loading related issues...</p>
 {% endblock maincontent %}
 
 {% block extrabody %}
-       <div style="position: absolute; left: 35%; right: 35%; top: 0; height: 20px; z-index: 1000" id="flashview"></div>
+       <div style="position: absolute; left: 35%; right: 35%; top: 0; height: 20px; z-index: 0" id="flashview"></div>
 {% endblock %}
\ No newline at end of file
diff --git a/project/templates/html4print.html b/project/templates/html4print.html
new file mode 100644 (file)
index 0000000..53a798a
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+  <head>
+    <title>{{docid}}</title>
+    <link rel="stylesheet" href="{{STATIC_URL}}css/html.css" type="text/css" charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  </head>
+  <body>
+      <div class="htmlview">
+        {{ output|safe }}
+      </div>
+  </body>
+</html>