Jelajahi Sumber

Merge branch 'master' into bgfx

Conflicts:
	makefile
Daniele Bartolini 11 tahun lalu
induk
melakukan
58a83a5610

+ 3 - 3
engine/Config.h

@@ -75,10 +75,10 @@ OTHER DEALINGS IN THE SOFTWARE.
 // http://msdn.microsoft.com/en-us/library/6sehtctf.aspx
 	#if !defined(WINVER) && !defined(_WIN32_WINNT)
 // Windows Server 2003 with SP1, Windows XP with SP2 and above
-		#define WINVER 0x0502
-		#define _WIN32_WINNT 0x0502
+		#define WINVER 0x0600
+		#define _WIN32_WINNT 0x0600
 	#endif // !defined(WINVER) && !defined(_WIN32_WINNT)
-	#define CROWN_PLATFORM_WINDOWS _WIN32_WINNT
+	#define CROWN_PLATFORM_WINDOWS 1
 #elif defined(__ANDROID__)
 // Android compiler defines __linux__
 	#undef CROWN_PLATFORM_ANDROID

+ 6 - 6
engine/Device.h

@@ -36,19 +36,19 @@ OTHER DEALINGS IN THE SOFTWARE.
 namespace crown
 {
 
-class Accelerometer;
+struct Accelerometer;
 class Bundle;
 class BundleCompiler;
 class ConsoleServer;
 class Filesystem;
-class Keyboard;
+struct Keyboard;
 class LuaEnvironment;
-class Mouse;
+struct Mouse;
 class OsWindow;
 class Renderer;
 class ResourceManager;
-class ResourcePackage;
-class Touch;
+struct ResourcePackage;
+struct Touch;
 class World;
 class WorldManager;
 struct Camera;
@@ -69,7 +69,7 @@ struct DisplayMode
 /// the engine subsystems and related stuff.
 ///
 /// @ingroup Device
-class CE_EXPORT Device
+class Device
 {
 public:
 

+ 1 - 1
engine/core/filesystem/DiskFilesystem.h

@@ -40,7 +40,7 @@ namespace crown
 /// but platform-specific and thus generally not recommended.
 ///
 /// @ingroup Filesystem
-class CE_EXPORT  DiskFilesystem : public Filesystem
+class DiskFilesystem : public Filesystem
 {
 public:
 

+ 1 - 1
engine/core/mem/ProxyAllocator.h

@@ -37,7 +37,7 @@ namespace crown
 /// so that it is possible to later visit that list for debugging purposes.
 ///
 /// @ingroup Memory
-class CE_EXPORT ProxyAllocator : public Allocator
+class ProxyAllocator : public Allocator
 {
 public:
 

+ 1 - 1
engine/input/Mouse.h

@@ -51,7 +51,7 @@ struct MouseButton
 /// Interface for accessing mouse input device.
 ///
 /// @ingroup Input
-class Mouse
+struct Mouse
 {
 public:
 

+ 1 - 1
engine/input/Touch.h

@@ -40,7 +40,7 @@ const uint32_t MAX_POINTER_IDS = 4;
 /// Interface for accessing mouse input device.
 ///
 /// @ingroup Input
-class Touch
+struct Touch
 {
 public:
 

+ 1 - 1
engine/lua/LuaStack.h

@@ -136,7 +136,7 @@ public:
 	//-----------------------------------------------------------------------------
 	bool is_number(int32_t index)
 	{
-		return lua_isnumber(m_L, index);
+		return (bool) lua_isnumber(m_L, index);
 	}
 
 	/// Wraps lua_type.

+ 1 - 4
engine/os/OS.h

@@ -26,12 +26,11 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #pragma once
 
-#include <cstdarg>
-
 #include "Config.h"
 #include "Types.h"
 #include "Vector.h"
 #include "DynamicString.h"
+#include <cstdarg>
 
 namespace crown
 {
@@ -47,8 +46,6 @@ namespace crown
 #elif CROWN_PLATFORM_ANDROID
 	const size_t	MAX_PATH_LENGTH = 1024;
 	const char		PATH_SEPARATOR = '/';
-#else
-	#error "Oops, invalid platform!"
 #endif
 
 namespace os

+ 2 - 0
engine/os/win/Cond.h

@@ -27,6 +27,8 @@ OTHER DEALINGS IN THE SOFTWARE.
 #pragma once
 
 #include "WinHeaders.h"
+#include <WinBase.h>
+#include <Synchapi.h>
 #include "Types.h"
 #include "Mutex.h"
 #include "OS.h"

+ 2 - 2
engine/os/win/OsSocket.h

@@ -290,7 +290,7 @@ public:
 
 public:
 
-	int m_socket;
+	SOCKET m_socket;
 };
 
 class TCPServer
@@ -543,7 +543,7 @@ public:
 
 public:
 
-	int m_socket;
+	SOCKET m_socket;
 };
 
 } // namespace crown

+ 2 - 2
engine/os/win/WinHeaders.h

@@ -27,10 +27,10 @@ OTHER DEALINGS IN THE SOFTWARE.
 #pragma once
 
 #ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
+	#define WIN32_LEAN_AND_MEAN
 #endif
 
-#include "Windows.h"
+#include "windows.h"
 
 #undef NEAR
 #undef FAR

+ 1 - 1
engine/os/win/main.cpp

@@ -117,7 +117,7 @@ static KeyboardButton::Enum win_translate_key(int32_t winKey)
 }
 
 //-----------------------------------------------------------------------------
-class CE_EXPORT WindowsDevice : public Device
+class WindowsDevice : public Device
 {
 public:
 

+ 1 - 1
engine/physics/Actor.cpp

@@ -180,7 +180,7 @@ void Actor::create_objects()
 
 				PxDefaultMemoryOutputStream buf;
 				if(!m_world.physx_cooking()->cookConvexMesh(convex_mesh_desc, buf))
-					CE_FATAL();
+					CE_FATAL("");
 				PxDefaultMemoryInputData input(buf.getData(), buf.getSize());
 				PxConvexMesh* convex_mesh = physics->createConvexMesh(input);
 

+ 1 - 1
engine/physics/Controller.h

@@ -41,7 +41,7 @@ namespace crown
 
 struct PhysicsResource;
 struct Vector3;
-class SceneGraph;
+struct SceneGraph;
 class PhysicsControllerCallback;
 
 ///

+ 1 - 1
engine/physics/Joint.h

@@ -42,7 +42,7 @@ namespace crown
 {
 
 struct PhysicsResource;
-class Actor;
+struct Actor;
 
 ///
 /// @ingroup Physics

+ 1 - 1
engine/physics/PhysicsWorld.h

@@ -71,7 +71,7 @@ namespace physics_system
 } // namespace physics_system
 
 //-----------------------------------------------------------------------------
-class SceneGraph;
+struct SceneGraph;
 class World;
 struct PhysicsResource;
 struct PhysicsConfigResource;

+ 1 - 1
engine/renderers/Mesh.h

@@ -31,7 +31,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 namespace crown
 {
 
-class SceneGraph;
+struct SceneGraph;
 struct MeshResource;
 struct Quaternion;
 struct Unit;

+ 1 - 1
engine/renderers/Sprite.h

@@ -38,7 +38,7 @@ namespace crown
 
 class Renderer;
 class RenderWorld;
-class SceneGraph;
+struct SceneGraph;
 struct Unit;
 
 //-----------------------------------------------------------------------------

+ 1 - 1
engine/resource/ResourceManager.h

@@ -120,7 +120,7 @@ private:
 
 private:
 
-	friend class ResourcePackage;
+	friend struct ResourcePackage;
 	friend class Device;
 };
 

+ 1 - 1
engine/resource/ResourcePackage.h

@@ -36,7 +36,7 @@ namespace crown
 {
 
 /// Collection of resources to load in a batch.
-class ResourcePackage
+struct ResourcePackage
 {
 public:
 

+ 1 - 1
engine/world/Camera.h

@@ -44,7 +44,7 @@ struct ProjectionType
 
 struct Quaternion;
 struct Unit;
-class SceneGraph;
+struct SceneGraph;
 
 /// Represents the point of view into the game world.
 ///

+ 1 - 1
engine/world/SceneGraphManager.h

@@ -31,7 +31,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 namespace crown
 {
 
-class SceneGraph;
+struct SceneGraph;
 
 /// Manages a collection of scene graphs.
 ///

+ 25 - 3
makefile

@@ -11,6 +11,10 @@ luajit-linux32:
 	make -R -C third/luajit CC="gcc -m32"
 luajit-linux64:
 	make -R -C third/luajit
+luajit-windows32:
+	cd third/luajit/src && msvcbuild
+luajit-windows64:
+	cd third/luajit/src && msvcbuild
 luajit-arm:
 	make -R -C third/luajit HOST_CC="gcc -m32" \
 	CROSS=$(ANDROID_NDK_ARM)/bin/arm-linux-androideabi- \
@@ -60,11 +64,21 @@ android-release: deps-android-arm android-build
 	make -R -C .build/android config=release
 android: android-debug android-development android-release
 
-
 windows-build:
 	$(PREMAKE) --file=premake\premake4.lua vs2008
+windows-debug32: windows-build
+	devenv .build/windows/crown.sln /Build "debug|x32"
+windows-development32: windows-build
+	devenv .build/windows/crown.sln /Build "development|x32"
+windows-release32: windows-build
+	devenv .build/windows/crown.sln /Build "release|x32"
 windows-debug64: windows-build
-	devenv .build/windows/crown.sln /Build "Debug|x64"
+	devenv .build/windows/crown.sln /Build "debug|x64"
+windows-development64: windows-build
+	devenv .build/windows/crown.sln /Build "development|x64"
+windows-release64: windows-build
+	devenv .build/windows/crown.sln /Build "release|x64"
+
 # docs:
 # 	doxygen premake/crown.doxygen
 # 	# markdown README.md > .build/docs/readme.html
@@ -72,4 +86,12 @@ windows-debug64: windows-build
 clean: deps-clean
 	@echo Cleaning...
 	@rm -rf .build
-	@rm -rf .installation
+	@rm -rf .installation
+
+
+starter:	
+	xbuild /p:OutputPath=$(CROWN_INSTALL_DIR)/tools tools/gui/starter/starter.sln
+console:
+	xbuild /p:OutputPath=$(CROWN_INSTALL_DIR)/tools tools/gui/console/console.sln
+tools: starter console
+

+ 24 - 52
premake/premake4.lua

@@ -47,7 +47,6 @@ newoption
 CROWN_SOURCE_DIR = path.getabsolute("..") .. "/"
 CROWN_THIRD_DIR = CROWN_SOURCE_DIR .. "third/"
 CROWN_BUILD_DIR = CROWN_SOURCE_DIR .. ".build/"
-
 CROWN_INSTALL_DIR = os.getenv("CROWN_INSTALL_DIR")
 if not CROWN_INSTALL_DIR then
 	if not path.isabsolute(CROWN_INSTALL_DIR) then
@@ -61,7 +60,7 @@ CROWN_INSTALL_DIR = CROWN_INSTALL_DIR .. "/" -- Add slash to end string
 -- Solution
 solution "crown"
 	configurations { "debug", "development", "release" }
-	platforms { "native", "x32", "x64" }
+	platforms { "x32", "x64", "native" }
 
 	-- Avoid error invoking premake4 --help
 	if _ACTION == nil then return end
@@ -92,7 +91,6 @@ solution "crown"
 	if _ACTION == "vs2010" or _ACTION == "vs2008" then
 
 		if not os.is("windows") then print("Action not valid in current OS.") end
-		if not os.getenv("DXSDK_DIR") then print("Environment variable DXSDK_DIR must be set.") end
 		location(CROWN_BUILD_DIR .. "windows")
 
 	end
@@ -579,7 +577,6 @@ solution "crown"
 				") -Wl,--end-group"
 			}
 
-		-- it's necessary to define DXSDK_DIR env variable to DirectX sdk directory
 		configuration { "vs*" }
 			kind "ConsoleApp"
 
@@ -613,15 +610,12 @@ solution "crown"
 				"lua51",
 				"OpenAL32"
 			}
+
 			includedirs {
 				CROWN_SOURCE_DIR .. "/engine/os/win",
 				CROWN_SOURCE_DIR .. "/engine/renderers/backend/gl/wgl"
 			}
 
-			libdirs {
-				CROWN_THIRD_DIR .. "openal/lib"
-			}
-
 			excludes {
 				CROWN_SOURCE_DIR .. "engine/os/android/*",
 				CROWN_SOURCE_DIR .. "engine/os/linux/*",
@@ -631,39 +625,9 @@ solution "crown"
 				CROWN_SOURCE_DIR .. "engine/audio/backend/SLESSoundWorld.cpp"
 			}
 
-		configuration { "vs2010" }
-			linkoptions { 
-				"/DELAYLOAD:\"libEGL.dll\"", -- this is needed only for testing with GLES2/3 on Windows with VS201x
-				"/DELAYLOAD:\"libGLESv2.dll\""
-			}
-
-		configuration { "vs*", "debug" }
-			links {
-				"PhysX3ExtensionsCHECKED",
-				"PhysXProfileSDKCHECKED",
-				"PhysXVisualDebuggerSDKCHECKED",
-				"PxTaskCHECKED"
-			}
-
-		configuration { "vs*", "development" }
-			links {
-				"PhysX3ExtensionsPROFILE",
-				"PhysXProfileSDKPROFILE",
-				"PhysXVisualDebuggerSDKPROFILE",
-				"PxTaskPROFILE"
-			}
-
-		configuration { "vs*", "release" }
-			links {
-				"PhysX3Extensions",
-				"PhysXProfileSDK",
-				"PhysXVisualDebuggerSDK",
-				"PxTask",
-			}
-
 		configuration { "x32", "vs*" }
 			includedirs {
-				CROWN_THIRD_DIR .. "luajit/win32/include/luajit-2.0",
+				CROWN_THIRD_DIR .. "luajit/src",
 				CROWN_THIRD_DIR .. "physx/win32/include",
 				CROWN_THIRD_DIR .. "physx/win32/include/common",
 				CROWN_THIRD_DIR .. "physx/win32/include/characterkinematic",
@@ -689,15 +653,16 @@ solution "crown"
 			}
 
 			libdirs {
-				CROWN_THIRD_DIR .. "luajit/win32/lib",
-				CROWN_THIRD_DIR .. "physx/win32/lib"
+				CROWN_THIRD_DIR .. "luajit/src",
+				CROWN_THIRD_DIR .. "physx/win32/lib",
+				CROWN_THIRD_DIR .. "openal/lib"
 			}
 
 		configuration { "x64", "vs*" }
 			defines { "_WIN64" }
 
 			includedirs {
-				CROWN_THIRD_DIR .. "luajit/win64/include/luajit-2.0",
+				CROWN_THIRD_DIR .. "luajit/src",
 				CROWN_THIRD_DIR .. "physx/win64/include",
 				CROWN_THIRD_DIR .. "physx/win64/include/common",
 				CROWN_THIRD_DIR .. "physx/win64/include/characterkinematic",
@@ -723,8 +688,9 @@ solution "crown"
 			}
 
 			libdirs {
-				CROWN_THIRD_DIR .. "luajit/win64/lib",
-				CROWN_THIRD_DIR .. "physx/win64/lib"
+				CROWN_THIRD_DIR .. "luajit/src",
+				CROWN_THIRD_DIR .. "physx/win64/lib",
+				CROWN_THIRD_DIR .. "openal/lib"
 			}
 
 		configuration { "debug", "x32", "vs*"}
@@ -732,7 +698,8 @@ solution "crown"
 				"PhysX3CharacterKinematicCHECKED_x86",
 				"PhysX3CHECKED_x86",
 				"PhysX3CommonCHECKED_x86",
-				"PhysX3CookingCHECKED_x86"
+				"PhysX3CookingCHECKED_x86",
+				"PhysX3ExtensionsCHECKED"
 			}
 
 		configuration { "debug", "x64", "vs*" }
@@ -740,7 +707,8 @@ solution "crown"
 				"PhysX3CharacterKinematicCHECKED_x64",
 				"PhysX3CHECKED_x64",
 				"PhysX3CommonCHECKED_x64",
-				"PhysX3CookingCHECKED_x64"
+				"PhysX3CookingCHECKED_x64",
+				"PhysX3ExtensionsCHECKED"
 			}
 
 		configuration { "development", "x32", "vs*" }
@@ -748,7 +716,8 @@ solution "crown"
 				"PhysX3CharacterKinematicPROFILE_x86",
 				"PhysX3PROFILE_x86",
 				"PhysX3CommonPROFILE_x86",
-				"PhysX3CookingPROFILE_x86"
+				"PhysX3CookingPROFILE_x86",
+				"PhysX3ExtensionsPROFILE"
 			}
 
 		configuration { "development", "x64", "vs*" }
@@ -756,21 +725,24 @@ solution "crown"
 				"PhysX3CharacterKinematicPROFILE_x64",
 				"PhysX3PROFILE_x64",
 				"PhysX3CommonPROFILE_x64",
-				"PhysX3CookingPROFILE_x64"
+				"PhysX3CookingPROFILE_x64",
+				"PhysX3ExtensionsPROFILE"
 			}
 
-		configuration { "debug", "x32", "vs*" }
+		configuration { "release", "x32", "vs*" }
 			links {
 				"PhysX3CharacterKinematic_x86",
 				"PhysX3_x86",
 				"PhysX3Common_x86",
-				"PhysX3Cooking_x86"
+				"PhysX3Cooking_x86",
+				"PhysX3Extensions"
 			}
 			
-		configuration { "debug", "x64", "vs*" }
+		configuration { "release", "x64", "vs*" }
 			links {
 				"PhysX3CharacterKinematic_x64",
 				"PhysX3_x64",
 				"PhysX3Common_x64",
-				"PhysX3Cooking_x64"
+				"PhysX3Cooking_x64",
+				"PhysX3Extensions"
 			}

+ 9 - 5
tools/gui/console/MainWindow.cs

@@ -342,6 +342,10 @@ public partial class MainWindow: Gtk.Window
 			// Try to connect
 			m_sock = new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
+			// TODO: Input check
+			m_server_ip = ip_entry.Text;
+			m_server_port = Convert.ToInt16(port_entry.Text);
+
 			// Define the Server address and port
 			IPEndPoint epServer = new IPEndPoint(IPAddress.Parse(m_server_ip), m_server_port);
 
@@ -511,11 +515,6 @@ public partial class MainWindow: Gtk.Window
 		Send (json);
 	}
 
