using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using VEPROMS.CSLA.Library; using Volian.Base.Library; namespace Volian.Controls.Library { public partial class RtfRawItem : EditItem { #region IEditItem public override StepRTB MyStepRTB { get { return _MyStepRTB; } } public override int TableWidth { get { return (int)_MyStepRTB.Width + RtfRawMargin; } } /// /// The left edge of the Tab (no visible tab, but use this for EditItem interfacing /// public override int ItemLeft { get { return Left + lblTab.Left; } set { Left = value - lblTab.Left; } } /// /// The Location of the Tab /// public override Point ItemLocation { get { return new Point(Location.X + lblTab.Left, Location.Y); } set { Location = new Point(value.X - lblTab.Left, value.Y); } } /// /// Width of the Tab and RichTextBox /// public override int ItemWidth { get { return Width - lblTab.Left; } set { Width = RtfRawMargin + value + lblTab.Left; } } /// /// Width of the RichTextBox /// public override int ContentWidth { get { return _MyStepRTB.Width; } set { Width = value + lblTab.Left + lblTab.Width; } } public override int BorderWidth { get { return (_MyStepRTB.Width - _MyStepRTB.ClientRectangle.Width); } } /// /// Location of the RichTextBox /// public override Point ContentLocation { get { return new Point(Location.X + _MyStepRTB.Left, Location.Y); } set { Location = new Point(value.X - _MyStepRTB.Left, value.Y); } } /// /// Left edge of the RichTextBox /// public override int ContentLeft { get { return Left + _MyStepRTB.Left; } } override public void AdjustTableWidthAndLocation() { Size sz = GetRtfRawSize(MyItemInfo.MyContent.Text); string tmp = MyItemInfo.MyContent.Text; if (MyItemInfo.MyContent.Text == "New Step") tmp = ""; // if coming from the tree view/insert before or after - rtf is 'New Step' MyStepRTB.Rtf = tmp; MyStepRTB.Width = sz.Width; MyStepRTB.Height = sz.Height; ItemLocation = TableLocation(MyStepSectionLayoutData, ItemWidth); Width = sz.Width; Height = _MyStepRTB.Height + _MyStepRTB.Top + 7; ItemWidth = Width; } override public void SetToolTip(string tip) { DevComponents.DotNetBar.SuperTooltipInfo tpi = new DevComponents.DotNetBar.SuperTooltipInfo("", "", tip, null, null, DevComponents.DotNetBar.eTooltipColor.Lemon); _MyToolTip.MinimumTooltipSize = new Size(0, 24); _MyToolTip.TooltipDuration = 3; _MyToolTip.SetSuperTooltip(MyStepRTB, tpi); } public override void RefreshContent() { IdentifyMe(false); MyStepRTB.Rtf = MyItemInfo.MyContent.Text; RefreshDisplay(false); } public override void RefreshOrdinal() { TabFormat = null; } public override void HandleResize() {} public override void MatchExpanded() {} public override void ItemSelect() { // Was getting an Error that _MyStepRTB was Disposed RHM 20101217 if (!_MyStepRTB.Disposing && !_MyStepRTB.Closed) { _MyStepRTB.Focus(); } else { _MyLog.WarnFormat("Attempt to give Focus to Disposed Object {0}", MyID); } ScrollToCenter(); } /// /// Sets the focus to this RTBItem /// public override void ItemShow() { _MyStepRTB.Focus(); ScrollToCenter(); } public override void SetActive() { this.BackColor = MyStepPanel.ActiveColor; } public override void SetText() { LastMethodsPush("SetText"); if (MyItemInfo != null) { MyStepRTB.MyItemInfo = MyItemInfo; IdentifyMe(false); } LastMethodsPop(); } public override void SetExpandAndExpander(ItemInfo itemInfo) { CanExpand = false; } public override void SaveCurrentAndContents() { SaveContents(); } public override void RefreshDisplay(bool activeMode) { MyStepRTB.VwMode = MyStepPanel.VwMode; Size sz = GetRtfRawSize(MyStepRTB.Rtf); if (MyStepRTB.Rtf == null || MyStepRTB.Rtf == "" || !(MyStepRTB.Rtf.ToUpper().Contains("OBJCLASS EQU") || MyStepRTB.Rtf.ToUpper().Contains("OBJCLASS VIS")) //Support Visio ) // this is a new insert { sz.Width = 50; sz.Height = 50; } MyStepRTB.Width = sz.Width; MyStepRTB.Height = sz.Height; if (_MyParentEditItem != null) ItemLocation = new Point(300, _MyParentEditItem.Bottom); ItemLocation = TableLocation(MyStepSectionLayoutData, ItemWidth); Width = sz.Width; Height = _MyStepRTB.Height + _MyStepRTB.Top + 7; ItemWidth = Width; MyStepPanel.MyStepTabPanel.MyStepTabRibbon.SetButtonAndMenuEnabling(true); } public override void ToggleEditView(E_ViewMode vwMode) { SaveContents(); } public override string TabFormat { get { return null; } set { ;} } public override bool Expanded { get { return true; } set { ; } } public override bool CanExpand { get { return false; } set { ; } } public override int TabLeft { get { return lblTab.Left; } set { lblTab.Left = value; } } //taken from griditem public override Font TabFont { get { return MyStepRTB.Font; } set { ; } } public override string TabText { get { return lblTab.Text; } } public override Point TabLocation { get { return lblTab.Location; } } public override Font ContentFont { get { return MyStepRTB.Font; } set { /*MyStepRTB.Font = value*/; } } public override float ContentTop { get { return MyStepRTB.Top; } } public override DialogResult ReplaceText(string rpltxt, string fndstr, bool caseSensitive, bool matchWholeWord, bool reverse, bool prompt, IWin32Window fndrpldlg) { return DialogResult.OK; } public override bool FindText(string str, bool caseSensitive, bool matchWholeWord, bool reverse) { return false; } public override void PositionToEnd() { return; } public override void PositionToStart() { return; } public override string SelectedTextForFind { get {return null;} } public override bool SpellCheckNext() { return false; } public override bool Empty { get { return _MyStepRTB.Text == ""; } set { _MyStepRTB.Text = value ? "" : " "; } } public override void RefreshTab() { TabFormat = null; } public override void SetupHeader(ItemInfo itemInfo) { return; } public override void ShowExpanded() {} #endregion #region Properties private static int _RtfRawMargin = 6; // make it a little bigger than rtbitems so it can be seen /// /// Margin between the EditItem and the RtfRawItem. Appears on the Right. /// Will allow space to draw a Change Bar on the right side of the EditItem. /// public static int RtfRawMargin { get { return _RtfRawMargin; } set { _RtfRawMargin = value; } } #endregion #region Constructors public RtfRawItem() { InitializeComponent(); } //existing objects: public RtfRawItem(ItemInfo itemInfo, StepPanel myStepPanel, EditItem myParentEditItem, ChildRelation myChildRelation, bool expand) { InitializeComponent(); MyItemInfo = itemInfo; SetupEditItem(itemInfo, myStepPanel, myParentEditItem, myChildRelation, expand, null, false); AdjustTableWidthAndLocation(); SetupEventHandlers(); MyStepRTB.ReadOnly = !UserInfo.CanEdit(StepRTB.MyUserInfo, MyItemInfo.MyDocVersion); // reviewer cannot make changes to a table MyStepRTB.Enabled = UserInfo.CanEdit(StepRTB.MyUserInfo, MyItemInfo.MyDocVersion); MyStepRTB.OrigRTF = MyStepRTB.Rtf; this.Controls.Add(this._MyStepRTB); _origBitmap = GetBitmap(MyStepRTB.Rtf); //kbr } // the following is for inserted equations: public RtfRawItem(ItemInfo itemInfo, StepPanel myStepPanel, EditItem myParentEditItem, ChildRelation myChildRelation, bool expand, EditItem nextEditItem) { InitializeComponent(); MyItemInfo = itemInfo; SetupEditItem(itemInfo, myStepPanel, myParentEditItem, myChildRelation, expand, nextEditItem, false); SetupEventHandlers(); if (MyItemInfo.MyContent.Text != null && MyItemInfo.MyContent.Text != "") { AdjustTableWidthAndLocation(); MyStepRTB.OrigRTF = MyStepRTB.Rtf; } else { MyStepRTB.OrigRTF = ""; MyStepRTB.Size = new Size(200, 200); Width = 200; Height = 200; ItemWidth = Width; ItemLocation = TableLocation(MyStepSectionLayoutData, ItemWidth); } this.Controls.Add(this._MyStepRTB); } private void SetupEventHandlers() { MyStepRTB.TextChanged += new EventHandler(MyStepRTB_TextChanged); MyStepRTB.Resize += new System.EventHandler(MyStepRTB_Resize); MyStepRTB.Enter += new System.EventHandler(_StepRTB_Enter); MyStepRTB.HeightChanged += new Volian.Controls.Library.StepRTBEvent(_MyStepRTB_HeightChanged); MyStepRTB.ContentsResized += new ContentsResizedEventHandler(MyStepRTB_ContentsResized); MyStepRTB.SetMenu += new StepRTBMenuEvent(MyStepRTB_SetMenu); MyStepRTB.CursorKeyPress += new Volian.Controls.Library.StepRTBCursorKeysEvent(MyStepRTB_CursorKeyPress); MyStepRTB.CursorMovement += new Volian.Controls.Library.StepRTBCursorMovementEvent(MyStepRTB_CursorMovement); Click += new EventHandler(RtfRawItem_Click); MyStepRTB.Click += new EventHandler(RtfRawItem_Click); } #endregion #region EventHandlers void RtfRawItem_Click(object sender, EventArgs e) { //if (MyStepPanel.DisplayItemChanging) return; MyStepPanel.SelectedEditItem = this; } private void _MyStepRTB_HeightChanged(object sender, EventArgs args) { if (this.Height != _MyStepRTB.Height + _MyStepRTB.Top + 7) // add in 7 to make it look good // + 10) { LastMethodsPush(string.Format("_StepRTB_HeightChanged {0}", _MyStepRTB.Height)); this.Height = _MyStepRTB.Height + _MyStepRTB.Top + 7; LastMethodsPop(); } } public void MyStepRTB_ContentsResized(object sender, ContentsResizedEventArgs e) { // need duplicate call for this because for modifies & restores, a single call was not setting size correctly: RefreshDisplay(false); RefreshDisplay(false); } void MyStepRTB_SetMenu(object sender, StepRTBMenuEventArgs args) { if (args.MenuGroup == null) MyStepPanel.MyStepTabPanel.MyStepTabRibbon.ClearContextMenu(); else if (args.MenuGroup == "OpenContextMenu") MyStepPanel.MyStepTabPanel.MyStepTabRibbon.SetContextMenu(sender); else MyStepPanel.MyStepTabPanel.MyStepTabRibbon.SetShortCutContextMenu(args.MenuGroup); } private void _StepRTB_Enter(object sender, EventArgs e) { if (MyStepPanel.DisplayItemChanging) return; MyStepPanel.SelectedEditItem = this; } #endregion #region Methods public override void SetFocus() { MyStepRTB.Focus(); } public override void SaveContents() { SaveText(); SaveConfig(); } public void SaveText() { if (MyStepRTB.ReadOnly) return; if (!IsDirty()) return; try { string res = MyStepRTB.Rtf.Replace("\\par\r\n}", "}"); using (Item _MyItem = MyItemInfo.Get()) { _MyItem.MyContent.Text = res; _MyItem.MyContent.DTS = DateTime.Now; _MyItem.MyContent.UserID = Volian.Base.Library.VlnSettings.UserID; _MyItem.DTS = DateTime.Now; _MyItem.UserID = Volian.Base.Library.VlnSettings.UserID; _MyItem.Save(); } _origBitmap = GetBitmap(res); MyStepRTB.ClearUndo(); } catch (Exception ex) { //MessageBox.Show("The data could not be saved.", "Object Save", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } public System.Drawing.Bitmap GetBitmap(string rtf) { Bitmap bmap = null; try { System.Drawing.Size sz = RtfRawItem.GetRtfRawSize(rtf); Volian.Controls.Library.RTF myRtb = new RTF(); myRtb.Size = sz; myRtb.Rtf = rtf; bmap = new System.Drawing.Bitmap((int)sz.Width, (int)sz.Height); System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bmap); myRtb.RenderClipped(gr, new System.Drawing.Rectangle(0, 0, (int)sz.Width, (int)sz.Height)); } catch (Exception ex) { return null; } return bmap; } private System.Drawing.Bitmap _origBitmap = null; private bool IsDirty() { System.Drawing.Bitmap curBitmap = GetBitmap(MyStepRTB.Rtf); if (_origBitmap == null) return true; return (!compare(_origBitmap, curBitmap)); } // compares 2 bitmaps by comparing pixels between the 2. private bool compare(Bitmap bmp1, Bitmap bmp2) { bool equals = true; bool flag = true; //Inner loop isn't broken //Test to see if we have the same size of image if (bmp1.Size == bmp2.Size) { for (int x = 0; x < bmp1.Width; ++x) { for (int y = 0; y < bmp1.Height; ++y) { if (bmp1.GetPixel(x, y) != bmp2.GetPixel(x, y)) { equals = false; flag = false; break; } } if (!flag) { break; } } } else { equals = false; } return equals; } public override void IdentifyMe(bool highlight) { if (highlight) this.BackColor = Color.Gray; else { if (MyStepPanel.SelectedEditItem != null && MyStepPanel.SelectedEditItem.MyItemInfo == this.MyItemInfo) this.BackColor = MyStepPanel.ActiveColor; else this.BackColor = MyItemInfo.ItemAnnotationCount == 0 ? MyStepPanel.PanelColor : MyStepPanel.AnnotationColor; } } public static Size GetRtfRawSize(string rtf) { RichTextBox rtb = new RichTextBox(); if (rtf == "New Step") rtf = ""; // if coming from the tree view/insert before or after - rtf is 'New Step' rtb.BorderStyle = BorderStyle.None;//Eliminate the border width rtb.Rtf = rtf; // myRtf.Rtf;// set the contents rtb.AppendText(" ");// Add a space after the equation rtb.Width = 10000;// Start with a very wide richtextbox int w = rtb.GetPositionFromCharIndex(1).X;// Get the width of the equation rtb.Width = w;// Adjust the width int h = rtb.GetPositionFromCharIndex(2).Y;// Get the height of the equation return new Size(w, h);// Return the size of the Equation } void MyStepRTB_Resize(object sender, EventArgs e) { if (MyStepPanel != null && this == MyStepPanel.SelectedEditItem) ScrollToCenter(); } void MyStepRTB_TextChanged(object sender, EventArgs e) { if (MyStepPanel != null && this == MyStepPanel.SelectedEditItem) ScrollToCenter(); } private void MyStepRTB_CursorKeyPress(object sender, KeyEventArgs args) { MyStepPanel.StepCursorKeys(this, args); } private void MyStepRTB_CursorMovement(object sender, StepRTBCursorMovementEventArgs args) { MyStepPanel.CursorMovement(this, args.CursorLocation, args.Key); } #endregion } }