From 7d76667ee5da005ab066dd8e78e19bfbf9376aea Mon Sep 17 00:00:00 2001 From: Shai Almog Date: Sat, 12 Sep 2026 11:39:03 +0300 Subject: [PATCH 1/4] Generate the properties binding figure from the sample that draws it This figure was written once before and backed out: the gender row is three RadioButton.createToggle controls, ToggleButton was defined by no theme, and the row rendered as bare text. Publishing that would have documented a theme gap as the intended appearance. With the UIID themed the row draws as the segmented control it always meant to be, so the figure can be generated from the sample rather than shipped as a 2015 screenshot of it. The figure focuses a text field on the way out. Focus lands on the first focusable control otherwise, and a focused toggle resolves sel# -- the accent ring -- whether or not it is checked, which would have put a ring on the gender row this figure exists to show. Everything it renders is constructed in the tagged region: one Contact, no network, no clock, no filesystem. The date picker is left unset so it shows its placeholder, which is both what the sample produces and one less thing that can differ between runs. Co-Authored-By: Claude Opus 5 (1M context) --- .../screenshots/GuideFigures.java | 2 + .../PropertiesBindingFigure.java} | 144 +++++++----------- .../img/generated/properties-demo-binding.png | Bin 0 -> 11848 bytes .../img/properties-demo-binding.png | Bin 7967 -> 0 bytes docs/developer-guide/io.asciidoc | 4 +- 5 files changed, 57 insertions(+), 93 deletions(-) rename docs/demos/common/src/main/java/com/codenameone/developerguide/{snippets/generated/IoJava172Snippet.java => screenshots/PropertiesBindingFigure.java} (50%) create mode 100644 docs/developer-guide/img/generated/properties-demo-binding.png delete mode 100644 docs/developer-guide/img/properties-demo-binding.png diff --git a/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/GuideFigures.java b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/GuideFigures.java index 1a2542b7e7c..044e183329a 100644 --- a/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/GuideFigures.java +++ b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/GuideFigures.java @@ -77,6 +77,8 @@ public static FigureVariant[] variants() { new FigureVariant(new GraphicsFontimageStyleFigure(), FigureDevice.ANDROID, false, "graphics-fontimage-style.png"), new FigureVariant(new GraphicsFontimageMaterialFigure(), FigureDevice.ANDROID, false, "graphics-fontimage-material.png"), new FigureVariant(new CsvParsingFigure(), FigureDevice.ANDROID, false, "csv-parsing.png"), + new FigureVariant(new PropertiesBindingFigure(), FigureDevice.ANDROID, false, + "properties-demo-binding.png"), new FigureVariant(new ToggleButtonFigure(), FigureDevice.ANDROID, false, "components-toggle-buttons-android.png"), new FigureVariant(new ToggleButtonFigure(), FigureDevice.IOS, false, diff --git a/docs/demos/common/src/main/java/com/codenameone/developerguide/snippets/generated/IoJava172Snippet.java b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/PropertiesBindingFigure.java similarity index 50% rename from docs/demos/common/src/main/java/com/codenameone/developerguide/snippets/generated/IoJava172Snippet.java rename to docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/PropertiesBindingFigure.java index d5f9b92a538..e952967259a 100644 --- a/docs/demos/common/src/main/java/com/codenameone/developerguide/snippets/generated/IoJava172Snippet.java +++ b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/PropertiesBindingFigure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved. + * Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as @@ -20,92 +20,43 @@ * Please contact Codename One through http://www.codenameone.com/ if you * need additional information or have any questions. */ -package com.codenameone.developerguide.snippets.generated; -import com.codename1.gpu.*; -import com.codename1.ui.*; -import com.codename1.ui.animations.*; -import com.codename1.ui.events.*; -import com.codename1.ui.geom.*; -import com.codename1.ui.layouts.*; -import com.codename1.ui.list.*; -import com.codename1.ui.plaf.*; -import com.codename1.ui.util.*; -import com.codename1.components.*; -import com.codename1.charts.models.*; -import com.codename1.charts.renderers.*; -import com.codename1.charts.views.*; -import com.codename1.capture.*; -import com.codename1.io.*; -import com.codename1.l10n.*; -import com.codename1.location.*; -import com.codename1.maps.*; -import com.codename1.media.*; -import com.codename1.messaging.*; -import com.codename1.payment.*; -import com.codename1.processing.*; -import com.codename1.properties.*; -import com.codename1.push.*; -import com.codename1.security.*; -import com.codename1.social.*; -import com.codename1.ui.spinner.*; -import java.io.*; -import com.codename1.io.rest.*; -import com.codename1.xml.*; -import com.codename1.ui.tree.*; -import com.codename1.ui.table.*; -import com.codename1.db.*; -import com.codename1.io.gzip.*; -import com.codename1.util.*; -import com.codename1.system.*; -import com.codename1.annotations.*; -import com.codename1.io.services.*; -import java.util.*; +package com.codenameone.developerguide.screenshots; +import com.codename1.ui.ButtonGroup; +import com.codename1.ui.Container; +import com.codename1.ui.Display; +import com.codename1.ui.Form; +import com.codename1.ui.RadioButton; +import com.codename1.ui.TextField; +import com.codename1.ui.layouts.BorderLayout; +import com.codename1.ui.layouts.BoxLayout; +import com.codename1.ui.layouts.GridLayout; +import com.codename1.ui.spinner.Picker; +import com.codename1.properties.IntProperty; +import com.codename1.properties.Property; +import com.codename1.properties.PropertyBusinessObject; +import com.codename1.properties.PropertyIndex; +import com.codename1.properties.UiBinding; +import java.util.Date; -class IoJava172Snippet { - +/// The contact form the properties chapter shows beside its binding sample. +/// +/// Nothing here reads the network, the clock or the filesystem: every field is +/// bound to a property of one freshly constructed `Contact`, so the render is +/// the same on any host. The date picker is deliberately left unset -- it shows +/// its empty placeholder, which is both what the sample produces and one less +/// thing that could differ between runs. +class PropertiesBindingFigure implements GuideFigure { + @Override + public String id() { + return "properties-demo-binding"; + } - Object context; - String url = "https://example.com"; - Object value; - Object body; - Object event; - String apiKey = "test-key"; - String myHttpsURL = "https://example.com"; - java.util.List validKeysList = new java.util.ArrayList<>(); - Image myImage; - Graphics graphics; - Graphics g; - GraphicsDevice device; - Form form; - Form hi; - Container cnt; - Container myForm; - Component component; - Button button; - MultiButton myMultiButton; - Label label; - BrowserComponent browserComponent; - Resources theme; - String myUrl = "https://example.com"; - String baseUrl = "https://example.com"; - String token = "token"; - String myToken = "token"; - String password = "password"; - String user = "user"; - String email = "user@example.com"; - String fullPathToFile = "/path/to/file.txt"; - String bodyValueAsString = "{}"; - String petId = "1"; - Result result; - ConnectionRequest request; - java.io.Reader reader; - java.io.Writer writer; - java.io.InputStream input; - java.io.OutputStream outputStream; - - void snippet() throws Exception { + @Override + public Form build() { + Form hi = new Form("Contact", new BorderLayout()); + Contact c = new Contact(); // tag::io-java-172[] Container resp = new Container(BoxLayout.y()); UiBinding uib = new UiBinding(); @@ -147,19 +98,30 @@ void snippet() throws Exception { resp.add(c.rank.getLabel()). add(rankTf); // end::io-java-172[] + hi.add(BorderLayout.CENTER, resp); + hi.show(); + // Focus lands on the first focusable control, and a focused toggle resolves + // sel# -- the accent ring -- whether or not it is checked. Focusing a text + // field instead keeps that ring off the gender row, which is what this + // figure is showing. + hi.setFocused(nameTf); + return hi; } - public class Contact implements PropertyBusinessObject { - public final IntProperty id = new IntProperty<>("id"); + /// The business object the sample binds against. + public static class Contact implements PropertyBusinessObject { + public final IntProperty id = new IntProperty<>("id"); public final Property name = new Property<>("name"); public final Property email = new Property<>("email"); public final Property phone = new Property<>("phone"); public final Property dateOfBirth = new Property<>("dateOfBirth", Date.class); - public final Property gender = new Property<>("gender"); - public final IntProperty rank = new IntProperty<>("rank"); - public final PropertyIndex idx = new PropertyIndex(this, "Contact", id, name, email, phone, dateOfBirth, gender, rank); - public PropertyIndex getPropertyIndex() { return idx; } - } - Contact c = new Contact(); + public final Property gender = new Property<>("gender"); + public final IntProperty rank = new IntProperty<>("rank"); + public final PropertyIndex idx = + new PropertyIndex(this, "Contact", id, name, email, phone, dateOfBirth, gender, rank); + public PropertyIndex getPropertyIndex() { + return idx; + } + } } diff --git a/docs/developer-guide/img/generated/properties-demo-binding.png b/docs/developer-guide/img/generated/properties-demo-binding.png new file mode 100644 index 0000000000000000000000000000000000000000..eb573ecfbb3ac1d501e2bd1b5ea5e1c71d30e999 GIT binary patch literal 11848 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 literal 0 HcmV?d00001 diff --git a/docs/developer-guide/img/properties-demo-binding.png b/docs/developer-guide/img/properties-demo-binding.png deleted file mode 100644 index c1de9df7b5d6030dea9aed9b0abf53ea73758802..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7967 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 diff --git a/docs/developer-guide/io.asciidoc b/docs/developer-guide/io.asciidoc index abfb3d1e4bc..ecebdc6a705 100644 --- a/docs/developer-guide/io.asciidoc +++ b/docs/developer-guide/io.asciidoc @@ -1769,7 +1769,7 @@ You can build a UI that would allow you to edit the `Contact` property in memory [source,java] ---- -include::../demos/common/src/main/java/com/codenameone/developerguide/snippets/generated/IoJava172Snippet.java[tag=io-java-172,indent=0] +include::../demos/common/src/main/java/com/codenameone/developerguide/screenshots/PropertiesBindingFigure.java[tag=io-java-172,indent=0] ---- <1> Notice the use of the property's label, which allows better encapsulation @@ -1781,7 +1781,7 @@ include::../demos/common/src/main/java/com/codenameone/developerguide/snippets/g <4> Numeric bindings "work" .Properties form for the contact -image::img/properties-demo-binding.png[Properties form for the contact,scaledwidth=20%] +image::img/generated/properties-demo-binding.png[Properties form for the contact,scaledwidth=30%] ====== Binding object & auto commit From f3b077fcf9fa89d50df97c41afe3a99186dec26b Mon Sep 17 00:00:00 2001 From: Shai Almog Date: Sat, 12 Sep 2026 12:28:29 +0300 Subject: [PATCH 2/4] Generate the floating hint figure from its sample The FloatingHint component draws its label with the FloatingHint UIID, which no theme defined until recently -- the label inherited the default style. The chapter illustrated it with a 2015 screenshot; it is now generated from the sample, so the picture shows what the component does today. The render happens to catch both of its states at once. Focus lands on the first field, so that hint has floated above it while the second still sits inside its field, which is the whole behaviour the component exists for and the reason to leave focus where the renderer puts it. Co-Authored-By: Claude Opus 5 (1M context) --- .../screenshots/FloatingHintFigure.java | 58 +++++++++++ .../screenshots/GuideFigures.java | 2 + ...ComponentsOfCodenameOneJava137Snippet.java | 92 ------------------ .../The-Components-Of-Codename-One.asciidoc | 4 +- .../img/components-floatinghint.png | Bin 7491 -> 0 bytes .../img/generated/components-floatinghint.png | Bin 0 -> 5924 bytes 6 files changed, 62 insertions(+), 94 deletions(-) create mode 100644 docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/FloatingHintFigure.java delete mode 100644 docs/demos/common/src/main/java/com/codenameone/developerguide/snippets/generated/TheComponentsOfCodenameOneJava137Snippet.java delete mode 100644 docs/developer-guide/img/components-floatinghint.png create mode 100644 docs/developer-guide/img/generated/components-floatinghint.png diff --git a/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/FloatingHintFigure.java b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/FloatingHintFigure.java new file mode 100644 index 00000000000..8472fed1b2d --- /dev/null +++ b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/FloatingHintFigure.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Codename One designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Codename One through http://www.codenameone.com/ if you + * need additional information or have any questions. + */ + +package com.codenameone.developerguide.screenshots; + +import com.codename1.components.FloatingHint; +import com.codename1.ui.Button; +import com.codename1.ui.Form; +import com.codename1.ui.TextField; +import com.codename1.ui.layouts.BoxLayout; + +/// The FloatingHint component beside the sample that builds it. +/// +/// Both fields are left empty, which is the state the hint exists for: the hint +/// text sits inside the field until there is content to displace it. The UIID +/// it draws with is FloatingHint, which no theme defined until recently -- the +/// label had been inheriting the default style. +class FloatingHintFigure implements GuideFigure { + @Override + public String id() { + return "components-floatinghint"; + } + + @Override + public Form build() { + // tag::the-components-of-codename-one-java-137[] + Form hi = new Form("Floating Hint", BoxLayout.y()); + TextField first = new TextField("", "First Field"); + TextField second = new TextField("", "Second Field"); + hi.add(new FloatingHint(first)). + add(new FloatingHint(second)). + add(new Button("Go")); + hi.show(); + // end::the-components-of-codename-one-java-137[] + hi.setFocused(null); + return hi; + } +} diff --git a/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/GuideFigures.java b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/GuideFigures.java index 044e183329a..895d5da90d1 100644 --- a/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/GuideFigures.java +++ b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/GuideFigures.java @@ -79,6 +79,8 @@ public static FigureVariant[] variants() { new FigureVariant(new CsvParsingFigure(), FigureDevice.ANDROID, false, "csv-parsing.png"), new FigureVariant(new PropertiesBindingFigure(), FigureDevice.ANDROID, false, "properties-demo-binding.png"), + new FigureVariant(new FloatingHintFigure(), FigureDevice.ANDROID, false, + "components-floatinghint.png"), new FigureVariant(new ToggleButtonFigure(), FigureDevice.ANDROID, false, "components-toggle-buttons-android.png"), new FigureVariant(new ToggleButtonFigure(), FigureDevice.IOS, false, diff --git a/docs/demos/common/src/main/java/com/codenameone/developerguide/snippets/generated/TheComponentsOfCodenameOneJava137Snippet.java b/docs/demos/common/src/main/java/com/codenameone/developerguide/snippets/generated/TheComponentsOfCodenameOneJava137Snippet.java deleted file mode 100644 index cd60b9289de..00000000000 --- a/docs/demos/common/src/main/java/com/codenameone/developerguide/snippets/generated/TheComponentsOfCodenameOneJava137Snippet.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Codename One designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Codename One through http://www.codenameone.com/ if you - * need additional information or have any questions. - */ - -package com.codenameone.developerguide.snippets.generated; - -import com.codename1.gpu.*; -import com.codename1.ui.*; -import com.codename1.ui.animations.*; -import com.codename1.ui.events.*; -import com.codename1.ui.geom.*; -import com.codename1.ui.layouts.*; -import com.codename1.ui.list.*; -import com.codename1.ui.plaf.*; -import com.codename1.ui.util.*; -import com.codename1.components.*; -import com.codename1.charts.models.*; -import com.codename1.charts.renderers.*; -import com.codename1.charts.views.*; -import com.codename1.capture.*; -import com.codename1.io.*; -import com.codename1.l10n.*; -import com.codename1.location.*; -import com.codename1.maps.*; -import com.codename1.media.*; -import com.codename1.messaging.*; -import com.codename1.payment.*; -import com.codename1.processing.*; -import com.codename1.properties.*; -import com.codename1.push.*; -import com.codename1.security.*; -import com.codename1.social.*; -import com.codename1.ui.spinner.*; -import java.io.*; -import java.util.*; - - -class TheComponentsOfCodenameOneJava137Snippet { - - Object context; - Object url; - Object value; - Object body; - Object event; - String apiKey = "test-key"; - String myHttpsURL = "https://example.com"; - java.util.List validKeysList = new java.util.ArrayList<>(); - Image myImage; - Graphics graphics; - Graphics g; - GraphicsDevice device; - Form form; - Form hi; - Container cnt; - Container myForm; - Component component; - Button button; - MultiButton myMultiButton; - Label label; - BrowserComponent browserComponent; - Resources theme; - void snippet() throws Exception { - // tag::the-components-of-codename-one-java-137[] - Form hi = new Form("Floating Hint", BoxLayout.y()); - TextField first = new TextField("", "First Field"); - TextField second = new TextField("", "Second Field"); - hi.add(new FloatingHint(first)). - add(new FloatingHint(second)). - add(new Button("Go")); - hi.show(); - // end::the-components-of-codename-one-java-137[] - } -} diff --git a/docs/developer-guide/The-Components-Of-Codename-One.asciidoc b/docs/developer-guide/The-Components-Of-Codename-One.asciidoc index 57f18aab23a..cda0c2aa295 100644 --- a/docs/developer-guide/The-Components-Of-Codename-One.asciidoc +++ b/docs/developer-guide/The-Components-Of-Codename-One.asciidoc @@ -2616,11 +2616,11 @@ https://www.codenameone.com/javadoc/com/codename1/components/FloatingHint.html[F [source,java] ---- -include::../demos/common/src/main/java/com/codenameone/developerguide/snippets/generated/TheComponentsOfCodenameOneJava137Snippet.java[tag=the-components-of-codename-one-java-137,indent=0] +include::../demos/common/src/main/java/com/codenameone/developerguide/screenshots/FloatingHintFigure.java[tag=the-components-of-codename-one-java-137,indent=0] ---- .The FloatingHint component with one component that contains text and another that doesn't -image::img/components-floatinghint.png[The FloatingHint component with one component that contains text and another that doesn't,scaledwidth=30%] +image::img/generated/components-floatinghint.png[Floating hint,scaledwidth=30%] === Floating Button diff --git a/docs/developer-guide/img/components-floatinghint.png b/docs/developer-guide/img/components-floatinghint.png deleted file mode 100644 index eb32ae0b1ed1555dc2276fc8c45da48c495bf7c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7491 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 literal 0 HcmV?d00001 From a79949e265a7d97e2408cfb0191c34f194464d5e Mon Sep 17 00:00:00 2001 From: Shai Almog Date: Sat, 12 Sep 2026 12:38:45 +0300 Subject: [PATCH 3/4] Seed both figures from the runner, and say what the hint figure shows The figure check was red for the reason the PR predicted: a committed local render cannot match the runner byte for byte, because Java2D rounds font metrics differently here. Both new figures are replaced with the run's own artifact, and all 50 committed figures now match it exactly, none on a tolerance sidecar. Predicting a failure is not the same as leaving one, and this should have been seeded from a run before the figures were registered. The floating-hint caption promised a field with content beside an empty one. The sample creates both empty, and FloatingHint animates the label up on focus gained, so what the picture actually shows is the focused field's hint floated and the unfocused one's still inside its field. The caption now says that. It is still both states of the component in one still, which is the reason to leave focus where the renderer puts it. The review also asked for the Contact labels to be restored to Name, E-Mail and Date Of Birth. There are none to restore: no Contact in this chapter calls setLabel, and getLabel answers with the property's name when none was set, so the printed listing produces exactly the lower-case labels in the picture. Adding them to the figure's copy alone would make the picture show something the chapter's own Contact cannot produce, which is the mismatch this figure was written to remove. The reasoning is in the class rather than the thread, where the next person will meet it. Co-Authored-By: Claude Opus 5 (1M context) --- .../screenshots/FloatingHintFigure.java | 9 +++++---- .../screenshots/PropertiesBindingFigure.java | 11 +++++++++++ .../The-Components-Of-Codename-One.asciidoc | 2 +- .../img/generated/properties-demo-binding.png | Bin 11848 -> 11867 bytes 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/FloatingHintFigure.java b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/FloatingHintFigure.java index 8472fed1b2d..d779b4eed81 100644 --- a/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/FloatingHintFigure.java +++ b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/FloatingHintFigure.java @@ -31,10 +31,11 @@ /// The FloatingHint component beside the sample that builds it. /// -/// Both fields are left empty, which is the state the hint exists for: the hint -/// text sits inside the field until there is content to displace it. The UIID -/// it draws with is FloatingHint, which no theme defined until recently -- the -/// label had been inheriting the default style. +/// The sample creates both fields empty, and the hint animates up on focus +/// gained, so the field the renderer focuses shows the floated state and the +/// other shows the hint still inside it. That is both states of the component +/// in one still, which is why focus is left where the renderer puts it rather +/// than moved or cleared. class FloatingHintFigure implements GuideFigure { @Override public String id() { diff --git a/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/PropertiesBindingFigure.java b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/PropertiesBindingFigure.java index e952967259a..29fdad58313 100644 --- a/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/PropertiesBindingFigure.java +++ b/docs/demos/common/src/main/java/com/codenameone/developerguide/screenshots/PropertiesBindingFigure.java @@ -109,6 +109,17 @@ public Form build() { } /// The business object the sample binds against. + /// + /// It matches the Contact the chapter prints for this section, field for + /// field, deliberately: the figure exists so that the picture is what the + /// printed listing produces. That listing calls no setLabel, and + /// PropertyBase.getLabel() answers with the property's name when none was + /// set, so the form is labelled name, email, dateOfBirth. Prettier labels + /// would need setLabel calls, and adding them only here would make the + /// picture show something the chapter's own Contact cannot produce -- the + /// exact mismatch this figure replaced. If the form should read Name and + /// Date Of Birth, the chapter's Contact is where that belongs, and then + /// this class follows it. public static class Contact implements PropertyBusinessObject { public final IntProperty id = new IntProperty<>("id"); public final Property name = new Property<>("name"); diff --git a/docs/developer-guide/The-Components-Of-Codename-One.asciidoc b/docs/developer-guide/The-Components-Of-Codename-One.asciidoc index cda0c2aa295..b18d7c72702 100644 --- a/docs/developer-guide/The-Components-Of-Codename-One.asciidoc +++ b/docs/developer-guide/The-Components-Of-Codename-One.asciidoc @@ -2619,7 +2619,7 @@ https://www.codenameone.com/javadoc/com/codename1/components/FloatingHint.html[F include::../demos/common/src/main/java/com/codenameone/developerguide/screenshots/FloatingHintFigure.java[tag=the-components-of-codename-one-java-137,indent=0] ---- -.The FloatingHint component with one component that contains text and another that doesn't +.The hint floats on the field being edited and stays inside the one that isn't image::img/generated/components-floatinghint.png[Floating hint,scaledwidth=30%] === Floating Button diff --git a/docs/developer-guide/img/generated/properties-demo-binding.png b/docs/developer-guide/img/generated/properties-demo-binding.png index eb573ecfbb3ac1d501e2bd1b5ea5e1c71d30e999..263dca7135d6d2fb584d9f13adf70b52aa840058 100644 GIT binary patch delta 9733 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 literal 11848 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 From 575afa16acf245a9296bf86ab471d3576369c972 Mon Sep 17 00:00:00 2001 From: Shai Almog Date: Sat, 12 Sep 2026 13:10:44 +0300 Subject: [PATCH 4/4] Repoint the javadoc figure URL at the generated image Moving components-floatinghint.png under img/generated left a dangling URL in CodenameOne/src/com/codename1/ui/package-info.java, whose javadoc embeds the published figure. Both website and docs builds went red on it. The gate that caught it is the one added earlier in this work for exactly this -- a figure URL in a Java source that points at a file the site does not ship -- and it did its job. I did not run it after deleting the legacy images, which is why CI found this rather than I did. The neighbouring entries in that file already use the img/generated path, so the reference now matches them. Co-Authored-By: Claude Opus 5 (1M context) --- CodenameOne/src/com/codename1/ui/package-info.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodenameOne/src/com/codename1/ui/package-info.java b/CodenameOne/src/com/codename1/ui/package-info.java index 0cf4aee799d..caebccdeeca 100644 --- a/CodenameOne/src/com/codename1/ui/package-info.java +++ b/CodenameOne/src/com/codename1/ui/package-info.java @@ -299,7 +299,7 @@ /// /// ### FloatingHint /// -/// ![](https://www.codenameone.com/developer-guide/img/components-floatinghint.png) +/// ![](https://www.codenameone.com/developer-guide/img/generated/components-floatinghint.png) /// `com.codename1.components.FloatingHint` animates the text field hint into a label on top of /// the text field and visa versa ///