using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Windows.Forms; using DevExpress.XtraBars; using DevExpress.XtraTreeList; using DevExpress.XtraTreeList.Nodes; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.esriSystem; using KGIS.Plugin.LayerProperty.Enum; using KGIS.Plugin.LayerProperty.EventHandler; using KGIS.Plugin.LayerProperty.Interface; using KGIS.Plugin.LayerProperty.Utils; using KGIS.Plugin.LayerProperty.View.UC_Controls; namespace KGIS.Plugin.LayerProperty.View { public partial class FormSymbolSelector : DevExpress.XtraEditors.XtraForm, IUIPlugIn, IPlugIn, ISymbolSelector { private const string ConstStr = "<所有分组>"; private IDoStyleGalleryStorage m_DistStyleGalleryStorage; private IDoStyleGallery m_DistStyleGallery; private Dictionary> m_ViewItemDictionary; private int m_ClassIndex; private TreeListNode m_LocalRootNode; private TreeListNode m_DBRootNode; private KGIS.Framework.Utils.Dialog.OpenFileDialog m_OpenFileDialog; private IDoStyleGalleryItem m_DistStyleGalleryItem; private IDoStyleGalleryItem m_SelectSymbol; private IUCSymbolAtrribute ucFillSymbolAtrribute; private IUCSymbolAtrribute ucMarkSymbolAtrribute; private IUCSymbolAtrribute ucLineSymbolAtrribute; private IUCSymbolAtrribute ucTextSymbolAtrribute; private IUCSymbolAtrribute m_CurrentUc; private List m_CheckedNodes; private IClone m_SrcSymbolClone; private ISymbol m_TarCloneSymbol; private ISymbol m_DeafultSymbol; private object resultSymbol; public IDoStyleGalleryItem DoStyleGalleryItem { get { return this.m_SelectSymbol; } set { this.m_SelectSymbol = value; } } public object ResultSymbol { get { return this.resultSymbol; } set { this.resultSymbol = value; } } public ICoreRDBHelper RDBHelper { get; //{ // return RdbUtil.RDBHelper; //} set; //{ // RdbUtil.RDBHelper = value; //} } public ITraceHandler TraceHandler { get; //{ // return RdbUtil.TraceHandler; //} set; //{ // RdbUtil.TraceHandler = value; //} } public ILogEvent Log { set { //RdbUtil.Log = value; } } public FormSymbolSelector() { this.InitializeComponent(); this.m_DistStyleGallery = StyleGalleryFactory.CreateDistStyleGallery(); this.m_DistStyleGalleryStorage = (this.m_DistStyleGallery as IDoStyleGalleryStorage); this.m_CheckedNodes = new List(); this.picPreview.Width = this.gpOptions.Width;//白明雅 2018-12-20 调大宽度 //Bug-13254 霍岩 2018-11-23 添加窗体已关闭事件 FormClosed += (sender, e) => { if (base.DialogResult != DialogResult.OK) { this.ResultSymbol = null; } }; } public void Init() { try { this.tlstGalleryTree.Nodes.Clear(); this.tlstGalleryTree.OptionsBehavior.Editable = false; this.tlstGalleryTree.OptionsView.AutoWidth = true; this.tlstGalleryTree.OptionsBehavior.AutoPopulateColumns = true; //TreeListNode treeListNode = this.tlstGalleryTree.AppendNode(new object[] //{ // "数据库图库", // CheckState.Unchecked //}, null); //treeListNode.Tag = null; //treeListNode.StateImageIndex = 0; //this.RefreshRootNode(treeListNode); //this.m_DBRootNode = treeListNode; TreeListNode treeListNode2 = this.tlstGalleryTree.AppendNode(new object[] { "本地图库", CheckState.Unchecked }, null); treeListNode2.Tag = "local"; treeListNode2.StateImageIndex = 0; this.m_LocalRootNode = treeListNode2; //Bug-13011 霍岩 2018-11-06 加载首个TreeListNode NodeChange(treeListNode2); } catch (Exception ex) { //RdbUtil.AddException(ex); } } private void AddLocalFile() { try { string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"工作空间\符号库"); if (Directory.Exists(path)) { string[] fileInfo = Directory.GetFiles(path, "*.ServerStyle?"); if (fileInfo != null && fileInfo.Length > 0) { foreach (string text in fileInfo) { this.AddFile(text); } } } } catch (Exception ex) { throw ex; } } private void NodeChange(TreeListNode node) { this.m_DistStyleGalleryStorage.ClearFiles(); //BUG12486 郑英杰 2018-09-27 //string text = node.Tag.ToString(); //if (text != "") //{ // this.m_DistStyleGalleryStorage.AddFile(text); // this.RefreshView(text); //} if (node != null && node.Tag != null) { string text = node.Tag.ToString(); if (text != "") { this.m_DistStyleGalleryStorage.AddFile(text); this.RefreshView(text); } } } public void Init(esriStyleClass styleClass) { try { this.gpOptions.Controls.Clear(); this.m_ClassIndex = (int)styleClass; for (int i = 0; i < this.m_DistStyleGallery.ClassCount; i++) { IStyleGalleryClass styleclass = m_DistStyleGallery.get_Class(i); if (styleclass != null && styleclass.Name.Replace(" ", "").ToLower() == styleClass.ToString().ToLower()) { this.m_ClassIndex = i; break; } } this.m_TarCloneSymbol = null; this.gpOptions.Visible = false; switch (styleClass) { case esriStyleClass.FillSymbols: this.gpOptions.Visible = true; if (this.ucFillSymbolAtrribute == null) { this.ucFillSymbolAtrribute = new UCFillSymbolAtrribute(); this.ucFillSymbolAtrribute.Dock = DockStyle.Fill; this.ucFillSymbolAtrribute.SetPicture(this.picPreview); } this.gpOptions.Controls.Add(this.ucFillSymbolAtrribute as System.Windows.Forms.Control); this.m_CurrentUc = this.ucFillSymbolAtrribute; break; case esriStyleClass.LineSymbols: this.gpOptions.Visible = true; if (this.ucLineSymbolAtrribute == null) { this.ucLineSymbolAtrribute = new UCLineSymbolAtrribute(); this.ucLineSymbolAtrribute.Dock = DockStyle.Fill; this.ucLineSymbolAtrribute.SetPicture(this.picPreview); } this.gpOptions.Controls.Add(this.ucLineSymbolAtrribute as System.Windows.Forms.Control); this.m_CurrentUc = this.ucLineSymbolAtrribute; break; case esriStyleClass.MarkerSymbols: this.gpOptions.Visible = true; if (this.ucMarkSymbolAtrribute == null) { this.ucMarkSymbolAtrribute = new UCMarkSymbolAtrribute(); this.ucMarkSymbolAtrribute.Dock = DockStyle.Fill; this.ucMarkSymbolAtrribute.SetPicture(this.picPreview); } this.gpOptions.Controls.Add(this.ucMarkSymbolAtrribute as System.Windows.Forms.Control); this.m_CurrentUc = this.ucMarkSymbolAtrribute; break; case esriStyleClass.TextSymbols: this.gpOptions.Visible = true; if (this.ucTextSymbolAtrribute == null) { this.ucTextSymbolAtrribute = new UCTextSymbolAtrribute(); this.ucTextSymbolAtrribute.Dock = DockStyle.Fill; this.ucTextSymbolAtrribute.SetPicture(this.picPreview); } this.gpOptions.Controls.Add(this.ucTextSymbolAtrribute as System.Windows.Forms.Control); this.m_CurrentUc = this.ucTextSymbolAtrribute; break; } //初始化路径,不然在后面会报错,获取不到数据 string path = this.m_DistStyleGalleryStorage.DefaultStylePath; AddLocalFile(); } catch (Exception ex) { //RdbUtil.AddException(ex); } } public void Init(esriStyleClass styleClass, ref ISymbol symbol) { try { this.Init(styleClass); if (this.m_CurrentUc != null) { this.resultSymbol = symbol; this.m_CurrentUc.Init(ref symbol); this.m_CurrentUc.SymbolEdited -= new System.EventHandler(this.m_CurrentUc_SymbolEdited); this.m_CurrentUc.SymbolEdited += new System.EventHandler(this.m_CurrentUc_SymbolEdited); } } catch (Exception ex) { //RdbUtil.AddException(ex); } } private void m_CurrentUc_SymbolEdited(object sender, System.EventArgs e) { if (this.resultSymbol != null) { this.btnOK.Enabled = true; } } private void InitCategories(List list) { this.repositoryItemComboBox1.Items.Clear(); list.Insert(0, "<所有分组>"); this.repositoryItemComboBox1.Items.AddRange(list); this.barCategories.EditValue = "<所有分组>"; } private void RefreshRootNode(TreeListNode node) { try { if (node != null) { node.Nodes.Clear(); StyleGalleryFactory.Clear(); StyleGalleryFactory.LoadAllDistStyleGalleryPath(); List distStyleGalleryPathList = StyleGalleryFactory.DistStyleGalleryPathList; foreach (IDoStyleGalleryPath current in distStyleGalleryPathList) { TreeListNode treeListNode = this.tlstGalleryTree.AppendNode(new object[] { current.Name, CheckState.Unchecked }, node); treeListNode.Tag = current; treeListNode.StateImageIndex = 5; } if (node.Nodes.Count > 0) { this.tlstGalleryTree.FocusedNode = node.Nodes[0]; node.Nodes[0].Selected = true; } } } catch (Exception ex) { //RdbUtil.AddException(ex); } } private void tlstGalleryTree_GetStateImage(object sender, GetStateImageEventArgs e) { try { CheckState checkState = (CheckState)e.Node.GetValue("Check"); if (checkState == CheckState.Unchecked) { e.NodeImageIndex = 0; } else { if (checkState == CheckState.Checked) { e.NodeImageIndex = 1; } else { e.NodeImageIndex = 2; } } } catch { } } private void SetCheckedNode(TreeListNode node) { CheckState checkState = (CheckState)node.GetValue("Check"); if (checkState == CheckState.Indeterminate || checkState == CheckState.Unchecked) { checkState = CheckState.Checked; } else { checkState = CheckState.Unchecked; } this.tlstGalleryTree.FocusedNode = node; this.tlstGalleryTree.BeginUpdate(); node["Check"] = checkState; this.SetCheckedChildNodes(node, checkState); this.SetCheckedParentNodes(node, checkState); this.tlstGalleryTree.EndUpdate(); this.GetAllCheckedNode(); this.RefreshView(node.Tag as string); } private void SetCheckedChildNodes(TreeListNode node, CheckState check) { for (int i = 0; i < node.Nodes.Count; i++) { node.Nodes[i]["Check"] = check; this.SetCheckedChildNodes(node.Nodes[i], check); } } private void SetCheckedParentNodes(TreeListNode node, CheckState check) { if (node.ParentNode != null) { bool flag = false; for (int i = 0; i < node.ParentNode.Nodes.Count; i++) { if (!check.Equals(node.ParentNode.Nodes[i]["Check"])) { flag = !flag; break; } } node.ParentNode["Check"] = (flag ? CheckState.Indeterminate : check); this.SetCheckedParentNodes(node.ParentNode, check); } } private void InitView(IDoStyleGalleryClass galleryClass, List list) { try { long arg_0E_0 = DateTime.Now.Ticks; this.m_ViewItemDictionary = new Dictionary>(); this.lvSymbolView.Items.Clear(); this.lvSymbolView.Columns.Clear(); this.lvSymbolView.Groups.Clear(); ImageList imageList = new ImageList(); ImageList imageList2 = new ImageList(); int num = Convert.ToInt32(32.0 * galleryClass.PreviewRatio); int num2 = 32; if (num > 256) { num = 256; } imageList.ImageSize = new Size(num, num2); imageList2.ImageSize = new Size(num / 2, num2 / 2); this.lvSymbolView.Items.Clear(); this.lvSymbolView.Columns.Clear(); this.lvSymbolView.LargeImageList = imageList; this.lvSymbolView.SmallImageList = imageList2; this.lvSymbolView.Columns.Add("名称", 180, HorizontalAlignment.Left); this.lvSymbolView.Columns.Add("索引", 50, HorizontalAlignment.Left); this.lvSymbolView.Columns.Add("分组", 120, HorizontalAlignment.Left); int num3 = 0; foreach (IDoStyleGalleryItem current in list) { Bitmap value = galleryClass.StyleGalleryItemToBmp(current, num2); Bitmap value2 = galleryClass.StyleGalleryItemToBmp(current, num2 / 2); imageList.Images.Add(value); imageList2.Images.Add(value2); ListViewItem listViewItem = new ListViewItem(new string[] { current.Name, current.Number.ToString(), current.Category }, num3); listViewItem.Tag = current; this.lvSymbolView.Items.Add(listViewItem); if (this.m_ViewItemDictionary.ContainsKey(current.Category)) { this.m_ViewItemDictionary[current.Category].Add(listViewItem); } else { this.m_ViewItemDictionary.Add(current.Category, new List()); this.m_ViewItemDictionary[current.Category].Add(listViewItem); } num3++; if (num3 % 10 == 0) { Application.DoEvents(); } } } catch (Exception ex) { //RdbUtil.AddException(ex); } } private void InitView(IStyleGalleryClass galleryClass, List list) { try { long ticks = DateTime.Now.Ticks; this.m_ViewItemDictionary = new Dictionary>(); this.lvSymbolView.Items.Clear(); this.lvSymbolView.Columns.Clear(); this.lvSymbolView.Groups.Clear(); ImageList imageList = new ImageList(); ImageList imageList2 = new ImageList(); int num = Convert.ToInt32(32.0 * galleryClass.PreviewRatio); int num2 = 32; if (num > 256) { num = 256; } imageList.ImageSize = new Size(num, num2); imageList2.ImageSize = new Size(num / 2, num2 / 2); this.lvSymbolView.Items.Clear(); this.lvSymbolView.Columns.Clear(); this.lvSymbolView.LargeImageList = imageList; this.lvSymbolView.SmallImageList = imageList2; this.lvSymbolView.Columns.Add("名称", 180, HorizontalAlignment.Left); this.lvSymbolView.Columns.Add("索引", 50, HorizontalAlignment.Left); this.lvSymbolView.Columns.Add("分组", 120, HorizontalAlignment.Left); int num3 = 0; foreach (IDoStyleGalleryItem current in list) { Bitmap value = StyleGalleryItemView.StyleGalleryItemToBmp(num2, galleryClass, current.Item); Bitmap value2 = StyleGalleryItemView.StyleGalleryItemToBmp(num2 / 2, galleryClass, current.Item); imageList.Images.Add(value); imageList2.Images.Add(value2); ListViewItem listViewItem = new ListViewItem(new string[] { current.Name, current.Number.ToString(), current.Category }, num3); listViewItem.Tag = current; this.lvSymbolView.Items.Add(listViewItem); if (this.m_ViewItemDictionary.ContainsKey(current.Category)) { this.m_ViewItemDictionary[current.Category].Add(listViewItem); } else { this.m_ViewItemDictionary.Add(current.Category, new List()); this.m_ViewItemDictionary[current.Category].Add(listViewItem); } num3++; if (num3 % 10 == 0) { Application.DoEvents(); } } long ticks2 = DateTime.Now.Ticks; } catch (Exception ex) { //RdbUtil.AddException(ex); } } private void tlstGalleryTree_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { TreeListHitInfo treeListHitInfo = this.tlstGalleryTree.CalcHitInfo(new Point(e.X, e.Y)); this.NodeChange(treeListHitInfo.Node); //if (treeListHitInfo.HitInfoType == HitInfoType.StateImage) //{ // this.SetCheckedNode(treeListHitInfo.Node); //} } } private void GetAllCheckedNode() { //this.m_DistStyleGalleryStorage.ClearGalleryPaths(); //foreach (TreeListNode treeListNode in this.m_DBRootNode.Nodes) //{ // CheckState checkState = (CheckState)treeListNode.GetValue("Check"); // if (checkState == CheckState.Checked) // { // IDoStyleGalleryPath doStyleGalleryPath = treeListNode.Tag as IDoStyleGalleryPath; // if (doStyleGalleryPath != null) // { // this.m_DistStyleGalleryStorage.AddDoStyleGalleryPath(doStyleGalleryPath); // } // } //} this.m_DistStyleGalleryStorage.ClearFiles(); foreach (TreeListNode treeListNode2 in this.m_LocalRootNode.Nodes) { CheckState checkState2 = (CheckState)treeListNode2.GetValue("Check"); if (checkState2 == CheckState.Checked) { string text = treeListNode2.Tag.ToString(); if (text != "") { this.m_DistStyleGalleryStorage.AddFile(text); } } } } private void RefreshView(string fileName) { if (!fileName.Equals("local")) { this.Cursor = Cursors.WaitCursor; IStyleGalleryClass styleGalleryClass = this.m_DistStyleGallery.get_Class(this.m_ClassIndex); List list3 = this.m_DistStyleGallery.get_Items(styleGalleryClass.Name, fileName, ""); List list4 = this.m_DistStyleGallery.get_Categories(styleGalleryClass.Name); list4.AddRange(this.m_DistStyleGallery.get_DoCategories(styleGalleryClass.Name)); this.InitCategories(list4); this.InitView(styleGalleryClass, list3); //IDoStyleGalleryClass doStyleGalleryClass = this.m_DistStyleGallery.get_DoClass(this.m_ClassIndex); //if (doStyleGalleryClass != null) //{ // IDoStyleGalleryPath path = null; // List list = this.m_DistStyleGallery.get_Items(doStyleGalleryClass.Name, path, ""); // list.AddRange(this.m_DistStyleGallery.get_Items(doStyleGalleryClass.Name, "", "")); // List list2 = this.m_DistStyleGallery.get_Categories(doStyleGalleryClass.Name); // list2.AddRange(this.m_DistStyleGallery.get_DoCategories(doStyleGalleryClass.Name)); // this.InitCategories(list2); // this.InitView(doStyleGalleryClass, list); //} //else //{ // if (this.m_OpenFileDialog != null) // { // IStyleGalleryClass styleGalleryClass = this.m_DistStyleGallery.get_Class(this.m_ClassIndex); // List list3 = this.m_DistStyleGallery.get_Items(styleGalleryClass.Name, this.m_OpenFileDialog.FileName, ""); // List list4 = this.m_DistStyleGallery.get_Categories(styleGalleryClass.Name); // list4.AddRange(this.m_DistStyleGallery.get_DoCategories(styleGalleryClass.Name)); // this.InitCategories(list4); // this.InitView(styleGalleryClass, list3); // } //} this.Cursor = Cursors.Default; } } private void btnMoreStyle_ItemClick(object sender, ItemClickEventArgs e) { string text = this.OpenServerStyleFile(); if (text != "") { this.AddFile(text); } } private string OpenServerStyleFile() { if (this.m_OpenFileDialog == null) { this.m_OpenFileDialog = new KGIS.Framework.Utils.Dialog.OpenFileDialog(); } this.m_OpenFileDialog.Filter = "ESRI ServerStyle(*.ServerStyle)|*.ServerStyle"; this.m_OpenFileDialog.InitialDirectory = this.m_DistStyleGalleryStorage.DefaultStylePath; if (this.m_OpenFileDialog.ShowDialog()) { return this.m_OpenFileDialog.FileName; } return ""; } private void AddFile(string filename) { if (!File.Exists(filename)) { return; } bool flag = false; TreeListNode selectNode = null; foreach (TreeListNode treeListNode in this.m_LocalRootNode.Nodes) { if (treeListNode.Tag.ToString() == filename) { selectNode = treeListNode; flag = true; } } if (!flag) { FileInfo fileInfo = new FileInfo(filename); TreeListNode treeListNode2 = this.tlstGalleryTree.AppendNode(new object[] { fileInfo.Name, CheckState.Unchecked }, this.m_LocalRootNode); treeListNode2.Tag = fileInfo.FullName; this.NodeChange(treeListNode2); } else { this.NodeChange(selectNode); } } private void lvSymbolView_SelectedIndexChanged(object sender, System.EventArgs e) { this.m_DistStyleGalleryItem = null; if (this.lvSymbolView.SelectedItems.Count > 0) { if (this.lvSymbolView.SelectedItems[0].Tag is IDoStyleGalleryItem) { this.m_DistStyleGalleryItem = (this.lvSymbolView.SelectedItems[0].Tag as IDoStyleGalleryItem); if (this.m_DistStyleGalleryItem != null) { this.btnOK.Enabled = true; this.m_SelectSymbol = this.m_DistStyleGalleryItem; this.resultSymbol = this.m_SelectSymbol.Item.Item; this.PreviewGalleryItem(); return; } } } else { this.btnOK.Enabled = false; } } private void chkLargeIcon_CheckedChanged(object sender, ItemClickEventArgs e) { if (this.chkLargeIcon.Checked) { this.lvSymbolView.View = System.Windows.Forms.View.LargeIcon; } } private void chkSmallIcon_CheckedChanged(object sender, ItemClickEventArgs e) { if (this.chkSmallIcon.Checked) { this.lvSymbolView.View = System.Windows.Forms.View.SmallIcon; } } private void chkTile_CheckedChanged(object sender, ItemClickEventArgs e) { if (this.chkTile.Checked) { this.lvSymbolView.View = System.Windows.Forms.View.Tile; } } private void chkDetail_CheckedChanged(object sender, ItemClickEventArgs e) { if (this.chkDetail.Checked) { this.lvSymbolView.View = System.Windows.Forms.View.Details; } } private void chkList_CheckedChanged(object sender, ItemClickEventArgs e) { if (this.chkList.Checked) { this.lvSymbolView.View = System.Windows.Forms.View.List; } } private void lvSymbolView_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { this.pmView.ShowPopup(System.Windows.Forms.Control.MousePosition); } } private void PreviewGalleryItem() { try { //霍岩 2018-11-13 刷新右侧预览PictureEdit this.picPreview.Image = StyleGalleryItemView.StyleGalleryItemToBmp(64, m_DistStyleGallery.get_Class(this.m_ClassIndex), m_DistStyleGalleryItem.Item); if (this.m_CurrentUc != null) { this.m_SrcSymbolClone = (this.m_DistStyleGalleryItem.Item.Item as IClone); if (this.m_SrcSymbolClone != null) { this.m_TarCloneSymbol = (this.m_SrcSymbolClone.Clone() as ISymbol); this.m_CurrentUc.Init(ref this.m_TarCloneSymbol); } } } catch (Exception ex) { //RdbUtil.AddException(ex); } } private void btnOK_Click(object sender, System.EventArgs e) { if (this.m_TarCloneSymbol != null) { this.m_DistStyleGalleryItem.Item.Item = this.m_TarCloneSymbol; this.resultSymbol = this.m_TarCloneSymbol; } base.DialogResult = DialogResult.OK; base.Close(); } public bool Save() { return true; } public void DiscardModify() { } public bool CanLeave() { return true; } public void RefreshData() { } public void SimpleCallBack(CallBack param) { } public void Initialize() { } private void barCategories_EditValueChanged(object sender, System.EventArgs e) { try { this.Cursor = Cursors.WaitCursor; string text = this.barCategories.EditValue.ToString(); this.lvSymbolView.Items.Clear(); if (text == "<所有分组>") { if (this.m_ViewItemDictionary == null) return; using (Dictionary>.Enumerator enumerator = this.m_ViewItemDictionary.GetEnumerator()) { while (enumerator.MoveNext()) { KeyValuePair> current = enumerator.Current; this.lvSymbolView.Items.AddRange(current.Value.ToArray()); } goto IL_DF; } } foreach (KeyValuePair> current2 in this.m_ViewItemDictionary) { if (current2.Key == text) { this.lvSymbolView.Items.AddRange(current2.Value.ToArray()); } } IL_DF: this.Cursor = Cursors.Default; } catch { this.Cursor = Cursors.Default; } } bool IUIPlugIn.Visible { get; set; } DialogResult ISymbolSelector.ShowDialog() { return base.ShowDialog(); } DialogResult ISymbolSelector.ShowDialog(IWin32Window owner) { return base.ShowDialog(owner); } FormStartPosition ISymbolSelector.StartPosition { get; set; } /// /// 取消按钮点击事件 /// /// /// /// 霍岩 2018-11-13 增加 private void btnCancel_Click(object sender, System.EventArgs e) { this.resultSymbol = null; base.DialogResult = DialogResult.Cancel; base.Close(); } private void btnView_ItemClick(object sender, ItemClickEventArgs e) { } } }