Restore the plugin maker
Revert "Bug-397910 - removing the plugin maker from Orion"

This reverts commit 4a5f767e55820cf01b0e6a167a74c01e7c177ef3.
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/PluginCompletionSection.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/PluginCompletionSection.js
new file mode 100644
index 0000000..efd05c2
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/PluginCompletionSection.js
@@ -0,0 +1,48 @@
+/*******************************************************************************

+ * @license

+ * Copyright (c) 2012 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials are made 

+ * available under the terms of the Eclipse Public License v1.0 

+ * (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution 

+ * License v1.0 (http://www.eclipse.org/org/documents/edl-v10.html). 

+ * 

+ * Contributors: Anton McConville - IBM Corporation - initial API and implementation

+ ******************************************************************************/

+/*global dojo dijit widgets orion  window console define localStorage*/

+/*jslint browser:true*/

+

+/* This SettingsContainer widget is a dojo border container with a left and right side. The left is for choosing a 

+   category, the right shows the resulting HTML for that category. */

+

+define(['i18n!orion/settings/nls/messages', 'require', 'dojo', 'dijit', 'dijit/TooltipDialog', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', 'orion/widgets/plugin/PluginList', 'orion/widgets/maker/ScrollingContainerSection'], function(messages, require, dojo, dijit) {

+

+	dojo.declare("orion.widgets.maker.PluginCompletionSection", [orion.widgets.maker.ScrollingContainerSection], { //$NON-NLS-0$

+						

+		content:'<form class="scrollForm" action="/" method="post">' +	 //$NON-NLS-0$

+					'<fieldset>' + //$NON-NLS-0$

+						'<div class="steps">' + //$NON-NLS-0$

+							'<a id="code" class="nextlink downloadbutton" style="float: left; background-color: #2dad2d;" target="_blank"><span style="display: inline-block;">'+messages['Edit Plugin JavaScript']+'</span></a>' + //$NON-NLS-2$ //$NON-NLS-0$

+							'<a id="installer" class="nextlink downloadbutton" style="padding-left:20px;float: left; background-color: #2dad2d;" target="_blank"><span style="display: inline-block;">'+messages['Install Plugin']+'</span></a>' + //$NON-NLS-2$ //$NON-NLS-0$

+						'</div>' + //$NON-NLS-0$

+					'</fieldset>' +								 //$NON-NLS-0$

+				'</form>', //$NON-NLS-0$

+				

+		updateReferences: function( root, path, name ){

+			var installer = dojo.byId( "installer" ); //$NON-NLS-0$

+			installer.href = root + 'settings/settings.html#,category=plugins,installPlugin=' + path; //$NON-NLS-0$

+			

+			var code = dojo.byId( "code" ); //$NON-NLS-0$

+			code.href =  root + 'edit/edit.html#/file/FF/bundles/org.eclipse.orion.client.ui/web/plugins/' + name + '/' + name + '.js'; //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$

+		},

+				

+		getData: function(){

+			var data = [];

+			data.id = this.sectionID;

+			data.name = dojo.byId( 'pluginname' ).value; //$NON-NLS-0$

+			data.author = dojo.byId( 'pluginauthor' ).value; //$NON-NLS-0$

+			data.licence = dojo.byId( 'pluginLicence' ).value; //$NON-NLS-0$

+			data.description = dojo.byId( 'pluginDescription' ).value; //$NON-NLS-0$

+			return data;

+		}

+	});

+});
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/PluginDescriptionSection.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/PluginDescriptionSection.js
new file mode 100644
index 0000000..6cf90c4
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/PluginDescriptionSection.js
@@ -0,0 +1,52 @@
+/*******************************************************************************

+ * @license

+ * Copyright (c) 2012 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials are made 

+ * available under the terms of the Eclipse Public License v1.0 

+ * (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution 

+ * License v1.0 (http://www.eclipse.org/org/documents/edl-v10.html). 

+ * 

+ * Contributors: Anton McConville - IBM Corporation - initial API and implementation

+ ******************************************************************************/

+/*global dojo dijit widgets orion  window console define localStorage*/

+/*jslint browser:true*/

+

+/* This SettingsContainer widget is a dojo border container with a left and right side. The left is for choosing a 

+   category, the right shows the resulting HTML for that category. */

+

