.. _Customizing the Dialog Output:

Customizing the Dialog Output
=============================


Because the id of a widget can be any string, you can construct a wide variety of output formats simply by changing the form of the id. Some common use-cases are:

- Bash style dash arguments, e.g.:
    id=" -name " => -name value

- Simulator style plus arguments, e.g.:
    id=" +incdir+" => +incdir+value

- Make style equals arguments, e.g.:
    id=" name=" => name=value

**The dvt:Container widget**

This widget acts just like a *Composite* (i.e. you can surround sets of widgets or composites with it), but also takes some configuration **parameters** that are applied for all the widgets it contains.

-  To specify values for checkboxes use *checkboxOffValue* and *checkboxOnValue* parameters:

.. figure:: ../../images/common/dvt-customdialogs-dvt_container_checkbox_values.png
    :align: center

*XML*

.. code-block:: xml

    <dvt:Container layout="layout:grid;" parameters="checkboxOnValue: -cov 1;checkboxOffValue: -cov 0">
        <Button id=" " style="CHECK" text="Collect coverage" selection="true" />
    </dvt:Container>
    <dvt:Container layout="layout:grid;" parameters="checkboxOnValue: -wave 1;checkboxOffValue: -wave 0">
        <Button id=" " style="CHECK" text="Dump wave" />
    </dvt:Container>

*Output:*
    -cov 1 -wave 0

-  The default separator for list elements is **;**. To change it, use *listSeparator* parameter:

.. figure:: ../../images/common/dvt-customdialogs-dvt_container_list_separator.png
	:align: center


*XML*

.. code-block:: xml

    <dvt:Container parameters="listSeparator: -f ">
        <dvt:DirectoryFilesListing id=" -f " rootDirectory="/tmp/files"/>
    </dvt:Container>

*Output:*
    -f file_1 -f file_3 -f file_5 -f file_7

-  To prevent the widget id from being output when the value is empty use *noIdForEmptyValues* parameter:

*XML*

.. code-block:: xml

    <dvt:Container parameters="noIdForEmptyValues:true">
        <Text id=" -text "></Text>
    </dvt:Container>


-  To quote values use *quoteWith* parameter:

.. figure:: ../../images/common/dvt-customdialogs-dvt_container_quote.png
    :align: center

*XML*

.. code-block:: xml

    <dvt:Container layout="layout:grid;numColumns:2;" parameters="quoteWith:'">
        <Label text="Text:"></Label>
        <Text id=" -text " style="BORDER" text="text with whitespace that needs to be quoted" />
    </dvt:Container>

*Output:*
    -text 'text with whitespace that needs to be quoted'

.. note:: 

 If you wish to quote a string with double quotes you should escape the double quote character from XML syntax as follows:

    <dvt:Container parameters="quoteWith:&quot;">


-  To show information about the value of a certain widget in the console title use *showInTitle*  parameter:

*XML*

.. code-block:: xml

    <dvt:Container parameters="showInTitle:true">
        <Label text="Seed:"></Label>
        <Text id=" -seed " style="BORDER" text="42223" />
    </dvt:Container>

.. figure:: ../../images/common/dvt-customdialogs-console-title-input.png
	:align: center




*Output*

.. figure:: ../../images/common/dvt-customdialogs-console-title-contributor.png
	:align: center




-  To disable a set of widgets based on the selection state of a radio button, checkbox or the value of a combobox or text widget, wrap the set of widgets you want to disable in a <dvt:Container> and specify which widget dictates its enablement using the *enabler* attribute. You can refer to a widget with its `standard XML XPath <http://www.w3schools.com/xml/xpath_syntax.asp>`__ within the dialog xml:

*XML*

.. code-block:: xml

    <Group text="Radio buttons" layout="layout:fill;type:VERTICAL;">
        <Button id=" -test random" style="RADIO" text="Run a random test" selection="true" />
        <Button style="RADIO" text="Run a specific test" />
    </Group>
    <dvt:Container enabler="/Composite/Composite[1]/Group[1]/Button[2]" layout="layout:fill;type:HORIZONTAL;">
        <sv:ClassSelector id=" -test " question="Pick test" baseClassName="uvm_test" />
    </dvt:Container>

*Output*

.. figure:: ../../images/common/dvt-customdialogs-enabler1_disabled.png
	:align: center



