XmString SearchHistoryListView::display_value(FolioObject *object) { ResultID &rid = *(ResultID*)object; char buf[8]; snprintf(buf, sizeof(buf), "%d", rid.ndocs()); WXmString matchString = buf; UAS_Pointer<UAS_SearchResults> results = rid.results(); WXmString scopeString = (char*)*results->scope_name(); WXmString queryString = rid.display_as(); XmFontList fontlist = f_list->FontList(); int number_width = WXmString("0").Width(fontlist) ; WXmString matchPostfix( window_system().make_space( 8 * number_width - matchString.Width(fontlist), *f_list ), False); int scope_field_width = 22 * number_width; int allowance; if ((allowance = scope_field_width - scopeString.Width(fontlist)) < 0) { char* dots = (char*)"..."; // need to free ungenerated at the end char* ungenerated = (char*)(scopeString + WXmString(dots)); wchar_t* buf = WString(ungenerated); wchar_t* ptr = buf + wcslen(buf) - (strlen(dots)+1); XtFree(ungenerated); WXmString stake; WString wdots(dots); do { char* str; memcpy(ptr--, (wchar_t*)wdots, (strlen(dots)+1) * sizeof(wchar_t)); stake = str = WString(buf).get_mbstr(); allowance = scope_field_width - stake.Width(fontlist); delete[] str; } while (allowance <= 0 && ptr >= buf); while (*ptr <= (wchar_t)' ' && ptr >= buf) { char* str; memcpy(ptr--, (wchar_t*)wdots, (strlen(dots)+1) * sizeof(wchar_t)); stake = str = WString(buf).get_mbstr(); allowance = scope_field_width - stake.Width(fontlist); delete[] str; } scopeString = stake; } WXmString scopePostfix( window_system().make_space(allowance, *f_list), False); WXmString entry_string = matchString + matchPostfix + scopeString + scopePostfix + queryString; return entry_string.disown(); }