Mercurial > dwindows
comparison dw.hpp @ 2892:387a6242fa77
C++: Add the Container and Filesystem classes, plus the base for Tree.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Thu, 22 Dec 2022 23:51:04 +0000 |
parents | 185c1e9674a1 |
children | 5ae86b395927 |
comparison
equal
deleted
inserted
replaced
2891:185c1e9674a1 | 2892:387a6242fa77 |
---|---|
937 void SetEditable(int state) { dw_mle_set_editable(hwnd, state); } | 937 void SetEditable(int state) { dw_mle_set_editable(hwnd, state); } |
938 void SetVisible(int line) { dw_mle_set_visible(hwnd, line); } | 938 void SetVisible(int line) { dw_mle_set_visible(hwnd, line); } |
939 void SetWordWrap(int state) { dw_mle_set_word_wrap(hwnd, state); } | 939 void SetWordWrap(int state) { dw_mle_set_word_wrap(hwnd, state); } |
940 }; | 940 }; |
941 | 941 |
942 class ObjectView : virtual public Widget | |
943 { | |
944 private: | |
945 bool ItemSelectConnected, ItemContextConnected; | |
946 #ifdef DW_CPP11 | |
947 std::function<int(HTREEITEM, char *, void *)> _ConnectItemSelect; | |
948 std::function<int(char *, int, int, void *)> _ConnectItemContext; | |
949 #else | |
950 int (*_ConnectItemSelect)(HTREEITEM, char *, void *); | |
951 int (*_ConnectItemContext)(char *, int, int, void *); | |
952 #endif | |
953 static int _OnItemSelect(HWND window, HTREEITEM item, char *text, void *itemdata, void *data) { | |
954 if(reinterpret_cast<ObjectView *>(data)->_ConnectItemSelect) | |
955 return reinterpret_cast<ObjectView *>(data)->_ConnectItemSelect(item, text, itemdata); | |
956 return reinterpret_cast<ObjectView *>(data)->OnItemSelect(item, text, itemdata); | |
957 } | |
958 static int _OnItemContext(HWND window, char *text, int x, int y, void *itemdata, void *data) { | |
959 if(reinterpret_cast<ObjectView *>(data)->_ConnectItemContext) | |
960 return reinterpret_cast<ObjectView *>(data)->_ConnectItemContext(text, x, y, itemdata); | |
961 return reinterpret_cast<ObjectView *>(data)->OnItemContext(text, x, y, itemdata); | |
962 } | |
963 protected: | |
964 void SetupObjectView() { | |
965 if(IsOverridden(ObjectView::OnItemSelect, this)) { | |
966 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this); | |
967 ItemSelectConnected = true; | |
968 } | |
969 if(IsOverridden(ObjectView::OnItemContext, this)) { | |
970 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_CONTEXT, DW_SIGNAL_FUNC(_OnItemContext), this); | |
971 ItemContextConnected = true; | |
972 } | |
973 } | |
974 // Our signal handler functions to be overriden... | |
975 // If they are not overridden and an event is generated, remove the unused handler | |
976 virtual int OnItemSelect(HTREEITEM item, char *text, void *itemdata) { | |
977 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_ITEM_SELECT); | |
978 ItemSelectConnected = false; | |
979 return FALSE; | |
980 } | |
981 virtual int OnItemContext(char *text, int x, int y, void *itemdata) { | |
982 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_ITEM_CONTEXT); | |
983 ItemContextConnected = false; | |
984 return FALSE; | |
985 } | |
986 public: | |
987 #ifdef DW_CPP11 | |
988 void ConnectItemSelect(std::function<int(HTREEITEM, char *, void *)> userfunc) | |
989 #else | |
990 void ConnectItemSelect(int (*userfunc)(HTREEITEM, char *, void *)) | |
991 #endif | |
992 { | |
993 _ConnectItemSelect = userfunc; | |
994 if(!ItemSelectConnected) { | |
995 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this); | |
996 ItemSelectConnected = true; | |
997 } | |
998 } | |
999 #ifdef DW_CPP11 | |
1000 void ConnectItemContext(std::function<int(char *, int, int, void *)> userfunc) | |
1001 #else | |
1002 void ConnectItemContext(int (*userfunc)(char *, int, int, void *)) | |
1003 #endif | |
1004 { | |
1005 _ConnectItemContext = userfunc; | |
1006 if(!ItemContextConnected) { | |
1007 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_CONTEXT, DW_SIGNAL_FUNC(_OnItemContext), this); | |
1008 ItemContextConnected = true; | |
1009 } | |
1010 } | |
1011 }; | |
1012 | |
1013 class Containers : virtual public Focusable, virtual public ObjectView | |
1014 { | |
1015 private: | |
1016 bool ItemEnterConnected, ColumnClickConnected; | |
1017 #ifdef DW_CPP11 | |
1018 std::function<int(char *)> _ConnectItemEnter; | |
1019 std::function<int(int)> _ConnectColumnClick; | |
1020 #else | |
1021 int (*_ConnectItemEnter)(HTREEITEM, char *, void *); | |
1022 int (*_ConnectColumnClick)(char *, int, int, void *); | |
1023 #endif | |
1024 static int _OnItemEnter(HWND window, char *text, void *data) { | |
1025 if(reinterpret_cast<Containers *>(data)->_ConnectItemEnter) | |
1026 return reinterpret_cast<Containers *>(data)->_ConnectItemEnter(text); | |
1027 return reinterpret_cast<Containers *>(data)->OnItemEnter(text); | |
1028 } | |
1029 static int _OnColumnClick(HWND window, int column, void *data) { | |
1030 if(reinterpret_cast<Containers *>(data)->_ConnectColumnClick) | |
1031 return reinterpret_cast<Containers *>(data)->_ConnectColumnClick(column); | |
1032 return reinterpret_cast<Containers *>(data)->OnColumnClick(column); | |
1033 } | |
1034 protected: | |
1035 void *allocpointer; | |
1036 int allocrowcount; | |
1037 void SetupContainer() { | |
1038 if(IsOverridden(Container::OnItemEnter, this)) { | |
1039 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this); | |
1040 ItemEnterConnected = true; | |
1041 } | |
1042 if(IsOverridden(Container::OnColumnClick, this)) { | |
1043 dw_signal_connect(hwnd, DW_SIGNAL_COLUMN_CLICK, DW_SIGNAL_FUNC(_OnColumnClick), this); | |
1044 ColumnClickConnected = true; | |
1045 } | |
1046 } | |
1047 // Our signal handler functions to be overriden... | |
1048 // If they are not overridden and an event is generated, remove the unused handler | |
1049 virtual int OnItemEnter(char *text) { | |
1050 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_ITEM_ENTER); | |
1051 ItemEnterConnected = false; | |
1052 return FALSE; | |
1053 } | |
1054 virtual int OnColumnClick(int column) { | |
1055 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_COLUMN_CLICK); | |
1056 ColumnClickConnected = false; | |
1057 return FALSE; | |
1058 } | |
1059 public: | |
1060 // User functions | |
1061 void Alloc(int rowcount) { allocpointer = dw_container_alloc(hwnd, rowcount); allocrowcount = rowcount; } | |
1062 void ChangeRowTitle(int row, char *title) { dw_container_change_row_title(hwnd, row, title); } | |
1063 void Clear(int redraw) { dw_container_clear(hwnd, redraw); } | |
1064 void Clear() { dw_container_clear(hwnd, TRUE); } | |
1065 void Cursor(const char *text) { dw_container_cursor(hwnd, text); } | |
1066 void Cursor(void *data) { dw_container_cursor_by_data(hwnd, data); } | |
1067 void Delete(int rowcount) { dw_container_delete(hwnd, rowcount); } | |
1068 void DeleteRow(char *title) { dw_container_delete_row(hwnd, title); } | |
1069 void DeleteRow(void *data) { dw_container_delete_row_by_data(hwnd, data); } | |
1070 void Insert() { dw_container_insert(hwnd, allocpointer, allocrowcount); } | |
1071 void Optimize() { dw_container_optimize(hwnd); } | |
1072 char *QueryNext(unsigned long flags) { return dw_container_query_next(hwnd, flags); } | |
1073 char *QueryStart(unsigned long flags) { return dw_container_query_start(hwnd, flags); } | |
1074 void Scroll(int direction, long rows) { dw_container_scroll(hwnd, direction, rows); } | |
1075 void SetColumnWidth(int column, int width) { dw_container_set_column_width(hwnd, column, width); } | |
1076 void SetRowData(int row, void *data) { dw_container_set_row_data(allocpointer, row, data); } | |
1077 void SetRowTitle(int row, const char *title) { dw_container_set_row_title(allocpointer, row, title); } | |
1078 void SetStripe(unsigned long oddcolor, unsigned long evencolor) { dw_container_set_stripe(hwnd, oddcolor, evencolor); } | |
1079 #ifdef DW_CPP11 | |
1080 void ConnectItemEnter(std::function<int(char *)> userfunc) | |
1081 #else | |
1082 void ConnectItemEnter(int (*userfunc)(char *)) | |
1083 #endif | |
1084 { | |
1085 _ConnectItemEnter = userfunc; | |
1086 if(!ItemEnterConnected) { | |
1087 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this); | |
1088 ItemEnterConnected = true; | |
1089 } | |
1090 } | |
1091 #ifdef DW_CPP11 | |
1092 void ConnecColumnClick(std::function<int(int)> userfunc) | |
1093 #else | |
1094 void ConnectColumnClick(int (*userfunc)(int)) | |
1095 #endif | |
1096 { | |
1097 _ConnectColumnClick = userfunc; | |
1098 if(!ColumnClickConnected) { | |
1099 dw_signal_connect(hwnd, DW_SIGNAL_COLUMN_CLICK, DW_SIGNAL_FUNC(_OnColumnClick), this); | |
1100 ColumnClickConnected = true; | |
1101 } | |
1102 } | |
1103 }; | |
1104 | |
1105 class Container : public Containers | |
1106 { | |
1107 public: | |
1108 // Constructors | |
1109 Container(unsigned long id, int multi) { SetHWND(dw_container_new(id, multi)); SetupObjectView(); SetupContainer(); } | |
1110 Container(int multi) { SetHWND(dw_container_new(0, multi)); SetupObjectView(); SetupContainer(); } | |
1111 Container() { SetHWND(dw_container_new(0, FALSE)); SetupObjectView(); SetupContainer(); } | |
1112 | |
1113 // User functions | |
1114 int Setup(unsigned long *flags, char **titles, int count, int separator) { return dw_container_setup(hwnd, flags, titles, count, separator); } | |
1115 void ChangeItem(int column, int row, void *data) { dw_container_change_item(hwnd, column, row, data); } | |
1116 int GetColumnType(int column) { return dw_container_get_column_type(hwnd, column); } | |
1117 void SetItem(int column, int row, void *data) { dw_container_set_item(hwnd, allocpointer, column, row, data); } | |
1118 }; | |
1119 | |
1120 class Filesystem : public Containers | |
1121 { | |
1122 public: | |
1123 // Constructors | |
1124 Filesystem(unsigned long id, int multi) { SetHWND(dw_container_new(id, multi)); SetupObjectView(); SetupContainer(); } | |
1125 Filesystem(int multi) { SetHWND(dw_container_new(0, multi)); SetupObjectView(); SetupContainer(); } | |
1126 Filesystem() { SetHWND(dw_container_new(0, FALSE)); SetupObjectView(); SetupContainer(); } | |
1127 | |
1128 // User functions | |
1129 int Setup(unsigned long *flags, char **titles, int count) { return dw_filesystem_setup(hwnd, flags, titles, count); } | |
1130 void ChangeFile(int row, const char *filename, HICN icon) { dw_filesystem_change_file(hwnd, row, filename, icon); } | |
1131 void ChangeItem(int column, int row, void *data) { dw_filesystem_change_item(hwnd, column, row, data); } | |
1132 int GetColumnType(int column) { return dw_filesystem_get_column_type(hwnd, column); } | |
1133 void SetColumnTitle(const char *title) { dw_filesystem_set_column_title(hwnd, title); } | |
1134 void SetFile(int row, const char *filename, HICN icon) { dw_filesystem_set_file(hwnd, allocpointer, row, filename, icon); } | |
1135 void SetItem(int column, int row, void *data) { dw_filesystem_set_item(hwnd, allocpointer, column, row, data); } | |
1136 }; | |
1137 | |
942 class App | 1138 class App |
943 { | 1139 { |
944 protected: | 1140 protected: |
945 App() { } | 1141 App() { } |
946 static App *_app; | 1142 static App *_app; |