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)); } } } }
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(); }
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); }
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(); }
protected void setTargetEvent(GameReference targetEvent) { this.targetEvent = targetEvent; }