static public void OnRemove(PEExposedPropertiesEditor editor, int propertyId)
 {
     editor.targets.Foreach(t => t.Properties.Remove(propertyId));
     editor.Build(true);
     Event.current.Use();
     Resources.FindObjectsOfTypeAll <Editor>()[0].Repaint();
     GUIUtility.ExitGUI();
 }
        static public void OnAdd(PEExposedPropertiesEditor editor, int parentId = 0)
        {
            var lr = GUILayoutUtility.GetLastRect();

            if (lr.min == Vector2.zero)
            {
                lr.center = Event.current.mousePosition;
            }
            lr.center = GUIUtility.GUIToScreenPoint(lr.center);
            var menu = new GenericMenu();

            menu.AddItem(new GUIContent("Property"), false, () =>
            {
                PEPropertyPickerWindow.OnPropertyPickerDelegate onChanged = property =>
                {
                    var newProperty          = new ExposedProperty();
                    newProperty.Label        = property.GetDisplayName();
                    newProperty.PropertyPath = property.propertyPath;
                    newProperty.Target       = property.serializedObject.targetObject;
                    newProperty.ParentId     = parentId;
                    editor.targets[0].Properties.Add(newProperty);
                    newProperty.Order = editor.targets[0].Properties.OrderedItems.Any() ? editor.targets[0].Properties.OrderedItems.Max(i => i.Order + 10) : 0;
                    editor.Build(true);

                    Event.current.Use();

                    Resources.FindObjectsOfTypeAll <Editor>()[0].Repaint();
                    GUIUtility.ExitGUI();
                };
                EditorApplication.delayCall += () =>
                                               PEPropertyPickerWindow.Show(editor.targets[0].gameObject, onChanged, lr);
            });
            menu.AddItem(new GUIContent("Group"), false, () =>
                         EditorApplication.delayCall += () =>
            {
                editor.targets[0].Properties.Add(new ExposedPropertyGroup {
                    Label = "Property Group", ParentId = parentId,
                    Order = editor.targets[0].Properties.OrderedItems.Any() ? editor.targets[0].Properties.OrderedItems.Max(i => i.Order + 10) : 0
                });
                editor.Build(true);
            });
            menu.ShowAsContext();
        }
        static public void OnEdit(PEExposedPropertiesEditor editor, ItemDrawer propertyToEdit)
        {
            var lr = GUILayoutUtility.GetLastRect();

            if (lr.min == Vector2.zero)
            {
                lr.center = Event.current.mousePosition;
            }

            var p = propertyToEdit.ExposedData.First() as ExposedProperty;

            lr.center = GUIUtility.GUIToScreenPoint(lr.center);

            PEPropertyPickerWindow.OnPropertyPickerDelegate onChanged = property =>
            {
                var newProperty = p;
                newProperty.Label        = property.GetDisplayName();
                newProperty.PropertyPath = property.propertyPath;
                newProperty.Target       = property.serializedObject.targetObject;
                editor.Build(true);
            };
            EditorApplication.delayCall += () =>
                                           PEPropertyPickerWindow.Show(editor.targets[0].gameObject, onChanged, lr, null, propertyToEdit.Property);
        }
		static public void OnEdit(PEExposedPropertiesEditor editor, ItemDrawer propertyToEdit)
		{
			var lr = GUILayoutUtility.GetLastRect();

			if (lr.min == Vector2.zero)
				lr.center = Event.current.mousePosition;

			var p = propertyToEdit.ExposedData.First() as ExposedProperty;
			lr.center = GUIUtility.GUIToScreenPoint(lr.center);

			PEPropertyPickerWindow.OnPropertyPickerDelegate onChanged = property =>
			{
				var newProperty = p;
				newProperty.Label = property.GetDisplayName();
				newProperty.PropertyPath = property.propertyPath;
				newProperty.Target = property.serializedObject.targetObject;
				editor.Build(true);
			};
			EditorApplication.delayCall += () =>
				PEPropertyPickerWindow.Show(editor.targets[0].gameObject, onChanged, lr, null, propertyToEdit.Property);
		}
		static public void OnAdd(PEExposedPropertiesEditor editor, int parentId = 0)
		{
			var lr = GUILayoutUtility.GetLastRect();
			if (lr.min == Vector2.zero)
				lr.center = Event.current.mousePosition;
			lr.center = GUIUtility.GUIToScreenPoint(lr.center);
			var menu = new GenericMenu();
			menu.AddItem(new GUIContent("Property"), false, () =>
			{
				PEPropertyPickerWindow.OnPropertyPickerDelegate onChanged = property =>
				{
					var newProperty = new ExposedProperty();
					newProperty.Label = property.GetDisplayName();
					newProperty.PropertyPath = property.propertyPath;
					newProperty.Target = property.serializedObject.targetObject;
					newProperty.ParentId = parentId;
					editor.targets[0].Properties.Add(newProperty);
					newProperty.Order = editor.targets[0].Properties.OrderedItems.Any() ? editor.targets[0].Properties.OrderedItems.Max(i => i.Order + 10) : 0;
					editor.Build(true);

					Event.current.Use();

					Resources.FindObjectsOfTypeAll<Editor>()[0].Repaint();
					GUIUtility.ExitGUI();
				};
				EditorApplication.delayCall += () =>
					PEPropertyPickerWindow.Show(editor.targets[0].gameObject, onChanged, lr);
			});
			menu.AddItem(new GUIContent("Group"), false, () =>
					EditorApplication.delayCall += () =>
			{
				editor.targets[0].Properties.Add(new ExposedPropertyGroup {
					Label = "Property Group", ParentId = parentId,
					Order = editor.targets[0].Properties.OrderedItems.Any() ? editor.targets[0].Properties.OrderedItems.Max(i => i.Order + 10) : 0
				});
				editor.Build(true);
			});
			menu.ShowAsContext();
		}
		static public void OnRemove(PEExposedPropertiesEditor editor, int propertyId)
		{
			editor.targets.Foreach(t => t.Properties.Remove(propertyId));
			editor.Build(true);
			Event.current.Use();
			Resources.FindObjectsOfTypeAll<Editor>()[0].Repaint();
			GUIUtility.ExitGUI();
		}