void OnGUI()
        {
            if (!m_Initialized)
            {
                InitializeStyles();
                InitializePositionAndSize();

                m_Initialized = true;
            }

            EditorGUILayout.BeginVertical(BorderStyle);

            DrawContent();

            GUILayout.FlexibleSpace();

            using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar, GUILayout.ExpandWidth(true))) {
                DrawStatusBar();
            }

            EditorGUILayout.EndVertical();

            if (m_ConflictsScanState == ConflictsScanState.Scanning && Event.current.type == EventType.Repaint)
            {
                if (!m_ConflictsScanThread.IsAlive)
                {
                    m_ConflictsScanState = ConflictsScanState.Scanned;
                }

                Repaint();
            }
        }
        private void InvaldateConflictsScan()
        {
            m_ConflictsScanState = ConflictsScanState.None;

            m_ConflictsScanResults = new ConflictsScanResult[0];

            if (m_ConflictsScanThread != null && m_ConflictsScanThread.IsAlive)
            {
                m_ConflictsScanThread.Abort();
                m_ConflictsScanThread = null;
            }
        }
        private void StartConflictsScan()
        {
            if (Database.IsUpdating || !Database.IsReady)
            {
                m_ConflictsScanState = ConflictsScanState.WaitingForBranchesDatabase;
                return;
            }

            if (Database.LastError != ListOperationResult.Success)
            {
                m_ConflictsScanState = ConflictsScanState.Error;
                return;
            }

            if (m_TargetAsset == null || Database.BranchProjects.Count == 0)
            {
                m_ConflictsScanState = ConflictsScanState.Error;
                return;
            }

            if (m_ConflictsScanState == ConflictsScanState.Scanning)
            {
                return;
            }

            if (m_ConflictsScanThread != null && m_ConflictsScanThread.IsAlive)
            {
                throw new System.Exception("Starting conflicts scan while another one is pending?");
            }

            m_ConflictsScanState = ConflictsScanState.Scanning;

            m_ConflictsScanResults = Database.BranchProjects
                                     .Select(bp => new ConflictsScanResult()
            {
                UnityURL = bp.UnityProjectURL, State = ConflictState.Pending
            })
                                     .ToArray();

            m_ConflictsScanThread = new System.Threading.Thread(GatherConflicts);

            // Thread will update the array by ref.
            m_ConflictsScanThread.Start(new ConflictsScanJobData()
            {
                TargetAssetPath = AssetDatabase.GetAssetPath(m_TargetAsset),
                LimitType       = m_ConflictsScanLimitType,
                LimitParam      = m_ConflictsScanLimitParam,
                Reults          = m_ConflictsScanResults,
            });
        }