@@ -116,27 +116,70 @@ static LONG_PTR WINAPI DlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
116116
117117 ListSize = 0 ;
118118 int NewPos = -1 ;
119- for ( int i= 0 ;i< nCount;i++ )
119+ if (OldPos >= 0 && OldPos < nCount)
120120 {
121- const TCHAR* DispName = p[i].Keys [DisplayName];
122- if (strstri (DispName,Filter)) // áåç ó÷åòà ðåãèñòðà â OEM êîäèðîâêå
121+ if (!*Filter || strstri (p[OldPos].Keys [DisplayName],Filter)) // áåç ó÷åòà ðåãèñòðà â OEM êîäèðîâêå
122+ NewPos = OldPos;
123+ }
124+ for (int i = 0 ; i < nCount; i++)
125+ {
126+ const TCHAR* DispName = p[i].Keys [DisplayName], *Find;
127+ if (*Filter)
128+ Find = strstri (DispName,Filter);
129+ else
130+ Find = DispName;
131+ if (Find != nullptr ) // áåç ó÷åòà ðåãèñòðà â OEM êîäèðîâêå
123132 {
124133 FLI[i].Flags &= ~LIF_HIDDEN;
134+ if (Param2 && (i == OldPos))
135+ {
136+ if (FLI[i].Flags & LIF_CHECKED)
137+ {
138+ FLI[i].Flags &= ~LIF_CHECKED;
139+ }
140+ else
141+ {
142+ FLI[i].Flags |= LIF_CHECKED;
143+ }
144+ }
125145 // áåç ó÷åòà ðåãèñòðà - à êîäèðîâêà ANSI
126- if (NewPos == -1 && strstri (DispName,Filter) == DispName)
146+ if (NewPos == -1 && Find == DispName)
127147 NewPos = i;
128148 ListSize++;
129149 }
130150 else
131151 FLI[i].Flags |= LIF_HIDDEN;
132152 }
133- if (NewPos == -1 ) NewPos = OldPos;
153+ if (Param1 == 0 && Param2)
154+ {
155+ // Ñíÿòèå èëè óñòàíîâêà ïîìåòêè (Ins)
156+ if (Param2 == 1 )
157+ {
158+ for (int i = (OldPos+1 ); i < nCount; i++)
159+ {
160+ if (!(FLI[i].Flags & LIF_HIDDEN))
161+ {
162+ OldPos = i; break ;
163+ }
164+ }
165+ NewPos = OldPos;
166+ }
167+ // Ñíÿòèå èëè óñòàíîâêà ïîìåòêè (RClick)
168+ else if (Param2 == 2 )
169+ {
170+ NewPos = OldPos;
171+ }
172+ }
173+ else if (NewPos == -1 )
174+ {
175+ NewPos = OldPos;
176+ }
134177
135178 Info.SendDlgMessage (hDlg,DM_ENABLEREDRAW,FALSE ,0 );
136179
137180 Info.SendDlgMessage (hDlg,DM_LISTSET,LIST_BOX,reinterpret_cast <LONG_PTR>(&FL));
138181
139- FSF. sprintf (spFilter,GetMsg (MFilter),Filter,ListSize,nCount);
182+ StringCchPrintf (spFilter,ARRAYSIZE (spFilter), GetMsg (MFilter),Filter,ListSize,nCount);
140183 ListTitle.Title = spFilter;
141184 ListTitle.TitleLen = lstrlen (spFilter);
142185 Info.SendDlgMessage (hDlg,DM_LISTSETTITLES,LIST_BOX,reinterpret_cast <LONG_PTR>(&ListTitle));
@@ -169,24 +212,32 @@ static LONG_PTR WINAPI DlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
169212
170213 case DN_MOUSECLICK:
171214 {
172- if (Param1 == LIST_BOX) {
215+ if (Param1 == LIST_BOX)
216+ {
173217 MOUSE_EVENT_RECORD *mer = (MOUSE_EVENT_RECORD *)Param2;
174- if (mer->dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) {
218+ if (mer->dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
219+ {
175220 // find list on-screen coords (excluding frame and border)
176221 SMALL_RECT list_rect;
177222 Info.SendDlgMessage (hDlg, DM_GETDLGRECT, 0 , reinterpret_cast <LONG_PTR>(&list_rect));
178223 list_rect.Left += 2 ;
179224 list_rect.Top += 1 ;
180225 list_rect.Right -= 2 ;
181226 list_rect.Bottom -= 1 ;
182- if ((mer->dwEventFlags == 0 ) && (mer->dwMousePosition .X > list_rect.Left ) && (mer->dwMousePosition .X < list_rect.Right ) && (mer->dwMousePosition .Y > list_rect.Top ) && (mer->dwMousePosition .Y < list_rect.Bottom )) {
227+ if ((mer->dwEventFlags == 0 ) && (mer->dwMousePosition .X > list_rect.Left ) && (mer->dwMousePosition .X < list_rect.Right ) && (mer->dwMousePosition .Y > list_rect.Top ) && (mer->dwMousePosition .Y < list_rect.Bottom ))
228+ {
183229 DlgProc (hDlg, DN_KEY, LIST_BOX, KEY_ENTER);
184230 return TRUE ;
185231 }
186232 // pass message to scrollbar if needed
187233 if ((mer->dwMousePosition .X == list_rect.Right ) && (mer->dwMousePosition .Y > list_rect.Top ) && (mer->dwMousePosition .Y < list_rect.Bottom )) return FALSE ;
188234 return TRUE ;
189235 }
236+ else if (mer->dwButtonState == RIGHTMOST_BUTTON_PRESSED)
237+ {
238+ Info.SendDlgMessage (hDlg,DMU_UPDATE,0 ,2 );
239+ return TRUE ;
240+ }
190241 }
191242 }
192243 break ;
@@ -199,7 +250,7 @@ static LONG_PTR WINAPI DlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
199250 if (ListSize)
200251 {
201252 TCHAR DlgText[MAX_PATH + 200 ];
202- FSF. sprintf (DlgText, GetMsg (MConfirm), p[Info.SendDlgMessage (hDlg,DM_LISTGETCURPOS,LIST_BOX,NULL )].Keys [DisplayName]);
253+ StringCchPrintf (DlgText, ARRAYSIZE (DlgText) , GetMsg (MConfirm), p[Info.SendDlgMessage (hDlg,DM_LISTGETCURPOS,LIST_BOX,NULL )].Keys [DisplayName]);
203254 if (EMessage ((const TCHAR * const *) DlgText, 0 , 2 ) == 0 )
204255 {
205256 if (!DeleteEntry (static_cast <int >(Info.SendDlgMessage (hDlg,DM_LISTGETCURPOS,LIST_BOX,NULL ))))
@@ -211,6 +262,7 @@ static LONG_PTR WINAPI DlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
211262 return TRUE ;
212263
213264 case (KEY_F9|KEY_SHIFT|KEY_ALT):
265+ case (KEY_F9):
214266 {
215267 Configure (0 );
216268 }
@@ -222,19 +274,74 @@ static LONG_PTR WINAPI DlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
222274 }
223275 return TRUE ;
224276
277+ case KEY_INS:
278+ {
279+ Info.SendDlgMessage (hDlg,DMU_UPDATE,0 ,1 );
280+ }
281+ return TRUE ;
282+
225283 case KEY_ENTER:
226284 case KEY_SHIFTENTER:
227285 {
228286 if (ListSize)
229287 {
230288 int liChanged = 0 ;
231- int pos = static_cast <int >(Info.SendDlgMessage (hDlg,DM_LISTGETCURPOS,LIST_BOX,NULL ));
232- if (Param2 == KEY_ENTER)
233- liChanged = ExecuteEntry (pos, Opt.EnterAction , (Opt.RunLowPriority !=0 ));
234- else if (Param2 == KEY_SHIFTENTER)
235- liChanged = ExecuteEntry (pos, Opt.ShiftEnterAction , (Opt.RunLowPriority !=0 ));
289+ int liSelected = 0 , liFirst = -1 ;
290+
291+ for (int i = 0 ; i < nCount; i++)
292+ {
293+ if (FLI[i].Flags & LIF_CHECKED)
294+ {
295+ if (liFirst == -1 )
296+ liFirst = i;
297+ liSelected++;
298+ }
299+ }
300+
301+ if (liSelected <= 1 )
302+ {
303+ int liAction = (Param2 == KEY_ENTER) ? Opt.EnterAction : Opt.ShiftEnterAction ;
304+ int pos = (liFirst == -1 ) ? static_cast <int >(Info.SendDlgMessage (hDlg,DM_LISTGETCURPOS,LIST_BOX,NULL )) : liFirst;
305+ liChanged = ExecuteEntry (pos, liAction, (Opt.RunLowPriority !=0 ));
306+ }
307+ else
308+ {
309+ int liAction = (Param2 == KEY_ENTER) ? Opt.EnterAction : Opt.ShiftEnterAction ;
310+ bool LowPriority = (Opt.RunLowPriority !=0 );
311+
312+ // Îáÿçàòåëüíî îæèäàíèå - äâà èíñòàëëÿòîðà ñðàçó íåäîïóñêàþòñÿ
313+ if (liAction == Action_Menu)
314+ {
315+ if (EntryMenu (0 , liAction, LowPriority, liSelected) < 0 )
316+ return TRUE ;
317+ }
318+ else if (liAction == Action_Uninstall)
319+ liAction = Action_UninstallWait;
320+ else if (liAction == Action_Modify)
321+ liAction = Action_ModifyWait;
322+ else if (liAction == Action_Repair)
323+ liAction = Action_RepairWait;
324+
325+ for (int pos = 0 ; pos < nCount; pos++)
326+ {
327+ if (!(FLI[pos].Flags & LIF_CHECKED))
328+ continue ;
329+ struct FarListPos FLP;
330+ FLP.SelectPos = pos;
331+ FLP.TopPos = -1 ;
332+ Info.SendDlgMessage (hDlg,DM_LISTSETCURPOS,LIST_BOX,reinterpret_cast <LONG_PTR>(&FLP));
333+ int li = ExecuteEntry (pos, liAction, LowPriority);
334+ if (li == -1 )
335+ break ; // îòìåíà
336+ if (li == 1 )
337+ liChanged = 1 ;
338+ }
339+ }
340+
236341 if (liChanged == 1 )
342+ {
237343 Info.SendDlgMessage (hDlg,DMU_UPDATE,1 ,0 );
344+ }
238345 }
239346 }
240347 return TRUE ;
@@ -273,6 +380,7 @@ static LONG_PTR WINAPI DlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
273380 return TRUE ;
274381
275382 case KEY_F3:
383+ case KEY_F4:
276384 {
277385 if (ListSize)
278386 {
@@ -282,6 +390,13 @@ static LONG_PTR WINAPI DlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
282390 }
283391 return TRUE ;
284392
393+ case KEY_F2:
394+ {
395+ Opt.SortByDate = !Opt.SortByDate ;
396+ Info.SendDlgMessage (hDlg,DMU_UPDATE,1 ,0 );
397+ }
398+ return TRUE ;
399+
285400 case KEY_BS:
286401 {
287402 if (lstrlen (Filter))
@@ -372,12 +487,14 @@ int WINAPI Configure(int ItemNumber)
372487 // BOOL bEnterWaitCompletion = (Opt.EnterFunction != 0);
373488 BOOL bUseElevation = (Opt.UseElevation != 0 );
374489 BOOL bLowPriority = (Opt.RunLowPriority != 0 );
490+ BOOL bForceMsiUse = (Opt.ForceMsiUse != 0 );
375491
376492 Config.AddCheckbox (MShowInEditor, &bShowInEditor);
377493 Config.AddCheckbox (MShowInViewer, &bShowInViewer);
378494 // Config.AddCheckbox(MEnterWaitCompletion, &bEnterWaitCompletion);
379495 Config.AddCheckbox (MUseElevation, &bUseElevation);
380496 Config.AddCheckbox (MLowPriority, &bUseElevation);
497+ Config.AddCheckbox (MForceMsiUse, &bForceMsiUse);
381498
382499 Config.AddSeparator ();
383500
@@ -411,12 +528,14 @@ int WINAPI Configure(int ItemNumber)
411528 // Opt.EnterFunction = bEnterWaitCompletion;
412529 Opt.UseElevation = bUseElevation;
413530 Opt.RunLowPriority = bLowPriority;
531+ Opt.ForceMsiUse = bForceMsiUse;
414532
415533 SetRegKey (HKCU,_T (" " ),_T (" WhereWork" ),(DWORD) Opt.WhereWork );
416534 SetRegKey (HKCU,_T (" " ),_T (" EnterAction" ),(DWORD) Opt.EnterAction );
417535 SetRegKey (HKCU,_T (" " ),_T (" ShiftEnterAction" ),(DWORD) Opt.ShiftEnterAction );
418536 SetRegKey (HKCU,_T (" " ),_T (" UseElevation" ),(DWORD) Opt.UseElevation );
419537 SetRegKey (HKCU,_T (" " ),_T (" RunLowPriority" ),(DWORD) Opt.RunLowPriority );
538+ SetRegKey (HKCU,_T (" " ),_T (" ForceMsiUse" ),(DWORD) Opt.ForceMsiUse );
420539 }
421540
422541 return FALSE ;
0 commit comments