public override TextEvulateResult Render(TextElement tag, object vars)
        {
            ColoredInfo info = this.Evulator.CustomDataSingle as ColoredInfo;

            //İşlem öncesinde, mevcut font stilini fazııya alıyoruz.
            lastStyle = info.Font.Style;
            //Büyük küçük duyarlılığı olmayacak.
            string elemName = tag.ElemName.ToLowerInvariant();

            //Girilen elemanın ismine göre işlem yapacak.
            if (elemName == "b") //[B]içerik[/B]
            {
                info.Font = new System.Drawing.Font(info.Font, info.Font.Style | System.Drawing.FontStyle.Bold);
            }
            else if (elemName == "i") //[I]içerik[/I]
            {
                info.Font = new System.Drawing.Font(info.Font, info.Font.Style | System.Drawing.FontStyle.Italic);
            }
            else if (elemName == "u") //[U]içerik[/U]
            {
                info.Font = new System.Drawing.Font(info.Font, info.Font.Style | System.Drawing.FontStyle.Underline);
            }
            else if (elemName == "s") //[S]içerik[/S]
            {
                info.Font = new System.Drawing.Font(info.Font, info.Font.Style | System.Drawing.FontStyle.Strikeout);
            }
            //DepthScan ile tag içerindeki diğer elemanların Evulate işlemi yapması sağlanır.
            return(new TextEvulateResult()
            {
                Result = TextEvulateResultEnum.EVULATE_DEPTHSCAN
            });
        }
        public override void RenderFinish(TextElement tag, object vars, TextEvulateResult latestResult)
        {
            ColoredInfo info = this.Evulator.CustomDataSingle as ColoredInfo;

            //Mevcut tag içerisindeki işlem bittiğinde bir önceki ayarı geri atıyoruz.
            info.Font = new Font(info.Font, lastStyle);
            base.RenderFinish(tag, vars, latestResult);
        }
Exemple #3
0
        public override TextEvulateResult Render(TextElement tag, object vars)
        {
            ColoredInfo info = this.Evulator.CustomDataSingle as ColoredInfo;

            //Bir önceki rengi hafızaya alıyoruz.
            latestColor = info.ForeGroundColor;
            //Mevcut yezi yazı rengini atıyoruz
            //TagAttrib [COLOR=RENK) (TagAttrib bu kısımda RENK olarak kullanılır)
            info.ForeGroundColor = Utils.StringToColor(tag.TagAttrib, info.ForeGroundColor);
            //DepthScan ile tag içerindeki diğer elemanların Evulate işlemi yapması sağlanır.
            return(new TextEvulateResult()
            {
                Result = TextEvulateResultEnum.EVULATE_DEPTHSCAN
            });
        }
Exemple #4
0
        public override TextEvulateResult Render(TextElement tag, object vars)
        {
            ColoredInfo info = this.Evulator.CustomDataSingle as ColoredInfo;
            //Karakter boyutunu hesaplayacağımız sınıfı kuruyorruz.
            StringFormat sf = new StringFormat(StringFormat.GenericTypographic);

            //Hesaplamada kırpmalar olmayacak.
            sf.Trimming = StringTrimming.None;
            //Boşluk karakteride hesaplamaya dâhil edilecek.
            sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;
            //1. karakteerden başlayıp 1 karakterin uzunluğunu heesaplayacak.
            sf.SetMeasurableCharacterRanges(new CharacterRange[] { new CharacterRange()
                                                                   {
                                                                       First = 1, Length = 1
                                                                   } });
            PointF     point = new PointF(info.PointX, info.PointY);
            RectangleF rect  = info.DrawRectangle;

            //Karakte karakter hesaplatmamızın sebebi, metin sarma işleminin hesaplanması ve bazı karakterler arasında oluşan boşluk
            //sebebini düzeltmek içindir.
            for (int i = 0; i < tag.Value.Length; i++)
            {
                //mevcut karakter.
                char cur   = tag.Value[i];
                bool istab = false;
                //tab karakterini boşluk karakteri gibi hesaplayıp 7 ile çarapacak.
                if (cur == '\t')
                {
                    cur   = ' ';
                    istab = true;
                }
                //Karakter iki + içerisinde hesaplatmamızın sebebi, bazı karakterleri doğrudan hesapladığında belirli boşluk problemlerinin
                //ortaya çıkmasıdır.
                RectangleF size = info.Graphics.MeasureCharacterRanges("+" + cur.ToString() + "+", info.Font, rect, sf)[0].GetBounds(info.Graphics);
                if (istab)
                {
                    //Tab karakteri ise sadece width verecek, herhangi bir çizim işlemi uygulamayacak.
                    size.Width *= 7;
                    point.X    += size.Width;
                    continue;
                }
                //Mevcut satır üzerinde maximum büyüklüğü belirtiyoruz.
                if (size.Height > info.MaxH)
                {
                    info.MaxH = size.Height;
                }
                //Mevcut uzunluk, metin alanını genişliğini geçiyorsa, otomatik olarak bir alt satıra geçiş yapacak.
                if (!istab && (cur == '\n' || point.X + size.Width > rect.Width))
                {
                    point.Y  += info.MaxH;
                    point.X   = rect.X;
                    info.MaxH = (cur == '\n') ? 0 : size.Height;
                    info.TotalLines++;
                    if (!info.IsOverlayed && cur != '\n')
                    {
                        info.IsOverlayed = true;
                    }
                    //Mevcut Y konumu çizim alanından büyük ise diğer kısımlar çizilmeyecek işlem burda sonlanacak.
                    if (!info.NoDraw && point.Y + size.Height > rect.Height)
                    {
                        info.PointX = point.X;
                        info.PointY = point.Y;
                        return(new TextEvulateResult()
                        {
                            Result = TextEvulateResultEnum.EVULATE_RETURN
                        });
                    }
                }
                //satır karateri için çizim yapmaz.
                if (cur == '\n')
                {
                    continue;
                }
                //Boşluklar underline gibi özellikleri çizmesi için görünmeyen bir karaktere denk getirdik.
                if (cur == ' ')
                {
                    cur = '\u007F';
                }
                //Mevcut karakteri son konuma göre ekrana çizdiriyoruz.
                if (!info.NoDraw)
                {
                    info.Graphics.DrawString(cur.ToString(), info.Font, new SolidBrush(info.ForeGroundColor), point, sf);
                }

                //Son konuma mevcut karakter boyutunu dâhil ettiriyoruz.
                point.X += size.Width;
            }
            //Diğer evulatörlerin bu değişiklikleri görebilmesi için son konumların atamasını yapıyoruz.
            info.PointX = point.X;
            info.PointY = point.Y;
            //Geriye bir dönüş yapmıyor.
            return(null);
        }