msi: Implement recursive INSTALLSTATE updates for msi treeview selector.
This commit is contained in:
parent
2f529c39fd
commit
d1a916a614
|
@ -166,6 +166,8 @@ static MSIFEATURE *msi_seltree_get_selected_feature( msi_control *control );
|
||||||
#define WM_MSI_DIALOG_CREATE (WM_USER+0x100)
|
#define WM_MSI_DIALOG_CREATE (WM_USER+0x100)
|
||||||
#define WM_MSI_DIALOG_DESTROY (WM_USER+0x101)
|
#define WM_MSI_DIALOG_DESTROY (WM_USER+0x101)
|
||||||
|
|
||||||
|
#define USER_INSTALLSTATE_ALL 0x1000
|
||||||
|
|
||||||
static DWORD uiThreadId;
|
static DWORD uiThreadId;
|
||||||
static HWND hMsiHiddenWindow;
|
static HWND hMsiHiddenWindow;
|
||||||
|
|
||||||
|
@ -1876,7 +1878,7 @@ msi_seltree_popup_menu( HWND hwnd, INT x, INT y )
|
||||||
|
|
||||||
/* FIXME: load strings from resources */
|
/* FIXME: load strings from resources */
|
||||||
AppendMenuA( hMenu, MF_ENABLED, INSTALLSTATE_LOCAL, "Install feature locally");
|
AppendMenuA( hMenu, MF_ENABLED, INSTALLSTATE_LOCAL, "Install feature locally");
|
||||||
AppendMenuA( hMenu, MF_GRAYED, 0x1000, "Install entire feature");
|
AppendMenuA( hMenu, MF_ENABLED, USER_INSTALLSTATE_ALL, "Install entire feature");
|
||||||
AppendMenuA( hMenu, MF_ENABLED, INSTALLSTATE_ADVERTISED, "Install on demand");
|
AppendMenuA( hMenu, MF_ENABLED, INSTALLSTATE_ADVERTISED, "Install on demand");
|
||||||
AppendMenuA( hMenu, MF_ENABLED, INSTALLSTATE_ABSENT, "Don't install");
|
AppendMenuA( hMenu, MF_ENABLED, INSTALLSTATE_ABSENT, "Don't install");
|
||||||
r = TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD,
|
r = TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD,
|
||||||
|
@ -1899,6 +1901,37 @@ msi_seltree_feature_from_item( HWND hwnd, HTREEITEM hItem )
|
||||||
return (MSIFEATURE*) tvi.lParam;
|
return (MSIFEATURE*) tvi.lParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
msi_seltree_update_feature_installstate( HWND hwnd, HTREEITEM hItem,
|
||||||
|
MSIPACKAGE *package, MSIFEATURE *feature, INSTALLSTATE state )
|
||||||
|
{
|
||||||
|
msi_feature_set_state( package, feature, state );
|
||||||
|
msi_seltree_sync_item_state( hwnd, feature, hItem );
|
||||||
|
ACTION_UpdateComponentStates( package, feature->Feature );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
msi_seltree_update_siblings_and_children_installstate( HWND hwnd, HTREEITEM curr,
|
||||||
|
MSIPACKAGE *package, INSTALLSTATE state)
|
||||||
|
{
|
||||||
|
/* update all siblings */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
MSIFEATURE *feature;
|
||||||
|
HTREEITEM child;
|
||||||
|
|
||||||
|
feature = msi_seltree_feature_from_item( hwnd, curr );
|
||||||
|
msi_seltree_update_feature_installstate( hwnd, curr, package, feature, state );
|
||||||
|
|
||||||
|
/* update this sibling's children */
|
||||||
|
child = (HTREEITEM)SendMessageW( hwnd, TVM_GETNEXTITEM, (WPARAM)TVGN_CHILD, (LPARAM)curr );
|
||||||
|
if (child)
|
||||||
|
msi_seltree_update_siblings_and_children_installstate( hwnd, child,
|
||||||
|
package, state );
|
||||||
|
}
|
||||||
|
while ((curr = (HTREEITEM)SendMessageW( hwnd, TVM_GETNEXTITEM, (WPARAM)TVGN_NEXT, (LPARAM)curr )));
|
||||||
|
}
|
||||||
|
|
||||||
static LRESULT
|
static LRESULT
|
||||||
msi_seltree_menu( HWND hwnd, HTREEITEM hItem )
|
msi_seltree_menu( HWND hwnd, HTREEITEM hItem )
|
||||||
{
|
{
|
||||||
|
@ -1931,19 +1964,23 @@ msi_seltree_menu( HWND hwnd, HTREEITEM hItem )
|
||||||
|
|
||||||
switch (r)
|
switch (r)
|
||||||
{
|
{
|
||||||
case INSTALLSTATE_LOCAL:
|
case USER_INSTALLSTATE_ALL:
|
||||||
|
r = INSTALLSTATE_LOCAL;
|
||||||
|
/* fall-through */
|
||||||
case INSTALLSTATE_ADVERTISED:
|
case INSTALLSTATE_ADVERTISED:
|
||||||
case INSTALLSTATE_ABSENT:
|
case INSTALLSTATE_ABSENT:
|
||||||
msi_feature_set_state(package, feature, r);
|
{
|
||||||
|
HTREEITEM child;
|
||||||
|
child = (HTREEITEM)SendMessageW( hwnd, TVM_GETNEXTITEM, (WPARAM)TVGN_CHILD, (LPARAM)hItem );
|
||||||
|
if (child)
|
||||||
|
msi_seltree_update_siblings_and_children_installstate( hwnd, child, package, r );
|
||||||
|
}
|
||||||
|
/* fall-through */
|
||||||
|
case INSTALLSTATE_LOCAL:
|
||||||
|
msi_seltree_update_feature_installstate( hwnd, hItem, package, feature, r );
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
FIXME("select feature and all children\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update */
|
|
||||||
msi_seltree_sync_item_state( hwnd, feature, hItem );
|
|
||||||
ACTION_UpdateComponentStates( package, feature->Feature );
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue