private TiResponse staticProperty(TiRequestParams data)
        {
            if (!data.ContainsKey("className"))
            {
                throw new ReflectionException("\"staticProperty\" request missing \"className\" param");
            }

            string className = (string)data["className"];
            var    classType = InstanceRegistry.lookupType(className);

            if (classType == null)
            {
                throw new ReflectionException("\"staticProperty\" request invalid classname \"" + className + "\"");
            }

            if (!data.ContainsKey("property"))
            {
                throw new ReflectionException("\"staticProperty\" request missing \"property\" param");
            }

            PropertyInfo propertyInfo = classType.GetProperty((string)data["property"]);

            if (propertyInfo == null)
            {
                throw new ReflectionException("\"staticProperty\" request invalid property \"" + data["property"] + "\"");
            }

            object val = propertyInfo.GetValue(null);

            return(InstanceRegistry.createReturnType(val));
        }
        private TiResponse removeEventListener(TiRequestParams data)
        {
            if (!data.ContainsKey("handle"))
            {
                throw new ReflectionException("\"addEventListener\" request missing \"handle\" param");
            }

            string handle   = (string)data["handle"];
            object instance = InstanceRegistry.getInstance(handle);

            if (instance == null)
            {
                throw new ReflectionException("\"addEventListener\" request invalid handle \"" + handle + "\"");
            }

            if (!data.ContainsKey("name"))
            {
                throw new ReflectionException("\"addEventListener\" request missing \"name\" param");
            }

            string   eventName = (string)data["name"];
            var      eventInfo = instance.GetType().GetEvent(eventName);
            Delegate handler   = InstanceRegistry.getDelegate(handle + "." + eventName);

            if (handler != null)
            {
                eventInfo.RemoveEventHandler(instance, handler);
                InstanceRegistry.removeDelegate(handle + "." + eventName);
            }

            return(null);
        }
Exemple #3
0
        protected override void InitializeCore()
        {
            InitializeCommandManager();

            OnAttach <EditorPresenter>(editor => {
                _editor = editor;
                _editor.SyncCurrentProject += EditorSyncCurrentProject;

                InitializeCommandManager(editor);
            });

            OnDetach <EditorPresenter>(editor => {
                BindProject(null);

                _editor.SyncCurrentProject -= EditorSyncCurrentProject;
                _editor = null;
            });

            Components = new InstanceRegistry <ProjectExplorerComponent>();

            _libraryEventBindings = new Dictionary <EventBindings, EventHandler <ResourceEventArgs <Library> > >()
            {
                { EventBindings.LibraryAdded, (s, e) => OnLibraryAdded(new ResourceEventArgs <Library>(e.Resource)) },
                { EventBindings.LibraryRemoved, (s, e) => OnLibraryRemoved(new ResourceEventArgs <Library>(e.Resource)) },
                { EventBindings.LibraryModified, (s, e) => OnLibraryModified(new ResourceEventArgs <Library>(e.Resource)) },
            };

            LibraryManagerTag = Guid.NewGuid();
            ProjectManagerTag = Guid.NewGuid();
        }
