OptionDialog.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:11k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: OptionDialog.cs,v 1.2 2005/04/20 08:45:45 okajima Exp $
  4. */
  5. using System;
  6. using System.Drawing;
  7. using System.Collections;
  8. using System.Diagnostics;
  9. using System.ComponentModel;
  10. using System.Windows.Forms;
  11. using Poderosa.Config;
  12. using Poderosa.UI;
  13. namespace Poderosa.Forms
  14. {
  15. internal class OptionDialog : System.Windows.Forms.Form
  16. {
  17. private enum PageID {
  18. NotSelected = -1,
  19. Display = 0,
  20. Terminal,
  21. Peripheral,
  22. Command,
  23. SSH,
  24. Connection,
  25. Generic,
  26. COUNT
  27. }
  28. public abstract class CategoryPanel : Panel {
  29. public abstract void InitUI(ContainerOptions options);
  30. public abstract bool Commit(ContainerOptions options);
  31. }
  32. private CategoryPanel[] _pages;
  33. //嵞搙僟僀傾儘僌傪奐偄偰傕奐偄偰偄偨儁乕僕偑巆傞傛偆偵static
  34. private static PageID _currentPageID = PageID.Display;
  35. private ContainerOptions _options;
  36. private System.Windows.Forms.ImageList _imageList;
  37. private System.Windows.Forms.Panel _categoryItems;
  38. private System.Windows.Forms.Button _okButton;
  39. private System.Windows.Forms.Button _cancelButton;
  40. private System.ComponentModel.IContainer components;
  41. public OptionDialog()
  42. {
  43. //
  44. // Windows 僼僅乕儉 僨僓僀僫 僒億乕僩偵昁梫偱偡丅
  45. //
  46. InitializeComponent();
  47. if(!this.DesignMode) {
  48. FillText();
  49. InitItems();
  50. _options = (ContainerOptions)GApp.Options.Clone();
  51. _pages = new CategoryPanel[(int)PageID.COUNT];
  52. }
  53. }
  54. /// <summary>
  55. /// 巊梡偝傟偰偄傞儕僜乕僗偵屻張棟傪幚峴偟傑偡丅
  56. /// </summary>
  57. protected override void Dispose( bool disposing )
  58. {
  59. if( disposing )
  60. {
  61. if(components != null)
  62. {
  63. components.Dispose();
  64. }
  65. }
  66. base.Dispose( disposing );
  67. }
  68. #region Windows 僼僅乕儉 僨僓僀僫偱惗惉偝傟偨僐乕僪 
  69. /// <summary>
  70. /// 僨僓僀僫 僒億乕僩偵昁梫側儊僜僢僪偱偡丅偙偺儊僜僢僪偺撪梕傪
  71. /// 僐乕僪 僄僨傿僞偱曄峏偟側偄偱偔偩偝偄丅
  72. /// </summary>
  73. private void InitializeComponent()
  74. {
  75. this.components = new System.ComponentModel.Container();
  76. System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(OptionDialog));
  77. this._imageList = new System.Windows.Forms.ImageList(this.components);
  78. this._categoryItems = new System.Windows.Forms.Panel();
  79. this._okButton = new System.Windows.Forms.Button();
  80. this._cancelButton = new System.Windows.Forms.Button();
  81. this.SuspendLayout();
  82. // 
  83. // _imageList
  84. // 
  85. this._imageList.ImageSize = new System.Drawing.Size(32, 32);
  86. this._imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("_imageList.ImageStream")));
  87. this._imageList.TransparentColor = System.Drawing.Color.Teal;
  88. // 
  89. // _categoryItems
  90. // 
  91. this._categoryItems.BackColor = System.Drawing.SystemColors.Window;
  92. this._categoryItems.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
  93. this._categoryItems.Location = new System.Drawing.Point(4, 0);
  94. this._categoryItems.Name = "_categoryItems";
  95. this._categoryItems.Size = new System.Drawing.Size(72, 376);
  96. this._categoryItems.TabIndex = 3;
  97. // 
  98. // _okButton
  99. // 
  100. this._okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
  101. this._okButton.FlatStyle = System.Windows.Forms.FlatStyle.System;
  102. this._okButton.Location = new System.Drawing.Point(336, 384);
  103. this._okButton.Name = "_okButton";
  104. this._okButton.TabIndex = 1;
  105. this._okButton.Click += new System.EventHandler(this.OnOK);
  106. // 
  107. // _cancelButton
  108. // 
  109. this._cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
  110. this._cancelButton.FlatStyle = System.Windows.Forms.FlatStyle.System;
  111. this._cancelButton.Location = new System.Drawing.Point(432, 384);
  112. this._cancelButton.Name = "_cancelButton";
  113. this._cancelButton.TabIndex = 2;
  114. // 
  115. // OptionDialog
  116. // 
  117. this.AcceptButton = this._okButton;
  118. this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
  119. this.CancelButton = this._cancelButton;
  120. this.ClientSize = new System.Drawing.Size(528, 414);
  121. this.Controls.Add(this._cancelButton);
  122. this.Controls.Add(this._okButton);
  123. this.Controls.Add(this._categoryItems);
  124. this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
  125. this.MaximizeBox = false;
  126. this.MinimizeBox = false;
  127. this.Name = "OptionDialog";
  128. this.ShowInTaskbar = false;
  129. this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
  130. this.Text = "OptionDialog";
  131. this.ResumeLayout(false);
  132. }
  133. #endregion
  134. private void FillText() {
  135. this._okButton.Text = GApp.Strings.GetString("Common.OK");
  136. this._cancelButton.Text = GApp.Strings.GetString("Common.Cancel");
  137. this.Text = GApp.Strings.GetString("Form.OptionDialog.Text");
  138. }
  139. private void InitItems() {
  140. int y = 8;
  141. for(int i=0; i<(int)PageID.COUNT; i++) {
  142. PanelItem item = new PanelItem(this, i, _imageList.Images[i], GApp.Strings.GetString(GetStringIDFor(i)));
  143. item.Location = new Point(4, y);
  144. _categoryItems.Controls.Add(item);
  145. y += 52;
  146. }
  147. }
  148. private PanelItem PanelItemAt(PageID index) {
  149. return (PanelItem)_categoryItems.Controls[(int)index];
  150. }
  151. public void SelectItem(int index) {
  152. if((PageID)index==_currentPageID) return;
  153. //尰嵼偺撪梕偱Commit偱偒偨応崌偺傒慖戰偝傟偨儁乕僕傪昞帵
  154. if(ClosePage())
  155. ShowPage((PageID)index);
  156. }
  157. public void SetHilightingItemIndex(int index) {
  158. foreach(PanelItem item in _categoryItems.Controls) {
  159. item.Hilight = item.Index==index;
  160. }
  161. }
  162. protected override void OnLoad(EventArgs e) {
  163. base.OnLoad (e);
  164. ShowPage(_currentPageID);
  165. }
  166. private bool ClosePage() {
  167. CategoryPanel cp = _pages[(int)_currentPageID];
  168. if(!cp.Commit(_options)) return false;
  169. this.Controls.Remove(cp);
  170. PanelItemAt(_currentPageID).Selected = false;
  171. _categoryItems.Invalidate(true);
  172. return true;
  173. }
  174. private void ShowPage(PageID p) {
  175. if(_pages[(int)p]==null)
  176. _pages[(int)p] = CreatePage(p);
  177. _currentPageID = p;
  178. CategoryPanel cp = _pages[(int)p];
  179. cp.InitUI(_options);
  180. this.Controls.Add(cp);
  181. PanelItemAt(p).Selected = true;
  182. _categoryItems.Invalidate(true);
  183. }
  184. private CategoryPanel CreatePage(PageID p) {
  185. CategoryPanel panel = null;
  186. switch(p) {
  187. case PageID.Display:
  188. panel = new DisplayOptionPanel();
  189. break;
  190. case PageID.Terminal:
  191. panel = new TerminalOptionPanel();
  192. break;
  193. case PageID.Peripheral:
  194. panel = new PeripheralOptionPanel();
  195. break;
  196. case PageID.Command:
  197. panel = new CommandOptionPanel();
  198. break;
  199. case PageID.SSH:
  200. panel = new SSHOptionPanel();
  201. break;
  202. case PageID.Connection:
  203. panel = new ConnectionOptionPanel();
  204. break;
  205. case PageID.Generic:
  206. panel = new GenericOptionPanel();
  207. break;
  208. }
  209. Debug.Assert(panel!=null);
  210. panel.BorderStyle = BorderStyle.FixedSingle;
  211. panel.Location = new Point(_categoryItems.Right + 4, _categoryItems.Top);
  212. panel.Size = new Size(this.Width - _categoryItems.Width - 16, _categoryItems.Height);
  213. return panel;
  214. }
  215. private void OnOK(object sender, EventArgs args) {
  216. bool ok = ClosePage();
  217. if(ok) {
  218. DialogResult = DialogResult.OK;
  219. GApp.UpdateOptions(_options);
  220. }
  221. else {
  222. DialogResult = DialogResult.None;
  223. }
  224. }
  225. private static string GetStringIDFor(int id) {
  226. switch((PageID)id) {
  227. case PageID.Display:
  228. return "Form.OptionDialog._displayPanel";
  229. case PageID.Terminal:
  230. return "Form.OptionDialog._terminalPanel";
  231. case PageID.Peripheral:
  232. return "Form.OptionDialog._peripheralConfigPanel";
  233. case PageID.Command:
  234. return "Form.OptionDialog._commandPanel";
  235. case PageID.SSH:
  236. return "Form.OptionDialog._sshPanel";
  237. case PageID.Connection:
  238. return "Form.OptionDialog._connectionPanel";
  239. case PageID.Generic:
  240. return "Form.OptionDialog._genericPanel";
  241. }
  242. Debug.Assert(false, "should not reach here");
  243. return null;
  244. }
  245. }
  246. internal class PanelItem : UserControl {
  247. private int _index;
  248. private Image _image;
  249. private OptionDialog _parent;
  250. private string _caption;
  251. private bool _selected;
  252. private bool _hilight;
  253. private static Brush _textBrush = new SolidBrush(SystemColors.WindowText);
  254. private static Size _defaultSize = new Size(64, 48);
  255. private static DrawUtil.RoundRectColors _selectedColors;
  256. private static DrawUtil.RoundRectColors _hilightColors;
  257. public PanelItem(OptionDialog parent, int index, Image image, string caption) {
  258. _parent = parent;
  259. _index = index;
  260. _image = image;
  261. _caption = caption;
  262. this.Size = _defaultSize;
  263. this.TabStop = true;
  264. AdjustBackColor();
  265. }
  266. public int Index {
  267. get {
  268. return _index;
  269. }
  270. }
  271. public bool Selected {
  272. get {
  273. return _selected;
  274. }
  275. set {
  276. _selected = value;
  277. AdjustBackColor();
  278. }
  279. }
  280. public bool Hilight {
  281. get {
  282. return _hilight;
  283. }
  284. set {
  285. _hilight = value;
  286. AdjustBackColor();
  287. }
  288. }
  289. protected override void OnMouseEnter(EventArgs e) {
  290. base.OnMouseEnter(e);
  291. _parent.SetHilightingItemIndex(_selected? -1 : _index);
  292. }
  293. protected override void OnGotFocus(EventArgs e) {
  294. base.OnGotFocus (e);
  295. _parent.SetHilightingItemIndex(_selected? -1 : _index);
  296. }
  297. protected override void OnKeyDown(KeyEventArgs e) {
  298. base.OnKeyDown (e);
  299. if(e.KeyCode==Keys.Space) {
  300. _parent.SelectItem(_index);
  301. }
  302. }
  303. protected override void OnClick(EventArgs e) {
  304. base.OnClick (e);
  305. _parent.SelectItem(_index);
  306. }
  307. protected override void OnPaint(PaintEventArgs e) {
  308. base.OnPaint (e);
  309. const int image_size = 32; //square image
  310. if(_selectedColors==null) CreateColor();
  311. Graphics g = e.Graphics;
  312. if(_selected)
  313. DrawUtil.DrawRoundRect(g, 0, 0, this.Width-1, this.Height-1, _selectedColors);
  314. else if(_hilight)
  315. DrawUtil.DrawRoundRect(g, 0, 0, this.Width-1, this.Height-1, _hilightColors);
  316. g.DrawImage(_image, (this.Width - image_size)/2, 0);
  317. SizeF sz = g.MeasureString(_caption, this.Font);
  318. g.DrawString(_caption, this.Font, _textBrush, (int)(this.Width-sz.Width)/2, image_size);
  319. }
  320. private void AdjustBackColor() {
  321. if(_selected)
  322. this.BackColor = Color.Orange;
  323. else if(_hilight)
  324. this.BackColor = DrawUtil.LightColor(Color.Orange);
  325. else
  326. this.BackColor = SystemColors.Window;
  327. }
  328. private static void CreateColor() {
  329. _selectedColors = new DrawUtil.RoundRectColors();
  330. _selectedColors.border_color = DrawUtil.ToCOLORREF(Color.DarkRed);
  331. _selectedColors.inner_color = DrawUtil.ToCOLORREF(Color.Orange);
  332. _selectedColors.outer_color = DrawUtil.ToCOLORREF(SystemColors.Window);
  333. _selectedColors.lightlight_color = DrawUtil.MergeColor(_selectedColors.border_color, _selectedColors.outer_color);
  334. _selectedColors.light_color = DrawUtil.MergeColor(_selectedColors.lightlight_color, _selectedColors.border_color);
  335. _hilightColors = new DrawUtil.RoundRectColors();
  336. _hilightColors.border_color = DrawUtil.ToCOLORREF(Color.Pink);
  337. _hilightColors.inner_color = DrawUtil.ToCOLORREF(DrawUtil.LightColor(Color.Orange));
  338. _hilightColors.outer_color = DrawUtil.ToCOLORREF(SystemColors.Window);
  339. _hilightColors.lightlight_color = DrawUtil.MergeColor(_hilightColors.border_color, _hilightColors.outer_color);
  340. _hilightColors.light_color = DrawUtil.MergeColor(_hilightColors.lightlight_color, _hilightColors.border_color);
  341. }
  342. }
  343. }