editor: canvas displays span node as block if it contains non span nodes
[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: createParams.to.name
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                 textNodePath = (f.node || f.startNode).getPath();
37
38             if(!toSwitch.is(createParams.from)) {
39                 toSwitch = toSwitch.getParent(createParams.from);
40             }
41
42             description = gettext('Switch to') + ' ' + createParams.to.name;
43             return _.extend(state, {
44                 allowed: !!toSwitch || alreadyInTarget,
45                 toggled: alreadyInTarget,
46                 description: description,
47                 execute: alreadyInTarget ? function() {} : function(callback) {
48                     f.document.transaction(function() {
49                         if(createParams.to.tagName) {
50                             toSwitch = toSwitch.setTag(createParams.to.tagName);
51                         }
52                         if(!_.isUndefined(createParams.to.klass)) {
53                             toSwitch.setClass(createParams.to.klass);
54                         }
55                         return f.document.createFragment(f.CaretFragment, {node: f.document.getNodeByPath(textNodePath), offset: f.offset});
56                     }, {
57                         metadata: {
58                             description: description
59                         },
60                         success: callback
61                     });
62                 }
63             });
64         }
65     };
66 };
67
68 var headerAction = createSwitchAction({name: 'switchToHeader', from: {tagName: 'div', klass: 'p'}, to: {tagName: 'header', klass: '', name: gettext('header')}}),
69     paragraphAction = createSwitchAction({name: 'switchToParagraph', from: {tagName: 'header'}, to: {tagName: 'div', klass: 'p', name: gettext('paragraf')}});
70
71 return {
72     actions: [headerAction, paragraphAction],
73     canvasActionHandler: {
74         handles: [headerAction, paragraphAction],
75         // handle: function(canvas, action, ret) {
76         //     var params = {},
77         //         f;
78         //     if(ret && ret.node2) {
79         //         f = ret.oldFragment;
80         //         if(f && f instanceof f.CaretFragment) {
81         //             params.caretTo = f.offset;
82         //         }
83         //         canvas.setCurrentElement(ret.node2, params);
84         //     }
85         // }
86     }
87 };
88
89 });