-	protected void OnConnectActivated (object sender, EventArgs e)
-	{
-		Connect ();
-	}
-
 	protected void OnEntryActivated (object sender, EventArgs e)
 	{
 		string text = entry1.Text;
@@ -586,4 +585,9 @@ public partial class MainWindow: Gtk.Window
 
 		args.RetVal = true;
 	}
+
+	protected void OnConnectClicked (object sender, EventArgs e)
+	{
+		Connect ();
+	}
 }

+ 76 - 13
tools/gui/console/gtk-gui/MainWindow.cs

@@ -4,12 +4,29 @@
 public partial class MainWindow
 {
 	private global::Gtk.UIManager UIManager;
+	
 	private global::Gtk.Action FileAction;
-	private global::Gtk.Action ConnectAction;
+	
+	private global::Gtk.Action FileAction1;
+	
+	private global::Gtk.Action EditAction;
+	
 	private global::Gtk.VBox vbox1;
+	
 	private global::Gtk.MenuBar menubar1;
+	
+	private global::Gtk.HBox hbox1;
+	
+	private global::Gtk.Entry ip_entry;
+	
+	private global::Gtk.Entry port_entry;
+	
+	private global::Gtk.Button connect_button;
+	
 	private global::Gtk.ScrolledWindow scrolledwindow1;
+	
 	private global::Gtk.TextView textview1;
+	
 	private global::Gtk.Entry entry1;
 
 	protected virtual void Build ()
@@ -21,9 +38,12 @@ public partial class MainWindow
 		this.FileAction = new global::Gtk.Action ("FileAction", global::Mono.Unix.Catalog.GetString ("File"), null, null);
 		this.FileAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("File");
 		w1.Add (this.FileAction, null);
-		this.ConnectAction = new global::Gtk.Action ("ConnectAction", global::Mono.Unix.Catalog.GetString ("Connect"), null, null);
-		this.ConnectAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Connect");
-		w1.Add (this.ConnectAction, null);
+		this.FileAction1 = new global::Gtk.Action ("FileAction1", global::Mono.Unix.Catalog.GetString ("File"), null, null);
+		this.FileAction1.ShortLabel = global::Mono.Unix.Catalog.GetString ("File");
+		w1.Add (this.FileAction1, null);
+		this.EditAction = new global::Gtk.Action ("EditAction", global::Mono.Unix.Catalog.GetString ("Edit"), null, null);
+		this.EditAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Edit");
+		w1.Add (this.EditAction, null);
 		this.UIManager.InsertActionGroup (w1, 0);
 		this.AddAccelGroup (this.UIManager.AccelGroup);
 		this.Name = "MainWindow";
@@ -34,7 +54,7 @@ public partial class MainWindow
 		this.vbox1.Name = "vbox1";
 		this.vbox1.Spacing = 6;
 		// Container child vbox1.Gtk.Box+BoxChild
-		this.UIManager.AddUiFromString ("<ui><menubar name='menubar1'><menu name='FileAction' action='FileAction'><menuitem name='ConnectAction' action='ConnectAction'/></menu></menubar></ui>");
+		this.UIManager.AddUiFromString ("<ui><menubar name='menubar1'><menu name='FileAction1' action='FileAction1'/><menu name='EditAction' action='EditAction'/></menubar></ui>");
 		this.menubar1 = ((global::Gtk.MenuBar)(this.UIManager.GetWidget ("/menubar1")));
 		this.menubar1.Name = "menubar1";
 		this.vbox1.Add (this.menubar1);
@@ -43,6 +63,49 @@ public partial class MainWindow
 		w2.Expand = false;
 		w2.Fill = false;
 		// Container child vbox1.Gtk.Box+BoxChild
+		this.hbox1 = new global::Gtk.HBox ();
+		this.hbox1.Name = "hbox1";
+		this.hbox1.Spacing = 6;
+		// Container child hbox1.Gtk.Box+BoxChild
+		this.ip_entry = new global::Gtk.Entry ();
+		this.ip_entry.WidthRequest = 261;
+		this.ip_entry.CanFocus = true;
+		this.ip_entry.Name = "ip_entry";
+		this.ip_entry.Text = global::Mono.Unix.Catalog.GetString ("Ip");
+		this.ip_entry.IsEditable = true;
+		this.ip_entry.InvisibleChar = '●';
+		this.hbox1.Add (this.ip_entry);
+		global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.ip_entry]));
+		w3.Position = 0;
+		w3.Expand = false;
+		// Container child hbox1.Gtk.Box+BoxChild
+		this.port_entry = new global::Gtk.Entry ();
+		this.port_entry.CanFocus = true;
+		this.port_entry.Name = "port_entry";
+		this.port_entry.Text = global::Mono.Unix.Catalog.GetString ("Port");
+		this.port_entry.IsEditable = true;
+		this.port_entry.InvisibleChar = '●';
+		this.hbox1.Add (this.port_entry);
+		global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.port_entry]));
+		w4.Position = 1;
+		w4.Expand = false;
+		// Container child hbox1.Gtk.Box+BoxChild
+		this.connect_button = new global::Gtk.Button ();
+		this.connect_button.CanFocus = true;
+		this.connect_button.Name = "connect_button";
+		this.connect_button.UseUnderline = true;
+		this.connect_button.Label = global::Mono.Unix.Catalog.GetString ("Connect");
+		this.hbox1.Add (this.connect_button);
+		global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.connect_button]));
+		w5.Position = 2;
+		w5.Expand = false;
+		w5.Fill = false;
+		this.vbox1.Add (this.hbox1);
+		global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.hbox1]));
+		w6.Position = 1;
+		w6.Expand = false;
+		w6.Fill = false;
+		// Container child vbox1.Gtk.Box+BoxChild
 		this.scrolledwindow1 = new global::Gtk.ScrolledWindow ();
 		this.scrolledwindow1.CanFocus = true;
 		this.scrolledwindow1.Name = "scrolledwindow1";
