public bool Connect( ILogicControl first, ILogicControl second )
 {
     Contract.Requires( first != null );
     Contract.Requires( second != null );
     var connector = this._connectionCommand.FirstOrDefault( s => s.Connect( first, second ) );
     return connector != null;
 }
        public bool Connect( ILogicControl first, ILogicControl second )
        {
            var firstConnction = first as CarsInserter;
            var secondConnection = second as CarsInserter;

            if ( firstConnction == null || secondConnection == null )
            {
                return false;
            }

            if ( firstConnction == secondConnection || this.AreConnected( firstConnction, secondConnection ) )
            {
                return false;
            }

            var isFirstHigherThanSecond = this.IsHigher( firstConnction, secondConnection );
            if ( isFirstHigherThanSecond )
            {
                firstConnction.Connector.ConnectBeginBottomWith( secondConnection );
                secondConnection.Connector.ConnectEndTopWith( firstConnction );
            }
            else
            {
                firstConnction.Connector.ConnectBeginTopWith( secondConnection );
                secondConnection.Connector.ConnectEndBottomWith( firstConnction );
            }

            return true;
        }
        public bool Connect( ILogicControl first, ILogicControl second )
        {
            var carsInseerter = first as CarsInserter;
            var endRoadLaneEdge = second as RoadLaneBlock;

            if ( carsInseerter == null || endRoadLaneEdge == null ) { return false; }

            carsInseerter.Connector.ConnectStartFrom( endRoadLaneEdge );
            endRoadLaneEdge.LeftEdge.Connector.ConnectEndOn( carsInseerter );

            return true;
        }
        public bool Connect(ILogicControl first, ILogicControl second)
        {
            var roadLaneEdge = first as RoadLaneBlock;
            var carsRemover = second as CarsRemover;

            if ( roadLaneEdge == null || carsRemover == null ) { return false; }

            roadLaneEdge.RightEdge.Connector.ConnectStartFrom( carsRemover );
            carsRemover.Connector.ConnectEndOn( roadLaneEdge );

            return true;
        }
        public virtual bool Connect( ILogicControl first, ILogicControl second )
        {
            var roadLaneEdge = first as RoadLaneBlock;
            var roadConnection = second as RoadConnection;
            if ( roadLaneEdge == null || roadConnection == null )
            {
                return false;
            }

            roadLaneEdge.RightEdge.Connector.ConnectStartFrom( roadConnection );
            roadConnection.Connector.ConnectBeginWith( roadLaneEdge.RightEdge );
            return true;
        }
        public virtual bool Connect( ILogicControl first, ILogicControl second )
        {
            var roadJunctionEdge = first as JunctionEdge;
            var roadLaneEdge = second as RoadLaneBlock;

            if ( roadLaneEdge == null || roadJunctionEdge == null )
            {
                return false;
            }

            roadJunctionEdge.Connector.ConnectBeginFrom( roadLaneEdge );
            roadLaneEdge.LeftEdge.Connector.ConnectEndOn( roadJunctionEdge );
            return true;
        }
        public virtual bool Connect( ILogicControl first, ILogicControl second )
        {
            var roadConnectionEdge = first as RoadConnection;
            var roadLaneEdge = second as RoadLaneBlock;
            if ( roadConnectionEdge == null || roadLaneEdge == null )
            {
                return false;
            }

            // TODO Check it
            roadConnectionEdge.Connector.ConnectEndWith( roadLaneEdge.LeftEdge );
            roadLaneEdge.LeftEdge.Connector.ConnectEndOn( roadConnectionEdge );

            return true;
        }
        private void LeftButtonClicked( XnaMouseState mouseState )
        {
            var edges = this.FindControlAtPoint( mouseState.Location );
            if ( edges == null )
            {
                return;
            }

            if ( this._lastClickedEdges == null )
            {
                this._lastClickedEdges = edges;
                this._lastClickedEdges.IsSelected = true;
            }
            else
            {
                this.Begin( this._lastClickedEdges, edges );
                this._lastClickedEdges = null;
            }
        }
        public bool Connect(ILogicControl first, ILogicControl second)
        {
            var firstEdge = first as SideRoadLaneEdge;
            if ( firstEdge == null )
            {
                return false;
            }

            var secondEdge = second as SideRoadLaneEdge;
            if ( secondEdge == null )
            {
                return false;
            }

            if ( this.AreConnectedInTheSamePlaces( firstEdge, secondEdge ) == false )
            {
                return false;
            }
            
            firstEdge.Connector.ConnectChangeName( secondEdge );
            secondEdge.Connector.ConnectChangeName( firstEdge );
            return true;
        }
        public bool Connect( ILogicControl first, ILogicControl second )
        {
            var firstEdge = first as JunctionEdge;
            var secondEdge = second as JunctionEdge;
            if ( firstEdge == null || secondEdge == null )
            {
                return false;
            }

            if ( this.AreConnected( firstEdge, secondEdge ) )
            {
                return false;
            }

            if( firstEdge.Connector.JunctionEdge == secondEdge.Connector.JunctionEdge)
            {
                return false;
            }

            firstEdge.Connector.ConnectBeginFrom( secondEdge );
            secondEdge.Connector.ConnectEndsOn( firstEdge );

            return true;
        }
 private void Begin( ILogicControl first, ILogicControl second )
 {
     this._compositeConnectionCommand.Connect( first, second );
 }
 public void Stop()
 {
     this._mouseInformation.StopRecord();
     this._lastClickedEdges = null;
 }