1 define(function(require) {
6 var _ = require('libs/underscore');
9 var createSwitchAction = function(createParams) {
11 name: createParams.name,
13 fragment: {type: 'context', name: 'fragment'},
15 getState: function(params) {
17 label: createParams.to.name
24 !(f && f.isValid()) ||
25 !((f instanceof f.CaretFragment) || (f instanceof f.TextRangeFragment && f.getCommonParent()))
27 return _.extend(state, {
29 description: 'wrong or no selection'
33 var node = f instanceof f.CaretFragment ? f.node.parent() : f.getCommonParent(),
34 alreadyInTarget = node.isInside(createParams.to),
36 textNodePath = (f.node || f.startNode).getPath();
38 if(!toSwitch.is(createParams.from)) {
39 toSwitch = toSwitch.getParent(createParams.from);
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);
52 if(!_.isUndefined(createParams.to.klass)) {
53 toSwitch.setClass(createParams.to.klass);
55 return f.document.createFragment(f.CaretFragment, {node: f.document.getNodeByPath(textNodePath), offset: f.offset});
58 description: description,
59 fragment: params.fragment
69 var headerAction = createSwitchAction({name: 'switchToHeader', from: {tagName: 'div', klass: 'p'}, to: {tagName: 'header', klass: '', name: gettext('header')}}),
70 paragraphAction = createSwitchAction({name: 'switchToParagraph', from: {tagName: 'header'}, to: {tagName: 'div', klass: 'p', name: gettext('paragraph')}}),
71 imageAction = createSwitchAction({name: 'switchToImage', from: {tagName: 'div'}, to: {tagName: 'div', klass: 'img', name: gettext('image')}}),
72 videoAction = createSwitchAction({name: 'switchToVideo', from: {tagName: 'div'}, to: {tagName: 'div', klass: 'video', name: gettext('video')}});
75 actions: [headerAction, paragraphAction, imageAction, videoAction],
76 canvasActionHandler: {
77 handles: [headerAction, paragraphAction, imageAction, videoAction]
78 // handle: function(canvas, action, ret) {
81 // if(ret && ret.node2) {
82 // f = ret.oldFragment;
83 // if(f && f instanceof f.CaretFragment) {
84 // params.caretTo = f.offset;
86 // canvas.setCurrentElement(ret.node2, params);