Exemplo n.º 1
0
        private void AllDefaults_Field(FtMetaField field, FtMetaSequence sequence, FtMetaSequence targetSequence, int redirectType, int itemIdx)
        {
            const FtSequenceInvokationDelay SequenceInvokationDelay = FtSequenceInvokationDelay.ftikAfterField;

            if (state == State.Initialise)
            {
                defaultMetaFieldProperties.LoadIntoMetaField(ref field, false);

                FtMetaSequenceItem sequenceItem = sequence.ItemList.New();
                sequenceItem.Field = field;
                FtMetaSequenceRedirect sequenceRedirect = sequenceItem.RedirectList.New(redirectType);
                sequenceRedirect.InvokationDelay = SequenceInvokationDelay;
                sequenceRedirect.Sequence        = targetSequence;
            }
            else
            {
                defaultMetaFieldProperties.AssertMetaFieldAreEqual(field, false);

                FtMetaSequenceItem sequenceItem = sequence.ItemList[itemIdx];
                Assert.AreEqual <FtMetaField>(field, sequenceItem.Field);
                FtMetaSequenceRedirect sequenceRedirect = sequenceItem.RedirectList[0];
                Assert.AreEqual <FtSequenceInvokationDelay>(SequenceInvokationDelay, sequenceRedirect.InvokationDelay);
                Assert.AreEqual <FtMetaSequence>(targetSequence, sequenceRedirect.Sequence);
            }
        }
Exemplo n.º 2
0
        internal protected virtual void LoadMeta(FtMetaSequenceRedirect metaSequenceRedirect, FtMetaSequenceList metaSequenceList, FtSequenceList sequenceList)
        {
            type            = metaSequenceRedirect.Type;
            invokationDelay = metaSequenceRedirect.InvokationDelay;

            int sequenceIdx = metaSequenceList.IndexOf(metaSequenceRedirect.Sequence);

            if (sequenceIdx < 0)
            {
                throw FtInternalException.Create(InternalError.FtSequenceRedirect_LoadMeta_MetaSequenceRedirectSequenceNotFoundInMetaSequenceList, metaSequenceRedirect.Sequence.Name); // should never happen
            }
            else
            {
                sequence = sequenceList[sequenceIdx]; // sequenceList are in same order as Meta Sequence List
            }
        }
Exemplo n.º 3
0
        internal static bool TryParseAttributeValue(string attributeValue, out FtSequenceInvokationDelay enumerator)
        {
            enumerator = FtSequenceInvokationDelay.ftikAfterField; // avoid compiler error
            bool result = false;

            foreach (FormatRec rec in formatRecArray)
            {
                if (String.Equals(rec.AttributeValue, attributeValue, StringComparison.OrdinalIgnoreCase))
                {
                    enumerator = rec.Enumerator;
                    result     = true;
                    break;
                }
            }
            return(result);
        }
Exemplo n.º 4
0
        protected internal virtual void Assign(FtMetaSequenceRedirect source, FtMetaSequenceList sequenceList, FtMetaSequenceList sourceSequenceList)
        {
            InvokationDelay = source.InvokationDelay;

            int sequenceIndex = sourceSequenceList.IndexOf(source.Sequence);

            if (sequenceIndex < 0)
            {
                throw FtInternalException.Create(InternalError.FtMetaSequenceItem_Assign_SourceFieldNotFound); // should never happen
            }
            else
            {
                if (sequenceIndex >= sequenceList.Count)
                {
                    throw FtInternalException.Create(InternalError.FtMetaSequenceItem_Assign_FieldIndexOutOfRange, sequenceIndex.ToString()); // should never happen
                }
                else
                {
                    Sequence = sequenceList[sequenceIndex];
                }
            }
        }
Exemplo n.º 5
0
 private void HandleSequenceRedirectEvent(FtField field, FtSequence sequence, FtSequenceInvokationDelay delay,
                                          out int fieldsAffectedFromIndex)
 {
     if (field != redirectingField)
     {
         if (sequence == null)
         {
             fieldsAffectedFromIndex = FtField.NoFieldsAffectedIndex;
         }
         else
         {
             SequenceRedirectEvent(field, sequence, delay, out fieldsAffectedFromIndex);
             redirectingField = field;
         }
     }
     else
     {
         SequenceRedirectEvent(field, sequence, delay, out fieldsAffectedFromIndex);
         if (sequence == null)
         {
             redirectingField = null;
         }
     }
 }
Exemplo n.º 6
0
 private void LoadBaseDefaults()
 {
     InvokationDelay = DefaultInvokationDelay;
 }
Exemplo n.º 7
0
 private void HandleSequenceRedirectEvent(FtField field, FtSequence sequence, FtSequenceInvokationDelay delay,
                                          out int fieldsAffectedFromIndex)
 {
     SequenceRedirectEvent(field, sequence, delay, out fieldsAffectedFromIndex);
 }
Exemplo n.º 8
0
 protected void OnSequenceRedirect(FtSequence sequence, FtSequenceInvokationDelay delay, out int fieldsAffectedFromIndex)
 {
     SequenceRedirectEvent(this, sequence, delay, out fieldsAffectedFromIndex);
 }
Exemplo n.º 9
0
 internal static string ToAttributeValue(FtSequenceInvokationDelay enumerator)
 {
     return(formatRecArray[(int)enumerator].AttributeValue);
 }
