public override float Draw(XGraphics 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, new PointF(pt.X + tpos, acty + pt.Y + Options.ChordHeight), XStringFormat.TopLeft); 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, new PointF(pt.X + apos, acty + pt.Y), XStringFormat.TopLeft); apos += chordwi + Options.HChordSpace; } par.Read(); } acty += Options.ChordHeight + Options.TextHeight; } DrawLabel(gfx, pt, Options.ChordHeight + Options.TextHeight); return acty; }
// resi odradkovani, muze se odradkovat jen pri Space private IEnumerable<string> GetLines(XGraphics 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); }
private void MakeInChordLine(string line, TextWriter fw) { BeginLine(GetLabel(), fw, LineType.MIXED); SongLineParser par = new SongLineParser(line); while (par.Current != SongLineParser.Token.End) { switch (par.Current) { case SongLineParser.Token.Word: DumpText(par.Data, fw); break; case SongLineParser.Token.Chord: int reallen = par.Data.Length; DumpChord(par.Data, fw, ref reallen); break; case SongLineParser.Token.Space: DumpText(" ", fw); break; } par.Read(); } EndLine(fw, LineType.MIXED); }
public override float Draw(XGraphics 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, new PointF(pt.X + actx, pt.Y + acty), XStringFormat.TopLeft); actx += wordwi; wasword = true; } par.Read(); } if (actx > 0) acty += Options.TextHeight; if (dorender) DrawLabel(gfx, pt, Options.TextHeight); return acty; }
private void MakeNormalChordLine(string line, TextWriter fw) { StringBuilder tline = new StringBuilder(), chline = new StringBuilder(), chordsp = new StringBuilder(); int tpos = 0, apos = 0;//pozice, kam se pise text,akord BeginLine(m_labelsp, fw, LineType.CHORD); SongLineParser par = new SongLineParser(line); while (par.Current != SongLineParser.Token.End) { switch (par.Current) { case SongLineParser.Token.Word: tline.Append(par.Data); tpos += par.Data.Length; break; case SongLineParser.Token.Chord: while (apos < tpos) { chordsp.Append(' '); apos++; } DumpChordSpace(chordsp.ToString(), fw); chordsp = new StringBuilder(); int reallen = par.Data.Length; DumpChord(par.Data, fw, ref reallen); apos += reallen; chordsp.Append(' '); apos++; break; case SongLineParser.Token.Space: tline.Append(" "); tpos += 1; break; } par.Read(); } EndLine(fw, LineType.CHORD); BeginLine(GetLabel(), fw, LineType.TEXT); DumpText(tline.ToString(), fw); EndLine(fw, LineType.TEXT); }