0

Is there a way to disable UI controls while I'm doing some actions like checking database availability? Now it's like this:

<Control Id="Next" Type="PushButton">
    <Publish Event="DoAction" Value="CheckDBConnection" Order="3">
        <![CDATA[SQL_SERVER <> "" AND SQL_USER <> "" AND SQL_PASSWORD <> ""]]>
    </Publish>
    <Publish Event="DoAction" Value="Confirm_OverwriteDatabase" Order="2"/>
    <Publish Event="NewDialog" Value="VerifyReadyDlg" Order="1"/>
</Control>

When CheckDBConnection is executing, all controls are alive, but doesn't do anything. It will be more accurate to disable them while performing background action.

phantasm
  • 572
  • 4
  • 16

2 Answers2

0

Use Conditions with enable\disable Actions, based on the desired properties:

<Control Id="{Id}" Type="{Type}">
     <Condition Action="enable" ><![CDATA[SOMEPROPERTY = SomeValue]]></Condition>
     <Condition Action="disable"><![CDATA[SOMEPROPERTY <> SomeValue]]></Condition>
</Control>
vitaliy zadorozhnyy
  • 1,226
  • 10
  • 12
  • when I change property, control doesn't change its state. I need to refresh dialog or something – phantasm Sep 03 '13 at 10:25
  • look here: http://stackoverflow.com/questions/4241863/wix-interactions-with-conditions-properties-custom-actions – vitaliy zadorozhnyy Sep 03 '13 at 10:32
  • I've tried twin dialogs already, it doesn't seem to help - when I switch to the second dialog, event queue for this control resets, so I'm unable to reach `VerifyReadyDlg` – phantasm Sep 03 '13 at 10:35
0

Thanks to @vitaliy-zadorozhnyy, I was able to come up with an extra weird code that I dont't understand myself. But it works.

...
...

<Property Id="DBCHECK_INPROGRESS" Value="0" />
<Property Id="DBCHECK_NOTINPROGRESS" Value="0" />

...
...

<Control Id="{Id}" Type="{Type}">
    <Condition Action="enable"><![CDATA[DBCHECK_INPROGRESS <> 1]]></Condition>
    <Condition Action="disable"><![CDATA[DBCHECK_INPROGRESS = 1]]></Condition>
</Control>

{insert those conditions for any control you want to disable during action}

...
...


<Control Id="Next" Type="PushButton">
    <Condition Action="enable"><![CDATA[DBCHECK_INPROGRESS <> 1]]></Condition>
    <Condition Action="disable"><![CDATA[DBCHECK_INPROGRESS = 1]]></Condition>

    <Publish Event="DoAction" Value="SetInProgress">1</Publish>
    <Publish Property="TEMP_INPROGRESS" Value="[DBCHECK_INPROGRESS]">1</Publish>
    <Publish Property="DBCHECK_INPROGRESS" Value="[TEMP_INPROGRESS]" />

    <Publish Event="DoAction" Value="CheckDBConnection"/>

    <Publish Event="DoAction" Value="SetNotInProgress">1</Publish>
    <Publish Property="TEMP_NOTINPROGRESS" Value="[DBCHECK_NOTINPROGRESS]">1</Publish>
    <Publish Property="DBCHECK_NOTINPROGRESS" Value="[TEMP_NOTINPROGRESS]" />

    {other events}

</Control>

and custom actions (JScript) are simple:

function SetInProgress_CA() {
    Session.Property("DBCHECK_INPROGRESS") = "1";
}
function SetNotInProgress_CA() {
    Session.Property("DBCHECK_INPROGRESS") = "0";
}
phantasm
  • 572
  • 4
  • 16