Beispiel #1
0
        /// <summary>
        /// Adds the message.
        /// </summary>
        /// <param name="edge">The edge.</param>
        /// <param name="message">The message.</param>
        private void AddMessage(NetSimConnection edge, ConnectionFrameMessage message)
        {
            INetSimVisualizableItem receiver;
            INetSimVisualizableItem sender;

            // get message receiver and sender
            GetMessageReceiverSender(edge, message, out receiver, out sender);

            var uimessage = new MessageControl(message.ShortName)
            {
                Width       = 19,
                Height      = 19,
                Tag         = edge,
                MessagePath = { Tag = edge }
            };

            // set message to sender location
            int top  = sender.Location.Top;
            int left = sender.Location.Left;

            if (this.IsMessageSendingAnimationDone(message.Id))
            {
                // calculate middle between A and B
                top  = (edge.EndPointA.Location.Top + edge.EndPointB.Location.Top) / 2;
                left = (edge.EndPointA.Location.Left + edge.EndPointB.Location.Left) / 2;
            }

            // add meesage to this position
            Canvas.SetLeft(uimessage, left);
            Canvas.SetTop(uimessage, top);

            this.drawCanvas.Children.Add(uimessage);

            Storyboard storyBoard = null;

            if (message.TransmissionStep == NetSimMessageTransmissionStep.Sending)
            {
                if (!this.IsMessageSendingAnimationDone(message.Id))
                {
                    storyBoard = CreateMessageAnimation(edge, message, uimessage, NetSimMessageTransmissionStep.Sending);

                    // messageStates[message.Id] = NetSimMessageTransmissionStep.Sending;
                }
            }
            else
            {
                if (!this.IsMessageReceivingAnimationDone(message.Id))
                {
                    storyBoard = CreateMessageAnimation(
                        edge,
                        message,
                        uimessage,
                        NetSimMessageTransmissionStep.Receiving);

                    // messageStates[message.Id] = NetSimMessageTransmissionStep.Receiving;
                }
            }

            if (storyBoard == null)
            {
                return;
            }

            // when the animation has finished - mark animation as done
            // note: animation gets created multiple times - but only at last "redraw"
            // it has time to finish
            storyBoard.Completed += (s, e) => { this.messageStates[message.Id] = message.TransmissionStep; };

            uimessage.BeginStoryboard(storyBoard);

            // start the animation
            storyBoard.Begin();
        }