+define(['i18n!orion/settings/nls/messages', 'require', 'dojo', 'dijit', 'dijit/TooltipDialog', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', 'orion/widgets/plugin/PluginList', 'orion/widgets/maker/ScrollingContainerSection'], function(messages, require, dojo, dijit) {

+

+	dojo.declare("orion.widgets.maker.PluginDescriptionSection", [orion.widgets.maker.ScrollingContainerSection], { //$NON-NLS-0$

+						

+		content: '<form class="scrollForm" action="/" method="post">' +	 //$NON-NLS-0$

+					'<fieldset>' + //$NON-NLS-0$

+						'<p class="first">' +					 //$NON-NLS-0$

+							'<label for="name">'+messages['Plugin Name:']+'</label>' +				 //$NON-NLS-2$ //$NON-NLS-0$

+							'<input type="text" name="name" id="pluginname" size="30">' +					 //$NON-NLS-0$

+						'</p>' + //$NON-NLS-0$

+						'<p>' +					 //$NON-NLS-0$

+							'<label for="email">'+messages['Author Name:']+'</label>' +				 //$NON-NLS-2$ //$NON-NLS-0$

+							'<input  type="text" name="email" id="pluginauthor" size="30">' +				 //$NON-NLS-0$

+						'</p>' + //$NON-NLS-0$

+						'<p>' + //$NON-NLS-0$

+							'<label for="web">'+messages['Licence:']+'</label>' +				 //$NON-NLS-2$ //$NON-NLS-0$

+							'<input type="text" name="web" id="pluginLicence" size="30">' +										 //$NON-NLS-0$

+						'</p>' +			 //$NON-NLS-0$

+						'<p>' + //$NON-NLS-0$

+							'<label for="message">'+messages['Description:']+'</label>' +//$NON-NLS-2$ //$NON-NLS-0$

+							'<textarea name="message" id="pluginDescription" cols="30" rows="10"></textarea>' + //$NON-NLS-0$

+						'</p>' +					 //$NON-NLS-0$

+					'</fieldset>' +								 //$NON-NLS-0$

+				'</form>', //$NON-NLS-0$

+				

+		getData: function(){

+			var data = [];

+			data.id = this.sectionID;

+			data.name = dojo.byId( 'pluginname' ).value; //$NON-NLS-0$

+			data.author = dojo.byId( 'pluginauthor' ).value; //$NON-NLS-0$

+			data.licence = dojo.byId( 'pluginLicence' ).value; //$NON-NLS-0$

+			data.description = dojo.byId( 'pluginDescription' ).value; //$NON-NLS-0$

+			return data;

+		}

+	});

+});
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/PluginMakerContainer.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/PluginMakerContainer.js
new file mode 100644
index 0000000..e5258ac
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/PluginMakerContainer.js
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * @license
+ * Copyright (c) 2012 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials are made 
+ * available under the terms of the Eclipse Public License v1.0 
+ * (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution 
+ * License v1.0 (http://www.eclipse.org/org/documents/edl-v10.html). 
+ * 
+ * Contributors: Anton McConville - IBM Corporation - initial API and implementation
+ ******************************************************************************/
+/*global dojo dijit widgets orion  window console define localStorage*/
+/*jslint browser:true*/
+
+/* This SettingsContainer widget is a dojo border container with a left and right side. The left is for choosing a 
+   category, the right shows the resulting HTML for that category. */
+
+define(['require', 'dojo', 'dijit', 'orion/commands', 'orion/fileClient', 'dijit/TooltipDialog', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', 'orion/widgets/plugin/PluginList', 'orion/widgets/maker/ScrollingContainer', 'orion/widgets/maker/PluginCompletionSection'], function(require, dojo, dijit, mCommands, mFileClient) {
+
+	dojo.declare("orion.widgets.maker.PluginMakerContainer", [orion.widgets.maker.ScrollingContainer], { //$NON-NLS-0$
+		
+		fileClient: null,
+		
+		path: '/file/FF/bundles/org.eclipse.orion.client.ui/web/plugins/', //$NON-NLS-0$
+		
+		csscomplete: false,
+		jscomplete: false,
+		htmlcomplete: false,
+		
+		postCreate: function(){
+			
+			var bar = dojo.byId( 'pageToolbar' );	 //$NON-NLS-0$
+			dojo.style( bar, 'borderBottom', '2px solid whitesmoke' ); //$NON-NLS-1$ //$NON-NLS-0$
+			
+			var actions = dojo.byId( 'pageActions' ); //$NON-NLS-0$
+			
+			this.sectionNavigation = dojo.create( 'div', null, actions ); //$NON-NLS-0$
+		
+			this.sectionList = [];
+			
+			this.fileClient = new mFileClient.FileClient(this.serviceRegistry);	
+		},
+		
+		
+		addCommand: function( name, command ){
+		
+			var id = "orion.add" + name; //$NON-NLS-0$
+			var tooltip = name;
+		
+			var createPluginCommand = new mCommands.Command({
+				name: name,
+				tooltip: tooltip,
+				id: id,
+				anchor: name,
+				callback: dojo.hitch( this, command )
+			});
+			
+			this.commandService.addCommand(createPluginCommand);
+			this.commandService.registerCommandContribution(this.toolbarID, id, 2);
+			this.commandService.renderCommands(this.toolbarID, this.toolbarID, this, this, "button"); //$NON-NLS-0$
+			
+			var nodes = dojo.query(".commandButton"); //$NON-NLS-0$
+			
+			for( var n = 0; n < nodes.length; n++ ){
+				nodes[n].style.padding = '3px'; //$NON-NLS-0$
+			}	
+		},
+		
+		
+		handleError: function(error){
+			console.log( error );
+		},
+		
+		handleSuccess: function(media, name ){
+		
+			switch( media ){
+				case 'css': //$NON-NLS-0$
+					this.csscomplete = true;
+					break;
+					
+				case 'js': //$NON-NLS-0$
+					this.jscomplete = true;
+					break;
+					
+				case 'html': //$NON-NLS-0$
+					this.htmlcomplete = true;
+					break;
+			}
+		
+			if( this.csscomplete && this.htmlcomplete && this.jscomplete ){
+			
+			
+				var root = window.location.href.split('settings')[0]; //$NON-NLS-0$
+				
+				var pluginPath = root + 'plugins/' + name + '/' + name + '.html'; //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$
+				
+				var source;
+			
+				var complete = orion.widgets.maker.PluginCompletionSection({title:"Next Steps"}); //$NON-NLS-0$
+				
+				var createButton = dojo.byId( 'buttonorion.addCreate0' ); //$NON-NLS-0$
+				createButton.parentNode.removeChild(createButton);
+				
+				var menuItem = this.addSection( complete );
+				
+				var event = [];
+				event.currentTarget = menuItem;
+				
+				this.scrollTo( event );
+				
+				complete.updateReferences( root, pluginPath, name );
+			}
+		},
+		
+		writeJSContent: function(){
+		
+			var content = this.prepareJSContent();
+			var def = this.fileClient.write( this.javascriptFile, content );
+			var progress = this.serviceRegistry.getService("orion.page.progress");
+			if(progress){
+				progress.progress(def, "Writing javascript content for " + this.pluginName);
+			}
+			def.then(
+							dojo.hitch(this, 'handleSuccess', 'js', this.pluginName ), //$NON-NLS-1$ //$NON-NLS-0$
+							this.handleError);
+		},
+		
+		writeCSSContent: function(){
+		
+			var content =		'.plugin{\n' + //$NON-NLS-0$
+									'\tborder:solid 5px #ebf4fb;\n' + //$NON-NLS-0$
+									'\twidth: 400px;\n' + //$NON-NLS-0$
+									'\theight: 400px;\n' + //$NON-NLS-0$
+									'\tposition: absolute;\n' + //$NON-NLS-0$
+									'\tleft: 50%;\n' + //$NON-NLS-0$
+									'\ttop: 50%;\n' + //$NON-NLS-0$
+									'\tmargin-left: -200px;\n' + //$NON-NLS-0$
+									'\tmargin-top: -200px;\n' + //$NON-NLS-0$
+									'\tborder-radius:5px;\n' + //$NON-NLS-0$
+								'}\n\n' + //$NON-NLS-0$
+
+								'.banner{\n' + //$NON-NLS-0$
+									'\tfont-size:14px;\n' + //$NON-NLS-0$
+									'\tfont-weight:bold;\n' + //$NON-NLS-0$
+									'\tmargin:14px;\n' + //$NON-NLS-0$
+									'\tcolor:#5b6e79;\n' + //$NON-NLS-0$
+									'\ttext-align:center;\n' + //$NON-NLS-0$
+									'\tmargin-top:50px;\n' + //$NON-NLS-0$
+								'}\n\n' + //$NON-NLS-0$
+
+								'.title{\n' + //$NON-NLS-0$
+									'\tfont-size:20px;\n' + //$NON-NLS-0$
+									'\tfont-weight:bold;\n' + //$NON-NLS-0$
+									'\tmargin:10px;\n' + //$NON-NLS-0$
+									'\tcolor:#5b6e79;\n' + //$NON-NLS-0$
+									'\ttext-align:center;\n' + //$NON-NLS-0$
+								'}\n\n' + //$NON-NLS-0$
+
+								'.author{\n' + //$NON-NLS-0$
+									'\tfont-size:14px;\n' + //$NON-NLS-0$
+									'\tfont-weight:bold;\n' + //$NON-NLS-0$
+									'\tmargin:10px;\n' + //$NON-NLS-0$
+									'\tcolor:#5b6e79;\n' + //$NON-NLS-0$
+									'\ttext-align:center;\n' + //$NON-NLS-0$
+								'}\n\n' + //$NON-NLS-0$
+								
+								'.created{\n' + //$NON-NLS-0$
+									'\tfont-size:14px;\n' + //$NON-NLS-0$
+									'\tfont-weight:bold;\n' + //$NON-NLS-0$
+									'\tmargin:10px;\n' + //$NON-NLS-0$
+									'\tcolor:#5b6e79;\n' + //$NON-NLS-0$
+									'\ttext-align:center;\n' + //$NON-NLS-0$
+								'}\n\n' + //$NON-NLS-0$
+								
+								'.description{\n' + //$NON-NLS-0$
+									'\tfont-size:14px;\n' + //$NON-NLS-0$
+									'\tfont-weight:bold;\n' + //$NON-NLS-0$
+						                        '\tborder-top: 1px solid #b7ddf2;\n' + //$NON-NLS-0$
+									'\tmargin:10px;\n' + //$NON-NLS-0$
+									'\tmargin-top:15px;\n' + //$NON-NLS-0$
+									'\tpadding:15px;\n' + //$NON-NLS-0$
+									'\tcolor:#5b6e79;\n' + //$NON-NLS-0$
+									'\ttext-align:center;\n' + //$NON-NLS-0$
+									'\twidth:275px;\n' + //$NON-NLS-0$
+									'\tmargin-left:50px;\n' + //$NON-NLS-0$
+									'\tmargin-right:100px;\n' + //$NON-NLS-0$
+									'\tline-height:20px;\n' + //$NON-NLS-0$
+								'}'; //$NON-NLS-0$
+								
+			var def = this.fileClient.write( this.cssFile, content );
+			var progress = this.serviceRegistry.getService("orion.page.progress");
+			if(progress){
+				progress.progress(def, "Writing css content for " + this.pluginName);
+			}
+			def.then(
+							dojo.hitch(this, 'handleSuccess', 'css', this.pluginName ), //$NON-NLS-1$ //$NON-NLS-0$
+							this.handleError);
+		
+		},
+		
+		writeHTMLContent: function(){
+		
+			var content = this.prepareHTMLContent();
+		
+			var def = this.fileClient.write( this.htmlFile, content );
+			var progress = this.serviceRegistry.getService("orion.page.progress");
+			if(progress){
+				progress.progress(def, "Writing html content for " + this.pluginName);
+			}
+			def.then(dojo.hitch(this, 'handleSuccess', 'html', this.pluginName), //$NON-NLS-1$ //$NON-NLS-0$
+							this.handleError);
+		},
+		
+		createNewFolder: function( name ){
+			var def = this.fileClient.createFolder( this.path, name );
+			var progress = this.serviceRegistry.getService("orion.page.progress");
+			if(progress){
+				progress.progress(def, "Creating folder " + name);
+			}
+			def.then(dojo.hitch(this, 'createNewFiles'), //$NON-NLS-0$
+							this.handleError);
+		},
+		
+		createNewFiles: function( filename ){	
+			
+			var pluginjs = this.pluginName + '.js'; //$NON-NLS-0$
+			var pluginhtml = this.pluginName + '.html'; //$NON-NLS-0$
+			var plugincss = this.pluginName + '.css'; //$NON-NLS-0$
+			
+			this.javascriptFile = this.path + '/' + this.pluginName + '/' + pluginjs; //$NON-NLS-1$ //$NON-NLS-0$
+			this.htmlFile = this.path + '/' + this.pluginName + '/' + pluginhtml; //$NON-NLS-1$ //$NON-NLS-0$
+			this.cssFile = this.path + '/' + this.pluginName + '/' + plugincss; //$NON-NLS-1$ //$NON-NLS-0$
+			
+			var progress = this.serviceRegistry.getService("orion.page.progress");
+			var def = this.fileClient.createFile( this.path + '/' + this.pluginName , pluginjs );
+			if(progress){
+				progress.progress("Creating javascript file for plugin " + this.pluginName);
+			}
+			def.then( //$NON-NLS-0$
+							dojo.hitch(this, 'writeJSContent'), //$NON-NLS-0$
+							this.handleError);
+			
+							
+			def = this.fileClient.createFile( this.path + '/' + this.pluginName , pluginhtml )
+			if(progress){
+				progress.progress("Creating html file for plugin " + this.pluginName);
+			}
+			def.then( //$NON-NLS-0$
+							dojo.hitch(this, 'writeHTMLContent'), //$NON-NLS-0$
+							this.handleError);
+							
+			def = this.fileClient.createFile( this.path + '/' + this.pluginName , plugincss )
+			if(progress){
+				progress.progress("Creating css file for plugin " + this.pluginName);
+			}
+			def.then( //$NON-NLS-0$
+							dojo.hitch(this, 'writeCSSContent'), //$NON-NLS-0$
+							this.handleError);
+		},
+		
+		prepareHTMLContent: function(){
+			var filecontent = '<!DOCTYPE html>\n' + //$NON-NLS-0$
+								'<html>\n' + //$NON-NLS-0$
+									'\t<head>\n' + //$NON-NLS-0$
+									  '\t\t<meta charset="UTF-8"/>\n' + //$NON-NLS-0$
+									  '\t\t<title>' + this.pluginName + '</title>\n' + //$NON-NLS-1$ //$NON-NLS-0$
+									  '\t\t<link rel=StyleSheet href="' + this.pluginName + '.css" type="text/css"></link>\n' + //$NON-NLS-1$ //$NON-NLS-0$
+									  '\t\t<script src="../../orion/plugin.js"></script>\n' + //$NON-NLS-0$
+									  '\t\t<script src="' + this.pluginName + '.js"></script>\n' + //$NON-NLS-1$ //$NON-NLS-0$
+									  '\t\t<script>\n' + //$NON-NLS-0$
+							'\t\t</script>\n' + //$NON-NLS-0$
+							'\t</head>\n' + //$NON-NLS-0$
+							'\t<body>\n' + //$NON-NLS-0$
+							'\t\t<div class="plugin">\n' + //$NON-NLS-0$
+							'\t\t\t<div class="banner">An Eclipse Orion Plugin</div>\n' + //$NON-NLS-0$
+							'\t\t\t<div class="title"> - ' + this.pluginName + ' - </div>\n' + //$NON-NLS-1$ //$NON-NLS-0$
+							'\t\t\t<div class="author">Written by ' + this.pluginAuthor + '</div>\n' + //$NON-NLS-1$ //$NON-NLS-0$
+							'\t\t\t<div class="created">Created 13.04.2012</div>\n' + //$NON-NLS-0$
+							'\t\t\t<div class="description">' + this.pluginDescription + '</div>\n' + //$NON-NLS-1$ //$NON-NLS-0$
+							'\t\t</div>\n' + //$NON-NLS-0$
+							'\t</body>\n' + //$NON-NLS-0$
+							'</html>'; //$NON-NLS-0$
+							
+			return filecontent;
+		},
+		
+		prepareJSContent: function(){	
+			var filecontent =	'/*global console eclipse CSSLint window*/\n\n' +  //$NON-NLS-0$
+								'window.onload = function() {\n' + //$NON-NLS-0$
+									'\tvar provider = new orion.PluginProvider();\n' + //$NON-NLS-0$
+									'\tvar serviceImpl = {\n' + //$NON-NLS-0$
+											'\t\trun: function(text) {\n' + //$NON-NLS-0$
+												'\t\t\treturn text.split("").reverse().join("");\n' + //$NON-NLS-0$
+											'\t\t}\n' + //$NON-NLS-0$
+									'\t};\n' +  //$NON-NLS-0$
+									'\tvar serviceProperties = {\n' +  //$NON-NLS-0$
+										'\t\tname: "Reverse Text",\n' + //$NON-NLS-0$
+										'\t\tkey: ["e", true, true] // Ctrl+Shift+e\n' + //$NON-NLS-0$
+									'\t};\n' + //$NON-NLS-0$
+									'\tprovider.registerService("orion.edit.command", serviceImpl, serviceProperties);\n' + //$NON-NLS-0$
+									'\tprovider.connect();\n' + //$NON-NLS-0$
+								'};'; //$NON-NLS-0$
+			return filecontent;
+		},
+		
+		createPlugin: function( item ){
+			
+			for( var s = 0; s < this.sectionList.length; s++ ){
+				var d = this.sectionList[s].getData();	
+				
+				if( d.id === "Plugin Description Section" ){ //$NON-NLS-0$
+				
+					this.pluginAuthor = d.author;
+					this.pluginName = d.name;
+					this.pluginDescription = d.description;
+					this.pluginLicence = d.licence;
+					
+					this.createNewFolder( this.pluginName );
+				}
+			}
+		},
+        
+		addCreationCommand: function(){
+		
+		},
+		
+		resize: function( size ){
+			var mb = dojo.marginBox ( this.scontent );	
+			dojo.style( this.scontent, 'width', mb.w + 'px' ); //$NON-NLS-1$ //$NON-NLS-0$
+			dojo.style( this.domNode.parentNode, 'overflow', 'auto' ); //$NON-NLS-1$ //$NON-NLS-0$
+		}
+	
+	});
+});
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/ScrollingContainer.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/ScrollingContainer.js
new file mode 100644
index 0000000..afc5661
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/ScrollingContainer.js
@@ -0,0 +1,217 @@
+/*******************************************************************************

+ * @license

+ * Copyright (c) 2012 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials are made 

+ * available under the terms of the Eclipse Public License v1.0 

+ * (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution 

+ * License v1.0 (http://www.eclipse.org/org/documents/edl-v10.html). 

+ * 

+ * Contributors: Anton McConville - IBM Corporation - initial API and implementation

+ ******************************************************************************/

+/*global dojo dijit widgets orion  window console define localStorage*/

+/*jslint browser:true*/

+

+/* This SettingsContainer widget is a dojo border container with a left and right side. The left is for choosing a 

+   category, the right shows the resulting HTML for that category. */

+

+define(['require', 'dojo', 'dijit', 'orion/fileClient','dijit/TooltipDialog', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', 'orion/widgets/plugin/PluginList', 'orion/widgets/settings/InputBuilder'], function(require, dojo, dijit, mFileClient) {

+

+	dojo.declare("orion.widgets.maker.ScrollingContainer", [dijit._Widget, dijit._Templated], { //$NON-NLS-0$

+	

+		templateString:	'<div>' +  //$NON-NLS-0$

+							'<div data-dojo-attach-point="scontent" class="scrollcontent">' +  //$NON-NLS-0$

+								'<div data-dojo-attach-point="sections" style="padding-bottom:200px;"></div>' + //$NON-NLS-0$

+							'</div>' +  //$NON-NLS-0$

+						'</div>', //$NON-NLS-0$

+						

+		scrolling: false,	

+		offset: null,

+		travel: null,

+		selectedNode: null,

+		sectionCount: 0,

+		lastScroll: 0,

+		sectionList: null,

+		

+		postCreate: function(){

+			

+			var bar = dojo.byId( 'pageToolbar' );	 //$NON-NLS-0$

+			dojo.style( bar, 'borderBottom', '2px solid whitesmoke' ); //$NON-NLS-1$ //$NON-NLS-0$

+			

+			var actions = dojo.byId( 'pageActions' ); //$NON-NLS-0$

+			

+			this.sectionNavigation = dojo.create( 'div', null, actions ); //$NON-NLS-0$

+		

+			this.sectionList = [];

+			

+			this.fileClient = new mFileClient.FileClient(this.serviceRegistry);	

+			

+			dojo.style( this.domNode.parentNode, 'background', 'white' ); //$NON-NLS-1$ //$NON-NLS-0$

+		},

+		

+		

+		addCommand: function( name, command ){

+		

+			var id = "orion.add" + name; //$NON-NLS-0$

+			var tooltip = name;

+		

+			var createPluginCommand = new mCommands.Command({

+				name: name,

+				tooltip: tooltip,

+				id: id,

+				anchor: name,

+				callback: dojo.hitch( this, command )

+			

+			});

+			

+			this.commandService.addCommand(createPluginCommand);

+			this.commandService.registerCommandContribution(this.toolbarID, id, 2);

+			this.commandService.renderCommands(this.toolbarID, this.toolbarID, this, this, "button"); //$NON-NLS-0$

+			

+			var nodes = dojo.query(".commandButton"); //$NON-NLS-0$

+			

+			for( var n = 0; n < nodes.length; n++ ){

+				nodes[n].style.padding = '3px'; //$NON-NLS-0$

+			}

+			

+		},

+

+        complete: function(name){

+			window.location.hash = name;

+			this.scrolling = false;

+        },

+        

+        rate: function(score){

+

+			var rate = Math.max(Math.abs(Math.round(score/ 3)), 1200);

+			return rate;

+        },

+        

+        fourthRoot: function(n){

+			return n*n*n*n;

+        },

+        

+        roll: function(name, time){

+        

+            var ease = ( new Date().getTime() ) - time;

+            var decrement = 2;      

+            var constant = 0.5;

+            

+            if( ease >= this.value ){

+            

+                window.clearInterval( this.interval );

+                this.complete( name );

+                

+            }else{

+            

+				var rate = ease / this.value;

+                ease = decrement * rate;

+                

+                if( ease < 1 ){

+					ease = constant * this.fourthRoot(ease);

+                }else{

+					ease -= decrement;

+                    ease = -constant * ( this.fourthRoot(ease) - decrement );

+                }

+                

+                this.lastScroll = this.offset + this.travel * ease;

+                

+                console.log( 'POINT: ' + this.lastScroll ); //$NON-NLS-0$

+                

+				dojo.byId( 'centerPane' ).scrollTop = this.lastScroll; //$NON-NLS-0$

+            }

+        },

+        

+        smooth: function( name ){

+			var date = new Date().getTime();   

+			this.interval = window.setInterval( dojo.hitch( this, 'roll', name, date ), 15 ); //$NON-NLS-0$

+        },

+		

+		adjust: function( node ){

+			dojo.removeClass( this.selectedNode, 'smiSelected' ); //$NON-NLS-0$

+			this.selectedNode = node;

+			dojo.addClass( this.selectedNode, 'smiSelected' ); //$NON-NLS-0$

+        },

+		

+		position: function(element){	

+			var coordinate = { x: 0, y: 0 };		

+			if( element !== null ){

+                coordinate.x += element.offsetLeft;

+				coordinate.y += element.offsetTop;

+                element = element.offsetParent;

+            }

+            return coordinate;

+		},

+						

+		scrollTo: function(event){

+			

+			this.scrolling = true;

+			

+			try{

+				var targetName = event.currentTarget.href.split("#")[1]; //$NON-NLS-0$

+				var targetNode = dojo.byId( targetName );

+				this.offset = this.lastScroll;

+				this.travel = this.position( targetNode ).y - this.offset;

+				this.value = this.rate( this.travel );

+				this.smooth( targetName );

+				this.adjust( event.currentTarget );			

+			}catch(e){

+				console.error(e);

+				return true;

+			}

+		},

+		

+		createMenuItem: function( name, count ){

+		

+			var content = { 'class':'scrollmenuitem',  //$NON-NLS-1$ //$NON-NLS-0$

+							'href': '#' + name,  //$NON-NLS-1$ //$NON-NLS-0$

+							'data-dojo-attach-point':name,  //$NON-NLS-0$

+							'onclick': dojo.hitch( this, 'scrollTo' ) //$NON-NLS-1$ //$NON-NLS-0$

+			};

+			content.textContent = name;

+			

+			var menuItem = dojo.create( 'a', content ); //$NON-NLS-0$

+			

+			if( !this.selectedNode ){

+				this.selectedNode = menuItem;			

+				dojo.addClass( this.selectedNode, 'smiSelected' ); //$NON-NLS-0$

+			}

+			

+			var listItem = dojo.create( 'li' ); //$NON-NLS-0$

+			

+			listItem.appendChild( menuItem );

+			

+			var counter = dojo.create( 'div', { 'class':'itemcount' }, listItem ); //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$

+			counter.textContent = count;

+			

+			var actions = dojo.byId( 'pageActions' ); //$NON-NLS-0$

+		

+			dojo.byId( this.toolbarID ).appendChild( listItem );

+			

+			return menuItem;

+		},

+		

+		/* This will need a ScrolingContainerSection object */

+		

+		addSection: function(section){

+			this.sectionList.push(section);

+			this.sectionCount = this.sectionCount +1;

+			section.setOrder( this.sectionCount );

+			var menuItem = this.createMenuItem( section.title, this.sectionCount );

+			this.sections.appendChild( section.domNode );

+			section.startup();

+			

+			return menuItem;

+		},

+		

+		addCreationCommand: function(){

+		

+		},

+		

+		resize: function( size ){

+			var mb = dojo.marginBox ( this.scontent );	

+			dojo.style( this.scontent, 'width', mb.w + 'px' ); //$NON-NLS-1$ //$NON-NLS-0$

+			dojo.style( this.domNode.parentNode, 'overflow', 'auto' ); //$NON-NLS-1$ //$NON-NLS-0$

+		}

+	

+	});

+});
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/ScrollingContainerSection.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/ScrollingContainerSection.js
new file mode 100644
index 0000000..52080d9
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/maker/ScrollingContainerSection.js
@@ -0,0 +1,63 @@
+/*******************************************************************************

+ * @license

+ * Copyright (c) 2012 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials are made 

+ * available under the terms of the Eclipse Public License v1.0 

+ * (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution 

+ * License v1.0 (http://www.eclipse.org/org/documents/edl-v10.html). 

+ * 

+ * Contributors: Anton McConville - IBM Corporation - initial API and implementation

+ ******************************************************************************/

+/*global dojo dijit widgets orion  window console define localStorage*/

+/*jslint browser:true*/

+

+/* This SettingsContainer widget is a dojo border container with a left and right side. The left is for choosing a 

+   category, the right shows the resulting HTML for that category. */

+

+define(['require', 'dojo', 'dijit','dijit/TooltipDialog', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', 'orion/widgets/plugin/PluginList', 'orion/widgets/settings/InputBuilder'], function(require, dojo, dijit) {

+

+	dojo.declare("orion.widgets.maker.ScrollingContainerSection", [dijit._Widget, dijit._Templated], { //$NON-NLS-0$

+	

+		templateString:	'<div>' + //$NON-NLS-0$

+							'<a class="anchor" data-dojo-attach-point="anchor" id="section" name="section"></a>' + //$NON-NLS-0$

+							'<div data-dojo-attach-point="section" class="sectionBlock">' +  //$NON-NLS-0$

+								'<div data-dojo-attach-point="contentArea" class="inner">' +  //$NON-NLS-0$

+								'</div>' + //$NON-NLS-0$

+							'</div>' +				 //$NON-NLS-0$

+							'<div data-dojo-attach-point="sectionTitle" class="pluginTitle"></div>' +  //$NON-NLS-0$

+							'<div data-dojo-attach-point="orderCircle" class="circle">1</div>' +  //$NON-NLS-0$

+						'</div>', //$NON-NLS-0$

+						

+		content: "<div></div>", //$NON-NLS-0$

+						

+		order: 1,

+		

+		postCreate: function(){

+			this.sectionID = this.title + ' Section'; //$NON-NLS-0$

+			this.selectedNode = this.home;

+			this.anchor.id = this.title;

+			this.anchor.name = this.title;

+			this.sectionTitle.textContent = this.title;

+		},

+		

+		startup: function(){

+			var mb = dojo.position( this.domNode );

+			var parentmb = dojo.position( this.domNode.parentNode );

+			this.sectionTitle.style.top = mb.y - parentmb.y - 18 + 'px'; //$NON-NLS-0$

+			this.orderCircle.style.top =  mb.y - parentmb.y + 30 + 'px'; //$NON-NLS-0$

+			dojo.place( this.content, this.contentArea );

+		},

+		

+		setOrder: function( order ){

+			this.order = order;

+			this.orderCircle.textContent = this.order;

+		},

+		

+		getData: function(){

+			var data = [];

+			data.id = this.sectionID;

+			return data;

+		}

+	

+	});

+});
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/settings/maker.html b/bundles/org.eclipse.orion.client.ui/web/settings/maker.html
new file mode 100644
index 0000000..ae9c11c
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/settings/maker.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>

+<html>

+	<head>

+		<meta charset="UTF-8">

+		<title>Plugin Maker</title>

+		<link rel="stylesheet" type="text/css" href="scroll.css"/>

+		<script src="../requirejs/require.js"></script>

+		<script type="text/javascript">

+			/*global require*/

+			require({ baseUrl: '..',

+				      packages: [{ name: 'dojo', location: 'org.dojotoolkit/dojo', main: 'lib/main-browser', lib: '.' },

+								{ name: 'dijit', location: 'org.dojotoolkit/dijit', main: 'lib/main',lib: '.' },

+								{ name: 'dojox', location: 'org.dojotoolkit/dojox', main: 'lib/main', lib: '.' } ],

+				      paths: { text: 'requirejs/text', i18n: 'requirejs/i18n', domReady: 'requirejs/domReady' } 

+			});

+			require(["maker.js"]);

+		</script>

+	</head>

+	<body style="visibility:hidden;" class="claro">

+		<div id="orion.maker" class="orionPage" dojotype="dijit.layout.BorderContainer" style="height:100%;width:100%" design="headline" gutters="false">

+			<div class="banner" id="banner" dojotype="dijit.layout.ContentPane" region="top"></div>

+			<div id="centerPane" dojotype="dijit.layout.ContentPane" region="center">

+				<div id="selectionAgent"></div>

+			</div>

+			<div class="footer" id="footer" dojotype="dijit.layout.ContentPane" region="bottom" splitter="false"></div>

+		</div>

+	</body>

+</html>

diff --git a/bundles/org.eclipse.orion.client.ui/web/settings/maker.js b/bundles/org.eclipse.orion.client.ui/web/settings/maker.js
new file mode 100644
index 0000000..a4a600a
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/settings/maker.js
@@ -0,0 +1,73 @@
+/*******************************************************************************

+ * @license

+ * Copyright (c) 2011, 2012 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials are made 

+ * available under the terms of the Eclipse Public License v1.0 

+ * (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution 

+ * License v1.0 (http://www.eclipse.org/org/documents/edl-v10.html). 

+ *

+ * Contributors:

+ *     Anton McConville (IBM Corporation) - initial API and implementation

+ *

+ *******************************************************************************/

+/*global define dojo dijit orion window widgets localStorage*/

+/*jslint browser:true devel:true*/

+

+define(['i18n!orion/settings/nls/messages', 'require', 'dojo', 'orion/bootstrap', 'orion/status', 'orion/commands', 'orion/operationsClient',

+		'orion/fileClient', 'orion/searchClient', 'orion/dialogs', 'orion/globalCommands', 'orion/sites/siteClient',

+		'dojo/parser', 'dojo/hash', 'dojo/date/locale', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane',

+		'orion/widgets/maker/PluginMakerContainer', 'orion/widgets/maker/ScrollingContainerSection',

+		'orion/widgets/maker/PluginDescriptionSection', 'orion/widgets/maker/PluginCompletionSection', 'dijit/form/Button',

+		'dijit/ColorPalette'],

+		function(messages, require, dojo, mBootstrap, mStatus, mCommands, mOperationsClient, mFileClient, mSearchClient,

+			mDialogs, mGlobalCommands) {

+

+	dojo.addOnLoad(function() {

+		mBootstrap.startup().then(function(core) {

+

+			var serviceRegistry = core.serviceRegistry;

+			var preferences = core.preferences;

+

+			document.body.style.visibility = "visible"; //$NON-NLS-0$

+			dojo.parser.parse();

+

+			// Register services

+			var operationsClient = new mOperationsClient.OperationsClient(serviceRegistry);

+			var preferencesStatusService = new mStatus.StatusReportingService(serviceRegistry, operationsClient, "statusPane", "notifications", "notificationArea"); //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$

+			var commandService = new mCommands.CommandService({

+				serviceRegistry: serviceRegistry

+			});

+

+			var fileClient = new mFileClient.FileClient(serviceRegistry);

+			var searcher = new mSearchClient.Searcher({

+				serviceRegistry: serviceRegistry,

+				commandService: commandService,

+				fileService: fileClient

+			});

+

+			var preferenceDialogService = new mDialogs.DialogService(serviceRegistry);

+			mGlobalCommands.generateBanner("banner", serviceRegistry, commandService, preferences, searcher); //$NON-NLS-0$

+

+			preferencesStatusService.setMessage("Loading..."); //$NON-NLS-0$

+			

+			/* Note 'pageActions' is the attach id for commands in the toolbar */

+			

+			var containerParameters = { preferences: preferences, 

+										serviceRegistry: core.serviceRegistry,

+										preferencesStatusService: preferencesStatusService,

+										commandService: commandService,

+										preferenceDialogService: preferenceDialogService,

+										settingsCore: core,

+										toolbarID: "pageActions" }; //$NON-NLS-0$

+

+			var container = new orion.widgets.maker.PluginMakerContainer( containerParameters, dojo.byId( "selectionAgent" )); //$NON-NLS-0$

+			

+			var description = orion.widgets.maker.PluginDescriptionSection({title:messages["Plugin Description"]});

+			container.addSection( description );

+			

+			container.addCommand( messages['Create'], 'createPlugin' ); //$NON-NLS-1$

+

+			preferencesStatusService.setMessage("");

+		});

+	});

+});
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/settings/orion-transparent.png b/bundles/org.eclipse.orion.client.ui/web/settings/orion-transparent.png
new file mode 100644
index 0000000..563010e
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/settings/orion-transparent.png
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.ui/web/settings/scroll.css b/bundles/org.eclipse.orion.client.ui/web/settings/scroll.css
new file mode 100644
index 0000000..5a015bd
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/settings/scroll.css
@@ -0,0 +1,274 @@
+@import "../css/layout.css";

+@import "../css/ide.css";

+@import "../css/images.css";

+

+html,body {

+	height: 100%;

+}

+

+h1 {

+	position: relative;

+	margin-top: 18px

+}

+

+

+.scrollcontent {

+	position: relative;

+}

+

+.scrollmenubar{

+	width: 1010px;

+	height:40px;

+	border-top:solid 2px whitesmoke;

+	border-bottom: solid 2px whitesmoke ;

+	position: fixed;

+	z-index: 999;

+	clear: both;

+	overflow: hidden;

+	background: white;

+}

+

+.scrollmenu {

+	list-style: none;

+	margin: 0;

+	padding: 0;

+	padding-left:20px;

+	position: absolute;

+	left: 0;

+}

+

+.scrollmenubar ul {

+	display: block;

+	text-decoration: none;

+}

+

+.scrollmenu li {

+	list-style:none;

+	float: left;

+	margin: 0 1em 0 0;

+	padding: .3em;

+	text-decoration: none;

+	background:white;

+}

+

+.scrollmenuitem{

+	color: #999;

+	padding: .4em;

+	margin-top:1px;

+	text-decoration: none;

+	font-family: sans-serif;

+	font-size: 12px;

+	border-bottom-left-radius: 4px 4px;

+	border-bottom-right-radius: 4px 4px;

+	border-top-left-radius: 4px 4px;

+	border-top-right-radius: 4px 4px;

+	line-height:2em;

+}

+

+

+.scrollmenuitem:hover{

+	background: #E3E3E3;

+	text-decoration: none;

+	color: #999;

+}

+

+.smiSelected{

+	border: 1px dotted #BFBFBF;

+	

+	color: white;

+}

+

+.scrollmenuitem:visited{

+	background: #E3E3E3;

+	color: #999;

+}

+

+.anchor {

+	display: block;

+	height: 0;

+	border: none !important;

+	text-decoration: none !important;

+}

+

+.chapter {

+	position: relative;

+	clear: both;

+	overflow: hidden;

+}

+

+.sectionBlock{

+	border-bottom-left-radius: 20px 20px;

+	border-bottom-right-radius: 20px 20px;

+	border-top-left-radius: 20px 20px;

+	border-top-right-radius: 20px 20px;

+	padding:40px;

+	margin-top:50px;

+	margin-right:50px;

+	margin-left:50px;

+	position: relative;

+	clear: both;

+	overflow: hidden;

+	border: 1px dotted #BFBFBF;

+}

+

+.inner{

+	background: whitesmoke;

+	padding:10px;

+	border-bottom-left-radius: 20px 20px;

+	border-bottom-right-radius: 20px 20px;

+	border-top-left-radius: 20px 20px;

+	border-top-right-radius: 20px 20px;

+}

+

+.circle{

+	width:40px;

+	height:40px;

+	display:block;

+	border-radius:20px;

+	font-size:20px;

+	font-family:sans-serif;

+	font-weight:bolder;

+	color:#fff;

+	line-height:40px;

+	text-align:center;

+	background:#ffd401;

+	position:absolute;

+	margin-left:30px;

+	float:right;

+}

+

+.pluginTitle {

+	position:absolute;

+	float: right;

+	font-size: 1em;

+	font-weight: bold;

+	color: #666;

+	margin: 0;

+	background: white;

+	padding:10px;

+	margin-left:80px;

+}

+

+.scrollForm{

+	margin: 1em 0;

+	padding-top: 10px;

+	font-size:10px;

+}

+

+.scrollForm fieldset {

+	margin: 0;

+	padding-top: .5em;

+	border: none;

+}

+

+.scrollForm p {

+	clear: both;

+	margin: .5em 0;

+	overflow: hidden;

+}

+

+.scrollForm input {

+	font-size:10px;

+	font-family: sans-serif;

+	width: 500px;

+}

+

+.scrollForm textarea {

+	font-size:10px;

+	font-family: sans-serif;

+	width: 500px;

+	resize: none; 

+}

+

+.scrollForm label {

+	float: left;

+	width: 100px;

+	display: block;

+	text-align: right;

+	margin-right: 10px;

+}

+

+.itemcount{

+	width:14px;

+	height:14px;

+	display:block;

+	border-radius:7px;

+	font-size:9px;

+	font-family:sans-serif;

+	font-weight:bolder;

+	color:#fff;

+	line-height:14px;

+	text-align:center;

+	background:#ffd401;

+	position:absolute;

+	float:right;

+	margin-top:-9px;

+	margin-left:-6px;

+}

+

+.steps{

+	margin:20px;

+	margin-top:0;

+	font-size: 14px;

+	font-family: sans-serif;

+	font-weight: bolder;

+	color: #999;

+	text-align:center;

+	vertical-align:middle;

+}

+

+.nextstep{

+	float: left;

+	width: 100px;

+	height: 50px;

+	margin:10px;

+	padding:20px;

+	border-radius:7px;

+	background: white;

+	border: 1px solid #BBBBBB;

+}

+

+.or{

+	float: left;

+	width: 20px;

+	height: 50px;

+	margin:10px;

+	padding:20px;

+}

+

+.downloadbutton {

+background-color: #91BD09;

+text-align: center;

+width: 150px;

+}

+

+.nextlink{

+	-moz-border-radius: 5px 5px 5px 5px;

+	-webkit-border-radius: 5px 5px 5px 5px;

+	border-radius: 5px 5px 5px 5px;

+	-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);

+	-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);

+	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);

+	background: url("images/overlay-button.png") repeat-x scroll 0 0 #222;

+	border-bottom: 1px solid rgba(0, 0, 0, 0.25);

+	color: white !important;

+	cursor: pointer;

+	font-weight: bold;

+	line-height: 1;

+	overflow: visible;

+	font-size: 17px;

+	padding: 8px 19px 9px;

+	position: relative;

+	text-decoration: none;

+	text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.25);

+	width: auto;

+	margin:10px;

+}

+

+.nextlink:hover {

+-moz-box-shadow: 0 1px 11px rgba(0, 0, 0, 0.45);

+-webkit-box-shadow: 0 1px 11px rgba(0, 0, 0, 0.45);

+box-shadow: 0 1px 11px rgba(0, 0, 0, 0.45);

+}

+

+