Exemple #1
0
        public IEnumerable <object> GetChildren(object parent)
        {
            DomNode domNode = parent.As <DomNode>();

            if (domNode != null)
            {
                GameReference gameRef = domNode.As <GameReference>();
                if (gameRef != null && gameRef.Target != null)
                {
                    domNode = gameRef.Target.As <DomNode>();
                }
                domNode = LevelEditorXLE.Patches.GetReferenceTarget(domNode);

                foreach (ChildInfo childInfo in domNode.Type.Children)
                {
                    // todo use schema annotatoin to mark types that need to have ref slot.
                    bool isReference = Schema.gameObjectReferenceType.Type.IsAssignableFrom(childInfo.Type) ||
                                       Schema.resourceReferenceType.Type.IsAssignableFrom(childInfo.Type) ||
                                       LevelEditorXLE.Patches.IsReferenceType(childInfo.Type);

                    bool hasChild = false;
                    foreach (DomNode child in domNode.GetChildren(childInfo))
                    {
                        hasChild = true;
                        if (child.Is <IListable>())
                        {
                            yield return(child);
                        }
                    }
                    if ((hasChild == false || childInfo.IsList) && isReference)
                    {
                        yield return(new Slot(domNode, childInfo));
                    }
                }
            }
        }
Exemple #2
0
        void ICommandClient.DoCommand(object commandTag)
        {
            var target = TreeControlAdapter.LastHit;

            // If the command isn't one of our immediate commands, it
            // might belong to one of our sub providers.
            // Try to cast the targetted node to a command client and
            // execute from there
            if (!(commandTag is Command))
            {
                var targetClient = target.As <ICommandClient>();
                if (targetClient != null)
                {
                    targetClient.DoCommand(commandTag);
                }
                return;
            }

            IDocument gameDocument = null;
            string    filePath     = null;

            IGame game = target.As <IGame>();

            if (game == null)
            {
                GameReference gameRef = target.As <GameReference>();
                if (gameRef != null)
                {
                    game = gameRef.Target;
                }
            }

            if (game != null)
            {
                gameDocument = game.As <IDocument>();
            }

            switch ((Command)commandTag)
            {
            case Command.CreateNewSubGame:
                if (gameDocument != null)
                {
                    filePath = Util.GetFilePath(m_fileFilter,
                                                System.IO.Path.GetDirectoryName(gameDocument.Uri.LocalPath), true);
                    if (!string.IsNullOrEmpty(filePath))
                    {
                        try
                        {
                            if (!m_gameEditor.Info.IsCompatiblePath(filePath))
                            {
                                throw new Exception("Incompatible file type " + filePath);
                            }

                            Uri ur = new Uri(filePath);
                            if (m_gameDocumentRegistry.FindDocument(ur) != null)
                            {
                                throw new Exception(filePath + " is already open");
                            }
                            GameDocument subGame = GameDocument.OpenOrCreate(ur, m_schemaLoader);
                            subGame.Dirty = true;
                            GameReference gameRef = GameReference.CreateNew(subGame);

                            // try all implementation of IHierarchical until one works
                            var parent = game.AsAll <IHierarchical>();
                            foreach (var p in parent)
                            {
                                if (p.AddChild(gameRef))
                                {
                                    break;
                                }
                            }

                            // because we performing this operation outside of TransactionContext
                            // we must set Document Dirty flag.
                            gameDocument.Dirty = true;
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(m_mainWindow.DialogOwner, ex.Message);
                        }
                    }
                }
                break;

            case Command.AddSubGame:
                if (gameDocument != null)
                {
                    filePath = Util.GetFilePath(m_fileFilter,
                                                System.IO.Path.GetDirectoryName(gameDocument.Uri.LocalPath),
                                                false);

                    if (!string.IsNullOrEmpty(filePath))
                    {
                        try
                        {
                            if (!m_gameEditor.Info.IsCompatiblePath(filePath))
                            {
                                throw new Exception("Incompatible file type " + filePath);
                            }

                            Uri ur = new Uri(filePath);
                            if (m_gameDocumentRegistry.FindDocument(ur) != null)
                            {
                                throw new Exception(filePath + " is already open");
                            }

                            GameReference gameRef = GameReference.CreateNew(ur);
                            gameRef.Resolve();

                            // try all implementation of IHierarchical until one works
                            var parent = game.AsAll <IHierarchical>();
                            foreach (var p in parent)
                            {
                                if (p.AddChild(gameRef))
                                {
                                    break;
                                }
                            }

                            // because we performing this operation outside of TransactionContext
                            // we must set Document Dirty flag.
                            gameDocument.Dirty = true;
                            RefreshLayerContext();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(m_mainWindow.DialogOwner, ex.Message);
                        }
                    }
                }
                break;

            case Command.Exclude:
            {
                GameReference gameRef = target.As <GameReference>();
                if (gameRef == null)
                {
                    break;
                }

                gameDocument = gameRef.DomNode.Parent.Cast <IDocument>();
                IGameDocument subDoc = gameRef.Target.Cast <IGameDocument>();

                bool exclue = true;
                bool save   = false;
                if (subDoc.Dirty)
                {
                    string       msg       = "Save changes\r\n" + subDoc.Uri.LocalPath;
                    DialogResult dlgResult =
                        MessageBox.Show(m_mainWindow.DialogOwner, msg, m_mainWindow.Text
                                        , MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                    save   = dlgResult == DialogResult.Yes;
                    exclue = dlgResult != DialogResult.Cancel;
                }

                if (save)
                {
                    subDoc.Save(subDoc.Uri, m_schemaLoader);
                }

                if (exclue)
                {
                    gameRef.DomNode.RemoveFromParent();
                    // because we performing this operation outside of TransactionContext
                    // we must set Document Dirty flag.
                    gameDocument.Dirty = true;
                    UpdateGameObjectReferences();
                    RefreshLayerContext();
                }
            }
            break;

            case Command.Resolve:
            {
                bool          madeChange = false;
                GameReference gameRef    = target.As <GameReference>();
                if (gameRef != null)
                {
                    gameRef.Resolve();
                    madeChange = true;
                }
                else
                {
                    var resolveable = target.As <IResolveable>();
                    if (resolveable != null && !resolveable.IsResolved())
                    {
                        resolveable.Resolve();
                        madeChange = true;
                    }
                }

                if (madeChange)
                {
                    TreeControlAdapter.Refresh(target);
                    RefreshLayerContext();
                }
            }
            break;

            case Command.Unresolve:
            {
                try
                {
                    GameReference gameRef = target.As <GameReference>();
                    if (gameRef != null)
                    {
                        IGameDocument subDoc    = gameRef.Target.Cast <IGameDocument>();
                        bool          unresolve = true;
                        bool          save      = false;
                        if (subDoc.Dirty)
                        {
                            string       msg       = "Save changes\r\n" + subDoc.Uri.LocalPath;
                            DialogResult dlgResult =
                                MessageBox.Show(m_mainWindow.DialogOwner, msg, m_mainWindow.Text
                                                , MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                            save      = dlgResult == DialogResult.Yes;
                            unresolve = dlgResult != DialogResult.Cancel;
                        }
                        //cando = gameRef != null && gameRef.Target != null;
                        if (save)
                        {
                            subDoc.Save(subDoc.Uri, m_schemaLoader);
                        }
                        if (unresolve)
                        {
                            gameRef.Unresolve();
                            UpdateGameObjectReferences();
                            RefreshLayerContext();
                        }
                        TreeControlAdapter.Refresh(gameRef);
                    }
                    else
                    {
                        var resolveable = target.As <IResolveable>();
                        if (resolveable != null && resolveable.IsResolved())
                        {
                            resolveable.Unresolve();
                            RefreshLayerContext();
                            TreeControlAdapter.Refresh(target);
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(m_mainWindow.DialogOwner, ex.Message);
                }
            }
            break;

            case Command.CreateNewResolveable:
            {
                try
                {
                    var resolveable = target.As <IResolveable>();
                    if (resolveable != null && !resolveable.IsResolved() && resolveable.CanCreateNew())
                    {
                        resolveable.CreateAndResolve();
                        RefreshLayerContext();
                        TreeControlAdapter.Refresh(target);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(m_mainWindow.DialogOwner, ex.Message);
                }
            }
            break;

            case Command.SaveSubDoc:
            {
                try
                {
                    var resolveable = target.As <IResolveable>();
                    if (resolveable != null && resolveable.CanSave())
                    {
                        resolveable.Save(m_schemaLoader);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(m_mainWindow.DialogOwner, ex.Message);
                }
            }
            break;

            default:
                throw new ArgumentOutOfRangeException("commandTag");
            }
            m_designView.InvalidateViews();
            Refresh();
        }
Exemple #3
0
        bool ICommandClient.CanDoCommand(object commandTag)
        {
            var target = TreeControlAdapter.LastHit;

            if (!(commandTag is Command))
            {
                var targetClient = target.As <ICommandClient>();
                if (targetClient != null)
                {
                    return(targetClient.CanDoCommand(commandTag));
                }
                return(false);
            }

            bool cando = false;

            switch ((Command)commandTag)
            {
            case Command.CreateNewSubGame:
            case Command.AddSubGame:
            {
                IGame game = target.As <IGame>();
                if (game == null)
                {
                    GameReference gameRef = target.As <GameReference>();
                    game = (gameRef != null) ? gameRef.Target : null;
                }
                cando = game != null;
            }
            break;

            case Command.Exclude:
                cando = target.Is <GameReference>();
                break;

            case Command.Resolve:
            {
                GameReference gameRef = target.As <GameReference>();
                cando = gameRef != null && gameRef.Target == null;

                if (!cando)
                {
                    var resolveable = target.As <IResolveable>();
                    cando = resolveable != null && !resolveable.IsResolved();
                }
            }
            break;

            case Command.Unresolve:
            {
                GameReference gameRef = target.As <GameReference>();
                cando = gameRef != null && gameRef.Target != null;

                if (!cando)
                {
                    var resolveable = target.As <IResolveable>();
                    cando = resolveable != null && resolveable.IsResolved();
                }
            }
            break;

            case Command.CreateNewResolveable:
            {
                var resolveable = target.As <IResolveable>();
                cando = resolveable != null && (!resolveable.IsResolved()) && resolveable.CanCreateNew();
            }
            break;

            case Command.SaveSubDoc:
            {
                var resolveable = target.As <IResolveable>();
                cando = resolveable != null && resolveable.IsResolved() && resolveable.CanSave();
            }
            break;
            }
            return(cando);
        }
Exemple #4
0
        void ICommandClient.DoCommand(object commandTag)
        {
            IGame game = TreeControlAdapter.LastHit.As <IGame>();

            if (game == null)
            {
                GameReference gameRef = TreeControlAdapter.LastHit.As <GameReference>();
                game = gameRef.Target;
            }
            IDocument gameDocument = game.As <IDocument>();
            string    filePath     = null;

            switch ((Command)commandTag)
            {
            case Command.CreateNewSubGame:
                filePath = Util.GetFilePath(m_fileFilter,
                                            System.IO.Path.GetDirectoryName(gameDocument.Uri.LocalPath), true);
                if (!string.IsNullOrEmpty(filePath))
                {
                    try
                    {
                        if (!m_gameEditor.Info.IsCompatiblePath(filePath))
                        {
                            throw new Exception("Incompatible file type " + filePath);
                        }

                        Uri ur = new Uri(filePath);
                        if (m_gameDocumentRegistry.FindDocument(ur) != null)
                        {
                            throw new Exception(filePath + " is already open");
                        }
                        GameDocument subGame = GameDocument.OpenOrCreate(ur, m_schemaLoader);
                        subGame.Dirty = true;
                        GameReference gameRef = GameReference.CreateNew(subGame);
                        IHierarchical parent  = game.As <IHierarchical>();
                        parent.AddChild(gameRef);
                        // because we performing this operation outside of TransactionContext
                        // we must set Document Dirty flag.
                        gameDocument.Dirty = true;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(m_mainWindow.DialogOwner, ex.Message);
                    }
                }
                break;

            case Command.AddSubGame:

                filePath = Util.GetFilePath(m_fileFilter,
                                            System.IO.Path.GetDirectoryName(gameDocument.Uri.LocalPath),
                                            false);

                if (!string.IsNullOrEmpty(filePath))
                {
                    try
                    {
                        if (!m_gameEditor.Info.IsCompatiblePath(filePath))
                        {
                            throw new Exception("Incompatible file type " + filePath);
                        }

                        Uri ur = new Uri(filePath);
                        if (m_gameDocumentRegistry.FindDocument(ur) != null)
                        {
                            throw new Exception(filePath + " is already open");
                        }

                        GameReference gameRef = GameReference.CreateNew(ur);
                        gameRef.Resolve();
                        IHierarchical parent = game.As <IHierarchical>();
                        parent.AddChild(gameRef);

                        // because we performing this operation outside of TransactionContext
                        // we must set Document Dirty flag.
                        gameDocument.Dirty = true;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(m_mainWindow.DialogOwner, ex.Message);
                    }
                }
                break;

            case Command.Exclude:
            {
                GameReference gameRef = TreeControlAdapter.LastHit.As <GameReference>();
                gameDocument = gameRef.DomNode.Parent.Cast <IDocument>();
                GameDocument subDoc = gameRef.Target.Cast <GameDocument>();

                bool exclue = true;
                bool save   = false;
                if (subDoc.Dirty)
                {
                    string       msg       = "Save changes\r\n" + subDoc.Uri.LocalPath;
                    DialogResult dlgResult =
                        MessageBox.Show(m_mainWindow.DialogOwner, msg, m_mainWindow.Text
                                        , MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                    save   = dlgResult == DialogResult.Yes;
                    exclue = dlgResult != DialogResult.Cancel;
                }

                if (save)
                {
                    subDoc.Save(subDoc.Uri, m_schemaLoader);
                }

                if (exclue)
                {
                    gameRef.DomNode.RemoveFromParent();
                    // because we performing this operation outside of TransactionContext
                    // we must set Document Dirty flag.
                    gameDocument.Dirty = true;
                }
            }
            break;

            case Command.Resolve:
            {
                GameReference gameRef = TreeControlAdapter.LastHit.As <GameReference>();
                gameRef.Resolve();
                TreeControlAdapter.Refresh(gameRef);
            }
            break;

            case Command.Unresolve:
            {
                try
                {
                    GameReference gameRef   = TreeControlAdapter.LastHit.As <GameReference>();
                    GameDocument  subDoc    = gameRef.Target.Cast <GameDocument>();
                    bool          unresolve = true;
                    bool          save      = false;
                    if (subDoc.Dirty)
                    {
                        string       msg       = "Save changes\r\n" + subDoc.Uri.LocalPath;
                        DialogResult dlgResult =
                            MessageBox.Show(m_mainWindow.DialogOwner, msg, m_mainWindow.Text
                                            , MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                        save      = dlgResult == DialogResult.Yes;
                        unresolve = dlgResult != DialogResult.Cancel;
                    }
                    //cando = gameRef != null && gameRef.Target != null;
                    if (save)
                    {
                        subDoc.Save(subDoc.Uri, m_schemaLoader);
                    }
                    if (unresolve)
                    {
                        gameRef.Unresolve();
                    }
                    TreeControlAdapter.Refresh(gameRef);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(m_mainWindow.DialogOwner, ex.Message);
                }
            }
            break;

            default:
                throw new ArgumentOutOfRangeException("commandTag");
            }
            m_designView.InvalidateViews();
            Refresh();
        }
Exemple #5
0
 protected void setTargetEvent(GameReference targetEvent)
 {
     this.targetEvent = targetEvent;
 }