예제 #1
0
        public override void GoToPosition(PositionKind positionKind)
        {
            var origPos   = HexView.Caret.Position.Position.ActivePosition.BufferPosition;
            var selectPos = HexView.Selection.IsEmpty ? origPos :
                            HexView.Selection.AnchorPoint < HexView.Selection.ActivePoint ?
                            HexView.Selection.AnchorPoint : HexView.Selection.AnchorPoint - 1;
            var data = new GoToPositionVM(HexView.Buffer.ReadUInt32(origPos));

            data.PositionKind = positionKind;
            var win = new GoToPositionDlg();

            win.DataContext = data;
            win.Owner       = OwnerWindow;
            if (win.ShowDialog() != true)
            {
                return;
            }

            var pos    = Filter(ToBufferPosition(origPos, data.OffsetVM.Value, data.PositionKind));
            var newPos = new HexBufferPoint(HexView.Buffer, pos);

            if (!data.SelectToNewPosition)
            {
                MoveTo(newPos, newPos, newPos, select: false);
            }
            else
            {
                var info = UserValueToSelection(selectPos, newPos);
                MoveTo(new HexBufferPoint(HexView.Buffer, info.Anchor), new HexBufferPoint(HexView.Buffer, info.Active), new HexBufferPoint(HexView.Buffer, info.Caret), select: true);
            }
        }
예제 #2
0
        /// <summary>
        /// Gets the data position depending on the timestamp.
        /// </summary>
        public bool GetDataPosition(DateTime timestamp, PositionKind positionKind,
                                    out TrendTablePage page, out int indexInPage)
        {
            if (AcceptData(timestamp, positionKind == PositionKind.Exact, out bool isExactMatch))
            {
                int    indexWithinTable;
                double timeOfDay = timestamp < Metadata.MaxTimestamp ?
                                   timestamp.TimeOfDay.TotalSeconds : SecondsPerDay;

                switch (positionKind)
                {
                case PositionKind.Floor:
                    indexWithinTable = (int)(timeOfDay / WritingPeriod);
                    break;

                case PositionKind.FloorExclusive:
                    indexWithinTable = (int)(timeOfDay / WritingPeriod);
                    if (isExactMatch)
                    {
                        indexWithinTable--;
                    }
                    break;

                case PositionKind.Ceiling:
                    indexWithinTable = (int)Math.Ceiling(timeOfDay / WritingPeriod);
                    break;

                default:     // PositionKind.Exact:
                    indexWithinTable = (int)Math.Round(timeOfDay / WritingPeriod);
                    break;
                }

                if (indexWithinTable < 0)
                {
                    indexWithinTable = 0;
                }
                else if (indexWithinTable >= TableCapacity)
                {
                    indexWithinTable = TableCapacity - 1;
                }

                int pageIndex = indexWithinTable / Metadata.PageCapacity;

                if (0 <= pageIndex && pageIndex < Pages.Count)
                {
                    page        = Pages[pageIndex];
                    indexInPage = indexWithinTable % Metadata.PageCapacity;
                    return(true);
                }
            }

            page        = null;
            indexInPage = -1;
            return(false);
        }
예제 #3
0
        HexPosition ToBufferPosition(HexPosition origPosition, ulong position, PositionKind positionKind)
        {
            switch (positionKind)
            {
            case PositionKind.Absolute:
                return(HexView.BufferLines.ToPhysicalPosition(position));

            case PositionKind.File:
                return(TryGetPeHeaders(origPosition)?.FilePositionToBufferPosition(position) ?? position);

            case PositionKind.RVA:
                return(TryGetPeHeaders(origPosition)?.RvaToBufferPosition((uint)position) ?? position);

            case PositionKind.CurrentPosition:
                return((origPosition + position).ToUInt64());

            default:
                throw new ArgumentOutOfRangeException(nameof(positionKind));
            }
        }
예제 #4
0
 public abstract void GoToPosition(PositionKind positionKind);
예제 #5
0
        HexPosition GetEndPosition(HexPosition origPos, HexPosition startPos, HexPosition pos, PositionKind positionKind, SelectPositionLengthKind selectPosKind)
        {
            switch (selectPosKind)
            {
            case SelectPositionLengthKind.Position:
                switch (positionKind)
                {
                case PositionKind.Absolute:
                case PositionKind.File:
                case PositionKind.RVA:
                    return(ToBufferPosition(origPos, pos.ToUInt64(), positionKind));

                case PositionKind.CurrentPosition:
                    return((origPos + pos).ToUInt64());

                default: throw new InvalidOperationException();
                }

            case SelectPositionLengthKind.Length:
                if (pos == HexPosition.Zero)
                {
                    return(startPos);
                }
                return((startPos + pos - 1).ToUInt64());

            default: throw new InvalidOperationException();
            }
        }
예제 #6
0
 public TutorialPair(String text, Matrix matrix)
 {
     this.text = text;
     kind = PositionKind.POS_3D;
     this.matrix = matrix;
 }
예제 #7
0
 public TutorialPair(String text, Vector2 position)
 {
     this.text = text;
     kind = PositionKind.POS_2D;
     this.position = position;
 }
예제 #8
0
 public PositionVM(PositionKind kind, string text, string inputGestureText)
 {
     Kind             = kind;
     Text             = text;
     InputGestureText = inputGestureText;
 }
예제 #9
0
 public static bool IsOpened(this PositionKind position)
 {
     return(position != PositionKind.Flat);
 }
예제 #10
0
        /// <summary>
        /// Builds margins for the candidate group.
        /// </summary>
        /// <param name="position">Position of wave margin.</param>
        /// <returns>A list of margins.</returns>
        public List<short[]> BuildMargins(PositionKind position)
        {
            List<short[]> margins = new List<short[]>();
            foreach (UnitCandidate candidate in Candidates)
            {
                if (position == PositionKind.Head)
                {
                    margins.Add(candidate.HeadMargin);
                }
                else if (position == PositionKind.Tail)
                {
                    margins.Add(candidate.TailMargin);
                }
                else
                {
                    throw new ArgumentException(
                        Helper.NeutralFormat("Unsupported position kind \"{0}\"", position.ToString()));
                }
            }

            return margins;
        }
 public static object DataFor(this IVirtualListViewAdapter vlva, PositionKind kind, int sectionIndex, int itemIndex)
 => kind switch
 {