Equation Editor interface support
This commit is contained in:
482
PROMS/Volian.Controls.Library/RtfRawItem.cs
Normal file
482
PROMS/Volian.Controls.Library/RtfRawItem.cs
Normal file
@@ -0,0 +1,482 @@
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// The left edge of the Tab (no visible tab, but use this for EditItem interfacing
|
||||
/// </summary>
|
||||
public override int ItemLeft
|
||||
{
|
||||
get { return Left + lblTab.Left; }
|
||||
set { Left = value - lblTab.Left; }
|
||||
}
|
||||
/// <summary>
|
||||
/// The Location of the Tab
|
||||
/// </summary>
|
||||
public override Point ItemLocation
|
||||
{
|
||||
get { return new Point(Location.X + lblTab.Left, Location.Y); }
|
||||
set { Location = new Point(value.X - lblTab.Left, value.Y); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Width of the Tab and RichTextBox
|
||||
/// </summary>
|
||||
public override int ItemWidth
|
||||
{
|
||||
get { return Width - lblTab.Left; }
|
||||
set
|
||||
{
|
||||
Width = RtfRawMargin + value + lblTab.Left;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Width of the RichTextBox
|
||||
/// </summary>
|
||||
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); } }
|
||||
/// <summary>
|
||||
/// Location of the RichTextBox
|
||||
/// </summary>
|
||||
public override Point ContentLocation
|
||||
{
|
||||
get { return new Point(Location.X + _MyStepRTB.Left, Location.Y); }
|
||||
set { Location = new Point(value.X - _MyStepRTB.Left, value.Y); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Left edge of the RichTextBox
|
||||
/// </summary>
|
||||
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();
|
||||
}
|
||||
/// <summary>
|
||||
/// Sets the focus to this RTBItem
|
||||
/// </summary>
|
||||
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("EQUAT")) // 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
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
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);
|
||||
ItemLocation = TableLocation(MyStepSectionLayoutData, ItemWidth);
|
||||
Width = 200;
|
||||
Height = 200;
|
||||
ItemWidth = Width;
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user