@@ -54,8 +117,8 @@ public partial class MainWindow
 		this.textview1.Editable = false;
 		this.scrolledwindow1.Add (this.textview1);
 		this.vbox1.Add (this.scrolledwindow1);
-		global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.scrolledwindow1]));
-		w4.Position = 1;
+		global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.scrolledwindow1]));
+		w8.Position = 2;
 		// Container child vbox1.Gtk.Box+BoxChild
 		this.entry1 = new global::Gtk.Entry ();
 		this.entry1.CanFocus = true;
@@ -63,11 +126,11 @@ public partial class MainWindow
 		this.entry1.IsEditable = true;
 		this.entry1.InvisibleChar = '●';
 		this.vbox1.Add (this.entry1);
-		global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.entry1]));
-		w5.PackType = ((global::Gtk.PackType)(1));
-		w5.Position = 2;
-		w5.Expand = false;
-		w5.Fill = false;
+		global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.entry1]));
+		w9.PackType = ((global::Gtk.PackType)(1));
+		w9.Position = 3;
+		w9.Expand = false;
+		w9.Fill = false;
 		this.Add (this.vbox1);
 		if ((this.Child != null)) {
 			this.Child.ShowAll ();
@@ -76,7 +139,7 @@ public partial class MainWindow
 		this.DefaultHeight = 474;
 		this.Show ();
 		this.DeleteEvent += new global::Gtk.DeleteEventHandler (this.OnDeleteEvent);
-		this.ConnectAction.Activated += new global::System.EventHandler (this.OnConnectActivated);
+		this.connect_button.Clicked += new global::System.EventHandler (this.OnConnectClicked);
 		this.entry1.Activated += new global::System.EventHandler (this.OnEntryActivated);
 		this.entry1.KeyPressEvent += new global::Gtk.KeyPressEventHandler (this.OnEntryKeyPressed);
 	}

