private string[] GetSources(PlaymakerNoesisProxy proxy)
    {
        List <string> sources = new List <string>();

        sources.Add("None");

        sources.Add("UIElement/MouseEnter");
        sources.Add("UIElement/MouseDown");
        sources.Add("UIElement/MouseLeftButtonDown");
        sources.Add("UIElement/MouseRightButtonDown");
        sources.Add("UIElement/MouseUp");
        sources.Add("UIElement/MouseLeftButtonUp");
        sources.Add("UIElement/MouseRightButtonDown");
        sources.Add("UIElement/MouseWheel");
        sources.Add("UIElement/MouseLeave");
        sources.Add("UIElement/TouchEnter");
        sources.Add("UIElement/TouchDown");
        sources.Add("UIElement/TouchUp");
        sources.Add("UIElement/TouchLeave");

        sources.Add("FrameworkElement/Loaded");
        sources.Add("FrameworkElement/Unloaded");
        sources.Add("FrameworkElement/SizeChanged");

        sources.Add("Control/MouseDoubleClick");

        sources.Add("TextBoxBase/SelectionChanged");
        sources.Add("TextBoxBase/TextChanged");

        sources.Add("ButtonBase/Click");

        sources.Add("ToggleButton/Checked");
        sources.Add("ToggleButton/Indeterminate");
        sources.Add("ToggleButton/Unchecked");

        sources.Add("Expander/Collapsed");
        sources.Add("Expander/Expanded");

        sources.Add("ListBoxItem/Selected");
        sources.Add("ListBoxItem/Unselected");

        sources.Add("ScrollViewer/ScrollChanged");

        sources.Add("ToolTip/Closed");
        sources.Add("ToolTip/Opened");

        sources.Add("ContextMenu/Closed");
        sources.Add("ContextMenu/Opened");

        sources.Add("MenuItem/Checked");
        sources.Add("MenuItem/Click");
        sources.Add("MenuItem/SubmenuClosed");
        sources.Add("MenuItem/SubmenuOpened");
        sources.Add("MenuItem/Unchecked");

        sources.Add("TreeViewItem/Collapsed");
        sources.Add("TreeViewItem/Expanded");
        sources.Add("TreeViewItem/Selected");
        sources.Add("TreeViewItem/Unselected");

        sources.Add("Selector/SelectionChanged");

        sources.Add("TreeView/SelectedItemChanged");

        sources.Add("PasswordBox/PasswordChanged");

        sources.Add("RangeBase/ValueChanged");

        sources.Add("ScrollBar/Scroll");

        return(sources.ToArray());
    }
    public override void OnInspectorGUI()
    {
        PlaymakerNoesisProxy proxy = (PlaymakerNoesisProxy)target;

        if (proxy.GetComponent <NoesisGUIPanel>() == null)
        {
            ErrorFeedbackGui("NoesisGUIPanel component not found");
            return;
        }

        proxy.fsmOption = (OwnerDefaultOption)EditorGUILayout.EnumPopup("FSM", proxy.fsmOption);
        if (proxy.fsmOption == OwnerDefaultOption.SpecifyGameObject)
        {
            EditorGUI.indentLevel++;
            proxy.fsm = (PlayMakerFSM)EditorGUILayout.ObjectField("Game Object", proxy.fsm, typeof(PlayMakerFSM), true);
            EditorGUI.indentLevel--;
        }
        else
        {
            proxy.fsm = proxy.gameObject.GetComponent <PlayMakerFSM>();
        }

        if (proxy.fsm == null)
        {
            ErrorFeedbackGui("PlayMakerFSM component not found");
            return;
        }

        proxy.x_Name = EditorGUILayout.TextField("x:Name", proxy.x_Name);

        var sources = GetSources(proxy);
        var targets = GetTargets(proxy.fsm);

        EditorGUILayout.Space();

        for (int i = 0; i < proxy.handlers.Count; i++)
        {
            EditorGUILayout.BeginHorizontal();
            var handler = proxy.handlers[i];

            int sourceIndex = Math.Max(0, Array.IndexOf <string>(sources, handler.source));
            handler.source = sources[EditorGUILayout.Popup(sourceIndex, sources)];

            int targetIndex = Math.Max(0, Array.IndexOf <string>(targets, handler.target));
            handler.target = targets[EditorGUILayout.Popup(targetIndex, targets)];

            proxy.handlers[i] = handler;

            if (GUILayout.Button("X"))
            {
                proxy.handlers.Remove(handler);
            }

            EditorGUILayout.EndHorizontal();
        }

        if (GUILayout.Button("Add Handler"))
        {
            var handler = new PlaymakerNoesisProxy.Handler()
            {
                source = "", target = ""
            };
            proxy.handlers.Add(handler);
        }
    }