Exemple #1
0
        public void Shrink(bool animate)
        {
            if (Pegs.Count <= minPegs)
            {
                return;
            }

            List <Peg> removing = new List <Peg>();

            foreach (UIElement element in Pegs)
            {
                Peg peg = element as Peg;
                if (peg != null && peg.Slot.Contents == null)
                {
                    removing.Add(peg);
                    if (Pegs.Count <= (minPegs + removing.Count))
                    {
                        break;
                    }
                }
            }

            foreach (Peg peg in removing)
            {
                RemovePeg(animate, peg);
            }
        }
Exemple #2
0
        public void RemovePeg(bool animate, int index)
        {
            if (index >= Pegs.Count)
            {
                throw new ArgumentException("Index out of range.", "index");
            }

            Peg peg = Pegs[index] as Peg;

            if (peg == null)
            {
                throw new InvalidCastException("The element at index " + index + " was not a Peg.");
            }

            if (animate)
            {
                ScaleTransform scale = new ScaleTransform(1, 1);
                peg.LayoutTransform = scale;

                DoubleAnimation anim = new DoubleAnimation(1, 0, animationTime);
                anim.AutoReverse = false;
                anim.IsAdditive  = false;
                anim.Completed  += delegate { Pegs.Remove(peg); };
                scale.BeginAnimation(ScaleTransform.ScaleXProperty, anim);
                scale.BeginAnimation(ScaleTransform.ScaleYProperty, anim);
            }
            else
            {
                Pegs.Remove(peg);
            }

            OnChanged(new EventArgs());
        }
Exemple #3
0
        protected void GrowSpine(object sender, RoutedEventArgs e)
        {
            Peg peg = AddPeg(true, Pegs.Count);

            try {
                Log.WriteAction(LogAction.added, "peg");
                //ActivityLog.Write(new Activity("AddedPeg","On",peg.Slot.GetLogText()));
            }
            catch (Exception) {}
        }
Exemple #4
0
        public void RemovePeg(bool animate, Peg peg)
        {
            int index = Pegs.IndexOf(peg);

            if (index == -1)
            {
                throw new ArgumentException("Peg is not present on this spine.", "peg");
            }
            RemovePeg(animate, index);
        }
Exemple #5
0
        public string GetNaturalLanguage()
        {
            // can't use Pegs as an empty Peg might screw up our formatting:
            List <Peg> filledPegs = GetFilledPegs();

            if (filledPegs.Count == 0)
            {
                return("nothing happens");
            }

            else
            {
                System.Text.StringBuilder code = new System.Text.StringBuilder();

                for (int i = 0; i < filledPegs.Count; i++)
                {
                    Peg peg = (Peg)filledPegs[i];

                    bool last        = (i == filledPegs.Count - 1);
                    bool penultimate = (i == filledPegs.Count - 2);

                    if (last && filledPegs.Count > 1)
                    {
                        code.Append("and ");
                    }

                    code.Append(peg.Slot.GetNaturalLanguage());

                    if (last)
                    {
                    }                               //code.Append(".");
                    else if (penultimate)
                    {
                        code.Append(" ");
                    }
                    else
                    {
                        code.Append(", ");
                    }
                }

                return(code.ToString());
            }
        }
Exemple #6
0
        public void ReadXml(XmlReader reader)
        {
            while (Pegs.Count > 0)
            {
                RemovePeg(false);
            }

            reader.MoveToContent();             // at <Spine>

            if (reader.IsEmptyElement)
            {
                throw new FormatException("Spine does not define a Pegs collection.");
            }

            reader.ReadStartElement();          // passed <Spine>
            reader.MoveToContent();             // at <Pegs>

            if (reader.LocalName != "Pegs")
            {
                throw new FormatException("Spine does not define a Pegs collection.");
            }

            bool isEmpty = reader.IsEmptyElement;

            reader.ReadStartElement();             // passed <Pegs>

            if (!isEmpty)
            {
                reader.MoveToContent();                 // at <Peg> or </Pegs>

                while (reader.LocalName != "Pegs")
                {
                    Peg peg = AddPeg();
                    peg.ReadXml(reader);
                    reader.MoveToContent();
                }

                reader.ReadEndElement();                 // passed </Pegs>
            }

            reader.MoveToContent();
            reader.ReadEndElement();             // passed </Spine>
        }
