年度变更建库软件5.0版本
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

380 lines
15 KiB

using DevExpress.XtraEditors;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.Utils.Helper;
using KGIS.Plugin.LayerProperty.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace KGIS.Plugin.LayerProperty.View
{
public partial class FormLabelExpression : XtraForm
{
private ILabelEngineLayerProperties2 m_LabelEngineLayerProperties;
private IAnnotationExpressionEngine m_ExpressionEngine;
private bool m_IsExpressionSimple;
private string labelExpression;
private bool isSampleExpression;
public string LabelExpression
{
get
{
return this.labelExpression;
}
set
{
this.labelExpression = value;
this.memoSQLInfo.Text = value;
}
}
public bool IsSampleExpression
{
get
{
return this.isSampleExpression;
}
set
{
this.isSampleExpression = value;
}
}
public FormLabelExpression()
{
InitializeComponent();
}
private void InitForm(IFields fields)
{
try
{
this.lstField.Items.Clear();
int fieldCount = fields.FieldCount;
for (int i = 0; i < fieldCount; i++)
{
IField field = fields.get_Field(i);
if (field.Type != esriFieldType.esriFieldTypeGeometry && field.Type != esriFieldType.esriFieldTypeBlob && field.Type != esriFieldType.esriFieldTypeRaster)
{
ItemInfo<IField, string> item = new ItemInfo<IField, string>(field, field.Name);
this.lstField.Items.Add(item);
}
}
this.lstField.SelectedItem = this.lstField.Items[0];
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
}
internal void InitForm(ILabelEngineLayerProperties2 labelEngineLayerProperties, IFields iFields)
{
this.m_LabelEngineLayerProperties = labelEngineLayerProperties;
this.InitForm(iFields);
if (labelEngineLayerProperties != null)
{
this.m_IsExpressionSimple = labelEngineLayerProperties.IsExpressionSimple;
this.m_ExpressionEngine = labelEngineLayerProperties.ExpressionParser;
if (labelEngineLayerProperties.IsExpressionSimple)
{
this.memoSQLInfo.Text = labelEngineLayerProperties.Expression;
return;
}
if (this.m_ExpressionEngine is AnnotationJScriptEngineClass)
{
this.cmbParser.SelectedIndex = 0;
}
else
{
this.cmbParser.SelectedIndex = 1;
}
//this.chkAdvanced.Checked = true;
}
}
private void lstField_DoubleClick(object sender, System.EventArgs e)
{
try
{
this.Cursor = Cursors.AppStarting;
this.InsertString("[" + this.lstField.SelectedItem.ToString().Trim() + "]");
this.memoSQLInfo.SendMouseUp(this.memoSQLInfo.Location, MouseButtons.Left);
this.Cursor = Cursors.Default;
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
this.Cursor = Cursors.Default;
}
}
private void InsertString(string mStr)
{
int selectionStart = this.memoSQLInfo.SelectionStart;
string text = this.memoSQLInfo.Text;
if (selectionStart == text.Length)
{
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(selectionStart, mStr).Trim();
this.memoSQLInfo.SelectionStart = selectionStart + mStr.Length;
return;
}
Regex regex = new Regex("\\[\\s*\\]");
MatchCollection matchCollection = regex.Matches(text);
for (int i = 0; i < matchCollection.Count; i++)
{
Match match = matchCollection[i];
if (selectionStart > match.Index && selectionStart <= match.Index + match.Length)
{
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(match.Index + match.Length, mStr).Trim();
this.memoSQLInfo.SelectionStart = match.Index + match.Length + mStr.Length;
return;
}
}
regex = new Regex("\\[\\w*\\W*\\]");
matchCollection = regex.Matches(text);
for (int j = 0; j < matchCollection.Count; j++)
{
Match match2 = matchCollection[j];
if (selectionStart > match2.Index && selectionStart <= match2.Index + match2.Length)
{
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(match2.Index + match2.Length, mStr).Trim();
this.memoSQLInfo.SelectionStart = match2.Index + match2.Length + mStr.Length;
return;
}
}
Match match3 = regex.Match(text, selectionStart);
if (!match3.Success)
{
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(selectionStart, mStr).Trim();
this.memoSQLInfo.SelectionStart = selectionStart + mStr.Length;
return;
}
match3 = regex.Match(text, selectionStart);
int index = match3.Index;
regex = new Regex("\\]");
match3 = regex.Match(text, selectionStart);
if (match3.Index < index && match3.Index + 1 == index)
{
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(match3.Index + 1, mStr).Trim();
this.memoSQLInfo.SelectionStart = match3.Index + 1 + mStr.Length;
return;
}
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(selectionStart, mStr).Trim();
this.memoSQLInfo.SelectionStart = selectionStart + mStr.Length;
}
private void AppendString(string mStr)
{
}
private void InsertStringNospace(string mStr)
{
mStr = (mStr.Trim() ?? "");
int selectionStart = this.memoSQLInfo.SelectionStart;
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(selectionStart, mStr).Trim();
if (mStr.EndsWith("() "))
{
this.memoSQLInfo.SelectionStart = mStr.Length + selectionStart - 2;
return;
}
this.memoSQLInfo.SelectionStart = mStr.Length + selectionStart;
}
private void btnAppend_Click(object sender, System.EventArgs e)
{
ItemInfo<IField, string> itemInfo = this.lstField.SelectedItem as ItemInfo<IField, string>;
if (itemInfo != null)
{
if (this.memoSQLInfo.Text.Length > 0)
{
this.InsertString("& \" \" &[" + itemInfo.InnerValue.Name + "]");
return;
}
this.InsertString("[" + itemInfo.InnerValue.Name + "]");
}
}
private void btnOk_Click(object sender, System.EventArgs e)
{
if (this.LabelExpressionFinish())
{
this.labelExpression = this.memoSQLInfo.Text;
#region BUG12168 郑英杰 2018-09-06
//int num = 0;
//Regex regex = new Regex("\\[\\s*\\]");
//MatchCollection matchCollection = regex.Matches(this.labelExpression);
//num = matchCollection.Count + num;
//regex = new Regex("\\[\\w*\\W*\\]");
//matchCollection = regex.Matches(this.labelExpression);
//num = matchCollection.Count + num;
//if (num > 1)
//{
// this.isSampleExpression = false;
//}
//else
//{
// this.isSampleExpression = true;
//}
#endregion
this.m_LabelEngineLayerProperties.IsExpressionSimple = this.m_IsExpressionSimple;
base.DialogResult = DialogResult.OK;
base.Close();
}
}
private bool LabelExpressionFinish()
{
if (this.memoSQLInfo.Text.Length == 0)
{
MessageHelper.ShowTips("表达式不能为空!");
return false;
}
this.m_LabelEngineLayerProperties.ExpressionParser = this.m_ExpressionEngine;
this.m_LabelEngineLayerProperties.Expression = this.memoSQLInfo.Text;
this.m_LabelEngineLayerProperties.IsExpressionSimple = !this.chkAdvanced.Checked;
return this.VerifyExpression();
}
private void btnReset_Click(object sender, System.EventArgs e)
{
this.memoSQLInfo.Text = this.labelExpression;
}
private void btnVerify_Click(object sender, System.EventArgs e)
{
if (this.VerifyExpression())
{
MessageHelper.ShowTips("表达式正确!");
}
}
private bool VerifyExpression()
{
try
{
IAnnotationExpressionParser annotationExpressionParser;
if (this.chkAdvanced.Checked)
{
annotationExpressionParser = this.m_ExpressionEngine.SetCode(this.memoSQLInfo.Text, "FindLabel");
if (annotationExpressionParser.AttributeCount == 0)
{
MessageHelper.ShowTips("表达式错误,请检查!");
bool result = false;
return result;
}
}
else
{
annotationExpressionParser = this.m_ExpressionEngine.SetExpression("", this.memoSQLInfo.Text);
}
if (annotationExpressionParser.AttributeCount == 0)
{
MessageHelper.ShowTips("表达式错误,请检查!");
bool result = false;
return result;
}
int num = 0;
int num2 = 0;
string text = "";
annotationExpressionParser.LastError(ref num, ref num2, ref text);
if (text == null)
{
bool result = true;
return result;
}
if (!(text.Contains("MSScript.ocx is either not installed or not registered") || text.Trim().Replace(" ", "").Contains("MSScript.ocx没有安装或没有注册") || text.Trim().Replace(" ", "").Contains("MSScript.ocx未安装或未注册")))
{
MessageHelper.ShowTips(text);
bool result = false;
return result;
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
return true;
}
private void memoSQLInfo_TextChanged(object sender, System.EventArgs e)
{
if (this.memoSQLInfo.Text.Length == 0)
{
this.btnVerify.Enabled = false;
return;
}
this.btnVerify.Enabled = true;
}
private void chkAdvanced_CheckedChanged(object sender, System.EventArgs e)
{
if (this.chkAdvanced.Checked)
{
this.memoSQLInfo.Text = this.GetScriptSentence(this.m_ExpressionEngine, this.m_LabelEngineLayerProperties.Expression);
#region BUG10428 2018-09-03 郑英杰
this.m_IsExpressionSimple = false;
#endregion
}
else
{
this.memoSQLInfo.Text = this.GetExpressionByCode(this.m_ExpressionEngine, this.m_LabelEngineLayerProperties.Expression);
#region BUG10428 2018-09-03 郑英杰
this.m_IsExpressionSimple = true;
#endregion
}
#region BUG10428 2018-09-03 郑英杰
//this.m_IsExpressionSimple = !this.m_IsExpressionSimple;
#endregion
}
private string GetScriptSentence(IAnnotationExpressionEngine pExpressionEngine, string m_LabelExpression)
{
if (this.m_IsExpressionSimple && this.m_LabelEngineLayerProperties.IsExpressionSimple)
{
IAnnotationExpressionParser annotationExpressionParser = pExpressionEngine.SetExpression("", m_LabelExpression);
string text = "";
for (int i = 0; i < annotationExpressionParser.AttributeCount; i++)
{
if (i == 0)
{
text = "[" + annotationExpressionParser.get_Attribute(0) + "]";
}
else
{
text = text + ", [" + annotationExpressionParser.get_Attribute(i) + "]";
}
}
return pExpressionEngine.CreateFunction("FindLabel", text, m_LabelExpression);
}
return this.m_LabelEngineLayerProperties.Expression;
}
private string GetExpressionByCode(IAnnotationExpressionEngine pExpressionEngine, string fullCode)
{
if (!this.m_IsExpressionSimple && !this.m_LabelEngineLayerProperties.IsExpressionSimple)
{
IAnnotationExpressionParser annotationExpressionParser = pExpressionEngine.SetCode(fullCode, "FindLabel");
string text = "";
for (int i = 0; i < annotationExpressionParser.AttributeCount; i++)
{
if (i == 0)
{
text = "[" + annotationExpressionParser.get_Attribute(0) + "]";
}
else
{
text = text + "&\"\"& [" + annotationExpressionParser.get_Attribute(i) + "]";
}
}
return text;
}
return this.m_LabelEngineLayerProperties.Expression;
}
private void cmbParser_SelectedIndexChanged(object sender, System.EventArgs e)
{
if (this.cmbParser.SelectedIndex == 0)
{
this.m_ExpressionEngine = new AnnotationJScriptEngineClass();
}
else
{
this.m_ExpressionEngine = new AnnotationVBScriptEngineClass();
}
this.chkAdvanced.Checked = false;
}
}
}