OSDN Git Service

5
[psychlops/silverlight.git] / dev5 / psychlops / extension / standard / widget.cs
diff --git a/dev5/psychlops/extension/standard/widget.cs b/dev5/psychlops/extension/standard/widget.cs
new file mode 100644 (file)
index 0000000..51d6087
--- /dev/null
@@ -0,0 +1,386 @@
+using System;\r
+using System.Windows;\r
+using System.Windows.Controls;\r
+using System.Windows.Documents;\r
+using System.Windows.Input;\r
+using System.Windows.Media;\r
+using System.Windows.Media.Animation;\r
+using System.Windows.Media.Imaging;\r
+using System.Windows.Shapes;\r
+using System.Windows.Browser;\r
+using System.Windows.Data;\r
+\r
+\r
+\r
+\r
+namespace Psychlops\r
+{\r
+\r
+       /*\r
+       class Widget : public Figure {\r
+       public:\r
+               class Event {\r
+               public:\r
+               };\r
+       };\r
+        * */\r
+\r
+       namespace Widgets\r
+       {\r
+               /*\r
+               struct Theme {\r
+                       static bool initialized__;\r
+                       static Image default_button, default_horiz_grad;\r
+                       enum TYPE_TAG { NORMAL, ALERT };\r
+                       public:\r
+                       Color normal_foreground[2], active_foreground[2];\r
+                       Color normal_background[2], active_background[2], over_background[2];\r
+                       Stroke normal_stroke[2], active_stroke[2];\r
+                       Image button_back, *horiz_grad;\r
+\r
+                       static Theme current;\r
+                       static void initialize();\r
+               };\r
+                * */\r
+\r
+               /*\r
+               class WidgetRect : Widget\r
+               {\r
+                       protected:\r
+                       HumanInterfaceDevice::ButtonStateHolder mleft;\r
+                       bool pushed_;\r
+\r
+                       public:\r
+                       //Theme *theme;\r
+                       //Theme::TYPE_TAG theme_type;\r
+                       public Rectangle area;\r
+                       public Letters label;\r
+\r
+                       public abstract WidgetRect();\r
+                       public virtual const Point getDatum() const;\r
+                       public virtual WidgetRect& setDatum(const Point&);\r
+                       public virtual WidgetRect& centering(const Point&);\r
+                       public double getWidth() const;\r
+                       public double getHeight() const;\r
+                       public double getLeft() const;\r
+                       public double getTop() const;\r
+                       public double getRight() const;\r
+                       public double getBottom() const;\r
+                       public WidgetRect& alignLeft(const double lef);\r
+                       public WidgetRect& alignTop(const double to_);\r
+                       public WidgetRect& alignRight(const double rig);\r
+                       public WidgetRect& alignBottom(const double bot);\r
+\r
+                       public virtual WidgetRect& set(double wid, double hei);\r
+                       public virtual WidgetRect& set(std::wstring name);\r
+                       public virtual WidgetRect& set(std::wstring name, double hei);\r
+                       public virtual WidgetRect& setLabel(std::wstring s);\r
+                       public virtual WidgetRect& draw(Drawable &target = *Drawable::prime);\r
+                       public bool pushed();\r
+                       public WidgetRect& pushThis();\r
+               };\r
+               */\r
+               \r
+               /*\r
+               public class Slider\r
+               {\r
+                       public string label;\r
+                       public Rectangle outer;\r
+                       public Rectangle inner;\r
+                       public Stroke outer_strk;\r
+\r
+                       public Slider()\r
+                       {\r
+                               set(0, 0);\r
+                       }\r
+                       public Slider(double width, double height)\r
+                       {\r
+                               set(width, height);\r
+                       }\r
+                       public Slider set(double width, double height)\r
+                       {\r
+                               outer = new Rectangle(width, height);\r
+                               outer.fill = Color.gray;\r
+                               inner = new Rectangle();\r
+                               inner.fill = Color.blue;\r
+                               outer_strk = new Stroke();\r
+                               outer_strk.color = Color.white;\r
+                               outer_strk.thick = 1;\r
+                               return this;\r
+                       }\r
+                       public void checkClick()\r
+                       {\r
+                               if (outer.include(Mouse.position))\r
+                               {\r
+                                       outer.stroke = outer_strk;\r
+                               }\r
+                       }\r
+               }\r
+                */\r
+\r
+               public class Button\r
+               {\r
+                       public static Color bgcolor;\r
+\r
+                       internal System.Windows.Controls.Button uibutton;\r
+\r
+                       public Button(string l)\r
+                       {\r
+                               uibutton = new System.Windows.Controls.Button();\r
+                               uibutton.Content = l;\r
+                       }\r
+                       public void str(string l) { }\r
+               }\r
+\r
+               public class Slider\r
+               {\r
+                       public static Color bgcolor;\r
+\r
+                       internal System.Windows.UIElement instance;\r
+                       internal System.Windows.Controls.Slider uislider;\r
+                       internal System.Windows.Controls.TextBlock uilabel;\r
+                       internal System.Windows.Controls.TextBox uibox;\r
+                       internal string label;\r
+                       internal Interval range;\r
+                       internal SelfDelegate get_;\r
+                       internal SelfDelegate set_;\r
+                       internal double retval, small_step, large_step;\r
+                       internal bool setted_;\r
+\r
+                       static Slider()\r
+                       {\r
+                               bgcolor.set(.5,.5, .5, .3);\r
+                       }\r
+\r
+                       public Slider(string l, Interval r, double initialvalue)\r
+                       {\r
+                               retval = initialvalue;\r
+                               range = r;\r
+                               label = l;\r
+                               large_step = Double.NaN;\r
+                               small_step = Double.NaN;\r
+                               setted_ = false;\r
+                               Psychlops.Widgets.Connector.stackSlider(this);\r
+                               get_ = new SelfDelegate(get__);\r
+                               set_ = new SelfDelegate(set__);\r
+                               while (!setted_) { System.Threading.Thread.Sleep(10); }\r
+                       }\r
+                       public Slider(string l, Interval r, double step1, double step2)\r
+                       {\r
+                               retval = r.begin.value;\r
+                               range = r;\r
+                               label = l;\r
+                               large_step = Math.max(step1, step2);\r
+                               small_step = Math.min(step1, step2);\r
+                               setted_ = false;\r
+                               Psychlops.Widgets.Connector.stackSlider(this);\r
+                               get_ = new SelfDelegate(get__);\r
+                               set_ = new SelfDelegate(set__);\r
+                               while (!setted_) { System.Threading.Thread.Sleep(10); }\r
+                       }\r
+                       public static implicit operator double(Slider s)\r
+                       {\r
+                               return s.value;\r
+                       }\r
+\r
+                       public delegate void SelfDelegate(System.Windows.Controls.Slider s);\r
+                       public void get__(System.Windows.Controls.Slider s) { retval = s.Value; }\r
+                       public void set__(System.Windows.Controls.Slider s) { s.Value = retval; }\r
+\r
+                       public double getValue()\r
+                       {\r
+                               if (uislider != null) {\r
+                                       uislider.Dispatcher.BeginInvoke(get_, uislider);\r
+                                       return retval;\r
+                               } else {\r
+                                       return 0;\r
+                               }\r
+                       }\r
+                       public void setValue(double v)\r
+                       {\r
+                               if (uislider != null)\r
+                               {\r
+                                       retval = v;\r
+                                       uislider.Dispatcher.BeginInvoke(set_, uislider);\r
+                               }\r
+                       }\r
+\r
+                       public double value\r
+                       {\r
+                               get { return getValue(); }\r
+                               set { setValue(value); }\r
+                       }\r
+                       public bool changed { get; set; }\r
+               }\r
+\r
+\r
+               public class Browser\r
+               {\r
+                       public class Element\r
+                       {\r
+                               HtmlElement elem;\r
+                               System.Object retval;\r
+\r
+                               public Element()\r
+                               {\r
+                                       retval = 0;\r
+                               }\r
+\r
+                               public static Element byID(string id_tag)\r
+                               {\r
+                                       return getElementById(id_tag);\r
+                               }\r
+                               public static Element getElementById(string id_tag)\r
+                               {\r
+                                       Element tmp = new Element();\r
+                                       Internal.Main.widgetStack.Dispatcher.BeginInvoke(new Connector.VoidString(tmp.getElementById__), id_tag);\r
+                                       return tmp;\r
+                               }\r
+                               void getElementById__(string id_tag)\r
+                               {\r
+                                       elem = HtmlPage.Document.GetElementById(id_tag);\r
+                               }\r
+\r
+                               public void setProperty(string name, System.Object value)\r
+                               {\r
+                                       Internal.Main.widgetStack.Dispatcher.BeginInvoke(new Connector.VoidStringObject(setProperty__), name, value);\r
+                               }\r
+                               public void setProperty__(string name, System.Object value)\r
+                               {\r
+                                       elem.SetProperty(name, value);\r
+                               }\r
+\r
+\r
+                               public static implicit operator double(Element i) { return i.getValueAsDouble(); }\r
+                               public double getValueAsDouble()\r
+                               {\r
+                                       double v = 0;\r
+                                       getProperty("value");\r
+                                       try\r
+                                       {\r
+                                               v = double.Parse(retval.ToString());\r
+                                       }\r
+                                       catch (FormatException e)\r
+                                       {\r
+                                               v = 0;\r
+                                       }\r
+                                       return v;\r
+                               }\r
+\r
+                               public static implicit operator string(Element i) { return i.getProperty("value").ToString(); }\r
+                               public System.Object getProperty(string name)\r
+                               {\r
+                                       Internal.Main.widgetStack.Dispatcher.BeginInvoke(new Connector.VoidString(getProperty__), name);\r
+                                       return retval;\r
+                               }\r
+                               public void getProperty__(string name)\r
+                               {\r
+                                       retval = elem.GetProperty(name);\r
+                               }\r
+                       }\r
+               }\r
+\r
+\r
+               internal static partial class Connector\r
+               {\r
+                       internal delegate void VoidString(string s);\r
+                       internal delegate void VoidStringObject(String s, System.Object o);\r
+\r
+                       public class Double02fFormatter : IValueConverter\r
+                       {\r
+                               public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r
+                               {\r
+                                       string formatString = parameter as string;\r
+                                       if (!string.IsNullOrEmpty(formatString))\r
+                                       {\r
+                                               return string.Format(culture, formatString, value);\r
+                                       }\r
+                                       return string.Format("{0, -8:F}", value);\r
+                               }\r
+                               public object ConvertBack(object val, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r
+                               {\r
+                                       string str = val.ToString();\r
+                                       double result;\r
+                                       var objCultureInfo = new System.Globalization.CultureInfo("en-US");\r
+                                       if (Double.TryParse(str, System.Globalization.NumberStyles.Number, objCultureInfo, out result))\r
+                                       {\r
+                                               return result;\r
+                                       }\r
+                                       return val;\r
+                               }\r
+                       }\r
+\r
+                       delegate void StackSlider_(Slider s);\r
+                       internal static void stackSlider(Slider s)\r
+                       {\r
+                               Internal.Main.widgetStack.Dispatcher.BeginInvoke(new StackSlider_(stackSlider__), s);\r
+                       }\r
+                       static void stackSlider__(Slider ss)\r
+                       {\r
+                               var label = new System.Windows.Controls.TextBlock { Text = ss.label };\r
+                               label.Foreground = Color.white;\r
+                               System.Windows.Controls.Canvas.SetLeft(label, 3);\r
+                               System.Windows.Controls.Canvas.SetTop(label, 3);\r
+                               ss.uilabel = label;\r
+\r
+                               var holder = new System.Windows.Controls.Canvas { Width = 200, Height = 50 };\r
+                               var val = new System.Windows.Controls.TextBox { Width = 100 };\r
+                               System.Windows.Controls.Canvas.SetLeft(val, 100);\r
+                               var slide = new System.Windows.Controls.Slider {\r
+                                               Minimum = ss.range.begin.value, Maximum = ss.range.end.value,\r
+                                               Name = ss.label,\r
+                                               Value = ss.retval,\r
+                                               Tag = ss, Width = 200,\r
+                               };\r
+                               if (!Double.IsNaN(ss.large_step))\r
+                               {\r
+                                       slide.LargeChange = ss.large_step;\r
+                               }\r
+                               if (!Double.IsNaN(ss.small_step))\r
+                               {\r
+                                       slide.SmallChange = ss.small_step;\r
+                               }\r
+                               slide.ValueChanged += slider_ValueChanged;\r
+                               System.Windows.Controls.Canvas.SetTop(slide, label.ActualHeight - 3);\r
+                               var b = new System.Windows.Data.Binding {\r
+                                               Path = new PropertyPath("Value"),\r
+                                               Mode = System.Windows.Data.BindingMode.TwoWay,\r
+                                               Source = slide,\r
+                                               Converter = new Double02fFormatter()\r
+                               };\r
+                               val.SetBinding(TextBox.TextProperty, b);\r
+                               ss.uislider = slide;\r
+                               ss.uibox = val;\r
+                               val.Background = Color.null_color;\r
+                               val.BorderBrush = Color.null_color;\r
+                               val.Foreground = Color.white;\r
+                               val.TextAlignment = TextAlignment.Right;\r
+\r
+                               holder.Background = Slider.bgcolor;\r
+\r
+                               holder.Children.Add(label);\r
+                               holder.Children.Add(val);\r
+                               holder.Children.Add(slide);\r
+                               holder.Height = label.ActualHeight + slide.ActualHeight + val.ActualHeight + 15;\r
+                               ss.instance = holder;\r
+                               Internal.Main.widgetStack.Children.Add(ss.instance);\r
+                               ss.setted_ = true;\r
+                       }\r
+                       private static void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)\r
+                       {\r
+                               System.Windows.Controls.Slider sl = sender as System.Windows.Controls.Slider;\r
+                               if (sl != null)\r
+                               {\r
+                                       double rounded = Math.round((sl.Value - sl.Minimum) / sl.SmallChange) * sl.SmallChange;\r
+                                       if ((sl.Value - sl.Minimum) * sl.SmallChange != rounded)\r
+                                       {\r
+                                               sl.Value = rounded;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+       }\r
+\r
+}\r
+\r