1 #include "staffcommands.hh"
3 #include "parseconstruct.hh"
10 maybe it's time for a "narrowing" cursor?
13 Staff_commands::first(Real w)
15 PCursor<Command*> pc(*this);
16 while (pc.ok() && pc->when < w)
18 if (!pc.ok() || pc->when != w) {
19 Command *c = new Command(w);
30 RETURN: pc->when == w && pc.ok
34 Staff_commands::last_insertion(Real w)
36 PCursor<Command*> pc(first(w)), next(pc);
37 while (next.ok() && next->when == w) {
41 if (pc->priority != -10000) {
42 Command*c = new Command(w);
54 Staff_commands::add_seq(svec<Command> com, bool checkbreak)
59 Real when = com[0].when;
61 PCursor<Command*> begin(first(when));
62 PCursor<Command*> end(last_insertion(when));
63 if (checkbreak && is_breakable(when)) {
64 if (com[0].priority < 0)
65 while (begin->code != BREAK_END)
68 while (end->code != BREAK_PRE)
71 for (int i = 0; i < com.sz(); i++) {
72 insert_between(com[i], begin, end);
77 Staff_commands::set_breakable(Real when)
79 bool found_typeset(false);
80 PCursor<Command*> cc = first(when);
81 for (; cc.ok() && cc->when == when; cc++) {
84 if (cc->code == TYPESET)
88 assert(!found_typeset);
96 k.code = BREAK_MIDDLE;
109 Staff_commands::is_breakable(Real w)
111 PCursor<Command*> cc = first(w);
112 for (; cc.ok() && cc->when == w; cc++) {
120 Staff_commands::insert_between(Command victim, PCursor<Command*> firstc,
121 PCursor<Command*> last)
123 PCursor<Command*> c(firstc+1);
124 assert(last->when==firstc->when&&firstc < last&&last.ok());
127 if (c->priority <= victim.priority) {
128 c.insert(new Command(victim));
133 last.insert(new Command(victim));
137 Staff_commands::add_command_to_break(Command pre, Command mid, Command post)
141 PCursor<Command*> c ( first(w)), f(c), l(c);
143 while (!c->isbreak())
146 while (!c->isbreak())
150 insert_between(pre, f, l);
152 while (!c->isbreak())
155 insert_between(mid, f, l);
157 while (!c->isbreak())
160 assert(l.ok() && l->when ==w && l->code == BREAK_END);
162 insert_between(post, f, l);
166 Staff_commands::process_add(Command c)
168 bool encapsulate =false;
176 if (c.code == INTERPRET)
178 if (c.args[0] == "BAR") {
179 Command typeset(w); // kut met peren
180 typeset.code = TYPESET;
181 typeset.args = c.args;
182 typeset.priority = 100;
183 process_add(typeset);
184 } else if (c.args[0] == "KEY") {
186 typeset.code = TYPESET;
187 typeset.args.add("KEY");
188 typeset.priority = 70;
189 process_add(typeset);
190 } else if (c.args[0] == "CLEF") {
192 typeset.code = TYPESET;
194 typeset.priority = 90;
195 process_add(typeset);
196 } else if (c.args[0] == "METER") {
198 typeset.code = TYPESET;
200 typeset.priority = 40;
201 process_add(typeset);
207 if (c.code == TYPESET) {
208 if (c.args[0] == "BAR") {
213 { /* every line a currentkey. */
216 kc.args.add( "CURRENTKEY");
220 { /* every line a currentclef. */
223 kc.args.add( "CURRENTCLEF");
228 if (c.args[0] == "METER" && is_breakable(w)) {
234 if( c.args[0] == "KEY" && is_breakable(c.when)) {
240 if (c.args[0] == "CURRENTKEY" && is_breakable(w)) {
244 if (c.args[0] == "CURRENTCLEF" && is_breakable(w)) {
248 if (c.args[0] == "CLEF" && is_breakable(w)) {
257 add_command_to_break(pre, mid, post);
266 first and last column should be breakable.
267 Remove any command past the last musical column.
270 Staff_commands::clean(Real l)
273 if (!is_breakable(0.0)) {
281 PCursor<Command*> bot(bottom());
283 while (bot.ok() && bot->when > l) {
290 if (!is_breakable(l)) {
301 Staff_commands::OK() const
303 for (PCursor<Command*> cc(*this); cc.ok() && (cc+1).ok(); cc++) {
304 assert(cc->when <= (cc+1)->when);
305 if (cc->when == (cc+1)->when && !cc->isbreak() && !(cc+1)->isbreak())
306 assert(cc->priority >= (cc+1)->priority);
311 Staff_commands::print() const
314 for (PCursor<Command*> cc(*this); cc.ok() ; cc++) {