487 lines
14 KiB
C#
487 lines
14 KiB
C#
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;
|
|
}
|
|
}
|
|
/// <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("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
|
|
/// <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);
|
|
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
|
|
}
|
|
}
|