]> git.lyx.org Git - lyx.git/blob - src/frontends/xforms/FeedbackController.C
Most translations should now work.
[lyx.git] / src / frontends / xforms / FeedbackController.C
1 /**
2  * \file FeedbackController.C
3  * Copyright 2002 the LyX Team
4  * Read the file COPYING
5  *
6  * \author Angus Leeming, a.leeming@ic.ac.uk
7  */
8
9 /* A common interface for posting feedback messages to a message widget in
10  * xforms.
11  * Derive FormBase and FormBaseDeprecated from it, so daughter classes of
12  * either can use the same interface.
13  */
14
15 #include <config.h>
16
17 #ifdef __GNUG__
18 #pragma implementation
19 #endif
20
21 #include "FeedbackController.h"
22 #include "gettext.h"        // _()
23 #include "xforms_helpers.h" // formatted
24 #include "support/LAssert.h"
25
26 FeedbackController::FeedbackController()
27         : warning_posted_(false), message_widget_(0)
28 {}
29
30
31 FeedbackController::~FeedbackController()
32 {}
33
34
35 void FeedbackController::setMessageWidget(FL_OBJECT * ob)
36 {
37         lyx::Assert(ob && ob->objclass == FL_TEXT);
38         message_widget_ = ob;
39         fl_set_object_lsize(message_widget_, FL_SMALL_SIZE);
40 }
41
42
43 // preemptive handler for feedback messages
44 void FeedbackController::MessageCB(FL_OBJECT * ob, int event)
45 {
46         lyx::Assert(ob);
47
48         switch (event) {
49         case FL_ENTER:
50         {
51                 string const feedback = getFeedback(ob);
52                 if (feedback.empty() && warning_posted_)
53                         break;
54
55                 warning_posted_ = false;
56                 postMessage(getFeedback(ob));
57                 break;
58         }
59
60         case FL_LEAVE:
61                 if (!warning_posted_)
62                         clearMessage();
63                 break;
64
65         default:
66                 break;
67         }
68 }
69
70
71 void FeedbackController::PrehandlerCB(FL_OBJECT * ob, int event, int key)
72 {
73         if (event == FL_PUSH && key == 2 && ob->objclass == FL_INPUT) {
74                 // Trigger an input event when pasting in an xforms input object
75                 // using the middle mouse button.
76                 InputCB(ob, 0);
77
78         } else if (message_widget_ &&
79                    (event == FL_ENTER || event == FL_LEAVE)) {
80                 // Post feedback as the mouse enters the object,
81                 // remove it as the mouse leaves.
82                 MessageCB(ob, event);
83         }
84 }
85
86
87 void FeedbackController::postWarning(string const & warning)
88 {
89         warning_posted_ = true;
90         postMessage(warning);
91 }
92
93
94 void FeedbackController::clearMessage()
95 {
96         lyx::Assert(message_widget_);
97
98         warning_posted_ = false;
99
100         string const existing = message_widget_->label
101                 ? message_widget_->label : string();
102         if (existing.empty())
103                 return;
104
105         // This trick is needed to get xforms to clear the label...
106         fl_set_object_label(message_widget_, "");
107         fl_hide_object(message_widget_);
108 }
109
110
111 void FeedbackController::postMessage(string const & message)
112 {
113         lyx::Assert(message_widget_);
114
115         string str;
116         if (warning_posted_)
117                 str = _("WARNING! ") + message;
118         else
119                 str = message;
120
121         str = formatted(str, message_widget_->w-10, FL_SMALL_SIZE);
122
123         fl_set_object_label(message_widget_, str.c_str());
124         FL_COLOR const label_color = warning_posted_ ? FL_TOMATO : FL_BLACK;
125         fl_set_object_lcol(message_widget_, label_color);
126
127         if (!message_widget_->visible)
128                 fl_show_object(message_widget_);
129 }