Esempio n. 1
0
        protected void VisualGraphChange(object sender, GraphChangeArgs <TItem, TEdge> args)
        {
            var visitor     = CreateVisitor(args.Graph, args.Item);
            var sceneEvents = CreateSceneEvents();

            visitor.GraphChangedVisit(sceneEvents.GraphChanged, sender, args);
        }
Esempio n. 2
0
        public void GraphChangedVisit(Action <
                                          object,
                                          GraphChangeArgs <TSinkItem, TSinkEdge>,
                                          TSinkItem, IGraphScene <TSinkItem, TSinkEdge>,
                                          IGraphSceneDisplay <TSinkItem, TSinkEdge>
                                          > visit, object sender, GraphChangeArgs <TSinkItem, TSinkEdge> args)
        {
            var eventType = args.EventType;

            foreach (var sinkScene in SinkScenes)
            {
                var sinkGraph = sinkScene.Graph;
                if (ContainsSinkOf(sinkGraph.RootSource(), BackItem) || eventType == GraphEventType.Add)
                {
                    var sinkItem = SinkOf(sinkGraph, BackItem);
                    if (sinkItem == null)
                    {
                        continue;
                    }

                    var sinkDisplay = Mesh.Displays.FirstOrDefault(d => d != SourceDisplay && d.Data == sinkScene);

                    visit(sender, args, sinkItem, sinkScene, sinkDisplay);
                }
            }
        }
Esempio n. 3
0
 public override void OnGraphChange(object sender, GraphChangeArgs <TItem, TEdge> args)
 {
     base.OnGraphChange(sender, args);
     if (args.EventType == GraphEventType.Update)
     {
         this.Add(args.Item);
     }
 }
Esempio n. 4
0
 public void GraphChanged(
     object sender,
     GraphChangeArgs <IVisual, IVisualEdge> args,
     IVisual sinkItem, IGraphScene <IVisual, IVisualEdge> sinkScene,
     IGraphSceneDisplay <IVisual, IVisualEdge> sinkDisplay)
 {
     // everything is done in MeshBackHandler
     return;
 }
Esempio n. 5
0
 public override void OnGraphChange(object sender, GraphChangeArgs <IThing, ILink> args)
 {
     if (args.EventType == GraphEventType.Update)
     {
         var link = args.Item as ILink;
         if (link != null)
         {
             AddMarker(link.Marker);
         }
     }
     base.OnGraphChange(sender, args);
 }
        protected virtual void BackGraphChange(object sender, GraphChangeArgs <TSourceItem, TSourceEdge> args)
        {
            var graph     = args.Graph;
            var backItem  = args.Item;
            var eventType = args.EventType;

            if (backItem == null)
            {
                return;
            }

            var change = Tuple.Create(graph, backItem, eventType);

            if (graphChanging.Contains(change))
            {
                return;
            }

            try {
                graphChanging.Add(change);

                var displays           = new HashSet <IGraphSceneDisplay <TSinkItem, TSinkEdge> > ();
                var removeDependencies = false;

                var senderAsSink = (sender as IGraph <TSinkItem, TSinkEdge>).RootSink();

                var scenes = ScenesOfBackGraph(graph)
                             // leave alone the sender:
                             .Where(s => s.Graph.RootSink() != senderAsSink)
                             .ToArray();

                Action <TSourceItem> visit = sourceItem => {
                    foreach (var scene in scenes)
                    {
                        var graphPair = scene.Graph.Source <TSinkItem, TSinkEdge, TSourceItem, TSourceEdge> ();

                        var sinkItem = default(TSinkItem);

                        if (eventType == GraphEventType.Add)
                        {
                            sinkItem = graphPair.Get(sourceItem);
                            if (sinkItem is TSinkEdge)
                            {
                                SceneEdgeAdd(scene, (TSinkEdge)sinkItem);
                                displays.Add(DisplayOf(scene));
                            }
                            continue;
                        }

                        if (graphPair.Count == 0 || !graphPair.Source2Sink.TryGetValue(sourceItem, out sinkItem))
                        {
                            continue;
                        }

                        var visible = scene.Contains(sinkItem);

                        if (eventType == GraphEventType.Remove)
                        {
                            if (removeDependencies)
                            {
                                if (visible &&
                                    !scene.Requests
                                    .OfType <DeleteCommand <TSinkItem, TSinkEdge> > ()
                                    .Any(r => sinkItem.Equals(r.Subject)))
                                {
                                    scene.RequestDelete(sinkItem, null);
                                }

                                if (visible)
                                {
                                    displays.Add(DisplayOf(scene));
                                }
                            }
                            else
                            {
                                if (visible)
                                {
                                    if (scene.Focused != null && scene.Focused.Equals(sinkItem))
                                    {
                                        scene.Focused = default(TSinkItem);
                                    }
                                    scene.Selected.Remove(sinkItem);

                                    scene.Requests.Add(new RemoveBoundsCommand <TSinkItem, TSinkEdge> (sinkItem, scene));
                                    scene.Graph.Twig(sinkItem).ForEach(e =>
                                                                       scene.Requests.Add(new RemoveBoundsCommand <TSinkItem, TSinkEdge> (e, scene)));
                                    displays.Add(DisplayOf(scene));
                                }
                            }
                        }

                        if (eventType == GraphEventType.Update)
                        {
                            if (backItem is TSourceEdge && sinkItem is TSinkEdge)
                            {
                                SceneEdgeChanged(graph, (TSourceEdge)backItem, scene, (TSinkEdge)sinkItem);
                                if (visible)
                                {
                                    displays.Add(DisplayOf(scene));
                                }
                            }
                            else
                            {
                                graphPair.UpdateSink(sinkItem);
                                if (visible)
                                {
                                    scene.Requests.Add(new LayoutCommand <TSinkItem> (sinkItem, LayoutActionType.Justify));
                                    displays.Add(DisplayOf(scene));
                                }
                            }
                        }
                    }
                };

                if (eventType == GraphEventType.Remove)
                {
                    try {
                        var dependencies = Registry.Pooled <GraphDepencencies <TSourceItem, TSourceEdge> > ();
                        removeDependencies = true;
                        dependencies.VisitItems(GraphCursor.Create(graph, backItem), visit, eventType);
                    } catch (Exception ex) {
                        Trace.TraceError(ex.Message);
                    } finally {
                        removeDependencies = false;
                    }
                }

                visit(backItem);

                displays.Where(display => display != null)
                .ForEach(display => {
                    display.Perform();
                    Xwt.Application.MainLoop.QueueExitAction(() => display.QueueDraw());
                });

                Action <TSourceItem> visitAfter = sourceItem => {
                    foreach (var scene in scenes)
                    {
                        var graphPair = scene.Graph.Source <TSinkItem, TSinkEdge, TSourceItem, TSourceEdge> ();

                        var sinkItem = default(TSinkItem);
                        if (graphPair.Count == 0 || !graphPair.Source2Sink.TryGetValue(sourceItem, out sinkItem))
                        {
                            continue;
                        }

                        var visible = scene.Contains(sinkItem);
                        if (eventType == GraphEventType.Remove)
                        {
                            SceneItemRemoveAfterDisplayUpdate(scene, sinkItem);
                        }
                    }
                };

                visitAfter(backItem);

                Xwt.Application.MainLoop.DispatchPendingEvents();
            } catch (Exception ex) {
                Trace.TraceError(ex.Message);
            } finally {
                graphChanging.Remove(change);
            }
        }