.. figure:: ../../images/common/dvt-customdialogs-enabler1_enabled.png
	:align: center




*XML*

.. code-block:: xml

    <Combo items="run_random_test;run_specific_test" layoutData="horizontalAlignment:CENTER;"> 
    </Combo>
    <dvt:Container enabler="/Composite/Composite[1]/Combo == run_specific_test" layout="layout:fill;type:HORIZONTAL;">
        <sv:ClassSelector id=" -test " question="Pick test" baseClassName="uvm_test" />
    </dvt:Container>
   	
*Output*

.. figure:: ../../images/common/dvt-customdialogs-enabler2_disabled.png
	:align: center



.. figure:: ../../images/common/dvt-customdialogs-enabler2_enabled.png
	:align: center




You can combine the states of multiple buttons or comboboxes/text widgets using logical operators, and you can refer the same widget from multiple <dvt:Container> widgets:

*XML*

.. code-block:: xml
    

    <Group text="Resolution" layout="layout:row;type:VERTICAL;">
        <Button style="RADIO" text="800x600" selection="true" />
        <Button style="RADIO" text="1024x768" />
        <Button style="RADIO" text="1280x1024" />
        <Button style="RADIO" text="1600x1200" />
    </Group>    
    <Group text="Refresh Rate (Hz)" layout="layout:row;type:VERTICAL;">
        <Button style="RADIO" text="70" />
        <dvt:Container
            enabler="/Composite/Composite[1]/Group[1]/Button[1] ||
                    /Composite/Composite[1]/Group[1]/Button[2] ||
                    /Composite/Composite[1]/Group[1]/Button[3]">
            <Button style="RADIO" text="80" />
        </dvt:Container>
        <dvt:Container
            enabler="!/Composite/Composite[1]/Group[1]/Button[3] &amp;&amp;
                    !/Composite/Composite[1]/Group[1]/Button[4]">
            <Button style="RADIO" text="90" />
        </dvt:Container>
        <dvt:Container enabler="/Composite/Composite[1]/Group[1]/Button[1]">
            <Button style="RADIO" text="100" />
        </dvt:Container>
    </Group>
    <Group text="Color depth (bpp)" layout="layout:row;type:VERTICAL;">
        <dvt:Container
            enabler="/Composite/Composite[1]/Group[1]/Button[1] ||
                    /Composite/Composite[1]/Group[1]/Button[2]">
            <Button style="RADIO" text="16" />
        </dvt:Container>
        <dvt:Container
            enabler="/Composite/Composite[1]/Group[1]/Button[3] ||
                    /Composite/Composite[1]/Group[1]/Button[4]">
            <Button style="RADIO" text="32" />
        </dvt:Container>
    </Group>

*Output*

.. figure:: ../../images/common/dvt-customdialogs-enabler2_1.png
	:align: center



.. figure:: ../../images/common/dvt-customdialogs-enabler2_2.png
	:align: center



.. figure:: ../../images/common/dvt-customdialogs-enabler2_3.png
	:align: center



.. figure:: ../../images/common/dvt-customdialogs-enabler2_4.png
	:align: center



.. note::
    
    To easily obtain the XPath to a specific widget run the dialog once, and identify the widget(s) inside the <dialog_name>.snapshots.xml file which is automatically generated/updated by DVT after each run.

**Further customization** can easily be achieved by using a simple script for processing arguments. E.g. with the following bash snippet you can convert any argument to any desired form:

.. code-block:: bash

    #!/bin/bash
    #
    # bash_arg_converter.sh
    #
    while [ $# -gt 0 ]; do
        case $1 in
          -custom_*)
             argname="$1"
             shift
             argval="$1"

             ## Customize here to desired format ##

             echo -n " $argname $argval "
          ;;
          *)
             echo -n " $1 "
          ;;
        esac
        shift
    done

In the configuration command box use the following instead of ${dvt_dialog_prompt}:

    `./bash_arg_converter.sh ${dvt_dialog_prompt:customdialog.swtxml}`

.. admonition:: How to avoid quoting problems
    
    In the .swtxml file it is recommended to use **\\\&quot;** for nested quotes and for the *Launch Command* (Run Configurations > Launch Command) the variable **${dvt_dialog_prompt:customdialog.swtxml}** should be surrounded by quotes, like in the image below:

.. figure:: ../../images/common/dvt-customdialogs-using-quotes.png
	:align: center


