void SetDesktopIconTextBk(int enable) //---------------------------------------------------+++--> { COLORREF col; HWND hwnd; hwnd = FindWindow("Progman", "Program Manager"); if(!hwnd) return; hwnd = GetWindow(hwnd, GW_CHILD); hwnd = GetWindow(hwnd, GW_CHILD); while(hwnd) { char s[80]; GetClassName(hwnd, s, 80); if(strcmp(s, "SysListView32") == 0) break; hwnd = GetWindow(hwnd, GW_HWNDNEXT); } if(!hwnd) return; if(enable) { col = CLR_NONE; } else { if(ListView_GetTextBkColor(hwnd) != CLR_NONE) return; col = GetSysColor(COLOR_DESKTOP); } ListView_SetTextBkColor(hwnd, col); ListView_RedrawItems(hwnd, 0, ListView_GetItemCount(hwnd)); hwnd = GetParent(hwnd); hwnd = GetWindow(hwnd, GW_CHILD); while(hwnd) { InvalidateRect(hwnd, NULL, TRUE); hwnd = GetWindow(hwnd, GW_HWNDNEXT); } }
//----------------------------------------------------------------------------- // Simulate one cycle of the PLC. Update everything, and keep track of whether // any outputs have changed. If so, force a screen refresh. If requested do // a screen refresh regardless. //----------------------------------------------------------------------------- void SimulateOneCycle(BOOL forceRefresh) { // When there is an error message up, the modal dialog makes its own // event loop, and there is risk that we would go recursive. So let // us fix that. (Note that there are no concurrency issues; we really // would get called recursively, not just reentrantly.) static BOOL Simulating = FALSE; if(Simulating) return; Simulating = TRUE; NeedRedraw = FALSE; if(SimulateUartTxCountdown > 0) { SimulateUartTxCountdown--; } else { SimulateUartTxCountdown = 0; } IntPc = 0; SimulateIntCode(); if(NeedRedraw || SimulateRedrawAfterNextCycle || forceRefresh) { InvalidateRect(MainWindow, NULL, FALSE); ListView_RedrawItems(IoList, 0, Prog.io.count - 1); } SimulateRedrawAfterNextCycle = FALSE; if(NeedRedraw) SimulateRedrawAfterNextCycle = TRUE; Simulating = FALSE; }
/** * name: ProfileList_EndLabelEdit * desc: destroys the edit control and saves the text to the list control if desired * param: hList - handle to listview control * bSave - tells, whether to save changes (TRUE) or not (FALSE) * return: returns 0 on success or nonzero **/ static INT ProfileList_EndLabelEdit(LPLISTCTRL pList, BOOLEAN bSave) { HWND hEdit; // check if labeledit is enabled if (!PtrIsValid(pList) || !pList->hList || !pList->labelEdit.hEdit) return 1; // set hEdit NULL to indicate the endlabeledit call and prevent other calls hEdit = pList->labelEdit.hEdit; pList->labelEdit.hEdit = NULL; if (bSave != FALSE && pList->labelEdit.pItem) { WORD ccText; LPTSTR szEdit = NULL; BOOLEAN bChanged = FALSE; // an list element was selected if (pList->labelEdit.iSubItem && pList->labelEdit.dropDown.iItem != pList->labelEdit.pItem->iListItem && pList->labelEdit.dropDown.iItem >= 0 && pList->labelEdit.dropDown.iItem < pList->labelEdit.pItem->idstrListCount) { pList->labelEdit.pItem->iListItem = pList->labelEdit.dropDown.iItem; if (pList->labelEdit.pItem->pszText[0]) { mir_free(pList->labelEdit.pItem->pszText[0]); pList->labelEdit.pItem->pszText[0] = NULL; } bChanged = TRUE; } // value was edited else { if ((ccText = GetWindowTextLength(hEdit)) > 0 && (szEdit = (LPTSTR)mir_alloc((ccText + 2) * sizeof(TCHAR)))) { GetWindowText(hEdit, szEdit, ccText + 1); szEdit[ccText + 1] = 0; if (!pList->labelEdit.pItem->pszText[pList->labelEdit.iSubItem]) { pList->labelEdit.pItem->pszText[pList->labelEdit.iSubItem] = szEdit; bChanged = TRUE; } else if (_tcscmp(pList->labelEdit.pItem->pszText[pList->labelEdit.iSubItem], szEdit)) { mir_free(pList->labelEdit.pItem->pszText[pList->labelEdit.iSubItem]); pList->labelEdit.pItem->pszText[pList->labelEdit.iSubItem] = szEdit; bChanged = TRUE; } else mir_free(szEdit); } } if (bChanged) { pList->labelEdit.pItem->wFlags |= CTRLF_CHANGED; pList->wFlags |= CTRLF_CHANGED; SendMessage(GetParent(GetParent(pList->hList)), PSM_CHANGED, 0, 0); } } if (pList->labelEdit.hBtn) DestroyWindow(pList->labelEdit.hBtn); if (pList->labelEdit.dropDown.hDrop) DestroyWindow(pList->labelEdit.dropDown.hDrop); DestroyWindow(hEdit); ListView_RedrawItems(pList->hList, pList->labelEdit.iItem, pList->labelEdit.iItem); ZeroMemory(&pList->labelEdit, sizeof(pList->labelEdit)); SetFocus(pList->hList); return 0; }
void TkeysPage::endKeyChange(void) { if (keyChanging == -1) { return; } ListView_RedrawItems(hlv, keyChanging, keyChanging); keyChanging = -1; }
void TconvolverPage::onManualFileSet(void) { int i=lvGetSelItem(IDC_LV_CONVOLVER_FILES); if (i!=-1) if (ffstring flnm=selectFile(speakersIdffs[i])) { speakerFormats[i]=getWavDesc(flnm.c_str(),IDC_LV_CONVOLVER_FILES); ListView_RedrawItems(hlv,i,i); } }
void reset_menu_count(HWND hwndList, PNHMenuWindow data) { int i; data->menu.counting = FALSE; if( IsWindow(hwndList) ) { i = ListView_GetNextItem((hwndList), -1, LVNI_FOCUSED); if( i>=0 ) ListView_RedrawItems( hwndList, i, i ); } }
void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int count) { int i; if( item<0 || item>=data->menu.size ) return; if( data->how==PICK_ONE && count!=0 ) { for(i=0; i<data->menu.size; i++) if( item!=i && data->menu.items[i].count!=0 ) { data->menu.items[i].count = 0; ListView_RedrawItems( hwndList, i, i ); }; } data->menu.items[item].count = count; ListView_RedrawItems( hwndList, item, item ); reset_menu_count(hwndList, data); }
void TconvolverPage::onManualFileClear(void) { int i=lvGetSelItem(IDC_LV_CONVOLVER_FILES); if (i!=-1) { cfgSet(speakersIdffs[i],_l("")); speakerFormats[i].clear(); ListView_RedrawItems(hlv,i,i); } }
void TkeysPage::beginKeyChange(void) { if (keyChanging != -1) { return; } int i = lvGetSelItem(IDC_LV_KEYS); if (i == -1) { return; } keyChanging = i; ListView_RedrawItems(hlv, i, i); }
void ChangeInfoData::EndListEdit(int save) { if (hwndListEdit == NULL || iEditItem == -1 || this != dataListEdit) return; if (save) { const SettingItem &si = setting[iEditItem]; SettingItemData &sid = settingData[iEditItem]; int iItem = SendMessage(hwndListEdit, LB_GETCURSEL, 0, 0); int i = SendMessage(hwndListEdit, LB_GETITEMDATA, iItem, 0); if (iItem != -1 && i != -1) { FieldNamesItem *list = (FieldNamesItem*)si.pList; if (list == timezonesField) { tmi.storeListResults(NULL, ppro->m_szModuleName, hwndListEdit, TZF_PLF_LB); list[i = 0].code = ppro->getDword("Timezone", 0); } FieldNamesItem &pItem = list[i]; if (si.dbType == DBVT_ASCIIZ) { char *szNewValue = pItem.text; if (pItem.code || (si.displayType & LIF_ZEROISVALID)) { sid.changed = strcmpnull(szNewValue, (char*)sid.value); SAFE_FREE((void**)&sid.value); sid.value = (LPARAM)null_strdup(szNewValue); } else { sid.changed = (char*)sid.value != NULL; SAFE_FREE((void**)&sid.value); } } else { sid.changed = pItem.code != sid.value; sid.value = pItem.code; } if (sid.changed) { char buf[MAX_PATH]; TCHAR tbuf[MAX_PATH]; if (utf8_to_tchar_static(ICQTranslateUtfStatic(pItem.text, buf, SIZEOF(buf)), tbuf, SIZEOF(buf))) ListView_SetItemText(hwndList, iEditItem, 1, tbuf); EnableDlgItem(GetParent(hwndList), IDC_SAVE, TRUE); } } } ListView_RedrawItems(hwndList, iEditItem, iEditItem); iEditItem = -1; dataListEdit = NULL; DestroyWindow(hwndListEdit); hwndListEdit = NULL; }
void Update_RAM_Watch() { BOOL watchChanged[MAX_WATCH_COUNT] = {0}; if(WatchCount) { // update cached values and detect changes to displayed listview items EnterCriticalSection(&g_processMemCS); for(int i = 0; i < WatchCount; i++) { RSVal prevCurValue = rswatches[i].CurValue; RSVal newCurValue = GetCurrentValue(rswatches[i]); if(!prevCurValue.CheckBinaryEquality(newCurValue)) { rswatches[i].CurValue = newCurValue; watchChanged[i] = TRUE; } } LeaveCriticalSection(&g_processMemCS); } // refresh any visible parts of the listview box that changed HWND lv = GetDlgItem(RamWatchHWnd,IDC_WATCHLIST); int top = ListView_GetTopIndex(lv); int bottom = top + ListView_GetCountPerPage(lv) + 1; // +1 is so we will update a partially-displayed last item if(top < 0) top = 0; if(bottom > WatchCount) bottom = WatchCount; int start = -1; for(int i = top; i <= bottom; i++) { if(start == -1) { if(i != bottom && watchChanged[i]) { start = i; //somethingChanged = true; } } else { if(i == bottom || !watchChanged[i]) { ListView_RedrawItems(lv, start, i-1); start = -1; } } } }
extern "C" void Update_RAM_Watch() { if (!RamWatchHWnd) return; HWND lv; int top; int bottom; int start; int i; // update cached values and detect changes to displayed listview items int watchChanged[MAX_WATCH_COUNT] = {0}; for(i = 0; i < WatchCount; i++) { unsigned int prevCurValue = rswatches[i].CurValue; unsigned int newCurValue = GetCurrentValue(&rswatches[i]); if(prevCurValue != newCurValue) { rswatches[i].CurValue = newCurValue; watchChanged[i] = 1; } } // refresh any visible parts of the listview box that changed lv = GetDlgItem(RamWatchHWnd,IDC_WATCHLIST); top = ListView_GetTopIndex(lv); bottom = top + ListView_GetCountPerPage(lv) + 1; // +1 is so we will update a partially-displayed last item if(top < 0) top = 0; if(bottom > WatchCount) bottom = WatchCount; start = -1; for(i = top; i <= bottom; i++) { if(start == -1) { if(i != bottom && watchChanged[i]) { start = i; //somethingChanged = 1; } } else { if(i == bottom || !watchChanged[i]) { ListView_RedrawItems(lv, start, i-1); start = -1; } } } }
void ChangeInfoData::EndListEdit(int save) { if (hwndListEdit == NULL || iEditItem == -1 || this != dataListEdit) return; if (save) { int iItem = SendMessage(hwndListEdit, LB_GETCURSEL, 0, 0); int i = SendMessage(hwndListEdit, LB_GETITEMDATA, iItem, 0); if (setting[iEditItem].dbType == DBVT_ASCIIZ) { char *szNewValue = (((FieldNamesItem*)setting[iEditItem].pList)[i].text); if (((FieldNamesItem*)setting[iEditItem].pList)[i].code || setting[iEditItem].displayType & LIF_ZEROISVALID) { settingData[iEditItem].changed = strcmpnull(szNewValue, (char*)settingData[iEditItem].value); SAFE_FREE((void**)&settingData[iEditItem].value); settingData[iEditItem].value = (LPARAM)null_strdup(szNewValue); } else { settingData[iEditItem].changed = (char*)settingData[iEditItem].value!=NULL; SAFE_FREE((void**)&settingData[iEditItem].value); } } else { settingData[iEditItem].changed = ((FieldNamesItem*)setting[iEditItem].pList)[i].code != settingData[iEditItem].value; settingData[iEditItem].value = ((FieldNamesItem*)setting[iEditItem].pList)[i].code; } if (settingData[iEditItem].changed) { char buf[MAX_PATH]; TCHAR tbuf[MAX_PATH]; if (utf8_to_tchar_static(ICQTranslateUtfStatic(((FieldNamesItem*)setting[iEditItem].pList)[i].text, buf, SIZEOF(buf)), tbuf, SIZEOF(buf))) ListView_SetItemText(hwndList, iEditItem, 1, tbuf); EnableDlgItem(GetParent(hwndList), IDC_SAVE, TRUE); } } ListView_RedrawItems(hwndList, iEditItem, iEditItem); iEditItem = -1; dataListEdit = NULL; DestroyWindow(hwndListEdit); hwndListEdit = NULL; }
// // Check_All // // The following function checks all of the items in a list view (by // selecting an appropriate image. // static void Check_All(HWND List_Window) { int Item_Count = ListView_GetItemCount(List_Window); for (int i = 0; i < Item_Count; i++) { // Change the image associated with this item. LV_ITEM Item; Item.mask = LVIF_IMAGE; Item.iItem = i; Item.iSubItem = 0; Item.iImage = 1; ListView_SetItem(List_Window, &Item); } ListView_RedrawItems(List_Window, 0, Item_Count - 1); UpdateWindow(List_Window); }
LRESULT TaskList::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch (Message) { case WM_KEYUP: { if (wParam == VK_CONTROL) { ::SendMessage(_hParent, WM_COMMAND, ID_PICKEDUP, _currentIndex); } } return TRUE; case WM_MOUSEWHEEL : { short zDelta = (short) HIWORD(wParam); if (zDelta > 0) { size_t selected = (_currentIndex - 1) < 0 ? (_nbItem - 1) : (_currentIndex - 1); ListView_SetItemState(_hSelf, _currentIndex, 0, LVIS_SELECTED|LVIS_FOCUSED); // tells what item(s) to be repainted ListView_RedrawItems(_hSelf, _currentIndex, _currentIndex); // repaint item(s) UpdateWindow(_hSelf); ListView_SetItemState(_hSelf, selected, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); // tells what item(s) to be repainted ListView_RedrawItems(_hSelf, selected, selected); // repaint item(s) UpdateWindow(_hSelf); _currentIndex = selected; } else { size_t selected = (_currentIndex + 1) > (_nbItem - 1) ? 0 : (_currentIndex + 1); ListView_SetItemState(_hSelf, _currentIndex, 0, LVIS_SELECTED|LVIS_FOCUSED); // tells what item(s) to be repainted ListView_RedrawItems(_hSelf, _currentIndex, _currentIndex); // repaint item(s) UpdateWindow(_hSelf); ListView_SetItemState(_hSelf, selected, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); // tells what item(s) to be repainted ListView_RedrawItems(_hSelf, selected, selected); // repaint item(s) UpdateWindow(_hSelf); _currentIndex = selected; } return TRUE; } case WM_KEYDOWN : { return TRUE; } case WM_GETDLGCODE : { MSG *msg = (MSG*)lParam; if ( msg != NULL) { if ((msg->message == WM_KEYDOWN) && (0x80 & GetKeyState(VK_CONTROL))) { // Shift+Tab is cool but I think VK_UP and VK_LEFT are also cool :-) if (((msg->wParam == VK_TAB) && (0x80 & GetKeyState(VK_SHIFT))) || (msg->wParam == VK_UP)) { size_t selected = (_currentIndex - 1) < 0 ? (_nbItem - 1) : (_currentIndex - 1); ListView_SetItemState(_hSelf, _currentIndex, 0, LVIS_SELECTED|LVIS_FOCUSED); // tells what item(s) to be repainted ListView_RedrawItems(_hSelf, _currentIndex, _currentIndex); // repaint item(s) UpdateWindow(_hSelf); ListView_SetItemState(_hSelf, selected, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); // tells what item(s) to be repainted ListView_RedrawItems(_hSelf, selected, selected); // repaint item(s) UpdateWindow(_hSelf); _currentIndex = selected; } // VK_DOWN and VK_RIGHT do the same as VK_TAB does else if ((msg->wParam == VK_TAB) || (msg->wParam == VK_DOWN)) { size_t selected = (_currentIndex + 1) > (_nbItem - 1) ? 0 : (_currentIndex + 1); ListView_SetItemState(_hSelf, _currentIndex, 0, LVIS_SELECTED|LVIS_FOCUSED); // tells what item(s) to be repainted ListView_RedrawItems(_hSelf, _currentIndex, _currentIndex); // repaint item(s) UpdateWindow(_hSelf); ListView_SetItemState(_hSelf, selected, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); // tells what item(s) to be repainted ListView_RedrawItems(_hSelf, selected, selected); // repaint item(s) UpdateWindow(_hSelf); _currentIndex = selected; } } else { return TRUE; } } return DLGC_WANTALLKEYS ; } default : return ::CallWindowProc(_defaultProc, hwnd, Message, wParam, lParam); } }
VOID WINAPI HashVerifyUpdateSummary( PHASHVERIFYCONTEXT phvctx, PHASHVERIFYITEM pItem ) { HWND hWnd = phvctx->hWnd; TCHAR szFormat[MAX_STRINGRES], szBuffer[MAX_STRINGMSG]; // If this is not the initial update and we are lagging, and our update // drought is not TOO long, then we should skip the update... BOOL bUpdateUI = !(pItem && phvctx->cSentMsgs > phvctx->cHandledMsgs && phvctx->cHandledMsgs < phvctx->prev.idStartOfDirtyRange + phvctx->uMaxBatch); // Update the list if (pItem) { switch (pItem->uStatusID) { case HV_STATUS_MATCH: ++phvctx->cMatch; break; case HV_STATUS_MISMATCH: ++phvctx->cMismatch; break; default: ++phvctx->cUnreadable; } if (bUpdateUI) { ListView_RedrawItems( phvctx->hWndList, phvctx->prev.idStartOfDirtyRange, phvctx->cHandledMsgs - 1 ); } } // Update the counts and progress bar if (bUpdateUI) { // FormatFractionalResults expects an empty format buffer on the first call szFormat[0] = 0; if (!pItem || phvctx->prev.cMatch != phvctx->cMatch) { FormatFractionalResults(szFormat, szBuffer, phvctx->cMatch, phvctx->cTotal); SetDlgItemText(hWnd, IDC_MATCH_RESULTS, szBuffer); } if (!pItem || phvctx->prev.cMismatch != phvctx->cMismatch) { FormatFractionalResults(szFormat, szBuffer, phvctx->cMismatch, phvctx->cTotal); SetDlgItemText(hWnd, IDC_MISMATCH_RESULTS, szBuffer); } if (!pItem || phvctx->prev.cUnreadable != phvctx->cUnreadable) { FormatFractionalResults(szFormat, szBuffer, phvctx->cUnreadable, phvctx->cTotal); SetDlgItemText(hWnd, IDC_UNREADABLE_RESULTS, szBuffer); } FormatFractionalResults(szFormat, szBuffer, phvctx->cTotal - phvctx->cHandledMsgs, phvctx->cTotal); SetDlgItemText(hWnd, IDC_PENDING_RESULTS, szBuffer); SendMessage(phvctx->hWndPBTotal, PBM_SETPOS, phvctx->cHandledMsgs, 0); // Now that we've updated the UI, update the prev structure phvctx->prev.idStartOfDirtyRange = phvctx->cHandledMsgs; phvctx->prev.cMatch = phvctx->cMatch; phvctx->prev.cMismatch = phvctx->cMismatch; phvctx->prev.cUnreadable = phvctx->cUnreadable; } // Update the header if (!(phvctx->dwFlags & HVF_HAS_SET_TYPE)) { PCTSTR pszSubtitle = NULL; switch (phvctx->whctx.flags) { case WHEX_CHECKCRC32: pszSubtitle = TEXT("CRC-32"); break; case WHEX_CHECKMD4: pszSubtitle = TEXT("MD4"); break; case WHEX_CHECKMD5: pszSubtitle = TEXT("MD5"); break; case WHEX_CHECKSHA1: pszSubtitle = TEXT("SHA-1"); break; } if (pszSubtitle) { LoadString(g_hModThisDll, IDS_HV_SUMMARY, szFormat, countof(szFormat)); wnsprintf(szBuffer, countof(szBuffer), TEXT("%s (%s)"), szFormat, pszSubtitle); SetDlgItemText(hWnd, IDC_SUMMARY, szBuffer); phvctx->dwFlags |= HVF_HAS_SET_TYPE; } } }
/** * name: DlgProcPspAbout() * desc: dialog procedure * * return: 0 or 1 **/ INT_PTR CALLBACK PSPProcContactProfile(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { HWND hList = GetDlgItem(hDlg, LIST_PROFILE); LPLISTCTRL pList; switch (uMsg) { case WM_INITDIALOG: { LVCOLUMN lvc; RECT rc; LOGFONT lf; HFONT hFont; TOOLINFO ti; if (!hList || !(pList = (LPLISTCTRL)mir_alloc(sizeof(LISTCTRL)))) return FALSE; ZeroMemory(pList, sizeof(LISTCTRL)); TranslateDialogDefault(hDlg); Ctrl_InitTextColours(); // init info structure pList->hList = hList; pList->nType = CTRL_LIST_PROFILE; ZeroMemory(&pList->labelEdit, sizeof(pList->labelEdit)); SetUserData(hList, pList); // set new window procedure OldListViewProc = (WNDPROC)SetWindowLongPtr(hList, GWLP_WNDPROC, (LONG_PTR)&ProfileList_SubclassProc); // remove static edge in aero mode if (IsAeroMode()) SetWindowLongPtr(hList, GWL_EXSTYLE, GetWindowLongPtr(hList, GWL_EXSTYLE)&~WS_EX_STATICEDGE); // insert columns into the listboxes ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT); PSGetBoldFont(hDlg, hFont); SendDlgItemMessage(hDlg, IDC_PAGETITLE, WM_SETFONT, (WPARAM)hFont, 0); // set listfont pList->hFont = (HFONT)SendMessage(hList, WM_GETFONT, 0, 0); pList->wFlags |= LVF_EDITLABEL; GetObject(pList->hFont, sizeof(lf), &lf); lf.lfHeight -= 6; hFont = CreateFontIndirect(&lf); SendMessage(hList, WM_SETFONT, (WPARAM)hFont, 0); GetClientRect(hList, &rc); rc.right -= GetSystemMetrics(SM_CXVSCROLL); // initiate the tooltips pList->hTip = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, WS_POPUP|TTS_BALLOON|TTS_NOPREFIX|TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hList, NULL, ghInst, NULL); if (pList->hTip) { SetWindowPos(pList->hTip, HWND_TOPMOST, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); ZeroMemory(&ti, sizeof(TOOLINFO)); ti.cbSize = sizeof(TOOLINFO); ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS|TTF_TRANSPARENT; ti.hinst = ghInst; ti.hwnd = hList; ti.uId = (UINT_PTR)hList; SendMessage(pList->hTip, TTM_ADDTOOL, NULL, (LPARAM)&ti); SendMessage(pList->hTip, TTM_ACTIVATE, FALSE, (LPARAM)&ti); } // insert columns into the listboxes lvc.mask = LVCF_WIDTH; lvc.cx = rc.right / 8 * 3; ListView_InsertColumn(hList, 0, &lvc); lvc.cx = rc.right / 8 * 5; ListView_InsertColumn(hList, 1, &lvc); return TRUE; } case WM_CTLCOLORSTATIC: case WM_CTLCOLORDLG: if (IsAeroMode()) return (INT_PTR)GetStockBrush(WHITE_BRUSH); break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case 0: { HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam; LPCSTR pszProto; if (!PtrIsValid(pList = (LPLISTCTRL)GetUserData(hList))) break; switch (((LPNMHDR)lParam)->code) { // some account data may have changed so reread database case PSN_INFOCHANGED: { BYTE msgResult = 0; LPIDSTRLIST idList; UINT nList; BYTE i; INT iItem = 0, iGrp = 0, numProtoItems, numUserItems; if (!(pList->wFlags & CTRLF_CHANGED) && PSGetBaseProto(hDlg, pszProto) && *pszProto != 0) { ProfileList_Clear(hList); // insert the past information for (i = 0; i < 3; i++) { pFmt[i].GetList((WPARAM)&nList, (LPARAM)&idList); if ((numProtoItems = ProfileList_AddItemlistFromDB(pList, iItem, idList, nList, hContact, pszProto, pFmt[i].szCatFmt, pFmt[i].szValFmt, CTRLF_HASPROTO)) < 0) return FALSE; // scan all basic protocols for the subcontacts if (DB::Module::IsMetaAndScan(pszProto)) { INT iDefault = CallService(MS_MC_GETDEFAULTCONTACTNUM, (WPARAM)hContact, NULL); HANDLE hSubContact, hDefContact; LPCSTR pszSubBaseProto; INT j, numSubs; if ((hDefContact = (HANDLE)CallService(MS_MC_GETSUBCONTACT, (WPARAM)hContact, iDefault)) && (pszSubBaseProto = DB::Contact::Proto(hDefContact))) { if ((numProtoItems += ProfileList_AddItemlistFromDB(pList, iItem, idList, nList, hDefContact, pszSubBaseProto, pFmt[i].szCatFmt, pFmt[i].szValFmt, CTRLF_HASMETA|CTRLF_HASPROTO)) < 0) return FALSE; // copy the missing settings from the other subcontacts numSubs = CallService(MS_MC_GETNUMCONTACTS, (WPARAM)hContact, NULL); for (j = 0; j < numSubs; j++) { if (j == iDefault) continue; if (!(hSubContact = (HANDLE)CallService(MS_MC_GETSUBCONTACT, (WPARAM)hContact, j))) continue; if (!(pszSubBaseProto = DB::Contact::Proto(hSubContact))) continue; if ((numProtoItems += ProfileList_AddItemlistFromDB(pList, iItem, idList, nList, hSubContact, pszSubBaseProto, pFmt[i].szCatFmt, pFmt[i].szValFmt, CTRLF_HASMETA|CTRLF_HASPROTO)) < 0) return FALSE; //if ((numUserItems += ProfileList_AddItemlistFromDB(pList, iItem, idList, nList, hSubContact, USERINFO, pFmt[i].szCatFmt, pFmt[i].szValFmt, CTRLF_HASMETA|CTRLF_HASPROTO)) < 0) // return FALSE; } } } if ((numUserItems = ProfileList_AddItemlistFromDB(pList, iItem, idList, nList, hContact, USERINFO, pFmt[i].szCatFmt, pFmt[i].szValFmt, CTRLF_HASCUSTOM)) < 0) return FALSE; if (numUserItems || numProtoItems) { msgResult = PSP_CHANGED; ProfileList_AddGroup(hList, pFmt[i].szGroup, iGrp); iGrp = ++iItem; } } } SetWindowLongPtr(hDlg, DWLP_MSGRESULT, msgResult); break; } // user swiches to another propertysheetpage case PSN_KILLACTIVE: ProfileList_EndLabelEdit(hList, TRUE); break; // user selected to apply settings to the database case PSN_APPLY: if (pList->wFlags & CTRLF_CHANGED) { BYTE iFmt = -1; INT iItem; LVITEM lvi; TCHAR szGroup[MAX_PATH]; CHAR pszSetting[MAXSETTING]; LPLCITEM pItem; LPSTR pszModule = USERINFO; if (!hContact) PSGetBaseProto(hDlg, pszModule); *szGroup = 0; lvi.mask = LVIF_TEXT|LVIF_PARAM; lvi.pszText = szGroup; lvi.cchTextMax = MAX_PATH; for (iItem = lvi.iItem = lvi.iSubItem = 0; ListView_GetItem(hList, &lvi); lvi.iItem++) { if (!PtrIsValid(pItem = (LPLCITEM)lvi.lParam)) { // delete reluctant items if (iFmt >= 0 && iFmt < SIZEOF(pFmt)) { DB::Setting::DeleteArray(hContact, pszModule, pFmt[iFmt].szCatFmt, iItem); DB::Setting::DeleteArray(hContact, pszModule, pFmt[iFmt].szValFmt, iItem); } // find information about the group for (iFmt = 0; iFmt < SIZEOF(pFmt); iFmt++) { if (!_tcscmp(szGroup, pFmt[iFmt].szGroup)) { break; } } // indicate, no group was found. should not happen!! if (iFmt == SIZEOF(pFmt)) { *szGroup = 0; iFmt = -1; } iItem = 0; } else if (iFmt >= 0 && iFmt < SIZEOF(pFmt)) { // save value if (!pItem->pszText[1] || !*pItem->pszText[1]) continue; if (!(pItem->wFlags & (CTRLF_HASPROTO|CTRLF_HASMETA))) { mir_snprintf(pszSetting, MAXSETTING, pFmt[iFmt].szValFmt, iItem); DB::Setting::WriteTString(hContact, pszModule, pszSetting, pItem->pszText[1]); // save category mir_snprintf(pszSetting, MAXSETTING, pFmt[iFmt].szCatFmt, iItem); if (pItem->idstrList && pItem->iListItem > 0 && pItem->iListItem < pItem->idstrListCount) DB::Setting::WriteAString(hContact, pszModule, pszSetting, (LPSTR)pItem->idstrList[pItem->iListItem].pszText); else if (pItem->pszText[0] && *pItem->pszText[0]) DB::Setting::WriteTString(hContact, pszModule, pszSetting, (LPTSTR)pItem->pszText[0]); else DB::Setting::Delete(hContact, pszModule, pszSetting); // redraw the item if required if (pItem->wFlags & CTRLF_CHANGED) { pItem->wFlags &= ~CTRLF_CHANGED; ListView_RedrawItems(hList, lvi.iItem, lvi.iItem); } iItem++; } } } // delete reluctant items if (iFmt >= 0 && iFmt < SIZEOF(pFmt)) { DB::Setting::DeleteArray(hContact, pszModule, pFmt[iFmt].szCatFmt, iItem); DB::Setting::DeleteArray(hContact, pszModule, pFmt[iFmt].szValFmt, iItem); } pList->wFlags &= ~CTRLF_CHANGED; } break; } break; } // // handle notification messages from the list control // case LIST_PROFILE: { LPLISTCTRL pList = (LPLISTCTRL)GetUserData(((LPNMHDR)lParam)->hwndFrom); switch (((LPNMHDR)lParam)->code) { case NM_RCLICK: { HMENU hMenu = CreatePopupMenu(); MENUITEMINFO mii; HANDLE hContact; LVHITTESTINFO hi; LPLCITEM pItem; POINT pt; if (!hMenu) return 1; PSGetContact(hDlg, hContact); GetCursorPos(&pt); hi.pt = pt; ScreenToClient(((LPNMHDR)lParam)->hwndFrom, &hi.pt); ListView_SubItemHitTest(((LPNMHDR)lParam)->hwndFrom, &hi); pItem = ProfileList_GetItemData(((LPNMHDR)lParam)->hwndFrom, hi.iItem); // insert menuitems ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID|MIIM_STRING; // insert "Add" Menuitem mii.wID = BTN_ADD_intEREST; mii.dwTypeData = TranslateT("Add Interest"); InsertMenuItem(hMenu, 0, TRUE, &mii); mii.wID = BTN_ADD_AFFLIATION; mii.dwTypeData = TranslateT("Add Affliation"); InsertMenuItem(hMenu, 1, TRUE, &mii); mii.wID = BTN_ADD_PAST; mii.dwTypeData = TranslateT("Add Past"); InsertMenuItem(hMenu, 2, TRUE, &mii); if (hi.iItem != -1 && PtrIsValid(pItem) && !(hContact && (pItem->wFlags & CTRLF_HASPROTO))) { // insert separator mii.fMask = MIIM_FTYPE; mii.fType = MFT_SEPARATOR; InsertMenuItem(hMenu, 3, TRUE, &mii); // insert "Delete" Menuitem mii.fMask = MIIM_ID|MIIM_STRING; mii.wID = BTN_EDIT_CAT; mii.dwTypeData = TranslateT("Edit Category"); InsertMenuItem(hMenu, 4, TRUE, &mii); mii.wID = BTN_EDIT_VAL; mii.dwTypeData = TranslateT("Edit Value"); InsertMenuItem(hMenu, 5, TRUE, &mii); mii.fMask = MIIM_FTYPE; mii.fType = MFT_SEPARATOR; InsertMenuItem(hMenu, 6, TRUE, &mii); // insert "Delete" Menuitem mii.fMask = MIIM_ID|MIIM_STRING; mii.wID = BTN_DEL; mii.dwTypeData = TranslateT("Delete"); InsertMenuItem(hMenu, 7, TRUE, &mii); } TrackPopupMenu(hMenu, 0, pt.x, pt.y, 0, hDlg, 0); DestroyMenu(hMenu); return 0; } /*case LVN_BEGINSCROLL: SetFocus(((LPNMHDR)lParam)->hwndFrom); break; */ case LVN_GETDISPINFO: if (pList->labelEdit.iTopIndex != ListView_GetTopIndex(hList)) ProfileList_EndLabelEdit(((LPNMHDR)lParam)->hwndFrom, FALSE); break; case NM_CUSTOMDRAW: { LPNMLVCUSTOMDRAW cd = (LPNMLVCUSTOMDRAW)lParam; LPLCITEM pItem = (LPLCITEM)cd->nmcd.lItemlParam; RECT rc; switch (cd->nmcd.dwDrawStage) { case CDDS_PREPAINT: SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW); return TRUE; case CDDS_ITEMPREPAINT: ListView_GetItemRect(cd->nmcd.hdr.hwndFrom, cd->nmcd.dwItemSpec, &rc, LVIR_BOUNDS); if (!PtrIsValid(pItem)) { HFONT hBold, hFont; TCHAR szText[MAX_PATH]; PSGetBoldFont(hDlg, hBold); hFont = (HFONT)SelectObject(cd->nmcd.hdc, hBold); SetTextColor(cd->nmcd.hdc, GetSysColor(COLOR_3DSHADOW)); ProfileList_GetItemText(cd->nmcd.hdr.hwndFrom, cd->nmcd.dwItemSpec, 0, szText, MAX_PATH); rc.left += 6; DrawText(cd->nmcd.hdc, TranslateTS(szText), -1, &rc, DT_NOCLIP|DT_NOPREFIX|DT_SINGLELINE|DT_VCENTER); rc.bottom -= 2; rc.top = rc.bottom - 1; rc.left -= 6; DrawEdge(cd->nmcd.hdc, &rc, BDR_SUNKENOUTER, BF_RECT); SelectObject(cd->nmcd.hdc, hFont); SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT); return TRUE; } // draw selected item if ((cd->nmcd.uItemState & CDIS_SELECTED) || (pList->labelEdit.iItem == cd->nmcd.dwItemSpec)) { SetTextColor(cd->nmcd.hdc, GetSysColor(COLOR_HIGHLIGHTTEXT)); FillRect(cd->nmcd.hdc, &rc, GetSysColorBrush(COLOR_HIGHLIGHT)); } // draw background of unselected item else { SetTextColor(cd->nmcd.hdc, (pItem->wFlags & CTRLF_CHANGED) ? clrChanged : (pItem->wFlags & CTRLF_HASMETA) ? clrMeta : ((pItem->wFlags & (CTRLF_HASCUSTOM)) && (pItem->wFlags & CTRLF_HASPROTO)) ? clrBoth : (pItem->wFlags & CTRLF_HASCUSTOM) ? clrCustom : clrNormal); FillRect(cd->nmcd.hdc, &rc, GetSysColorBrush(COLOR_WINDOW)); } SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NEWFONT|CDRF_NOTIFYSUBITEMDRAW); return TRUE; case CDDS_SUBITEM|CDDS_ITEMPREPAINT: { HFONT hoFont = (HFONT)SelectObject(cd->nmcd.hdc, pList->hFont); ListView_GetSubItemRect(cd->nmcd.hdr.hwndFrom, cd->nmcd.dwItemSpec, cd->iSubItem, LVIR_BOUNDS, &rc); if (cd->iSubItem == 0) { RECT rc2; ListView_GetSubItemRect(cd->nmcd.hdr.hwndFrom, cd->nmcd.dwItemSpec, 1, LVIR_BOUNDS, &rc2); rc.right = rc2.left; } rc.left += 3; DrawText(cd->nmcd.hdc, pItem->pszText[cd->iSubItem] ? pItem->pszText[cd->iSubItem] : (cd->iSubItem == 0 && pItem->idstrList && pItem->iListItem > 0 && pItem->iListItem < pItem->idstrListCount) ? pItem->idstrList[pItem->iListItem].ptszTranslated : TranslateT("<empty>"), -1, &rc, DT_END_ELLIPSIS|DT_NOCLIP|DT_NOPREFIX|DT_SINGLELINE|DT_VCENTER); SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT); return TRUE; } } /* switch (cd->nmcd.dwDrawStage) */ break; } /* case NM_CUSTOMDRAW: */ } /* (((LPNMHDR)lParam)->code) */ break; } } break; /* case WM_NOTIFY: */ case WM_COMMAND: { switch (LOWORD(wParam)) { case BTN_ADD_intEREST: return ProfileList_AddNewItem(hDlg, (LPLISTCTRL)GetUserData(hList), &pFmt[2]); case BTN_ADD_AFFLIATION: return ProfileList_AddNewItem(hDlg, (LPLISTCTRL)GetUserData(hList), &pFmt[1]); case BTN_ADD_PAST: return ProfileList_AddNewItem(hDlg, (LPLISTCTRL)GetUserData(hList), &pFmt[0]); case BTN_EDIT_CAT: ProfileList_BeginLabelEdit(hList, ListView_GetSelectionMark(hList), 0); break; case BTN_EDIT_VAL: ProfileList_BeginLabelEdit(hList, ListView_GetSelectionMark(hList), 1); break; case BTN_DEL: if (IDYES == MsgBox(hDlg, MB_YESNO|MB_ICON_QUESTION, LPGENT("Question"), LPGENT("Delete an entry"), LPGENT("Do you really want to delete this entry?"))) { INT iItem = ListView_GetSelectionMark(hList); LPLISTCTRL pList = (LPLISTCTRL)GetUserData(hList); ProfileList_DeleteItem(hList, iItem); if (PtrIsValid(pList)) pList->wFlags |= CTRLF_CHANGED; SendMessage(GetParent(hDlg), PSM_CHANGED, NULL, NULL); // check if to delete any devider if (!ProfileList_GetItemData(hList, iItem--) && !ProfileList_GetItemData(hList, iItem)) ListView_DeleteItem(hList, iItem); } break; } break; } } return FALSE; }
INT_PTR CALLBACK DlgProcIcoLibOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { struct IcoLibOptsData *dat; static HTREEITEM prevItem = 0; static HWND hPreview = NULL; dat = (struct IcoLibOptsData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); hPreview = GetDlgItem(hwndDlg, IDC_PREVIEW); dat = (struct IcoLibOptsData*)mir_alloc(sizeof(struct IcoLibOptsData)); dat->hwndIndex = NULL; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); // // Reset temporary data & upload sections list // { mir_cslock lck(csIconList); for (int indx = 0; indx < iconList.getCount(); indx++) { iconList[indx]->temp_file = NULL; iconList[indx]->temp_icon = NULL; iconList[indx]->temp_reset = FALSE; } bNeedRebuild = FALSE; } // // Setup preview listview // ListView_SetUnicodeFormat(hPreview, TRUE); ListView_SetExtendedListViewStyleEx(hPreview, LVS_EX_INFOTIP, LVS_EX_INFOTIP); ListView_SetImageList(hPreview, ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32|ILC_MASK, 0, 30), LVSIL_NORMAL); ListView_SetIconSpacing(hPreview, 56, 67); SendMessage(hwndDlg, DM_REBUILD_CTREE, 0, 0); return TRUE; case DM_REBUILD_CTREE: { HWND hwndTree = GetDlgItem(hwndDlg, IDC_CATEGORYLIST); int indx; TCHAR itemName[1024]; HTREEITEM hSection; if (!hwndTree) break; TreeView_SelectItem(hwndTree, NULL); TreeView_DeleteAllItems(hwndTree); for (indx = 0; indx < sectionList.getCount(); indx++) { TCHAR* sectionName; int sectionLevel = 0; hSection = NULL; mir_tstrcpy(itemName, sectionList[indx]->name); sectionName = itemName; while (sectionName) { // allow multi-level tree TCHAR* pItemName = sectionName; HTREEITEM hItem; if (sectionName = _tcschr(sectionName, '/')) { // one level deeper *sectionName = 0; } pItemName = TranslateTS(pItemName); hItem = FindNamedTreeItemAt(hwndTree, hSection, pItemName); if (!sectionName || !hItem) { if (!hItem) { TVINSERTSTRUCT tvis = {0}; TreeItem *treeItem = (TreeItem *)mir_alloc(sizeof(TreeItem)); treeItem->value = SECTIONPARAM_MAKE(indx, sectionLevel, sectionName ? 0 : SECTIONPARAM_HAVEPAGE); treeItem->paramName = mir_t2a(itemName); tvis.hParent = hSection; tvis.hInsertAfter = TVI_SORT; tvis.item.mask = TVIF_TEXT|TVIF_PARAM|TVIF_STATE; tvis.item.pszText = pItemName; tvis.item.lParam = (LPARAM) treeItem; tvis.item.state = tvis.item.stateMask = db_get_b(NULL, "SkinIconsUI", treeItem->paramName, TVIS_EXPANDED); hItem = TreeView_InsertItem(hwndTree, &tvis); } else { TVITEM tvi = {0}; tvi.hItem = hItem; tvi.mask = TVIF_HANDLE | TVIF_PARAM; TreeView_GetItem(hwndTree, &tvi); TreeItem *treeItem = (TreeItem *)tvi.lParam; treeItem->value = SECTIONPARAM_MAKE(indx, sectionLevel, SECTIONPARAM_HAVEPAGE); } } if (sectionName) { *sectionName = '/'; sectionName++; } sectionLevel++; hSection = hItem; } } ShowWindow(hwndTree, SW_SHOW); TreeView_SelectItem(hwndTree, FindNamedTreeItemAt(hwndTree, 0, NULL)); } break; // Rebuild preview to new section case DM_REBUILDICONSPREVIEW: { SectionItem* sectionActive = (SectionItem*)lParam; EnableWindow(hPreview, sectionActive != NULL); ListView_DeleteAllItems(hPreview); HIMAGELIST hIml = ListView_GetImageList(hPreview, LVSIL_NORMAL); ImageList_RemoveAll(hIml); if (sectionActive == NULL) break; LVITEM lvi = {0}; lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; { mir_cslock lck(csIconList); for (int indx = 0; indx < iconList.getCount(); indx++) { IcolibItem *item = iconList[indx]; if (item->section == sectionActive) { lvi.pszText = item->getDescr(); HICON hIcon = item->temp_icon; if (!hIcon) hIcon = IconItem_GetIcon_Preview(item); lvi.iImage = ImageList_AddIcon(hIml, hIcon); lvi.lParam = indx; ListView_InsertItem(hPreview, &lvi); if (hIcon != item->temp_icon) SafeDestroyIcon(&hIcon); } } } if (sectionActive->flags & SIDF_SORTED) ListView_SortItems(hPreview, DoSortIconsFunc, 0); else ListView_SortItems(hPreview, DoSortIconsFuncByOrder, 0); } break; // Refresh preview to new section case DM_UPDATEICONSPREVIEW: { LVITEM lvi = {0}; HICON hIcon; int indx, count; HIMAGELIST hIml = ListView_GetImageList(hPreview, LVSIL_NORMAL); lvi.mask = LVIF_IMAGE|LVIF_PARAM; count = ListView_GetItemCount(hPreview); for (indx = 0; indx < count; indx++) { lvi.iItem = indx; ListView_GetItem(hPreview, &lvi); { mir_cslock lck(csIconList); hIcon = iconList[lvi.lParam]->temp_icon; if (!hIcon) hIcon = IconItem_GetIcon_Preview(iconList[lvi.lParam]); } if (hIcon) ImageList_ReplaceIcon(hIml, lvi.iImage, hIcon); if (hIcon != iconList[lvi.lParam]->temp_icon) SafeDestroyIcon(&hIcon); } ListView_RedrawItems(hPreview, 0, count); } break; // Temporary change icon - only inside options dialog case DM_CHANGEICON: { LVITEM lvi = {0}; lvi.mask = LVIF_PARAM; lvi.iItem = wParam; ListView_GetItem(hPreview, &lvi); { mir_cslock lck(csIconList); IcolibItem *item = iconList[ lvi.lParam ]; SAFE_FREE((void**)&item->temp_file); SafeDestroyIcon(&item->temp_icon); TCHAR *path = (TCHAR*)lParam; item->temp_file = mir_tstrdup(path); item->temp_icon = (HICON)ExtractIconFromPath(path, item->cx, item->cy); item->temp_reset = FALSE; } DoOptionsChanged(hwndDlg); } break; case WM_COMMAND: if (LOWORD(wParam) == IDC_IMPORT) { dat->hwndIndex = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ICOLIB_IMPORT), GetParent(hwndDlg), DlgProcIconImport, (LPARAM)hwndDlg); EnableWindow((HWND)lParam, FALSE); } else if (LOWORD(wParam) == IDC_GETMORE) { OpenIconsPage(); break; } else if (LOWORD(wParam) == IDC_LOADICONS) { TCHAR filetmp[1] = {0}; TCHAR *file; if (file = OpenFileDlg(hwndDlg, filetmp, FALSE)) { HWND htv = GetDlgItem(hwndDlg, IDC_CATEGORYLIST); TCHAR filename[ MAX_PATH ]; PathToRelativeT(file, filename); SAFE_FREE((void**)&file); MySetCursor(IDC_WAIT); LoadSubIcons(htv, filename, TreeView_GetSelection(htv)); MySetCursor(IDC_ARROW); DoOptionsChanged(hwndDlg); } } break; case WM_CONTEXTMENU: if ((HWND)wParam == hPreview) { UINT count = ListView_GetSelectedCount(hPreview); if (count > 0) { int cmd = OpenPopupMenu(hwndDlg); switch(cmd) { case ID_CANCELCHANGE: case ID_RESET: { LVITEM lvi = {0}; int itemIndx = -1; while ((itemIndx = ListView_GetNextItem(hPreview, itemIndx, LVNI_SELECTED)) != -1) { lvi.mask = LVIF_PARAM; lvi.iItem = itemIndx; //lvhti.iItem; ListView_GetItem(hPreview, &lvi); UndoChanges(lvi.lParam, cmd); } DoOptionsChanged(hwndDlg); break; } } } } else { HWND htv = GetDlgItem(hwndDlg, IDC_CATEGORYLIST); if ((HWND)wParam == htv) { int cmd = OpenPopupMenu(hwndDlg); switch(cmd) { case ID_CANCELCHANGE: case ID_RESET: UndoSubItemChanges(htv, TreeView_GetSelection(htv), cmd); DoOptionsChanged(hwndDlg); break; } } } break; case WM_NOTIFY: switch(((LPNMHDR)lParam)->idFrom) { case 0: switch(((LPNMHDR)lParam)->code) { case PSN_APPLY: { mir_cslock lck(csIconList); for (int indx = 0; indx < iconList.getCount(); indx++) { IcolibItem *item = iconList[indx]; if (item->temp_reset) { db_unset(NULL, "SkinIcons", item->name); if (item->source_small != item->default_icon) { IconSourceItem_Release(&item->source_small); } } else if (item->temp_file) { db_set_ts(NULL, "SkinIcons", item->name, item->temp_file); IconSourceItem_Release(&item->source_small); SafeDestroyIcon(&item->temp_icon); } } } DoIconsChanged(hwndDlg); return TRUE; } break; case IDC_PREVIEW: if (((LPNMHDR)lParam)->code == LVN_GETINFOTIP) { IcolibItem *item; NMLVGETINFOTIP *pInfoTip = (NMLVGETINFOTIP *)lParam; LVITEM lvi; lvi.mask = LVIF_PARAM; lvi.iItem = pInfoTip->iItem; ListView_GetItem(pInfoTip->hdr.hwndFrom, &lvi); if (lvi.lParam < iconList.getCount()) { item = iconList[lvi.lParam]; if (item->temp_file) _tcsncpy(pInfoTip->pszText, item->temp_file, pInfoTip->cchTextMax); else if (item->default_file) mir_sntprintf(pInfoTip->pszText, pInfoTip->cchTextMax, _T("%s, %d"), item->default_file, item->default_indx); } } if (bNeedRebuild) { bNeedRebuild = FALSE; SendMessage(hwndDlg, DM_REBUILD_CTREE, 0, 0); } break; case IDC_CATEGORYLIST: switch(((NMHDR*)lParam)->code) { case TVN_SELCHANGEDA: // !!!! This needs to be here - both !! case TVN_SELCHANGEDW: { NMTREEVIEW *pnmtv = (NMTREEVIEW*)lParam; TVITEM tvi = pnmtv->itemNew; TreeItem *treeItem = (TreeItem *)tvi.lParam; if (treeItem) SendMessage(hwndDlg, DM_REBUILDICONSPREVIEW, 0, (LPARAM)( (SECTIONPARAM_FLAGS(treeItem->value)&SECTIONPARAM_HAVEPAGE)? sectionList[ SECTIONPARAM_INDEX(treeItem->value) ] : NULL)); break; } case TVN_DELETEITEMA: // no idea why both TVN_SELCHANGEDA/W should be there but let's keep this both too... case TVN_DELETEITEMW: { TreeItem *treeItem = (TreeItem *)(((LPNMTREEVIEW)lParam)->itemOld.lParam); if (treeItem) { mir_free(treeItem->paramName); mir_free(treeItem); } break; } } if (bNeedRebuild) { { mir_cslock lck(csIconList); bNeedRebuild = FALSE; } SendMessage(hwndDlg, DM_REBUILD_CTREE, 0, 0); } } break; case WM_DESTROY: SaveCollapseState( GetDlgItem(hwndDlg, IDC_CATEGORYLIST)); DestroyWindow(dat->hwndIndex); { mir_cslock lck(csIconList); for (int indx = 0; indx < iconList.getCount(); indx++) { IcolibItem *item = iconList[indx]; SAFE_FREE((void**)&item->temp_file); SafeDestroyIcon(&item->temp_icon); } } SAFE_FREE((void**)&dat); break; } return FALSE; }
BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch) { int i = 0; PNHMenuWindow data; int curIndex, topIndex, pageSize; boolean is_accelerator = FALSE; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); switch( ch ) { case MENU_FIRST_PAGE: i = 0; ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); ListView_EnsureVisible(hwndList, i, FALSE); return -2; case MENU_LAST_PAGE: i = max(0, data->menu.size-1); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); ListView_EnsureVisible(hwndList, i, FALSE); return -2; case MENU_NEXT_PAGE: topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); curIndex = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); /* Focus down one page */ i = min(curIndex+pageSize, data->menu.size-1); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); /* Scrollpos down one page */ i = min(topIndex+(2*pageSize - 1), data->menu.size-1); ListView_EnsureVisible(hwndList, i, FALSE); return -2; case MENU_PREVIOUS_PAGE: topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); curIndex = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); /* Focus up one page */ i = max(curIndex-pageSize, 0); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); /* Scrollpos up one page */ i = max(topIndex-pageSize, 0); ListView_EnsureVisible(hwndList, i, FALSE); break; case MENU_SELECT_ALL: if( data->how == PICK_ANY ) { reset_menu_count(hwndList, data); for(i=0; i<data->menu.size; i++ ) { SelectMenuItem(hwndList, data, i, -1); } return -2; } break; case MENU_UNSELECT_ALL: if( data->how == PICK_ANY ) { reset_menu_count(hwndList, data); for(i=0; i<data->menu.size; i++ ) { SelectMenuItem(hwndList, data, i, 0); } return -2; } break; case MENU_INVERT_ALL: if( data->how == PICK_ANY ) { reset_menu_count(hwndList, data); for(i=0; i<data->menu.size; i++ ) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); } return -2; } break; case MENU_SELECT_PAGE: if( data->how == PICK_ANY ) { int from, to; reset_menu_count(hwndList, data); topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); from = max(0, topIndex); to = min(data->menu.size, from+pageSize); for(i=from; i<to; i++ ) { SelectMenuItem(hwndList, data, i, -1); } return -2; } break; case MENU_UNSELECT_PAGE: if( data->how == PICK_ANY ) { int from, to; reset_menu_count(hwndList, data); topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); from = max(0, topIndex); to = min(data->menu.size, from+pageSize); for(i=from; i<to; i++ ) { SelectMenuItem(hwndList, data, i, 0); } return -2; } break; case MENU_INVERT_PAGE: if( data->how == PICK_ANY ) { int from, to; reset_menu_count(hwndList, data); topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); from = max(0, topIndex); to = min(data->menu.size, from+pageSize); for(i=from; i<to; i++ ) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); } return -2; } break; case MENU_SEARCH: if( data->how==PICK_ANY || data->how==PICK_ONE ) { char buf[BUFSZ]; int selected_item; reset_menu_count(hwndList, data); mswin_getlin("Search for:", buf); if (!*buf || *buf == '\033') return -2; selected_item = -1; for(i=0; i<data->menu.size; i++ ) { if( NHMENU_IS_SELECTABLE(data->menu.items[i]) && strstr(data->menu.items[i].str, buf) ) { if (data->how == PICK_ANY) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); /* save the first item - we will move focus to it */ if( selected_item == -1 ) selected_item = i; } else if( data->how == PICK_ONE ) { SelectMenuItem( hwndList, data, i, -1 ); selected_item = i; break; } } } if( selected_item>0 ) { ListView_SetItemState(hwndList, selected_item, LVIS_FOCUSED, LVIS_FOCUSED); ListView_EnsureVisible(hwndList, selected_item, FALSE); } } else { mswin_nhbell(); } return -2; case ' ': /* ends menu for PICK_ONE/PICK_NONE select item for PICK_ANY */ if( data->how==PICK_ONE || data->how==PICK_NONE ) { data->done = 1; data->result = 0; return -2; } else if( data->how==PICK_ANY ) { i = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); if( i>=0 ) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); } return -2; } break; default: if( strchr(data->menu.gacc, ch) && !(ch=='0' && data->menu.counting) ) { /* matched a group accelerator */ if (data->how == PICK_ANY || data->how == PICK_ONE) { reset_menu_count(hwndList, data); for(i=0; i<data->menu.size; i++ ) { if( NHMENU_IS_SELECTABLE(data->menu.items[i]) && data->menu.items[i].group_accel == ch ) { if( data->how == PICK_ANY ) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); } else if( data->how == PICK_ONE ) { SelectMenuItem( hwndList, data, i, -1 ); data->result = 0; data->done = 1; return -2; } } } return -2; } else { mswin_nhbell(); return -2; } } if (isdigit(ch)) { int count; i = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); if( i>=0 ) { count = data->menu.items[i].count; if( count==-1 ) count=0; count *= 10L; count += (int)(ch - '0'); if (count != 0) /* ignore leading zeros */ { data->menu.counting = TRUE; data->menu.items[i].count = min(100000, count); ListView_RedrawItems( hwndList, i, i ); /* update count mark */ } } return -2; } is_accelerator = FALSE; for(i=0; i<data->menu.size; i++) { if( data->menu.items[i].accelerator == ch ) { is_accelerator = TRUE; break; } } if( (ch>='a' && ch<='z') || (ch>='A' && ch<='Z') || is_accelerator) { if (data->how == PICK_ANY || data->how == PICK_ONE) { for(i=0; i<data->menu.size; i++ ) { if( data->menu.items[i].accelerator == ch ) { if( data->how == PICK_ANY ) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); ListView_EnsureVisible(hwndList, i, FALSE); return -2; } else if( data->how == PICK_ONE ) { SelectMenuItem( hwndList, data, i, -1 ); data->result = 0; data->done = 1; return -2; } } } } } break; } reset_menu_count(hwndList, data); return -1; }
//----------------------------------------------------------------------------- // Toggle the state of a contact input; for simulation purposes, so that we // can set the input state of the program. //----------------------------------------------------------------------------- void SimulationToggleContact(char *name) { SetSingleBit(name, !SingleBitOn(name)); ListView_RedrawItems(IoList, 0, Prog.io.count - 1); }
void VDUIListViewW32::OnNotifyCallback(const NMHDR *pHdr) { if (pHdr->code == LVN_ITEMCHANGED) { const NMLISTVIEW *plvn = (const NMLISTVIEW *)pHdr; if ((plvn->uOldState|plvn->uNewState) & LVIS_SELECTED) { int iSel = (int)SendMessage(mhwnd, LVM_GETNEXTITEM, -1, LVNI_ALL|LVNI_SELECTED); if (iSel != mSelected) { mSelected = iSel; mpBase->ProcessValueChange(this, mID); mpBase->DispatchEvent(this, mID, IVDUICallback::kEventSelect, mSelected); } } } else if (pHdr->code == LVN_GETDISPINFO) { NMLVDISPINFOA& lvdi = *(NMLVDISPINFOA *)pHdr; LVITEMA& lvi = lvdi.item; VDASSERTCT(sizeof(NMLVDISPINFOW) == sizeof(NMLVDISPINFOA)); if (mpListCB && (lvi.mask & LVIF_TEXT)) { if (mpListCB->GetListText(lvi.iItem, lvi.iSubItem, mListTextW[mListTextIndex])) { if (VDIsWindowsNT()) { NMLVDISPINFOW& lvdiw = *(NMLVDISPINFOW *)pHdr; LVITEMW& lviw = lvdiw.item; lviw.pszText = const_cast<WCHAR *>(mListTextW[mListTextIndex].c_str()); } else { mListTextA[mListTextIndex] = VDTextWToA(mListTextW[mListTextIndex]); lvi.pszText = const_cast<CHAR *>(mListTextA[mListTextIndex].c_str()); } if (++mListTextIndex >= 3) mListTextIndex = 0; } } } else if (mbCheckable) { if (pHdr->code == LVN_KEYDOWN && ((const NMLVKEYDOWN *)pHdr)->wVKey == VK_SPACE) { int idx = -1; bool first = true; bool select = false; while((idx = ListView_GetNextItem(mhwnd, idx, LVNI_SELECTED)) >= 0) { if (first) { UINT oldState = ListView_GetItemState(mhwnd, idx, -1); select = !(oldState & INDEXTOSTATEIMAGEMASK(1)); first = false; } ListView_SetItemState(mhwnd, idx, select ? INDEXTOSTATEIMAGEMASK(1) : 0, LVIS_STATEIMAGEMASK); ListView_RedrawItems(mhwnd, idx, idx); } } else if (pHdr->code == NM_CLICK || pHdr->code == NM_DBLCLK) { DWORD pos = GetMessagePos(); LVHITTESTINFO lvhi = {0}; lvhi.pt.x = (SHORT)LOWORD(pos); lvhi.pt.y = (SHORT)HIWORD(pos); ScreenToClient(mhwnd, &lvhi.pt); int idx = ListView_HitTest(mhwnd, &lvhi); if (idx >= 0) { UINT oldState = ListView_GetItemState(mhwnd, idx, -1); ListView_SetItemState(mhwnd, idx, oldState ^ INDEXTOSTATEIMAGEMASK(1), LVIS_STATEIMAGEMASK); ListView_RedrawItems(mhwnd, idx, idx); } } } }
bool VDUIJobControlDialog::OnCommand(uint32 id, uint32 extcode) { OnMenuHit(id); if (extcode == BN_CLICKED) { HWND hwndItem = GetDlgItem(mhdlg, IDC_JOBS); int index = ListView_GetNextItem(hwndItem, -1, LVNI_ALL | LVNI_SELECTED); VDJob *vdj = NULL; if (index >= 0) vdj = g_VDJobQueue.ListGet(index); switch(id) { case IDOK: Destroy(); return true; case IDC_DELETE: if (vdj) { // Do not delete jobs that are in progress! if (vdj->GetState() != VDJob::kStateInProgress) { fUpdateDisable = true; g_VDJobQueue.Delete(vdj, false); delete vdj; g_VDJobQueue.SetModified(); fUpdateDisable = false; if (g_VDJobQueue.ListSize() > 0) ListView_SetItemState(hwndItem, index==g_VDJobQueue.ListSize() ? index-1 : index, LVIS_SELECTED, LVIS_SELECTED); } } return TRUE; case IDC_POSTPONE: if (vdj) { // Do not postpone jobs in progress int state = vdj->GetState(); if (state != VDJob::kStateInProgress) { if (state == VDJob::kStatePostponed) vdj->SetState(VDJob::kStateWaiting); else vdj->SetState(VDJob::kStatePostponed); vdj->Refresh(); g_VDJobQueue.SetModified(); } } return TRUE; case IDC_MOVE_UP: if (!vdj || index <= 0) return TRUE; g_VDJobQueue.Swap(index-1, index); ListView_SetItemState(hwndItem, index , 0, LVIS_SELECTED | LVIS_FOCUSED); ListView_SetItemState(hwndItem, index-1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); ListView_RedrawItems(hwndItem, index-1, index); g_VDJobQueue.SetModified(); return TRUE; case IDC_MOVE_DOWN: if (!vdj || index >= g_VDJobQueue.ListSize()-1) return TRUE; g_VDJobQueue.Swap(index+1, index); ListView_SetItemState(hwndItem, index , 0, LVIS_SELECTED | LVIS_FOCUSED); ListView_SetItemState(hwndItem, index+1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); ListView_RedrawItems(hwndItem, index, index+1); g_VDJobQueue.SetModified(); return TRUE; case IDC_START: if (g_VDJobQueue.IsRunInProgress()) { g_VDJobQueue.RunAllStop(); EnableControl(IDC_START, FALSE); } else g_VDJobQueue.RunAllStart(); return TRUE; case IDC_ABORT: if (g_VDJobQueue.IsRunInProgress()) { g_VDJobQueue.RunAllStop(); EnableControl(IDC_START, false); EnableControl(IDC_ABORT, false); if (g_dubber) g_dubber->Abort(); } return TRUE; case IDC_RELOAD: if (!vdj) return TRUE; if (!vdj->IsReloadMarkerPresent()) MessageBox(mhdlg, "This job was created with an older version of VirtualDub and cannot be reloaded.", g_szError, MB_ICONERROR|MB_OK); else vdj->Reload(); return TRUE; case IDC_AUTOSTART: g_VDJobQueue.SetAutoRunEnabled(IsButtonChecked(IDC_AUTOSTART)); return TRUE; } } return false; }
void RefreshItem(int n) { if (n > -1) ListView_RedrawItems(songlist.hWnd, n, n); }
INT_PTR CALLBACK ColorSchemeEdit(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) { static int curSel; static wchar_t row[255]; NMLVDISPINFO *info; UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: { SetDlgItemText(hDlg,IDC_SCHEMENAME,curCS.name); HWND ctl=GetDlgItem(hDlg,IDC_CURCOLOR); EnableWindow(ctl,FALSE); ctl=GetDlgItem(hDlg,IDC_CURALPHA); EnableWindow(ctl,FALSE); HWND lv=GetDlgItem(hDlg,IDC_COLORLIST); ListView_SetExtendedListViewStyle(lv,LVS_EX_FULLROWSELECT); LVCOLUMN lvc; lvc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM; for (int i=0;i<4;i++) { lvc.iSubItem=i; switch (i) { case 0: lvc.pszText=L"Id"; lvc.cx=40; break; case 1: lvc.pszText=L"Name"; lvc.cx=200; break; case 2: lvc.pszText=L"Color"; lvc.cx=80; break; case 3: lvc.pszText=L"Alpha"; lvc.cx=50; break; } lvc.fmt=LVCFMT_LEFT; ListView_InsertColumn(lv,i,&lvc); } LVITEM item; item.mask=LVIF_TEXT|LVIF_STATE; item.iSubItem=0; item.state=0; item.stateMask=0; item.pszText=LPSTR_TEXTCALLBACK; for (int i=0;i<NUM_BLOCKS;i++) { item.iItem=i; ListView_InsertItem(lv,&item); } } return (INT_PTR)TRUE; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case LVN_ITEMCHANGED: { LPNMLISTVIEW item=(LPNMLISTVIEW)lParam; if (item->uNewState&LVIS_SELECTED) { curSel=item->iItem; swprintf(row,255,L"#%06x",curCS.colors[item->iItem]>>8); SetDlgItemText(hDlg,IDC_CURCOLOR,row); swprintf(row,255,L"%d",curCS.colors[item->iItem]&0xff); SetDlgItemText(hDlg,IDC_CURALPHA,row); HWND ctl=GetDlgItem(hDlg,IDC_CURCOLOR); EnableWindow(ctl,TRUE); ctl=GetDlgItem(hDlg,IDC_CURALPHA); EnableWindow(ctl,TRUE); } } break; case LVN_GETDISPINFO: info=(NMLVDISPINFO*)lParam; switch (info->item.iSubItem) { case 0: swprintf(row,255,L"%d.",info->item.iItem); break; case 1: swprintf(row,255,L"%S",gBlockDefinitions[info->item.iItem].name); // char to wchar break; case 2: swprintf(row,255,L"#%06x",curCS.colors[info->item.iItem]>>8); break; case 3: swprintf(row,255,L"%d",curCS.colors[info->item.iItem]&0xff); break; } info->item.pszText=row; break; } break; case WM_COMMAND: switch (HIWORD(wParam)) { case EN_CHANGE: switch (LOWORD(wParam)) { case IDC_SCHEMENAME: GetDlgItemText(hDlg,IDC_SCHEMENAME,curCS.name,255); break; case IDC_CURCOLOR: { HWND lv=GetDlgItem(hDlg,IDC_COLORLIST); GetDlgItemText(hDlg,IDC_CURCOLOR,row,255); unsigned int color=0; for (int i=0;row[i];i++) { if (row[i]>='0' && row[i]<='9') { color<<=4; color|=row[i]-'0'; } if (row[i]>='a' && row[i]<='f') { color<<=4; color|=row[i]+10-'a'; } if (row[i]>='A' && row[i]<='F') { color<<=4; color|=row[i]+10-'A'; } } curCS.colors[curSel]&=0xff; curCS.colors[curSel]|=color<<8; ListView_RedrawItems(lv,curSel,curSel); } break; case IDC_CURALPHA: { HWND lv=GetDlgItem(hDlg,IDC_COLORLIST); curCS.colors[curSel]&=~0xff; curCS.colors[curSel]|=GetDlgItemInt(hDlg,IDC_CURALPHA,NULL,FALSE)&0xff; ListView_RedrawItems(lv,curSel,curSel); } } break; } switch (LOWORD(wParam)) { case IDC_HIDE_ALL_BLOCKS: { // set all blocks' alphas to zero. Useful for printing out just one material for (int i=0;i<NUM_BLOCKS;i++) { curCS.colors[i] &= ~0xff; } HWND lv=GetDlgItem(hDlg,IDC_COLORLIST); ListView_RedrawItems(lv,0,NUM_BLOCKS-1); } break; case IDC_HIDE_TREE_BLOCKS: { // set tree-related blocks zero. Useful for removing trees from large terrain prints (trees are hard to print well). curCS.colors[BLOCK_LOG] &= ~0xff; curCS.colors[BLOCK_AD_LOG] &= ~0xff; curCS.colors[BLOCK_LEAVES] &= ~0xff; curCS.colors[BLOCK_AD_LEAVES] &= ~0xff; HWND lv=GetDlgItem(hDlg,IDC_COLORLIST); ListView_RedrawItems(lv,0,NUM_BLOCKS-1); } break; case IDCANCEL: case IDOK: { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } } break; }
void AddOrUpdateHwnd(HWND hWnd, WCHAR *szTitle, HICON hIcon, BOOL bHung) { LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL; HIMAGELIST hImageListLarge; HIMAGELIST hImageListSmall; LV_ITEM item; int i; BOOL bAlreadyInList = FALSE; memset(&item, 0, sizeof(LV_ITEM)); /* Get the image lists */ hImageListLarge = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_NORMAL); hImageListSmall = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_SMALL); /* Check to see if it's already in our list */ for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) { memset(&item, 0, sizeof(LV_ITEM)); item.mask = LVIF_IMAGE|LVIF_PARAM; item.iItem = i; (void)ListView_GetItem(hApplicationPageListCtrl, &item); pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam; if (pAPLI->hWnd == hWnd) { bAlreadyInList = TRUE; break; } } /* If it is already in the list then update it if necessary */ if (bAlreadyInList) { /* Check to see if anything needs updating */ if ((pAPLI->hIcon != hIcon) || (_wcsicmp(pAPLI->szTitle, szTitle) != 0) || (pAPLI->bHung != bHung)) { /* Update the structure */ pAPLI->hIcon = hIcon; pAPLI->bHung = bHung; wcscpy(pAPLI->szTitle, szTitle); /* Update the image list */ ImageList_ReplaceIcon(hImageListLarge, item.iItem, hIcon); ImageList_ReplaceIcon(hImageListSmall, item.iItem, hIcon); /* Update the list view */ (void)ListView_RedrawItems(hApplicationPageListCtrl, 0, ListView_GetItemCount(hApplicationPageListCtrl)); /* UpdateWindow(hApplicationPageListCtrl); */ InvalidateRect(hApplicationPageListCtrl, NULL, 0); } } /* It is not already in the list so add it */ else { pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_PAGE_LIST_ITEM)); pAPLI->hWnd = hWnd; pAPLI->hIcon = hIcon; pAPLI->bHung = bHung; wcscpy(pAPLI->szTitle, szTitle); /* Add the item to the list */ memset(&item, 0, sizeof(LV_ITEM)); item.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM; ImageList_AddIcon(hImageListLarge, hIcon); item.iImage = ImageList_AddIcon(hImageListSmall, hIcon); item.pszText = LPSTR_TEXTCALLBACK; item.iItem = ListView_GetItemCount(hApplicationPageListCtrl); item.lParam = (LPARAM)pAPLI; (void)ListView_InsertItem(hApplicationPageListCtrl, &item); } /* Select first item if any */ if ((ListView_GetNextItem(hApplicationPageListCtrl, -1, LVNI_FOCUSED | LVNI_SELECTED) == -1) && (ListView_GetItemCount(hApplicationPageListCtrl) > 0) && !bApplicationPageSelectionMade) { ListView_SetItemState(hApplicationPageListCtrl, 0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); bApplicationPageSelectionMade = TRUE; } /* else { bApplicationPageSelectionMade = FALSE; } */ }
void VDUIListViewW32::SetItemChecked(int item, bool checked) { ListView_SetItemState(mhwnd, item, checked ? INDEXTOSTATEIMAGEMASK(1) : 0, LVIS_STATEIMAGEMASK); ListView_RedrawItems(mhwnd, item, item); }
//----------------------------------------------------------------------------- // A little toolbar-style window that pops up to allow the user to set the // simulated value of an ADC pin. //----------------------------------------------------------------------------- void ShowAnalogSliderPopup(char *name) { WNDCLASSEX wc; memset(&wc, 0, sizeof(wc)); wc.cbSize = sizeof(wc); wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_OWNDC | CS_DBLCLKS; wc.lpfnWndProc = (WNDPROC)AnalogSliderDialogProc; wc.hInstance = Instance; wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW; wc.lpszClassName = "LDmicroAnalogSlider"; wc.lpszMenuName = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); RegisterClassEx(&wc); POINT pt; GetCursorPos(&pt); SWORD currentVal = GetAdcShadow(name); SWORD maxVal; if(Prog.mcu) { maxVal = Prog.mcu->adcMax; } else { maxVal = 1023; } if(maxVal == 0) { Error(_("No ADC or ADC not supported for selected micro.")); return; } int left = pt.x - 10; // try to put the slider directly under the cursor (though later we might // realize that that would put the popup off the screen) int top = pt.y - (15 + (73*currentVal)/maxVal); RECT r; SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0); if(top + 110 >= r.bottom) { top = r.bottom - 110; } if(top < 0) top = 0; AnalogSliderMain = CreateWindowClient(0, "LDmicroAnalogSlider", "I/O Pin", WS_VISIBLE | WS_POPUP | WS_DLGFRAME, left, top, 30, 100, NULL, NULL, Instance, NULL); AnalogSliderTrackbar = CreateWindowEx(0, TRACKBAR_CLASS, "", WS_CHILD | TBS_AUTOTICKS | TBS_VERT | TBS_TOOLTIPS | WS_CLIPSIBLINGS | WS_VISIBLE, 0, 0, 30, 100, AnalogSliderMain, NULL, Instance, NULL); SendMessage(AnalogSliderTrackbar, TBM_SETRANGE, FALSE, MAKELONG(0, maxVal)); SendMessage(AnalogSliderTrackbar, TBM_SETTICFREQ, (maxVal + 1)/8, 0); SendMessage(AnalogSliderTrackbar, TBM_SETPOS, TRUE, currentVal); EnableWindow(MainWindow, FALSE); ShowWindow(AnalogSliderMain, TRUE); SetFocus(AnalogSliderTrackbar); DWORD ret; MSG msg; AnalogSliderDone = FALSE; AnalogSliderCancel = FALSE; SWORD orig = GetAdcShadow(name); while(!AnalogSliderDone && (ret = GetMessage(&msg, NULL, 0, 0))) { SWORD v = (SWORD)SendMessage(AnalogSliderTrackbar, TBM_GETPOS, 0, 0); if(msg.message == WM_KEYDOWN) { if(msg.wParam == VK_RETURN) { AnalogSliderDone = TRUE; break; } else if(msg.wParam == VK_ESCAPE) { AnalogSliderDone = TRUE; AnalogSliderCancel = TRUE; break; } } else if(msg.message == WM_LBUTTONUP) { if(v != orig) { AnalogSliderDone = TRUE; } } SetAdcShadow(name, v); TranslateMessage(&msg); DispatchMessage(&msg); } if(!AnalogSliderCancel) { SWORD v = (SWORD)SendMessage(AnalogSliderTrackbar, TBM_GETPOS, 0, 0); SetAdcShadow(name, v); } EnableWindow(MainWindow, TRUE); DestroyWindow(AnalogSliderMain); ListView_RedrawItems(IoList, 0, Prog.io.count - 1); }
LRESULT CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PNHMenuWindow data; CheckInputDialog(hWnd, message, wParam, lParam); data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); switch (message) { case WM_INITDIALOG: { HWND text_control; HDC hDC; text_control = GetDlgItem(hWnd, IDC_MENU_TEXT); data = (PNHMenuWindow)malloc(sizeof(NHMenuWindow)); ZeroMemory(data, sizeof(NHMenuWindow)); data->type = MENU_TYPE_TEXT; data->how = PICK_NONE; data->result = 0; data->done = 0; data->bmpChecked = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL)); data->bmpCheckedCount = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL_COUNT)); data->bmpNotChecked = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_UNSEL)); SetWindowLong(hWnd, GWL_USERDATA, (LONG)data); /* subclass edit control */ editControlWndProc = (WNDPROC)GetWindowLong(text_control, GWL_WNDPROC); SetWindowLong(text_control, GWL_WNDPROC, (LONG)NHMenuTextWndProc); /* set text window font */ hDC = GetDC(text_control); SendMessage( text_control, WM_SETFONT, (WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hDC, FALSE), (LPARAM)0 ); ReleaseDC(text_control, hDC); #if defined(WIN_CE_SMARTPHONE) /* special initialization for SmartPhone dialogs */ NHSPhoneDialogSetup(hWnd, FALSE, GetNHApp()->bFullScreen); #endif } break; case WM_MSNH_COMMAND: onMSNHCommand(hWnd, wParam, lParam); break; case WM_SIZE: LayoutMenu(hWnd); return FALSE; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDCANCEL: if( data->type == MENU_TYPE_MENU && (data->how==PICK_ONE || data->how==PICK_ANY) && data->menu.counting) { HWND list; int i; /* reset counter if counting is in progress */ list = GetMenuControl(hWnd); i = ListView_GetNextItem(list, -1, LVNI_FOCUSED); if( i>=0 ) { SelectMenuItem(list, data, i, 0); } return FALSE; } else { data->result = -1; data->done = 1; } return FALSE; case IDOK: data->done = 1; data->result = 0; return FALSE; } } break; case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR)lParam; switch (LOWORD(wParam)) { case IDC_MENU_LIST: { if( !data || data->type!=MENU_TYPE_MENU ) break; switch(lpnmhdr->code) { case LVN_ITEMACTIVATE: { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lParam; if(data->how==PICK_ONE) { if( lpnmlv->iItem>=0 && lpnmlv->iItem<data->menu.size && NHMENU_IS_SELECTABLE(data->menu.items[lpnmlv->iItem]) ) { SelectMenuItem( lpnmlv->hdr.hwndFrom, data, lpnmlv->iItem, -1 ); data->done = 1; data->result = 0; return TRUE; } } else if( data->how==PICK_ANY ) { if( lpnmlv->iItem>=0 && lpnmlv->iItem<data->menu.size && NHMENU_IS_SELECTABLE(data->menu.items[lpnmlv->iItem]) ) { SelectMenuItem( lpnmlv->hdr.hwndFrom, data, lpnmlv->iItem, NHMENU_IS_SELECTED(data->menu.items[lpnmlv->iItem])? 0 : -1 ); } } } break; case NM_CLICK: { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) lParam; if( lpnmlv->iItem==-1 ) return 0; if( data->how==PICK_ANY ) { SelectMenuItem( lpnmlv->hdr.hwndFrom, data, lpnmlv->iItem, NHMENU_IS_SELECTED(data->menu.items[lpnmlv->iItem])? 0 : -1 ); } } break; case LVN_ITEMCHANGED: { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lParam; if( lpnmlv->iItem==-1 ) return 0; if( !(lpnmlv->uChanged & LVIF_STATE) ) return 0; /* update item that has the focus */ data->menu.items[lpnmlv->iItem].has_focus = !!(lpnmlv->uNewState & LVIS_FOCUSED); ListView_RedrawItems(lpnmlv->hdr.hwndFrom, lpnmlv->iItem, lpnmlv->iItem); /* update count for single-selection menu (follow the listview selection) */ if( data->how==PICK_ONE ) { if( lpnmlv->uNewState & LVIS_SELECTED ) { SelectMenuItem( lpnmlv->hdr.hwndFrom, data, lpnmlv->iItem, -1 ); } } /* check item focus */ data->menu.items[lpnmlv->iItem].has_focus = !!(lpnmlv->uNewState & LVIS_FOCUSED); ListView_RedrawItems(lpnmlv->hdr.hwndFrom, lpnmlv->iItem, lpnmlv->iItem); } break; case NM_KILLFOCUS: reset_menu_count(lpnmhdr->hwndFrom, data); break; } } break; } } break; case WM_SETFOCUS: if( hWnd!=GetNHApp()->hPopupWnd ) { SetFocus(GetNHApp()->hPopupWnd ); return 0; } break; case WM_MEASUREITEM: if( wParam==IDC_MENU_LIST ) return onMeasureItem(hWnd, wParam, lParam); else return FALSE; case WM_DRAWITEM: if( wParam==IDC_MENU_LIST ) return onDrawItem(hWnd, wParam, lParam); else return FALSE; case WM_CTLCOLORBTN: case WM_CTLCOLOREDIT: case WM_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */ HDC hdcEdit = (HDC) wParam; HWND hwndEdit = (HWND) lParam; if( hwndEdit == GetDlgItem(hWnd, IDC_MENU_TEXT) ) { SetBkColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_BG)); SetTextColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_FG)); return (BOOL)mswin_get_brush(NHW_TEXT, MSWIN_COLOR_BG); } } return FALSE; case WM_DESTROY: if( data ) { DeleteObject(data->bmpChecked); DeleteObject(data->bmpCheckedCount); DeleteObject(data->bmpNotChecked); if( data->type == MENU_TYPE_TEXT ) { if( data->text.text ) { mswin_free_text_buffer(data->text.text); data->text.text = NULL; } } free(data); SetWindowLong(hWnd, GWL_USERDATA, (LONG)0); } return TRUE; } return FALSE; }
void ChangeInfoData::BeginListEdit(int iItem, RECT *rc, int iSetting, WORD wVKey) { if (dataListEdit) dataListEdit->EndListEdit(0); POINT pt = { 0, 0 }; ClientToScreen(hwndList, &pt); OffsetRect(rc, pt.x, pt.y); InflateRect(rc, -2, -2); rc->left -= 2; iEditItem = iItem; ListView_RedrawItems(hwndList, iEditItem, iEditItem); UpdateWindow(hwndList); dataListEdit = this; hwndListEdit = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, _T("LISTBOX"), _T(""), WS_POPUP | WS_BORDER | WS_VSCROLL, rc->left, rc->bottom, rc->right - rc->left, 150, NULL, NULL, hInst, NULL); SendMessage(hwndListEdit, WM_SETFONT, (WPARAM)hListFont, 0); int itemHeight = SendMessage(hwndListEdit, LB_GETITEMHEIGHT, 0, 0); const SettingItem &si = setting[iSetting]; SettingItemData &sid = settingData[iSetting]; FieldNamesItem *list = (FieldNamesItem*)si.pList; // some country codes were changed leaving old details uknown, convert it for the user if (list == countryField) { if (sid.value == 420) sid.value = 42; // conversion of obsolete codes (OMG!) else if (sid.value == 421) sid.value = 4201; else if (sid.value == 102) sid.value = 1201; } if (list == timezonesField) { tmi.prepareList(NULL, ppro->m_szModuleName, hwndListEdit, TZF_PLF_LB); } else { int j, n = ListBoxAddStringUtf(hwndListEdit, "Unspecified"); for (j = 0;; j++) if (!list[j].text) { SendMessage(hwndListEdit, LB_SETITEMDATA, n, j); if ((sid.value == 0 && list[j].code == 0) || (si.dbType != DBVT_ASCIIZ && sid.value == list[j].code)) SendMessage(hwndListEdit, LB_SETCURSEL, n, 0); break; } for (j = 0; list[j].text; j++) { char str[MAX_PATH]; n = ListBoxAddStringUtf(hwndListEdit, list[j].text); SendMessage(hwndListEdit, LB_SETITEMDATA, n, j); if ((si.dbType == DBVT_ASCIIZ && (!strcmpnull((char*)sid.value, list[j].text)) || (si.dbType == DBVT_ASCIIZ && (!strcmpnull((char*)sid.value, ICQTranslateUtfStatic(list[j].text, str, MAX_PATH)))) || ((char*)sid.value == NULL && list[j].code == 0)) || (si.dbType != DBVT_ASCIIZ && sid.value == list[j].code)) SendMessage(hwndListEdit, LB_SETCURSEL, n, 0); } SendMessage(hwndListEdit, LB_SETTOPINDEX, SendMessage(hwndListEdit, LB_GETCURSEL, 0, 0) - 3, 0); } int listCount = SendMessage(hwndListEdit, LB_GETCOUNT, 0, 0); if (itemHeight * listCount < 150) SetWindowPos(hwndListEdit, 0, 0, 0, rc->right - rc->left, itemHeight * listCount + GetSystemMetrics(SM_CYBORDER) * 2, SWP_NOZORDER | SWP_NOMOVE); mir_subclassWindow(hwndListEdit, ListEditSubclassProc); AnimateWindow(hwndListEdit, 200, AW_SLIDE | AW_ACTIVATE | AW_VER_POSITIVE); ShowWindow(hwndListEdit, SW_SHOW); SetFocus(hwndListEdit); if (wVKey) PostMessage(hwndListEdit, WM_KEYDOWN, wVKey, 0); }
static LRESULT WINAPI swellFileSelectProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { const int maxPathLen = 2048; const char *multiple_files = "(multiple files)"; switch (uMsg) { case WM_CREATE: if (lParam) // swell-specific { SetWindowLong(hwnd,GWL_WNDPROC,(LPARAM)SwellDialogDefaultWindowProc); SetWindowLong(hwnd,DWL_DLGPROC,(LPARAM)swellFileSelectProc); SetWindowLongPtr(hwnd,GWLP_USERDATA,lParam); BrowseFile_State *parms = (BrowseFile_State *)lParam; if (parms->caption) SetWindowText(hwnd,parms->caption); SWELL_MakeSetCurParms(1,1,0,0,hwnd,false,false); SWELL_MakeButton(0, parms->mode == BrowseFile_State::OPENDIR ? "Choose directory" : parms->mode == BrowseFile_State::SAVE ? "Save" : "Open", IDOK,0,0,0,0, 0); SWELL_MakeButton(0, "Cancel", IDCANCEL,0,0,0,0, 0); HWND edit = SWELL_MakeEditField(0x100, 0,0,0,0, 0); HWND dir = SWELL_MakeCombo(0x103, 0,0,0,0, CBS_DROPDOWNLIST); HWND list = SWELL_MakeControl("",0x104,"SysListView32",LVS_REPORT|LVS_SHOWSELALWAYS| (parms->mode == BrowseFile_State::OPENMULTI ? 0 : LVS_SINGLESEL)| LVS_OWNERDATA|WS_BORDER|WS_TABSTOP,0,0,0,0,0); if (list) { LVCOLUMN c={LVCF_TEXT|LVCF_WIDTH, 0, 280, (char*)"Filename" }; ListView_InsertColumn(list,0,&c); c.cx = 120; c.pszText = (char*) "Size"; ListView_InsertColumn(list,1,&c); c.cx = 140; c.pszText = (char*) "Date"; ListView_InsertColumn(list,2,&c); } HWND extlist = (parms->extlist && *parms->extlist) ? SWELL_MakeCombo(0x105, 0,0,0,0, CBS_DROPDOWNLIST) : NULL; if (extlist) { const char *p = parms->extlist; while (*p) { const char *rd=p; p += strlen(p)+1; if (!*p) break; int a = SendMessage(extlist,CB_ADDSTRING,0,(LPARAM)rd); SendMessage(extlist,CB_SETITEMDATA,a,(LPARAM)p); p += strlen(p)+1; } SendMessage(extlist,CB_SETCURSEL,0,0); } SWELL_MakeLabel(-1,parms->mode == BrowseFile_State::OPENDIR ? "Directory: " : "File:",0x101, 0,0,0,0, 0); if (BFSF_Templ_dlgid && BFSF_Templ_dlgproc) { HWND dlg = SWELL_CreateDialog(BFSF_Templ_reshead, BFSF_Templ_dlgid, hwnd, BFSF_Templ_dlgproc, 0); if (dlg) SetWindowLong(dlg,GWL_ID,0x102); BFSF_Templ_dlgproc=0; BFSF_Templ_dlgid=0; } SWELL_MakeSetCurParms(1,1,0,0,NULL,false,false); if (edit && dir) { char buf[maxPathLen]; const char *filepart = ""; if (parms->initialfile && *parms->initialfile && *parms->initialfile != '.') { lstrcpyn_safe(buf,parms->initialfile,sizeof(buf)); char *p = (char *)WDL_get_filepart(buf); if (p > buf) { p[-1]=0; filepart = p; } } else if (parms->initialdir && *parms->initialdir) { lstrcpyn_safe(buf,parms->initialdir,sizeof(buf)); } else getcwd(buf,sizeof(buf)); SetWindowText(edit,filepart); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); } SetWindowPos(hwnd,NULL,0,0,600, 400, SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE); SendMessage(hwnd,WM_USER+100,1,0); // refresh list } break; case WM_USER+100: switch (wParam) { case 0x103: // update directory combo box -- destroys buffer pointed to by lParam if (lParam) { char *path = (char*)lParam; HWND combo=GetDlgItem(hwnd,0x103); SendMessage(combo,CB_RESETCONTENT,0,0); WDL_remove_trailing_dirchars(path); while (path[0]) { SendMessage(combo,CB_ADDSTRING,0,(LPARAM)path); WDL_remove_filepart(path); WDL_remove_trailing_dirchars(path); } SendMessage(combo,CB_ADDSTRING,0,(LPARAM)"/"); SendMessage(combo,CB_SETCURSEL,0,0); } break; case 1: { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); if (parms) { char buf[maxPathLen]; const char *filt = NULL; buf[0]=0; int a = (int) SendDlgItemMessage(hwnd,0x105,CB_GETCURSEL,0,0); if (a>=0) filt = (const char *)SendDlgItemMessage(hwnd,0x105,CB_GETITEMDATA,a,0); a = (int) SendDlgItemMessage(hwnd,0x103,CB_GETCURSEL,0,0); if (a>=0) SendDlgItemMessage(hwnd,0x103,CB_GETLBTEXT,a,(LPARAM)buf); if (buf[0]) parms->scan_path(buf, filt, parms->mode == BrowseFile_State::OPENDIR); else parms->viewlist.DeleteAll(); HWND list = GetDlgItem(hwnd,0x104); ListView_SetItemCount(list, 0); // clear selection ListView_SetItemCount(list, parms->viewlist.GetSize()); ListView_RedrawItems(list,0, parms->viewlist.GetSize()); } } break; } break; case WM_GETMINMAXINFO: { LPMINMAXINFO p=(LPMINMAXINFO)lParam; p->ptMinTrackSize.x = 300; p->ptMinTrackSize.y = 300; } break; case WM_SIZE: { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); // reposition controls RECT r; GetClientRect(hwnd,&r); const int buth = 24, cancelbutw = 50, okbutw = parms->mode == BrowseFile_State::OPENDIR ? 120 : 50; const int xborder = 4, yborder=8; const int fnh = 20, fnlblw = parms->mode == BrowseFile_State::OPENDIR ? 70 : 50; int ypos = r.bottom - 4 - buth; int xpos = r.right; SetWindowPos(GetDlgItem(hwnd,IDCANCEL), NULL, xpos -= cancelbutw + xborder, ypos, cancelbutw,buth, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,IDOK), NULL, xpos -= okbutw + xborder, ypos, okbutw,buth, SWP_NOZORDER|SWP_NOACTIVATE); HWND emb = GetDlgItem(hwnd,0x102); if (emb) { RECT sr; GetClientRect(emb,&sr); if (ypos > r.bottom-4-sr.bottom) ypos = r.bottom-4-sr.bottom; SetWindowPos(emb,NULL, xborder,ypos, xpos - xborder*2, sr.bottom, SWP_NOZORDER|SWP_NOACTIVATE); ShowWindow(emb,SW_SHOWNA); } HWND filt = GetDlgItem(hwnd,0x105); if (filt) { SetWindowPos(filt, NULL, xborder*2 + fnlblw, ypos -= fnh + yborder, r.right-fnlblw-xborder*3, fnh, SWP_NOZORDER|SWP_NOACTIVATE); } SetWindowPos(GetDlgItem(hwnd,0x100), NULL, xborder*2 + fnlblw, ypos -= fnh + yborder, r.right-fnlblw-xborder*3, fnh, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,0x101), NULL, xborder, ypos, fnlblw, fnh, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,0x103), NULL, xborder, 0, r.right-xborder*2, fnh, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,0x104), NULL, xborder, fnh+yborder, r.right-xborder*2, ypos - (fnh+yborder) - yborder, SWP_NOZORDER|SWP_NOACTIVATE); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case 0x105: if (HIWORD(wParam) == CBN_SELCHANGE) { SendMessage(hwnd,WM_USER+100,1,0); // refresh list } return 0; case 0x103: if (HIWORD(wParam) == CBN_SELCHANGE) { SendMessage(hwnd,WM_USER+100,1,0); // refresh list } return 0; case IDCANCEL: EndDialog(hwnd,0); return 0; case IDOK: { char buf[maxPathLen], msg[2048]; buf[0]=0; int a = (int) SendDlgItemMessage(hwnd,0x103,CB_GETCURSEL,0,0); if (a>=0) { SendDlgItemMessage(hwnd,0x103,CB_GETLBTEXT,a,(LPARAM)buf); size_t buflen = strlen(buf); if (!buflen) strcpy(buf,"/"); else { if (buflen > sizeof(buf)-2) buflen = sizeof(buf)-2; if (buf[buflen-1]!='/') { buf[buflen++] = '/'; buf[buflen]=0; } } } GetDlgItemText(hwnd,0x100,msg,sizeof(msg)); BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); int cnt; if (parms->mode == BrowseFile_State::OPENMULTI && (cnt=ListView_GetSelectedCount(GetDlgItem(hwnd,0x104)))>1 && (!*msg || !strcmp(msg,multiple_files))) { HWND list = GetDlgItem(hwnd,0x104); WDL_TypedBuf<char> fs; fs.Set(buf,strlen(buf)+1); int a = ListView_GetNextItem(list,-1,LVNI_SELECTED); while (a != -1 && fs.GetSize() < 4096*4096 && cnt--) { const char *fn = NULL; struct BrowseFile_State::rec *rec = parms->viewlist.EnumeratePtr(a,&fn); if (!rec) break; if (*fn) fn++; // skip type ident fs.Add(fn,strlen(fn)+1); a = ListView_GetNextItem(list,a,LVNI_SELECTED); } fs.Add("",1); parms->fnout = (char*)malloc(fs.GetSize()); if (parms->fnout) memcpy(parms->fnout,fs.Get(),fs.GetSize()); EndDialog(hwnd,1); return 0; } else { if (msg[0] == '.' && (msg[1] == '.' || msg[1] == 0)) { if (msg[1] == '.') SendDlgItemMessage(hwnd,0x103,CB_SETCURSEL,a+1,0); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } else if (msg[0] == '/') lstrcpyn_safe(buf,msg,sizeof(buf)); else lstrcatn(buf,msg,sizeof(buf)); } switch (parms->mode) { case BrowseFile_State::OPENDIR: if (!buf[0]) return 0; else if (msg[0]) { // navigate to directory if filepart set DIR *dir = opendir(buf); if (!dir) { snprintf(msg,sizeof(msg),"Error opening directory:\r\n\r\n%s\r\n\r\nCreate?",buf); if (MessageBox(hwnd,msg,"Create directory?",MB_OKCANCEL)==IDCANCEL) return 0; CreateDirectory(buf,NULL); dir=opendir(buf); } if (!dir) { MessageBox(hwnd,"Error creating directory","Error",MB_OK); return 0; } closedir(dir); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } else { DIR *dir = opendir(buf); if (!dir) return 0; closedir(dir); } break; case BrowseFile_State::SAVE: if (!buf[0]) return 0; else { struct stat st={0,}; DIR *dir = opendir(buf); if (dir) { closedir(dir); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } if (!stat(buf,&st)) { snprintf(msg,sizeof(msg),"File exists:\r\n\r\n%s\r\n\r\nOverwrite?",buf); if (MessageBox(hwnd,msg,"Overwrite file?",MB_OKCANCEL)==IDCANCEL) return 0; } } break; default: if (!buf[0]) return 0; else { struct stat st={0,}; DIR *dir = opendir(buf); if (dir) { closedir(dir); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } if (stat(buf,&st)) { snprintf(msg,sizeof(msg),"File does not exist:\r\n\r\n%s",buf); MessageBox(hwnd,msg,"File not found",MB_OK); return 0; } } break; } if (parms->fnout) { lstrcpyn_safe(parms->fnout,buf,parms->fnout_sz); } else { size_t l = strlen(buf); parms->fnout = (char*)calloc(l+2,1); memcpy(parms->fnout,buf,l); } } EndDialog(hwnd,1); return 0; } break; case WM_NOTIFY: { LPNMHDR l=(LPNMHDR)lParam; if (l->code == LVN_GETDISPINFO) { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); NMLVDISPINFO *lpdi = (NMLVDISPINFO*) lParam; const int idx=lpdi->item.iItem; if (l->idFrom == 0x104 && parms && idx >=0 && idx < parms->viewlist.GetSize()) { const char *fn = NULL; struct BrowseFile_State::rec *rec = parms->viewlist.EnumeratePtr(idx,&fn); if (rec && fn) { if (lpdi->item.mask&LVIF_TEXT) { switch (lpdi->item.iSubItem) { case 0: if (fn[0]) lstrcpyn_safe(lpdi->item.pszText,fn+1,lpdi->item.cchTextMax); break; case 1: if (fn[0] == 1) { lstrcpyn_safe(lpdi->item.pszText,"<DIR>",lpdi->item.cchTextMax); } else { static const char *tab[]={ "bytes","KB","MB","GB" }; int lf=0; WDL_INT64 s=rec->size; if (s<1024) { snprintf(lpdi->item.pszText,lpdi->item.cchTextMax,"%d %s ",(int)s,tab[0]); break; } int w = 1; do { w++; lf = (int)(s&1023); s/=1024; } while (s >= 1024 && w<4); snprintf(lpdi->item.pszText,lpdi->item.cchTextMax,"%d.%d %s ",(int)s,(int)((lf*10.0)/1024.0+0.5),tab[w-1]); } break; case 2: if (rec->date > 0 && rec->date < WDL_INT64_CONST(0x793406fff)) { struct tm *a=localtime(&rec->date); if (a) { char str[512]; strftime(str,sizeof(str),"%c",a); lstrcpyn(lpdi->item.pszText, str,lpdi->item.cchTextMax); } } break; } } } } } else if (l->code == LVN_ODFINDITEM) { } else if (l->code == LVN_ITEMCHANGED) { const int selidx = ListView_GetNextItem(l->hwndFrom, -1, LVNI_SELECTED); if (selidx>=0) { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); if (parms && parms->mode == BrowseFile_State::OPENMULTI && ListView_GetSelectedCount(l->hwndFrom)>1) { SetDlgItemText(hwnd,0x100,multiple_files); } else { const char *fn = NULL; struct BrowseFile_State::rec *rec = parms ? parms->viewlist.EnumeratePtr(selidx,&fn) : NULL; if (rec) { if (fn && fn[0]) SetDlgItemText(hwnd,0x100,fn+1); } } } } else if (l->code == NM_DBLCLK) { SendMessage(hwnd,WM_COMMAND,IDOK,0); } } break; } return 0; }