private int SyncedOperation(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
        {
            ITextCaret caret         = m_textView.Caret;
            var        tempTrackList = m_trackList;

            m_trackList = new List <ITrackingPoint>();

            SnapshotPoint snapPoint = tempTrackList[0].GetPoint(m_textView.TextSnapshot);
            int           result    = 0;

            m_dte.UndoContext.Open("Multi-point edit");

            for (int i = 0; i < tempTrackList.Count; i++)
            {
                snapPoint = tempTrackList[i].GetPoint(m_textView.TextSnapshot);
                caret.MoveTo(snapPoint);
                Debug.Print("Caret #" + i + " pos : " + caret.Position);
                result = NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
                AddSyncPoint(m_textView.Caret.Position);
            }

            m_dte.UndoContext.Close();

            RedrawScreen();
            return(result);
        }
        public static void Restore(TextSelectionState state, ITextSelection selection, ITextCaret caret)
        {
            caret.MoveTo(
                state.m_caretPosition.BufferPosition.TranslateTo(selection.TextView.TextSnapshot, PointTrackingMode.Positive),
                state.m_caretPosition.Affinity);

            selection.Mode = state.m_mode;

            SnapshotSpan newSpan;

            if (state.m_mode == TextSelectionMode.Box)
            {
                newSpan = new SnapshotSpan(
                    state.m_trackedSpans[0].GetStartPoint(selection.TextView.TextBuffer.CurrentSnapshot),
                    state.m_trackedSpans[state.m_trackedSpans.Count - 1].GetEndPoint(selection.TextView.TextBuffer.CurrentSnapshot));
            }
            else
            {
                newSpan = state.m_trackedSpans[0].GetSpan(selection.TextView.TextBuffer.CurrentSnapshot);
            }
            selection.Select(newSpan, state.m_isReversed);
        }
Esempio n. 3
0
        internal int SyncedOperation(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
        {
            int result = 0;

            if (_trackPointList.Count > 0)
            {
                // Se tem algo selecionado
                if (Selecting)
                {
                    switch (nCmdID)
                    {
                    case ((uint)VSConstants.VSStd2KCmdID.TYPECHAR):
                    case ((uint)VSConstants.VSStd2KCmdID.BACKSPACE):
                    case ((uint)VSConstants.VSStd2KCmdID.TAB):
                    case ((uint)VSConstants.VSStd97CmdID.Delete):
                    case ((uint)VSConstants.VSStd2KCmdID.RETURN):
                    case ((uint)VSConstants.VSStd2KCmdID.BACKTAB):
                    case ((uint)VSConstants.VSStd97CmdID.Paste):     /* Ctrl+V */

                        DeleteSelection();

                        break;

                    default:
                        break;
                    }
                }

                //char typedChar = char.MinValue;
                //typedChar = (char)(ushort)Marshal.GetObjectForNativeVariant(pvaIn);

                _view.Selection.Clear();

                ITextCaret caret = _view.Caret;

                List <ITrackingPoint> tempTrackList = _trackPointList;

                _trackPointList = new List <ITrackingPoint>();

                SnapshotPoint snapshotPoint = tempTrackList[0].GetPoint(_view.TextSnapshot);

                //m_dte.UndoContext.Open("Multi-point edit");

                for (int i = 0; i < tempTrackList.Count; i++)
                {
                    snapshotPoint = tempTrackList[i].GetPoint(_view.TextSnapshot);

                    caret.MoveTo(snapshotPoint);

                    // Propaga o evento para os demais locais
                    result = _nextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);

                    AddTrackingPoint(_view.Caret.Position);
                }

                //m_dte.UndoContext.Close();

                RedrawScreen();
            }

            return(result);
        }
        private int SyncedOperation(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
        {
            int        result = 0;
            ITextCaret caret  = m_textView.Caret;

            if (!addedCurrentCaret)
            {
                AddSyncPoint(caret.Position);
                addedCurrentCaret = true;
            }

            var tempTrackList = m_trackList;

            m_trackList = new List <ITrackingPoint>();

            m_dte.UndoContext.Open("Select Next edit");

            bool deleteSelection = !m_textView.Selection.IsEmpty;

            string currentSelection = m_textView.Selection.SelectedSpans[m_textView.Selection.SelectedSpans.Count - 1].GetText();

            for (int i = 0; i < tempTrackList.Count; i++)
            {
                var trackingMode = tempTrackList[i].TrackingMode;
                var snapPoint    = tempTrackList[i].GetPoint(m_textView.TextSnapshot);
                caret.MoveTo(snapPoint);

                using (var edit = m_textView.TextSnapshot.TextBuffer.CreateEdit())
                {
                    bool applyEdit = false;
                    if (deleteSelection)
                    {
                        if (trackingMode == PointTrackingMode.Negative)
                        {
                            edit.Delete(caret.Position.BufferPosition.Position, currentSelection.Length);
                        }
                        else
                        {
                            edit.Delete(caret.Position.BufferPosition.Position - currentSelection.Length, currentSelection.Length);
                        }
                        applyEdit = true;
                    }

                    switch (nCmdID)
                    {
                    case (uint)VSConstants.VSStd2KCmdID.TYPECHAR:

                        var typedChar = (char)(ushort)Marshal.GetObjectForNativeVariant(pvaIn);
                        edit.Insert(tempTrackList[i].GetPosition(m_textView.TextSnapshot), typedChar.ToString());
                        applyEdit = true;
                        break;

                    case ((uint)VSConstants.VSStd97CmdID.Delete):
                        if (i < tempTrackList.Count - 1 && deleteSelection)
                        {
                            edit.Insert(tempTrackList[i].GetPosition(m_textView.TextSnapshot), "");
                        }
                        break;

                    case ((uint)VSConstants.VSStd97CmdID.Paste):
                        if (i < tempTrackList.Count - 1)
                        {
                            var pasteString = Clipboard.GetText();
                            edit.Insert(tempTrackList[i].GetPosition(m_textView.TextSnapshot), pasteString);
                            applyEdit = true;
                        }
                        break;
                    }

                    if (applyEdit)
                    {
                        edit.Apply();
                    }
                }


                switch (nCmdID)
                {
                case ((uint)VSConstants.VSStd2KCmdID.TYPECHAR):
                    break;

                case ((uint)VSConstants.VSStd97CmdID.Delete):
                    if (!deleteSelection)
                    {
                        result = NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
                    }
                    break;

                case ((uint)VSConstants.VSStd97CmdID.Paste):
                    if (i == tempTrackList.Count - 1)
                    {
                        result = NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
                    }
                    break;

                default:
                    result = NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
                    break;
                }


                AddSyncPoint(m_textView.Caret.Position);
            }

            m_dte.UndoContext.Close();

            RedrawScreen();
            return(result);
        }