1
2 #include "studiox_includes.h"
3
4 #ifdef _DEBUG
5 #define new DEBUG_NEW
6 #endif
7
8
9
10 ///////////////////////////////////////////////////////////////////////////////
vscroll_service_provider()11 vscroll_service_provider::vscroll_service_provider()
12 {
13 }
14
15 ///////////////////////////////////////////////////////////////////////////////
GetVarDeclaration()16 CString vscroll_service_provider::GetVarDeclaration()
17 {
18 return CString("GX_VSCROLL_MEMBERS_DECLARE");
19 }
20
21 ///////////////////////////////////////////////////////////////////////////////
WriteExtendedProperties(screen_generator * gen,CString & prefix,widget_info * info)22 CString vscroll_service_provider::WriteExtendedProperties(screen_generator *gen, CString &prefix, widget_info *info)
23 {
24 CString out;
25 CString propname = prefix + info->app_name;
26
27 if (project_lib_version() >= 50302)
28 {
29 out.Format(_T("GX_SCROLLBAR_APPEARANCE %s_properties =\n")
30 _T("{\n")
31 _T(" %d, /* scroll width */\n")
32 _T(" %d, /* thumb width */\n")
33 _T(" %d, /* thumb travel min */\n")
34 _T(" %d, /* thumb travel max */\n")
35 _T(" %d, /* thumb border style */\n")
36 _T(" %s, /* scroll fill pixelmap */\n")
37 _T(" %s, /* scroll thumb pixelmap */\n")
38 _T(" %s, /* scroll up pixelmap */\n")
39 _T(" %s, /* scroll down pixelmap */\n")
40 _T(" %s, /* scroll thumb color */\n")
41 _T(" %s, /* scroll thumb border color */\n")
42 _T(" %s, /* scroll button color */\n")
43 _T("};\n"),
44 propname,
45 info->ewi.scroll.gx_scroll_width,
46 info->ewi.scroll.gx_scroll_thumb_width,
47 info->ewi.scroll.gx_scroll_thumb_travel_min,
48 info->ewi.scroll.gx_scroll_thumb_travel_max,
49 info->ewi.scroll.gx_scroll_thumb_border_style,
50 gen->GetPixelmapIdName(info->ewi.scroll.gx_scroll_fill_pixelmap),
51 gen->GetPixelmapIdName(info->ewi.scroll.gx_scroll_thumb_pixelmap),
52 gen->GetPixelmapIdName(info->ewi.scroll.gx_scroll_up_pixelmap),
53 gen->GetPixelmapIdName(info->ewi.scroll.gx_scroll_down_pixelmap),
54 gen->GetColorIdName(info->ewi.scroll.gx_scroll_thumb_color),
55 gen->GetColorIdName(info->ewi.scroll.gx_scroll_thumb_border_color),
56 gen->GetColorIdName(info->ewi.scroll.gx_scroll_button_color));
57 }
58 else
59 {
60 out.Format(_T("GX_SCROLLBAR_APPEARANCE %s_properties =\n")
61 _T("{\n")
62 _T(" %d, /* scroll width */\n")
63 _T(" %d, /* thumb width */\n")
64 _T(" %d, /* thumb travel min */\n")
65 _T(" %d, /* thumb travel max */\n")
66 _T(" %s, /* scroll fill pixelmap */\n")
67 _T(" %s, /* scroll thumb pixelmap */\n")
68 _T(" %s, /* scroll up pixelmap */\n")
69 _T(" %s, /* scroll down pixelmap */\n")
70 _T(" %s, /* scroll fill color */\n")
71 _T(" %s, /* scroll button color */\n")
72 _T("};\n"),
73 propname,
74 info->ewi.scroll.gx_scroll_width,
75 info->ewi.scroll.gx_scroll_thumb_width,
76 info->ewi.scroll.gx_scroll_thumb_travel_min,
77 info->ewi.scroll.gx_scroll_thumb_travel_max,
78 gen->GetPixelmapIdName(info->ewi.scroll.gx_scroll_fill_pixelmap),
79 gen->GetPixelmapIdName(info->ewi.scroll.gx_scroll_thumb_pixelmap),
80 gen->GetPixelmapIdName(info->ewi.scroll.gx_scroll_up_pixelmap),
81 gen->GetPixelmapIdName(info->ewi.scroll.gx_scroll_down_pixelmap),
82 gen->GetColorIdName(info->color_id[NORMAL_FILL_COLOR_INDEX]),
83 gen->GetColorIdName(info->ewi.scroll.gx_scroll_button_color));
84
85 }
86 return out;
87 }
88
89 ///////////////////////////////////////////////////////////////////////////////
GetCreateFromDefFunctionName()90 CString vscroll_service_provider::GetCreateFromDefFunctionName()
91 {
92 return CString("gx_studio_vertical_scrollbar_create");
93 }
94
95 ///////////////////////////////////////////////////////////////////////////////
GetCreateFromDefFunction(int version)96 CString vscroll_service_provider::GetCreateFromDefFunction(int version)
97 {
98 CString out;
99 MakeCreatePreamble("vertical_scrollbar", version, out);
100
101 out += "{\n"
102 " UINT status;\n"
103 " GX_SCROLLBAR *scroll = (GX_SCROLLBAR *) control_block;\n"
104 " GX_SCROLLBAR_APPEARANCE *appearance = (GX_SCROLLBAR_APPEARANCE *) info->properties;\n"
105 " status = gx_vertical_scrollbar_create(scroll, info->widget_name, parent, appearance, info->style);\n"
106 " return status;\n"
107 "}\n";
108
109 return out;
110 }
111
112
113 ///////////////////////////////////////////////////////////////////////////////
SaveToProject(xml_writer & writer,studiox_project * project,int display,widget_info * info)114 void vscroll_service_provider::SaveToProject(xml_writer &writer, studiox_project *project, int display, widget_info *info)
115 {
116 widget_service_provider::SaveToProject(writer, project, display, info);
117 WriteScrollbarAppearance(writer, project, display, info->ewi.scroll);
118 }
119
120 ///////////////////////////////////////////////////////////////////////////////
ReadFromProject(xml_reader & reader,studiox_project * project,int display,widget_info * info,ULONG valid_styles)121 void vscroll_service_provider::ReadFromProject(xml_reader &reader, studiox_project *project, int display, widget_info *info, ULONG valid_styles)
122 {
123 valid_styles |= GX_STYLE_TILE_BACKGROUND|GX_SCROLLBAR_RELATIVE_THUMB|GX_SCROLLBAR_END_BUTTONS|GX_SCROLLBAR_VERTICAL|GX_SCROLLBAR_HORIZONTAL;
124 widget_service_provider::ReadFromProject(reader, project, display, info, valid_styles);
125 ReadScrollbarAppearance(reader, project, display, info->ewi.scroll);
126
127 // copy the scroll appearance pixlemap ids into the normal slots so that the
128 // properties win can correctly detect changes.
129 info->pixelmap_id[SCROLL_FILL_PIXELMAP_INDEX] = info->ewi.scroll.gx_scroll_fill_pixelmap;
130 info->pixelmap_id[SCROLL_THUMB_PIXELMAP_INDEX] = info->ewi.scroll.gx_scroll_thumb_pixelmap;
131 info->pixelmap_id[SCROLL_UP_PIXELMAP_INDEX] = info->ewi.scroll.gx_scroll_up_pixelmap;
132 info->pixelmap_id[SCROLL_DOWN_PIXELMAP_INDEX] = info->ewi.scroll.gx_scroll_down_pixelmap;
133
134 if (project->mHeader.project_version < 54)
135 {
136 //selected fill color of scrollbar is start been used after project version 5.4.0
137 //set selected fill color to normal fill color incase broken old projects
138 info->color_id[SELECTED_FILL_COLOR_INDEX] = info->color_id[NORMAL_FILL_COLOR_INDEX];
139 }
140 }
141
142 ///////////////////////////////////////////////////////////////////////////////
CreateNewInstance(GX_WIDGET * parent)143 widget_info *vscroll_service_provider::CreateNewInstance(GX_WIDGET *parent)
144 {
145 GX_RECTANGLE size;
146
147 if (parent->gx_widget_type >= GX_TYPE_WINDOW)
148 {
149 gx_utility_rectangle_define(&size, 0, 0, 79, 23);
150 gx_utility_rectangle_center(&size, &parent->gx_widget_size);
151
152 GX_SCROLLBAR *scroll = new GX_SCROLLBAR;
153 gx_vertical_scrollbar_create(scroll, "vertical_scroll", parent, NULL,
154 GX_SCROLLBAR_VERTICAL | GX_SCROLLBAR_RELATIVE_THUMB | GX_SCROLLBAR_END_BUTTONS | GX_STYLE_ENABLED);
155 widget_info *info = InitWidgetInfo((GX_WIDGET *) scroll);
156
157 gx_system_scroll_appearance_get(GX_SCROLLBAR_VERTICAL, &info->ewi.scroll);
158 return info;
159 }
160 return NULL;
161 }
162
163 ///////////////////////////////////////////////////////////////////////////////
GenerateFromInfo(GX_WIDGET * parent,widget_info * info)164 GX_WIDGET *vscroll_service_provider::GenerateFromInfo(GX_WIDGET *parent, widget_info *info)
165 {
166 if (parent->gx_widget_type >= GX_TYPE_WINDOW)
167 {
168 GX_SCROLLBAR *scroll = new GX_SCROLLBAR;
169 gx_vertical_scrollbar_create(scroll,
170 (CHAR *) info->app_name.GetString(),
171 parent, &info->ewi.scroll, info->style);
172
173 gx_widget_fill_color_set((GX_WIDGET *) scroll,
174 info->color_id[NORMAL_FILL_COLOR_INDEX], info->color_id[SELECTED_FILL_COLOR_INDEX], info->color_id[DISABLED_FILL_COLOR_INDEX]);
175
176 return ((GX_WIDGET *) scroll);
177 }
178 return FALSE;
179 }
180
181 ///////////////////////////////////////////////////////////////////////////////
AssignPixelmap(widget_info * info,int index,GX_RESOURCE_ID pixmap_id)182 void vscroll_service_provider::AssignPixelmap(widget_info *info, int index,
183 GX_RESOURCE_ID pixmap_id)
184 {
185 GX_SCROLLBAR_APPEARANCE appearance = info->ewi.scroll;
186
187 switch(index)
188 {
189 case SCROLL_FILL_PIXELMAP_INDEX:
190 appearance.gx_scroll_fill_pixelmap = pixmap_id;
191 break;
192
193 case SCROLL_THUMB_PIXELMAP_INDEX:
194 appearance.gx_scroll_thumb_pixelmap = pixmap_id;
195 break;
196
197 case SCROLL_UP_PIXELMAP_INDEX:
198 appearance.gx_scroll_up_pixelmap = pixmap_id;
199 break;
200
201 case SCROLL_DOWN_PIXELMAP_INDEX:
202 appearance.gx_scroll_down_pixelmap = pixmap_id;
203 break;
204 }
205
206 // Even though the scrollbar keeps the pixelmap ids in it's own
207 // appearance structure, we need to save the pixelmap ID into the standard
208 // widget_info slot so that we can detect assignment changes
209 // correctly
210 info->pixelmap_id[index] = pixmap_id;
211
212 // and now we need to replacethe scrollbar
213 widget_factory::ReplaceScrollbar(info, &appearance);
214 }
215
216 ///////////////////////////////////////////////////////////////////////////////
ReadScrollbarAppearance(xml_reader & reader,studiox_project * project,int display,GX_SCROLLBAR_APPEARANCE & appear)217 void vscroll_service_provider::ReadScrollbarAppearance(xml_reader &reader, studiox_project *project, int display, GX_SCROLLBAR_APPEARANCE &appear)
218 {
219 USHORT style;
220
221 reader.ReadValue("scroll_width", appear.gx_scroll_width);
222 reader.ReadValue("thumb_width", appear.gx_scroll_thumb_width);
223 reader.ReadValue("thumb_travel_min", appear.gx_scroll_thumb_travel_min);
224 reader.ReadValue("thumb_travel_max", appear.gx_scroll_thumb_travel_max);
225
226 reader.ReadUShort("thumb_border_style", style, GX_STYLE_BORDER_THIN);
227 appear.gx_scroll_thumb_border_style = (GX_UBYTE) style;
228
229 appear.gx_scroll_fill_pixelmap = widget_service_provider::ReadPixelmapId(reader, project, display, "scroll_fill_pixelmap");
230 appear.gx_scroll_thumb_pixelmap = widget_service_provider::ReadPixelmapId(reader, project, display, "scroll_thumb_pixelmap");
231 appear.gx_scroll_up_pixelmap = widget_service_provider::ReadPixelmapId(reader, project, display, "scroll_up_pixelmap");
232 appear.gx_scroll_down_pixelmap = widget_service_provider::ReadPixelmapId(reader, project, display, "scroll_down_pixelmap");
233 appear.gx_scroll_thumb_color = widget_service_provider::ReadColorId(reader, project, display, "scroll_thumb_color");
234 appear.gx_scroll_thumb_border_color = widget_service_provider::ReadColorId(reader, project, display, "scroll_thumb_border_color");
235 appear.gx_scroll_button_color = widget_service_provider::ReadColorId(reader, project, display, "scroll_button_color");
236
237 if (appear.gx_scroll_width < 0 || appear.gx_scroll_width > 1000)
238 {
239 appear.gx_scroll_width = 20;
240 }
241
242 if (appear.gx_scroll_thumb_travel_min < 0)
243 {
244 appear.gx_scroll_thumb_travel_min = 20;
245 }
246
247 if (appear.gx_scroll_thumb_travel_max < 0)
248 {
249 appear.gx_scroll_thumb_travel_max = 20;
250 }
251
252 if (appear.gx_scroll_thumb_width < 0)
253 {
254 appear.gx_scroll_thumb_width = 18;
255 }
256 if (appear.gx_scroll_thumb_travel_min < 0)
257 {
258 appear.gx_scroll_thumb_travel_min = 20;
259 }
260 if (appear.gx_scroll_thumb_travel_max < 0)
261 {
262 appear.gx_scroll_thumb_travel_max = 20;
263 }
264 }
265
266
267 ///////////////////////////////////////////////////////////////////////////////
WriteScrollbarAppearance(xml_writer & writer,studiox_project * project,int display,GX_SCROLLBAR_APPEARANCE & appear)268 void vscroll_service_provider::WriteScrollbarAppearance(xml_writer &writer, studiox_project *project, int display, GX_SCROLLBAR_APPEARANCE &appear)
269 {
270 writer.WriteInt("scroll_width", appear.gx_scroll_width);
271 writer.WriteInt("thumb_width", appear.gx_scroll_thumb_width);
272 writer.WriteInt("thumb_travel_min", appear.gx_scroll_thumb_travel_min);
273 writer.WriteInt("thumb_travel_max", appear.gx_scroll_thumb_travel_max);
274
275 writer.WriteUnsigned("thumb_border_style", appear.gx_scroll_thumb_border_style);
276
277 widget_service_provider::WritePixelmapId(writer, project, display, "scroll_fill_pixelmap", appear.gx_scroll_fill_pixelmap);
278 widget_service_provider::WritePixelmapId(writer, project, display, "scroll_thumb_pixelmap", appear.gx_scroll_thumb_pixelmap);
279 widget_service_provider::WritePixelmapId(writer, project, display, "scroll_up_pixelmap", appear.gx_scroll_up_pixelmap);
280 widget_service_provider::WritePixelmapId(writer, project, display, "scroll_down_pixelmap", appear.gx_scroll_down_pixelmap);
281 widget_service_provider::WriteColorId(writer, project, display, "scroll_thumb_color", appear.gx_scroll_thumb_color);
282 widget_service_provider::WriteColorId(writer, project, display, "scroll_thumb_border_color", appear.gx_scroll_thumb_border_color);
283 widget_service_provider::WriteColorId(writer, project, display, "scroll_button_color", appear.gx_scroll_button_color);
284 }
285
286 ///////////////////////////////////////////////////////////////////////////////
Autosize(widget_info * info)287 void vscroll_service_provider::Autosize(widget_info *info)
288 {
289 CheckResizeToPixelmap(info, RESIZE_MODE_WIDTH);
290 }