OSDN Git Service

5
[psychlops/silverlight.git] / dev5 / psychlops / extension / standard / widget.cs
1 using System;\r
2 using System.Windows;\r
3 using System.Windows.Controls;\r
4 using System.Windows.Documents;\r
5 using System.Windows.Input;\r
6 using System.Windows.Media;\r
7 using System.Windows.Media.Animation;\r
8 using System.Windows.Media.Imaging;\r
9 using System.Windows.Shapes;\r
10 using System.Windows.Browser;\r
11 using System.Windows.Data;\r
12 \r
13 \r
14 \r
15 \r
16 namespace Psychlops\r
17 {\r
18 \r
19         /*\r
20         class Widget : public Figure {\r
21         public:\r
22                 class Event {\r
23                 public:\r
24                 };\r
25         };\r
26          * */\r
27 \r
28         namespace Widgets\r
29         {\r
30                 /*\r
31                 struct Theme {\r
32                         static bool initialized__;\r
33                         static Image default_button, default_horiz_grad;\r
34                         enum TYPE_TAG { NORMAL, ALERT };\r
35                         public:\r
36                         Color normal_foreground[2], active_foreground[2];\r
37                         Color normal_background[2], active_background[2], over_background[2];\r
38                         Stroke normal_stroke[2], active_stroke[2];\r
39                         Image button_back, *horiz_grad;\r
40 \r
41                         static Theme current;\r
42                         static void initialize();\r
43                 };\r
44                  * */\r
45 \r
46                 /*\r
47                 class WidgetRect : Widget\r
48                 {\r
49                         protected:\r
50                         HumanInterfaceDevice::ButtonStateHolder mleft;\r
51                         bool pushed_;\r
52 \r
53                         public:\r
54                         //Theme *theme;\r
55                         //Theme::TYPE_TAG theme_type;\r
56                         public Rectangle area;\r
57                         public Letters label;\r
58 \r
59                         public abstract WidgetRect();\r
60                         public virtual const Point getDatum() const;\r
61                         public virtual WidgetRect& setDatum(const Point&);\r
62                         public virtual WidgetRect& centering(const Point&);\r
63                         public double getWidth() const;\r
64                         public double getHeight() const;\r
65                         public double getLeft() const;\r
66                         public double getTop() const;\r
67                         public double getRight() const;\r
68                         public double getBottom() const;\r
69                         public WidgetRect& alignLeft(const double lef);\r
70                         public WidgetRect& alignTop(const double to_);\r
71                         public WidgetRect& alignRight(const double rig);\r
72                         public WidgetRect& alignBottom(const double bot);\r
73 \r
74                         public virtual WidgetRect& set(double wid, double hei);\r
75                         public virtual WidgetRect& set(std::wstring name);\r
76                         public virtual WidgetRect& set(std::wstring name, double hei);\r
77                         public virtual WidgetRect& setLabel(std::wstring s);\r
78                         public virtual WidgetRect& draw(Drawable &target = *Drawable::prime);\r
79                         public bool pushed();\r
80                         public WidgetRect& pushThis();\r
81                 };\r
82                 */\r
83                 \r
84                 /*\r
85                 public class Slider\r
86                 {\r
87                         public string label;\r
88                         public Rectangle outer;\r
89                         public Rectangle inner;\r
90                         public Stroke outer_strk;\r
91 \r
92                         public Slider()\r
93                         {\r
94                                 set(0, 0);\r
95                         }\r
96                         public Slider(double width, double height)\r
97                         {\r
98                                 set(width, height);\r
99                         }\r
100                         public Slider set(double width, double height)\r
101                         {\r
102                                 outer = new Rectangle(width, height);\r
103                                 outer.fill = Color.gray;\r
104                                 inner = new Rectangle();\r
105                                 inner.fill = Color.blue;\r
106                                 outer_strk = new Stroke();\r
107                                 outer_strk.color = Color.white;\r
108                                 outer_strk.thick = 1;\r
109                                 return this;\r
110                         }\r
111                         public void checkClick()\r
112                         {\r
113                                 if (outer.include(Mouse.position))\r
114                                 {\r
115                                         outer.stroke = outer_strk;\r
116                                 }\r
117                         }\r
118                 }\r
119                  */\r
120 \r
121                 public class Button\r
122                 {\r
123                         public static Color bgcolor;\r
124 \r
125                         internal System.Windows.Controls.Button uibutton;\r
126 \r
127                         public Button(string l)\r
128                         {\r
129                                 uibutton = new System.Windows.Controls.Button();\r
130                                 uibutton.Content = l;\r
131                         }\r
132                         public void str(string l) { }\r
133                 }\r
134 \r
135                 public class Slider\r
136                 {\r
137                         public static Color bgcolor;\r
138 \r
139                         internal System.Windows.UIElement instance;\r
140                         internal System.Windows.Controls.Slider uislider;\r
141                         internal System.Windows.Controls.TextBlock uilabel;\r
142                         internal System.Windows.Controls.TextBox uibox;\r
143                         internal string label;\r
144                         internal Interval range;\r
145                         internal SelfDelegate get_;\r
146                         internal SelfDelegate set_;\r
147                         internal double retval, small_step, large_step;\r
148                         internal bool setted_;\r
149 \r
150                         static Slider()\r
151                         {\r
152                                 bgcolor.set(.5,.5, .5, .3);\r
153                         }\r
154 \r
155                         public Slider(string l, Interval r, double initialvalue)\r
156                         {\r
157                                 retval = initialvalue;\r
158                                 range = r;\r
159                                 label = l;\r
160                                 large_step = Double.NaN;\r
161                                 small_step = Double.NaN;\r
162                                 setted_ = false;\r
163                                 Psychlops.Widgets.Connector.stackSlider(this);\r
164                                 get_ = new SelfDelegate(get__);\r
165                                 set_ = new SelfDelegate(set__);\r
166                                 while (!setted_) { System.Threading.Thread.Sleep(10); }\r
167                         }\r
168                         public Slider(string l, Interval r, double step1, double step2)\r
169                         {\r
170                                 retval = r.begin.value;\r
171                                 range = r;\r
172                                 label = l;\r
173                                 large_step = Math.max(step1, step2);\r
174                                 small_step = Math.min(step1, step2);\r
175                                 setted_ = false;\r
176                                 Psychlops.Widgets.Connector.stackSlider(this);\r
177                                 get_ = new SelfDelegate(get__);\r
178                                 set_ = new SelfDelegate(set__);\r
179                                 while (!setted_) { System.Threading.Thread.Sleep(10); }\r
180                         }\r
181                         public static implicit operator double(Slider s)\r
182                         {\r
183                                 return s.value;\r
184                         }\r
185 \r
186                         public delegate void SelfDelegate(System.Windows.Controls.Slider s);\r
187                         public void get__(System.Windows.Controls.Slider s) { retval = s.Value; }\r
188                         public void set__(System.Windows.Controls.Slider s) { s.Value = retval; }\r
189 \r
190                         public double getValue()\r
191                         {\r
192                                 if (uislider != null) {\r
193                                         uislider.Dispatcher.BeginInvoke(get_, uislider);\r
194                                         return retval;\r
195                                 } else {\r
196                                         return 0;\r
197                                 }\r
198                         }\r
199                         public void setValue(double v)\r
200                         {\r
201                                 if (uislider != null)\r
202                                 {\r
203                                         retval = v;\r
204                                         uislider.Dispatcher.BeginInvoke(set_, uislider);\r
205                                 }\r
206                         }\r
207 \r
208                         public double value\r
209                         {\r
210                                 get { return getValue(); }\r
211                                 set { setValue(value); }\r
212                         }\r
213                         public bool changed { get; set; }\r
214                 }\r
215 \r
216 \r
217                 public class Browser\r
218                 {\r
219                         public class Element\r
220                         {\r
221                                 HtmlElement elem;\r
222                                 System.Object retval;\r
223 \r
224                                 public Element()\r
225                                 {\r
226                                         retval = 0;\r
227                                 }\r
228 \r
229                                 public static Element byID(string id_tag)\r
230                                 {\r
231                                         return getElementById(id_tag);\r
232                                 }\r
233                                 public static Element getElementById(string id_tag)\r
234                                 {\r
235                                         Element tmp = new Element();\r
236                                         Internal.Main.widgetStack.Dispatcher.BeginInvoke(new Connector.VoidString(tmp.getElementById__), id_tag);\r
237                                         return tmp;\r
238                                 }\r
239                                 void getElementById__(string id_tag)\r
240                                 {\r
241                                         elem = HtmlPage.Document.GetElementById(id_tag);\r
242                                 }\r
243 \r
244                                 public void setProperty(string name, System.Object value)\r
245                                 {\r
246                                         Internal.Main.widgetStack.Dispatcher.BeginInvoke(new Connector.VoidStringObject(setProperty__), name, value);\r
247                                 }\r
248                                 public void setProperty__(string name, System.Object value)\r
249                                 {\r
250                                         elem.SetProperty(name, value);\r
251                                 }\r
252 \r
253 \r
254                                 public static implicit operator double(Element i) { return i.getValueAsDouble(); }\r
255                                 public double getValueAsDouble()\r
256                                 {\r
257                                         double v = 0;\r
258                                         getProperty("value");\r
259                                         try\r
260                                         {\r
261                                                 v = double.Parse(retval.ToString());\r
262                                         }\r
263                                         catch (FormatException e)\r
264                                         {\r
265                                                 v = 0;\r
266                                         }\r
267                                         return v;\r
268                                 }\r
269 \r
270                                 public static implicit operator string(Element i) { return i.getProperty("value").ToString(); }\r
271                                 public System.Object getProperty(string name)\r
272                                 {\r
273                                         Internal.Main.widgetStack.Dispatcher.BeginInvoke(new Connector.VoidString(getProperty__), name);\r
274                                         return retval;\r
275                                 }\r
276                                 public void getProperty__(string name)\r
277                                 {\r
278                                         retval = elem.GetProperty(name);\r
279                                 }\r
280                         }\r
281                 }\r
282 \r
283 \r
284                 internal static partial class Connector\r
285                 {\r
286                         internal delegate void VoidString(string s);\r
287                         internal delegate void VoidStringObject(String s, System.Object o);\r
288 \r
289                         public class Double02fFormatter : IValueConverter\r
290                         {\r
291                                 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r
292                                 {\r
293                                         string formatString = parameter as string;\r
294                                         if (!string.IsNullOrEmpty(formatString))\r
295                                         {\r
296                                                 return string.Format(culture, formatString, value);\r
297                                         }\r
298                                         return string.Format("{0, -8:F}", value);\r
299                                 }\r
300                                 public object ConvertBack(object val, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r
301                                 {\r
302                                         string str = val.ToString();\r
303                                         double result;\r
304                                         var objCultureInfo = new System.Globalization.CultureInfo("en-US");\r
305                                         if (Double.TryParse(str, System.Globalization.NumberStyles.Number, objCultureInfo, out result))\r
306                                         {\r
307                                                 return result;\r
308                                         }\r
309                                         return val;\r
310                                 }\r
311                         }\r
312 \r
313                         delegate void StackSlider_(Slider s);\r
314                         internal static void stackSlider(Slider s)\r
315                         {\r
316                                 Internal.Main.widgetStack.Dispatcher.BeginInvoke(new StackSlider_(stackSlider__), s);\r
317                         }\r
318                         static void stackSlider__(Slider ss)\r
319                         {\r
320                                 var label = new System.Windows.Controls.TextBlock { Text = ss.label };\r
321                                 label.Foreground = Color.white;\r
322                                 System.Windows.Controls.Canvas.SetLeft(label, 3);\r
323                                 System.Windows.Controls.Canvas.SetTop(label, 3);\r
324                                 ss.uilabel = label;\r
325 \r
326                                 var holder = new System.Windows.Controls.Canvas { Width = 200, Height = 50 };\r
327                                 var val = new System.Windows.Controls.TextBox { Width = 100 };\r
328                                 System.Windows.Controls.Canvas.SetLeft(val, 100);\r
329                                 var slide = new System.Windows.Controls.Slider {\r
330                                                 Minimum = ss.range.begin.value, Maximum = ss.range.end.value,\r
331                                                 Name = ss.label,\r
332                                                 Value = ss.retval,\r
333                                                 Tag = ss, Width = 200,\r
334                                 };\r
335                                 if (!Double.IsNaN(ss.large_step))\r
336                                 {\r
337                                         slide.LargeChange = ss.large_step;\r
338                                 }\r
339                                 if (!Double.IsNaN(ss.small_step))\r
340                                 {\r
341                                         slide.SmallChange = ss.small_step;\r
342                                 }\r
343                                 slide.ValueChanged += slider_ValueChanged;\r
344                                 System.Windows.Controls.Canvas.SetTop(slide, label.ActualHeight - 3);\r
345                                 var b = new System.Windows.Data.Binding {\r
346                                                 Path = new PropertyPath("Value"),\r
347                                                 Mode = System.Windows.Data.BindingMode.TwoWay,\r
348                                                 Source = slide,\r
349                                                 Converter = new Double02fFormatter()\r
350                                 };\r
351                                 val.SetBinding(TextBox.TextProperty, b);\r
352                                 ss.uislider = slide;\r
353                                 ss.uibox = val;\r
354                                 val.Background = Color.null_color;\r
355                                 val.BorderBrush = Color.null_color;\r
356                                 val.Foreground = Color.white;\r
357                                 val.TextAlignment = TextAlignment.Right;\r
358 \r
359                                 holder.Background = Slider.bgcolor;\r
360 \r
361                                 holder.Children.Add(label);\r
362                                 holder.Children.Add(val);\r
363                                 holder.Children.Add(slide);\r
364                                 holder.Height = label.ActualHeight + slide.ActualHeight + val.ActualHeight + 15;\r
365                                 ss.instance = holder;\r
366                                 Internal.Main.widgetStack.Children.Add(ss.instance);\r
367                                 ss.setted_ = true;\r
368                         }\r
369                         private static void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)\r
370                         {\r
371                                 System.Windows.Controls.Slider sl = sender as System.Windows.Controls.Slider;\r
372                                 if (sl != null)\r
373                                 {\r
374                                         double rounded = Math.round((sl.Value - sl.Minimum) / sl.SmallChange) * sl.SmallChange;\r
375                                         if ((sl.Value - sl.Minimum) * sl.SmallChange != rounded)\r
376                                         {\r
377                                                 sl.Value = rounded;\r
378                                         }\r
379                                 }\r
380                         }\r
381                 }\r
382 \r
383         }\r
384 \r
385 }\r
386 \r