1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_fpicker.hxx" 26 27 //------------------------------------------------------------------------ 28 // includes 29 //------------------------------------------------------------------------ 30 31 #include <tchar.h> 32 #include <osl/diagnose.h> 33 #include "controlaccess.hxx" 34 #include "..\misc\WinImplHelper.hxx" 35 36 //------------------------------------------------------------ 37 // we are using a table based algorithm to dispatch control 38 // actions there is one table containing one action table for 39 // each control class and one action table per control class 40 // which contains function pointer to control action functions 41 //------------------------------------------------------------ 42 43 //------------------------------------------------------------ 44 // namespace directives 45 //------------------------------------------------------------ 46 47 using rtl::OUString; 48 49 namespace // private 50 { 51 52 //------------------------------------------------------------ 53 // table setup 54 //------------------------------------------------------------ 55 56 CTRL_SETVALUE_FUNCTION_T CheckboxSetValueFunctionTable[] = 57 { 58 CheckboxSetState 59 }; 60 const size_t SIZE_CHECKBOX_SETVALUE_FUNCTION_TABLE = 61 sizeof( CheckboxSetValueFunctionTable ) / sizeof( CTRL_SETVALUE_FUNCTION_T ); 62 63 CTRL_GETVALUE_FUNCTION_T CheckboxGetValueFunctionTable[] = 64 { 65 CheckboxGetState 66 }; 67 const size_t SIZE_CHECKBOX_GETVALUE_FUNCTION_TABLE = 68 sizeof( CheckboxGetValueFunctionTable ) / sizeof( CTRL_GETVALUE_FUNCTION_T ); 69 70 CTRL_SETVALUE_FUNCTION_T ListboxSetValueFunctionTable[] = 71 { 72 NULL, 73 ListboxAddItem, 74 ListboxAddItems, 75 ListboxDeleteItem, 76 ListboxDeleteItems, 77 ListboxSetSelectedItem 78 }; 79 const size_t SIZE_LISTBOX_SETVALUE_FUNCTION_TABLE = 80 sizeof( ListboxSetValueFunctionTable ) / sizeof( CTRL_SETVALUE_FUNCTION_T ); 81 82 CTRL_GETVALUE_FUNCTION_T ListboxGetValueFunctionTable[] = 83 { 84 NULL, 85 NULL, 86 NULL, 87 NULL, 88 NULL, 89 NULL, 90 ListboxGetItems, 91 ListboxGetSelectedItem, 92 ListboxGetSelectedItemIndex 93 }; 94 const size_t SIZE_LISTBOX_GETVALUE_ACTION_TABLE = 95 sizeof( ListboxGetValueFunctionTable ) / sizeof( CTRL_GETVALUE_FUNCTION_T ); 96 97 struct _ENTRY 98 { 99 LPVOID lpFunctionTable; 100 size_t TableSize; 101 }; 102 103 // an array of function tables, one for each control class 104 _ENTRY CtrlClassSetValueFunctionTable[] = 105 { 106 { NULL, 0 }, 107 { CheckboxSetValueFunctionTable, SIZE_CHECKBOX_SETVALUE_FUNCTION_TABLE }, 108 { ListboxSetValueFunctionTable, SIZE_LISTBOX_SETVALUE_FUNCTION_TABLE }, 109 { NULL, 0 } 110 }; 111 112 // an array of function tables, one for each control class 113 _ENTRY CtrlClassGetValueFunctionTable[] = 114 { 115 { NULL, 0 }, 116 { CheckboxGetValueFunctionTable, SIZE_CHECKBOX_GETVALUE_FUNCTION_TABLE }, 117 { ListboxGetValueFunctionTable, SIZE_LISTBOX_GETVALUE_ACTION_TABLE }, 118 { NULL, 0 } 119 }; 120 121 //------------------------------------------------------------ 122 // 123 //------------------------------------------------------------ 124 125 CTRL_SETVALUE_FUNCTION_T SAL_CALL GetCtrlSetValueFunction( 126 CTRL_SETVALUE_FUNCTION_T* aCtrlSetValueFunctionTable, size_t aTableSize, sal_Int16 aCtrlAction ) 127 { 128 if ( !aCtrlSetValueFunctionTable || 129 aCtrlAction < 0 130 || sal::static_int_cast< sal_uInt16 >(aCtrlAction) >= aTableSize ) 131 return NULL; 132 133 return aCtrlSetValueFunctionTable[aCtrlAction]; 134 } 135 136 //------------------------------------------------------------ 137 // 138 //------------------------------------------------------------ 139 140 CTRL_GETVALUE_FUNCTION_T SAL_CALL GetCtrlGetValueFunction( 141 CTRL_GETVALUE_FUNCTION_T* aCtrlGetValueFunctionTable, size_t aTableSize, sal_Int16 aCtrlAction ) 142 { 143 if ( !aCtrlGetValueFunctionTable || 144 aCtrlAction < 0 || 145 sal::static_int_cast< sal_uInt16 >(aCtrlAction) >= aTableSize ) 146 return NULL; 147 148 return aCtrlGetValueFunctionTable[aCtrlAction]; 149 } 150 151 //------------------------------------------------------------ 152 // 153 //------------------------------------------------------------ 154 155 inline 156 _ENTRY SAL_CALL GetCtrlClassSetValueFunctionTable( CTRL_CLASS aCtrlClass ) 157 { 158 return CtrlClassSetValueFunctionTable[aCtrlClass]; 159 } 160 161 //------------------------------------------------------------ 162 // 163 //------------------------------------------------------------ 164 165 inline 166 _ENTRY SAL_CALL GetCtrlClassGetValueFunctionTable( CTRL_CLASS aCtrlClass ) 167 { 168 return CtrlClassGetValueFunctionTable[aCtrlClass]; 169 } 170 171 int WindowsFileOpenCtrlIds[] = 172 { 173 0, 174 IDOK, // PUSHBUTTON_OK 175 IDCANCEL, // PUSHBUTTON_CANCEL 176 cmb1, // LISTBOX_FILTER 177 0, // CONTROL_FILEVIEW 178 0, // not available in system file picker 179 stc2, // LISTBOX_FILTER_LABEL 180 stc3 // LISTBOX_FILE_NAME_LABEL 181 }; 182 const int SIZE_WINDOWS_FILEOPEN_CTRL_IDS = 183 sizeof(WindowsFileOpenCtrlIds)/sizeof(WindowsFileOpenCtrlIds[0]); 184 185 }; // end namespace 186 187 //------------------------------------------------------------ 188 // 189 //------------------------------------------------------------ 190 191 CTRL_SETVALUE_FUNCTION_T SAL_CALL GetCtrlSetValueFunction( CTRL_CLASS aCtrlClass, sal_Int16 aCtrlAction ) 192 { 193 _ENTRY aEntry = 194 GetCtrlClassSetValueFunctionTable( aCtrlClass ); 195 196 return GetCtrlSetValueFunction( 197 reinterpret_cast< CTRL_SETVALUE_FUNCTION_T* >( aEntry.lpFunctionTable ), 198 aEntry.TableSize, 199 aCtrlAction ); 200 } 201 202 //------------------------------------------------------------ 203 // 204 //------------------------------------------------------------ 205 206 CTRL_GETVALUE_FUNCTION_T SAL_CALL GetCtrlGetValueFunction( CTRL_CLASS aCtrlClass, sal_Int16 aCtrlAction ) 207 { 208 _ENTRY aEntry = 209 GetCtrlClassGetValueFunctionTable( aCtrlClass ); 210 211 return GetCtrlGetValueFunction( 212 reinterpret_cast< CTRL_GETVALUE_FUNCTION_T* >( aEntry.lpFunctionTable ), 213 aEntry.TableSize, 214 aCtrlAction ); 215 } 216 217 //------------------------------------------------------------ 218 // 219 //------------------------------------------------------------ 220 221 CTRL_CLASS SAL_CALL GetCtrlClass( HWND hwndCtrl ) 222 { 223 CTRL_CLASS aCtrlClass = UNKNOWN; 224 TCHAR aClassName[256]; 225 226 int nRet = GetClassName(hwndCtrl,aClassName,(sizeof(aClassName)/sizeof(TCHAR))); 227 if (nRet) 228 { 229 if (0 == _tcsicmp(aClassName,TEXT("button"))) 230 { 231 // button means many things so we have 232 // to find out what button it is 233 LONG lBtnStyle = GetWindowLong(hwndCtrl,GWL_STYLE); 234 if (lBtnStyle & BS_CHECKBOX) 235 aCtrlClass = CHECKBOX; 236 else if (((lBtnStyle & BS_PUSHBUTTON) == 0) || (lBtnStyle & BS_DEFPUSHBUTTON)) 237 aCtrlClass = PUSHBUTTON; 238 } 239 else if (0 == _tcsicmp(aClassName,TEXT("listbox")) || 240 0 == _tcsicmp(aClassName,TEXT("combobox"))) 241 aCtrlClass = LISTBOX; 242 } 243 244 return aCtrlClass; 245 } 246 247 //------------------------------------------------------------ 248 // 249 //------------------------------------------------------------ 250 251 int SAL_CALL CommonFilePickerCtrlIdToWinFileOpenCtrlId( sal_Int16 aControlId ) 252 { 253 if ( aControlId < 0 || aControlId > SIZE_WINDOWS_FILEOPEN_CTRL_IDS ) 254 return aControlId; 255 256 return WindowsFileOpenCtrlIds[aControlId]; 257 } 258