private void LoadInkIntoTarget(InkSheetModel sheet, Ink extracted, out int[] ids) { Ink restored = extracted; using (Synchronizer.Lock(sheet.Ink.Strokes.SyncRoot)) { ids = new int[restored.Strokes.Count]; for (int i = 0; i < ids.Length; i++) { Stroke stroke = restored.Strokes[i]; // Remove any strokes that have the same remote Id as the new one. // Unfortunately, because the InkSheetUndoService cannot preserve stroke referential identity, // we must do a full search each time and cannot simply keep a table. if (stroke.ExtendedProperties.DoesPropertyExist(InkSheetMessage.StrokeIdExtendedProperty)) { object id = stroke.ExtendedProperties[InkSheetMessage.StrokeIdExtendedProperty].Data; foreach (Stroke existing in sheet.Ink.Strokes) { if (existing.ExtendedProperties.DoesPropertyExist(InkSheetMessage.StrokeIdExtendedProperty)) { if (id.Equals(existing.ExtendedProperties[InkSheetMessage.StrokeIdExtendedProperty].Data)) { StrokesEventArgs args = new StrokesEventArgs(new int[] { existing.Id }); sheet.OnInkDeleting(args); sheet.Ink.DeleteStroke(existing); sheet.OnInkDeleted(args); } } } } // The stroke has no association with the current Ink object. // Therefore, we have to recreate it by copying the raw packet data. // This first requires recreating the TabletPropertyDescriptionCollection, // which, for some stupid reason, must be done manually for lack of a better API. TabletPropertyDescriptionCollection properties = new TabletPropertyDescriptionCollection(); foreach (Guid property in stroke.PacketDescription) { properties.Add(new TabletPropertyDescription(property, stroke.GetPacketDescriptionPropertyMetrics(property))); } // Create a new stroke from the raw packet data. Stroke created = sheet.Ink.CreateStroke(stroke.GetPacketData(), properties); // Copy the DrawingAttributes and all application data // (especially the StrokesIdExtendedProperty) to the new stroke. created.DrawingAttributes = stroke.DrawingAttributes; foreach (ExtendedProperty prop in stroke.ExtendedProperties) { created.ExtendedProperties.Add(prop.Id, prop.Data); } ids[i] = created.Id; } } }
private void AddInk() { using (Synchronizer.Lock(this)) { // Create an array of stroke Ids in order to fire the InkAdded event later. int[] ids = new int[this.m_StrokesToAdd.Count]; using (Synchronizer.Lock(this.m_Watcher.m_InkSheet.Ink.Strokes.SyncRoot)) { for (int i = 0; i < ids.Length; i++) { Stroke stroke = this.m_StrokesToAdd[i]; // The stroke probably has no association with the current Ink object. // Therefore, we have to recreate it by copying the raw packet data. // This first requires recreating the TabletPropertyDescriptionCollection, // which, for some stupid reason, must be done manually for lack of a better API. TabletPropertyDescriptionCollection properties = new TabletPropertyDescriptionCollection(); foreach (Guid property in stroke.PacketDescription) { properties.Add(new TabletPropertyDescription(property, stroke.GetPacketDescriptionPropertyMetrics(property))); } // Create a new stroke from the raw packet data. Stroke created = this.m_Watcher.m_InkSheet.Ink.CreateStroke(stroke.GetPacketData(), properties); // Copy the DrawingAttributes and all application data // (especially the StrokesIdExtendedProperty) to the new stroke. created.DrawingAttributes = stroke.DrawingAttributes; foreach (ExtendedProperty prop in stroke.ExtendedProperties) { created.ExtendedProperties.Add(prop.Id, prop.Data); } // Get the new stroke's Id so we can fire the InkAdded event. ids[i] = created.Id; } // If the added strokes don't yet have StrokeIdExtendedProperty properties, // create new Guids for them. Regardless, set this.m_StrokesToRemove // to the list of stroke Guids. this.UpdateAndSetStrokesToRemoveIds(this.m_StrokesToAdd); // Then, unset this.m_StrokesToAdd since they're already added. this.m_StrokesToAdd = null; } // Create the event arguments and add them to the ignore list so the // InkSheetUndoService won't create an InkUndoer for this change. StrokesEventArgs args = new StrokesEventArgs(ids); using (Synchronizer.Lock(this.m_Watcher.m_Ignore.SyncRoot)) { this.m_Watcher.m_Ignore.Add(args); } // Finally fire the appropriate InkAdded event from the InkSheetModel. this.m_Watcher.m_InkSheet.OnInkAdded(args); } }
public TabletPropertyDescriptionCollection CreateTabletPropertyDescriptionCollection() { TabletPropertyDescriptionCollection tp = new TabletPropertyDescriptionCollection(this.InkToDeviceScaleX, this.InkToDeviceScaleY); foreach (TabletPropertyDescriptionInformation info in this.TabletPropertyDescriptions) { tp.Add(info.CreateTabletPropertyDescription()); } return(tp); }
private void LoadInkIntoTarget(InkSheetModel sheet, byte[] saved, out int[] ids) { Ink restored = new Ink(); restored.Load(saved); using(Synchronizer.Lock(sheet.Ink.Strokes.SyncRoot)) { ids = new int[restored.Strokes.Count]; for(int i = 0; i < ids.Length; i++) { Stroke stroke = restored.Strokes[i]; // Remove any strokes that have the same remote Id as the new one. // Unfortunately, because the InkSheetUndoService cannot preserve stroke referential identity, // we must do a full search each time and cannot simply keep a table. if(stroke.ExtendedProperties.DoesPropertyExist(StrokeIdExtendedProperty)) { object id = stroke.ExtendedProperties[StrokeIdExtendedProperty].Data; foreach(Stroke existing in sheet.Ink.Strokes) { if(existing.ExtendedProperties.DoesPropertyExist(StrokeIdExtendedProperty)) { if(id.Equals(existing.ExtendedProperties[StrokeIdExtendedProperty].Data)) { StrokesEventArgs args = new StrokesEventArgs(new int[] { existing.Id }); sheet.OnInkDeleting(args); sheet.Ink.DeleteStroke(existing); sheet.OnInkDeleted(args); } } } } // The stroke has no association with the current Ink object. // Therefore, we have to recreate it by copying the raw packet data. // This first requires recreating the TabletPropertyDescriptionCollection, // which, for some stupid reason, must be done manually for lack of a better API. TabletPropertyDescriptionCollection properties = new TabletPropertyDescriptionCollection(); foreach(Guid property in stroke.PacketDescription) properties.Add(new TabletPropertyDescription(property, stroke.GetPacketDescriptionPropertyMetrics(property))); // Create a new stroke from the raw packet data. Stroke created = sheet.Ink.CreateStroke(stroke.GetPacketData(), properties); // Copy the DrawingAttributes and all application data // (especially the StrokesIdExtendedProperty) to the new stroke. created.DrawingAttributes = stroke.DrawingAttributes; foreach(ExtendedProperty prop in stroke.ExtendedProperties) created.ExtendedProperties.Add(prop.Id, prop.Data); ids[i] = created.Id; if (ViewerStateModel.NonStandardDpi) created.Transform(ViewerStateModel.DpiNormalizationReceiveMatrix); } } }
private void AddInk() { using(Synchronizer.Lock(this)) { // Create an array of stroke Ids in order to fire the InkAdded event later. int[] ids = new int[this.m_StrokesToAdd.Count]; using (Synchronizer.Lock(this.m_Watcher.m_InkSheet.Ink.Strokes.SyncRoot)) { for (int i = 0; i < ids.Length; i++) { Stroke stroke = this.m_StrokesToAdd[i]; // The stroke probably has no association with the current Ink object. // Therefore, we have to recreate it by copying the raw packet data. // This first requires recreating the TabletPropertyDescriptionCollection, // which, for some stupid reason, must be done manually for lack of a better API. TabletPropertyDescriptionCollection properties = new TabletPropertyDescriptionCollection(); foreach (Guid property in stroke.PacketDescription) properties.Add(new TabletPropertyDescription(property, stroke.GetPacketDescriptionPropertyMetrics(property))); // Create a new stroke from the raw packet data. Stroke created = this.m_Watcher.m_InkSheet.Ink.CreateStroke(stroke.GetPacketData(), properties); // Copy the DrawingAttributes and all application data // (especially the StrokesIdExtendedProperty) to the new stroke. created.DrawingAttributes = stroke.DrawingAttributes; foreach (ExtendedProperty prop in stroke.ExtendedProperties) created.ExtendedProperties.Add(prop.Id, prop.Data); // Get the new stroke's Id so we can fire the InkAdded event. ids[i] = created.Id; } // If the added strokes don't yet have StrokeIdExtendedProperty properties, // create new Guids for them. Regardless, set this.m_StrokesToRemove // to the list of stroke Guids. this.UpdateAndSetStrokesToRemoveIds(this.m_StrokesToAdd); // Then, unset this.m_StrokesToAdd since they're already added. this.m_StrokesToAdd = null; } // Create the event arguments and add them to the ignore list so the // InkSheetUndoService won't create an InkUndoer for this change. StrokesEventArgs args = new StrokesEventArgs(ids); using(Synchronizer.Lock(this.m_Watcher.m_Ignore.SyncRoot)) { this.m_Watcher.m_Ignore.Add(args); } // Finally fire the appropriate InkAdded event from the InkSheetModel. this.m_Watcher.m_InkSheet.OnInkAdded(args); } }
public TabletPropertyDescriptionCollection CreateTabletPropertyDescriptionCollection() { TabletPropertyDescriptionCollection tp = new TabletPropertyDescriptionCollection(this.InkToDeviceScaleX, this.InkToDeviceScaleY); foreach(TabletPropertyDescriptionInformation info in this.TabletPropertyDescriptions) tp.Add(info.CreateTabletPropertyDescription()); return tp; }