예제 #1
0
        void IActionTextLineMarker.MouseHover(Mono.TextEditor.MonoTextEditor editor, MarginMouseEventArgs args, TextLineMarkerHoverResult result)
        {
            if (args.Button != 0)
            {
                return;
            }
            var line = editor.GetLine(loc.Line);

            if (line == null)
            {
                return;
            }
            var          x = editor.ColumnToX(line, loc.Column) - editor.HAdjustment.Value + editor.TextViewMargin.TextStartPosition;
            var          y = editor.LineToY(line.LineNumber + 1) - editor.VAdjustment.Value;
            const double xAdditionalSpace = tagMarkerWidth;

            if (args.X - x >= -xAdditionalSpace * editor.Options.Zoom &&
                args.X - x < (tagMarkerWidth + xAdditionalSpace) * editor.Options.Zoom /*&&
                                                                                        * args.Y - y < (editor.LineHeight / 2) * editor.Options.Zoom*/)
            {
                result.Cursor = null;
                ShowPopup?.Invoke(null, null);
            }
            else
            {
                CancelPopup?.Invoke(null, null);
            }
        }
예제 #2
0
        protected internal override bool HandleItemCommand(ItemCommand command)
        {
            if (focusMarkers.Count == 0)
            {
                return(false);
            }

            var marker = focusMarkers[focusedIndex] as MarginMarker;

            if (marker == null)
            {
                return(false);
            }

            switch (command)
            {
            case ItemCommand.ActivateCurrentItem:
                var lineNumber = marker.LineSegment.LineNumber;
                var y          = editor.LineToY(lineNumber);
                MousePressed(new MarginMouseEventArgs(editor, EventType.ButtonPress, 1, 0, y, ModifierType.None));

                if (focusedIndex >= focusMarkers.Count)
                {
                    focusedIndex = focusMarkers.Count - 1;
                }

                editor.RedrawMargin(this);
                break;

            case ItemCommand.FocusNextItem:
                focusedIndex++;

                SanitizeFocusedIndex();

                marker = focusMarkers[focusedIndex] as MarginMarker;
                editor.CenterTo(marker.LineSegment.LineNumber, 1);
                break;

            case ItemCommand.FocusPreviousItem:
                focusedIndex--;

                SanitizeFocusedIndex();

                marker = focusMarkers[focusedIndex] as MarginMarker;
                editor.CenterTo(marker.LineSegment.LineNumber, 1);
                break;
            }

            if (marker != null && markerToAccessible != null)
            {
                var accessible = markerToAccessible[marker];
                if (accessible != null)
                {
                    AtkCocoaExtensions.SetCurrentFocus(accessible.Accessible);
                }
            }
            return(true);
        }
예제 #3
0
        void UpdateAccessibility()
        {
            var startLine = segment.GetStartLine(editor.Document).LineNumber;
            var endLine   = segment.GetEndLine(editor.Document).LineNumber;

            Accessible.Label = GettextCatalog.GetString("Fold Region: Line {0} to line {1} - {2}", startLine, endLine,
                                                        segment.isFolded ? GettextCatalog.GetString("Folded") : GettextCatalog.GetString("Expanded"));
            if (segment.isFolded)
            {
                Accessible.Help = GettextCatalog.GetString("Activate to expand the region");
            }
            else
            {
                Accessible.Help = GettextCatalog.GetString("Activate to fold the region");
            }

            startY = editor.LineToY(startLine);
            double endY;

            if (segment.isFolded)
            {
                endY = startY;
            }
            else
            {
                endY = editor.LineToY(endLine);
            }

            var rect = new Gdk.Rectangle(0, (int)startY, (int)margin.Width, (int)(endY - startY));

            Accessible.FrameInGtkParent = rect;

            var halfParentHeight = margin.RectInParent.Height / 2;
            var dEndY            = endY - halfParentHeight;
            var cocoaEndY        = halfParentHeight - dEndY;

            var dStartY     = startY - halfParentHeight;
            var cocoaStartY = halfParentHeight - dStartY;

            var minY = Math.Min(cocoaStartY, cocoaEndY);
            var maxY = Math.Max(cocoaStartY, cocoaEndY);

            Accessible.FrameInParent = new Gdk.Rectangle(0, (int)(minY - editor.LineHeight), (int)margin.Width, (int)((maxY - minY) + editor.LineHeight));
        }
