void AwtList::SetDragCapture(UINT flags) { // don't want to interfere with other controls if (::GetCapture() == NULL) { ::SetCapture(GetListHandle()); } }
MsgRouting AwtList::WmCtlColor(HDC hDC, HWND hCtrl, UINT ctlColor, HBRUSH& retBrush) { DASSERT(ctlColor == CTLCOLOR_LISTBOX); DASSERT(hCtrl == GetListHandle()); ::SetBkColor(hDC, GetBackgroundColor()); ::SetTextColor(hDC, GetColor()); retBrush = GetBackgroundBrush(); return mrConsume; }
// Every time something gets added to the list, we increase the max width // of items that have ever been added. If it surpasses the width of the // listbox, we show the scrollbar. When things get deleted, we shrink // the scroll region back down and hide the scrollbar, if needed. void AwtList::AdjustHorizontalScrollbar() { // The border width is added to the horizontal extent to ensure that we // can view all of the text when we move the horz. scrollbar to the end. int cxBorders = GetSystemMetrics( SM_CXBORDER ) * 2; RECT rect; VERIFY(::GetClientRect(GetListHandle(), &rect)); LRESULT iHorzExt = SendListMessage(LB_GETHORIZONTALEXTENT, 0, 0L ) - cxBorders; if ( (m_nMaxWidth > rect.left) // if strings wider than listbox || (iHorzExt != m_nMaxWidth) ) // or scrollbar not needed anymore. { SendListMessage(LB_SETHORIZONTALEXTENT, m_nMaxWidth + cxBorders, 0L); } }
MsgRouting AwtList::WmMouseUp(UINT flags, int x, int y, int button) { MsgRouting result = mrDoDefault; // if this list is in the modal blocked window, this message should be consumed, // however AwtComponent::WmMouseUp must be called anyway if (::IsWindow(AwtWindow::GetModalBlocker(AwtComponent::GetTopLevelParentForWindow(GetHWnd())))) { result = mrConsume; } else { if (button == LEFT_BUTTON) { WmCommand(0, GetListHandle(), LBN_SELCHANGE); } } MsgRouting compResult = AwtComponent::WmMouseUp(flags, x, y, button); return (result == mrConsume) ? result : compResult; }
MsgRouting AwtList::WmMouseDown(UINT flags, int x, int y, int button) { MsgRouting mrResult = AwtComponent::WmMouseDown(flags, x, y, button); if (::IsWindow(AwtWindow::GetModalBlocker(AwtComponent::GetTopLevelParentForWindow(GetHWnd())))) { return mrConsume; } /* * As we consume WM_LBUTONDOWN the list won't trigger ActionEvent by double click. * We trigger it ourselves. (see also 6240202) */ int clickCount = GetClickCount(); if (button == LEFT_BUTTON && clickCount >= 2 && clickCount % 2 == 0) { WmCommand(0, GetListHandle(), LBN_DBLCLK); } return mrResult; }
/*** doreplace - perform search-replace * * Performs the actual search and replace argument verification, set up and * high level control. * * Input: * fQuery = TRUE if a query replace * pArg = pArg of parent function * fMeta = fMeta of parent function * fFiles = TRUE is multiple file search and replace. * * Output: * Returns ..... * * Exceptions: * * Notes: * *************************************************************************/ flagType doreplace ( flagType fQuery, ARG * pArg, flagType fMeta, flagType fFiles ) { buffer bufFn; /* filename buffer */ fl flStart; char *p; PCMD pCmd; PFILE pFileSave; /* file to save as top of heap */ p = "Query Search string: "; if (!fQuery) { p += 6; } fQrpl = fQuery; fSrchCasePrev = fMeta ? (flagType)!fSrchCaseSwit : fSrchCaseSwit; Display (); cRepl = 0; /* * If not menu-driven, ask the user for a search string. If none is entered, * we're done. */ if ((pCmd = getstring (srcbuf, sizeof(srcbuf), p, NULL, GS_NEWLINE | GS_INITIAL)) == NULL || (PVOID)pCmd->func == (PVOID)cancel) { return FALSE; } if (srcbuf[0] == '\0') { return FALSE; } /* * If RE search to take place, the compile the expression. */ if (pArg->arg.nullarg.cArg == 2) { if (patBuf != NULL) { FREE ((char *) patBuf); patBuf = NULL; } patBuf = RECompile (srcbuf, fSrchCaseSwit, (flagType)!fUnixRE); if (patBuf == NULL) { printerror ((RESize == -1) ? "Invalid pattern" : "Not enough memory for pattern"); return FALSE; } fRplRePrev = TRUE; } else { fRplRePrev = FALSE; } /* * If not menu driven, ask the user for a replacement string. Confirm the * entry of a null string. Error check the replacement if an RE search. */ if ((pCmd = getstring (rplbuf, sizeof(rplbuf), "Replace string: ", NULL, GS_NEWLINE | GS_INITIAL)) == NULL || (PVOID)pCmd->func == (PVOID)cancel) { return FALSE; } if (rplbuf[0] == 0) { if (!confirm ("Empty replacement string, confirm: ", NULL)) { return FALSE; } } if (fRplRePrev && !RETranslate (patBuf, rplbuf, scanreal)) { printerror ("Invalid replacement pattern"); return FALSE; } srchlen = strlen (srcbuf); switch (pArg->argType) { case NOARG: case NULLARG: setAllScan (TRUE); break; case LINEARG: rnScan.flFirst.col = 0; rnScan.flLast.col = sizeof(linebuf)-1; rnScan.flFirst.lin = pArg->arg.linearg.yStart; rnScan.flLast.lin = pArg->arg.linearg.yEnd; break; case BOXARG: rnScan.flFirst.col = pArg->arg.boxarg.xLeft; rnScan.flLast.col = pArg->arg.boxarg.xRight; rnScan.flFirst.lin = pArg->arg.boxarg.yTop; rnScan.flLast.lin = pArg->arg.boxarg.yBottom; break; case STREAMARG: if (pArg->arg.streamarg.yStart == pArg->arg.streamarg.yEnd) { rnScan.flFirst.col = pArg->arg.streamarg.xStart; rnScan.flLast.col = pArg->arg.streamarg.xEnd; rnScan.flFirst.lin = pArg->arg.streamarg.yStart; rnScan.flLast.lin = pArg->arg.streamarg.yEnd; } else { rnScan.flFirst.col = 0; /* Do all but last line first */ rnScan.flLast.col = sizeof(linebuf)-1; rnScan.flFirst.lin = pArg->arg.streamarg.yStart; rnScan.flLast.lin = pArg->arg.streamarg.yEnd - 1; flStart.col = pArg->arg.streamarg.xStart - 1; flStart.lin = rnScan.flFirst.lin; fScan (flStart, fDoReplace , TRUE, fSrchWrapSwit); rnScan.flLast.col = pArg->arg.streamarg.xEnd; rnScan.flFirst.lin = ++rnScan.flLast.lin; } } flStart.col = rnScan.flFirst.col-1; flStart.lin = rnScan.flFirst.lin; if (fRplRePrev) { MaxREStack = 512; REStack = (RE_OPCODE **)ZEROMALLOC (MaxREStack * sizeof(*REStack)); } if (fFiles) { /* * Get the list handle, and initialize to start at the head of the list. * Attempt to read each file. */ if (pCmd = GetListHandle ("mgreplist", TRUE)) { pFileSave = pFileHead; p = ScanList (pCmd, TRUE); while (p) { CanonFilename (p, bufFn); forfile (bufFn, A_ALL, mrepl1file, &p); p = ScanList (NULL, TRUE); if (fCtrlc) { return FALSE; } } pFileToTop (pFileSave); dispmsg (0); } } else { fScan (flStart, fDoReplace , TRUE, fSrchWrapSwit); } if (fRplRePrev) { FREE (REStack); } domessage ("%d occurrences replaced", cRepl); return (flagType)(cRepl != 0); }
void AwtList::SetMultiSelect(BOOL ms) { if (ms == isMultiSelect) { return; } JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); /* Copy current box's contents to string array */ const int nCount = GetCount(); LPTSTR * strings = new LPTSTR[nCount]; int i; for(i = 0; i < nCount; i++) { LRESULT len = SendListMessage(LB_GETTEXTLEN, i); LPTSTR text = NULL; try { text = new TCHAR[len + 1]; } catch (std::bad_alloc&) { // free char * already allocated for (int j = 0; j < i; j++) { delete [] strings[j]; } delete [] strings; throw; } VERIFY(SendListMessage(LB_GETTEXT, i, (LPARAM)text) != LB_ERR); strings[i] = text; } // index for selected item after multi-select mode change int toSelect = SendListMessage(LB_GETCURSEL); if (!isMultiSelect) { // MSDN: for single-select lists LB_GETCURSEL returns // index of selected item or LB_ERR if no item is selected if (toSelect == LB_ERR) { toSelect = -1; } } else { // MSDN: for multi-select lists LB_GETCURSEL returns index // of the focused item or 0 if no items are selected; if // some item has focus and is not selected then LB_GETCURSEL // return its index, so we need IsItemSelected too if ((toSelect == LB_ERR) || (SendListMessage(LB_GETSELCOUNT) == 0) || (IsItemSelected(toSelect) == 0)) { toSelect = -1; } } isMultiSelect = ms; HWND parentHWnd = GetParent()->GetHWnd(); /* Save old list box's attributes */ RECT rect; GetWindowRect(GetListHandle(), &rect); MapWindowPoints(0, parentHWnd, (LPPOINT)&rect, 2); HANDLE font = (HANDLE)SendListMessage(WM_GETFONT); LRESULT itemHeight = SendListMessage(LB_GETITEMHEIGHT, 0); DWORD style = ::GetWindowLong(GetListHandle(), GWL_STYLE) | WS_VSCROLL | WS_HSCROLL; if (isMultiSelect) { style |= LBS_MULTIPLESEL; } else { style &= ~LBS_MULTIPLESEL; } DWORD exStyle = ::GetWindowLong(GetListHandle(), GWL_EXSTYLE); jobject peer = GetPeer(env); UnsubclassHWND(); AwtToolkit::DestroyComponentHWND(m_hwnd); CreateHWnd(env, L"", style, exStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, parentHWnd, NULL, ::GetSysColor(COLOR_WINDOWTEXT), ::GetSysColor(COLOR_WINDOW), peer); SendListMessage(WM_SETFONT, (WPARAM)font, (LPARAM)FALSE); SendListMessage(LB_SETITEMHEIGHT, 0, MAKELPARAM(itemHeight, 0)); SendListMessage(LB_RESETCONTENT); for (i = 0; i < nCount; i++) { InsertString(i, strings[i]); delete [] strings[i]; } delete[] strings; if (toSelect != -1) { Select(toSelect); } AdjustHorizontalScrollbar(); }
void AwtList::ReleaseDragCapture(UINT flags) { if ((::GetCapture() == GetListHandle()) && ((flags & ALL_MK_BUTTONS) == 0)) { ::ReleaseCapture(); } }