annotate foosdk/sdk/foobar2000/helpers/ui_element_helpers.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "stdafx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #if FOOBAR2000_TARGET_VERSION >= 79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "ui_element_helpers.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include <libPPUI/IDataObjectUtils.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include "atl-misc.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 namespace ui_element_helpers {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 ui_element_instance_ptr instantiate_dummy(HWND p_parent,ui_element_config::ptr cfg, ui_element_instance_callback_ptr p_callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 service_ptr_t<ui_element> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 if (!find(ptr,pfc::guid_null)) uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 return ptr->instantiate(p_parent,cfg,p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 ui_element_instance_ptr instantiate(HWND p_parent,ui_element_config::ptr cfg,ui_element_instance_callback_ptr p_callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 service_ptr_t<ui_element> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 if (!find(ptr,cfg->get_guid())) throw exception_io_data("UI Element Not Found");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 auto ret = ptr->instantiate(p_parent,cfg,p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 if (ret.is_empty()) throw std::runtime_error("Null UI Element returned");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 } catch(std::exception const & e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 console::complain("UI Element instantiation failure",e);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 return instantiate_dummy(p_parent,cfg,p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 ui_element_instance_ptr update(ui_element_instance_ptr p_element,HWND p_parent,ui_element_config::ptr cfg,ui_element_instance_callback_ptr p_callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 if (p_element.is_valid() && cfg->get_guid() == p_element->get_guid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 p_element->set_configuration(cfg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 return p_element;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 return instantiate(p_parent,cfg,p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 bool find(service_ptr_t<ui_element> & p_out,const GUID & p_guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 return service_by_guid(p_out,p_guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 ui_element_children_enumerator_ptr enumerate_children(ui_element_config::ptr cfg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 service_ptr_t<ui_element> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 if (!find(ptr,cfg->get_guid())) return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 return ptr->enumerate_children(cfg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 } catch(exception_io_data const &) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 void ui_element_helpers::replace_with_new_element(ui_element_instance_ptr & p_item,const GUID & p_guid,HWND p_parent,ui_element_instance_callback_ptr p_callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 ui_element_config::ptr cfg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 if (p_item.is_empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 service_ptr_t<ui_element> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 if (!find(ptr,p_guid)) throw exception_io_data("UI Element Not Found");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 cfg = ptr->get_default_configuration();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 p_item = ptr->instantiate(p_parent,cfg,p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 } else if (p_item->get_guid() != p_guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 service_ptr_t<ui_element> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 if (!find(ptr,p_guid)) throw exception_io_data("UI Element Not Found");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 cfg = ptr->import(p_item->get_configuration());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 //p_item.release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 if (cfg.is_empty()) cfg = ptr->get_default_configuration();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 p_item = ptr->instantiate(p_parent,cfg,p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 } catch(std::exception const & e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 console::complain("UI Element instantiation failure",e);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 if (cfg.is_empty()) cfg = ui_element_config::g_create_empty();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 p_item = instantiate_dummy(p_parent,cfg,p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 class CMyMenuSelectionReceiver : public CMenuSelectionReceiver {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 CMyMenuSelectionReceiver(HWND p_wnd,ui_element_helpers::ui_element_edit_tools * p_host,ui_element_instance_ptr p_client,unsigned p_client_id,unsigned p_host_base,unsigned p_client_base) : CMenuSelectionReceiver(p_wnd), m_host(p_host), m_client(p_client), m_client_id(p_client_id), m_host_base(p_host_base), m_client_base(p_client_base) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 bool QueryHint(unsigned p_id,pfc::string_base & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 if (p_id >= m_client_base) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 return m_client->edit_mode_context_menu_get_description(p_id,m_client_base,p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 } else if (p_id >= m_host_base) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 return m_host->host_edit_mode_context_menu_get_description(m_client_id,p_id,m_host_base,p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 const char * msg = ui_element_helpers::ui_element_edit_tools::description_from_menu_command(p_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 if (msg == NULL) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 p_out = msg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 ui_element_helpers::ui_element_edit_tools * const m_host;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 ui_element_instance_ptr const m_client;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 unsigned const m_client_id,m_host_base,m_client_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 namespace HostHelperIDs {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 enum {ID_LABEL, ID_REPLACE = 1, ID_ADD_NEW, ID_CUT, ID_COPY, ID_PASTE, ID_CUSTOM_BASE};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 void ui_element_helpers::ui_element_edit_tools::standard_edit_context_menu(LPARAM p_point,ui_element_instance_ptr p_item,unsigned p_id,HWND p_parent) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 using namespace HostHelperIDs;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 static_api_ptr_t<ui_element_common_methods> api;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 POINT pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 bool fromkeyboard = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 if (p_point == (LPARAM)(-1)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 fromkeyboard = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 if (!p_item->edit_mode_context_menu_get_focus_point(pt)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 CRect rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 WIN32_OP_D( CWindow(p_item->get_wnd()).GetWindowRect(&rect) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 pt = rect.CenterPoint();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 pt.x = (short)LOWORD(p_point);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 pt.y = (short)HIWORD(p_point);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 CMenu menu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 WIN32_OP_D( menu.CreatePopupMenu() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 const GUID sourceItemGuid = p_item->get_guid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 const bool sourceItemEmpty = !!(sourceItemGuid == pfc::guid_null);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 if (sourceItemEmpty) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 WIN32_OP_D( menu.AppendMenu(MF_STRING,ID_ADD_NEW,TEXT(AddNewUIElementCommand)) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 WIN32_OP_D( menu.SetMenuDefaultItem(ID_ADD_NEW) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 service_ptr_t<ui_element> elem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 pfc::string8 name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 if (find(elem,sourceItemGuid)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 elem->get_name(name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 name = "<unknown element>";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 WIN32_OP_D( menu.AppendMenu(MF_STRING | MF_DISABLED,ID_LABEL,pfc::stringcvt::string_os_from_utf8(name)) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 WIN32_OP_D( menu.AppendMenu(MF_SEPARATOR,(UINT_PTR)0,TEXT("")) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 WIN32_OP_D( menu.AppendMenu(MF_STRING,ID_REPLACE,TEXT(ReplaceUIElementCommand)) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 WIN32_OP_D( menu.AppendMenu(MF_SEPARATOR,(UINT_PTR)0,TEXT("")) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 //menu.AppendMenu(MF_STRING,ID_REPLACE,TEXT(ReplaceUIElementCommand));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 WIN32_OP_D( menu.AppendMenu(MF_STRING | (sourceItemEmpty ? (MF_DISABLED|MF_GRAYED) : 0),ID_CUT,TEXT(CutUIElementCommand)) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 WIN32_OP_D( menu.AppendMenu(MF_STRING | (sourceItemEmpty ? (MF_DISABLED|MF_GRAYED) : 0),ID_COPY,TEXT(CopyUIElementCommand)) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 WIN32_OP_D( menu.AppendMenu(MF_STRING | (api->is_paste_available() ? 0 : (MF_DISABLED|MF_GRAYED)),ID_PASTE,TEXT(PasteUIElementCommand)) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 unsigned custom_walk = ID_CUSTOM_BASE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 unsigned custom_base_host = ~0, custom_base_client = ~0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 if (host_edit_mode_context_menu_test(p_id,pt,fromkeyboard)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 menu.AppendMenu(MF_SEPARATOR,(UINT_PTR)0,TEXT(""));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 custom_base_host = custom_walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 host_edit_mode_context_menu_build(p_id,pt,fromkeyboard,menu,custom_walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 if (p_item->edit_mode_context_menu_test(pt,fromkeyboard)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 WIN32_OP_D( menu.AppendMenu(MF_SEPARATOR,(UINT_PTR)0,TEXT("")) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 custom_base_client = custom_walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 p_item->edit_mode_context_menu_build(pt,fromkeyboard,menu,custom_walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 int cmd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 ui_element_highlight_scope s(p_item->get_wnd());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 CMyMenuSelectionReceiver receiver(p_parent,this,p_item,p_id,custom_base_host,custom_base_client);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 cmd = menu.TrackPopupMenu(TPM_RIGHTBUTTON|TPM_NONOTIFY|TPM_RETURNCMD,pt.x,pt.y,receiver);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 if (cmd > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 switch(cmd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 case ID_REPLACE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 case ID_ADD_NEW:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 replace_dialog(p_item->get_wnd(),p_id,p_item->get_guid());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 case ID_COPY:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 api->copy(p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 case ID_CUT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 api->copy(p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 p_item.release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 host_replace_element(p_id,pfc::guid_null);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 case ID_PASTE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 host_paste_element(p_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 if ((unsigned)cmd >= custom_base_client) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 p_item->edit_mode_context_menu_command(pt,fromkeyboard,(unsigned)cmd,custom_base_client);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 } else if ((unsigned)cmd >= custom_base_host) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 host_edit_mode_context_menu_command(p_id,pt,fromkeyboard,(unsigned)cmd,custom_base_host);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 void ui_element_helpers::ui_element_edit_tools::on_elem_replace(unsigned p_id, GUID const & newGuid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 m_replace_dialog.Detach();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 if ( newGuid != pfc::guid_null ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 host_replace_element(p_id,newGuid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 void ui_element_helpers::ui_element_edit_tools::replace_dialog(HWND p_parent,unsigned p_id,const GUID & p_current) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 _release_replace_dialog();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 auto ks = m_killSwitch;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 auto reply = ui_element_replace_dialog_notify::create( [=] ( GUID newGUID ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 if ( !*ks) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 on_elem_replace(p_id, newGUID );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 } );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 HWND dlg = ui_element_common_methods_v3::get()->replace_element_dialog_start( p_parent, p_current, reply );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 m_replace_dialog.Attach( dlg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 const char * ui_element_helpers::ui_element_edit_tools::description_from_menu_command(unsigned p_id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 using namespace HostHelperIDs;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 switch(p_id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 case ID_REPLACE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 return ReplaceUIElementDescription;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 case ID_CUT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 return CutUIElementDescription;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 case ID_COPY:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 return CopyUIElementDescription;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 case ID_PASTE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 return PasteUIElementDescription;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 case ID_ADD_NEW:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 return AddNewUIElementDescription;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 void ui_element_helpers::ui_element_edit_tools::_release_replace_dialog() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 if (m_replace_dialog.m_hWnd != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 m_replace_dialog.DestroyWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 bool ui_element_helpers::enforce_min_max_info(CWindow p_window,ui_element_min_max_info const & p_info) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 CRect rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 WIN32_OP_D( p_window.GetWindowRect(&rect) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 t_uint32 width = (t_uint32) rect.Width();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 t_uint32 height = (t_uint32) rect.Height();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 bool changed = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 if (width < p_info.m_min_width) {changed = true; width = p_info.m_min_width;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 if (width > p_info.m_max_width) {changed = true; width = p_info.m_max_width;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 if (height < p_info.m_min_height) {changed = true; height = p_info.m_min_height;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 if (height > p_info.m_max_height) {changed = true; height = p_info.m_max_height;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 if (changed) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 WIN32_OP_D( p_window.SetWindowPos(NULL,0,0,width,height,SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 return changed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 void ui_element_helpers::handle_WM_GETMINMAXINFO(LPARAM p_lp,const ui_element_min_max_info & p_myinfo) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 MINMAXINFO * info = reinterpret_cast<MINMAXINFO *>(p_lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 /*console::formatter() << "handle_WM_GETMINMAXINFO";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 console::formatter() << p_myinfo.m_min_width << ", " << p_myinfo.m_min_height;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 console::formatter() << info->ptMinTrackSize << ", " << info->ptMaxTrackSize;*/
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 pfc::max_acc(info->ptMinTrackSize.x,(LONG)p_myinfo.m_min_width);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 pfc::max_acc(info->ptMinTrackSize.y,(LONG)p_myinfo.m_min_height);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 if ((LONG) p_myinfo.m_max_width >= 0) pfc::min_acc(info->ptMaxTrackSize.x, (LONG) p_myinfo.m_max_width);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 if ((LONG) p_myinfo.m_max_height >= 0) pfc::min_acc(info->ptMaxTrackSize.y, (LONG) p_myinfo.m_max_height);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 //console::formatter() << info->ptMinTrackSize << ", " << info->ptMaxTrackSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 bool ui_element_helpers::ui_element_edit_tools::host_paste_element(unsigned p_id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 pfc::com_ptr_t<IDataObject> obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 if (SUCCEEDED(OleGetClipboard(obj.receive_ptr()))) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 DWORD effect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 ui_element_config::ptr cfg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 if (static_api_ptr_t<ui_element_common_methods>()->parse_dataobject(obj,cfg,effect)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 host_replace_element(p_id, cfg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 IDataObjectUtils::SetDataObjectDWORD(obj, RegisterClipboardFormat(CFSTR_PERFORMEDDROPEFFECT), effect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 IDataObjectUtils::PasteSucceeded(obj,effect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 if (effect == DROPEFFECT_MOVE) OleSetClipboard(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 bool ui_element_helpers::recurse_for_elem_config(ui_element_config::ptr root, ui_element_config::ptr & out, const GUID & toFind) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 const GUID rootID = root->get_guid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 if (rootID == toFind) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 out = root; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 ui_element::ptr elem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 if (!find(elem, rootID)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 ui_element_children_enumerator::ptr children;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 children = elem->enumerate_children(root);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 } catch(exception_io_data const &) {return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 if (children.is_empty()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 const t_size childrenTotal = children->get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 for(t_size walk = 0; walk < childrenTotal; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 if (recurse_for_elem_config(children->get_item(walk), out, toFind)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 bool ui_element_helpers::ui_element_instance_host_base::grabTopPriorityVisibleChild(ui_element_instance_ptr & out, t_size & outWhich, double & outPriority) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 double bestPriority = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 ui_element_instance_ptr best;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 t_size bestWhich = ~0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 const t_size count = host_get_children_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 for (t_size walk = 0; walk < count; ++walk) if (this->host_is_child_visible(walk) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 ui_element_instance_ptr item = host_get_child(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 if (item.is_valid() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 const double priority = item->get_focus_priority();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 if (best.is_empty() || childPriorityCompare(walk, priority, bestPriority)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 best = item; bestPriority = priority; bestWhich = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 if (best.is_empty()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 out = best; outPriority = bestPriority; outWhich = bestWhich; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 bool ui_element_helpers::ui_element_instance_host_base::grabTopPriorityChild(ui_element_instance_ptr & out, t_size & outWhich, double & outPriority, const GUID & subclass) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 double bestPriority = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 ui_element_instance_ptr best;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 t_size bestWhich = ~0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 const t_size count = host_get_children_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 for (t_size walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 ui_element_instance_ptr item = host_get_child(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 if (item.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 double priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 if (item->get_focus_priority_subclass(priority, subclass)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 if (best.is_empty() || childPriorityCompare(walk, priority, bestPriority)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 best = item; bestPriority = priority; bestWhich = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 if (best.is_empty()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 out = best; outPriority = bestPriority; outWhich = bestWhich; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 void ui_element_instance_standard_context_menu(service_ptr_t<ui_element_instance> p_elem, LPARAM p_pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 CPoint pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 bool fromKeyboard;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 if (p_pt == -1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 fromKeyboard = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 if (!p_elem->edit_mode_context_menu_get_focus_point(pt)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 CRect rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 WIN32_OP_D(GetWindowRect(p_elem->get_wnd(), rc));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 pt = rc.CenterPoint();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 fromKeyboard = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 pt = p_pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 if (p_elem->edit_mode_context_menu_test(pt, fromKeyboard)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 const unsigned idBase = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 CMenu menu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 WIN32_OP_D(menu.CreatePopupMenu());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 p_elem->edit_mode_context_menu_build(pt, fromKeyboard, menu, idBase);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 int cmd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 CMenuSelectionReceiver_UiElement receiver(p_elem, idBase);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 cmd = menu.TrackPopupMenu(TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pt.x, pt.y, receiver);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 if (cmd > 0) p_elem->edit_mode_context_menu_command(pt, fromKeyboard, cmd, idBase);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 void ui_element_instance_standard_context_menu_eh(service_ptr_t<ui_element_instance> p_elem, LPARAM p_pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 ui_element_instance_standard_context_menu(p_elem, p_pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 } catch (std::exception const & e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 console::complain("Context menu failure", e);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 #endif // FOOBAR2000_TARGET_VERSION >= 79