예제 #4
0
        bool ISmartTagMarker.IsInsideSmartTag(double x, double y)
        {
            if (editor == null)
            {
                return(false);
            }
            var lin2 = editor.GetLine(loc.Line);
            var x2   = editor.ColumnToX(lin2, loc.Column) - editor.HAdjustment.Value + editor.TextViewMargin.TextStartPosition;
            var y2   = editor.LineToY(loc.Line + 1) - editor.VAdjustment.Value;

            return(x - x2 >= 0 * editor.Options.Zoom &&
                   x - x2 < tagMarkerWidth * editor.Options.Zoom &&
                   y - y2 < (editor.LineHeight / 2) * editor.Options.Zoom);
        }
            public override void Draw(Cairo.Context cr, Cairo.Rectangle erea)
            {
                MonoTextEditor editor = mode.editor;

                double y  = editor.LineToY(mode.CurrentInsertionPoint.Line) - editor.VAdjustment.Value;
                double x  = GetLineIndentationStart();
                double x2 = editor.Allocation.Width - mode.HelpWindow.Allocation.Width - InsertionCursorEditMode.HelpWindowMargin * 2;

                cr.MoveTo(x, y);
                cr.LineTo(x2, y);

                cr.SetSourceColor(LineColor);
                cr.Stroke();

//				DrawArrow (cr, x - 4, y);
            }