+ 70 - 10
tools/gui/console/gtk-gui/gui.stetic

@@ -14,11 +14,15 @@
         <property name="Label" translatable="yes">File</property>
         <property name="ShortLabel" translatable="yes">File</property>
       </action>
-      <action id="ConnectAction">
+      <action id="FileAction1">
         <property name="Type">Action</property>
-        <property name="Label" translatable="yes">Connect</property>
-        <property name="ShortLabel" translatable="yes">Connect</property>
-        <signal name="Activated" handler="OnConnectActivated" />
+        <property name="Label" translatable="yes">File</property>
+        <property name="ShortLabel" translatable="yes">File</property>
+      </action>
+      <action id="EditAction">
+        <property name="Type">Action</property>
+        <property name="Label" translatable="yes">Edit</property>
+        <property name="ShortLabel" translatable="yes">Edit</property>
       </action>
     </action-group>
     <property name="MemberName" />
@@ -32,10 +36,9 @@
         <child>
           <widget class="Gtk.MenuBar" id="menubar1">
             <property name="MemberName" />
-            <node name="__gtksharp_99_Stetic_Editor_ActionMenuBar" type="Menubar">
-              <node type="Menu" action="FileAction">
-                <node type="Menuitem" action="ConnectAction" />
-              </node>
+            <node name="__gtksharp_125_Stetic_Editor_ActionMenuBar" type="Menubar">
+              <node type="Menu" action="FileAction1" />
+              <node type="Menu" action="EditAction" />
             </node>
           </widget>
           <packing>
@@ -45,6 +48,63 @@
             <property name="Fill">False</property>
           </packing>
         </child>
+        <child>
+          <widget class="Gtk.HBox" id="hbox1">
+            <property name="MemberName" />
+            <property name="Spacing">6</property>
+            <child>
+              <widget class="Gtk.Entry" id="ip_entry">
+                <property name="MemberName" />
+                <property name="WidthRequest">261</property>
+                <property name="CanFocus">True</property>
+                <property name="Text" translatable="yes">Ip</property>
+                <property name="IsEditable">True</property>
+                <property name="InvisibleChar">●</property>
+              </widget>
+              <packing>
+                <property name="Position">0</property>
+                <property name="AutoSize">False</property>
+                <property name="Expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.Entry" id="port_entry">
+                <property name="MemberName" />
+                <property name="CanFocus">True</property>
+                <property name="Text" translatable="yes">Port</property>
+                <property name="IsEditable">True</property>
+                <property name="InvisibleChar">●</property>
+              </widget>
+              <packing>
+                <property name="Position">1</property>
+                <property name="AutoSize">False</property>
+                <property name="Expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.Button" id="connect_button">
+                <property name="MemberName" />
+                <property name="CanFocus">True</property>
+                <property name="Type">TextOnly</property>
+                <property name="Label" translatable="yes">Connect</property>
+                <property name="UseUnderline">True</property>
+                <signal name="Clicked" handler="OnConnectClicked" />
+              </widget>
+              <packing>
+                <property name="Position">2</property>
+                <property name="AutoSize">True</property>
+                <property name="Expand">False</property>
+                <property name="Fill">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">1</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
         <child>
           <widget class="Gtk.ScrolledWindow" id="scrolledwindow1">
             <property name="MemberName" />
@@ -60,7 +120,7 @@
             </child>
           </widget>
           <packing>
-            <property name="Position">1</property>
+            <property name="Position">2</property>
             <property name="AutoSize">True</property>
           </packing>
         </child>
@@ -75,7 +135,7 @@
           </widget>
           <packing>
             <property name="PackType">End</property>
-            <property name="Position">2</property>
+            <property name="Position">3</property>
             <property name="AutoSize">True</property>
             <property name="Expand">False</property>
             <property name="Fill">False</property>

+ 117 - 0
tools/gui/starter/MainWindow.cs

@@ -0,0 +1,117 @@
+using System;
+using Gtk;
+
+public partial class MainWindow: Gtk.Window
+{
+	//--------------------------------------------------------------------------------
+	enum Platform
+	{
+		Linux32 = 0,
+		Linux64,
+		Windows32,
+		Windows64,
+		Android
+	}
+
+	//--------------------------------------------------------------------------------
+	enum BuildMode
+	{
+		Debug = 0,
+		Development,
+		Release
+	}
+
+	public string project_name = null;
+	public string source_path = null;
+	public string destination_path = null;
+
+	//--------------------------------------------------------------------------------
+	public MainWindow () : base (Gtk.WindowType.Toplevel)
+	{
+		Build ();
+	}
+
+	//--------------------------------------------------------------------------------
+	protected void OnDeleteEvent (object sender, DeleteEventArgs a)
+	{
+		Application.Quit ();
+		a.RetVal = true;
+	}
+
+	//--------------------------------------------------------------------------------
+	protected void OnProjectButtonClicked (object sender, EventArgs e)
+	{
+		starter.ProjectDialog pd = new starter.ProjectDialog (this);
+		pd.Run ();
+		pd.Destroy ();
+
+		project_entry.Text = project_name;
+	}
+
+	//--------------------------------------------------------------------------------
+	protected void OnRunButtonClicked (object sender, EventArgs e)
+	{
+		Platform platform = (Platform) platform_combobox.Active;
+		BuildMode build = (BuildMode) build_combobox.Active;
+
+		// Do not use MD for compiling because it cannot retrieve env value even though is specified in target environment.
+		// Use 'xbuild' command instead.
+		string path = Environment.GetEnvironmentVariable("CROWN_INSTALL_DIR") + "/";
+		string executable = "";
+
+		switch (platform)
+		{
+			case Platform.Linux32:
+			{
+				path += "bin/linux32/";
+				switch (build)
+				{
+				case BuildMode.Debug: executable = "crown-debug-32"; break;
+				case BuildMode.Development: executable = "crown-development-32"; break;
+				case BuildMode.Release: executable = "crown-release-32"; break;
+				}
+				break;
+			}
+			case Platform.Linux64:
+			{
+				path += "bin/linux64/";
+				switch (build)
+				{
+				case BuildMode.Debug: executable = "crown-debug-64"; break;
+				case BuildMode.Development: executable = "crown-development-64"; break;
+				case BuildMode.Release: executable = "crown-release-64"; break;
+				}
+				break;
+			}
+			case Platform.Windows32:
+			{
+				path += "bin\\windows32\\";
+				switch (build)
+				{
+				case BuildMode.Debug: executable = "crown-debug-32"; break;
+				case BuildMode.Development: executable = "crown-development-32"; break;
+				case BuildMode.Release: executable = "crown-release-32"; break;
+				}
+				break;
+			}
+			case Platform.Windows64:
+			{
+				path += "bin\\windows64\\";
+				switch (build)
+				{
+				case BuildMode.Debug: executable = "crown-debug-64"; break;
+				case BuildMode.Development: executable = "crown-development-64"; break;
+				case BuildMode.Release: executable = "crown-release-64"; break;
+				}
+				break;
+			}
+		}
+
+		string args = " --source-dir " + source_path;
+		args += " --bundle-dir " + destination_path;
+		args += " --compile --continue";
+
+		System.IO.Directory.SetCurrentDirectory (path);
+		System.Diagnostics.Process.Start (executable, args);
+	}
+}

+ 16 - 0
tools/gui/starter/Program.cs

@@ -0,0 +1,16 @@
+using System;
+using Gtk;
+
+namespace starter
+{
+	class MainClass
+	{
+		public static void Main (string[] args)
+		{
+			Application.Init ();
+			MainWindow win = new MainWindow ();
+			win.Show ();
+			Application.Run ();
+		}
+	}
+}

