fnpjs: actions - action returns via callback
[fnpeditor.git] / src / editor / plugins / core / switch.js
1 define(function(require) {
2     
3 'use strict';
4 /* globals gettext */
5
6 var _ = require('libs/underscore');
7
8
9 var createSwitchAction = function(createParams) {
10     return  {
11         name: createParams.name,
12         params: {
13             fragment: {type: 'context', name: 'fragment'},
14         },
15         getState: function(params) {
16             var state = {
17                     label: this.config.label
18                 },
19                 f = params.fragment,
20                 description;
21
22
23             if(
24                 !(f && f.isValid()) ||
25                 !((f instanceof f.CaretFragment) || (f instanceof f.TextRangeFragment && f.getCommonParent()))
26             ) {
27                 return _.extend(state, {
28                     allowed: false,
29                     description: 'wrong or no selection'
30                 });
31             }
32
33             var node = f instanceof f.CaretFragment ? f.node.parent() : f.getCommonParent(),
34                 alreadyInTarget = node.isInside(createParams.to),
35                 toSwitch = node;
36
37             if(!toSwitch.is(createParams.from)) {
38                 toSwitch = toSwitch.getParent(createParams.from);
39             }
40
41             description = 'Switch to ' + createParams.to.name;
42             return _.extend(state, {
43                 allowed: !!toSwitch,
44                 toggled: alreadyInTarget,
45                 description: description,
46                 execute: alreadyInTarget ? function() {} : function() {
47                     f.document.transaction(function() {
48                         if(createParams.to.tagName) {
49                             toSwitch = toSwitch.setTag(createParams.to.tagName);
50                         }
51                         if(!_.isUndefined(createParams.to.klass)) {
52                             toSwitch.setClass(createParams.to.klass);
53                         }
54                     }, {
55                         metadata: {
56                             description: description
57                         }
58                     });
59                 }
60             });
61         }
62     };
63 };
64
65
66 return {
67     actions: [
68         createSwitchAction({name: 'switchToHeader', from: {tagName: 'div', klass: 'p'}, to: {tagName: 'header', klass: '', name: gettext('header')}}),
69         createSwitchAction({name: 'switchToParagraph', from: {tagName: 'header'}, to: {tagName: 'div', klass: 'p', name: gettext('paragraf')}})
70     ]
71 };
72
73 });