Exemple #4
0
 public void InitializeProjectPanelComponents(InstanceRegistry <ProjectPanelComponent> manager)
 {
     foreach (var component in _projectPanelComponents)
     {
         manager.Register(component.Value);
     }
 }
        private void CheckBox_Click(object sender, RoutedEventArgs e)
        {
            InstanceRegistry instanceRegistry = this.ParentWindow.EngineInstanceRegistry;
            bool?            isChecked        = this.mMinimzeOnCloseCheckBox.IsChecked;
            bool             flag             = true;
            int num = !(isChecked.GetValueOrDefault() == flag & isChecked.HasValue) ? 1 : 0;

            instanceRegistry.IsShowMinimizeBlueStacksPopupOnClose = num != 0;
            BlueStacks.Common.Stats.SendCommonClientStatsAsync("notification_mode", "donotshow_checkbox", this.ParentWindow.mVmName, string.Empty, (!this.ParentWindow.EngineInstanceRegistry.IsShowMinimizeBlueStacksPopupOnClose).ToString((IFormatProvider)CultureInfo.InvariantCulture), "", "");
        }
        private TiResponse addEventListener(TiRequestParams data)
        {
            if (!data.ContainsKey("handle"))
            {
                throw new ReflectionException("\"addEventListener\" request missing \"handle\" param");
            }

            string handle   = (string)data["handle"];
            object instance = InstanceRegistry.getInstance(handle);

            if (instance == null)
            {
                throw new ReflectionException("\"addEventListener\" request invalid handle \"" + handle + "\"");
            }

            if (!data.ContainsKey("name"))
            {
                throw new ReflectionException("\"addEventListener\" request missing \"name\" param");
            }

            string eventName = (string)data["name"];
            var    eventInfo = instance.GetType().GetEvent(eventName);

            // create an array of parameters based on the event info
            var parameters = eventInfo.EventHandlerType.GetMethod("Invoke").GetParameters().
                             Select((p, i) => Expression.Parameter(p.ParameterType, "p" + i)).ToArray();

            // construct a new array of parameters to the method we are actually going to call
            // need to pass in extra information so the Proxy knows which callback to fire
            Expression[] pass = new Expression[5];
            parameters.CopyTo(pass, 0);
            pass[2] = Expression.Constant(eventInfo.Name);
            pass[3] = Expression.Constant(handle);
            pass[4] = Expression.Constant(InstanceRegistry.getInstance("browser"));

            // Get method info of the handler we want to call
            MethodInfo           methodInfo = this.GetType().GetMethod("eventHandler", BindingFlags.NonPublic | BindingFlags.Instance);
            MethodCallExpression methodCall = Expression.Call(Expression.Constant(this), methodInfo, pass);

            // Construct a delegate using a lambda expression
            // (Object, EventArgs) => dummyHandler(Object, EventArgs, String, String, WebBrowser)
            var lambda = Expression.Lambda(
                eventInfo.EventHandlerType,
                methodCall,
                parameters
                ).Compile();

            // Hook the event to the delegate
            eventInfo.AddEventHandler(instance, lambda);

            // Store the delegate to remove it later
            InstanceRegistry.addDelegate(handle + "." + eventName, lambda);

            return(null);
        }
        private TiResponse destroy(TiRequestParams data)
        {
            if (!data.ContainsKey("handle"))
            {
                throw new ReflectionException("\"invokeMethod\" request missing \"handle\" param");
            }

            string handle   = (string)data["handle"];
            object instance = InstanceRegistry.getInstance(handle);

            if (instance == null)
            {
                throw new ReflectionException("\"invokeMethod\" request invalid handle \"" + handle + "\"");
            }

            // remove from parent view
            var propertyInfo = instance.GetType().GetProperty("Parent");

            if (propertyInfo != null)
            {
                var parent = propertyInfo.GetValue(instance);
                if (parent != null)
                {
                    propertyInfo = parent.GetType().GetProperty("Children");
                    if (propertyInfo != null)
                    {
                        var children = propertyInfo.GetValue(parent);
                        var remove   = children.GetType().GetMethod("Remove");
                        remove.Invoke(children, new object[] { instance });
                    }
                }
            }

            // call Dispose method
            var dispose = instance.GetType().GetMethod("Dispose");

            if (dispose != null)
            {
                dispose.Invoke(instance, null);
            }

            // call Finalize method
            var finalize = instance.GetType().GetMethod("Finalize");

            if (finalize != null)
            {
                finalize.Invoke(instance, null);
            }

            // remove global reference
            InstanceRegistry.removeInstance(handle);

            return(null);
        }
        private void eventHandler(Object sender, EventArgs e, String eventName, String handle, WebBrowser browser)
        {
            TiResponse response = new TiResponse();

            response["_hnd"] = handle;
            response["type"] = eventName;

            string senderHandle = "";
            bool   senderExists = InstanceRegistry.containsInstance(sender);

            if (senderExists)
            {
                senderHandle = InstanceRegistry.getInstanceHandleByValue(sender);
            }
            else
            {
                senderHandle = InstanceRegistry.createHandle(sender);
            }
            response["sender"] = senderHandle;

            string eventArgsHandle = "";
            bool   eventArgsExists = InstanceRegistry.containsInstance(e);

            if (eventArgsExists)
            {
                eventArgsHandle = InstanceRegistry.getInstanceHandleByValue(e);
            }
            else
            {
                eventArgsHandle = InstanceRegistry.createHandle(e);
            }
            response["eventArgs"] = eventArgsHandle;

            response["error"] = null;
            if (e.GetType() == typeof(ErrorEventArgs))
            {
                response["error"] = ((ErrorEventArgs)e).error;
            }

            browser.InvokeScript("execScript", new string[] { "tiwp8.fireEvent(" + JsonConvert.SerializeObject(response, Formatting.None) + ")" });

            if (!senderExists)
            {
                InstanceRegistry.removeInstance(senderHandle);
            }
            if (!eventArgsExists)
            {
                InstanceRegistry.removeInstance(eventArgsHandle);
            }
        }