+ 54 - 0
tools/gui/starter/ProjectDialog.cs

@@ -0,0 +1,54 @@
+using System;
+using Gtk;
+
+namespace starter
+{
+	public partial class ProjectDialog : Gtk.Dialog
+	{
+		MainWindow win;
+
+		public ProjectDialog (MainWindow win)
+		{
+			this.Build ();
+			this.win = win;
+		}
+
+		protected void OnProjectDialogOkClicked (object sender, EventArgs e)
+		{
+			win.project_name = name_entry.Text;
+			win.source_path = source_entry.Text;
+			win.destination_path = destination_entry.Text;
+		}
+
+		protected void OnSourceButtonClicked (object sender, EventArgs e)
+		{
+			Gtk.FileChooserDialog fc = new Gtk.FileChooserDialog("Choose the file to open",
+				this.win,
+				FileChooserAction.SelectFolder,
+				"Cancel", ResponseType.Cancel,
+				"Open", ResponseType.Accept);
+			if (fc.Run () == (int)ResponseType.Accept) 
+			{
+				source_entry.Text = fc.Filename;
+			}
+
+			fc.Destroy ();
+		}
+
+		protected void OnDestinationButtonClicked (object sender, EventArgs e)
+		{
+			Gtk.FileChooserDialog fc = new Gtk.FileChooserDialog("Choose the file to open",
+				this,
+				FileChooserAction.SelectFolder,
+				"Cancel", ResponseType.Cancel,
+				"Open", ResponseType.Accept);
+			if (fc.Run () == (int)ResponseType.Accept) 
+			{
+				destination_entry.Text = fc.Filename;
+			}
+
+			fc.Destroy ();
+		}
+	}
+}
+

+ 27 - 0
tools/gui/starter/Properties/AssemblyInfo.cs

@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle ("starter")]
+[assembly: AssemblyDescription ("")]
+[assembly: AssemblyConfiguration ("")]
+[assembly: AssemblyCompany ("")]
+[assembly: AssemblyProduct ("")]
+[assembly: AssemblyCopyright ("mikymod")]
+[assembly: AssemblyTrademark ("")]
+[assembly: AssemblyCulture ("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion ("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+

+ 237 - 0
tools/gui/starter/gtk-gui/MainWindow.cs

@@ -0,0 +1,237 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+
+public partial class MainWindow
+{
+	private global::Gtk.VBox vbox4;
+	
+	private global::Gtk.HBox hbox9;
+	
+	private global::Gtk.VBox labels_vbox;
+	
+	private global::Gtk.Label project_label;
+	
+	private global::Gtk.Label plarform_label;
+	
+	private global::Gtk.Label build_label;
+	
+	private global::Gtk.Label host_label;
+	
+	private global::Gtk.VBox vbox7;
+	
+	private global::Gtk.HBox hbox10;
+	
+	private global::Gtk.Entry project_entry;
+	
+	private global::Gtk.Button project_button;
+	
+	private global::Gtk.ComboBox platform_combobox;
+	
+	private global::Gtk.ComboBox build_combobox;
+	
+	private global::Gtk.HBox hbox11;
+	
+	private global::Gtk.Entry host_entry;
+	
+	private global::Gtk.Button button6;
+	
+	private global::Gtk.Button run_button;
+	
+	private global::Gtk.Statusbar statusbar1;
+
+	protected virtual void Build ()
+	{
+		global::Stetic.Gui.Initialize (this);
+		// Widget MainWindow
+		this.Name = "MainWindow";
+		this.Title = global::Mono.Unix.Catalog.GetString ("Starter");
+		this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+		this.Resizable = false;
+		// Container child MainWindow.Gtk.Container+ContainerChild
+		this.vbox4 = new global::Gtk.VBox ();
+		this.vbox4.Name = "vbox4";
+		this.vbox4.Spacing = 6;
+		// Container child vbox4.Gtk.Box+BoxChild
+		this.hbox9 = new global::Gtk.HBox ();
+		this.hbox9.Name = "hbox9";
+		this.hbox9.Spacing = 6;
+		// Container child hbox9.Gtk.Box+BoxChild
+		this.labels_vbox = new global::Gtk.VBox ();
+		this.labels_vbox.Name = "labels_vbox";
+		this.labels_vbox.Homogeneous = true;
+		this.labels_vbox.Spacing = 6;
+		// Container child labels_vbox.Gtk.Box+BoxChild
+		this.project_label = new global::Gtk.Label ();
+		this.project_label.Name = "project_label";
+		this.project_label.Xalign = 0F;
+		this.project_label.LabelProp = global::Mono.Unix.Catalog.GetString ("Project:");
+		this.labels_vbox.Add (this.project_label);
+		global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.labels_vbox [this.project_label]));
+		w1.Position = 0;
+		w1.Fill = false;
+		// Container child labels_vbox.Gtk.Box+BoxChild
+		this.plarform_label = new global::Gtk.Label ();
+		this.plarform_label.Name = "plarform_label";
+		this.plarform_label.Xalign = 0F;
+		this.plarform_label.LabelProp = global::Mono.Unix.Catalog.GetString ("Platform:");
+		this.labels_vbox.Add (this.plarform_label);
+		global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.labels_vbox [this.plarform_label]));
+		w2.Position = 1;
+		w2.Fill = false;
+		// Container child labels_vbox.Gtk.Box+BoxChild
+		this.build_label = new global::Gtk.Label ();
+		this.build_label.Name = "build_label";
+		this.build_label.Xalign = 0F;
+		this.build_label.LabelProp = global::Mono.Unix.Catalog.GetString ("Build:");
+		this.labels_vbox.Add (this.build_label);
+		global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.labels_vbox [this.build_label]));
+		w3.Position = 2;
+		w3.Fill = false;
+		// Container child labels_vbox.Gtk.Box+BoxChild
+		this.host_label = new global::Gtk.Label ();
+		this.host_label.Name = "host_label";
+		this.host_label.Xalign = 0F;
+		this.host_label.LabelProp = global::Mono.Unix.Catalog.GetString ("Host:");
+		this.labels_vbox.Add (this.host_label);
+		global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.labels_vbox [this.host_label]));
+		w4.Position = 3;
+		w4.Fill = false;
+		this.hbox9.Add (this.labels_vbox);
+		global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.hbox9 [this.labels_vbox]));
+		w5.Position = 0;
+		w5.Expand = false;
+		w5.Fill = false;
+		w5.Padding = ((uint)(10));
+		// Container child hbox9.Gtk.Box+BoxChild
+		this.vbox7 = new global::Gtk.VBox ();
+		this.vbox7.Name = "vbox7";
+		this.vbox7.Spacing = 6;
+		// Container child vbox7.Gtk.Box+BoxChild
+		this.hbox10 = new global::Gtk.HBox ();
+		this.hbox10.Name = "hbox10";
+		this.hbox10.Spacing = 6;
+		// Container child hbox10.Gtk.Box+BoxChild
+		this.project_entry = new global::Gtk.Entry ();
+		this.project_entry.CanFocus = true;
+		this.project_entry.Name = "project_entry";
+		this.project_entry.IsEditable = true;
+		this.project_entry.InvisibleChar = '●';
+		this.hbox10.Add (this.project_entry);
+		global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.hbox10 [this.project_entry]));
+		w6.Position = 0;
+		// Container child hbox10.Gtk.Box+BoxChild
+		this.project_button = new global::Gtk.Button ();
+		this.project_button.CanFocus = true;
+		this.project_button.Name = "project_button";
+		this.project_button.UseUnderline = true;
+		this.project_button.Label = global::Mono.Unix.Catalog.GetString ("...");
+		this.hbox10.Add (this.project_button);
+		global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox10 [this.project_button]));
+		w7.Position = 1;
+		w7.Expand = false;
+		w7.Fill = false;
+		this.vbox7.Add (this.hbox10);
+		global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox7 [this.hbox10]));
+		w8.Position = 0;
+		w8.Expand = false;
+		w8.Fill = false;
+		// Container child vbox7.Gtk.Box+BoxChild
+		this.platform_combobox = global::Gtk.ComboBox.NewText ();
+		this.platform_combobox.AppendText (global::Mono.Unix.Catalog.GetString ("Linux32"));
+		this.platform_combobox.AppendText (global::Mono.Unix.Catalog.GetString ("Linux64"));
+		this.platform_combobox.AppendText (global::Mono.Unix.Catalog.GetString ("Windows32"));
+		this.platform_combobox.AppendText (global::Mono.Unix.Catalog.GetString ("Windows64"));
+		this.platform_combobox.AppendText (global::Mono.Unix.Catalog.GetString ("Android"));
+		this.platform_combobox.Name = "platform_combobox";
+		this.platform_combobox.Active = 0;
+		this.vbox7.Add (this.platform_combobox);
+		global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.vbox7 [this.platform_combobox]));
+		w9.Position = 1;
+		w9.Expand = false;
+		w9.Fill = false;
+		// Container child vbox7.Gtk.Box+BoxChild
+		this.build_combobox = global::Gtk.ComboBox.NewText ();
+		this.build_combobox.AppendText (global::Mono.Unix.Catalog.GetString ("Debug"));
+		this.build_combobox.AppendText (global::Mono.Unix.Catalog.GetString ("Development"));
+		this.build_combobox.AppendText (global::Mono.Unix.Catalog.GetString ("Release"));
+		this.build_combobox.Name = "build_combobox";
+		this.build_combobox.Active = 0;
+		this.vbox7.Add (this.build_combobox);
+		global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.vbox7 [this.build_combobox]));
+		w10.Position = 2;
+		w10.Expand = false;
+		w10.Fill = false;
+		// Container child vbox7.Gtk.Box+BoxChild
+		this.hbox11 = new global::Gtk.HBox ();
+		this.hbox11.Name = "hbox11";
+		this.hbox11.Spacing = 6;
+		// Container child hbox11.Gtk.Box+BoxChild
+		this.host_entry = new global::Gtk.Entry ();
+		this.host_entry.CanFocus = true;
+		this.host_entry.Name = "host_entry";
+		this.host_entry.Text = global::Mono.Unix.Catalog.GetString ("localhost");
+		this.host_entry.IsEditable = true;
+		this.host_entry.InvisibleChar = '●';
+		this.hbox11.Add (this.host_entry);
+		global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.hbox11 [this.host_entry]));
+		w11.Position = 0;
+		// Container child hbox11.Gtk.Box+BoxChild
+		this.button6 = new global::Gtk.Button ();
+		this.button6.CanFocus = true;
+		this.button6.Name = "button6";
+		this.button6.UseUnderline = true;
+		this.button6.Label = global::Mono.Unix.Catalog.GetString ("...");
+		this.hbox11.Add (this.button6);
+		global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.hbox11 [this.button6]));
+		w12.Position = 1;
+		w12.Expand = false;
+		w12.Fill = false;
+		this.vbox7.Add (this.hbox11);
+		global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.vbox7 [this.hbox11]));
+		w13.Position = 3;
+		w13.Expand = false;
+		w13.Fill = false;
+		this.hbox9.Add (this.vbox7);
+		global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.hbox9 [this.vbox7]));
+		w14.Position = 1;
+		w14.Expand = false;
+		w14.Fill = false;
+		w14.Padding = ((uint)(10));
+		this.vbox4.Add (this.hbox9);
+		global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.hbox9]));
+		w15.Position = 0;
+		w15.Expand = false;
+		w15.Fill = false;
+		// Container child vbox4.Gtk.Box+BoxChild
+		this.run_button = new global::Gtk.Button ();
+		this.run_button.CanFocus = true;
+		this.run_button.Name = "run_button";
+		this.run_button.UseUnderline = true;
+		this.run_button.BorderWidth = ((uint)(27));
+		this.run_button.Label = global::Mono.Unix.Catalog.GetString ("Run");
+		this.vbox4.Add (this.run_button);
+		global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.run_button]));
+		w16.Position = 1;
+		w16.Expand = false;
+		w16.Fill = false;
+		// Container child vbox4.Gtk.Box+BoxChild
+		this.statusbar1 = new global::Gtk.Statusbar ();
+		this.statusbar1.Name = "statusbar1";
+		this.statusbar1.Spacing = 6;
+		this.vbox4.Add (this.statusbar1);
+		global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.statusbar1]));
+		w17.Position = 2;
+		w17.Expand = false;
+		w17.Fill = false;
+		this.Add (this.vbox4);
+		if ((this.Child != null)) {
+			this.Child.ShowAll ();
+		}
+		this.DefaultWidth = 291;
+		this.DefaultHeight = 236;
+		this.Show ();
+		this.DeleteEvent += new global::Gtk.DeleteEventHandler (this.OnDeleteEvent);
+		this.project_button.Clicked += new global::System.EventHandler (this.OnProjectButtonClicked);
+		this.run_button.Clicked += new global::System.EventHandler (this.OnRunButtonClicked);
+	}
+}

