コード例 #1
0
ファイル: SongTool.cs プロジェクト: BackupTheBerlios/zp7-svn
 public ParserState(SongLineParser parser)
 {
     Token = parser.m_token;
     Position = parser.m_index;
     Data = parser.m_data;
 }
コード例 #2
0
        // resi odradkovani, muze se odradkovat jen pri Space
        private IEnumerable<string> GetLines(Graphics gfx)
        {
            List<string> lines = new List<string>();
            float tpos = m_x0, apos = m_x0;
            SongLineParser par = new SongLineParser(m_text);

            SongLineParser.ParserState lastflushed = par.InitState;
            SongLineParser.ParserState lastspace = par.InitState;

            while (true)
            {
                if (par.Current == SongLineParser.Token.Word)
                {
                    float wordwi = (float)gfx.MeasureString(par.Data, Options.TextFont).Width;
                    tpos += wordwi;
                    par.Read();
                }
                else if (par.Current == SongLineParser.Token.Space || par.Current == SongLineParser.Token.End)
                {
                    if ((apos > Options.PageWidth || tpos > Options.PageWidth) && (lastspace.Position > lastflushed.Position))
                    {
                        yield return par.Original.Substring(lastflushed.Position, lastspace.Position - lastflushed.Position);
                        lastflushed = lastspace;
                        par.State = lastspace;
                        apos = tpos = m_x0;
                    }
                    else
                    {
                        if (par.Current == SongLineParser.Token.End) break;
                        tpos += Options.HTextSpace;
                        lastspace = par.State;
                        par.Read();
                    }
                    if (par.Current == SongLineParser.Token.End) break;
                }
                else if (par.Current == SongLineParser.Token.Chord)
                {
                    if (tpos < apos) tpos = apos; // aby nebyly 2 akordy pres sebe
                    apos = tpos;
                    float chordwi = (float)gfx.MeasureString(par.Data, Options.ChordFont).Width;
                    apos += chordwi + Options.HChordSpace;
                    par.Read();
                }
            }
            yield return par.Original.Substring(lastflushed.Position);
        }
コード例 #3
0
        public override float Draw(Graphics gfx, PointF pt, bool dorender)
        {
            float acty = 0;

            foreach (string line in GetLines(gfx))
            {
                float tpos = m_x0, apos = m_x0;
                SongLineParser par = new SongLineParser(line);
                while (par.Current != SongLineParser.Token.End)
                {
                    if (par.Current == SongLineParser.Token.Word)
                    {
                        float wordwi = (float)gfx.MeasureString(par.Data, Options.TextFont).Width;
                        if (dorender) gfx.DrawString(par.Data, Options.TextFont, Options.TextColor, pt.X + tpos, acty + pt.Y + Options.ChordHeight);
                        tpos += wordwi;
                    }
                    if (par.Current == SongLineParser.Token.Space)
                    {
                        tpos += Options.HTextSpace;
                    }
                    if (par.Current == SongLineParser.Token.Chord)
                    {
                        if (tpos < apos) tpos = apos; // aby nebyly 2 akordy pres sebe
                        apos = tpos;
                        float chordwi = (float)gfx.MeasureString(par.Data, Options.ChordFont).Width;
                        if (dorender) gfx.DrawString(par.Data, Options.ChordFont, Options.ChordColor, pt.X + apos, acty + pt.Y);
                        apos += chordwi + Options.HChordSpace;
                    }
                    par.Read();
                }
                acty += Options.ChordHeight + Options.TextHeight;
            }
            DrawLabel(gfx, pt, Options.ChordHeight + Options.TextHeight);

            return acty;
        }
コード例 #4
0
        public override float Draw(Graphics gfx, PointF pt, bool dorender)
        {
            float actx = m_x0;
            float acty = 0;
            SongLineParser par = new SongLineParser(m_text);
            bool wasword = false;
            while (par.Current != SongLineParser.Token.End)
            {
                if (par.Current == SongLineParser.Token.Word)
                {
                    if (wasword) actx += Options.HTextSpace;
                    float wordwi = (float)gfx.MeasureString(par.Data, Options.TextFont).Width;
                    if (actx + wordwi > Options.PageWidth && actx > m_x0) // slovo se nevejde na radku
                    { // odradkujeme
                        actx = m_x0;
                        acty += Options.TextHeight;
                    }
                    if (dorender) gfx.DrawString(par.Data, Options.TextFont, Options.TextColor, pt.X + actx, pt.Y + acty);
                    actx += wordwi;
                    wasword = true;
                }
                par.Read();
            }

            if (actx > 0) acty += Options.TextHeight;
            if (dorender) DrawLabel(gfx, pt, Options.TextHeight);
            return acty;
        }