Exemple #9
0
        public ProjectPanel()
        {
            InitializeComponent();

            _tree.NodeMouseDoubleClick += TreeNodeDoubleClickHandler;
            _tree.NodeMouseClick       += TreeNodeClickHandler;

            _commandController = new UICommandController();

            ComponentManager = new InstanceRegistry <ProjectPanelComponent>();
            ComponentManager.InstanceRegistered += (s, e) => {
                e.Instance.Initialize(_rootNode);

                if (_controller != null)
                {
                    BindingHelper.TryBindAny(e.Instance, _controller.Components.Select(c => new KeyValuePair <Type, object>(c.Key, c.Value)));
                }
            };

            ResetComponent();
        }
        private TiResponse getEnum(TiRequestParams data)
        {
            if (!data.ContainsKey("name"))
            {
                throw new ReflectionException("\"getEnum\" request missing \"name\" param");
            }

            if (!data.ContainsKey("value"))
            {
                throw new ReflectionException("\"getEnum\" request missing \"value\" param");
            }

            string name  = (string)data["name"];
            string value = (string)data["value"];

            Type t = InstanceRegistry.lookupType(name);

            if (t == null)
            {
                throw new ReflectionException("\"getEnum\" request failed because \"" + name + "\" is an invalid class name");
            }

            object val = null;

            if (t.IsEnum)
            {
                val = Enum.Parse(t, value);
            }
            else
            {
                var prop = t.GetProperty(value);
                if (prop != null)
                {
                    val = prop.GetValue(null, null);
                }
            }

            return(InstanceRegistry.createReturnType(val));
        }
        private TiResponse invokeMethod(TiRequestParams data)
        {
            if (!data.ContainsKey("handle"))
            {
                throw new ReflectionException("\"invokeMethod\" request missing \"handle\" param");
            }

            string handle   = (string)data["handle"];
            object instance = InstanceRegistry.getInstance(handle);

            if (instance == null)
            {
                throw new ReflectionException("\"invokeMethod\" request invalid handle \"" + handle + "\"");
            }

            if (!data.ContainsKey("method"))
            {
                throw new ReflectionException("\"invokeMethod\" request missing \"method\" param");
            }

            if (!data.ContainsKey("args"))
            {
                throw new ReflectionException("\"invokeMethod\" request missing \"args\" param");
            }

            JArray args = (JArray)data["args"];

            if (args.Count % 2 != 0)
            {
                throw new ReflectionException("\"invokeMethod\" request arguments must contain an even number of type-values");
            }

            // create the argument types array
            Type[] fnArgumentTypes = new Type[args.Count / 2];
            for (int i = 0, j = 0; i < args.Count; i += 2, j++)
            {
                fnArgumentTypes[j] = InstanceRegistry.lookupType((string)args[i]);
            }

            // get the method info
            MethodInfo methodInfo = instance.GetType().GetMethod((string)data["method"], fnArgumentTypes);

            if (methodInfo.ReturnType.GetInterfaces().Contains(typeof(IAsyncInfo)))
            {
                throw new Exception("Use invokeMethodAsync() to call this method");
            }

            // create the argument values array
            object[] fnArguments = new object[args.Count / 2];
            for (int i = 1, j = 0; i < args.Count; i += 2, j++)
            {
                JObject arg = (JObject)args[i];
                if (arg["valueHnd"] != null)
                {
                    fnArguments[j] = InstanceRegistry.getInstance((string)arg["valueHnd"]);
                }
                else if (fnArgumentTypes[j] == typeof(Uri))
                {
                    fnArguments[j] = new Uri((string)arg["valuePrimitive"], UriKind.RelativeOrAbsolute);
                }
                else
                {
                    fnArguments[j] = ((JValue)arg["valuePrimitive"]).Value;
                }
                if (fnArguments[j] != null)
                {
                    IConvertible convertible = fnArguments[j] as IConvertible;
                    if (convertible != null)
                    {
                        fnArguments[j] = Convert.ChangeType(fnArguments[j], fnArgumentTypes[j]);
                    }
                }
            }

            // invoke the method
            var result = methodInfo.Invoke(instance, fnArguments);

            if (methodInfo.ReturnType == typeof(void))
            {
                result = null;
            }

            return(InstanceRegistry.createReturnType(result));
        }
