OSDN Git Service

da
[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                                 changed = true;\r
158                                 retval = initialvalue;\r
159                                 range = r;\r
160                                 label = l;\r
161                                 large_step = Double.NaN;\r
162                                 small_step = Double.NaN;\r
163                                 setted_ = false;\r
164                                 Psychlops.Widgets.Connector.stackSlider(this);\r
165                                 get_ = new SelfDelegate(get__);\r
166                                 set_ = new SelfDelegate(set__);\r
167                                 while (!setted_) { System.Threading.Thread.Sleep(10); }\r
168                         }\r
169                         public Slider(string l, Interval r, double step1, double step2)\r
170                         {\r
171                                 changed = true;\r
172                                 retval = r.begin.value;\r
173                                 range = r;\r
174                                 label = l;\r
175                                 large_step = Math.max(step1, step2);\r
176                                 small_step = Math.min(step1, step2);\r
177                                 setted_ = false;\r
178                                 Psychlops.Widgets.Connector.stackSlider(this);\r
179                                 get_ = new SelfDelegate(get__);\r
180                                 set_ = new SelfDelegate(set__);\r
181                                 while (!setted_) { System.Threading.Thread.Sleep(10); }\r
182                         }\r
183                         public static implicit operator double(Slider s)\r
184                         {\r
185                                 return s.value;\r
186                         }\r
187 \r
188                         public delegate void SelfDelegate(System.Windows.Controls.Slider s);\r
189                         public void get__(System.Windows.Controls.Slider s) { retval = s.Value; }\r
190                         public void set__(System.Windows.Controls.Slider s) { s.Value = retval; }\r
191 \r
192                         public double getValue()\r
193                         {\r
194                                 if (uislider != null) {\r
195                                         uislider.Dispatcher.BeginInvoke(get_, uislider);\r
196                                         return retval;\r
197                                 } else {\r
198                                         return 0;\r
199                                 }\r
200                         }\r
201                         public void setValue(double v)\r
202                         {\r
203                                 if (uislider != null)\r
204                                 {\r
205                                         retval = v;\r
206                                         uislider.Dispatcher.BeginInvoke(set_, uislider);\r
207                                 }\r
208                         }\r
209 \r
210                         public double value\r
211                         {\r
212                                 get { return getValue(); }\r
213                                 set { setValue(value); }\r
214                         }\r
215                         public bool changed { get; set; }\r
216                 }\r
217 \r
218 \r
219                 public class Browser\r
220                 {\r
221                         public class Element\r
222                         {\r
223                                 HtmlElement elem;\r
224                                 System.Object retval;\r
225 \r
226                                 public Element()\r
227                                 {\r
228                                         retval = 0;\r
229                                 }\r
230 \r
231                                 public static Element byID(string id_tag)\r
232                                 {\r
233                                         return getElementById(id_tag);\r
234                                 }\r
235                                 public static Element getElementById(string id_tag)\r
236                                 {\r
237                                         Element tmp = new Element();\r
238                                         Internal.Main.widgetStack.Dispatcher.BeginInvoke(new Connector.VoidString(tmp.getElementById__), id_tag);\r
239                                         return tmp;\r
240                                 }\r
241                                 void getElementById__(string id_tag)\r
242                                 {\r
243                                         elem = HtmlPage.Document.GetElementById(id_tag);\r
244                                 }\r
245 \r
246                                 public void setProperty(string name, System.Object value)\r
247                                 {\r
248                                         Internal.Main.widgetStack.Dispatcher.BeginInvoke(new Connector.VoidStringObject(setProperty__), name, value);\r
249                                 }\r
250                                 public void setProperty__(string name, System.Object value)\r
251                                 {\r
252                                         elem.SetProperty(name, value);\r
253                                 }\r
254 \r
255 \r
256                                 public static implicit operator double(Element i) { return i.getValueAsDouble(); }\r
257                                 public double getValueAsDouble()\r
258                                 {\r
259                                         double v = 0;\r
260                                         getProperty("value");\r
261                                         try\r
262                                         {\r
263                                                 v = double.Parse(retval.ToString());\r
264                                         }\r
265                                         catch (FormatException e)\r
266                                         {\r
267                                                 v = 0;\r
268                                         }\r
269                                         return v;\r
270                                 }\r
271 \r
272                                 public static implicit operator string(Element i) { return i.getProperty("value").ToString(); }\r
273                                 public System.Object getProperty(string name)\r
274                                 {\r
275                                         Internal.Main.widgetStack.Dispatcher.BeginInvoke(new Connector.VoidString(getProperty__), name);\r
276                                         return retval;\r
277                                 }\r
278                                 public void getProperty__(string name)\r
279                                 {\r
280                                         retval = elem.GetProperty(name);\r
281                                 }\r
282                         }\r
283                 }\r
284 \r
285 \r
286                 internal static partial class Connector\r
287                 {\r
288                         internal delegate void VoidString(string s);\r
289                         internal delegate void VoidStringObject(String s, System.Object o);\r
290 \r
291                         public class Double02fFormatter : IValueConverter\r
292                         {\r
293                                 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r
294                                 {\r
295                                         string formatString = parameter as string;\r
296                                         if (!string.IsNullOrEmpty(formatString))\r
297                                         {\r
298                                                 return string.Format(culture, formatString, value);\r
299                                         }\r
300                                         return string.Format("{0, -8:F}", value);\r
301                                 }\r
302                                 public object ConvertBack(object val, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r
303                                 {\r
304                                         string str = val.ToString();\r
305                                         double result;\r
306                                         var objCultureInfo = new System.Globalization.CultureInfo("en-US");\r
307                                         if (Double.TryParse(str, System.Globalization.NumberStyles.Number, objCultureInfo, out result))\r
308                                         {\r
309                                                 return result;\r
310                                         }\r
311                                         return val;\r
312                                 }\r
313                         }\r
314 \r
315                         delegate void StackSlider_(Slider s);\r
316                         internal static void stackSlider(Slider s)\r
317                         {\r
318                                 Internal.Main.widgetStack.Dispatcher.BeginInvoke(new StackSlider_(stackSlider__), s);\r
319                         }\r
320                         static void stackSlider__(Slider ss)\r
321                         {\r
322                                 var label = new System.Windows.Controls.TextBlock { Text = ss.label };\r
323                                 label.Foreground = Color.white;\r
324                                 System.Windows.Controls.Canvas.SetLeft(label, 3);\r
325                                 System.Windows.Controls.Canvas.SetTop(label, 3);\r
326                                 ss.uilabel = label;\r
327 \r
328                                 var holder = new System.Windows.Controls.Canvas { Width = 200, Height = 50 };\r
329                                 var val = new System.Windows.Controls.TextBox { Width = 100 };\r
330                                 System.Windows.Controls.Canvas.SetLeft(val, 100);\r
331                                 var slide = new System.Windows.Controls.Slider {\r
332                                                 Minimum = ss.range.begin.value, Maximum = ss.range.end.value,\r
333                                                 Name = ss.label,\r
334                                                 Value = ss.retval,\r
335                                                 Tag = ss, Width = 200,\r
336                                 };\r
337                                 if (!Double.IsNaN(ss.large_step))\r
338                                 {\r
339                                         slide.LargeChange = ss.large_step;\r
340                                 }\r
341                                 if (!Double.IsNaN(ss.small_step))\r
342                                 {\r
343                                         slide.SmallChange = ss.small_step;\r
344                                 }\r
345                                 slide.ValueChanged += slider_ValueChanged;\r
346                                 slide.ValueChanged += (sender, e) => { ss.changed = true; };\r
347                                 System.Windows.Controls.Canvas.SetTop(slide, label.ActualHeight - 3);\r
348                                 var b = new System.Windows.Data.Binding {\r
349                                                 Path = new PropertyPath("Value"),\r
350                                                 Mode = System.Windows.Data.BindingMode.TwoWay,\r
351                                                 Source = slide,\r
352                                                 Converter = new Double02fFormatter()\r
353                                 };\r
354                                 val.SetBinding(TextBox.TextProperty, b);\r
355                                 ss.uislider = slide;\r
356                                 ss.uibox = val;\r
357                                 val.Background = Color.null_color;\r
358                                 val.BorderBrush = Color.null_color;\r
359                                 val.Foreground = Color.white;\r
360                                 val.TextAlignment = TextAlignment.Right;\r
361 \r
362                                 holder.Background = Slider.bgcolor;\r
363 \r
364                                 holder.Children.Add(label);\r
365                                 holder.Children.Add(val);\r
366                                 holder.Children.Add(slide);\r
367                                 holder.Height = label.ActualHeight + slide.ActualHeight + val.ActualHeight + 15;\r
368                                 ss.instance = holder;\r
369                                 Internal.Main.widgetStack.Children.Add(ss.instance);\r
370                                 ss.setted_ = true;\r
371                         }\r
372                         private static void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)\r
373                         {\r
374                                 System.Windows.Controls.Slider sl = sender as System.Windows.Controls.Slider;\r
375                                 if (sl != null)\r
376                                 {\r
377                                         double rounded = Math.round((sl.Value - sl.Minimum) / sl.SmallChange) * sl.SmallChange;\r
378                                         if ((sl.Value - sl.Minimum) * sl.SmallChange != rounded)\r
379                                         {\r
380                                                 sl.Value = rounded;\r
381                                         }\r
382                                 }\r
383                         }\r
384                 }\r
385 \r
386         }\r
387 \r
388 }\r
389 \r