summaryrefslogtreecommitdiff
path: root/libdigidoc/DlgUnit.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdigidoc/DlgUnit.c')
-rw-r--r--libdigidoc/DlgUnit.c688
1 files changed, 688 insertions, 0 deletions
diff --git a/libdigidoc/DlgUnit.c b/libdigidoc/DlgUnit.c
new file mode 100644
index 0000000..65a62fe
--- /dev/null
+++ b/libdigidoc/DlgUnit.c
@@ -0,0 +1,688 @@
+//==================================================
+// FILE: DlgUnit.c
+// PROJECT: Digi Doc
+// DESCRIPTION: Low-level built dialog with list selection capability
+// UPDATES:
+//
+// Created by Aare Amenberg 06/10/2003
+//==================================================
+// Copyright (C) AS Sertifitseerimiskeskus
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+// GNU Lesser General Public Licence is available at
+// http://www.gnu.org/copyleft/lesser.html
+//==================================================
+
+#include <libdigidoc/DigiDocDefs.h>
+#include <stdio.h>
+#include <windows.h>
+#include <commctrl.h>
+#include "DlgUnit.h"
+
+HINSTANCE hInstanceCOM = NULL;
+extern int RunDialogUnitSimple(char *psList[], char *psCaption, char *psHeader, char *psOkButton, char *psCancelButton, int iWinWidth, int iWinHeight);
+EXTERN_C IMAGE_DOS_HEADER __ImageBase;
+
+#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
+//min and max sizes for dialog window
+#define dDLGWIN_MINWIDTH 170
+#define dDLGWIN_MAXWIDTH 800
+#define dDLGWIN_MINHEIGHT 150
+#define dDLGWIN_MAXHEIGHT 600
+
+//maximum items in the listbox
+//Developer can change the value
+#define dDLGMAXLISTBOXSIZE 1024
+//maximum item length
+//Developer can change the value
+#define dDLGMAXITEMSIZE 512
+
+//temporary messagebox buffer len
+#define dDLGTEMPBUFLEN 64
+
+//internal errors
+#define dDLGNOERRORS 0
+#define dDLGERROR -1
+#define dDLGNOSELECTION -9
+//output error
+#define dDLGERROR_OUT -2 //can't initiate dialog
+#define dDLGNOSELECTION_OUT -1 //no selection, cancel
+//if output result >= 0, then item is selected
+
+//User texts max length (headers,title,tooltips,etc.)
+#define dDLGUSERTEXTMAXLEN 128
+
+//Dialog functions
+static BOOL CALLBACK WndDlgUnitProc(HWND, UINT, WPARAM, LPARAM);
+static void CalculateDialogSize(HWND hDlg);
+static void SetDialogItemSize(HWND hWnd, int iWOffs, int iHOffs);
+static void SetDialogItemPosition(HWND hWnd, int iWOffs, int iHOffs);
+static void CenterDialogOnScreen(HWND hDlg, HWND hMain);
+static void Dialog_End(HWND hDlg, BOOL fCancel);
+static int Dialog_Init(HWND hDlg);
+static void DispError(char *psError);
+//ListView functions
+static BOOL ListViewSetHeaderColumn(HWND hWndList, int iIndex, int iSize, char *psHeader);
+static int ListViewCalcColumnSize(HWND hWndList, int iIndex, int iSizePercent);
+static BOOL ListViewInserRow(HWND hWndList, int iIndex, char *psVal1, char *psVal2, char *psVal3, char *psVal4, char *psVal5);
+static BOOL ListViewInsertItem(HWND hWndListView, int iIndex, char *psData);
+
+//Tooltip functions
+static void ToolTipInitiate(HWND hWndDlg);
+static HWND ToolTipCreate (HWND hParent);
+static void ToolTipForItem (HWND hwnd,char *psText,HWND hTip);
+
+//User defined texts
+static char sDlgCaption[dDLGUSERTEXTMAXLEN+1] ="DigiDoc";
+static char sGrpHeader[dDLGUSERTEXTMAXLEN+1] ="Select certificate:";
+static char sOkButtonText[dDLGUSERTEXTMAXLEN+1] ="&Ok";
+static char sCancelButtonText[dDLGUSERTEXTMAXLEN+1] ="&Cancel";
+//ListView headers
+static char sListColumn1[dDLGUSERTEXTMAXLEN+1] ="Issuer";
+static char sListColumn2[dDLGUSERTEXTMAXLEN+1] ="Friendly name";
+static char sListColumn3[dDLGUSERTEXTMAXLEN+1] ="Valid from";
+static char sListColumn4[dDLGUSERTEXTMAXLEN+1] ="Valid to";
+static char sListColumn5[dDLGUSERTEXTMAXLEN+1] ="CSP";
+//User defined tooltips
+static char sDlgToolTip[dDLGUSERTEXTMAXLEN+1] ="Certificate selection";
+static char sListToolTip[dDLGUSERTEXTMAXLEN+1] ="Selecting certificate press <Enter>\nor click <Ok> button\nor mouse double-click";
+static char sOkButtonToolTip[dDLGUSERTEXTMAXLEN+1] ="Select and close dialog";
+static char sCancelButtonToolTip[dDLGUSERTEXTMAXLEN+1]="Cancel selection";
+
+static char **psListItems=NULL; //Listbox items
+static HWND hToolTipWnd=NULL; //ToolTip window
+static int iDlgWidth = 800;
+static int iDlgHeight = 170;
+//
+//Set texts
+//
+//psCaption - dialog caption/title
+// if NULL, then no caption
+//psHeader - listbox header
+// if NULL, then no header
+//psOkButton - Ok button label
+// if NULL or zero length string, then "&Ok"
+//psCancelButton - Cancel button label
+// if NULL or zero length string, then "&Cancel"
+EXP_OPTION int DialogUnitSetTexts(char *psCaption, char *psHeader, char *psOkButton, char *psCancelButton)
+{
+if (psCaption != NULL)
+ lstrcpyn(sDlgCaption,psCaption,dDLGUSERTEXTMAXLEN);
+if (psHeader != NULL)
+ lstrcpyn(sGrpHeader,psHeader,dDLGUSERTEXTMAXLEN);
+if (psOkButton != NULL)
+ lstrcpyn(sOkButtonText,psOkButton,dDLGUSERTEXTMAXLEN);
+if (psCancelButton != NULL)
+ lstrcpyn(sCancelButtonText,psCancelButton,dDLGUSERTEXTMAXLEN);
+//if not specified, then Ok string
+if (lstrlen(sOkButtonText) == 0)
+ lstrcpy(sOkButtonText,"&Ok");
+//if not specified, then Ok string
+if (lstrlen(sCancelButtonText) == 0)
+ lstrcpy(sCancelButtonText,"&Cancel");
+return(0);
+}
+
+EXP_OPTION int DialogUnitSetHeaders(char *psCol1, char *psCol2, char *psCol3, char *psCol4, char *psCol5)
+{
+if (psCol1 != NULL)
+ lstrcpyn(sListColumn1,psCol1,dDLGUSERTEXTMAXLEN);
+if (psCol2 != NULL)
+ lstrcpyn(sListColumn2,psCol2,dDLGUSERTEXTMAXLEN);
+if (psCol3 != NULL)
+ lstrcpyn(sListColumn3,psCol3,dDLGUSERTEXTMAXLEN);
+if (psCol4 != NULL)
+ lstrcpyn(sListColumn4,psCol4,dDLGUSERTEXTMAXLEN);
+if (psCol5 != NULL)
+ lstrcpyn(sListColumn5,psCol5,dDLGUSERTEXTMAXLEN);
+return(0);
+}
+
+EXP_OPTION int DialogUnitSetToolTips(char *psCommon, char *psListView, char *psOkButton, char *psCancelButton)
+{
+if (psCommon != NULL)
+ lstrcpyn(sDlgToolTip,psCommon,dDLGUSERTEXTMAXLEN);
+else
+ sDlgToolTip[0] = 0;
+if (psListView != NULL)
+ lstrcpyn(sListToolTip,psListView,dDLGUSERTEXTMAXLEN);
+else
+ sListToolTip[0] = 0;
+if (psOkButton != NULL)
+ lstrcpyn(sOkButtonToolTip,psOkButton,dDLGUSERTEXTMAXLEN);
+else
+ sOkButtonToolTip[0] = 0;
+if (psCancelButton != NULL)
+ lstrcpyn(sCancelButtonToolTip,psCancelButton,dDLGUSERTEXTMAXLEN);
+else
+ sCancelButtonToolTip[0] = 0;
+return(0);
+}
+
+//
+//Dialog main function
+//
+//Limitations:
+// Max. items in the listbox dDLGMAXLISTBOXSIZE
+// Max. item size in the listbox dDLGMAXITEMSIZE
+// Dialogbox sizes dDLGWIN_* values
+//
+//No dynamic memory allocation
+//
+//Selection is accepted if, list item is selected and
+// - user pressed "Ok" button
+// - user double-clicks on the listbox item
+// - user pressed <Enter> key
+//
+//If no items in the psList or psList is NULL,
+//then Ok button is disabled
+//
+//psList - pointer arrays of listbox elements
+// last item must be NULL
+//psCaption - dialog caption/title
+// if NULL, then no caption
+//psHeader - listbox header
+// if NULL, then no header
+//psOkButton - Ok button label
+// if NULL or zero length string, then "&Ok"
+//psCancelButton - Cancel button label
+// if NULL or zero length string, then "&Cancel"
+
+//iWinWidth - dialogbox width, if 0 then default size
+//
+//iWinHeight - dialogbox height, if 0 then default size
+//
+//returns -2 (dDLGERROR_OUT) if dialog error
+//returns -1 (dDLGNOSELECTION_OUT) if listbox item not selected (Cancel button)
+// >=0 selected item index in the psList array
+//
+//
+int RunDialogUnit(char *psList[], int iWinWidth, int iWinHeight)
+{
+char sTemp[dDLGTEMPBUFLEN];
+DWORD dwRes;
+int iRes = dDLGERROR_OUT;
+INITCOMMONCONTROLSEX iccex;
+//LPTSTR lpName;
+//HRSRC hRes;
+//HGLOBAL hGlobal;
+iDlgWidth = iWinWidth;
+iDlgHeight = iWinHeight;
+//if not allowed value, then default size
+if (iDlgWidth < dDLGWIN_MINWIDTH || iDlgWidth > dDLGWIN_MAXWIDTH)
+ iDlgWidth = 0;
+//if not allowed value, then default size
+if (iDlgHeight < dDLGWIN_MINHEIGHT || iDlgHeight > dDLGWIN_MAXHEIGHT)
+ iDlgHeight = 0;
+//set items
+psListItems = psList;
+//Init common control
+iccex.dwICC = ICC_WIN95_CLASSES;
+iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
+if (InitCommonControlsEx(&iccex) == TRUE)
+//InitCommonControls();
+ {
+ //Starts dialog, return value from function Dialog_End
+ //hRes = FindResource(NULL,"#220", RT_DIALOG);
+ //hRes = FindResource(NULL,MAKEINTRESOURCE(IDD_DLG_UNIT), RT_DIALOG);
+ //hGlobal = LoadResource(NULL,hRes);
+ //dwRes = IDD_DLG_UNIT;
+ //lpName = MAKEINTRESOURCE(IDD_DLG_UNIT);
+
+ iRes = DialogBox(HINST_THISCOMPONENT, MAKEINTRESOURCE(IDD_DLG_UNIT), NULL, (DLGPROC)WndDlgUnitProc);
+ //iRes = DialogBox(hInstanceCOM, MAKEINTRESOURCE(IDD_DLG_UNIT), NULL, (DLGPROC)WndDlgUnitProc);
+
+ if (iRes == dDLGERROR)
+ iRes = dDLGERROR_OUT;
+ }
+
+//if GetLastError returns nonzero, then dialog opening error
+if (iRes == dDLGERROR_OUT)
+ {
+ dwRes = GetLastError();
+ if (dwRes != 0)
+ {
+ //prints Windows errorcode
+ snprintf(sTemp, sizeof(sTemp), "DigiDoc Dialog Error=%d",dwRes);
+ //DispError(sTemp);
+ }
+ #ifdef WIN32_CSP
+ iRes = RunDialogUnitSimple(psList, sDlgCaption, sGrpHeader, sOkButtonText, sCancelButtonText, iDlgWidth, iDlgHeight);
+ #endif
+ }
+if (iRes == dDLGNOSELECTION)
+ iRes = dDLGNOSELECTION_OUT;
+return(iRes);
+}
+
+
+//Dialog callback functions
+static BOOL CALLBACK WndDlgUnitProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+BOOL fRes = FALSE;
+DWORD dwNotifyCode;
+LPNMHDR pnmh;
+switch (message)
+ {
+ case WM_INITDIALOG:
+ //dialog init
+ Dialog_Init(hDlg);
+ fRes = TRUE;
+ break;
+ case WM_CLOSE:
+ //user closes dialog from the system menu
+ Dialog_End(hDlg, TRUE);
+ fRes = TRUE;
+ break;
+ case WM_NOTIFY:
+ pnmh = (LPNMHDR)lParam;
+ if (pnmh != NULL && pnmh->code == NM_DBLCLK)
+ {
+ Dialog_End(hDlg,FALSE);
+ fRes = TRUE;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ dwNotifyCode = HIWORD(wParam);
+ //user presses dblclick in the listbox
+ if (dwNotifyCode == LBN_DBLCLK)
+ {
+ Dialog_End(hDlg,FALSE);
+ fRes = TRUE;
+ break;
+ }
+ switch (wParam)
+ {
+ case IDOK:
+ //user pressed OK button
+ Dialog_End(hDlg,FALSE);
+ fRes = TRUE;
+ break;
+ case IDCANCEL:
+ //user pressed Cancel button
+ Dialog_End(hDlg, TRUE);
+ fRes = TRUE;
+ break;
+ }
+ }
+ }
+return(fRes);
+}
+
+//Dialog end function
+//fCancel - TRUE, if user pressed Cancel button
+//
+static void Dialog_End(HWND hDlg, BOOL fCancel)
+{
+int iRes = dDLGNOSELECTION;
+//if TRUE, then always (dDLGNOSELECTION)
+if (fCancel == FALSE)
+ {
+ //if listbox item selected, then retuns selected item index
+ iRes = ListView_GetSelectionMark(GetDlgItem(hDlg,IDC_LISTVIEW));
+ }
+if (hToolTipWnd != NULL)
+ {
+ DestroyWindow(hToolTipWnd);
+ hToolTipWnd = NULL;
+ }
+EndDialog(hDlg, iRes);
+}
+
+
+//Dialog init
+//
+static int Dialog_Init(HWND hDlg)
+{
+int iRes = dDLGNOERRORS;
+UINT iState;
+UINT iMask;
+DWORD dwStyle;
+int iItems = 0;
+HWND hWndListView;
+//Set dialog caption
+SetWindowText(hDlg, (LPTSTR)sDlgCaption);
+//Set listbox header
+SetDlgItemText(hDlg,IDC_GROUPBOX,(LPTSTR)sGrpHeader);
+//Set Ok button label
+SetDlgItemText(hDlg,IDOK,(LPTSTR)sOkButtonText);
+//Set Cancel button label
+SetDlgItemText(hDlg,IDCANCEL,(LPTSTR)sCancelButtonText);
+//Calculate dialog size
+CalculateDialogSize(hDlg);
+//Center dialog
+CenterDialogOnScreen(hDlg,NULL);
+//Set topmost
+SetWindowPos(hDlg,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
+//Set ListView params
+hWndListView = GetDlgItem(hDlg,IDC_LISTVIEW);
+dwStyle = (LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);
+SendMessage(hWndListView,LVM_SETEXTENDEDLISTVIEWSTYLE,0,dwStyle);
+//
+ToolTipInitiate(hDlg);
+ToolTipForItem (GetDlgItem(hDlg,IDOK), sOkButtonToolTip, hToolTipWnd);
+ToolTipForItem (GetDlgItem(hDlg,IDCANCEL), sCancelButtonToolTip, hToolTipWnd);
+ToolTipForItem (hWndListView, sListToolTip, hToolTipWnd);
+ToolTipForItem (hDlg, sDlgToolTip, hToolTipWnd);
+ToolTipForItem (ListView_GetHeader(hWndListView), sDlgToolTip, hToolTipWnd);
+//
+//Set ListView headers
+ListViewSetHeaderColumn(hWndListView, 0, 25, sListColumn1);
+ListViewSetHeaderColumn(hWndListView, 1, 25, sListColumn2);
+ListViewSetHeaderColumn(hWndListView, 2, 15, sListColumn3);
+ListViewSetHeaderColumn(hWndListView, 3, 15, sListColumn4);
+ListViewSetHeaderColumn(hWndListView, 4, 20, sListColumn5);
+//Set ListView rows
+while (psListItems != NULL && *psListItems != NULL && iItems < dDLGMAXLISTBOXSIZE)
+ {
+ if (lstrlen(*psListItems) < dDLGMAXITEMSIZE)
+ {
+ ListViewInsertItem(hWndListView,iItems,*psListItems);
+ ++iItems;
+ }
+ else
+ iRes = dDLGERROR;
+ ++psListItems;
+ }
+if (iRes != dDLGNOERRORS)
+ DispError("DigiDoc Dialog data error");
+if (iItems > 0)
+ {
+ EnableWindow(GetDlgItem(hDlg, IDOK),TRUE);
+ iState = LVIS_FOCUSED | LVIS_SELECTED;
+ iMask = LVIS_FOCUSED | LVIS_SELECTED;
+ ListView_SetItemCount(hWndListView,iItems);
+ ListView_SetItemState(hWndListView, 0, iState, iMask);
+ //iState = ListView_GetItemCount(hWndListView);
+ //iMask = ListView_GetNextItem(hWndListView,-1,LVNI_FOCUSED);
+ //SetFocus(hWndList);
+ }
+else
+ EnableWindow(GetDlgItem(hDlg, IDOK),FALSE);
+return(iRes);
+}
+
+//Parse \t separated texts and add to the ListView
+static BOOL ListViewInsertItem(HWND hWndListView, int iIndex, char *psData)
+{
+BOOL fRes = TRUE;
+int iI=0;
+char sVal[5][dDLGMAXITEMSIZE+1];
+char *psBeg;
+char *psEnd;
+sVal[0][0] = 0;
+sVal[1][0] = 0;
+sVal[2][0] = 0;
+sVal[3][0] = 0;
+sVal[4][0] = 0;
+psBeg = psData;
+while (psBeg != NULL && *psBeg != 0)
+ {
+ psEnd = strchr(psBeg,'\t');
+ if (psEnd != NULL)
+ {
+ lstrcpyn(sVal[iI],psBeg,(psEnd-psBeg)+1);
+ psBeg=psEnd+1;
+ }
+ else
+ {
+ lstrcpyn(sVal[iI],psBeg,dDLGMAXITEMSIZE);
+ break;
+ }
+ ++iI;
+ }
+//
+ListViewInserRow(hWndListView, iIndex, sVal[0], sVal[1], sVal[2], sVal[3], sVal[4]);
+return(fRes);
+}
+
+//Calculate dialog size
+//
+static void CalculateDialogSize(HWND hDlg)
+{
+RECT rcDlg; // Dialog window rect
+int iWOffs;
+int iHOffs;
+if (iDlgWidth > 0 && iDlgHeight > 0)
+ {
+ GetWindowRect(hDlg,&rcDlg);
+ iWOffs = iDlgWidth - (rcDlg.right - rcDlg.left);
+ iHOffs = iDlgHeight - (rcDlg.bottom - rcDlg.top);
+ SetDialogItemSize(hDlg,iWOffs,iHOffs);
+ SetDialogItemSize(GetDlgItem(hDlg,IDC_LISTVIEW),iWOffs,iHOffs);
+ SetDialogItemSize(GetDlgItem(hDlg,IDC_GROUPBOX),iWOffs,iHOffs);
+ SetDialogItemPosition(GetDlgItem(hDlg,IDOK),iWOffs,iHOffs);
+ SetDialogItemPosition(GetDlgItem(hDlg,IDCANCEL),iWOffs,iHOffs);
+ }
+}
+
+//Set dialog item size
+//
+static void SetDialogItemSize(HWND hWnd, int iWOffs, int iHOffs)
+{
+RECT rcItm; // Dialog window rect
+int iWidth, iHeight; // Width and height
+GetWindowRect(hWnd, &rcItm);
+iWidth = rcItm.right - rcItm.left;
+iHeight = rcItm.bottom - rcItm.top;
+SetWindowPos(hWnd,NULL,0,0,iWidth+iWOffs, iHeight+iHOffs,SWP_NOMOVE|SWP_NOZORDER);
+}
+
+//Set dialog item pos
+//
+static void SetDialogItemPosition(HWND hWnd, int iWOffs, int iHOffs)
+{
+RECT rcCln;
+RECT rcItm; // Dialog item rect
+RECT rcParent; // Parent item rect
+int iLeft;
+int iTop;
+int iTitleW;
+// GetWindowRect retrieves screen coordinates
+GetWindowRect(hWnd, &rcItm);
+//GetClientRect(hWnd, &rcItm);
+//Changed by A.Amenberg 27.06.2003
+//GetAncestor supported from Win98 and WinNT SP4
+//GetWindowRect(GetAncestor(hWnd, GA_PARENT), &rcParent);
+GetWindowRect(GetParent(hWnd), &rcParent);
+GetClientRect(GetParent(hWnd), &rcCln);
+iTitleW = rcParent.bottom - rcCln.bottom;
+// for SetWindowPos we need left and right on PARENT.
+iLeft = (rcItm.left - rcParent.left) + iWOffs;
+iTop = (rcItm.top - rcParent.top) + iHOffs - iTitleW;
+// move, don't resize
+SetWindowPos(hWnd, NULL, iLeft, iTop, 0, 0, SWP_NOSIZE|SWP_NOZORDER);
+}
+
+//Center dialog
+//hMain - parent window, if NULL, then center in desktop
+//
+static void CenterDialogOnScreen(HWND hDlg, HWND hMain)
+{
+RECT rcParent; // Parent window client rect
+RECT rcDlg; // Dialog window rect
+int iLeft, iTop; // Top-left coordinates
+int iWidth, iHeight; // Width and height
+HWND hwnd;
+// Get frame window client rect in screen coordinates
+if (hMain == NULL)
+ hwnd = GetDesktopWindow();
+else
+ hwnd = hMain;
+GetWindowRect(hwnd, &rcParent);
+// Determine the top-left point for the dialog to be centered
+GetWindowRect(hDlg, &rcDlg);
+iWidth = rcDlg.right - rcDlg.left;
+iHeight = rcDlg.bottom - rcDlg.top;
+iLeft = rcParent.left + (((rcParent.right - rcParent.left) - iWidth ) / 2);
+iTop = rcParent.top + (((rcParent.bottom - rcParent.top ) - iHeight) / 2);
+if (iLeft < 0)
+ iLeft = 0;
+if (iTop < 0)
+ iTop = 0;
+// Place the dialog
+MoveWindow(hDlg, iLeft, iTop, iWidth, iHeight, TRUE);
+}
+
+//Error messagebox
+//
+static void DispError(char *psError)
+{
+MessageBox(NULL,psError, "Dialog Unit Error",MB_OK|MB_SYSTEMMODAL|MB_ICONERROR);
+}
+
+
+static BOOL ListViewSetHeaderColumn(HWND hWndList, int iIndex, int iSize, char *psHeader)
+{
+BOOL fRes = TRUE;
+LV_COLUMN lvC;
+lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+lvC.fmt = LVCFMT_LEFT; //LVCFMT_CENTER;
+lvC.cx = ListViewCalcColumnSize(hWndList,iIndex,iSize);
+lvC.pszText = psHeader;
+lvC.iSubItem = iIndex;
+if (ListView_InsertColumn (hWndList, iIndex, &lvC) == -1)
+ fRes = FALSE;
+return(fRes);
+}
+
+static int ListViewCalcColumnSize(HWND hWndList, int iIndex, int iSizePercent)
+{
+RECT rcRec;
+int iListSize;
+int iUsedSize=0;
+int iRes;
+int iI;
+double dPercUnit;
+GetClientRect(hWndList, &rcRec);
+iListSize = rcRec.right;
+for(iI=0; iI < iIndex;++iI)
+ iUsedSize+=ListView_GetColumnWidth(hWndList,iI);
+if (iIndex < 4)
+ {
+ dPercUnit = (double)iListSize/(double)100;
+ iRes = (int)((double)iSizePercent*dPercUnit);
+ }
+else
+ iRes = iListSize-iUsedSize;
+return(iRes);
+}
+
+static BOOL ListViewInserRow(HWND hWndList, int iIndex, char *psVal1, char *psVal2, char *psVal3, char *psVal4, char *psVal5)
+{
+BOOL fRes = TRUE;
+LV_ITEM lvI;
+lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
+lvI.state = 0;
+lvI.stateMask = 0;
+lvI.iItem = iIndex;
+lvI.iSubItem = 0;
+lvI.pszText = "";
+lvI.cchTextMax = 200;
+if (ListView_InsertItem (hWndList, &lvI) == -1)
+ fRes = FALSE;
+ListView_SetItemText (hWndList, iIndex, 0, psVal1);
+ListView_SetItemText (hWndList, iIndex, 1, psVal2);
+ListView_SetItemText (hWndList, iIndex, 2, psVal3);
+ListView_SetItemText (hWndList, iIndex, 3, psVal4);
+ListView_SetItemText (hWndList, iIndex, 4, psVal5);
+return(fRes);
+}
+
+static void ToolTipInitiate(HWND hWndDlg)
+{
+if (hToolTipWnd == NULL)
+ {
+ hToolTipWnd = ToolTipCreate(hWndDlg);
+ SendMessage(hToolTipWnd,TTM_SETMAXTIPWIDTH,0,300);
+ }
+}
+
+static HWND ToolTipCreate (HWND hParent)
+{
+HWND hWnd = CreateWindowEx(WS_EX_TOPMOST,
+ TOOLTIPS_CLASS,
+ NULL,
+ WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ hParent,
+ NULL,
+ NULL, //oPrm.hAppInstance,
+ NULL
+ );
+
+ SetWindowPos(hWnd,
+ HWND_TOPMOST,
+ 0,
+ 0,
+ 0,
+ 0,
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+SendMessage(hWnd,TTM_SETMAXTIPWIDTH,0,300);
+return(hWnd);
+}
+
+static void ToolTipForItem (HWND hwnd, char *psText, HWND hTip)
+{
+HWND hWnd = hTip;
+ // struct specifying info about tool in ToolTip control
+ TOOLINFO ti;
+ unsigned int uid = 0; // for ti initialization
+ LPTSTR lptstr = (LPTSTR)psText;
+ RECT rect; // for client area coordinates
+
+ /* GET COORDINATES OF THE MAIN CLIENT AREA */
+ GetClientRect (hwnd, &rect);
+
+ /* INITIALIZE MEMBERS OF THE TOOLINFO STRUCTURE */
+ ti.cbSize = sizeof(TOOLINFO);
+ ti.uFlags = TTF_SUBCLASS;
+ //ti.uFlags = 0;
+ ti.hwnd = hwnd;
+ ti.hinst = NULL; //oPrm.hAppInstance;
+ ti.uId = uid;
+ ti.lpszText = lptstr;
+ // ToolTip control will cover the whole window
+ ti.rect.left = rect.left;
+ ti.rect.top = rect.top;
+ ti.rect.right = rect.right;
+ ti.rect.bottom = rect.bottom;
+if (hWnd == NULL)
+ hWnd = hToolTipWnd;
+ /* SEND AN ADDTOOL MESSAGE TO THE TOOLTIP CONTROL WINDOW */
+SendMessage(hWnd, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
+}
+
+
+EXP_OPTION int RunDialogTestLow(void)
+{
+int iRes = 0;
+/*
+int iI;
+int iT = 0;
+char *psTemp;
+char sTemp[5000];
+char sVal[128];
+*/
+char sTest[] = {'\x8E','\x9e','\x8A','\x9A','\x00'};
+char *aCertList[] =
+{
+NULL,
+"11111111111111111111111111111111111111111\t222\t333\t4444\t5555",
+"11111111111111111111111111111111111111111\t222\t333\t4444\t5555",
+"11111111111111111111111111111111111111111\t222\t333\t4444\t5555",
+NULL};
+aCertList[0]=sTest;
+iRes = RunDialogUnit(aCertList, 500, 300);
+return(iRes);
+}