public MainWindow() : base("MainWindow") { // create the table and pack into the window Table table = new Table(2, 3, false); Add(table); // Initialze DGraphics GTKHelper.InitGraphics(); // create DViewerControl and attach to table GTKViewerControl dvc = new GTKViewerControl(); table.Attach(dvc, 0, 1, 0, 1, AttachOptions.Fill | AttachOptions.Expand, AttachOptions.Fill | AttachOptions.Expand, 0, 0); // create the scrollbars and pack into the table VScrollbar vsb = new VScrollbar(null); table.Attach(vsb, 1, 2, 0, 1, AttachOptions.Fill|AttachOptions.Shrink, AttachOptions.Fill|AttachOptions.Shrink, 0, 0); HScrollbar hsb = new HScrollbar(null); table.Attach(hsb, 0, 1, 1, 2, AttachOptions.Fill|AttachOptions.Shrink, AttachOptions.Fill|AttachOptions.Shrink, 0, 0); // tell the scrollbars to use the DViewerControl widget's adjustments vsb.Adjustment = dvc.Vadjustment; hsb.Adjustment = dvc.Hadjustment; // create debuging label l = new Label("debug"); table.Attach(l, 0, 1, 2, 3, AttachOptions.Fill|AttachOptions.Shrink, AttachOptions.Fill|AttachOptions.Shrink, 0, 0); // create DViewer and DEngine dv = new GTKViewer(dvc); dv.EditFigures = true; #if DEBUG dv.DebugMessage += new DebugMessageHandler(DebugMessage); #endif de = new DEngine(null); de.AddViewer(dv); de.HsmState = DHsmState.Select; #if DEBUG de.DebugMessage += new DebugMessageHandler(DebugMessage); #endif de.ContextClick += new ClickHandler(de_ContextClick); // add figures de.UndoRedo.Start("add initial figures"); de.AddFigure(new EllipseFigure(new DRect(20, 30, 100, 100), 0)); RectFigure rf = new RectFigure(new DRect(10, 20, 100, 100), 0); rf.Alpha = 0.7; rf.Fill = new DColor(80, 80, 80); de.AddFigure(rf); TextFigure tf = new TextFigure(new DPoint(150, 30), "hello", 0); tf.FontName = "Arial"; tf.Underline = true; tf.Strikethrough = true; tf.Italics = true; de.AddFigure(tf); // compositing figure Figure f = new CompositedExampleFigure(); f.Rect = new DRect(20, 150, 50, 50); de.AddFigure(f); // clock (IEditable) figure f = new ClockFigure(); f.Rect = new DRect(200, 200, 100, 100); de.AddFigure(f); // triangle figure f = new TriangleFigure(); f.Rect = new DRect(200, 100, 100, 100); ((TriangleFigure)f).StrokeWidth = 10; de.AddFigure(f); // line figure f = new LineFigure2(new DPoint(100, 100), new DPoint(200, 200)); ((LineFigure2)f).StrokeStyle = DStrokeStyle.DashDot; ((LineFigure2)f).StrokeWidth = 5; de.AddFigure(f); de.UndoRedo.Commit(); de.UndoRedo.ClearHistory(); // resize window Resize(400, 300); }
Figure SvgElementToFigure(SvgElement e) { Figure f = null; if (e is SvgRectElement || e is SvgImageElement) { if (e.Attributes.ContainsKey("x") && e.Attributes.ContainsKey("y") && e.Attributes.ContainsKey("width") && e.Attributes.ContainsKey("height")) { SvgLength X = new SvgLength((string)e.Attributes["x"]); SvgLength Y = new SvgLength((string)e.Attributes["y"]); SvgLength Width = new SvgLength((string)e.Attributes["width"]); SvgLength Height = new SvgLength((string)e.Attributes["height"]); DRect r = new DRect(X.Value, Y.Value, Width.Value, Height.Value); if (e is SvgRectElement) f = new RectFigure(r, 0); else if (e is SvgImageElement) { SvgImageElement e2 = (SvgImageElement)e; byte[] imgData = Read(e2.Href); if (imgData != null) f = new BitmapFigure(r, 0, imgData, Path.GetFileName(e2.Href)); } } } else if (e is SvgEllipseElement) { SvgEllipseElement e2 = (SvgEllipseElement)e; if (e2.Attributes.ContainsKey("cx") && e2.Attributes.ContainsKey("cy") && e2.Attributes.ContainsKey("rx") && e2.Attributes.ContainsKey("ry")) { e2.CX = new SvgLength((string)e2.Attributes["cx"]); e2.CY = new SvgLength((string)e2.Attributes["cy"]); e2.RX = new SvgLength((string)e2.Attributes["rx"]); e2.RY = new SvgLength((string)e2.Attributes["ry"]); f = new EllipseFigure(new DRect(e2.CX.Value - e2.RX.Value, e2.CY.Value - e2.RY.Value, e2.RX.Value * 2, e2.RY.Value * 2), 0); } } else if (e is SvgPathElement) { SvgPathElement e2 = (SvgPathElement)e; if (e2.Attributes.ContainsKey("d")) { e2.D = new SvgPath((string)e2.Attributes["d"]); // treat all paths as polygons for the moment DPoints pts = new DPoints(); for (int i = 0; i < e2.D.Count; i++) { PathSeg s = e2.D[i]; if ((s.Type == SvgPathSegType.SVG_SEGTYPE_MOVETO || s.Type == SvgPathSegType.SVG_SEGTYPE_LINETO) && s.Abs) pts.Add(new DPoint(s.Data[0], s.Data[1])); } if (pts.Count >= 3) { DRect r = pts.Bounds(); foreach (DPoint pt in pts) { pt.X = (pt.X - r.Left) / r.Width; pt.Y = (pt.Y - r.Top) / r.Height; } f = new PolygonFigure(pts); f.Rect = r; } } } else if (e is SvgPolylineElement) { SvgPolylineElement e2 = (SvgPolylineElement)e; if (e2.Attributes.ContainsKey("points")) f = new PolylineFigure(DPoints.FromString((string)e2.Attributes["points"])); } else if (e is SvgLineElement) { SvgLineElement e2 = (SvgLineElement)e; if (e2.Attributes.ContainsKey("x1") && e2.Attributes.ContainsKey("y1") && e2.Attributes.ContainsKey("x2") && e2.Attributes.ContainsKey("y2")) { e2.X1 = new SvgLength((string)e2.Attributes["x1"]); e2.Y1 = new SvgLength((string)e2.Attributes["y1"]); e2.X2 = new SvgLength((string)e2.Attributes["x2"]); e2.Y2 = new SvgLength((string)e2.Attributes["y2"]); f = new LineFigure2(new DPoint(e2.X1.Value, e2.Y1.Value), new DPoint(e2.X2.Value, e2.Y2.Value)); } } else if (e is SvgGroupElement) { SvgGroupElement e2 = (SvgGroupElement)e; f = new GroupFigure(); GroupFigure gf = (GroupFigure)f; foreach (SvgElement childEle in e2.Children) { Figure childFig = SvgElementToFigure(childEle); if (childFig != null) gf.ChildFigures.Add(childFig); } if (gf.ChildFigures.Count > 0) gf.ChildFigures = gf.ChildFigures; else f = null; } else if (e is SvgTextElement) { double fontSize; string fontFamily; DColor fill; bool bold, italic, underline; string text = ExtractText(e, 0, out fontSize, out fontFamily, out fill, out bold, out italic, out underline); while (text.EndsWith("\n")) text = text.Substring(0, text.Length - 1); if (text != null) { DPoint translation = GetSvgElementTranslation((SvgTextElement)e); f = new TextFigure(translation, text, 0); ((TextFigure)f).FontSize = fontSize; ((TextFigure)f).FontName = fontFamily; ((TextFigure)f).Fill = fill; ((TextFigure)f).Bold = bold; ((TextFigure)f).Italics = italic; ((TextFigure)f).Underline = underline; // set wrap threshold const double editWidthMod = 1.435; if (((SvgTextElement)e).Attributes.ContainsKey(NBTextEditWidth)) { string editwidth = (string)((SvgTextElement)e).Attributes[NBTextEditWidth]; if (editwidth != null && editwidth.Length != 0) { ((TextFigure)f).WrapThreshold = double.Parse(editwidth) * editWidthMod; ((TextFigure)f).WrapFontSize = ((TextFigure)f).FontSize; ((TextFigure)f).WrapText = true; } } // scale DPoint scale = GetSvgElementScale((SvgTextElement)e); const double scaleMod = 0.694; f.Width *= scale.X * scaleMod; f.Height *= scale.Y * scaleMod; } } if (f != null) { if (e is SvgStyledTransformedElement) f.Rotation = GetSvgElementRotation((SvgStyledTransformedElement)e); if (f is IFillable && e.Attributes.ContainsKey("fill")) ((IFillable)f).Fill = DColor.FromHtml((string)e.Attributes["fill"]); if (f is IStrokeable) { if (e.Attributes.ContainsKey("stroke")) ((IStrokeable)f).Stroke = DColor.FromHtml((string)e.Attributes["stroke"]); if (e.Attributes.ContainsKey("stroke-width")) ((IStrokeable)f).StrokeWidth = double.Parse((string)e.Attributes["stroke-width"]); if (e.Attributes.ContainsKey("stroke-dasharray")) ((IStrokeable)f).StrokeStyle = NotebookDashArrayToStrokeStyle((string)e.Attributes["stroke-dasharray"]); } if (f is IMarkable) { if (e.Attributes.ContainsKey("marker-start")) ((IMarkable)f).StartMarker = NotebookMarkerToDMarker((string)e.Attributes["marker-start"]); if (e.Attributes.ContainsKey("marker-end")) ((IMarkable)f).EndMarker = NotebookMarkerToDMarker((string)e.Attributes["marker-end"]); } if (f is IAlphaBlendable && e.Attributes.ContainsKey("opacity")) ((IAlphaBlendable)f).Alpha = double.Parse((string)e.Attributes["opacity"]); applyLink(f, e); applyLock(f, e); } return f; }