2 * \file ButtonPolicy.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 #include "ButtonPolicy.h"
21 ButtonPolicy::ButtonPolicy(Policy policy)
30 case OkCancelReadOnlyPolicy:
31 initOkCancelReadOnly();
33 case OkApplyCancelPolicy:
36 case OkApplyCancelReadOnlyPolicy:
37 initOkApplyCancelReadOnly();
39 case NoRepeatedApplyPolicy:
40 initNoRepeatedApply();
42 case NoRepeatedApplyReadOnlyPolicy:
43 initNoRepeatedApplyReadOnly();
45 case PreferencesPolicy:
54 char const * functionName(ButtonPolicy::Policy policy)
57 case ButtonPolicy::PreferencesPolicy:
58 return "PreferencesPolicy";
59 case ButtonPolicy::OkCancelPolicy:
60 return "OkCancelPolicy";
61 case ButtonPolicy::OkCancelReadOnlyPolicy:
62 return "OkCancelReadOnlyPolicy";
63 case ButtonPolicy::OkApplyCancelPolicy:
64 return "OkApplyCancelPolicy";
65 case ButtonPolicy::OkApplyCancelReadOnlyPolicy:
66 return "OkApplyCancelReadOnlyPolicy";
67 case ButtonPolicy::NoRepeatedApplyPolicy:
68 return "NoRepeatedApplyPolicy";
69 case ButtonPolicy::NoRepeatedApplyReadOnlyPolicy:
70 return "NoRepeatedApplyReadOnlyPolicy";
71 case ButtonPolicy::IgnorantPolicy:
72 return "IgnorantPolicy";
74 return "Unknown policy";
79 void ButtonPolicy::input(SMInput input)
82 case PreferencesPolicy:
83 // The APPLIED state is persistent. Next time the dialog is opened,
84 // the user will be able to press 'Save'.
85 if (SMI_CANCEL == input || SMI_HIDE == input) {
86 if (state_ != APPLIED)
95 // CANCEL and HIDE always take us to INITIAL for all cases
96 if (SMI_CANCEL == input || SMI_HIDE == input)
105 bool ButtonPolicy::buttonStatus(Button button) const
107 return policy_ == IgnorantPolicy ? true : button & outputs_[state_];
111 bool ButtonPolicy::isReadOnly() const
114 case NoRepeatedApplyReadOnlyPolicy:
115 case OkCancelReadOnlyPolicy:
116 case OkApplyCancelReadOnlyPolicy:
117 return RO_INITIAL == state_
118 || RO_VALID == state_
119 || RO_INVALID == state_
120 || RO_APPLIED == state_;
127 static char const * const printState(ButtonPolicy::State const & state)
130 case ButtonPolicy::INITIAL:
132 case ButtonPolicy::VALID:
134 case ButtonPolicy::INVALID:
136 case ButtonPolicy::APPLIED:
138 case ButtonPolicy::RO_INITIAL:
140 case ButtonPolicy::RO_VALID:
142 case ButtonPolicy::RO_INVALID:
144 case ButtonPolicy::RO_APPLIED:
146 case ButtonPolicy::BOGUS:
154 static char const * const printInput(ButtonPolicy::SMInput const & input)
157 case ButtonPolicy::SMI_VALID:
159 case ButtonPolicy::SMI_INVALID:
160 return "SMI_INVALID";
161 case ButtonPolicy::SMI_OKAY:
163 case ButtonPolicy::SMI_APPLY:
165 case ButtonPolicy::SMI_CANCEL:
167 case ButtonPolicy::SMI_RESTORE:
168 return "SMI_RESTORE";
169 case ButtonPolicy::SMI_HIDE:
171 case ButtonPolicy::SMI_READ_ONLY:
172 return "SMI_READ_ONLY";
173 case ButtonPolicy::SMI_READ_WRITE:
174 return "SMI_READ_WRITE";
175 case ButtonPolicy::SMI_NOOP:
177 case ButtonPolicy::SMI_TOTAL:
185 void ButtonPolicy::nextState(SMInput input)
187 if (SMI_NOOP == input)
190 State tmp = state_machine_[state_][input];
192 LYXERR(Debug::GUI) << "Transition from state "
193 << printState(state_) << " to state "
194 << printState(tmp) << " after input "
195 << printInput(input) << std::endl;
200 lyxerr << functionName(policy_)
201 << ": No transition for input "
204 << printState(state_)
210 void ButtonPolicy::initPreferences()
212 outputs_ = StateOutputs(APPLIED + 1, ButtonPolicy::ALL_BUTTONS);
213 state_machine_ = StateMachine(APPLIED + 1,
214 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS));
216 // Build the state output map
217 outputs_[INITIAL] = CLOSE;
218 outputs_[VALID] = RESTORE | OKAY | APPLY | CANCEL;
219 outputs_[INVALID] = RESTORE | CANCEL;
220 outputs_[APPLIED] = OKAY | CLOSE;
222 // Build the state machine one state at a time
223 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
224 // left out of the state machine and handled explicitly
225 // in input(). This won't necessarily be true for all
226 // policies though so I'll leave those two as distinct
227 // inputs rather than merge them. For example, a dialog
228 // that doesn't update it's input fields when reshown
229 // after being hidden needs a policy where CANCEL and
230 // HIDE are treated differently.
233 state_machine_[INITIAL][SMI_READ_ONLY] = INITIAL;
234 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
235 state_machine_[INITIAL][SMI_VALID] = VALID;
236 state_machine_[INITIAL][SMI_INVALID] = INVALID;
238 state_machine_[VALID][SMI_VALID] = VALID;
239 state_machine_[VALID][SMI_READ_ONLY] = VALID;
240 state_machine_[VALID][SMI_READ_WRITE] = VALID;
241 state_machine_[VALID][SMI_INVALID] = INVALID;
242 state_machine_[VALID][SMI_APPLY] = APPLIED;
243 state_machine_[VALID][SMI_OKAY] = INITIAL;
244 state_machine_[VALID][SMI_RESTORE] = INITIAL;
246 state_machine_[INVALID][SMI_VALID] = VALID;
247 state_machine_[INVALID][SMI_INVALID] = INVALID;
248 state_machine_[INVALID][SMI_READ_ONLY] = INVALID;
249 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
250 state_machine_[INVALID][SMI_RESTORE] = INITIAL;
252 state_machine_[APPLIED][SMI_VALID] = VALID;
253 state_machine_[APPLIED][SMI_INVALID] = INVALID;
254 state_machine_[APPLIED][SMI_OKAY] = INITIAL;
255 state_machine_[APPLIED][SMI_READ_ONLY] = APPLIED;
256 state_machine_[APPLIED][SMI_READ_WRITE] = APPLIED;
260 void ButtonPolicy::initOkCancel()
262 outputs_ = StateOutputs(INVALID + 1, ButtonPolicy::ALL_BUTTONS);
263 state_machine_ = StateMachine(INVALID + 1,
264 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS));
266 // Build the state output map
267 outputs_[INITIAL] = CLOSE;
268 outputs_[VALID] = RESTORE | OKAY | CANCEL;
269 outputs_[INVALID] = RESTORE | CANCEL;
271 // Build the state machine one state at a time
272 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
273 // left out of the state machine and handled explicitly
277 state_machine_[INITIAL][SMI_READ_ONLY] = INITIAL;
278 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
279 state_machine_[INITIAL][SMI_VALID] = VALID;
280 state_machine_[INITIAL][SMI_INVALID] = INVALID;
282 state_machine_[VALID][SMI_VALID] = VALID;
283 state_machine_[VALID][SMI_READ_ONLY] = VALID;
284 state_machine_[VALID][SMI_READ_WRITE] = VALID;
285 state_machine_[VALID][SMI_INVALID] = INVALID;
286 state_machine_[VALID][SMI_OKAY] = INITIAL;
287 state_machine_[VALID][SMI_RESTORE] = INITIAL;
289 state_machine_[INVALID][SMI_VALID] = VALID;
290 state_machine_[INVALID][SMI_INVALID] = INVALID;
291 state_machine_[INVALID][SMI_READ_ONLY] = INVALID;
292 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
293 state_machine_[INVALID][SMI_RESTORE] = INITIAL;
297 void ButtonPolicy::initOkCancelReadOnly()
299 outputs_ = StateOutputs(RO_INVALID + 1, ButtonPolicy::ALL_BUTTONS);
300 state_machine_ = StateMachine(RO_INVALID + 1,
301 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS));
303 // Build the state output map
304 outputs_[INITIAL] = CLOSE;
305 outputs_[VALID] = RESTORE | OKAY | CANCEL;
306 outputs_[INVALID] = RESTORE | CANCEL;
307 outputs_[RO_INITIAL] = CLOSE;
308 outputs_[RO_VALID] = RESTORE | CANCEL;
309 outputs_[RO_INVALID] = RESTORE | CANCEL;
311 // Build the state machine one state at a time
312 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
313 // left out of the state machine and handled explicitly
317 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
318 state_machine_[INITIAL][SMI_VALID] = VALID;
319 state_machine_[INITIAL][SMI_INVALID] = INVALID;
320 state_machine_[INITIAL][SMI_READ_ONLY] = RO_INITIAL;
322 state_machine_[VALID][SMI_VALID] = VALID;
323 state_machine_[VALID][SMI_READ_WRITE] = VALID;
324 state_machine_[VALID][SMI_INVALID] = INVALID;
325 state_machine_[VALID][SMI_OKAY] = INITIAL;
326 state_machine_[VALID][SMI_RESTORE] = INITIAL;
327 state_machine_[VALID][SMI_READ_ONLY] = RO_VALID;
329 state_machine_[INVALID][SMI_INVALID] = INVALID;
330 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
331 state_machine_[INVALID][SMI_VALID] = VALID;
332 state_machine_[INVALID][SMI_RESTORE] = INITIAL;
333 state_machine_[INVALID][SMI_READ_ONLY] = RO_INVALID;
335 state_machine_[RO_INITIAL][SMI_READ_ONLY] = RO_INITIAL;
336 state_machine_[RO_INITIAL][SMI_VALID] = RO_VALID;
337 state_machine_[RO_INITIAL][SMI_INVALID] = RO_INVALID;
338 state_machine_[RO_INITIAL][SMI_READ_WRITE] = INITIAL;
340 state_machine_[RO_VALID][SMI_VALID] = RO_VALID;
341 state_machine_[RO_VALID][SMI_READ_ONLY] = RO_VALID;
342 state_machine_[RO_VALID][SMI_INVALID] = RO_INVALID;
343 state_machine_[RO_VALID][SMI_READ_WRITE] = VALID;
344 state_machine_[RO_VALID][SMI_RESTORE] = RO_INITIAL;
346 state_machine_[RO_INVALID][SMI_READ_ONLY] = RO_INVALID;
347 state_machine_[RO_INVALID][SMI_INVALID] = RO_INVALID;
348 state_machine_[RO_INVALID][SMI_VALID] = RO_VALID;
349 state_machine_[RO_INVALID][SMI_READ_WRITE] = INVALID;
350 state_machine_[RO_INVALID][SMI_RESTORE] = RO_INITIAL;
354 void ButtonPolicy::initNoRepeatedApplyReadOnly()
356 outputs_ = StateOutputs(RO_INVALID + 1, ButtonPolicy::ALL_BUTTONS);
357 state_machine_ = StateMachine(RO_INVALID + 1,
358 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS));
360 // Build the state output map
361 outputs_[INITIAL] = CLOSE;
362 outputs_[VALID] = RESTORE | OKAY | APPLY | CANCEL;
363 outputs_[INVALID] = RESTORE | CANCEL;
364 outputs_[RO_INITIAL] = CLOSE;
365 outputs_[RO_VALID] = RESTORE | CANCEL;
366 outputs_[RO_INVALID] = RESTORE | CANCEL;
368 // Build the state machine one state at a time
369 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
370 // left out of the state machine and handled explicitly
374 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
375 state_machine_[INITIAL][SMI_VALID] = VALID;
376 state_machine_[INITIAL][SMI_INVALID] = INVALID;
377 state_machine_[INITIAL][SMI_READ_ONLY] = RO_INITIAL;
379 state_machine_[VALID][SMI_VALID] = VALID;
380 state_machine_[VALID][SMI_READ_WRITE] = VALID;
381 state_machine_[VALID][SMI_INVALID] = INVALID;
382 state_machine_[VALID][SMI_OKAY] = INITIAL;
383 state_machine_[VALID][SMI_APPLY] = INITIAL;
384 state_machine_[VALID][SMI_RESTORE] = INITIAL;
385 state_machine_[VALID][SMI_READ_ONLY] = RO_VALID;
387 state_machine_[INVALID][SMI_INVALID] = INVALID;
388 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
389 state_machine_[INVALID][SMI_VALID] = VALID;
390 state_machine_[INVALID][SMI_RESTORE] = INITIAL;
391 state_machine_[INVALID][SMI_READ_ONLY] = RO_INVALID;
393 state_machine_[RO_INITIAL][SMI_READ_ONLY] = RO_INITIAL;
394 state_machine_[RO_INITIAL][SMI_VALID] = RO_VALID;
395 state_machine_[RO_INITIAL][SMI_INVALID] = RO_INVALID;
396 state_machine_[RO_INITIAL][SMI_READ_WRITE] = INITIAL;
398 state_machine_[RO_VALID][SMI_VALID] = RO_VALID;
399 state_machine_[RO_VALID][SMI_READ_ONLY] = RO_VALID;
400 state_machine_[RO_VALID][SMI_INVALID] = RO_INVALID;
401 state_machine_[RO_VALID][SMI_READ_WRITE] = VALID;
402 state_machine_[RO_VALID][SMI_RESTORE] = RO_INITIAL;
404 state_machine_[RO_INVALID][SMI_INVALID] = RO_INVALID;
405 state_machine_[RO_INVALID][SMI_READ_ONLY] = RO_INVALID;
406 state_machine_[RO_INVALID][SMI_VALID] = RO_VALID;
407 state_machine_[RO_INVALID][SMI_READ_WRITE] = INVALID;
408 state_machine_[RO_INVALID][SMI_RESTORE] = RO_INITIAL;
412 void ButtonPolicy::initOkApplyCancelReadOnly()
414 outputs_ = StateOutputs(RO_APPLIED + 1, ButtonPolicy::ALL_BUTTONS);
415 state_machine_ = StateMachine(RO_APPLIED + 1,
416 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS));
418 // Build the state output map
419 outputs_[INITIAL] = CLOSE;
420 outputs_[VALID] = RESTORE | OKAY | APPLY | CANCEL;
421 outputs_[INVALID] = RESTORE | CANCEL;
422 outputs_[APPLIED] = OKAY | APPLY | CLOSE;
423 outputs_[RO_INITIAL] = CLOSE;
424 outputs_[RO_VALID] = RESTORE | CANCEL;
425 outputs_[RO_INVALID] = RESTORE | CANCEL;
426 outputs_[RO_APPLIED] = CLOSE;
428 // Build the state machine one state at a time
429 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
430 // left out of the state machine and handled explicitly
434 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
435 state_machine_[INITIAL][SMI_VALID] = VALID;
436 state_machine_[INITIAL][SMI_INVALID] = INVALID;
437 state_machine_[INITIAL][SMI_READ_ONLY] = RO_INITIAL;
439 state_machine_[VALID][SMI_VALID] = VALID;
440 state_machine_[VALID][SMI_READ_WRITE] = VALID;
441 state_machine_[VALID][SMI_INVALID] = INVALID;
442 state_machine_[VALID][SMI_OKAY] = INITIAL;
443 state_machine_[VALID][SMI_RESTORE] = INITIAL;
444 state_machine_[VALID][SMI_APPLY] = APPLIED;
445 state_machine_[VALID][SMI_READ_ONLY] = RO_VALID;
447 state_machine_[INVALID][SMI_INVALID] = INVALID;
448 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
449 state_machine_[INVALID][SMI_VALID] = VALID;
450 state_machine_[INVALID][SMI_RESTORE] = INITIAL;
451 state_machine_[INVALID][SMI_READ_ONLY] = RO_INVALID;
453 state_machine_[APPLIED][SMI_APPLY] = APPLIED;
454 state_machine_[APPLIED][SMI_READ_WRITE] = APPLIED;
455 state_machine_[APPLIED][SMI_VALID] = VALID;
456 state_machine_[APPLIED][SMI_INVALID] = INVALID;
457 state_machine_[APPLIED][SMI_OKAY] = INITIAL;
458 state_machine_[APPLIED][SMI_READ_ONLY] = RO_APPLIED;
460 state_machine_[RO_INITIAL][SMI_READ_ONLY] = RO_INITIAL;
461 state_machine_[RO_INITIAL][SMI_VALID] = RO_VALID;
462 state_machine_[RO_INITIAL][SMI_INVALID] = RO_INVALID;
463 state_machine_[RO_INITIAL][SMI_READ_WRITE] = INITIAL;
465 state_machine_[RO_VALID][SMI_VALID] = RO_VALID;
466 state_machine_[RO_VALID][SMI_READ_ONLY] = RO_VALID;
467 state_machine_[RO_VALID][SMI_INVALID] = RO_INVALID;
468 state_machine_[RO_VALID][SMI_READ_WRITE] = VALID;
469 state_machine_[RO_VALID][SMI_RESTORE] = RO_INITIAL;
471 state_machine_[RO_INVALID][SMI_INVALID] = RO_INVALID;
472 state_machine_[RO_INVALID][SMI_READ_ONLY] = RO_INVALID;
473 state_machine_[RO_INVALID][SMI_VALID] = RO_VALID;
474 state_machine_[RO_INVALID][SMI_READ_WRITE] = INVALID;
475 state_machine_[RO_INVALID][SMI_RESTORE] = RO_INITIAL;
477 state_machine_[RO_APPLIED][SMI_READ_ONLY] = RO_APPLIED;
478 state_machine_[RO_APPLIED][SMI_INVALID] = RO_INVALID;
479 state_machine_[RO_APPLIED][SMI_VALID] = RO_VALID;
480 state_machine_[RO_APPLIED][SMI_READ_WRITE] = APPLIED;
484 void ButtonPolicy::initOkApplyCancel()
486 outputs_ = StateOutputs(APPLIED + 1, ButtonPolicy::ALL_BUTTONS);
487 state_machine_ = StateMachine(APPLIED + 1,
488 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS));
490 // Build the state output map
491 outputs_[INITIAL] = CLOSE;
492 outputs_[VALID] = RESTORE | OKAY | APPLY | CANCEL;
493 outputs_[INVALID] = RESTORE | CANCEL;
494 outputs_[APPLIED] = OKAY | APPLY | CLOSE;
496 // Build the state machine one state at a time
497 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
498 // left out of the state machine and handled explicitly
502 state_machine_[INITIAL][SMI_READ_ONLY] = INITIAL;
503 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
504 state_machine_[INITIAL][SMI_VALID] = VALID;
505 state_machine_[INITIAL][SMI_INVALID] = INVALID;
507 state_machine_[VALID][SMI_VALID] = VALID;
508 state_machine_[VALID][SMI_READ_ONLY] = VALID;
509 state_machine_[VALID][SMI_READ_WRITE] = VALID;
510 state_machine_[VALID][SMI_INVALID] = INVALID;
511 state_machine_[VALID][SMI_OKAY] = INITIAL;
512 state_machine_[VALID][SMI_RESTORE] = INITIAL;
513 state_machine_[VALID][SMI_APPLY] = APPLIED;
515 state_machine_[INVALID][SMI_INVALID] = INVALID;
516 state_machine_[INVALID][SMI_READ_ONLY] = INVALID;
517 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
518 state_machine_[INVALID][SMI_VALID] = VALID;
519 state_machine_[INVALID][SMI_RESTORE] = INITIAL;
521 state_machine_[APPLIED][SMI_APPLY] = APPLIED;
522 state_machine_[APPLIED][SMI_READ_ONLY] = APPLIED;
523 state_machine_[APPLIED][SMI_READ_WRITE] = APPLIED;
524 state_machine_[APPLIED][SMI_VALID] = VALID;
525 state_machine_[APPLIED][SMI_INVALID] = INVALID;
526 state_machine_[APPLIED][SMI_OKAY] = INITIAL;
530 void ButtonPolicy::initNoRepeatedApply()
532 outputs_ = StateOutputs(INVALID + 1, ButtonPolicy::ALL_BUTTONS);
533 state_machine_ = StateMachine(INVALID + 1,
534 StateArray(int(SMI_TOTAL), ButtonPolicy::BOGUS));
536 // Build the state output map
537 outputs_[INITIAL] = CLOSE;
538 outputs_[VALID] = RESTORE | OKAY | APPLY | CANCEL;
539 outputs_[INVALID] = RESTORE | CANCEL;
541 // Build the state machine one state at a time
542 // NOTE: Since CANCEL and HIDE always go to INITIAL they are
543 // left out of the state machine and handled explicitly
547 state_machine_[INITIAL][SMI_READ_ONLY] = INITIAL;
548 state_machine_[INITIAL][SMI_READ_WRITE] = INITIAL;
549 state_machine_[INITIAL][SMI_VALID] = VALID;
550 state_machine_[INITIAL][SMI_INVALID] = INVALID;
552 state_machine_[VALID][SMI_VALID] = VALID;
553 state_machine_[VALID][SMI_READ_ONLY] = VALID;
554 state_machine_[VALID][SMI_READ_WRITE] = VALID;
555 state_machine_[VALID][SMI_INVALID] = INVALID;
556 state_machine_[VALID][SMI_OKAY] = INITIAL;
557 state_machine_[VALID][SMI_APPLY] = INITIAL;
558 state_machine_[VALID][SMI_RESTORE] = INITIAL;
560 state_machine_[INVALID][SMI_INVALID] = INVALID;
561 state_machine_[INVALID][SMI_READ_ONLY] = INVALID;
562 state_machine_[INVALID][SMI_READ_WRITE] = INVALID;
563 state_machine_[INVALID][SMI_VALID] = VALID;
564 state_machine_[INVALID][SMI_RESTORE] = INITIAL;
568 } // namespace frontend