protected void DrawSectionMissionEntry(Rect rect, int index, bool isActive, bool isFocused)
        {
            var missionIDProperty = List.serializedProperty.GetArrayElementAtIndex(index);

            KMMission mission = KMMissionTableOfContentsEditor.GetMission(missionIDProperty.stringValue);

            string sectionLabel = String.Format("{0}.{1}",
                                                sectionNum,
                                                index + 1);

            EditorGUI.PrefixLabel(new Rect(rect.x, rect.y, 30, EditorGUIUtility.singleLineHeight), new GUIContent(sectionLabel));
            EditorGUI.LabelField(
                new Rect(rect.x + 30, rect.y, 200, EditorGUIUtility.singleLineHeight),
                missionIDProperty.stringValue);

            if (!IsValidMission(missionIDProperty.stringValue))
            {
                EditorGUI.HelpBox(new Rect(rect.x + 30 + 200, rect.y, 200, EditorGUIUtility.singleLineHeight), "Mission not found!", MessageType.Error);
            }
            else if (!IsMissionUnique(missionIDProperty.stringValue))
            {
                EditorGUI.HelpBox(new Rect(rect.x + 30 + 200, rect.y, 100, EditorGUIUtility.singleLineHeight), "Duplicate!", MessageType.Warning);
            }
            else if (mission != null)
            {
                float x = 30 + 200;

                //Display Name
                EditorGUI.LabelField(new Rect(rect.x + x, rect.y, 300, EditorGUIUtility.singleLineHeight),
                                     mission.DisplayName);
                x += 300;
            }
        }
        public TableOfContentsSectionList(
            KMMissionTableOfContentsEditor editor,
            SerializedObject serializedTableOfContents,
            SerializedProperty serializedSection,
            int sectionNum)
        {
            this.editor = editor;
            this.serializedTableOfContents = serializedTableOfContents;
            this.serializedSection         = serializedSection;
            this.sectionNum = sectionNum;

            List = new ReorderableList(
                serializedTableOfContents,
                serializedSection.FindPropertyRelative("MissionIDs"),
                true,
                false,
                true,
                true);

            List.headerHeight = 1;

            List.drawElementCallback   = DrawSectionMissionEntry;
            List.onAddDropdownCallback = ShowAddMissionContextMenu;
            List.onSelectCallback      = OnSelect;
        }
        protected void ShowAddMissionContextMenu(Rect buttonRect, ReorderableList l)
        {
            var menu = new GenericMenu();

            List <String> missionIDs = KMMissionTableOfContentsEditor.GetAllMissions().Where(x => x != null).Select(x => x.ID).ToList();

            for (var i = 0; i < missionIDs.Count; i++)
            {
                menu.AddItem(new GUIContent(missionIDs[i]),
                             false,
                             OnAddMissionContextMenuClick,
                             missionIDs[i]);
            }

            menu.ShowAsContext();
        }
        protected void DrawSectionMissionEntry(Rect rect, int index, bool isActive, bool isFocused)
        {
            //var missionIDProperty = List.serializedProperty.GetArrayElementAtIndex(index);

            //KMMission mission = KMMissionTableOfContentsEditor.GetMission(missionIDProperty.stringValue);

            //string sectionLabel = String.Format("{0}.{1}", sectionNum, index + 1);
            //EditorGUI.PrefixLabel(new Rect(rect.x, rect.y, 30, EditorGUIUtility.singleLineHeight), new GUIContent(sectionNum + "." + (index + 1)));

            string missionID = ((KMMissionTableOfContents)List.serializedProperty.serializedObject.targetObject).Sections[sectionNum - 1].MissionIDs[index];

            EditorGUI.LabelField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), sectionNum + "." + (index + 1) + " " + missionID);

            if (Event.current.type == EventType.ContextClick && rect.Contains(Event.current.mousePosition))
            {
                List <String> missionIDs = KMMissionTableOfContentsEditor.GetAllMissions().Where(x => x != null).Select(x => x.ID).ToList();

                GenericMenu missionMenu = new GenericMenu();
                missionMenu.AddItem(new GUIContent("Delete " + missionID), false, OnDeleteContextMenuClicked, index);
                for (int i = 0; i < missionIDs.Count; i++)
                {
                    int j = i;
                    missionMenu.AddItem(new GUIContent("Insert before " + missionID + "/" + missionIDs[i]), false, () => OnInsertBeforeContextMenuClicked(index, missionIDs[j]));
                }
                missionMenu.ShowAsContext();
            }

            /*if (!IsValidMission(missionIDProperty.stringValue))
             * {
             *  EditorGUI.HelpBox(new Rect(rect.x + 30 + 200, rect.y, 200, EditorGUIUtility.singleLineHeight), "Mission not found!", MessageType.Error);
             * }
             * else if (!IsMissionUnique(missionIDProperty.stringValue))
             * {
             *  EditorGUI.HelpBox(new Rect(rect.x + 30 + 200, rect.y, 100, EditorGUIUtility.singleLineHeight), "Duplicate!", MessageType.Warning);
             * }
             * else if (mission != null)
             * {
             *  float x = 30 + 200;
             *
             *  //Display Name
             *  EditorGUI.LabelField(new Rect(rect.x + x, rect.y, 300, EditorGUIUtility.singleLineHeight),
             *      mission.DisplayName);
             *  x += 300;
             * }*/
        }
        protected void OnSelect(ReorderableList list)
        {
            //Deselect all other section lists, because otherwise each section will have
            //an active selection
            int oldIndex = list.index;

            editor.ClearTableOfContentsSectionSelections();
            list.index = oldIndex;

            SerializedProperty missionIDProperty = list.serializedProperty.GetArrayElementAtIndex(list.index);

            KMMission mission = KMMissionTableOfContentsEditor.GetMission(missionIDProperty.stringValue);

            if (mission != null)
            {
                EditorGUIUtility.PingObject(mission);
            }
        }
 protected bool IsValidMission(String id)
 {
     return(KMMissionTableOfContentsEditor.GetMission(id) != null);
 }