예제 #6
0
        public void Draw(Cairo.Context cr, Cairo.Rectangle area)
        {
            TextViewMargin textViewMargin = editor.TextViewMargin;
            ISyntaxMode    mode           = Document.SyntaxMode != null && editor.Options.EnableSyntaxHighlighting ? Document.SyntaxMode : new SyntaxMode(Document);

            TextViewMargin.LayoutWrapper lineLayout = null;
            double brightness = HslColor.Brightness(editor.ColorStyle.PlainText.Background);

            int colorCount = foldSegments.Count + 2;

            cr.SetSourceColor(GetColor(-1, brightness, colorCount));
            cr.Rectangle(area);
            cr.Fill();
            var       rectangles         = new Cairo.Rectangle[foldSegments.Count];
            const int xPadding           = 4;
            const int yPadding           = 2;
            const int rightMarginPadding = 16;

            for (int i = foldSegments.Count - 1; i >= 0; i--)
            {
                var segment = foldSegments [i];
                if (segment.IsInvalid)
                {
                    continue;
                }
                var segmentStartLine = segment.StartLine;
                var segmentEndLine   = segment.EndLine;

                int curWidth = 0;
                var endLine  = segmentEndLine.NextLine;
                var y        = editor.LineToY(segmentStartLine.LineNumber);
                if (y < editor.VAdjustment.Value)
                {
                    segmentStartLine = editor.GetLine(editor.YToLine(editor.VAdjustment.Value));
                    y = editor.LineToY(segmentStartLine.LineNumber);
                }

                for (var curLine = segmentStartLine; curLine != endLine && y < editor.VAdjustment.Value + editor.Allocation.Height; curLine = curLine.NextLine)
                {
                    var curLayout = textViewMargin.CreateLinePartLayout(mode, curLine, curLine.Offset, curLine.Length, -1, -1);
                    var width     = (int)(curLayout.Width);
                    curWidth = System.Math.Max(curWidth, width);
                    y       += editor.GetLineHeight(curLine);
                }

                double xPos = textViewMargin.XOffset;
                double rectangleWidth = 0, rectangleHeight = 0;

                lineLayout = textViewMargin.CreateLinePartLayout(mode, segmentStartLine, segmentStartLine.Offset, segmentStartLine.Length, -1, -1);
                var rectangleStart = lineLayout.Layout.IndexToPos(GetFirstNonWsIdx(lineLayout.Layout.Text));
                xPos = System.Math.Max(textViewMargin.XOffset, (textViewMargin.XOffset + textViewMargin.TextStartPosition + rectangleStart.X / Pango.Scale.PangoScale) - xPadding);

                lineLayout = textViewMargin.CreateLinePartLayout(mode, segmentEndLine, segmentEndLine.Offset, segmentEndLine.Length, -1, -1);

                var rectangleEnd = lineLayout.Layout.IndexToPos(GetFirstNonWsIdx(lineLayout.Layout.Text));
                xPos = System.Math.Min(xPos, System.Math.Max(textViewMargin.XOffset, (textViewMargin.XOffset + textViewMargin.TextStartPosition + rectangleEnd.X / Pango.Scale.PangoScale) - xPadding));

                rectangleWidth = textViewMargin.XOffset + textViewMargin.TextStartPosition + curWidth - xPos + xPadding * 2;

                if (i < foldSegments.Count - 1)
                {
                    rectangleWidth = System.Math.Max((rectangles [i + 1].X + rectangles[i + 1].Width + rightMarginPadding) - xPos, rectangleWidth);
                }

                y = editor.LineToY(segment.StartLine.LineNumber);
                var yEnd = editor.LineToY(segment.EndLine.LineNumber + 1) + (segment.EndLine.LineNumber == editor.LineCount ? editor.LineHeight : 0);
                if (yEnd == 0)
                {
                    yEnd = editor.VAdjustment.Upper;
                }
                rectangleHeight = yEnd - y;

                rectangles[i] = new Cairo.Rectangle(xPos, y - yPadding, rectangleWidth, rectangleHeight + yPadding * 2);
            }

            for (int i = 0; i < foldSegments.Count; i++)
            {
                Cairo.Rectangle clampedRect;
                var             rect = rectangles[i];

                if (i == foldSegments.Count - 1)
                {
/*					var radius = (int)(editor.Options.Zoom * 2);
 *                                      int w = 2 * radius;
 *                                      using (var shadow = new Blur (
 *                                              System.Math.Min ((int)rect.Width + w * 2, editor.Allocation.Width),
 *                                              System.Math.Min ((int)rect.Height + w * 2, editor.Allocation.Height),
 *                                              radius)) {
 *                                              using (var gctx = shadow.GetContext ()) {
 *                                                      gctx.Color = new Cairo.Color (0, 0, 0, 0);
 *                                                      gctx.Fill ();
 *
 *                                                      var a = 0;
 *                                                      var b = 0;
 *                                                      DrawRoundRectangle (gctx, true, true, w - a, w - b, editor.LineHeight / 4, rect.Width + a * 2, rect.Height + a * 2);
 *                                                      var bg = editor.ColorStyle.Default.CairoColor;
 *                                                      gctx.Color = new Cairo.Color (bg.R, bg.G, bg.B, 0.6);
 *                                                      gctx.Fill ();
 *                                              }
 *
 *                                              cr.Save ();
 *                                              cr.Translate (rect.X - w - editor.HAdjustment.Value, rect.Y - editor.VAdjustment.Value - w);
 *                                              shadow.Draw (cr);
 *                                              cr.Restore ();
 *                                      }*/

                    var curPadSize = 1;

                    var age   = (DateTime.Now - startTime).TotalMilliseconds;
                    var alpha = 0.1;
                    if (age < animationLength)
                    {
                        var animationState = age / (double)animationLength;
                        curPadSize = (int)(3 + System.Math.Sin(System.Math.PI * animationState) * 3);
                        alpha      = 0.1 + (1.0 - animationState) / 5;
                    }

                    var bg = editor.ColorStyle.PlainText.Foreground;
                    cr.SetSourceRGBA(bg.R, bg.G, bg.B, alpha);
                    clampedRect = ClampRect(rect.X - editor.HAdjustment.Value - curPadSize, rect.Y - editor.VAdjustment.Value - curPadSize, editor.LineHeight / 2, rect.Width + curPadSize * 2, rect.Height + curPadSize * 2, area);
                    DrawRoundRectangle(cr, true, true, clampedRect.X, clampedRect.Y, editor.LineHeight / 2, clampedRect.Width, clampedRect.Height);
                    cr.Fill();

                    if (age < animationLength)
                    {
                        var animationState = age / (double)animationLength;
                        curPadSize  = (int)(2 + System.Math.Sin(System.Math.PI * animationState) * 2);
                        clampedRect = ClampRect(rect.X - editor.HAdjustment.Value - curPadSize, rect.Y - editor.VAdjustment.Value - curPadSize, editor.LineHeight / 2, rect.Width + curPadSize * 2, rect.Height + curPadSize * 2, area);
                        DrawRoundRectangle(cr, true, true, clampedRect.X, clampedRect.Y, editor.LineHeight / 2, clampedRect.Width, clampedRect.Height);
                        cr.SetSourceColor(GetColor(i, brightness, colorCount));
                        cr.Fill();

                        continue;
                    }
                }

                clampedRect = ClampRect(rect.X - editor.HAdjustment.Value, rect.Y - editor.VAdjustment.Value, editor.LineHeight / 2, rect.Width, rect.Height, area);
                DrawRoundRectangle(cr, true, true, clampedRect.X, clampedRect.Y, editor.LineHeight / 2, clampedRect.Width, clampedRect.Height);

                cr.SetSourceColor(GetColor(i, brightness, colorCount));
                cr.Fill();
            }
        }