Authors: Aric Stewart <aric@codeweavers.com>, Mike McCormack <mike@codeweavers.com>
Fix handling of checkbox properties.
This commit is contained in:
parent
d286b8a660
commit
955e589ed0
|
@ -62,6 +62,7 @@ struct msi_control_tag
|
||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
msi_handler handler;
|
msi_handler handler;
|
||||||
LPWSTR property;
|
LPWSTR property;
|
||||||
|
LPWSTR value;
|
||||||
IPicture *pic;
|
IPicture *pic;
|
||||||
WCHAR name[1];
|
WCHAR name[1];
|
||||||
};
|
};
|
||||||
|
@ -259,6 +260,7 @@ static msi_control *msi_dialog_create_window( msi_dialog *dialog,
|
||||||
dialog->control_list = control;
|
dialog->control_list = control;
|
||||||
control->handler = NULL;
|
control->handler = NULL;
|
||||||
control->property = NULL;
|
control->property = NULL;
|
||||||
|
control->value = NULL;
|
||||||
control->pic = NULL;
|
control->pic = NULL;
|
||||||
|
|
||||||
x = MSI_RecordGetInteger( rec, 4 );
|
x = MSI_RecordGetInteger( rec, 4 );
|
||||||
|
@ -330,6 +332,56 @@ static UINT msi_dialog_button_control( msi_dialog *dialog, MSIRECORD *rec )
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LPWSTR msi_get_checkbox_value( msi_dialog *dialog, LPCWSTR prop )
|
||||||
|
{
|
||||||
|
const static WCHAR query[] = {
|
||||||
|
'S','E','L','E','C','T',' ','*',' ',
|
||||||
|
'F','R','O','M',' ','`','C','h','e','c','k','B','o','x',' ','`',
|
||||||
|
'W','H','E','R','E',' ',
|
||||||
|
'`','P','r','o','p','e','r','t','y','`',' ','=',' ',
|
||||||
|
'\'','%','s','\'',0
|
||||||
|
};
|
||||||
|
MSIQUERY *view = NULL;
|
||||||
|
MSIRECORD *rec = NULL;
|
||||||
|
LPCWSTR val = NULL;
|
||||||
|
LPWSTR ret = NULL;
|
||||||
|
UINT r;
|
||||||
|
|
||||||
|
/* find if there is a value associated with the checkbox */
|
||||||
|
r = MSI_OpenQuery( dialog->package->db, &view, query, prop);
|
||||||
|
if( r != ERROR_SUCCESS )
|
||||||
|
return ret;
|
||||||
|
MSI_ViewExecute( view, NULL );
|
||||||
|
MSI_ViewFetch( view, &rec );
|
||||||
|
MSI_ViewClose( view );
|
||||||
|
msiobj_release( &view->hdr );
|
||||||
|
if (!rec)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
val = MSI_RecordGetString( rec, 2 );
|
||||||
|
if (val)
|
||||||
|
{
|
||||||
|
deformat_string( dialog->package, val, &ret );
|
||||||
|
if( ret && !ret[0] )
|
||||||
|
{
|
||||||
|
HeapFree( GetProcessHeap(), 0, ret );
|
||||||
|
ret = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msiobj_release( &rec->hdr );
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = load_dynamic_property(dialog->package, prop, NULL);
|
||||||
|
if( ret && !ret[0] )
|
||||||
|
{
|
||||||
|
HeapFree( GetProcessHeap(), 0, ret );
|
||||||
|
ret = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static UINT msi_dialog_checkbox_control( msi_dialog *dialog, MSIRECORD *rec )
|
static UINT msi_dialog_checkbox_control( msi_dialog *dialog, MSIRECORD *rec )
|
||||||
{
|
{
|
||||||
msi_control *control;
|
msi_control *control;
|
||||||
|
@ -342,7 +394,12 @@ static UINT msi_dialog_checkbox_control( msi_dialog *dialog, MSIRECORD *rec )
|
||||||
control->handler = msi_dialog_checkbox_handler;
|
control->handler = msi_dialog_checkbox_handler;
|
||||||
prop = MSI_RecordGetString( rec, 9 );
|
prop = MSI_RecordGetString( rec, 9 );
|
||||||
if( prop )
|
if( prop )
|
||||||
|
{
|
||||||
control->property = strdupW( prop );
|
control->property = strdupW( prop );
|
||||||
|
control->value = msi_get_checkbox_value( dialog, prop );
|
||||||
|
TRACE("control %s value %s\n", debugstr_w(control->property),
|
||||||
|
debugstr_w(control->value));
|
||||||
|
}
|
||||||
msi_dialog_checkbox_sync_state( dialog, control );
|
msi_dialog_checkbox_sync_state( dialog, control );
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
|
@ -914,17 +971,29 @@ static UINT msi_dialog_get_checkbox_state( msi_dialog *dialog,
|
||||||
DWORD sz = 2;
|
DWORD sz = 2;
|
||||||
|
|
||||||
MSI_GetPropertyW( dialog->package, control->property, state, &sz );
|
MSI_GetPropertyW( dialog->package, control->property, state, &sz );
|
||||||
return atoiW( state ) ? 1 : 0;
|
return state[0] ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void msi_dialog_set_checkbox_state( msi_dialog *dialog,
|
static void msi_dialog_set_checkbox_state( msi_dialog *dialog,
|
||||||
msi_control *control, UINT state )
|
msi_control *control, UINT state )
|
||||||
{
|
{
|
||||||
WCHAR szState[2] = { '0', 0 };
|
static const WCHAR szState[] = { '1', 0 };
|
||||||
|
LPCWSTR val;
|
||||||
|
|
||||||
if( state )
|
/* if uncheck then the property is set to NULL */
|
||||||
szState[0]++;
|
if (!state)
|
||||||
MSI_SetPropertyW( dialog->package, control->property, szState );
|
{
|
||||||
|
MSI_SetPropertyW( dialog->package, control->property, NULL );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for a custom state */
|
||||||
|
if (control->value && control->value[0])
|
||||||
|
val = control->value;
|
||||||
|
else
|
||||||
|
val = szState;
|
||||||
|
|
||||||
|
MSI_SetPropertyW( dialog->package, control->property, val );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void msi_dialog_checkbox_sync_state( msi_dialog *dialog,
|
static void msi_dialog_checkbox_sync_state( msi_dialog *dialog,
|
||||||
|
@ -1217,6 +1286,7 @@ void msi_dialog_destroy( msi_dialog *dialog )
|
||||||
dialog->control_list = t->next;
|
dialog->control_list = t->next;
|
||||||
/* leave dialog->hwnd - destroying parent destroys child windows */
|
/* leave dialog->hwnd - destroying parent destroys child windows */
|
||||||
HeapFree( GetProcessHeap(), 0, t->property );
|
HeapFree( GetProcessHeap(), 0, t->property );
|
||||||
|
HeapFree( GetProcessHeap(), 0, t->value );
|
||||||
if( t->pic )
|
if( t->pic )
|
||||||
IPicture_Release( t->pic );
|
IPicture_Release( t->pic );
|
||||||
HeapFree( GetProcessHeap(), 0, t );
|
HeapFree( GetProcessHeap(), 0, t );
|
||||||
|
|
Loading…
Reference in New Issue