Exemplo n.º 10
0
        protected void Redirect(FtField redirectingField, FtSequence invokedSequence, FtSequenceInvokationDelay invokationDelay,
                                out int fieldsAffectedFromIndex)
        {
            FtSequenceInvokation redirectingInvokation = redirectingField.SequenceInvokation;

            int newInvokationIndex = redirectingInvokation.Index + 1;
            int newInvokationStartFieldIndex;

            switch (invokationDelay)
            {
            case FtSequenceInvokationDelay.ftikAfterField:
                newInvokationStartFieldIndex = redirectingField.Index + 1;
                break;

            case FtSequenceInvokationDelay.ftikAfterSequence:
                newInvokationStartFieldIndex = redirectingInvokation.StartFieldIndex + redirectingInvokation.FieldCount;
                break;

            default:
                throw FtInternalException.Create(InternalError.Core_InvokeSequences_UnsupportedInvokationDelay, invokationDelay.ToString());
            }


            // check if redirect does not cause any change
            bool changeRequired;

            if (newInvokationIndex >= sequenceInvokationList.Count)
            {
                changeRequired = true;
            }
            else
            {
                FtSequenceInvokation nextExistingInvokation = sequenceInvokationList[newInvokationIndex];
                changeRequired = (nextExistingInvokation.Sequence != invokedSequence || nextExistingInvokation.StartFieldIndex != newInvokationStartFieldIndex);
            }

            if (!changeRequired)
            {
                fieldsAffectedFromIndex = FtField.NoFieldsAffectedIndex;
            }
            else
            {
                FtField existingRedirectingField = redirectingInvokation.RedirectingField;
                int     unredirectfieldsAffectedFromIndex;
                if (existingRedirectingField == null)
                {
                    unredirectfieldsAffectedFromIndex = redirectingInvokation.StartFieldIndex + redirectingInvokation.FieldCount;
                }
                else
                {
                    Unredirect(existingRedirectingField, out unredirectfieldsAffectedFromIndex);
                    if (unredirectfieldsAffectedFromIndex < 0)
                    {
                        // if not affected, set to value which will be higher than new invokation affects fields index
                        unredirectfieldsAffectedFromIndex = redirectingInvokation.StartFieldIndex + redirectingInvokation.FieldCount;
                    }
                }

                FtSequenceInvokation newInvokation = SequenceInvokationList.TryPredictedNew(newInvokationIndex, invokedSequence, newInvokationStartFieldIndex);
                if (newInvokation == null)
                {
                    SequenceInvokationList.Trim(newInvokationIndex);
                    newInvokation = SequenceInvokationList.New(invokedSequence, newInvokationStartFieldIndex);
                }

                FieldList.Trim(newInvokationStartFieldIndex);
                for (int i = 0; i < newInvokation.FieldCount; i++)
                {
                    FieldList.Add(newInvokation.GetField(i));
                }

                if (newInvokationStartFieldIndex < redirectingInvokation.StartFieldIndex + redirectingInvokation.FieldCount)
                {
                    redirectingInvokation.SidelineFields(newInvokationStartFieldIndex);
                }

                if (unredirectfieldsAffectedFromIndex < newInvokationStartFieldIndex)
                {
                    fieldsAffectedFromIndex = unredirectfieldsAffectedFromIndex;
                }
                else
                {
                    fieldsAffectedFromIndex = newInvokationStartFieldIndex;
                }

                if (!seeking)
                {
                    OnSequenceRedirected(redirectingField, fieldsAffectedFromIndex);
                }
            }
        }
Exemplo n.º 11
0
        /*protected void InvokeRootSequenceFromPrevious()
         * {
         *  // NOT USED.  Optimisation for InvokingRoot from Previous as used in SerializatonWriter
         *
         *  // SequenceInvokationList however FieldList matches PreviousRecordSequenceInvokationList
         *
         *  // Make SequenceInvokationList hold root only
         *  SequenceInvokationList.New(RootSequence, 0);
         *
         *  // Adjust FieldList based on PreviousRecordSequenceInvokationList
         *  // if PreviousRecordSequenceInvokationList = 1 (wont be 0), then FieldList already only contains root fields
         *  if (PreviousRecordSequenceInvokationList.Count <= 1)
         *      ResetAllFieldValues();
         *  else
         *  {
         *      // if root sequence was not redirected before its end, keep existing as prediction
         *      FtSequenceInvokation secondInvokation = PreviousRecordSequenceInvokationList[1];
         *      if (secondInvokation.StartFieldIndex == RootFieldCount)
         *      {
         *          FieldList.PredictTrim(RootFieldCount);
         *          ResetAllFieldValues();
         *      }
         *      else
         *      {
         *          int replaceFieldFromIndex = secondInvokation.StartFieldIndex;
         *          FieldList.Trim(replaceFieldFromIndex);
         *          ResetAllFieldValues();
         *          for (int i = replaceFieldFromIndex; i < RootFieldCount; i++)
         *          {
         *              FieldList.New(RootSequenceInvokation, RootSequence.ItemList[i]);
         *          }
         *      }
         *  }
         * }*/

        private void HandleSequenceRedirectEvent(FtField field, FtSequence invokedSequence, FtSequenceInvokationDelay invokationDelay,
                                                 out int fieldsAffectedFromIndex)
        {
            if (invokedSequence != null)
            {
                Redirect(field, invokedSequence, invokationDelay, out fieldsAffectedFromIndex);
            }
            else
            {
                Unredirect(field, out fieldsAffectedFromIndex);
            }
        }