Good catch. This is by design - a form can only display flags for direct
descendants of a section. However, it is confusing, and I have been tripped up
by the same issue myself a number of times. Probably worth thinking about how
we might improve this.
On Dec 22, 2010, at 4:25 PM, Luiz Gustavo wrote:
> Greg,
>
> I discovered the reason for that problem. That's because the "valor" field
> was not a direct descendant of the Form.Section:
>
> Before (when not showing the flag):
>
> <Form.Section>
> <TextInput Form.label="%lblDescricao" textSize="40" bxml:id="descricao"/>
>
> <BoxPane styles="{verticalAlignment:'center'}" Form.label="%lblValor">
> <TextInput textSize="10" bxml:id="valor" />
> <Checkbox buttonData="%lblConciliado" bxml:id="conciliado"
>
> ButtonPressListener.buttonPressed="conciliadoImg.setVisible(conciliado.isSelected());"/>
> <ImageView bxml:id="conciliadoImg" image="@conciliado.png"
> visible="false"/>
> </BoxPane>
> ...
> </Form.Section>
>
>
> When I put the "valor" field as a direct descendant of Form.Section, it works:
>
>
> <Form.Section>
>
> <TextInput Form.label="%lblDescricao" textSize="40" bxml:id="descricao"/>
> <TextInput textSize="10" bxml:id="valor" />
> <BoxPane styles="{verticalAlignment:'center'}" Form.label="%lblValor">
>
> <Checkbox buttonData="%lblConciliado" bxml:id="conciliado"
>
> ButtonPressListener.buttonPressed="conciliadoImg.setVisible(conciliado.isSelected());"/>
> <ImageView bxml:id="conciliadoImg" image="@conciliado.png"
> visible="false"/>
> </BoxPane>
>
>
> Is this a expected behavior or flag shoud work event when not directly nested
> in FormSection?
>
>
> Luiz Gustavo
>
>
>
>
> 2010/12/22 Luiz Gustavo <[email protected]>
> Hi Greg,
>
> I did the tests and flags are really being instantiated and associated with
> the fields.
> As you can see in the images attached, I've debuged the code and for the
> fields "descricao" and "valor", that were empty, the flags were instantiated
> and associated.
> When I resumed the debug, de frame just showed the first flag in the
> "descricao" field.
>
> Luiz Gustavo
>
>
>
> 2010/12/22 Greg Brown <[email protected]>
> I don't see anything obviously lwrong. Can you step through the code (or add
> some debug output) to verify that the flag-setting code is actually being
> called when you expect it to be?
>
> On Dec 22, 2010, at 5:26 AM, Luiz Gustavo wrote:
>
>> Hi Greg,
>>
>>
>> These are the fragments involved:
>>
>>
>> bxml
>> ...
>> <Form.Section>
>>
>> <TextInput Form.label="%lblDescricao"
>> textSize="40" bxml:id="descricao"/>
>>
>> <BoxPane styles="{verticalAlignment:'center'}"
>> Form.label="%lblValor">
>> <TextInput textSize="10" bxml:id="valor" />
>> <Checkbox buttonData="%lblConciliado"
>> bxml:id="conciliado"
>>
>> ButtonPressListener.buttonPressed="conciliadoImg.setVisible(conciliado.isSelected());"/>
>> <ImageView bxml:id="conciliadoImg"
>> image="@conciliado.png" visible="false"/>
>> </BoxPane>
>>
>> <CalendarButton bxml:id="data"
>> Form.label="%lblData"/>
>>
>> <BoxPane Form.label="%lblTipo"
>> orientation="horizontal" styles="{padding:4}">
>>
>> <bxml:define>
>> <ButtonGroup bxml:id="tipos"/>
>> </bxml:define>
>> <RadioButton bxml:id="despesaButton"
>> buttonGroup="$tipos" selected="true">
>> <content:ButtonData icon="@despesa.png"
>> text="%lblDespesa"/>
>> </RadioButton>
>> <RadioButton bxml:id="receitaButton"
>> buttonGroup="$tipos">
>> <content:ButtonData icon="@receita.png"
>> text="%lblReceita"/>
>> </RadioButton>
>>
>> </BoxPane>
>>
>> <ListButton bxml:id="categoria"
>> Form.label="%lblCategoria" />
>>
>> <BoxPane Form.label="%lblObservacoes">
>> <Border styles="{color:10}">
>> <ScrollPane
>> horizontalScrollBarPolicy="fill"
>>
>> verticalScrollBarPolicy="fill_to_capacity"
>> preferredHeight="200"
>> preferredWidth="500">
>> <TextArea bxml:id="observacoes"/>
>> </ScrollPane>
>> </Border>
>> </BoxPane>
>>
>> </Form.Section>
>> ...
>>
>>
>> Binding class:
>>
>> ...
>> Action.getNamedActions().put("salvarAction", new Action() {
>> @Override
>> public void perform(Component source) {
>> if (lancamento == null) {
>> salvarNovo();
>> }
>> else {
>> salvarEdicao();
>> }
>> atualizarGrid();
>> }
>> });
>>
>> ...
>>
>>
>> private void salvarNovo() {
>>
>> try {
>>
>> Form.Flag flagDesc = null;
>> Form.Flag flagVal = null;
>> Form.Flag flagCat = null;
>>
>> String desc = descricao.getText().trim();
>> String val = valor.getText().trim();
>>
>> if(desc == null || "".equals(desc.trim())){
>> flagDesc = new Form.Flag(MessageType.ERROR,
>> resources.get("campoRequerido").toString());
>> }
>> Form.setFlag(descricao, flagDesc);
>>
>> if(val == null || "".equals(val.trim())){
>> flagVal = new Form.Flag(MessageType.ERROR,
>> resources.get("campoRequerido").toString());
>> }
>> Form.setFlag(valor, flagVal);
>>
>> if(categoria == null){
>> flagCat = new Form.Flag(MessageType.ERROR,
>> resources.get("campoRequerido").toString());
>> }
>> Form.setFlag(categoria, flagCat);
>>
>> if(flagDesc != null || flagVal != null || flagCat != null){
>> return;
>> }
>>
>> lancamento = new Lancamento();
>> lancamento.setDescricao(desc);
>> lancamento.setConciliado(conciliado.isSelected());
>> lancamento.setData(data.getSelectedDate().toCalendar().getTime());
>> lancamento.setObservacao(observacoes.getText());
>> lancamento.setValor(new BigDecimal(numberFormat.parse(val)
>> .toString()));
>> lancamento.setTipoLancamento((CategoriaLancamento) categoria
>> .getSelectedItem());
>>
>> daoLancamento.cadastrar(lancamento);
>> cancelar();
>> Prompt.prompt(MessageType.INFO, resources.get("sucessoCadastro")
>> .toString(), this);
>> }
>> catch (Exception e) {
>> Prompt.prompt(MessageType.ERROR, resources.get("falhaCadastro")
>> .toString(), this);
>> }
>>
>> }
>>
>> private void salvarEdicao() {
>>
>> try {
>>
>> Form.Flag flagDesc = null;
>> Form.Flag flagVal = null;
>> Form.Flag flagCat = null;
>>
>> String desc = descricao.getText();
>> String val = valor.getText();
>>
>> if(desc == null || "".equals(desc.trim())){
>> flagDesc = new Form.Flag(MessageType.ERROR,
>> resources.get("campoRequerido").toString());
>> }
>> Form.setFlag(descricao, flagDesc);
>>
>> if(val == null || "".equals(val.trim())){
>> flagVal = new Form.Flag(MessageType.ERROR,
>> resources.get("campoRequerido").toString());
>> }
>> Form.setFlag(valor, flagVal);
>>
>> if(categoria == null){
>> flagCat = new Form.Flag(MessageType.ERROR,
>> resources.get("campoRequerido").toString());
>> }
>> Form.setFlag(categoria, flagCat);
>>
>> if(flagDesc != null || flagVal != null || flagCat != null){
>> return;
>> }
>>
>> lancamento.setDescricao(desc);
>> lancamento.setConciliado(conciliado.isSelected());
>> lancamento.setData(data.getSelectedDate().toCalendar().getTime());
>> lancamento.setObservacao(observacoes.getText());
>> lancamento.setValor(new BigDecimal(numberFormat.parse(val)
>> .toString()));
>> lancamento.setTipoLancamento((CategoriaLancamento) categoria
>> .getSelectedItem());
>>
>> daoLancamento.alterar(lancamento);
>> cancelar();
>> Prompt.prompt(MessageType.INFO,
>> resources.get("sucessoEdicao").toString(), this);
>> }
>> catch (Exception e) {
>> Prompt.prompt(MessageType.ERROR,
>> resources.get("falhaEdicao").toString(),
>> this);
>> }
>> }
>>
>>
>> I can't see a reason for flags no work in this scenario. I have another
>> frame that has just one field validated, and everything's right. Can you see
>> something wrong?
>>
>>
>> Thank's
>>
>> Luiz Gustavo S. de Souza
>>
>> http://luizgustavoss.wordpress.com
>> http://luizgustavoss.blogspot.com
>> http://twitter.com/lugustso
>>
>>
>> 2010/12/22 Greg Brown <[email protected]>
>> No, flags definitely don't appear one at a time - you should be able to flag
>> all the fields in your form if you want to. The message won't appear until
>> you hover over the field, but it should be outlined, and you should see the
>> error icon.
>>
>> There must be some other issue - not sure what it might be.
>>
>>
>> On Dec 21, 2010, at 10:14 PM, Luiz Gustavo wrote:
>>
>>> When the user enter some text in the field, it desapears, because flag is
>>> set to null in the begining of the salvarEdicao method:
>>>
>>> Form.Flag flagDesc = null;
>>>
>>> ...
>>>
>>> if(desc == null || "".equals(desc.trim())){
>>> flagDesc = new Form.Flag(MessageType.ERROR,
>>> resources.get("campoRequerido").toString());
>>> }
>>> Form.setFlag(descricao, flagDesc);
>>>
>>>
>>> So in the case of desc != null, I clean the flag. The problem is that the
>>> flag for the second field (Valor) never apears. Initially i thought that
>>> flags apeared one per time (not all at the same time), but even when the
>>> first field is ok, the flag of the second doesn't apear.
>>>
>>> Any idea?
>>>
>>>
>>>
>>> 2010/12/22 Greg Brown <[email protected]>
>>> If you want the flag to disappear when the user enters some text, you could
>>> add a listener to the text input that clears the flag when the text changes.
>>>
>>> On Dec 21, 2010, at 10:02 PM, Luiz Gustavo wrote:
>>>
>>>> Hi Greg,
>>>>
>>>> I'm calling salvarEdicao when the user submit de form. I whant to validate
>>>> the requeired fields befor inserting.
>>>> I'll se the classes you told me, but in my scenario is there anything I
>>>> can do?
>>>>
>>>>
>>>>
>>>> 2010/12/22 Greg Brown <[email protected]>
>>>> When are you calling the salvarEdicao() method? If you want to validate as
>>>> the user types, you'll need to call this method whenever the field value
>>>> changes. For text, you may want to consider using a validator for this.
>>>> See the classes in org.apache.pivot.wtk.validation and
>>>> TextInput#setValidator().
>>>>
>>>>
>>>> On Dec 21, 2010, at 9:37 PM, Luiz Gustavo wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I'm having problems using Form.flag.
>>>>>
>>>>>
>>>>> I have a method for inserting data from a form, and a validation on the
>>>>> begining:
>>>>>
>>>>>
>>>>> private void salvarEdicao() {
>>>>>
>>>>> try {
>>>>>
>>>>> Form.Flag flagDesc = null;
>>>>> Form.Flag flagVal = null;
>>>>> Form.Flag flagCat = null;
>>>>>
>>>>> String desc = descricao.getText();
>>>>> String val = valor.getText();
>>>>>
>>>>> if(desc == null || "".equals(desc.trim())){
>>>>> flagDesc = new Form.Flag(MessageType.ERROR,
>>>>> resources.get("campoRequerido").toString());
>>>>> }
>>>>> Form.setFlag(descricao, flagDesc);
>>>>>
>>>>> if(val == null || "".equals(val.trim())){
>>>>> flagVal = new Form.Flag(MessageType.ERROR,
>>>>> resources.get("campoRequerido").toString());
>>>>> }
>>>>> Form.setFlag(valor, flagVal);
>>>>>
>>>>> if(categoria == null){
>>>>> flagCat = new Form.Flag(MessageType.ERROR,
>>>>> resources.get("campoRequerido").toString());
>>>>> }
>>>>> Form.setFlag(categoria, flagCat);
>>>>>
>>>>> if(flagDesc != null || flagVal != null || flagCat != null){
>>>>> return;
>>>>> }
>>>>>
>>>>> ...
>>>>> }
>>>>>
>>>>>
>>>>> When I try to submit a form with desc and val (description and value)
>>>>> empty, just one flag is presented. Even when I insert data in the
>>>>> "Descrição" field, the flag in the field "Descrição" continues to apear.
>>>>> The flag of field "Valor" doesn't apear in neigther cases.
>>>>>
>>>>>
>>>>> Any idea?
>>>>>
>>>>> Cheers,
>>>>> Luiz Gustavo S. de Souza
>>>>>
>>>>> http://luizgustavoss.wordpress.com
>>>>> http://luizgustavoss.blogspot.com
>>>>> http://twitter.com/lugustso
>>>>> <frame1.png><frame2.png>
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Luiz Gustavo S. de Souza
>>>>
>>>> http://luizgustavoss.wordpress.com
>>>> http://luizgustavoss.blogspot.com
>>>> http://twitter.com/lugustso
>>>
>>>
>>>
>>>
>>> --
>>> Luiz Gustavo S. de Souza
>>>
>>> http://luizgustavoss.wordpress.com
>>> http://luizgustavoss.blogspot.com
>>> http://twitter.com/lugustso
>>
>>
>>
>>
>>
>
>
>
>
> --
> Luiz Gustavo S. de Souza
>
> http://luizgustavoss.wordpress.com
> http://luizgustavoss.blogspot.com
> http://twitter.com/lugustso
>
>
>
> --
> Luiz Gustavo S. de Souza
>
> http://luizgustavoss.wordpress.com
> http://luizgustavoss.blogspot.com
> http://twitter.com/lugustso
> <frame_flag.png>