James Hawkins : msi: Implement the VolumeSelectCombo control.

Alexandre Julliard julliard at winehq.org
Tue Nov 13 08:34:48 CST 2007


Module: wine
Branch: master
Commit: 9459ef5ab1f3c7cc27649c4fbc44984e99669025
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9459ef5ab1f3c7cc27649c4fbc44984e99669025

Author: James Hawkins <truiken at gmail.com>
Date:   Tue Nov 13 00:50:14 2007 -0600

msi: Implement the VolumeSelectCombo control.

---

 dlls/msi/dialog.c |   80 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 80 insertions(+), 0 deletions(-)

diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c
index ff22f28..9241a66 100644
--- a/dlls/msi/dialog.c
+++ b/dlls/msi/dialog.c
@@ -143,6 +143,7 @@ static const WCHAR szListBox[] = { 'L','i','s','t','B','o','x',0 };
 static const WCHAR szDirectoryCombo[] = { 'D','i','r','e','c','t','o','r','y','C','o','m','b','o',0 };
 static const WCHAR szDirectoryList[] = { 'D','i','r','e','c','t','o','r','y','L','i','s','t',0 };
 static const WCHAR szVolumeCostList[] = { 'V','o','l','u','m','e','C','o','s','t','L','i','s','t',0 };
+static const WCHAR szVolumeSelectCombo[] = { 'V','o','l','u','m','e','S','e','l','e','c','t','C','o','m','b','o',0 };
 static const WCHAR szSelectionDescription[] = {'S','e','l','e','c','t','i','o','n','D','e','s','c','r','i','p','t','i','o','n',0};
 static const WCHAR szSelectionPath[] = {'S','e','l','e','c','t','i','o','n','P','a','t','h',0};
 static const WCHAR szProperty[] = {'P','r','o','p','e','r','t','y',0};
@@ -2566,6 +2567,84 @@ static UINT msi_dialog_volumecost_list( msi_dialog *dialog, MSIRECORD *rec )
     return ERROR_SUCCESS;
 }
 
+/******************** VolumeSelect Combo ***************************************/
+
+static UINT msi_dialog_volsel_handler( msi_dialog *dialog,
+                                       msi_control *control, WPARAM param )
+{
+    WCHAR text[MAX_PATH];
+    LPWSTR prop;
+    BOOL indirect;
+    int index;
+
+    if (HIWORD(param) != CBN_SELCHANGE)
+        return ERROR_SUCCESS;
+
+    index = SendMessageW( control->hwnd, CB_GETCURSEL, 0, 0 );
+    if ( index == CB_ERR )
+    {
+        ERR("No ComboBox item selected!\n");
+        return ERROR_FUNCTION_FAILED;
+    }
+
+    SendMessageW( control->hwnd, CB_GETLBTEXT, index, (LPARAM)text );
+
+    indirect = control->attributes & msidbControlAttributesIndirect;
+    prop = msi_dialog_dup_property( dialog, control->property, indirect );
+
+    MSI_SetPropertyW( dialog->package, prop, text );
+
+    msi_free( prop );
+    return ERROR_SUCCESS;
+}
+
+static void msi_dialog_vsc_add_drives( msi_dialog *dialog, msi_control *control )
+{
+    LPWSTR drives, ptr;
+    DWORD size;
+
+    size = GetLogicalDriveStringsW( 0, NULL );
+    if ( !size ) return;
+
+    drives = msi_alloc( (size + 1) * sizeof(WCHAR) );
+    if ( !drives ) return;
+
+    GetLogicalDriveStringsW( size, drives );
+
+    ptr = drives;
+    while (*ptr)
+    {
+        SendMessageW( control->hwnd, CB_ADDSTRING, 0, (LPARAM)ptr );
+        ptr += lstrlenW(ptr) + 1;
+    }
+
+    msi_free( drives );
+}
+
+static UINT msi_dialog_volumeselect_combo( msi_dialog *dialog, MSIRECORD *rec )
+{
+    msi_control *control;
+    LPCWSTR prop;
+    DWORD style;
+
+    /* FIXME: CBS_OWNERDRAWFIXED */
+    style = WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP |
+            CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS |
+            WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR;
+    control = msi_dialog_add_control( dialog, rec, WC_COMBOBOXW, style );
+    if (!control)
+        return ERROR_FUNCTION_FAILED;
+
+    control->attributes = MSI_RecordGetInteger( rec, 8 );
+    control->handler = msi_dialog_volsel_handler;
+    prop = MSI_RecordGetString( rec, 9 );
+    control->property = msi_dialog_dup_property( dialog, prop, FALSE );
+
+    msi_dialog_vsc_add_drives( dialog, control );
+
+    return ERROR_SUCCESS;
+}
+
 static const struct control_handler msi_dialog_handler[] =
 {
     { szText, msi_dialog_text_control },
@@ -2587,6 +2666,7 @@ static const struct control_handler msi_dialog_handler[] =
     { szDirectoryCombo, msi_dialog_directory_combo },
     { szDirectoryList, msi_dialog_directory_list },
     { szVolumeCostList, msi_dialog_volumecost_list },
+    { szVolumeSelectCombo, msi_dialog_volumeselect_combo },
 };
 
 #define NUM_CONTROL_TYPES (sizeof msi_dialog_handler/sizeof msi_dialog_handler[0])




More information about the wine-cvs mailing list