+ 29 - 0
tools/gui/starter/gtk-gui/generated.cs

@@ -0,0 +1,29 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace Stetic
+{
+	internal class Gui
+	{
+		private static bool initialized;
+
+		internal static void Initialize (Gtk.Widget iconRenderer)
+		{
+			if ((Stetic.Gui.initialized == false)) {
+				Stetic.Gui.initialized = true;
+			}
+		}
+	}
+
+	internal class ActionGroups
+	{
+		public static Gtk.ActionGroup GetActionGroup (System.Type type)
+		{
+			return Stetic.ActionGroups.GetActionGroup (type.FullName);
+		}
+
+		public static Gtk.ActionGroup GetActionGroup (string name)
+		{
+			return null;
+		}
+	}
+}

+ 479 - 0
tools/gui/starter/gtk-gui/gui.stetic

@@ -0,0 +1,479 @@
+<?xml version="1.0" encoding="utf-8"?>
+<stetic-interface>
+  <configuration>
+    <images-root-path>..</images-root-path>
+  </configuration>
+  <import>
+    <widget-library name="glade-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+    <widget-library name="../bin/Debug/starter.exe" internal="true" />
+  </import>
+  <widget class="Gtk.Window" id="MainWindow" design-size="291 236">
+    <property name="MemberName" />
+    <property name="Title" translatable="yes">Starter</property>
+    <property name="WindowPosition">CenterOnParent</property>
+    <property name="Resizable">False</property>
+    <signal name="DeleteEvent" handler="OnDeleteEvent" />
+    <child>
+      <widget class="Gtk.VBox" id="vbox4">
+        <property name="MemberName" />
+        <property name="Spacing">6</property>
+        <child>
+          <widget class="Gtk.HBox" id="hbox9">
+            <property name="MemberName" />
+            <property name="Spacing">6</property>
+            <child>
+              <widget class="Gtk.VBox" id="labels_vbox">
+                <property name="MemberName" />
+                <property name="Homogeneous">True</property>
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.Label" id="project_label">
+                    <property name="MemberName" />
+                    <property name="Xalign">0</property>
+                    <property name="LabelProp" translatable="yes">Project:</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.Label" id="plarform_label">
+                    <property name="MemberName" />
+                    <property name="Xalign">0</property>
+                    <property name="LabelProp" translatable="yes">Platform:</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">1</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.Label" id="build_label">
+                    <property name="MemberName" />
+                    <property name="Xalign">0</property>
+                    <property name="LabelProp" translatable="yes">Build:</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">2</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.Label" id="host_label">
+                    <property name="MemberName" />
+                    <property name="Xalign">0</property>
+                    <property name="LabelProp" translatable="yes">Host:</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">3</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Position">0</property>
+                <property name="AutoSize">True</property>
+                <property name="Expand">False</property>
+                <property name="Fill">False</property>
+                <property name="Padding">10</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.VBox" id="vbox7">
+                <property name="MemberName" />
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.HBox" id="hbox10">
+                    <property name="MemberName" />
+                    <property name="Spacing">6</property>
+                    <child>
+                      <widget class="Gtk.Entry" id="project_entry">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="IsEditable">True</property>
+                        <property name="InvisibleChar">●</property>
+                      </widget>
+                      <packing>
+                        <property name="Position">0</property>
+                        <property name="AutoSize">True</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.Button" id="project_button">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Type">TextOnly</property>
+                        <property name="Label" translatable="yes">...</property>
+                        <property name="UseUnderline">True</property>
+                        <signal name="Clicked" handler="OnProjectButtonClicked" />
+                      </widget>
+                      <packing>
+                        <property name="Position">1</property>
+                        <property name="AutoSize">True</property>
+                        <property name="Expand">False</property>
+                        <property name="Fill">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.ComboBox" id="platform_combobox">
+                    <property name="MemberName" />
+                    <property name="IsTextCombo">True</property>
+                    <property name="Items" translatable="yes">Linux32
+Linux64
+Windows32
+Windows64
+Android</property>
+                    <property name="Active">0</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">1</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.ComboBox" id="build_combobox">
+                    <property name="MemberName" />
+                    <property name="IsTextCombo">True</property>
+                    <property name="Items" translatable="yes">Debug
+Development
+Release</property>
+                    <property name="Active">0</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">2</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.HBox" id="hbox11">
+                    <property name="MemberName" />
+                    <property name="Spacing">6</property>
+                    <child>
+                      <widget class="Gtk.Entry" id="host_entry">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Text" translatable="yes">localhost</property>
+                        <property name="IsEditable">True</property>
+                        <property name="InvisibleChar">●</property>
+                      </widget>
+                      <packing>
+                        <property name="Position">0</property>
+                        <property name="AutoSize">True</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.Button" id="button6">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Type">TextOnly</property>
+                        <property name="Label" translatable="yes">...</property>
+                        <property name="UseUnderline">True</property>
+                      </widget>
+                      <packing>
+                        <property name="Position">1</property>
+                        <property name="AutoSize">True</property>
+                        <property name="Expand">False</property>
+                        <property name="Fill">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">3</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Position">1</property>
+                <property name="AutoSize">True</property>
+                <property name="Expand">False</property>
+                <property name="Fill">False</property>
+                <property name="Padding">10</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">0</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="Gtk.Button" id="run_button">
+            <property name="MemberName" />
+            <property name="CanFocus">True</property>
+            <property name="Type">TextOnly</property>
+            <property name="Label" translatable="yes">Run</property>
+            <property name="UseUnderline">True</property>
+            <property name="BorderWidth">27</property>
+            <signal name="Clicked" handler="OnRunButtonClicked" />
+          </widget>
+          <packing>
+            <property name="Position">1</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="Gtk.Statusbar" id="statusbar1">
+            <property name="MemberName" />
+            <property name="Spacing">6</property>
+            <child>
+              <placeholder />
+            </child>
+            <child>
+              <placeholder />
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">2</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="Gtk.Dialog" id="starter.ProjectDialog" design-size="318 165">
+    <property name="MemberName" />
+    <property name="WindowPosition">CenterOnParent</property>
+    <property name="BorderWidth">6</property>
+    <property name="Buttons">2</property>
+    <property name="HelpButton">False</property>
+    <child internal-child="VBox">
+      <widget class="Gtk.VBox" id="dialog1_VBox">
+        <property name="MemberName" />
+        <property name="BorderWidth">8</property>
+        <child>
+          <widget class="Gtk.HBox" id="hbox4">
+            <property name="MemberName" />
+            <property name="Spacing">6</property>
+            <child>
+              <widget class="Gtk.VBox" id="vbox3">
+                <property name="MemberName" />
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.Label" id="name_label">
+                    <property name="MemberName" />
+                    <property name="Xalign">0</property>
+                    <property name="LabelProp" translatable="yes">Name:</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.Label" id="source_label">
+                    <property name="MemberName" />
+                    <property name="Xalign">0</property>
+                    <property name="LabelProp" translatable="yes">Source:</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">1</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.Label" id="bundle_label">
+                    <property name="MemberName" />
+                    <property name="Xalign">0</property>
+                    <property name="LabelProp" translatable="yes">Destination:</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">2</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Position">0</property>
+                <property name="AutoSize">True</property>
+                <property name="Expand">False</property>
+                <property name="Fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.VBox" id="vbox4">
+                <property name="MemberName" />
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.Entry" id="name_entry">
+                    <property name="MemberName" />
+                    <property name="CanFocus">True</property>
+                    <property name="IsEditable">True</property>
+                    <property name="InvisibleChar">●</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.HBox" id="hbox5">
+                    <property name="MemberName" />
+                    <property name="Spacing">6</property>
+                    <child>
+                      <widget class="Gtk.Entry" id="source_entry">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="IsEditable">True</property>
+                        <property name="InvisibleChar">●</property>
+                      </widget>
+                      <packing>
+                        <property name="Position">0</property>
+                        <property name="AutoSize">True</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.Button" id="source_button">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Type">TextOnly</property>
+                        <property name="Label" translatable="yes">...</property>
+                        <property name="UseUnderline">True</property>
+                        <signal name="Clicked" handler="OnSourceButtonClicked" />
+                      </widget>
+                      <packing>
+                        <property name="Position">1</property>
+                        <property name="AutoSize">True</property>
+                        <property name="Expand">False</property>
+                        <property name="Fill">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">1</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.HBox" id="hbox6">
+                    <property name="MemberName" />
+                    <property name="Spacing">6</property>
+                    <child>
+                      <widget class="Gtk.Entry" id="destination_entry">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="IsEditable">True</property>
+                        <property name="InvisibleChar">●</property>
+                      </widget>
+                      <packing>
+                        <property name="Position">0</property>
+                        <property name="AutoSize">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.Button" id="destination_button">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Type">TextOnly</property>
+                        <property name="Label" translatable="yes">...</property>
+                        <property name="UseUnderline">True</property>
+                        <signal name="Clicked" handler="OnDestinationButtonClicked" />
+                      </widget>
+                      <packing>
+                        <property name="Position">1</property>
+                        <property name="AutoSize">True</property>
+                        <property name="Expand">False</property>
+                        <property name="Fill">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">2</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Position">1</property>
+                <property name="AutoSize">True</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">0</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+    <child internal-child="ActionArea">
+      <widget class="Gtk.HButtonBox" id="dialog1_ActionArea">
+        <property name="MemberName" />
+        <property name="Spacing">10</property>
+        <property name="BorderWidth">5</property>
+        <property name="Size">2</property>
+        <property name="LayoutStyle">End</property>
+        <child>
+          <widget class="Gtk.Button" id="buttonCancel">
+            <property name="MemberName" />
+            <property name="CanDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-cancel</property>
+            <property name="ResponseId">-6</property>
+            <property name="label">gtk-cancel</property>
+          </widget>
+          <packing>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="Gtk.Button" id="buttonOk">
+            <property name="MemberName" />
+            <property name="CanDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-ok</property>
+            <property name="ResponseId">-5</property>
+            <signal name="Clicked" handler="OnProjectDialogOkClicked" />
+            <property name="label">gtk-ok</property>
+          </widget>
+          <packing>
+            <property name="Position">1</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</stetic-interface>

+ 211 - 0
tools/gui/starter/gtk-gui/starter.ProjectDialog.cs

@@ -0,0 +1,211 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace starter
+{
+	public partial class ProjectDialog
+	{
+		private global::Gtk.HBox hbox4;
+		
+		private global::Gtk.VBox vbox3;
+		
+		private global::Gtk.Label name_label;
+		
+		private global::Gtk.Label source_label;
+		
+		private global::Gtk.Label bundle_label;
+		
+		private global::Gtk.VBox vbox4;
+		
+		private global::Gtk.Entry name_entry;
+		
+		private global::Gtk.HBox hbox5;
+		
+		private global::Gtk.Entry source_entry;
+		
+		private global::Gtk.Button source_button;
+		
+		private global::Gtk.HBox hbox6;
+		
+		private global::Gtk.Entry destination_entry;
+		
+		private global::Gtk.Button destination_button;
+		
+		private global::Gtk.Button buttonCancel;
+		
+		private global::Gtk.Button buttonOk;
+
+		protected virtual void Build ()
+		{
+			global::Stetic.Gui.Initialize (this);
+			// Widget starter.ProjectDialog
+			this.Name = "starter.ProjectDialog";
+			this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+			this.BorderWidth = ((uint)(6));
+			// Internal child starter.ProjectDialog.VBox
+			global::Gtk.VBox w1 = this.VBox;
+			w1.Name = "dialog1_VBox";
+			w1.BorderWidth = ((uint)(8));
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.hbox4 = new global::Gtk.HBox ();
+			this.hbox4.Name = "hbox4";
+			this.hbox4.Spacing = 6;
+			// Container child hbox4.Gtk.Box+BoxChild
+			this.vbox3 = new global::Gtk.VBox ();
+			this.vbox3.Name = "vbox3";
+			this.vbox3.Spacing = 6;
+			// Container child vbox3.Gtk.Box+BoxChild
+			this.name_label = new global::Gtk.Label ();
+			this.name_label.Name = "name_label";
+			this.name_label.Xalign = 0F;
+			this.name_label.LabelProp = global::Mono.Unix.Catalog.GetString ("Name:");
+			this.vbox3.Add (this.name_label);
+			global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.name_label]));
+			w2.Position = 0;
+			w2.Fill = false;
+			// Container child vbox3.Gtk.Box+BoxChild
+			this.source_label = new global::Gtk.Label ();
+			this.source_label.Name = "source_label";
+			this.source_label.Xalign = 0F;
+			this.source_label.LabelProp = global::Mono.Unix.Catalog.GetString ("Source:");
+			this.vbox3.Add (this.source_label);
+			global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.source_label]));
+			w3.Position = 1;
+			w3.Fill = false;
+			// Container child vbox3.Gtk.Box+BoxChild
+			this.bundle_label = new global::Gtk.Label ();
+			this.bundle_label.Name = "bundle_label";
+			this.bundle_label.Xalign = 0F;
+			this.bundle_label.LabelProp = global::Mono.Unix.Catalog.GetString ("Destination:");
+			this.vbox3.Add (this.bundle_label);
+			global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.bundle_label]));
+			w4.Position = 2;
+			w4.Fill = false;
+			this.hbox4.Add (this.vbox3);
+			global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.vbox3]));
+			w5.Position = 0;
+			w5.Expand = false;
+			w5.Fill = false;
+			// Container child hbox4.Gtk.Box+BoxChild
+			this.vbox4 = new global::Gtk.VBox ();
+			this.vbox4.Name = "vbox4";
+			this.vbox4.Spacing = 6;
+			// Container child vbox4.Gtk.Box+BoxChild
+			this.name_entry = new global::Gtk.Entry ();
+			this.name_entry.CanFocus = true;
+			this.name_entry.Name = "name_entry";
+			this.name_entry.IsEditable = true;
+			this.name_entry.InvisibleChar = '●';
+			this.vbox4.Add (this.name_entry);
+			global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.name_entry]));
+			w6.Position = 0;
+			w6.Expand = false;
+			w6.Fill = false;
+			// Container child vbox4.Gtk.Box+BoxChild
+			this.hbox5 = new global::Gtk.HBox ();
+			this.hbox5.Name = "hbox5";
+			this.hbox5.Spacing = 6;
+			// Container child hbox5.Gtk.Box+BoxChild
+			this.source_entry = new global::Gtk.Entry ();
+			this.source_entry.CanFocus = true;
+			this.source_entry.Name = "source_entry";
+			this.source_entry.IsEditable = true;
+			this.source_entry.InvisibleChar = '●';
+			this.hbox5.Add (this.source_entry);
+			global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox5 [this.source_entry]));
+			w7.Position = 0;
+			// Container child hbox5.Gtk.Box+BoxChild
+			this.source_button = new global::Gtk.Button ();
+			this.source_button.CanFocus = true;
+			this.source_button.Name = "source_button";
+			this.source_button.UseUnderline = true;
+			this.source_button.Label = global::Mono.Unix.Catalog.GetString ("...");
+			this.hbox5.Add (this.source_button);
+			global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.hbox5 [this.source_button]));
+			w8.Position = 1;
+			w8.Expand = false;
+			w8.Fill = false;
+			this.vbox4.Add (this.hbox5);
+			global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.hbox5]));
+			w9.Position = 1;
+			w9.Expand = false;
+			w9.Fill = false;
+			// Container child vbox4.Gtk.Box+BoxChild
+			this.hbox6 = new global::Gtk.HBox ();
+			this.hbox6.Name = "hbox6";
+			this.hbox6.Spacing = 6;
+			// Container child hbox6.Gtk.Box+BoxChild
+			this.destination_entry = new global::Gtk.Entry ();
+			this.destination_entry.CanFocus = true;
+			this.destination_entry.Name = "destination_entry";
+			this.destination_entry.IsEditable = true;
+			this.destination_entry.InvisibleChar = '●';
+			this.hbox6.Add (this.destination_entry);
+			global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.destination_entry]));
+			w10.Position = 0;
+			// Container child hbox6.Gtk.Box+BoxChild
+			this.destination_button = new global::Gtk.Button ();
+			this.destination_button.CanFocus = true;
+			this.destination_button.Name = "destination_button";
+			this.destination_button.UseUnderline = true;
+			this.destination_button.Label = global::Mono.Unix.Catalog.GetString ("...");
+			this.hbox6.Add (this.destination_button);
+			global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.destination_button]));
+			w11.Position = 1;
+			w11.Expand = false;
+			w11.Fill = false;
+			this.vbox4.Add (this.hbox6);
+			global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.hbox6]));
+			w12.Position = 2;
+			w12.Expand = false;
+			w12.Fill = false;
+			this.hbox4.Add (this.vbox4);
+			global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.vbox4]));
+			w13.Position = 1;
+			w1.Add (this.hbox4);
+			global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(w1 [this.hbox4]));
+			w14.Position = 0;
+			w14.Expand = false;
+			w14.Fill = false;
+			// Internal child starter.ProjectDialog.ActionArea
+			global::Gtk.HButtonBox w15 = this.ActionArea;
+			w15.Name = "dialog1_ActionArea";
+			w15.Spacing = 10;
+			w15.BorderWidth = ((uint)(5));
+			w15.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.buttonCancel = new global::Gtk.Button ();
+			this.buttonCancel.CanDefault = true;
+			this.buttonCancel.CanFocus = true;
+			this.buttonCancel.Name = "buttonCancel";
+			this.buttonCancel.UseStock = true;
+			this.buttonCancel.UseUnderline = true;
+			this.buttonCancel.Label = "gtk-cancel";
+			this.AddActionWidget (this.buttonCancel, -6);
+			global::Gtk.ButtonBox.ButtonBoxChild w16 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w15 [this.buttonCancel]));
+			w16.Expand = false;
+			w16.Fill = false;
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.buttonOk = new global::Gtk.Button ();
+			this.buttonOk.CanDefault = true;
+			this.buttonOk.CanFocus = true;
+			this.buttonOk.Name = "buttonOk";
+			this.buttonOk.UseStock = true;
+			this.buttonOk.UseUnderline = true;
+			this.buttonOk.Label = "gtk-ok";
+			this.AddActionWidget (this.buttonOk, -5);
+			global::Gtk.ButtonBox.ButtonBoxChild w17 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w15 [this.buttonOk]));
+			w17.Position = 1;
+			w17.Expand = false;
+			w17.Fill = false;
+			if ((this.Child != null)) {
+				this.Child.ShowAll ();
+			}
+			this.DefaultWidth = 318;
+			this.DefaultHeight = 165;
+			this.Show ();
+			this.source_button.Clicked += new global::System.EventHandler (this.OnSourceButtonClicked);
+			this.destination_button.Clicked += new global::System.EventHandler (this.OnDestinationButtonClicked);
+			this.buttonOk.Clicked += new global::System.EventHandler (this.OnProjectDialogOkClicked);
+		}
+	}
+}

