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 }