editor: actions implementation
[fnpeditor.git] / src / editor / plugins / core / switch.js
diff --git a/src/editor/plugins/core/switch.js b/src/editor/plugins/core/switch.js
new file mode 100644 (file)
index 0000000..2403c2b
--- /dev/null
@@ -0,0 +1,67 @@
+define(function(require) {
+    
+'use strict';
+/* globals gettext */
+
+var _ = require('libs/underscore');
+
+
+var createSwitchAction = function(createParams) {
+    return  {
+        name: createParams.name,
+        params: {
+            fragment: {type: 'context', name: 'fragment'},
+        },
+        getState: function(params) {
+            var state = {
+                    label: this.config.label
+                },
+                f = params.fragment;
+
+
+            if(
+                !(f && f.isValid()) ||
+                !((f instanceof f.CaretFragment) || (f instanceof f.TextRangeFragment && f.getCommonParent()))
+            ) {
+                return _.extend(state, {
+                    allowed: false,
+                    description: 'wrong or no selection'
+                });
+            }
+
+            var node = f instanceof f.CaretFragment ? f.node.parent() : f.getCommonParent(),
+                alreadyInTarget = node.isInside(createParams.to),
+                toSwitch = node;
+
+            if(!toSwitch.is(createParams.from)) {
+                toSwitch = toSwitch.getParent(createParams.from);
+            }
+
+            return _.extend(state, {
+                allowed: !!toSwitch,
+                toggled: alreadyInTarget,
+                description: 'Switch to ' + createParams.to.name,
+                execute: alreadyInTarget ? function() {} : function() {
+                    f.document.transaction(function() {
+                        if(createParams.to.tagName) {
+                            toSwitch = toSwitch.setTag(createParams.to.tagName);
+                        }
+                        if(!_.isUndefined(createParams.to.klass)) {
+                            toSwitch.setClass(createParams.to.klass);
+                        }
+                    });
+                }
+            });
+        }
+    };
+};
+
+
+return {
+    actions: [
+        createSwitchAction({name: 'switchToHeader', from: {tagName: 'div', klass: 'p'}, to: {tagName: 'header', klass: '', name: gettext('header')}}),
+        createSwitchAction({name: 'switchToParagraph', from: {tagName: 'header'}, to: {tagName: 'div', klass: 'p', name: gettext('paragraf')}})
+    ]
+};
+
+});
\ No newline at end of file