public T DoNamedNodeStep <T>(IDocumentationBuilder builder, string requiredName, IGraphFilter requiredFilter = null, Action <IDocumentationBuilder> stepContent = null) where T : GenericNode { T existing = null; if (WorkspaceService.CurrentWorkspace == null || WorkspaceService.CurrentWorkspace.CurrentGraph == null) { } else { existing = WorkspaceService.Repository.All <T>().FirstOrDefault(p => p.Name == requiredName); } builder.ShowTutorialStep(new TutorialStep(string.Format("Create a '{0}' node with the name '{1}'", InvertApplication.Container.GetNodeConfig <T>().Name, requiredName), () => { if (existing == null) { if (requiredFilter != null) { if (WorkspaceService.CurrentWorkspace.CurrentGraph.CurrentFilter != requiredFilter) { return(string.Format("Double-click on the '{0}' Node.", requiredFilter.Name)); } } return("Node not created yet"); } return(null); }) { StepContent = _ => { var nodeTypeName = typeof(T).Name.Replace("Node", ""); _.Paragraph("In this step you need to create {0}.", nodeTypeName); _.Paragraph("To create any kind of node you need to right click on an empty space on the graph. Context menu will appear. It will contain different 'Add' commands. Each 'Add' command" + "allows you to add a new node to the graph. The types of nodes you can create may be different based on the context. For example, you can create elements only inside of subsystems, and " + "you can only create views inside of elements."); if (requiredFilter != null) { if (WorkspaceService.CurrentWorkspace.CurrentGraph.CurrentFilter != requiredFilter) { _.Paragraph("First of all you need to get into {0} node.", requiredFilter.Name); _.Paragraph( "At any time you can tell where you are, by refering to filter bar, which is located under opened tabs bar. It will show your current position in the hierarchy."); _.ImageByUrl("http://i.imgur.com/bPMlmOq.png"); _.Paragraph( "There are several ways you can navigate in the graph. First of all, you may switch graphs them selves. Each graph is represented as a graph node and is a filter on it's own. " + "You can double-click the headers of certain nodes. If it is possible, such node will become a current filter. This will show the graph filtered by this node. " + "If you double-click the header of the current filter, it will bring bring you back."); _.Paragraph("If {0} node is a graph node, just open the corresponding graph and select root in the filter bar.", requiredFilter.Name); _.Paragraph("If {0} node is a regular node, locate it and double-click it's header.", requiredFilter.Name); } else { _.Paragraph("It seems like you are inside of {0}, which is correct. Now you should be able to right-click on empty space of the graph and select Add {1}.", requiredFilter.Name, nodeTypeName); _.Paragraph("Finally you need to rename newly created node. To rename your node you have to right-click on the header of the node and click rename." + "Node title will become editable. Type in \"{0}\". Click anywhere else, to finish editing", requiredName); _.ImageByUrl("http://i.imgur.com/PDUZhsU.png", "This picture shows how to rename a node"); } } if (stepContent != null) { stepContent(_); } _.Break(); _.ToggleContentByNode <T>(null); } }); return(existing); }