aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dw/fltkplatform.cc6
-rw-r--r--dw/fltkplatform.hh3
-rw-r--r--dw/fltkui.cc131
-rw-r--r--dw/fltkui.hh3
-rw-r--r--dw/ui.hh3
-rw-r--r--src/form.cc14
-rw-r--r--test/dw_ui_test.cc5
7 files changed, 141 insertions, 24 deletions
diff --git a/dw/fltkplatform.cc b/dw/fltkplatform.cc
index 2fc7ff41..67b04688 100644
--- a/dw/fltkplatform.cc
+++ b/dw/fltkplatform.cc
@@ -413,9 +413,11 @@ FltkPlatform::FltkResourceFactory::createOptionMenuResource ()
core::ui::EntryResource *
FltkPlatform::FltkResourceFactory::createEntryResource (int size,
bool password,
- const char *label)
+ const char *label,
+ const char *placeholder)
{
- return new ui::FltkEntryResource (platform, size, password, label);
+ return new ui::FltkEntryResource (platform, size, password, label,
+ placeholder);
}
core::ui::MultiLineTextResource *
diff --git a/dw/fltkplatform.hh b/dw/fltkplatform.hh
index cbf3c6f9..5aa86e62 100644
--- a/dw/fltkplatform.hh
+++ b/dw/fltkplatform.hh
@@ -110,7 +110,8 @@ private:
int rows);
core::ui::OptionMenuResource *createOptionMenuResource ();
core::ui::EntryResource *createEntryResource (int size, bool password,
- const char *label);
+ const char *label,
+ const char *placeholder);
core::ui::MultiLineTextResource *createMultiLineTextResource (int cols,
int rows);
core::ui::CheckButtonResource *createCheckButtonResource (bool
diff --git a/dw/fltkui.cc b/dw/fltkui.cc
index 29008055..80dbb7d5 100644
--- a/dw/fltkui.cc
+++ b/dw/fltkui.cc
@@ -42,18 +42,108 @@
*/
/*
- * Used to enable CTRL+{a,e,d,k} in form inputs (for start,end,del,cut)
+ * Used to show optional placeholder text and to enable CTRL+{a,e,d,k} in
+ * form inputs (for start,end,del,cut)
*/
class CustInput2 : public Fl_Input {
public:
CustInput2 (int x, int y, int w, int h, const char* l=0) :
- Fl_Input(x,y,w,h,l) {};
+ Fl_Input(x,y,w,h,l) { placeholder = NULL; showing_placeholder = false; };
+ ~CustInput2 () { if (placeholder) free(placeholder); };
+ void set_placeholder(const char *str);
+ int show_placeholder();
+ int show_normal(const char *str);
+ void textcolor(Fl_Color c);
+ void input_type(int t);
+ int value(const char* str);
+ const char* value();
int handle(int e);
+private:
+ Fl_Color dimmed(Fl_Color c) {return fl_color_average(c, color(), .33f); };
+ char *placeholder;
+ bool showing_placeholder;
+ Fl_Color usual_color;
+ int usual_type;
};
+/*
+ * Show normal text.
+ */
+int CustInput2::show_normal(const char *str)
+{
+ showing_placeholder = false;
+ Fl_Input::textcolor(usual_color);
+ Fl_Input::input_type(usual_type);
+ return Fl_Input::value(str);
+}
+
+/*
+ * Show the placeholder text.
+ */
+int CustInput2::show_placeholder()
+{
+ showing_placeholder = true;
+ Fl_Input::textcolor(dimmed(usual_color));
+ Fl_Input::input_type(FL_NORMAL_INPUT);
+ return Fl_Input::value(placeholder);
+}
+
+/*
+ * Set the placeholder text.
+ */
+void CustInput2::set_placeholder(const char *str)
+{
+ if (placeholder)
+ free(placeholder);
+ placeholder = strdup(str);
+
+ if ((Fl::focus() != this) && !*value()) {
+ show_placeholder();
+ }
+}
+
+/*
+ * Set the text color.
+ */
+void CustInput2::textcolor(Fl_Color c)
+{
+ usual_color = c;
+ if (showing_placeholder)
+ c = dimmed(c);
+ Fl_Input::textcolor(c);
+}
+
+/*
+ * Set the input type (normal, password, etc.)
+ */
+void CustInput2::input_type(int t)
+{
+ usual_type = t;
+ Fl_Input::input_type(t);
+}
+
+/*
+ * Set the value of the input.
+ * NOTE that we're not being very careful with the return value, which is
+ * supposed to be nonzero iff the value was changed.
+ */
+int CustInput2::value(const char *str)
+{
+ return (placeholder && (!str || !*str) && Fl::focus() != this)
+ ? show_placeholder() : show_normal(str);
+}
+
+/*
+ * Return the value (text) of the input.
+ */
+const char* CustInput2::value()
+{
+ return showing_placeholder ? "" : Fl_Input::value();
+}
+
int CustInput2::handle(int e)
{
- int k = Fl::event_key();
+ int rc, k = Fl::event_key();
_MSG("CustInput2::handle event=%d\n", e);
@@ -82,8 +172,20 @@ int CustInput2::handle(int e)
return 0;
}
}
+ } else if (e == FL_UNFOCUS) {
+ if (placeholder && !value()[0]) {
+ show_placeholder();
+ }
+ }
+
+ rc = Fl_Input::handle(e);
+
+ if (rc && e == FL_FOCUS) {
+ // Nonzero return from handle() should mean that focus was accepted.
+ if (showing_placeholder)
+ show_normal("");
}
- return Fl_Input::handle(e);
+ return rc;
}
@@ -604,13 +706,15 @@ Fl_Widget *FltkComplexButtonResource::createNewWidget (core::Allocation
// ----------------------------------------------------------------------
FltkEntryResource::FltkEntryResource (FltkPlatform *platform, int size,
- bool password, const char *label):
+ bool password, const char *label,
+ const char *placeholder):
FltkSpecificResource <dw::core::ui::EntryResource> (platform)
{
this->size = size;
this->password = password;
this->label = label ? strdup(label) : NULL;
this->label_w = 0;
+ this->placeholder = placeholder ? strdup(placeholder) : NULL;
initText = NULL;
editable = false;
@@ -624,16 +728,17 @@ FltkEntryResource::~FltkEntryResource ()
free((char *)initText);
if (label)
free(label);
+ if (placeholder)
+ free(placeholder);
}
Fl_Widget *FltkEntryResource::createNewWidget (core::Allocation
*allocation)
{
- Fl_Input *input =
+ CustInput2 *input =
new CustInput2(allocation->x, allocation->y, allocation->width,
allocation->ascent + allocation->descent);
- if (password)
- input->type(FL_SECRET_INPUT);
+ input->input_type(password ? FL_SECRET_INPUT : FL_NORMAL_INPUT);
input->callback (widgetCallback, this);
input->when (FL_WHEN_ENTER_KEY_ALWAYS);
@@ -643,6 +748,8 @@ Fl_Widget *FltkEntryResource::createNewWidget (core::Allocation
}
if (initText)
input->value (initText);
+ if (placeholder)
+ input->set_placeholder(placeholder);
return input;
}
@@ -650,12 +757,12 @@ Fl_Widget *FltkEntryResource::createNewWidget (core::Allocation
void FltkEntryResource::setWidgetStyle (Fl_Widget *widget,
core::style::Style *style)
{
- Fl_Input *in = (Fl_Input *)widget;
+ CustInput2 *in = (CustInput2 *)widget;
FltkResource::setWidgetStyle(widget, style);
in->textcolor(widget->labelcolor());
- in->cursor_color(in->textcolor());
+ in->cursor_color(widget->labelcolor());
in->textsize(in->labelsize());
in->textfont(in->labelfont());
@@ -726,7 +833,7 @@ void FltkEntryResource::widgetCallback (Fl_Widget *widget, void *data)
const char *FltkEntryResource::getText ()
{
- return ((Fl_Input*)widget)->value ();
+ return ((CustInput2*)widget)->value ();
}
void FltkEntryResource::setText (const char *text)
@@ -735,7 +842,7 @@ void FltkEntryResource::setText (const char *text)
free((char *)initText);
initText = strdup (text);
- ((Fl_Input*)widget)->value (initText);
+ ((CustInput2*)widget)->value (initText);
}
bool FltkEntryResource::isEditable ()
diff --git a/dw/fltkui.hh b/dw/fltkui.hh
index a0d2d7b7..0ceef003 100644
--- a/dw/fltkui.hh
+++ b/dw/fltkui.hh
@@ -301,6 +301,7 @@ private:
const char *initText;
char *label;
int label_w;
+ char *placeholder;
bool editable;
static void widgetCallback (Fl_Widget *widget, void *data);
@@ -312,7 +313,7 @@ protected:
public:
FltkEntryResource (FltkPlatform *platform, int size, bool password,
- const char *label);
+ const char *label, const char *placeholder);
~FltkEntryResource ();
void sizeRequest (core::Requisition *requisition);
diff --git a/dw/ui.hh b/dw/ui.hh
index 78dc3cef..f31b44d7 100644
--- a/dw/ui.hh
+++ b/dw/ui.hh
@@ -580,7 +580,8 @@ public:
selectionMode, int rows) = 0;
virtual OptionMenuResource *createOptionMenuResource () = 0;
virtual EntryResource *createEntryResource (int size, bool password,
- const char *label) = 0;
+ const char *label,
+ const char *placeholder) = 0;
virtual MultiLineTextResource *createMultiLineTextResource (int cols,
int rows) = 0;
virtual CheckButtonResource *createCheckButtonResource (bool activated) = 0;
diff --git a/src/form.cc b/src/form.cc
index 9e7dc4f6..f98002d6 100644
--- a/src/form.cc
+++ b/src/form.cc
@@ -431,7 +431,7 @@ void Html_tag_open_input(DilloHtml *html, const char *tag, int tagsize)
DilloHtmlInputType inp_type;
Resource *resource = NULL;
Embed *embed = NULL;
- char *value, *name, *type, *init_str;
+ char *value, *name, *type, *init_str, *placeholder = NULL;
const char *attrbuf, *label;
bool init_val = false;
ResourceFactory *factory;
@@ -456,9 +456,10 @@ void Html_tag_open_input(DilloHtml *html, const char *tag, int tagsize)
inp_type = DILLO_HTML_INPUT_UNKNOWN;
if (!dStrAsciiCasecmp(type, "password")) {
inp_type = DILLO_HTML_INPUT_PASSWORD;
+ placeholder = a_Html_get_attr_wdef(html, tag,tagsize,"placeholder",NULL);
attrbuf = a_Html_get_attr(html, tag, tagsize, "size");
int size = Html_input_get_size(html, attrbuf);
- resource = factory->createEntryResource (size, true, NULL);
+ resource = factory->createEntryResource (size, true, NULL, placeholder);
init_str = value;
} else if (!dStrAsciiCasecmp(type, "checkbox")) {
inp_type = DILLO_HTML_INPUT_CHECKBOX;
@@ -478,7 +479,7 @@ void Html_tag_open_input(DilloHtml *html, const char *tag, int tagsize)
inp_type = DILLO_HTML_INPUT_HIDDEN;
init_str = value;
int size = Html_input_get_size(html, NULL);
- resource = factory->createEntryResource(size, false, name);
+ resource = factory->createEntryResource(size, false, name, NULL);
} else if (!dStrAsciiCasecmp(type, "submit")) {
inp_type = DILLO_HTML_INPUT_SUBMIT;
init_str = (value) ? value : dStrdup("submit");
@@ -531,9 +532,10 @@ void Html_tag_open_input(DilloHtml *html, const char *tag, int tagsize)
} else {
/* Text input, which also is the default */
inp_type = DILLO_HTML_INPUT_TEXT;
+ placeholder = a_Html_get_attr_wdef(html, tag,tagsize,"placeholder",NULL);
attrbuf = a_Html_get_attr(html, tag, tagsize, "size");
int size = Html_input_get_size(html, attrbuf);
- resource = factory->createEntryResource(size, false, NULL);
+ resource = factory->createEntryResource(size, false, NULL, placeholder);
init_str = value;
}
if (resource)
@@ -573,6 +575,7 @@ void Html_tag_open_input(DilloHtml *html, const char *tag, int tagsize)
dFree(name);
if (init_str != value)
dFree(init_str);
+ dFree(placeholder);
dFree(value);
}
@@ -606,7 +609,8 @@ void Html_tag_open_isindex(DilloHtml *html, const char *tag, int tagsize)
HT2TB(html)->addText(attrbuf, html->wordStyle ());
ResourceFactory *factory = HT2LT(html)->getResourceFactory();
- EntryResource *entryResource = factory->createEntryResource (20,false,NULL);
+ EntryResource *entryResource = factory->createEntryResource (20, false,
+ NULL, NULL);
embed = new Embed (entryResource);
Html_add_input(html, DILLO_HTML_INPUT_INDEX, embed, NULL, NULL, FALSE);
diff --git a/test/dw_ui_test.cc b/test/dw_ui_test.cc
index 086a4976..b70349ca 100644
--- a/test/dw_ui_test.cc
+++ b/test/dw_ui_test.cc
@@ -81,10 +81,11 @@ int main(int argc, char **argv)
// First of all, the resources. Later, they are embedded into the
// widget tree.
EntryResource *entryres1 =
- layout->getResourceFactory()->createEntryResource (10, false, NULL);
+ layout->getResourceFactory()->createEntryResource (10, false, NULL,NULL);
entryres1->setText ("Hi!");
EntryResource *entryres2 =
- layout->getResourceFactory()->createEntryResource (10, true, NULL);
+ layout->getResourceFactory()->createEntryResource (10, true, NULL,
+ "password field!");
MultiLineTextResource *textres =
layout->getResourceFactory()->createMultiLineTextResource (15,3);
RadioButtonResource *radiores1 =