Exemple #7
0
        public Spine DeepCopy()
        {
            Spine copy = new Spine(fitter, (uint)Pegs.Count, Extends);

            copy.Margin = Margin;

            for (int i = 0; i < Pegs.Count; i++)
            {
                Peg origPeg = (Peg)Pegs[i];
                Peg copyPeg = (Peg)copy.Pegs[i];

                Moveable moveable = origPeg.Slot.Contents;
                if (moveable != null)
                {
                    copyPeg.Slot.Contents = moveable.DeepCopy();
                }
            }

            return(copy);
        }
Exemple #8
0
        public Peg AddPeg(bool animate, int index)
        {
            if (index > Pegs.Count)
            {
                throw new ArgumentException("Index out of range.", "index");
            }

            Peg peg = new Peg(fitter);

            peg.VerticalAlignment = VerticalAlignment.Top;

            ScaleTransform scale = null;

            if (animate)
            {
                scale = new ScaleTransform(0, 0);
                peg.LayoutTransform = scale;
            }

            Pegs.Insert(index, peg);

            peg.DropZone.Drop += new DragEventHandler(AttachToSpine);

            if (animate)
            {
                DoubleAnimation anim = new DoubleAnimation(0, 1, animationTime);
                anim.AutoReverse = false;
                anim.IsAdditive  = false;
                scale.BeginAnimation(ScaleTransform.ScaleXProperty, anim);
                scale.BeginAnimation(ScaleTransform.ScaleYProperty, anim);
            }

            peg.Slot.Changed += delegate
            {
                OnChanged(new EventArgs());
            };

            return(peg);
        }
Exemple #9
0
        /// <summary>
        /// Attach a Moveable to the spine, either onto a free adjacent peg,
        /// or onto a newly-created peg.
        /// </summary>
        protected void AttachToSpine(object sender, DragEventArgs e)
        {
            if (e.Handled)
            {
                return;
            }
            if (!e.Data.GetDataPresent(typeof(Moveable)))
            {
                return;
            }
            if (!(e.AllowedEffects == DragDropEffects.Copy || e.AllowedEffects == DragDropEffects.Move))
            {
                return;
            }

            Moveable moveable = e.Data.GetData(typeof(Moveable)) as Moveable;

            if (fitter.Fits(moveable))
            {
                DropZone dropZone = sender as DropZone;
                if (dropZone == null)
                {
                    return;
                }

                Peg above = UIHelper.TryFindParent <Peg>(dropZone);
                if (above == null)
                {
                    return;
                }

                int index = Pegs.IndexOf(above);
                if (index == -1)
                {
                    throw new InvalidOperationException("Peg not found on spine.");
                }
                index++;

                Peg below;
                if (index < Pegs.Count)
                {
                    below = (Peg)Pegs[index];
                }
                else
                {
                    below = null;
                }

                Peg target = null;

                // If a moveable has been dropped just above or below
                // itself, do nothing. Otherwise, try to use an empty
                // peg, or create a new peg if there isn't one:

                bool pointlessMove =
                    e.AllowedEffects == DragDropEffects.Move &&
                    ((above != null && above.Slot.Contents == moveable) || (below != null && below.Slot.Contents == moveable));

                if (pointlessMove)
                {
                    e.Handled = true;
                    return;
                }
                else if (below != null && below.Slot.Contents == null)
                {
                    target = below;
                }
                else if (above != null && above.Slot.Contents == null)
                {
                    target = above;
                }
                else
                {
                    target = AddPeg(false, index);
                }

                if (e.AllowedEffects == DragDropEffects.Copy)
                {
                    target.Slot.Contents = moveable.DeepCopy();
                }
                else if (e.AllowedEffects == DragDropEffects.Move)
                {
                    moveable.Remove();
                    target.Slot.Contents = moveable;
                }

                try {
                    Log.WriteAction(LogAction.placed, "block", target.Slot.Contents.GetLogText() + " on " + target.Slot.GetLogText());
                    //ActivityLog.Write(new Activity("PlacedBlock","Block",target.Slot.Contents.GetLogText(),"PlacedOn",target.Slot.GetLogText()));
                }
                catch (Exception) {}

                OnChanged(new EventArgs());
            }

            e.Handled = true;
        }