Exemple #12
0
 public void InitializeProjectPanelComponents(InstanceRegistry<ProjectPanelComponent> manager)
 {
     foreach (var component in _projectPanelComponents)
         manager.Register(component.Value);
 }
        public async void run(object instance, MethodInfo methodInfo, object[] fnArguments)
        {
            SynchronizationContext ctx = SynchronizationContext.Current;

            if (!methodInfo.ReturnType.GetInterfaces().Contains(typeof(IAsyncInfo)))
            {
                // this should be easy, just run it as if it was synchronous
                var result = methodInfo.Invoke(instance, fnArguments);

                InvokeAsyncEventArgs eventArgs = new InvokeAsyncEventArgs();

                if (methodInfo.ReturnType == typeof(void))
                {
                    eventArgs.primitiveValue = null;
                }
                else
                {
                    Type type = result.GetType();
                    if (type.IsPrimitive || type == typeof(string) || type == typeof(decimal))
                    {
                        eventArgs.primitiveValue = result;
                    }
                    else if (InstanceRegistry.containsInstance(result))
                    {
                        eventArgs.handle = InstanceRegistry.getInstanceHandleByValue(result);
                    }
                    else
                    {
                        string handle = InstanceRegistry.createHandle(result);
                        eventArgs.handle = handle;
                    }
                }

                this.OnComplete(eventArgs);
                return;
            }

            MethodInfo castMethod = Type.GetType("TitaniumApp.TiRequestHandlers.AsyncAwaiter").GetMethod("awaitTask");

            castMethod = castMethod.MakeGenericMethod(methodInfo.ReturnType.GenericTypeArguments[0]);

            InvokeAsync _this = this;

            Task.Run(() => {
                var comObject = methodInfo.Invoke(instance, fnArguments);

                Task <object> obj = (Task <object>)castMethod.Invoke(null, new object[] { comObject });
                obj.Wait();
                var result = obj.Result;

                InvokeAsyncEventArgs eventArgs = new InvokeAsyncEventArgs();

                if (methodInfo.ReturnType == typeof(void))
                {
                    eventArgs.primitiveValue = null;
                }
                else
                {
                    Type type = result.GetType();
                    if (type.IsPrimitive || type == typeof(string) || type == typeof(decimal))
                    {
                        eventArgs.primitiveValue = result;
                    }
                    else if (InstanceRegistry.containsInstance(result))
                    {
                        eventArgs.handle = InstanceRegistry.getInstanceHandleByValue(result);
                    }
                    else
                    {
                        string handle    = InstanceRegistry.createHandle(result);
                        eventArgs.handle = handle;
                    }
                }

                ctx.Post(args => {
                    _this.OnComplete((InvokeAsyncEventArgs)args);
                }, eventArgs);
            });
        }
        public TiResponse process(TiRequestParams data)
        {
            if (!data.ContainsKey("url"))
            {
                throw new DownloadException("Request missing 'url' param");
            }

            string url = (string)data["url"];

            if (!url.StartsWith("http://") && !url.StartsWith("https://"))
            {
                throw new DownloadException("'url' param must start with 'http://' or 'https://'");
            }

            string saveTo = "";
            int    p;

            if (data.ContainsKey("saveTo"))
            {
                saveTo = (string)data["saveTo"];
            }
            else
            {
                // try to determine the filename based on the URL
                p = url.LastIndexOf('/');
                if (p > 8 && p != -1)                   // make sure the last / is after the ://
                {
                    saveTo = url.Substring(p + 1);
                }
                else
                {
                    throw new DownloadException("Request missing 'saveTo' param");
                }
            }

            if (saveTo == null || saveTo == "")
            {
                throw new DownloadException("Invalid 'saveTo' param");
            }

            saveTo = saveTo.Replace('\\', '/');

            IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();

            p = saveTo.LastIndexOf('\\');
            if (p != -1)
            {
                string dir = saveTo.Substring(0, p);
                try {
                    if (!isf.DirectoryExists(dir))
                    {
                        isf.CreateDirectory(dir);
                    }
                } catch (IsolatedStorageException) {
                    throw new DownloadException("Unable to create destination directory '" + dir + "' because of insufficient permissions or the isolated storage has been disabled or removed");
                }
            }

            if (isf.FileExists(saveTo))
            {
                if (data.ContainsKey("overwrite") && (bool)data["overwrite"])
                {
                    isf.DeleteFile(saveTo);
                }
                else
                {
                    throw new DownloadException("File '" + saveTo + "' already exists");
                }
            }

            IsolatedStorageFileStream fileStream = null;

            try {
                fileStream = isf.CreateFile(saveTo);
            } catch (IsolatedStorageException) {
                throw new DownloadException("Unable to create file '" + saveTo + "' because the isolated storage has been disabled or removed");
            } catch (DirectoryNotFoundException) {
                throw new DownloadException("Unable to create file '" + saveTo + "' because the directory does not exist");
            } catch (ObjectDisposedException) {
                throw new DownloadException("Unable to create file '" + saveTo + "' because the isolated storage has been disposed");
            }

            TiResponse   response = new TiResponse();
            DownloadFile df       = new DownloadFile(SynchronizationContext.Current, new Uri(url), fileStream);

            response["handle"] = InstanceRegistry.createHandle(df);

            return(response);
        }
        private TiResponse property(TiRequestParams data)
        {
            if (!data.ContainsKey("handle"))
            {
                throw new ReflectionException("\"property\" request missing \"handle\" param");
            }

            string handle   = (string)data["handle"];
            object instance = InstanceRegistry.getInstance(handle);

            if (instance == null)
            {
                throw new ReflectionException("\"property\" request invalid handle \"" + handle + "\"");
            }

            if (!data.ContainsKey("name"))
            {
                throw new ReflectionException("\"property\" request missing \"name\" param");
            }

            var obj = data["name"];

            if (obj == null)
            {
                throw new ReflectionException("\"property\" request \"name\" is null");
            }

            Type instanceType = instance.GetType();
            Type propType     = instanceType.GetType();

            TiResponse response = new TiResponse();

            response["value"] = null;

            switch (obj.GetType().ToString())
            {
            case "Newtonsoft.Json.Linq.JArray":
            {
                // get multiple props
                JArray arr = (JArray)obj;
                Dictionary <string, TiResponse> value = new Dictionary <string, TiResponse>();
                for (var i = 0; i < arr.Count; i++)
                {
                    string propName     = arr[i].ToString();
                    var    propertyInfo = instanceType.GetProperty(propName);
                    if (propertyInfo == null)
                    {
                        throw new ReflectionException("Invalid property \"" + propName + "\"");
                    }
                    object val = propertyInfo.GetValue(instance);
                    value[propName] = InstanceRegistry.createReturnType(val);
                }
                response["value"] = value;
                return(response);
            }

            case "Newtonsoft.Json.Linq.JObject":
            {
                // set multiple props
                JObject props = (JObject)obj;
                foreach (JProperty prop in props.Properties())
                {
                    var propertyInfo = instanceType.GetProperty(prop.Name);
                    if (propertyInfo == null)
                    {
                        throw new ReflectionException("Invalid property \"" + prop.Name + "\"");
                    }
                    JObject value = (JObject)prop.Value;
                    if (value["valueHnd"] != null)
                    {
                        propertyInfo.SetValue(instance, InstanceRegistry.getInstance((string)value["valueHnd"]));
                    }
                    else if (value["valuePrimitive"] != null)
                    {
                        var valuePrimitive = value["valuePrimitive"];
                        if (propertyInfo.PropertyType == typeof(Uri))
                        {
                            propertyInfo.SetValue(instance, Convert.ChangeType(new Uri(valuePrimitive.ToObject <string>(), UriKind.RelativeOrAbsolute), propertyInfo.PropertyType));
                        }
                        else
                        {
                            propertyInfo.SetValue(instance, valuePrimitive.ToObject(propertyInfo.PropertyType));
                        }
                    }
                }

                return(null);
            }

            case "System.String":
            {
                string name         = (string)obj;
                var    propertyInfo = instanceType.GetProperty(name);
                if (propertyInfo == null)
                {
                    throw new ReflectionException("Invalid property \"" + name + "\"");
                }

                // setting a single prop
                if (data.ContainsKey("valueHnd") && data["valueHnd"] != null)
                {
                    propertyInfo.SetValue(instance, InstanceRegistry.getInstance((string)data["valueHnd"]));
                    return(null);
                }
                else if (data.ContainsKey("valuePrimitive"))
                {
                    var valuePrimitive = data["valuePrimitive"];
                    if (propertyInfo.PropertyType == typeof(Uri))
                    {
                        valuePrimitive = new Uri((string)valuePrimitive, UriKind.RelativeOrAbsolute);
                    }
                    propertyInfo.SetValue(instance, Convert.ChangeType(valuePrimitive, propertyInfo.PropertyType));
                    return(null);
                }

                // getting a single prop
                object val = propertyInfo.GetValue(instance);
                return(InstanceRegistry.createReturnType(val));
            }
            }

            return(null);
        }
        private TiResponse invokeStaticAsync(TiRequestParams data)
        {
            if (!data.ContainsKey("className"))
            {
                throw new ReflectionException("\"invokeStatic\" request missing \"className\" param");
            }

            string className = (string)data["className"];
            var    classType = InstanceRegistry.lookupType(className);

            if (classType == null)
            {
                throw new ReflectionException("\"invokeStatic\" request invalid classname \"" + className + "\"");
            }

            if (!data.ContainsKey("method"))
            {
                throw new ReflectionException("\"invokeStatic\" request missing \"method\" param");
            }

            if (!data.ContainsKey("args"))
            {
                throw new ReflectionException("\"invokeStatic\" request missing \"args\" param");
            }

            JArray args = (JArray)data["args"];

            if (args.Count % 2 != 0)
            {
                throw new ReflectionException("\"invokeStatic\" request arguments must contain an even number of type-values");
            }

            // create the argument types array
            Type[] fnArgumentTypes = new Type[args.Count / 2];
            for (int i = 0, j = 0; i < args.Count; i += 2, j++)
            {
                fnArgumentTypes[j] = InstanceRegistry.lookupType((string)args[i]);
            }

            // get the method info
            MethodInfo methodInfo = classType.GetMethod((string)data["method"], fnArgumentTypes);

            // create the argument values array
            object[] fnArguments = new object[args.Count / 2];
            for (int i = 1, j = 0; i < args.Count; i += 2, j++)
            {
                JObject arg = (JObject)args[i];
                if (arg["valueHnd"] != null)
                {
                    fnArguments[j] = InstanceRegistry.getInstance((string)arg["valueHnd"]);
                }
                else if (fnArgumentTypes[j] == typeof(Uri))
                {
                    fnArguments[j] = new Uri((string)arg["valuePrimitive"], UriKind.RelativeOrAbsolute);
                }
                else
                {
                    fnArguments[j] = ((JValue)arg["valuePrimitive"]).Value;
                }
                if (fnArguments[j] != null)
                {
                    IConvertible convertible = fnArguments[j] as IConvertible;
                    if (convertible != null)
                    {
                        fnArguments[j] = Convert.ChangeType(fnArguments[j], fnArgumentTypes[j]);
                    }
                }
            }

            TiResponse  response = new TiResponse();
            InvokeAsync ia       = new InvokeAsync();

            response["handle"] = InstanceRegistry.createHandle(ia);
            ia.run(null, methodInfo, fnArguments);

            return(response);
        }
 public ReflectionRequestHandler(Microsoft.Phone.Controls.PhoneApplicationPage app, WebBrowser browser, System.Windows.Controls.Grid root)
 {
     InstanceRegistry.addInstance("app", app);
     InstanceRegistry.addInstance("browser", browser);
     InstanceRegistry.addInstance("root", root);
 }
        protected override void InitializeCore()
        {
            InitializeCommandManager();

            OnAttach<EditorPresenter>(editor => {
                _editor = editor;
                _editor.SyncCurrentProject += EditorSyncCurrentProject;

                InitializeCommandManager(editor);
            });

            OnDetach<EditorPresenter>(editor => {
                BindProject(null);

                _editor.SyncCurrentProject -= EditorSyncCurrentProject;
                _editor = null;
            });

            Components = new InstanceRegistry<ProjectExplorerComponent>();

            _libraryEventBindings = new Dictionary<EventBindings, EventHandler<ResourceEventArgs<Library>>>() {
                { EventBindings.LibraryAdded, (s, e) => OnLibraryAdded(new ResourceEventArgs<Library>(e.Resource)) },
                { EventBindings.LibraryRemoved, (s, e) => OnLibraryRemoved(new ResourceEventArgs<Library>(e.Resource)) },
                { EventBindings.LibraryModified, (s, e) => OnLibraryModified(new ResourceEventArgs<Library>(e.Resource)) },
            };

            LibraryManagerTag = Guid.NewGuid();
            ProjectManagerTag = Guid.NewGuid();
        }
        private TiResponse createInstance(TiRequestParams data)
        {
            if (!data.ContainsKey("className"))
            {
                throw new ReflectionException("\"createInstance\" request missing \"className\" param");
            }

            string className = (string)data["className"];
            var    classType = InstanceRegistry.lookupType(className);

            if (classType == null)
            {
                throw new ReflectionException("\"createInstance\" request invalid classname \"" + classType + "\"");
            }

            if (!data.ContainsKey("args"))
            {
                throw new ReflectionException("\"createInstance\" request missing \"args\" param");
            }

            JArray args = (JArray)data["args"];

            if (args.Count % 2 != 0)
            {
                throw new ReflectionException("\"createInstance\" request arguments must contain an even number of type-values");
            }

            // create the argument types array
            Type[] ctorArgumentTypes = new Type[args.Count / 2];
            for (int i = 0, j = 0; i < args.Count; i += 2, j++)
            {
                ctorArgumentTypes[j] = InstanceRegistry.lookupType((string)args[i]);
            }

            // create the argument values array
            object[] ctorArguments = new object[args.Count / 2];
            for (int i = 1, j = 0; i < args.Count; i += 2, j++)
            {
                JObject arg = (JObject)args[i];
                if (arg["valueHnd"] != null)
                {
                    ctorArguments[j] = InstanceRegistry.getInstance((string)arg["valueHnd"]);
                }
                else if (ctorArgumentTypes[j] == typeof(Uri))
                {
                    ctorArguments[j] = new Uri((string)arg["valuePrimitive"], UriKind.RelativeOrAbsolute);
                }
                else
                {
                    ctorArguments[j] = ((JValue)arg["valuePrimitive"]).Value;
                }
                if (ctorArguments[j] != null)
                {
                    ctorArguments[j] = Convert.ChangeType(ctorArguments[j], ctorArgumentTypes[j]);
                }
            }

            // Invoke the constructor and return the result
            var instance = classType.GetConstructor(ctorArgumentTypes).Invoke(ctorArguments);

            TiResponse response = new TiResponse();

            response["handle"] = InstanceRegistry.createHandle(instance);
            return(response);
        }