3 * Provides a state machine implementation of the various button policies
5 * Author: Allan Rae <rae@lyx.org>
7 * ======================================================
9 * LyX, The Document Processor
11 * Copyright 1995 Matthias Ettrich
12 * Copyright 1995-2000 The LyX Team.
14 * This file Copyright 2000
16 * ======================================================
21 #include "ButtonPolicies.h"
27 void nextState(ButtonPolicy::State & state,
28 ButtonPolicy::SMInput in,
29 ButtonPolicy::StateMachine const & s_m,
30 char const * function_name = "nextState")
32 ButtonPolicy::State tmp = s_m[state][in];
33 if (ButtonPolicy::BOGUS != tmp) {
36 lyxerr << function_name
37 << ": No transition for input "
46 /*-----------------------------PreferencesPolicy-----------------------------*/
49 PreferencesPolicy::PreferencesPolicy()
51 outputs_(APPLIED + 1, ButtonPolicy::ALL_BUTTONS),
52 state_machine_(APPLIED + 1,
53 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS))
55 // Build the state output map
56 outputs_[INITIAL] = CLOSE;
57 outputs_[VALID] = UNDO_ALL | OKAY | APPLY | CANCEL;
58 outputs_[INVALID] = UNDO_ALL | CANCEL;
59 outputs_[APPLIED] = OKAY | CLOSE;
61 // Build the state machine one state at a time
62 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
63 // left out of the state machine and handled explicitly
64 // in input(). This won't necessarily be true for all
65 // policies though so I'll leave those two as distinct
66 // inputs rather than merge them. For example, a dialog
67 // that doesn't update it's input fields when reshown
68 // after being hidden needs a policy where CANCEL and
69 // HIDE are treated differently.
72 state_machine_[INITIAL][SMI_READ_ONLY] = INITIAL;
73 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
74 state_machine_[INITIAL][SMI_VALID] = VALID;
75 state_machine_[INITIAL][SMI_INVALID] = INVALID;
77 state_machine_[VALID][SMI_VALID] = VALID;
78 state_machine_[VALID][SMI_READ_ONLY] = VALID;
79 state_machine_[VALID][SMI_READ_WRITE] = VALID;
80 state_machine_[VALID][SMI_INVALID] = INVALID;
81 state_machine_[VALID][SMI_APPLY] = APPLIED;
82 state_machine_[VALID][SMI_OKAY] = INITIAL;
83 state_machine_[VALID][SMI_UNDO_ALL] = INITIAL;
85 state_machine_[INVALID][SMI_VALID] = VALID;
86 state_machine_[INVALID][SMI_INVALID] = INVALID;
87 state_machine_[INVALID][SMI_READ_ONLY] = INVALID;
88 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
89 state_machine_[INVALID][SMI_UNDO_ALL] = INITIAL;
91 state_machine_[APPLIED][SMI_VALID] = VALID;
92 state_machine_[APPLIED][SMI_INVALID] = INVALID;
93 state_machine_[APPLIED][SMI_OKAY] = INITIAL;
94 state_machine_[APPLIED][SMI_READ_ONLY] = APPLIED;
95 state_machine_[APPLIED][SMI_READ_WRITE] = APPLIED;
99 void PreferencesPolicy::input(SMInput input)
101 lyxerr << "PreferencesPolicy::input" << endl;
102 // CANCEL and HIDE always take us to INITIAL for all cases.
103 // Note that I didn't put that special case in the helper function
104 // because it doesn't belong there. Some other
105 // This is probably optimising for the wrong case since it occurs as the
106 // dialog will be hidden. It would have saved a little memory in the
107 // state machine if I could have gotten map working. ARRae 20000813
108 if (SMI_CANCEL == input
109 || SMI_HIDE == input) {
115 "PreferencesPolicy");
120 /*-------------------------------OkCancelPolicy------------------------------*/
123 OkCancelPolicy::OkCancelPolicy()
125 outputs_(INVALID + 1, ButtonPolicy::ALL_BUTTONS),
126 state_machine_(INVALID + 1,
127 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS))
129 // Build the state output map
130 outputs_[INITIAL] = CLOSE;
131 outputs_[VALID] = UNDO_ALL | OKAY | CANCEL;
132 outputs_[INVALID] = UNDO_ALL | CANCEL;
134 // Build the state machine one state at a time
135 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
136 // left out of the state machine and handled explicitly
140 state_machine_[INITIAL][SMI_READ_ONLY] = INITIAL;
141 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
142 state_machine_[INITIAL][SMI_VALID] = VALID;
143 state_machine_[INITIAL][SMI_INVALID] = INVALID;
145 state_machine_[VALID][SMI_VALID] = VALID;
146 state_machine_[VALID][SMI_READ_ONLY] = VALID;
147 state_machine_[VALID][SMI_READ_WRITE] = VALID;
148 state_machine_[VALID][SMI_INVALID] = INVALID;
149 state_machine_[VALID][SMI_OKAY] = INITIAL;
150 state_machine_[VALID][SMI_UNDO_ALL] = INITIAL;
152 state_machine_[INVALID][SMI_VALID] = VALID;
153 state_machine_[INVALID][SMI_INVALID] = INVALID;
154 state_machine_[INVALID][SMI_READ_ONLY] = INVALID;
155 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
156 state_machine_[INVALID][SMI_UNDO_ALL] = INITIAL;
161 void OkCancelPolicy::input(SMInput input)
163 lyxerr << "OkCancelPolicy::input" << endl;
165 // CANCEL and HIDE always take us to INITIAL for all cases
166 if (SMI_CANCEL == input
167 || SMI_HIDE == input) {
170 nextState(state_, input, state_machine_, "OkCancelPolicy");
175 /*---------------------------OkCancelReadOnlyPolicy-------------------------*/
178 OkCancelReadOnlyPolicy::OkCancelReadOnlyPolicy()
180 outputs_(RO_INVALID + 1, ButtonPolicy::ALL_BUTTONS),
181 state_machine_(RO_INVALID + 1,
182 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS))
184 // Build the state output map
185 outputs_[INITIAL] = CLOSE;
186 outputs_[VALID] = UNDO_ALL | OKAY | CANCEL;
187 outputs_[INVALID] = UNDO_ALL | CANCEL;
188 outputs_[RO_INITIAL] = CLOSE;
189 outputs_[RO_VALID] = UNDO_ALL | CANCEL;
190 outputs_[RO_INVALID] = UNDO_ALL | CANCEL;
192 // Build the state machine one state at a time
193 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
194 // left out of the state machine and handled explicitly
198 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
199 state_machine_[INITIAL][SMI_VALID] = VALID;
200 state_machine_[INITIAL][SMI_INVALID] = INVALID;
201 state_machine_[INITIAL][SMI_READ_ONLY] = RO_INITIAL;
203 state_machine_[VALID][SMI_VALID] = VALID;
204 state_machine_[VALID][SMI_READ_WRITE] = VALID;
205 state_machine_[VALID][SMI_INVALID] = INVALID;
206 state_machine_[VALID][SMI_OKAY] = INITIAL;
207 state_machine_[VALID][SMI_UNDO_ALL] = INITIAL;
208 state_machine_[VALID][SMI_READ_ONLY] = RO_VALID;
210 state_machine_[INVALID][SMI_INVALID] = INVALID;
211 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
212 state_machine_[INVALID][SMI_VALID] = VALID;
213 state_machine_[INVALID][SMI_UNDO_ALL] = INITIAL;
214 state_machine_[INVALID][SMI_READ_ONLY] = RO_INVALID;
216 state_machine_[RO_INITIAL][SMI_READ_ONLY] = RO_INITIAL;
217 state_machine_[RO_INITIAL][SMI_VALID] = RO_VALID;
218 state_machine_[RO_INITIAL][SMI_INVALID] = RO_INVALID;
219 state_machine_[RO_INITIAL][SMI_READ_WRITE] = INITIAL;
221 state_machine_[RO_VALID][SMI_VALID] = RO_VALID;
222 state_machine_[RO_VALID][SMI_READ_ONLY] = RO_VALID;
223 state_machine_[RO_VALID][SMI_INVALID] = RO_INVALID;
224 state_machine_[RO_VALID][SMI_READ_WRITE] = VALID;
225 state_machine_[RO_VALID][SMI_UNDO_ALL] = RO_INITIAL;
227 state_machine_[RO_INVALID][SMI_READ_ONLY] = RO_INVALID;
228 state_machine_[RO_INVALID][SMI_INVALID] = RO_INVALID;
229 state_machine_[RO_INVALID][SMI_VALID] = RO_VALID;
230 state_machine_[RO_INVALID][SMI_READ_WRITE] = INVALID;
231 state_machine_[RO_INVALID][SMI_UNDO_ALL] = RO_INITIAL;
235 void OkCancelReadOnlyPolicy::input(SMInput input)
237 lyxerr << "OkCancelReadOnlyPolicy" << endl;
239 // CANCEL and HIDE always take us to INITIAL for all cases
240 if (SMI_CANCEL == input
241 || SMI_HIDE == input) {
247 "OkCancelReadOnlyPolicy");
252 /*--------------------------NoRepeatedApplyReadOnlyPolicy----------------------*/
255 NoRepeatedApplyReadOnlyPolicy::NoRepeatedApplyReadOnlyPolicy()
257 outputs_(RO_INVALID + 1, ButtonPolicy::ALL_BUTTONS),
258 state_machine_(RO_INVALID + 1,
259 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS))
261 // Build the state output map
262 outputs_[INITIAL] = CLOSE;
263 outputs_[VALID] = UNDO_ALL | OKAY | APPLY | CANCEL;
264 outputs_[INVALID] = UNDO_ALL | CANCEL;
265 outputs_[RO_INITIAL] = CLOSE;
266 outputs_[RO_VALID] = UNDO_ALL | CANCEL;
267 outputs_[RO_INVALID] = UNDO_ALL | CANCEL;
269 // Build the state machine one state at a time
270 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
271 // left out of the state machine and handled explicitly
275 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
276 state_machine_[INITIAL][SMI_VALID] = VALID;
277 state_machine_[INITIAL][SMI_INVALID] = INVALID;
278 state_machine_[INITIAL][SMI_READ_ONLY] = RO_INITIAL;
280 state_machine_[VALID][SMI_VALID] = VALID;
281 state_machine_[VALID][SMI_READ_WRITE] = VALID;
282 state_machine_[VALID][SMI_INVALID] = INVALID;
283 state_machine_[VALID][SMI_OKAY] = INITIAL;
284 state_machine_[VALID][SMI_APPLY] = INITIAL;
285 state_machine_[VALID][SMI_UNDO_ALL] = INITIAL;
286 state_machine_[VALID][SMI_READ_ONLY] = RO_VALID;
288 state_machine_[INVALID][SMI_INVALID] = INVALID;
289 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
290 state_machine_[INVALID][SMI_VALID] = VALID;
291 state_machine_[INVALID][SMI_UNDO_ALL] = INITIAL;
292 state_machine_[INVALID][SMI_READ_ONLY] = RO_INVALID;
294 state_machine_[RO_INITIAL][SMI_READ_ONLY] = RO_INITIAL;
295 state_machine_[RO_INITIAL][SMI_VALID] = RO_VALID;
296 state_machine_[RO_INITIAL][SMI_INVALID] = RO_INVALID;
297 state_machine_[RO_INITIAL][SMI_READ_WRITE] = INITIAL;
299 state_machine_[RO_VALID][SMI_VALID] = RO_VALID;
300 state_machine_[RO_VALID][SMI_READ_ONLY] = RO_VALID;
301 state_machine_[RO_VALID][SMI_INVALID] = RO_INVALID;
302 state_machine_[RO_VALID][SMI_READ_WRITE] = VALID;
303 state_machine_[RO_VALID][SMI_UNDO_ALL] = RO_INITIAL;
305 state_machine_[RO_INVALID][SMI_INVALID] = RO_INVALID;
306 state_machine_[RO_INVALID][SMI_READ_ONLY] = RO_INVALID;
307 state_machine_[RO_INVALID][SMI_VALID] = RO_VALID;
308 state_machine_[RO_INVALID][SMI_READ_WRITE] = INVALID;
309 state_machine_[RO_INVALID][SMI_UNDO_ALL] = RO_INITIAL;
313 void NoRepeatedApplyReadOnlyPolicy::input(SMInput input)
315 lyxerr << "NoReapeatedApplyReadOnlyPolicy::input" << endl;
317 // CANCEL and HIDE always take us to INITIAL for all cases
318 if (SMI_CANCEL == input
319 || SMI_HIDE == input) {
325 "NoRepeatedApplyReadOnlyPolicy");
330 /*--------------------------OkApplyCancelReadOnlyPolicy----------------------*/
333 OkApplyCancelReadOnlyPolicy::OkApplyCancelReadOnlyPolicy()
335 outputs_(RO_APPLIED + 1, ButtonPolicy::ALL_BUTTONS),
336 state_machine_(RO_APPLIED + 1,
337 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS))
339 // Build the state output map
340 outputs_[INITIAL] = CLOSE;
341 outputs_[VALID] = UNDO_ALL | OKAY | APPLY | CANCEL;
342 outputs_[INVALID] = UNDO_ALL | CANCEL;
343 outputs_[APPLIED] = OKAY | APPLY | CLOSE;
344 outputs_[RO_INITIAL] = CLOSE;
345 outputs_[RO_VALID] = UNDO_ALL | CANCEL;
346 outputs_[RO_INVALID] = UNDO_ALL | CANCEL;
347 outputs_[RO_APPLIED] = CLOSE;
349 // Build the state machine one state at a time
350 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
351 // left out of the state machine and handled explicitly
355 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
356 state_machine_[INITIAL][SMI_VALID] = VALID;
357 state_machine_[INITIAL][SMI_INVALID] = INVALID;
358 state_machine_[INITIAL][SMI_READ_ONLY] = RO_INITIAL;
360 state_machine_[VALID][SMI_VALID] = VALID;
361 state_machine_[VALID][SMI_READ_WRITE] = VALID;
362 state_machine_[VALID][SMI_INVALID] = INVALID;
363 state_machine_[VALID][SMI_OKAY] = INITIAL;
364 state_machine_[VALID][SMI_UNDO_ALL] = INITIAL;
365 state_machine_[VALID][SMI_APPLY] = APPLIED;
366 state_machine_[VALID][SMI_READ_ONLY] = RO_VALID;
368 state_machine_[INVALID][SMI_INVALID] = INVALID;
369 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
370 state_machine_[INVALID][SMI_VALID] = VALID;
371 state_machine_[INVALID][SMI_UNDO_ALL] = INITIAL;
372 state_machine_[INVALID][SMI_READ_ONLY] = RO_INVALID;
374 state_machine_[APPLIED][SMI_APPLY] = APPLIED;
375 state_machine_[APPLIED][SMI_READ_WRITE] = APPLIED;
376 state_machine_[APPLIED][SMI_VALID] = VALID;
377 state_machine_[APPLIED][SMI_INVALID] = INVALID;
378 state_machine_[APPLIED][SMI_OKAY] = INITIAL;
379 state_machine_[APPLIED][SMI_READ_ONLY] = RO_APPLIED;
381 state_machine_[RO_INITIAL][SMI_READ_ONLY] = RO_INITIAL;
382 state_machine_[RO_INITIAL][SMI_VALID] = RO_VALID;
383 state_machine_[RO_INITIAL][SMI_INVALID] = RO_INVALID;
384 state_machine_[RO_INITIAL][SMI_READ_WRITE] = INITIAL;
386 state_machine_[RO_VALID][SMI_VALID] = RO_VALID;
387 state_machine_[RO_VALID][SMI_READ_ONLY] = RO_VALID;
388 state_machine_[RO_VALID][SMI_INVALID] = RO_INVALID;
389 state_machine_[RO_VALID][SMI_READ_WRITE] = VALID;
390 state_machine_[RO_VALID][SMI_UNDO_ALL] = RO_INITIAL;
392 state_machine_[RO_INVALID][SMI_INVALID] = RO_INVALID;
393 state_machine_[RO_INVALID][SMI_READ_ONLY] = RO_INVALID;
394 state_machine_[RO_INVALID][SMI_VALID] = RO_VALID;
395 state_machine_[RO_INVALID][SMI_READ_WRITE] = INVALID;
396 state_machine_[RO_INVALID][SMI_UNDO_ALL] = RO_INITIAL;
398 state_machine_[RO_APPLIED][SMI_READ_ONLY] = RO_APPLIED;
399 state_machine_[RO_APPLIED][SMI_INVALID] = RO_INVALID;
400 state_machine_[RO_APPLIED][SMI_VALID] = RO_VALID;
401 state_machine_[RO_APPLIED][SMI_READ_WRITE] = APPLIED;
405 void OkApplyCancelReadOnlyPolicy::input(SMInput input)
407 lyxerr << "OkApplyCancelReadOnlyPolicy::input" << endl;
409 // CANCEL and HIDE always take us to INITIAL for all cases
410 if (SMI_CANCEL == input
411 || SMI_HIDE == input) {
417 "OkApplyCancelReadOnlyPolicy");
422 /*--------------------------OkApplyCancelPolicy----------------------*/
425 OkApplyCancelPolicy::OkApplyCancelPolicy()
427 outputs_(APPLIED + 1, ButtonPolicy::ALL_BUTTONS),
428 state_machine_(APPLIED + 1,
429 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS))
431 // Build the state output map
432 outputs_[INITIAL] = CLOSE;
433 outputs_[VALID] = UNDO_ALL | OKAY | APPLY | CANCEL;
434 outputs_[INVALID] = UNDO_ALL | CANCEL;
435 outputs_[APPLIED] = OKAY | APPLY | CLOSE;
437 // Build the state machine one state at a time
438 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
439 // left out of the state machine and handled explicitly
443 state_machine_[INITIAL][SMI_READ_ONLY] = INITIAL;
444 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
445 state_machine_[INITIAL][SMI_VALID] = VALID;
446 state_machine_[INITIAL][SMI_INVALID] = INVALID;
448 state_machine_[VALID][SMI_VALID] = VALID;
449 state_machine_[VALID][SMI_READ_ONLY] = VALID;
450 state_machine_[VALID][SMI_READ_WRITE] = VALID;
451 state_machine_[VALID][SMI_INVALID] = INVALID;
452 state_machine_[VALID][SMI_OKAY] = INITIAL;
453 state_machine_[VALID][SMI_UNDO_ALL] = INITIAL;
454 state_machine_[VALID][SMI_APPLY] = APPLIED;
456 state_machine_[INVALID][SMI_INVALID] = INVALID;
457 state_machine_[INVALID][SMI_READ_ONLY] = INVALID;
458 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
459 state_machine_[INVALID][SMI_VALID] = VALID;
460 state_machine_[INVALID][SMI_UNDO_ALL] = INITIAL;
462 state_machine_[APPLIED][SMI_APPLY] = APPLIED;
463 state_machine_[APPLIED][SMI_READ_ONLY] = APPLIED;
464 state_machine_[APPLIED][SMI_READ_WRITE] = APPLIED;
465 state_machine_[APPLIED][SMI_VALID] = VALID;
466 state_machine_[APPLIED][SMI_INVALID] = INVALID;
467 state_machine_[APPLIED][SMI_OKAY] = INITIAL;
471 void OkApplyCancelPolicy::input(SMInput input)
473 lyxerr << "OkApplyCancelPolicy::input" << endl;
475 // CANCEL and HIDE always take us to INITIAL for all cases
476 if (SMI_CANCEL == input
477 || SMI_HIDE == input) {
483 "OkApplyCancelPolicy");
488 /*--------------------------NoRepeatedApplyPolicy----------------------*/
491 NoRepeatedApplyPolicy::NoRepeatedApplyPolicy()
493 outputs_(INVALID + 1, ButtonPolicy::ALL_BUTTONS),
494 state_machine_(INVALID + 1,
495 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS))
497 // Build the state output map
498 outputs_[INITIAL] = CLOSE;
499 outputs_[VALID] = UNDO_ALL | OKAY | APPLY | CANCEL;
500 outputs_[INVALID] = UNDO_ALL | CANCEL;
502 // Build the state machine one state at a time
503 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
504 // left out of the state machine and handled explicitly
508 state_machine_[INITIAL][SMI_READ_ONLY] = INITIAL;
509 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
510 state_machine_[INITIAL][SMI_VALID] = VALID;
511 state_machine_[INITIAL][SMI_INVALID] = INVALID;
513 state_machine_[VALID][SMI_VALID] = VALID;
514 state_machine_[VALID][SMI_READ_ONLY] = VALID;
515 state_machine_[VALID][SMI_READ_WRITE] = VALID;
516 state_machine_[VALID][SMI_INVALID] = INVALID;
517 state_machine_[VALID][SMI_OKAY] = INITIAL;
518 state_machine_[VALID][SMI_APPLY] = INITIAL;
519 state_machine_[VALID][SMI_UNDO_ALL] = INITIAL;
521 state_machine_[INVALID][SMI_INVALID] = INVALID;
522 state_machine_[INVALID][SMI_READ_ONLY] = INVALID;
523 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
524 state_machine_[INVALID][SMI_VALID] = VALID;
525 state_machine_[INVALID][SMI_UNDO_ALL] = INITIAL;
529 void NoRepeatedApplyPolicy::input(SMInput input)
531 lyxerr << "NoRepeatedApplyPolicy::input" << endl;
533 // CANCEL and HIDE always take us to INITIAL for all cases
534 if (SMI_CANCEL == input
535 || SMI_HIDE == input) {
541 "NoRepeatedApplyPolicy");