Added code for detecting that text is to be edited. Now for actually implementing editing text.
This commit is contained in:
parent
6d0b276d6d
commit
799c613a6f
|
@ -83,9 +83,16 @@ void uiTableModelRowDeleted(uiTableModel *m, int oldIndex)
|
||||||
static LRESULT CALLBACK tableSubProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIDSubclass, DWORD_PTR dwRefData)
|
static LRESULT CALLBACK tableSubProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIDSubclass, DWORD_PTR dwRefData)
|
||||||
{
|
{
|
||||||
uiTable *t = (uiTable *) dwRefData;
|
uiTable *t = (uiTable *) dwRefData;
|
||||||
|
LRESULT lResult;
|
||||||
|
|
||||||
switch (uMsg) {
|
switch (uMsg) {
|
||||||
case WM_TIMER:
|
case WM_TIMER:
|
||||||
|
if (wParam == (WPARAM) (&(t->inDoubleClickTimer))) {
|
||||||
|
t->inDoubleClickTimer = FALSE;
|
||||||
|
// TODO check errors
|
||||||
|
KillTimer(hwnd, wParam);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if (wParam != (WPARAM) t)
|
if (wParam != (WPARAM) t)
|
||||||
break;
|
break;
|
||||||
// TODO only increment and update if visible?
|
// TODO only increment and update if visible?
|
||||||
|
@ -95,6 +102,11 @@ static LRESULT CALLBACK tableSubProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
|
||||||
SendMessageW(hwnd, LVM_UPDATE, (WPARAM) (i.first.first), 0);
|
SendMessageW(hwnd, LVM_UPDATE, (WPARAM) (i.first.first), 0);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
case WM_LBUTTONDOWN:
|
||||||
|
t->inLButtonDown = TRUE;
|
||||||
|
lResult = DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
||||||
|
t->inLButtonDown = FALSE;
|
||||||
|
return lResult;
|
||||||
case WM_NCDESTROY:
|
case WM_NCDESTROY:
|
||||||
if (RemoveWindowSubclass(hwnd, tableSubProc, uIDSubclass) == FALSE)
|
if (RemoveWindowSubclass(hwnd, tableSubProc, uIDSubclass) == FALSE)
|
||||||
logLastError(L"RemoveWindowSubclass()");
|
logLastError(L"RemoveWindowSubclass()");
|
||||||
|
@ -192,6 +204,25 @@ static BOOL onWM_NOTIFY(uiControl *c, HWND hwnd, NMHDR *nmhdr, LRESULT *lResult)
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
#endif
|
#endif
|
||||||
|
case LVN_ITEMCHANGED:
|
||||||
|
{
|
||||||
|
NMLISTVIEW *nm = (NMLISTVIEW *) nmhdr;
|
||||||
|
UINT oldSelected, newSelected;
|
||||||
|
|
||||||
|
if (!t->inLButtonDown)
|
||||||
|
return FALSE;
|
||||||
|
oldSelected = nm->uOldState & LVIS_SELECTED;
|
||||||
|
newSelected = nm->uNewState & LVIS_SELECTED;
|
||||||
|
if (oldSelected == 0 && newSelected != 0) {
|
||||||
|
t->inDoubleClickTimer = TRUE;
|
||||||
|
// TODO check error
|
||||||
|
SetTimer(t->hwnd, (UINT_PTR) (&(t->inDoubleClickTimer)),
|
||||||
|
GetDoubleClickTime(), NULL);
|
||||||
|
*lResult = 0;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,8 @@ struct uiTable {
|
||||||
HIMAGELIST imagelist;
|
HIMAGELIST imagelist;
|
||||||
// TODO document all this
|
// TODO document all this
|
||||||
std::map<std::pair<int, int>, LONG> *indeterminatePositions;
|
std::map<std::pair<int, int>, LONG> *indeterminatePositions;
|
||||||
|
BOOL inLButtonDown;
|
||||||
|
BOOL inDoubleClickTimer;
|
||||||
};
|
};
|
||||||
extern int uiprivTableProgress(uiTable *t, int item, int subitem, int modelColumn, LONG *pos);
|
extern int uiprivTableProgress(uiTable *t, int item, int subitem, int modelColumn, LONG *pos);
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ HRESULT uiprivTableHandleNM_CLICK(uiTable *t, NMITEMACTIVATE *nm, LRESULT *lResu
|
||||||
LVHITTESTINFO ht;
|
LVHITTESTINFO ht;
|
||||||
uiprivTableColumnParams *p;
|
uiprivTableColumnParams *p;
|
||||||
int modelColumn, editableColumn;
|
int modelColumn, editableColumn;
|
||||||
bool checkbox;
|
bool text, checkbox;
|
||||||
uiTableData *data;
|
uiTableData *data;
|
||||||
int checked, editable;
|
int checked, editable;
|
||||||
|
|
||||||
|
@ -18,9 +18,14 @@ HRESULT uiprivTableHandleNM_CLICK(uiTable *t, NMITEMACTIVATE *nm, LRESULT *lResu
|
||||||
|
|
||||||
modelColumn = -1;
|
modelColumn = -1;
|
||||||
editableColumn = -1;
|
editableColumn = -1;
|
||||||
|
text = false;
|
||||||
checkbox = false;
|
checkbox = false;
|
||||||
p = (*(t->columns))[ht.iSubItem];
|
p = (*(t->columns))[ht.iSubItem];
|
||||||
if (p->checkboxModelColumn != -1) {
|
if (p->textModelColumn != -1) {
|
||||||
|
modelColumn = p->textModelColumn;
|
||||||
|
editableColumn = p->textEditableColumn;
|
||||||
|
text = true;
|
||||||
|
} else if (p->checkboxModelColumn != -1) {
|
||||||
modelColumn = p->checkboxModelColumn;
|
modelColumn = p->checkboxModelColumn;
|
||||||
editableColumn = p->checkboxEditableColumn;
|
editableColumn = p->checkboxEditableColumn;
|
||||||
checkbox = true;
|
checkbox = true;
|
||||||
|
@ -31,6 +36,10 @@ HRESULT uiprivTableHandleNM_CLICK(uiTable *t, NMITEMACTIVATE *nm, LRESULT *lResu
|
||||||
if (modelColumn == -1)
|
if (modelColumn == -1)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
if (text && t->inDoubleClickTimer)
|
||||||
|
// don't even ask for info if it's too soon to edit text
|
||||||
|
goto done;
|
||||||
|
|
||||||
switch (editableColumn) {
|
switch (editableColumn) {
|
||||||
case uiTableModelColumnNeverEditable:
|
case uiTableModelColumnNeverEditable:
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -44,7 +53,9 @@ HRESULT uiprivTableHandleNM_CLICK(uiTable *t, NMITEMACTIVATE *nm, LRESULT *lResu
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checkbox) {
|
if (text) {
|
||||||
|
MessageBoxW(NULL, L"editing text", L"ok", MB_OK);
|
||||||
|
} else if (checkbox) {
|
||||||
if ((ht.flags & LVHT_ONITEMICON) == 0)
|
if ((ht.flags & LVHT_ONITEMICON) == 0)
|
||||||
goto done;
|
goto done;
|
||||||
data = (*(t->model->mh->CellValue))(t->model->mh, t->model, ht.iItem, modelColumn);
|
data = (*(t->model->mh->CellValue))(t->model->mh, t->model, ht.iItem, modelColumn);
|
||||||
|
|
Loading…
Reference in New Issue