#include #include "combobox.h" #include #include ComboBox::ComboBox() { keys_edit = NULL; lastlist = NULL; disable_getselection = 0; savedidle = 0; savedautoenter = 0; } ComboBox::~ComboBox() { delete keys_edit; } void ComboBox::abstract_onNewContent() { COMBOBOX_PARENT::abstract_onNewContent(); trapControls(); } void ComboBox::trapControls() { delete keys_edit; keys_edit = NULL; if (wantTrapEdit()) { GuiObject *editGuiObj = getGuiObject()->guiobject_findObject(combobox_getEditId()); if (editGuiObj) keys_edit = new HEBKeysCallback(*editGuiObj, this); } } void ComboBox::updateTextInControl(const wchar_t *txt) { if (txt == NULL) return; if (WCSCASEEQLSAFE(getText(), txt)) return; GuiObject *content = getContent(); if (content != NULL) { if (wantTrapEdit()) { GuiObject *text = content->guiobject_findObject(combobox_getEditId()); if (text != NULL) { C_Edit t(*text); t.setText(txt); curtxt = txt; } } } } void ComboBox::dropdownlist_onCloseList() { COMBOBOX_PARENT::dropdownlist_onCloseList(); if (wantTrapEdit()) { GuiObject *o = embeddedxui_getEmbeddedObject(); if (o != NULL) { o->guiobject_getRootWnd()->setFocus(); GuiObject *edit = o->guiobject_findObjectByInterface(editGuid); if (edit != NULL) { C_Edit e(*edit); e.setAutoEnter(savedautoenter); e.setIdleEnabled(savedidle); } } } if (wantEnterOnSelect()) enter(); disable_getselection = 0; } void ComboBox::dropdownlist_onOpenList() { COMBOBOX_PARENT::dropdownlist_onOpenList(); if (wantTrapEdit()) { GuiObject *o = embeddedxui_getEmbeddedObject(); if (o != NULL) { o->guiobject_getRootWnd()->setFocus(); GuiObject *edit = o->guiobject_findObjectByInterface(editGuid); if (edit != NULL) { C_Edit e(*edit); savedidle = e.getIdleEnabled(); savedautoenter = e.getAutoEnter(); e.setIdleEnabled(0); e.setAutoEnter(0); } } } } void ComboBox::setText(const wchar_t *text, int hover) { updateTextInControl(text); selectItem(-1, hover); selectEditor(); } const wchar_t *ComboBox::getText(int fromcontrol) { if (!fromcontrol) return curtxt; const wchar_t *c = NULL; GuiObject *content = getContent(); if (content != NULL) { if (wantTrapEdit()) { GuiObject *text = content->guiobject_findObject(combobox_getEditId()); if (text != NULL) { C_Edit t(*text); c = t.getText(); } } } curtxt = c; return c; } void ComboBox::dropdownlist_onConfigureList(GuiObject *o) { COMBOBOX_PARENT::dropdownlist_onConfigureList(o); ifc_window *w = o->guiobject_getRootWnd()->findWindowByInterface(listGuid); sendAction(w, L"register_tempselectnotify"); //w->getGuiObject()->guiobject_setXmlParam("select", getCustomText()); lastlist = w->getGuiObject(); } void ComboBox::onSelect(int id, int hover) { COMBOBOX_PARENT::onSelect(id, hover); if (!hover) { selectEditor(); if (wantEnterOnSelect()) enter(); } } void ComboBox::enter() { GuiObject *content = getContent(); if (content != NULL) { if (wantTrapEdit()) { GuiObject *text = content->guiobject_findObject(combobox_getEditId()); if (text != NULL) { C_Edit t(*text); t.enter(); } } } } void ComboBox::selectEditor() { GuiObject *content = getContent(); if (content != NULL) { if (wantTrapEdit()) { GuiObject *text = content->guiobject_findObject(combobox_getEditId()); if (text != NULL) { C_Edit t(*text); t.selectAll(); } } } } int ComboBox::onAction(const wchar_t *action, const wchar_t *param, int x, int y, intptr_t p1, intptr_t p2, void *data, size_t datalen, ifc_window *source) { int r = COMBOBOX_PARENT::onAction(action, param, x, y, p1, p2, data, datalen, source); if (WCSCASEEQLSAFE(action, L"tempselectnotify")) { if (!disable_getselection) setText(param, 1); } return r; } void ComboBox::onEditKeyDown(int vk) { if (Std::keyDown(VK_CONTROL)) return; if (vk == VK_DOWN) { if (wantDownOpenList()) { if (!isListOpen()) openList(); else { if (wantTransferDownToList()) listDown(); } } } else if (vk == VK_UP) { if (wantTransferUpToList()) listUp(); } else if (vk == VK_HOME) { if (wantTransferHomeToList()) listHome(); } else if (vk == VK_END) { if (wantTransferEndToList()) listEnd(); } else if (vk == VK_PRIOR) { if (wantTransferPgUpToList()) listPageUp(); } else if (vk == VK_NEXT) { if (wantTransferPgDnToList()) listPageDown(); } else if (vk == VK_ESCAPE) { if (isListOpen()) closeList(); } else if (vk == VK_BACK || vk == VK_DELETE || vk == VK_LEFT || vk == VK_RIGHT) { if (wantCloseListOnChar()) { if (isListOpen()) closeList(); } } } void ComboBox::onEditKeyUp(int vk) { curtxt = getText(1); } void ComboBox::onEditEnter(const wchar_t *txt) { if (isListOpen()) { if (wantTransferEnterToList()) listSelect(); } } void ComboBox::onEditChar(int c) { if (wantCloseListOnChar()) { if (isListOpen()) closeList(); } } void ComboBox::listUp() { if (lastlist != NULL && isListOpen()) { sendAction(lastlist->guiobject_getRootWnd(), L"up"); } } void ComboBox::listDown() { if (lastlist != NULL && isListOpen()) { sendAction(lastlist->guiobject_getRootWnd(), L"down"); } } void ComboBox::listHome() { if (lastlist != NULL && isListOpen()) { sendAction(lastlist->guiobject_getRootWnd(), L"home"); } } void ComboBox::listEnd() { if (lastlist != NULL && isListOpen()) { sendAction(lastlist->guiobject_getRootWnd(), L"end"); } } void ComboBox::listPageUp() { if (lastlist != NULL && isListOpen()) { sendAction(lastlist->guiobject_getRootWnd(), L"pageup"); } } void ComboBox::listPageDown() { if (lastlist != NULL && isListOpen()) { sendAction(lastlist->guiobject_getRootWnd(), L"pagedown"); } } void ComboBox::listSelect() { if (lastlist != NULL && isListOpen()) { sendAction(lastlist->guiobject_getRootWnd(), L"select_current"); } } void ComboBox::onPreCloseList() { disable_getselection = 1; }