aboutsummaryrefslogtreecommitdiff
path: root/js/controllers
diff options
context:
space:
mode:
Diffstat (limited to 'js/controllers')
-rw-r--r--js/controllers/clipboard-controller.js624
1 files changed, 19 insertions, 605 deletions
diff --git a/js/controllers/clipboard-controller.js b/js/controllers/clipboard-controller.js
index afa9cbdb..259d916e 100644
--- a/js/controllers/clipboard-controller.js
+++ b/js/controllers/clipboard-controller.js
@@ -8,13 +8,10 @@ No rights, expressed or implied, whatsoever to this software are provided by Mot
8// 8//
9var Montage = require("montage/core/core").Montage, 9var Montage = require("montage/core/core").Montage,
10 Component = require("montage/ui/component").Component, 10 Component = require("montage/ui/component").Component,
11 NJUtils = require("js/lib/NJUtils").NJUtils, 11 ElementsClipboardAgent = require("js/clipboard/internal-ops/elements-clipboard-agent").ElementsClipboardAgent,
12 World = require("js/lib/drawing/world").World; 12 ExternalAppsClipboardAgent= require("js/clipboard/external-apps-clipboard-agent").ExternalAppsClipboardAgent;
13 13
14var ClipboardController = exports.ClipboardController = Montage.create(Component, { 14var ClipboardController = exports.ClipboardController = Montage.create(Component, {
15 hasTemplate: {
16 value: false
17 },
18 15
19 deserializedFromTemplate: { 16 deserializedFromTemplate: {
20 value: function() { 17 value: function() {
@@ -30,36 +27,12 @@ var ClipboardController = exports.ClipboardController = Montage.create(Component
30 } 27 }
31 }, 28 },
32 29
33 clipboardOperationsAgent:{//appropriate agent instant required for execution of cut/copy/paste 30 clipboardContext:{
34 value: null 31 value : "stage" /* cleanup: formulate better context representation */
35 },
36
37 //count how many times pasted
38 //used to move multiple pastes of same copy
39 pasteCounter:{
40 value: 0
41 },
42
43 copiedObjects:{
44 value: {}
45 },
46
47 _copyFlag:{
48 value:false
49 },
50
51 copyFlag:{
52 get:function(){return this._copyFlag;},
53 set:function(value){this._copyFlag = value;}
54 },
55
56 _newCopyFlag:{
57 value:true
58 }, 32 },
59 33
60 newCopyFlag:{ 34 operationsAgent:{//appropriate agent instant required for execution of cut/copy/paste
61 get:function(){return this._newCopyFlag;}, 35 value: null
62 set:function(value){this._newCopyFlag = value;}
63 }, 36 },
64 37
65 handleExecuteCopy:{ 38 handleExecuteCopy:{
@@ -87,7 +60,9 @@ var ClipboardController = exports.ClipboardController = Montage.create(Component
87 return; 60 return;
88 } 61 }
89 62
90 this.copy(clipboardEvent); 63 if(this.clipboardContext === "stage"){
64 ElementsClipboardAgent.copy(clipboardEvent);
65 }
91 66
92 clipboardEvent.preventDefault(); 67 clipboardEvent.preventDefault();
93 } 68 }
@@ -102,7 +77,9 @@ var ClipboardController = exports.ClipboardController = Montage.create(Component
102 return; 77 return;
103 } 78 }
104 79
105 this.cut(clipboardEvent); 80 if(this.clipboardContext === "stage"){
81 ElementsClipboardAgent.cut(clipboardEvent);
82 }
106 83
107 clipboardEvent.preventDefault(); 84 clipboardEvent.preventDefault();
108 } 85 }
@@ -111,11 +88,7 @@ var ClipboardController = exports.ClipboardController = Montage.create(Component
111 handlePaste:{ 88 handlePaste:{
112 value:function(clipboardEvent){ 89 value:function(clipboardEvent){
113 var clipboardData = clipboardEvent.clipboardData, 90 var clipboardData = clipboardEvent.clipboardData,
114 ninjaData = clipboardData.getData("ninja"), 91 ninjaData = clipboardData.getData("ninja");
115 htmlData = clipboardData.getData("text/html"),
116 textData = clipboardData.getData("text/plain"),
117 i=0,
118 imageMime, imageData, imageElement;
119 92
120 if(!this.application.ninja.currentDocument 93 if(!this.application.ninja.currentDocument
121 || (this.application.ninja.currentDocument && this.application.ninja.currentDocument.currentView === "code")){ 94 || (this.application.ninja.currentDocument && this.application.ninja.currentDocument.currentView === "code")){
@@ -130,577 +103,18 @@ var ClipboardController = exports.ClipboardController = Montage.create(Component
130 103
131 //TODO: return if stage is not focussed 104 //TODO: return if stage is not focussed
132 105
133 this.pasteCounter++; 106 if(this.clipboardContext === "stage"){
134 107 if(ninjaData){
135 if(ninjaData){ 108 ElementsClipboardAgent.pasteInternal();
136 if(this.copiedObjects.copy){
137 try{
138 this.pasteFromCopy();
139 }catch(e){
140 console.log(""+e.stack);
141 }
142 }
143 else if(this.copiedObjects.cut){
144 try{
145 this.pasteFromCut();
146 }catch(e){
147 console.log(""+e.stack);
148 }
149 }
150 }
151 else{
152
153 //handle image blobs
154 if(clipboardData.items && (clipboardData.items.length > 0)){
155 for(i=0; i < clipboardData.items.length; i++ ){
156 if((clipboardData.items[i].kind === "file") && (clipboardData.items[i].type.indexOf("image") === 0)){//example type -> "image/png"
157 imageMime = clipboardData.items[i].type;
158 imageData = clipboardData.items[i].getAsFile();
159 try{
160 imageElement = this.generateImageElement(imageData);
161 }catch(e){
162 console.log(""+e.stack);
163 }
164 this.application.ninja.selectionController.selectElements(imageElement);
165 this.application.ninja.currentDocument.model.needsSave = true;
166
167 }
168 }
169 } 109 }
170 110 else{
171 try{ 111 ExternalAppsClipboardAgent.paste(clipboardEvent);
172 this.pasteFromExternalSource(htmlData, textData);
173 }catch(e){
174 console.log(""+e.stack);
175 } 112 }
176 } 113 }
177 114
178 clipboardEvent.preventDefault(); 115 clipboardEvent.preventDefault();
179 } 116 }
180 },
181
182 /*
183 parameters:
184 */
185 copy:{
186 value: function(clipboardEvent){
187 var j=0, htmlToClipboard = "", ninjaClipboardObj = {}, textToClipboard = "";
188 this.copiedObjects = {}; this.pasteCounter = 0;
189 this.copiedObjects["copy"] = [];
190
191 if(clipboardEvent){
192 for(j=0; j < this.application.ninja.selectedElements.length; j++){//copying from stage
193 this.copiedObjects.copy.push(this.application.ninja.selectedElements[j]);
194
195 if(this.application.ninja.selectedElements[j].tagName === "CANVAS"){
196 if(!ninjaClipboardObj.canvas){
197 ninjaClipboardObj.canvas = true;
198 }
199 }else{
200 htmlToClipboard = htmlToClipboard + this.serializeHTMLElement(this.application.ninja.selectedElements[j]);
201 if(!ninjaClipboardObj.plainHtml){
202 ninjaClipboardObj.plainHtml = true;
203 }
204 textToClipboard = textToClipboard + this.getText(this.application.ninja.selectedElements[j]) + " ";
205 }
206
207 }
208 //set clipboard data
209 clipboardEvent.clipboardData.setData('ninja', ''+ JSON.stringify(ninjaClipboardObj));
210 clipboardEvent.clipboardData.setData('text/html', '<HTML><BODY>' + htmlToClipboard + '</BODY></HTML>');
211 clipboardEvent.clipboardData.setData('text/plain', textToClipboard);
212 }
213 else{
214 //TODO: custom copy/paste, ex: css, animation, materials
215 }
216 }
217 },
218
219 pasteFromCopy:{//todo: change to appropriate name
220 value:function(){
221 var i=0, j=0,
222 pastedElements = [],//array of te pastes clones - for selection
223 node = null,
224 styles = null,
225 copiedElement = null;
226
227 //TODO: cleanse HTML
228
229 for(j=0; j< this.copiedObjects.copy.length; j++){
230 copiedElement = this.copiedObjects.copy[j];
231 styles = null;
232
233 if (copiedElement.tagName === "CANVAS"){
234 //clone copied canvas
235 var canvas = this.cloneCanvas(copiedElement);
236 pastedElements.push(canvas);
237 }
238 else {
239 node = copiedElement.cloneNode(true);
240
241 if(copiedElement.ownerDocument.defaultView.getComputedStyle(copiedElement).getPropertyValue("position") === "absolute"){
242 styles = {};
243 styles.top = this.application.ninja.elementMediator.getProperty(copiedElement, "top", parseInt);
244 styles.left =