Quellcode durchsuchen

added file management operations to file browser
added SCCD metamodel to default user
removed list view of file browser

Simon Van Mierlo vor 9 Jahren
Ursprung
Commit
c0e84c5dd5

+ 29 - 33
___fs++.js

@@ -69,7 +69,7 @@ exports.findfiles =
 		switch(_os.type())
 		{
 			case 'Windows_NT' :
-				_cp.exec('dir /s /b /a:-d "'+dir+'"',
+				_cp.exec('dir /s /b "'+dir+'"',
 					function(err, stdout, stderr)
 					{
 						if( err )
@@ -81,9 +81,15 @@ exports.findfiles =
 								 paths  = stdout.split('\r\n').map(
 									function(path)
 									{
-										return dir+path.substring(
+										var newpath = dir+path.substring(
 														path.indexOf(windir)+windir.length).
 													  replace(/\\/g,'/');
+                                        try {
+                                            if (_fs.lstatSync(path).isDirectory()) {
+                                                newpath = newpath + '/';
+                                            }
+                                        } catch (e) {}                                        
+                                        return newpath;
 									});
 							paths.pop();
 							callback(err,paths.join('\n'),stderr);
@@ -93,13 +99,20 @@ exports.findfiles =
 				
 			case 'Linux'  :
 			case 'Darwin' :
-				_cp.exec('find "'+dir+'" -type f',
+				_cp.exec('find "'+dir,
 					function(err, stdout, stderr)
 					{
 						if( err )
 							callback(err,stdout,stderr);
-						else
-							callback(err,stdout.slice(0,-1),stderr);
+						else {
+                            var paths = stdout.slice(0,-1),
+                                newpaths = paths.split('\n').map(function(path) {
+                                    if (_fs.lstatSync(path).isDirectory()) {
+                                        return path + "/";
+                                    } else return path;
+                                })
+							callback(err,newpaths,stderr);
+                        }
 					});
 				break;
 
@@ -115,20 +128,15 @@ exports.findfiles =
 exports.mkdirs =
 	function(dir,callback)
 	{
-		switch(_os.type())
-		{
-			case 'Windows_NT' :
-                _fs.mkdir(dir.replace(/\//g,'\\'), 484, function(err) {if (err) {if (err.code == 'EEXIST') callback(undefined); else callback(err);} else callback(undefined)});
-				break;
-				
-			case 'Linux'  :
-			case 'Darwin' :
-				_cp.exec('mkdir -p "'+dir+'"',callback);
-				break;
-
-			default:
-				throw 'unsupported OS :: '+_os.type();
-		}
+        var split_dir = dir.split('/'),
+            curr_dir = '';
+        for (var i in split_dir) {
+            curr_dir += split_dir[i] + '/';
+            if (!_fs.existsSync(curr_dir)) {
+                _fs.mkdir(curr_dir, 484, function(err) {if (err) {if (err.code != 'EEXIST') callback(err);}});
+            }
+        }
+        callback();
 	};
 
 
@@ -136,20 +144,8 @@ exports.mkdirs =
 exports.mv =
 	function(src,dest,callback)
 	{
-		switch(_os.type())
-		{
-			case 'Windows_NT' :
-				_cp.exec('move /y "'+src+'" "'+dest+'"',callback);
-				break;
-				
-			case 'Linux'  :
-			case 'Darwin' :
-				_cp.exec('mv "'+src+'" "'+dest+'"',callback);
-				break;
-
-			default:
-				throw 'unsupported OS :: '+_os.type();
-		}
+        var split_string = src.split('/');
+        _fs.rename(src, dest + split_string[split_string.length-1],callback);
 	};
 
 

+ 48 - 1
client/data_utils.js

@@ -99,7 +99,7 @@ DataUtils = function(){
 	/**
 	 * Deletes the file from the cloud storage by URI
 	 * 
-	 * @param fileuri - the file to upload
+	 * @param fileuri - the file/folder to delete
 	 * @param callback - the callback function after the operation
 	 * has completed
 	 */
@@ -111,6 +111,53 @@ DataUtils = function(){
 			callback);
 	};
 	
+	/**
+	 * Create a folder
+	 * 
+	 * @param fileuri - the folder to create
+	 * @param callback - the callback function after the operation
+	 * has completed
+	 */
+	this.createFolder = function(folderuri,callback){
+		HttpUtils.httpReq(
+			'POST',
+			folderuri,
+			undefined,
+			callback);
+	};
+	
+	/**
+	 * Rename a file/folder in the cloud
+	 * 
+	 * @param fileuri - the file/folder to rename
+     * @param newname - the new name of the file/folder
+	 * @param callback - the callback function after the operation
+	 * has completed
+	 */
+	this.renameInCloud = function(folderuri,newname,callback){
+		HttpUtils.httpReq(
+			'PUT',
+			folderuri,
+			newname,
+			callback);
+	};
+	
+	/**
+	 * Move a file/folder in the cloud
+	 * 
+	 * @param fileuri - the file/folder to rename
+     * @param newlocation - the new location of the file/folder (needs to start with a '/')
+	 * @param callback - the callback function after the operation
+	 * has completed
+	 */
+	this.moveInCloud = function(folderuri,newlocation,callback){
+		HttpUtils.httpReq(
+			'PUT',
+			folderuri,
+			newlocation,
+			callback);
+	};
+	
 	/*
 		1. retrieve and validate uri associated to 'into'
 		2. validate and/or setup 'items' (see NOTE)

+ 11 - 3
client/gui_utils.js

@@ -143,8 +143,13 @@ GUIUtils = function(){
 							 else
 								 return;
 						 }
-						 else if( (matches=fname.match('^'+_folder+'(.*)')) )
-							 files.push(matches[1]);
+						 else if( (matches=fname.match('^'+_folder+'(.*)')) ) {
+                             if (matches[1].length > 0) {
+                                 files.push(matches[1]);
+                             } else {
+                                 return;
+                             }
+                         }
 						 else
 							 return;
 							 
@@ -246,7 +251,10 @@ GUIUtils = function(){
 		return {'filebrowser':	 fileb,
 				  'filepane':	 	 function() {return $('#div_fileb-contents');},
 				  'getcurrfolder': function() {return currfolder;},	
-				  'getselection':	 function()	{return input.val();}};
+				  'getselection':	 function()	{return input.val();},
+                  'refresh': function(fnames, the_folder) {
+                      setCurrentFileBrowserFolder(the_folder || currfolder, fnames);
+                  }};
 	};
 	
 	// TODO: replace the bundled function with an actual object generation. The

+ 5 - 2
client/styles.css

@@ -14,6 +14,9 @@ button {
 	font-family:"lucida grande",tahoma,verdana,arial,sans-serif;
   	font-size:11px;
 }
+span.feedback {
+    color: red;
+}
 
 html {
 	width: 100%;
@@ -159,8 +162,8 @@ html {
 .dialog {
 	position:absolute;
 	padding:0px 20px 20px;
-	max-height:50%;
-	max-width:50%;
+	max-height:100%;
+	max-width:100%;
 	z-index: 30;			  
 	background-color: whitesmoke;
 	border:2px solid crimson;

+ 200 - 66
client/window_management.js

@@ -414,6 +414,7 @@ WindowManagement = function(){
 				undefined,
 				function(statusCode,resp)
 				{
+                    args['extensions'].push('/');
 					var fnames = __localizeFilenames(
 							__filterFilenamesByExtension(
 								resp.split('\n'),
@@ -421,81 +422,214 @@ WindowManagement = function(){
 							).sort(),
 							maxFnameLength = 
 								utils.max(fnames,function(_) {return _.length;}),
-							 viewlinks = $('<div>'),
-							 a_listview = $('<a>'),
 							 a_filebview = $('<a>'),
-							 select = 
-								 GUIUtils.getSelector(fnames,args['multipleChoice'],undefined,20),
+                             folder_buttons = $('<div>'),
+                             new_folder_b = $('<button>'),
+                             rename_folder_b = $('<button>'),
+                             delete_folder_b = $('<button>'),
+                             move_folder_b = $('<button>'),
+                             file_buttons = $('<div>'),
+                             rename_file_b = $('<button>'),
+                             delete_file_b = $('<button>'),
+                             move_file_b = $('<button>'),                
+                             feedbackarea = $('<div>'),
+                             feedback = GUIUtils.getTextSpan('',"feedback"),
 							 fileb = 
-								 GUIUtils.getFileBrowser(fnames,false,args['manualInput'],__getRecentDir(args['startDir'])),
-							 input = 
-								 GUIUtils.getStringInput('',undefined,maxFnameLength+'ex');
-	
-//					a_listview.attr("href", "#");
-//					a_filebview.attr("href", '#');
-//					a_listview.attr("class", 'enabled_link');
-//					a_filebview.attr("class", 'enabled_link');
-					
-					var clickFunction = function(ev) {
-						var toListView = 
-							(ev != undefined && ev.target == a_listview.get(0) ) ||
-							this == a_listview;
-						if( toListView )
-						{
-							a_listview.css("fontWeight", 'bold');
-							a_filebview.css("fontWeight", 'normal');
-							select.css("display", 'inline');
-							input.css("display", 'inline');
-							fileb['filebrowser'].css("display", 'none');
-						}
-						else
-						{
-							a_listview.css("fontWeight", 'normal');
-							a_filebview.css("fontWeight", 'bold');
-							select.css("display", 'none');
-							input.css("display", 'none');
-							fileb['filebrowser'].css("display", 'inline-block');
-						}
-						return false;
-					};
-					
-					a_listview.html('list view')
-					.attr("href", "#")
-					.attr("class", 'enabled_link')
-					.click( clickFunction );
+								 GUIUtils.getFileBrowser(fnames,false,args['manualInput'],__getRecentDir(args['startDir']));
 				
 					a_filebview.html('file browser view')
 					.attr("href", '#')
-					.attr("class", 'enabled_link')
-					.click( clickFunction );
-					
-//					a_listview.click( clickFunction );
-//					a_filebview.click( clickFunction );
-					
-					viewlinks.append(a_listview);
-					viewlinks.append(GUIUtils.getTextSpan('  |  '));
-					viewlinks.append(a_filebview);
-					
-					a_filebview.click();
-					
-					select.get().onchange = 
-						function(event)
-						{
-							input.val( HttpUtils.getSelectorSelection(select) );
-						};
-									
-					if( ! args['manualInput'] )
-						input.attr("disabled", "true");
+					.attr("class", 'enabled_link');
+                    
+                    new_folder_b.html('new folder')
+                    .click(function(ev) {
+                        var folder_name = prompt("please fill in a name for the folder");
+                        if (folder_name != null) {
+                            folder_name = folder_name.replace(/^\s+|\s+$/g, ''); // trim
+                            if (!folder_name.match(/^[a-zA-Z0-9_\s]+$/i)) {
+                                feedback.html("invalid folder name: " + folder_name);
+                            } else {
+                                console.log("/" + window.localStorage.getItem('user') + fileb['getcurrfolder']() + folder_name + '.folder');
+                                DataUtils.createFolder("/" + window.localStorage.getItem('user') + fileb['getcurrfolder']() + folder_name + '.folder', function(statusCode, resp) {
+                                    if( ! utils.isHttpSuccessCode(statusCode) ) {
+                                        feedback.html(resp)
+                                    } else {
+                                        feedback.html('created ' + folder_name);
+                                        fnames.push(fileb['getcurrfolder']() + folder_name + "/")
+                                        fileb['refresh'](fnames);
+                                    }
+                                });
+                            }
+                        }
+                    });
+                    folder_buttons.append(new_folder_b);
+                    
+                    rename_folder_b.html('rename folder')
+                    .click(function(ev) {
+                        var value = fileb['getcurrfolder']();
+                        var folder_name = prompt("please fill in a new name for folder " + value);
+                        if (folder_name != null) {
+                            folder_name = folder_name.replace(/^\s+|\s+$/g, ''); // trim
+                            if (!folder_name.match(/^[a-zA-Z0-9_\s]+$/i)) {
+                                feedback.html("invalid folder name: " + folder_name);
+                            } else {
+                                DataUtils.renameInCloud("/" + window.localStorage.getItem('user') + value.slice(0, -1) + ".folder", folder_name, function(statusCode,resp)
+                                    {
+                                        if( ! utils.isHttpSuccessCode(statusCode) ) {
+                                            feedback.html(resp);
+                                        } else {
+                                            var matches = value.match(/^\/(.*\/)?(.*)\/$/),
+                                                newvalue = "/" + (matches[1] || "") + folder_name + "/";
+                                            for (var idx in fnames) {
+                                                fnames[idx] = fnames[idx].replace(new RegExp("^("+value+")(.*)"), newvalue+"$2"); 
+                                            }
+                                            fileb['refresh'](fnames, newvalue);
+                                            feedback.html('renamed ' + value + ' to ' + newvalue);
+                                        }
+                                    });
+                            }
+                        }
+                    });
+                    folder_buttons.append(rename_folder_b);
+                    
+                    delete_folder_b.html('delete folder')
+                    .click(function(ev) {
+                        var value = fileb['getcurrfolder']();
+                        if (confirm("are you sure you want to delete " + value + "?")) {
+                            DataUtils.deleteFromCloud("/" + window.localStorage.getItem('user') + value.slice(0, -1) + ".folder", function(statusCode,resp)
+                                {
+                                    if( ! utils.isHttpSuccessCode(statusCode) ) {
+                                        feedback.html(resp);
+                                    } else {
+                                        var todelete = [];
+                                        for (var idx in fnames) {
+                                            if (fnames[idx].match(new RegExp("^("+value+").*"))) {
+                                                todelete.push(fnames[idx]);
+                                            }
+                                        }
+                                        for (var idx in todelete) {
+                                            fnames.splice(fnames.indexOf(todelete[idx]), 1);
+                                        }
+                                        fileb['refresh'](fnames);
+                                        feedback.html('deleted ' + value);
+                                    }
+                                });
+                        }
+                    });
+                    folder_buttons.append(delete_folder_b);
+                    
+                    move_folder_b.html('move folder')
+                    .click(function(ev) {
+                        var value = fileb['getcurrfolder']();
+                        var folder_loc = prompt("please fill in a new parent folder for folder " + value);
+                        if (folder_loc != null) {
+                            folder_loc = folder_loc.replace(/^\s+|\s+$/g, ''); // trim
+                            if (!folder_loc.match(/^\/([a-zA-Z0-9_\s]+\/)*$/i)) {
+                                feedback.html("invalid parent location: " + folder_loc);
+                            } else {
+                                DataUtils.moveInCloud("/" + window.localStorage.getItem('user') + value.slice(0, -1) + ".folder", folder_loc, function(statusCode,resp)
+                                    {
+                                        if( ! utils.isHttpSuccessCode(statusCode) ) {
+                                            feedback.html(resp);
+                                        } else {
+                                            var matches = value.match(/^\/(.*\/)?(.*)\/$/),
+                                                newvalue = folder_loc + matches[2] + "/";
+                                            for (var idx in fnames) {
+                                                fnames[idx] = fnames[idx].replace(new RegExp("^("+value+")(.*)"), newvalue+"$2"); 
+                                            }
+                                            fileb['refresh'](fnames, newvalue);
+                                            feedback.html('moved ' + value + ' to ' + folder_loc);
+                                        }
+                                    });
+                            }
+                        }
+                    });
+                    folder_buttons.append(move_folder_b);
+                    
+                    rename_file_b.html('rename file')
+                    .click(function(ev) {
+                        var value = fileb['getselection']();
+                        var file_name = prompt("please fill in a new name for file " + value);
+                        if (file_name != null) {
+                            file_name = file_name.replace(/^\s+|\s+$/g, ''); // trim
+                            if (!file_name.match(/^[a-zA-Z0-9_\s\.]+$/i)) {
+                                feedback.html("invalid folder name: " + file_name);
+                            } else {
+                                DataUtils.renameInCloud("/" + window.localStorage.getItem('user') + value.slice(0, -1) + ".file", file_name, function(statusCode,resp)
+                                    {
+                                        if( ! utils.isHttpSuccessCode(statusCode) ) {
+                                            feedback.html(resp);
+                                        } else {
+                                            var matches = value.match(/^\/(.*\/)?(.*)\/$/),
+                                                newvalue = "/" + (matches[1] || "") + file_name;
+                                            var idx = fnames.indexOf(value);
+                                            if (idx >= 0) {
+                                                fnames[idx] = newvalue;
+                                            }
+                                            fileb['refresh'](fnames);
+                                            feedback.html('renamed ' + value + ' to ' + newvalue);
+                                        }
+                                    });
+                            }
+                        }
+                    });
+                    file_buttons.append(rename_file_b);
+                    
+                    delete_file_b.html('delete file')
+                    .click(function(ev) {
+                        var value = fileb['getselection']();
+                        if (confirm("are you sure you want to delete " + value + "?")) {
+                            DataUtils.deleteFromCloud("/" + window.localStorage.getItem('user') + value + ".file", function(statusCode,resp)
+                                {
+                                    if( ! utils.isHttpSuccessCode(statusCode) ) {
+                                        feedback.html(resp);
+                                    } else {
+                                        feedback.html('deleted ' + value);
+                                        var idx = fnames.indexOf(value);
+                                        if (idx >= 0) {
+                                            fnames.splice(idx, 1);
+                                        }
+                                        fileb['refresh'](fnames);
+                                    }
+                                });
+                        }
+                    });
+                    file_buttons.append(delete_file_b);                    
+                    
+                    move_file_b.html('move file')
+                    .click(function(ev) {
+                        var value = fileb['getselection']();
+                        var folder_loc = prompt("please fill in a new parent folder for file " + value);
+                        if (folder_loc != null) {
+                            folder_loc = folder_loc.replace(/^\s+|\s+$/g, ''); // trim
+                            if (!folder_loc.match(/^\/([a-zA-Z0-9_\s]+\/)*$/i)) {
+                                feedback.html("invalid parent location: " + folder_loc);
+                            } else {
+                                DataUtils.moveInCloud("/" + window.localStorage.getItem('user') + value + ".file", folder_loc, function(statusCode,resp)
+                                    {
+                                        if( ! utils.isHttpSuccessCode(statusCode) ) {
+                                            feedback.html(resp);
+                                        } else {
+                                            var matches = value.match(/^\/(.*\/)?(.*)$/),
+                                                newvalue = folder_loc + matches[2];
+                                            feedback.html('moved ' + value + ' to ' + folder_loc);
+                                            var idx = fnames.indexOf(value);
+                                            if (idx >= 0) {
+                                                fnames[idx] = newvalue;
+                                            }
+                                            fileb['refresh'](fnames);
+                                        }
+                                    });
+                            }
+                        }
+                    });
+                    file_buttons.append(move_file_b);
 	
 					GUIUtils.setupAndShowDialog(
-						[fileb['filebrowser'],select,input,viewlinks],
+						[fileb['filebrowser'],folder_buttons,file_buttons,feedback],
 						function() 
 						{
-							var value = 
-								(fileb['filebrowser'].css("display") == 'none' ?
-									(input.val() == HttpUtils.getSelectorSelection(select) ? 
-										 	HttpUtils.getSelectorSelection(select) : [input.val()]) :
-							  			[fileb['getselection']()]);
+							var value = [fileb['getselection']()];
 							if (value.length > 0 && value[0] != "" && args['startDir']) {
 								__setRecentDir(args['startDir'],value[0].substring(0, value[0].lastIndexOf('/') + 1));
 							}

+ 88 - 13
httpwsd.js

@@ -344,13 +344,13 @@ var httpserver = _http.createServer(
 
 
 
-			/** manage cloud data **/
-			/*	[permanently] delete specified file/folder */	
-			else if( req.method == 'DELETE' && url.pathname.match(/\.file$/) )
+			/*	delete specified file/folder */	
+			else if( req.method == 'DELETE' && url.pathname.match(/\.(file|folder)$/) )
 			{
-				var matches  = url.pathname.match(/^\/(.*?)\/(.*)\.file$/),
+				var matches  = url.pathname.match(/^\/(.*?)\/(.*\/)?(.*)\.(file|folder)$/),
 					 username = matches[1],
- 					 fname 	 = matches[2],
+                     folder = matches[2] || '',
+ 					 fname 	 = matches[3],
 					 userdir	 = './users/'+username+'/',
 					 ondelete = 
 						 function(err, stdout, stderr)
@@ -361,22 +361,97 @@ var httpserver = _http.createServer(
 								 __respond(resp,200);
 						 },
 					 deletef  = 
-						 function()
+						 function(response)
 						 {
-							 if( fname.match(/^_Trash_\//) )
-								 _fspp.rmdirs(userdir+fname,ondelete);
+                             _fspp.mv(userdir+folder+fname,userdir+'_Trash_/'+folder,ondelete);
+						 };
+				_fs.exists(userdir+'_Trash_/'+folder,
+					function(exists)
+					{
+						if( ! exists )
+							_fspp.mkdirs(userdir+'_Trash_/'+folder,deletef);
+                        else {
+                            deletef();
+                        }
+					});
+			}
+
+
+
+			/*	create folder */	
+			else if( req.method == 'POST' && url.pathname.match(/\.folder$/) )
+			{
+				var matches  = url.pathname.match(/^\/(.*?)\/(.*)\.folder$/),
+					 username = matches[1],
+                     folder = matches[2],
+					 userdir	 = './users/'+username+'/',
+					 oncreate = 
+						 function(err, stdout, stderr)
+						 {
+							 if( err )
+								 __respond(resp,500,String(err));
 							 else
-								 _fspp.mv(userdir+fname,userdir+'_Trash_/',ondelete);
+								 __respond(resp,200);
 						 };
-				_fs.exists(userdir+'_Trash_/',
+				_fs.exists(userdir+folder,
 					function(exists)
 					{
 						if( ! exists )
-							_fs.mkdir(userdir+'_Trash_/',deletef);
-						else
-							deletef();
+							_fspp.mkdirs(userdir+folder,oncreate);
+                        else {
+                            oncreate("folder " + folder + " already exists");
+                        }
 					});
 			}
+
+
+
+			/*	rename file/folder (or move) */	
+			else if( req.method == 'PUT' && url.pathname.match(/\.(folder|file)$/) )
+			{                
+                req.setEncoding('utf8');
+				var data = '';
+				req.addListener("data", function(chunk) {data += chunk;});
+				req.addListener("end", 
+                    function() {
+                        data = _utils.jsonp(data);
+                        if (data.match(/^\//)) {
+                            // move
+                            var matches  = url.pathname.match(/^\/(.*?)\/(.*\/)?(.*)\.(file|folder)$/),
+                                username = matches[1],
+                                folder = matches[2] || '',
+                                fname 	 = matches[3],
+                                userdir	 = './users/'+username,
+                                onmove = 
+                                     function(err, stdout, stderr)
+                                     {
+                                         if( err )
+                                             __respond(resp,500,String(err));
+                                         else
+                                             __respond(resp,200);
+                                     };
+                            _fspp.mv(userdir+"/"+folder+fname,userdir+data,onmove)
+                        } else {
+                            //rename
+                            var matches  = url.pathname.match(/^\/(.*?)\/(.*\/)?(.*)\.(file|folder)$/),
+                                username = matches[1],
+                                folder = matches[2] || '',
+                                fname 	 = matches[3],
+                                userdir	 = './users/'+username+'/',
+                                onrename = 
+                                     function(err, stdout, stderr)
+                                     {
+                                         if( err )
+                                             __respond(resp,500,String(err));
+                                         else
+                                             __respond(resp,200);
+                                     };
+                            _fs.rename(userdir+folder+fname,userdir+folder+data,onrename)
+                        }
+                    }
+                )
+				
+			}
 				
 			/* extract user-uploaded archive to specified folder 
 				1. read in all data

Datei-Diff unterdrückt, da er zu groß ist
+ 28662 - 0
users/(default)/Formalisms/SCCD/.autosave.SCCD.defaultIcons.model


Datei-Diff unterdrückt, da er zu groß ist
+ 5777 - 0
users/(default)/Formalisms/SCCD/.autosave.SCCDMM.model


Datei-Diff unterdrückt, da er zu groß ist
+ 3949 - 0
users/(default)/Formalisms/SCCD/.autosave.SCCD_Debug.defaultIcons.model


Datei-Diff unterdrückt, da er zu groß ist
+ 1511 - 0
users/(default)/Formalisms/SCCD/.autosave.SCCD_DebugMM.model


Datei-Diff unterdrückt, da er zu groß ist
+ 2390 - 0
users/(default)/Formalisms/SCCD/SCCD.defaultIcons.metamodel


Datei-Diff unterdrückt, da er zu groß ist
+ 28662 - 0
users/(default)/Formalisms/SCCD/SCCD.defaultIcons.model


Datei-Diff unterdrückt, da er zu groß ist
+ 766 - 0
users/(default)/Formalisms/SCCD/SCCD.metamodel


Datei-Diff unterdrückt, da er zu groß ist
+ 5779 - 0
users/(default)/Formalisms/SCCD/SCCDMM.model


+ 433 - 0
users/(default)/Formalisms/SCCD/SCCD_Debug.defaultIcons.metamodel

@@ -0,0 +1,433 @@
+{
+	"types": {
+		"GlobalBreakpointIcon": [
+			{
+				"name": "typename",
+				"type": "string",
+				"default": "GlobalBreakpointIcon"
+			},
+			{
+				"name": "position",
+				"type": "list<double>",
+				"default": [
+					150,
+					125
+				]
+			},
+			{
+				"name": "orientation",
+				"type": "double",
+				"default": 0
+			},
+			{
+				"name": "scale",
+				"type": "list<double>",
+				"default": [
+					1,
+					1
+				]
+			},
+			{
+				"name": "mapper",
+				"type": "code",
+				"default": "/* specify code that evaluates to an associative array of the form {...,csattr:val,...} */"
+			},
+			{
+				"name": "parser",
+				"type": "code",
+				"default": "/* specify code that evaluates to an associative array of the form {...,attr:val,...} */"
+			},
+			{
+				"name": "$contents",
+				"type": "map<string,*>",
+				"default": {
+					"nodes": {
+						"3": {
+							"width": {
+								"type": "double",
+								"value": 150
+							},
+							"height": {
+								"type": "double",
+								"value": 50
+							},
+							"cornerRadius": {
+								"type": "double",
+								"value": 25
+							},
+							"style": {
+								"type": "map<string,string>",
+								"value": {
+									"stroke": "#ffffff",
+									"stroke-dasharray": "",
+									"fill": "red",
+									"fill-opacity": 1,
+									"font-size": "20px",
+									"stroke-width": 1,
+									"arrow-start": "none",
+									"arrow-end": "none"
+								}
+							},
+							"mapper": {
+								"type": "code",
+								"value": "/* specify code that evaluates to an associative array of the form {...,csattr:val,...} */\nvar style = {\n   \"stroke\": \"#ffffff\",\n   \"stroke-dasharray\": \"\",\n   \"fill\": \"red\",\n   \"fill-opacity\": 1,\n   \"font-size\": \"20px\",\n   \"stroke-width\": 1,\n   \"arrow-start\": \"none\",\n   \"arrow-end\": \"none\"\n};\nif (!getAttr(\"enabled\")) {\n   style[\"fill\"] = \"grey\";\n}\n({\"style\": style})"
+							},
+							"parser": {
+								"type": "code",
+								"value": "/* specify code that evaluates to an associative array of the form {...,attr:val,...} */"
+							},
+							"$type": "/Formalisms/__LanguageSyntax__/ConcreteSyntax/ConcreteSyntax/Rectangle",
+							"position": {
+								"type": "list<double>",
+								"value": [
+									5,
+									3
+								]
+							},
+							"orientation": {
+								"type": "double",
+								"value": 0
+							},
+							"scale": {
+								"type": "list<double>",
+								"value": [
+									1,
+									1
+								]
+							}
+						},
+						"4": {
+							"textContent": {
+								"type": "string",
+								"value": "<coded>"
+							},
+							"style": {
+								"type": "map<string,string>",
+								"value": {
+									"stroke": "#ffffff",
+									"stroke-dasharray": "",
+									"fill": "#000000",
+									"fill-opacity": 1,
+									"font-size": "12px",
+									"stroke-width": 0,
+									"arrow-start": "none",
+									"arrow-end": "none"
+								}
+							},
+							"mapper": {
+								"type": "code",
+								"value": "/* specify code that evaluates to an associative array of the form {...,csattr:val,...} */\n/* specify code that evaluates to an associative array of the form {...,csattr:val,...} */\nvar splitted = getAttr('condition').split('\\n'),\n    textContent = \"\";\nif (splitted.length > 1) {\n    textContent = \"...\\n\" + splitted[splitted.length - 1];\n} else if (splitted.length == 1) {\n    textContent = splitted[0];\n}\n({'textContent': textContent})"
+							},
+							"parser": {
+								"type": "code",
+								"value": "/* specify code that evaluates to an associative array of the form {...,attr:val,...} */"
+							},
+							"$type": "/Formalisms/__LanguageSyntax__/ConcreteSyntax/ConcreteSyntax/Text",
+							"position": {
+								"type": "list<double>",
+								"value": [
+									16,
+									11
+								]
+							},
+							"orientation": {
+								"type": "double",
+								"value": 0
+							},
+							"scale": {
+								"type": "list<double>",
+								"value": [
+									1,
+									1
+								]
+							}
+						},
+						"7": {
+							"$type": "/Formalisms/__LanguageSyntax__/ConcreteSyntax/ConcreteSyntax/Contain",
+							"position": {
+								"type": "list<double>",
+								"value": [
+									23.31953002410694,
+									11.55769180195216
+								]
+							},
+							"orientation": {
+								"type": "double",
+								"value": 0
+							},
+							"scale": {
+								"type": "list<double>",
+								"value": [
+									1,
+									1
+								]
+							},
+							"link-style": {
+								"type": "map<string,string>",
+								"value": {
+									"stroke": "#00ffff",
+									"stroke-dasharray": "",
+									"stroke-opacity": 0.1,
+									"stroke-width": 1
+								}
+							}
+						}
+					},
+					"edges": [
+						{
+							"src": "3",
+							"dest": "7"
+						},
+						{
+							"src": "7",
+							"dest": "4"
+						}
+					]
+				}
+			},
+			{
+				"name": "$asuri",
+				"type": "string",
+				"default": "-1"
+			}
+		],
+		"BreakpointIcon": [
+			{
+				"name": "typename",
+				"type": "string",
+				"default": "BreakpointIcon"
+			},
+			{
+				"name": "position",
+				"type": "list<double>",
+				"default": [
+					400,
+					125
+				]
+			},
+			{
+				"name": "orientation",
+				"type": "double",
+				"default": 0
+			},
+			{
+				"name": "scale",
+				"type": "list<double>",
+				"default": [
+					1,
+					1
+				]
+			},
+			{
+				"name": "mapper",
+				"type": "code",
+				"default": "/* specify code that evaluates to an associative array of the form {...,csattr:val,...} */"
+			},
+			{
+				"name": "parser",
+				"type": "code",
+				"default": "/* specify code that evaluates to an associative array of the form {...,attr:val,...} */"
+			},
+			{
+				"name": "$contents",
+				"type": "map<string,*>",
+				"default": {
+					"nodes": {
+						"2": {
+							"r": {
+								"type": "double",
+								"value": 15
+							},
+							"style": {
+								"type": "map<string,string>",
+								"value": {
+									"stroke": "#ffffff",
+									"stroke-dasharray": "",
+									"fill": "red",
+									"fill-opacity": 1,
+									"font-size": "20px",
+									"stroke-width": 1,
+									"arrow-start": "none",
+									"arrow-end": "none"
+								}
+							},
+							"mapper": {
+								"type": "code",
+								"value": "/* specify code that evaluates to an associative array of the form {...,csattr:val,...} */\nvar style = {\n   \"stroke\": \"#ffffff\",\n   \"stroke-dasharray\": \"\",\n   \"fill\": \"red\",\n   \"fill-opacity\": 1,\n   \"font-size\": \"20px\",\n   \"stroke-width\": 1,\n   \"arrow-start\": \"none\",\n   \"arrow-end\": \"none\"\n};\nif (!getAttr(\"enabled\")) {\n   style[\"fill\"] = \"grey\";\n}\n({\"style\": style})"
+							},
+							"parser": {
+								"type": "code",
+								"value": "/* specify code that evaluates to an associative array of the form {...,attr:val,...} */"
+							},
+							"$type": "/Formalisms/__LanguageSyntax__/ConcreteSyntax/ConcreteSyntax/Circle",
+							"position": {
+								"type": "list<double>",
+								"value": [
+									4,
+									4
+								]
+							},
+							"orientation": {
+								"type": "double",
+								"value": 0
+							},
+							"scale": {
+								"type": "list<double>",
+								"value": [
+									1,
+									1
+								]
+							}
+						}
+					},
+					"edges": []
+				}
+			},
+			{
+				"name": "$asuri",
+				"type": "string",
+				"default": "-1"
+			}
+		],
+		"targetLink": [
+			{
+				"name": "link-style",
+				"type": "map<string,string>",
+				"default": {
+					"stroke": "red",
+					"stroke-dasharray": ". ",
+					"stroke-opacity": 1,
+					"stroke-width": 2
+				}
+			},
+			{
+				"name": "arrowHead",
+				"type": "ENUM(circle-black,circle-black-large,circle-white,circle-white-large,diamond-black,diamond-black-large,diamond-white,diamond-white-large,triangle-black,triangle-black-large,triangle-white,triangle-white-large,arrow-black,arrow-black-large,arrow-empty,arrow-empty-large,custom)",
+				"default": "custom"
+			},
+			{
+				"name": "arrowTail",
+				"type": "ENUM(circle-black,circle-black-large,circle-white,circle-white-large,diamond-black,diamond-black-large,diamond-white,diamond-white-large,triangle-black,triangle-black-large,triangle-white,triangle-white-large,arrow-black,arrow-black-large,arrow-empty,arrow-empty-large,custom)",
+				"default": "arrow-black"
+			},
+			{
+				"name": "typename",
+				"type": "string",
+				"default": "targetLink"
+			},
+			{
+				"name": "position",
+				"type": "list<double>",
+				"default": [
+					647,
+					123
+				]
+			},
+			{
+				"name": "orientation",
+				"type": "double",
+				"default": 0
+			},
+			{
+				"name": "scale",
+				"type": "list<double>",
+				"default": [
+					1,
+					1
+				]
+			},
+			{
+				"name": "mapper",
+				"type": "code",
+				"default": "/* specify code that evaluates to an associative array of the form {...,csattr:val,...} */"
+			},
+			{
+				"name": "parser",
+				"type": "code",
+				"default": "/* specify code that evaluates to an associative array of the form {...,attr:val,...} */"
+			},
+			{
+				"name": "$contents",
+				"type": "map<string,*>",
+				"default": {
+					"nodes": {
+						"267": {
+							"segments": {
+								"type": "string",
+								"value": "m0,0 l10,4 l-10,4 l3,-4 z"
+							},
+							"style": {
+								"type": "map<string,string>",
+								"value": {
+									"stroke": "#000000",
+									"fill": "#000000",
+									"opacity": 1,
+									"stroke-width": 1
+								}
+							},
+							"mapper": {
+								"type": "code",
+								"value": ""
+							},
+							"parser": {
+								"type": "code",
+								"value": "/* specify code that evaluates to an associative array of the form {...,attr:val,...} */"
+							},
+							"$type": "/Formalisms/__LanguageSyntax__/ConcreteSyntax/ConcreteSyntax/Path",
+							"position": {
+								"type": "list<double>",
+								"value": [
+									0,
+									0
+								]
+							},
+							"orientation": {
+								"type": "double",
+								"value": 0
+							},
+							"scale": {
+								"type": "list<double>",
+								"value": [
+									1,
+									1
+								]
+							},
+							"$linkDecoratorInfo": {
+								"type": "map<string,double>",
+								"value": {
+									"xratio": 1,
+									"yoffset": -4
+								}
+							}
+						}
+					},
+					"edges": []
+				}
+			},
+			{
+				"name": "$asuri",
+				"type": "string",
+				"default": "-1"
+			},
+			{
+				"name": "$segments",
+				"type": "map<string,list<string>>",
+				"default": {}
+			}
+		]
+	},
+	"constraints": [],
+	"actions": [],
+	"cardinalities": {
+		"GlobalBreakpointIcon": [],
+		"BreakpointIcon": [],
+		"targetLink": []
+	},
+	"legalConnections": {},
+	"connectorTypes": {},
+	"types2parentTypes": {
+		"GlobalBreakpointIcon": [],
+		"BreakpointIcon": [],
+		"targetLink": []
+	}
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 3949 - 0
users/(default)/Formalisms/SCCD/SCCD_Debug.defaultIcons.model


+ 91 - 0
users/(default)/Formalisms/SCCD/SCCD_Debug.metamodel

@@ -0,0 +1,91 @@
+{
+	"types": {
+		"Breakpoint": [
+			{
+				"name": "condition",
+				"type": "code",
+				"default": ""
+			},
+			{
+				"name": "enabled",
+				"type": "boolean",
+				"default": true
+			},
+			{
+				"name": "disable_after_trigger",
+				"type": "boolean",
+				"default": true
+			}
+		],
+		"$*": [],
+		"GlobalBreakpoint": [
+			{
+				"name": "condition",
+				"type": "code",
+				"default": ""
+			},
+			{
+				"name": "enabled",
+				"type": "boolean",
+				"default": true
+			},
+			{
+				"name": "disable_after_trigger",
+				"type": "boolean",
+				"default": true
+			}
+		],
+		"target": []
+	},
+	"constraints": [],
+	"actions": [],
+	"cardinalities": {
+		"Breakpoint": [
+			{
+				"dir": "out",
+				"type": "target",
+				"min": "1",
+				"max": "1"
+			}
+		],
+		"$*": [
+			{
+				"dir": "in",
+				"type": "target",
+				"min": "0",
+				"max": "Infinity"
+			}
+		],
+		"GlobalBreakpoint": [],
+		"target": [
+			{
+				"dir": "in",
+				"type": "Breakpoint",
+				"min": "0",
+				"max": "1"
+			},
+			{
+				"dir": "out",
+				"type": "$*",
+				"min": "0",
+				"max": "1"
+			}
+		]
+	},
+	"legalConnections": {
+		"Breakpoint": {
+			"$*": [
+				"target"
+			]
+		}
+	},
+	"connectorTypes": {
+		"target": "visual"
+	},
+	"types2parentTypes": {
+		"Breakpoint": [],
+		"$*": [],
+		"GlobalBreakpoint": [],
+		"target": []
+	}
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 1511 - 0
users/(default)/Formalisms/SCCD/SCCD_DebugMM.model


+ 1 - 1
users/(default)/prefs

@@ -1,7 +1,7 @@
 {
 	"autosave-delay": {
 		"type": "int",
-		"value": 300
+		"value": 30
 	},
 	"autosave-mode": {
 		"type": "ENUM(overwrite,backup)",