+ 68 - 0
tools/gui/starter/starter.csproj

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProjectGuid>{58CD5858-5E09-42BF-8AB6-93A84328940D}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>starter</RootNamespace>
+    <AssemblyName>starter</AssemblyName>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <DebugType>full</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="gtk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+      <SpecificVersion>False</SpecificVersion>
+    </Reference>
+    <Reference Include="gdk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+      <SpecificVersion>False</SpecificVersion>
+    </Reference>
+    <Reference Include="glib-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+      <SpecificVersion>False</SpecificVersion>
+    </Reference>
+    <Reference Include="glade-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+      <SpecificVersion>False</SpecificVersion>
+    </Reference>
+    <Reference Include="pango-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+      <SpecificVersion>False</SpecificVersion>
+    </Reference>
+    <Reference Include="atk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+      <SpecificVersion>False</SpecificVersion>
+    </Reference>
+    <Reference Include="Mono.Posix" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="gtk-gui\gui.stetic">
+      <LogicalName>gui.stetic</LogicalName>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="gtk-gui\generated.cs" />
+    <Compile Include="MainWindow.cs" />
+    <Compile Include="gtk-gui\MainWindow.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ProjectDialog.cs" />
+    <Compile Include="gtk-gui\starter.ProjectDialog.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>

+ 20 - 0
tools/gui/starter/starter.sln

@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "starter", "starter.csproj", "{58CD5858-5E09-42BF-8AB6-93A84328940D}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|x86 = Debug|x86
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{58CD5858-5E09-42BF-8AB6-93A84328940D}.Debug|x86.ActiveCfg = Debug|x86
+		{58CD5858-5E09-42BF-8AB6-93A84328940D}.Debug|x86.Build.0 = Debug|x86
+		{58CD5858-5E09-42BF-8AB6-93A84328940D}.Release|x86.ActiveCfg = Release|x86
+		{58CD5858-5E09-42BF-8AB6-93A84328940D}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(MonoDevelopProperties) = preSolution
+		StartupItem = starter.csproj
+	EndGlobalSection
+EndGlobal