void PasteDataObject(IDataObject iData, string opPrefix, double objX, double objY) { if (iData.GetDataPresent(FigureSerialize.DDRAW_FIGURE_XML)) { undoRedoArea.Start(string.Format("{0} {1}", opPrefix, WbLocale.Figures)); List<Figure> figs = FigureSerialize.FromXml((string)iData.GetData(FigureSerialize.DDRAW_FIGURE_XML)); foreach (Figure f in figs) WorkBookUtils.PutInBounds(de, f); de.PasteAsSelectedFigures(figs); undoRedoArea.Commit(); } else if (iData.GetDataPresent(DataFormats.Text)) { undoRedoArea.Start(string.Format("{0} {1}", opPrefix, WbLocale.Text)); TextFigure f = new TextFigure(new DPoint(objX, objY), (string)iData.GetData(DataFormats.Text), 0); tsEngineState.DapText.ApplyPropertiesToFigure(f); de.PasteAsSelectedFigures(new List<Figure>(new Figure[] { f })); undoRedoArea.Commit(); } else if (iData.GetDataPresent(DataFormats.Bitmap)) { undoRedoArea.Start(string.Format("{0} {1}", opPrefix, WbLocale.Bitmap)); Bitmap bmp = (Bitmap)iData.GetData(DataFormats.Bitmap, true); byte[] imageData = WFHelper.ToImageData(bmp); BitmapFigure f = new BitmapFigure(new DRect(objX, objY, bmp.Width, bmp.Height), 0, imageData, "Clipboard.bmp"); de.PasteAsSelectedFigures(new List<Figure>(new Figure[] { f })); undoRedoArea.Commit(); } else if (iData.GetDataPresent(DataFormats.FileDrop)) { undoRedoArea.Start(string.Format("{0} {1}", opPrefix, WbLocale.File)); string path = ((string[])iData.GetData(DataFormats.FileDrop))[0]; if (IsImageFilePath(path)) { Figure f; if (IsWmfFilePath(path)) f = new MetafileFigure(new DPoint(objX, objY), 0, DDraw.DMetafileType.Wmf, WorkBookUtils.GetBytesFromFile(path), path); else { Bitmap bmp = (Bitmap)Bitmap.FromFile(path); f = new BitmapFigure(new DRect(objX, objY, bmp.Width, bmp.Height), 0, WFHelper.ToImageData(bmp), path); } de.PasteAsSelectedFigures(new List<Figure>(new Figure[] { f })); } else if (attachmentView1.CheckAttachmentExists(path)) { TextFigure f = new TextFigure(new DPoint(objX, objY), Path.GetFileName(path), 0); f.UserAttrs[Links.Link] = attachmentView1.AddAttachment(path); f.UserAttrs[Links.LinkType] = LinkType.Attachment.ToString(); tsEngineState.DapText.ApplyPropertiesToFigure(f); de.PasteAsSelectedFigures(new List<Figure>(new Figure[] { f })); } undoRedoArea.Commit(); } else if (iData.GetDataPresent(attachmentView1.GetType())) { undoRedoArea.Start(string.Format("{0} {1}", opPrefix, WbLocale.Attachment)); foreach (ListViewItem item in attachmentView1.SelectedItems) { if (IsImageFilePath(item.Text)) { using (MemoryStream ms = new MemoryStream(attachmentView1.GetAttachment(item.Text))) { Figure f ; if (IsWmfFilePath(item.Text)) f = new MetafileFigure(new DPoint(objX, objY), 0, DDraw.DMetafileType.Wmf, ms.ToArray(), item.Text); else { Bitmap bmp = (Bitmap)Bitmap.FromStream(ms); f = new BitmapFigure(new DRect(objX, objY, bmp.Width, bmp.Height), 0, WFHelper.ToImageData(bmp), item.Text); } de.PasteAsSelectedFigures(new List<Figure>(new Figure[] { f })); } } else { TextFigure f = new TextFigure(new DPoint(objX, objY), item.Text, 0); f.UserAttrs[Links.Link] = item.Text; f.UserAttrs[Links.LinkType] = LinkType.Attachment.ToString(); tsEngineState.DapText.ApplyPropertiesToFigure(f); de.PasteAsSelectedFigures(new List<Figure>(new Figure[] { f })); } } undoRedoArea.Commit(); } }
void AnnoTools_ImportAnnotationsArea(DBitmap bmp) { // progress form ProgressForm pf = new ProgressForm(); pf.Text = WbLocale.ImportingAreaAsImage; pf.Shown += delegate(object s, EventArgs e) { Application.DoEvents(); // import annotations undoRedoArea.Start(WbLocale.ImportAnnotations); BitmapFigure f = new BitmapFigure(new DRect(10, 10, bmp.Width, bmp.Height), 0, WFHelper.ToImageData(bmp), "annotations.png"); de.AddFigure(f); dvEditor.Update(); undoRedoArea.Commit(); // close dialog pf.Close(); }; pf.ShowDialog(); }
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; }