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

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: TabBar.cs,v 1.2 2005/04/20 08:45:45 okajima Exp $
  4. */
  5. using System;
  6. using System.Diagnostics;
  7. using System.Drawing;
  8. using System.Collections;
  9. using System.ComponentModel;
  10. using System.Windows.Forms;
  11. using Poderosa.Connection;
  12. using Poderosa.ConnectionParam;
  13. using Poderosa.Communication;
  14. using Poderosa.Terminal;
  15. using Poderosa.Config;
  16. using Poderosa.UI;
  17. namespace Poderosa.Forms {
  18. /// <summary>
  19. /// TabBar 偺奣梫偺愢柧偱偡丅
  20. /// </summary>
  21. internal class TabBar : UserControl {
  22. private ToolTip _tabToolTip;
  23. private const int UNITHEIGHT = 25; //!!偙傟偼僼僅儞僩偐傜偪傖傫偲寁嶼偟側偄偲偄偗側偄偩傠偆
  24. private const int SCROLLBUTTON_SIZE = 18;
  25. private const int BUTTON_MARGIN = 4;
  26. private System.ComponentModel.IContainer components;
  27. private int _scrollStep; //僗僋儘乕儖儃僞儞傪墴偟偨偲偒偺傾僯儊乕僔儑儞偵巊偆僇僂儞僩
  28. private const int ANIMATION_COUNT = 15;
  29. //奺Tab傪奿擺偡傞僐儗僋僔儑儞
  30. //僗僋儘乕儖僗僞僀儖偱偁偭偰傕丄昁梫側儃僞儞偼忢偵懚嵼偡傞丅埵抲偲Visible偺挷惍偩偗偱偁傞丅
  31. private Color _activeTabColor;
  32. private Font  _basicFont;
  33. private Font  _activeTabFont;
  34. private Bitmap _tabIconDefault;
  35. private Bitmap _tabIconSerial;
  36. private Bitmap _tabIconCygwin;
  37. private Bitmap _tabIconSFU;
  38. private TabBarScrollButton _leftScrollButton;
  39. private TabBarScrollButton _rightScrollButton;
  40. private int _scrollButtonOffset;
  41. public TabBar() {
  42. //
  43. // Windows 僼僅乕儉 僨僓僀僫 僒億乕僩偵昁梫偱偡丅
  44. //
  45. InitializeComponent();
  46. //
  47. // TODO: InitializeComponent 屇傃弌偟偺屻偵丄僐儞僗僩儔僋僞 僐乕僪傪捛壛偟偰偔偩偝偄丅
  48. //
  49. Color c = SystemColors.Control;
  50. _activeTabColor = Color.FromArgb((c.R+255)/2, (c.G+255)/2, (c.B+255)/2); //敀偲偺拞娫傪偲傞
  51. _basicFont = (Font)this.Font.Clone();
  52. _activeTabFont = new Font(_basicFont, _basicFont.Style|FontStyle.Bold);
  53. _tabToolTip = new ToolTip();
  54. if(GApp.Options.TabBarStyle==TabBarStyle.ScrollButton)
  55. InitScrollButtons();
  56. }
  57. private Bitmap GetTabIcon(ConnectionTag tag) {
  58. if(_tabIconDefault==null) {
  59. _tabIconDefault = (Bitmap)IconList.LoadIcon(IconList.ICON_NEWCONNECTION);
  60. _tabIconSerial  = (Bitmap)IconList.LoadIcon(IconList.ICON_SERIAL);
  61. _tabIconCygwin  = (Bitmap)IconList.LoadIcon(IconList.ICON_CYGWIN);
  62. _tabIconSFU     = (Bitmap)IconList.LoadIcon(IconList.ICON_SFU);
  63. }
  64. if(tag.Connection.Param is SFUTerminalParam)
  65. return _tabIconSFU;
  66. else if(tag.Connection.Param is CygwinTerminalParam)
  67. return _tabIconCygwin;
  68. else if(tag.Connection.Param is SerialTerminalParam)
  69. return _tabIconSerial;
  70. else
  71. return _tabIconDefault;
  72. }
  73. private void InitScrollButtons() {
  74. _leftScrollButton = new TabBarScrollButton();
  75. _leftScrollButton._isRight = false;
  76. _leftScrollButton.Enabled = false;
  77. _leftScrollButton.Width = SCROLLBUTTON_SIZE;
  78. _leftScrollButton.Height = SCROLLBUTTON_SIZE;
  79. _leftScrollButton.BringToFront();
  80. _leftScrollButton.Click += new EventHandler(OnLeftScrollButtonClicked);
  81. this.Controls.Add(_leftScrollButton);
  82. _rightScrollButton = new TabBarScrollButton();
  83. _rightScrollButton._isRight = true;
  84. _rightScrollButton.Enabled = false;
  85. _rightScrollButton.Width = SCROLLBUTTON_SIZE;
  86. _rightScrollButton.Height = SCROLLBUTTON_SIZE;
  87. _rightScrollButton.BringToFront();
  88. _rightScrollButton.Click += new EventHandler(OnRightScrollButtonClicked);
  89. this.Controls.Add(_rightScrollButton);
  90. }
  91. public void AddTab(ConnectionTag ct) {
  92. Control b = CreateNewButton(ct);
  93. Controls.Add(b);
  94. if(GApp.Options.TabBarStyle==TabBarStyle.ScrollButton) {
  95. int width  = GetTabAreaWidth();
  96. int index = GEnv.Connections.Count;
  97. while(width > 0 && index>0) {
  98. index--;
  99. width -= GetNecessaryButtonWidth(GEnv.Connections.TagAt(index));
  100. }
  101. index++;
  102. if(index>=GEnv.Connections.Count) index = GEnv.Connections.Count-1;
  103. if(index<0) index=0;
  104. _scrollButtonOffset = index;
  105. }
  106. ArrangeButtons();
  107. }
  108. public void RemoveTab(ConnectionTag ct) {
  109. if(ct!=null) {
  110. int n = GEnv.Connections.IndexOf(ct);
  111. if(n==_scrollButtonOffset) _scrollButtonOffset--;
  112. if(_scrollButtonOffset<0) _scrollButtonOffset=0;
  113. if(ct.Button!=null) Controls.Remove(ct.Button);
  114. ArrangeButtons();
  115. }
  116. }
  117. public void Clear() {
  118. Controls.Clear();
  119. if(GApp.Options.TabBarStyle==TabBarStyle.ScrollButton) {
  120. InitScrollButtons();
  121. ArrangeButtons();
  122. }
  123. }
  124. public void RefreshConnection(ConnectionTag tag) {
  125. if(tag.Button==null) return;
  126. SetButtonText(tag.Button as TabBarButton, GEnv.Connections.IndexOf(tag), tag);
  127. ((TabBarButton)tag.Button).Image = GetTabIcon(tag);
  128. _tabToolTip.SetToolTip(tag.Button, tag.FormatFrameText());
  129. }
  130. private Control CreateNewButton(ConnectionTag ct) {
  131. TabBarButton b = new TabBarButton();
  132. ct.Button = b;
  133. SetButtonText(b, Controls.Count-1, ct);
  134. _tabToolTip.SetToolTip(b, ct.FormatFrameText());
  135. //b.Image = _imageList.Images[(int)e.item.Type];
  136. b.Tag = ct;
  137. b.Font = _basicFont;
  138. b.Width = GetNecessaryButtonWidth(b); 
  139. b.Visible = true;
  140. b.TabStop = false;
  141. b.Click += new EventHandler(this.OnButtonClick);
  142. b.MouseDown += new MouseEventHandler(OnMouseDown);
  143. b.MouseUp += new MouseEventHandler(OnMouseUp);
  144. b.MouseMove += new MouseEventHandler(OnMouseMove);
  145. return b;
  146. }
  147. private int GetNecessaryButtonWidth(Control b) {
  148. return (int)b.CreateGraphics().MeasureString(b.Text, _activeTabFont).Width + 37;//37偼傾僀僐儞丄僀儞僨僋僗丄嵍塃儅乕僕儞偺崌寁
  149. }
  150. private int GetNecessaryButtonWidth(ConnectionTag ct) {
  151. return (int)ct.Button.CreateGraphics().MeasureString((GEnv.Connections.IndexOf(ct)+1).ToString()+ct.FormatTabText(), _activeTabFont).Width + 37;//37偼傾僀僐儞丄僀儞僨僋僗丄嵍塃儅乕僕儞偺崌寁
  152. }
  153. private int GetTabAreaWidth() {
  154. int b = this.Width-4;
  155. if(GApp.Options.TabBarStyle==TabBarStyle.ScrollButton)
  156. b -= SCROLLBUTTON_SIZE*2;
  157. return b;
  158. }
  159. private void OnButtonClick(object sender, EventArgs args) {
  160. TabBarButton b = (TabBarButton)sender;
  161. GApp.GlobalCommandTarget.ActivateConnection(((ConnectionTag)b.Tag).Connection);
  162. }
  163. private void OnMouseUp(object sender, MouseEventArgs args) {
  164. if(args.Button!=MouseButtons.Right) return;
  165. TabBarButton b = (TabBarButton)sender;
  166. int tx = this.Left + b.Left;
  167. int ty = this.Top + b.Top;
  168. ConnectionTag t = (ConnectionTag)b.Tag;
  169. Debug.Assert(t!=null);
  170. GApp.Frame.CommandTargetConnection = t.Connection;
  171. //儊僯儏乕偺UI挷惍
  172. GApp.Frame.AdjustContextMenu(true, t.Connection);
  173. GApp.Frame.ContextMenu.Show(GApp.Frame, new Point(tx+args.X, ty+args.Y)); //儃僞儞傗僞僽僶乕傪僐儞僥僫偵偡傞偲僉乕儃乕僪偱慖戰偱偒側偔側傞
  174. }
  175. //偨偩僋儕僢僋偟偨偩偗偱MouseMove偑敪惗偟偰偟傑偆偺偱丄惓偟偔僪儔僢僌奐巒傪敾掕偱偒側偄
  176. private int _dragStartPosX;
  177. private int _dragStartPosY;
  178. private void OnMouseDown(object sender, MouseEventArgs args) {
  179. if(args.Button!=MouseButtons.Left) return;
  180. _dragStartPosX = args.X;
  181. _dragStartPosY = args.Y;
  182. }
  183. private void OnMouseMove(object sender, MouseEventArgs args) {
  184. if(args.Button!=MouseButtons.Left) return;
  185. if(Math.Abs(_dragStartPosX-args.X) + Math.Abs(_dragStartPosY-args.Y) >= 3) {
  186. object tag = ((TabBarButton)sender).Tag;
  187. this.DoDragDrop(tag, DragDropEffects.Move);
  188. TabBarButton btn = sender as TabBarButton;
  189. if(btn!=null) btn.Reset();
  190. }
  191. }
  192. private void OnLeftScrollButtonClicked(object sender, EventArgs args) {
  193. _scrollButtonOffset--;
  194. _scrollStep = ANIMATION_COUNT-1;
  195. _leftScrollButton.Enabled = false;
  196. _rightScrollButton.Enabled = false;
  197. int w = GEnv.Connections.TagAt(_scrollButtonOffset).Button.Width;
  198. ArrangeButtonsForScrollStyle(true, -(w * _scrollStep / ANIMATION_COUNT));
  199. Timer t = new Timer();
  200. t.Interval = 20;
  201. t.Tick += new EventHandler(OnLeftScrollAnimation);
  202. t.Start();
  203. }
  204. private void OnRightScrollButtonClicked(object sender, EventArgs args) {
  205. _scrollStep = ANIMATION_COUNT-1;
  206. _leftScrollButton.Enabled = false;
  207. _rightScrollButton.Enabled = false;
  208. int w = GEnv.Connections.TagAt(_scrollButtonOffset).Button.Width;
  209. ArrangeButtonsForScrollStyle(true, -(w * (ANIMATION_COUNT-_scrollStep) / ANIMATION_COUNT));
  210. Timer t = new Timer();
  211. t.Interval = 20;
  212. t.Tick += new EventHandler(OnRightScrollAnimation);
  213. t.Start();
  214. //_scrollButtonOffset++;
  215. //ArrangeButtons();
  216. }
  217. private void OnLeftScrollAnimation(object sender, EventArgs args) {
  218. _scrollStep--;
  219. if(_scrollStep==0) {
  220. ((Timer)sender).Stop();
  221. ArrangeButtonsForScrollStyle(false, 0);
  222. }
  223. else {
  224. int w = GEnv.Connections.TagAt(_scrollButtonOffset).Button.Width;
  225. ArrangeButtonsForScrollStyle(_scrollStep>0, -(w * _scrollStep / ANIMATION_COUNT));
  226. }
  227. }
  228. private void OnRightScrollAnimation(object sender, EventArgs args) {
  229. _scrollStep--;
  230. if(_scrollStep==0) {
  231. _scrollButtonOffset++;
  232. ((Timer)sender).Stop();
  233. ArrangeButtonsForScrollStyle(false, 0);
  234. }
  235. else {
  236. int w = GEnv.Connections.TagAt(_scrollButtonOffset).Button.Width;
  237. ArrangeButtonsForScrollStyle(true, -(w * (ANIMATION_COUNT-_scrollStep) / ANIMATION_COUNT));
  238. }
  239. }
  240. public void SetActiveTab(ConnectionTag active) {
  241. TabBarButton b;
  242. foreach(ConnectionTag ct in GEnv.Connections) {
  243. b = ct.Button as TabBarButton;
  244. if(active==ct) {
  245. b.BackColor = _activeTabColor;
  246. b.Font = _activeTabFont;
  247. b.Selected = true;
  248. if(GApp.Options.TabBarStyle==TabBarStyle.ScrollButton) {
  249. if(!b.Visible) {
  250. int index = GEnv.Connections.IndexOf(ct);
  251. if(index!=-1) EnsureButtonVisible(index);
  252. }
  253. }
  254. }
  255. else {
  256. b.BackColor = SystemColors.Control;
  257. b.Font = _basicFont;
  258. b.Selected = false;
  259. }
  260. b.Invalidate();
  261. }
  262. }
  263. //僗僋儘乕儖僗僞僀儖偵偍偄偰丄尒偊偰偄側偄儃僞儞偑尒偊傞埵抲傑偱傕偭偰偄偔
  264. private void EnsureButtonVisible(int index) {
  265. if(index < _scrollButtonOffset) {
  266. _scrollButtonOffset = index;
  267. }
  268. else {
  269. int width  = GetTabAreaWidth() - 30;
  270. while(width > 0 && index>=0) {
  271. width -= GetNecessaryButtonWidth(GEnv.Connections.TagAt(index--));
  272. }
  273. index++;
  274. if(index>=GEnv.Connections.Count) index = GEnv.Connections.Count-1;
  275. _scrollButtonOffset = index;
  276. }
  277. ArrangeButtons();
  278. }
  279. //弴斣偺擖傟懼偊
  280. public void ReorderButton(int index, int new_index, ConnectionTag active_tag) {
  281. this.Controls.SetChildIndex(this.Controls[index], new_index);
  282. ArrangeButtons();
  283. SetActiveTab(active_tag);
  284. }
  285. //儃僞儞偺嵞攝抲
  286. public void ArrangeButtons() {
  287. if(GApp.Options.TabBarStyle==TabBarStyle.ScrollButton)
  288. ArrangeButtonsForScrollStyle(false, 0);
  289. else
  290. ArrangeButtonsForMultiRowStyle();
  291. }
  292. public void ApplyOptions(ContainerOptions opt) {
  293. if(opt.TabBarStyle==TabBarStyle.ScrollButton)
  294. ArrangeButtonsForScrollStyle(false, 0);
  295. else
  296. ArrangeButtonsForMultiRowStyle();
  297. }
  298. private void ArrangeButtonsForMultiRowStyle() {
  299. if(_leftScrollButton!=null) {
  300. this.Controls.Remove(_leftScrollButton);
  301. this.Controls.Remove(_rightScrollButton);
  302. _leftScrollButton = _rightScrollButton = null;
  303. }
  304. int x = 2;
  305. int y = 3;
  306. int i = 0;
  307. foreach(Control c in Controls) {
  308. TabBarButton button = c as TabBarButton;
  309. if(button==null) continue;
  310. SetButtonText(button, i, (ConnectionTag)button.Tag);
  311. if(x + button.Width >= this.Width) {
  312. x = 2;
  313. y += UNITHEIGHT;
  314. }
  315. button.Left = x;
  316. button.Width = GetNecessaryButtonWidth((ConnectionTag)button.Tag);
  317. x += button.Width + BUTTON_MARGIN;
  318. button.Top = y;
  319. button.Visible = true;
  320. button.Height = UNITHEIGHT - 4;
  321. button.Invalidate();
  322. i++;
  323. }
  324. this.Height = y + UNITHEIGHT;
  325. }
  326. private void ArrangeButtonsForScrollStyle(bool animation, int animation_offset) {
  327. if(_leftScrollButton==null) InitScrollButtons();
  328. for(int i=0; i<_scrollButtonOffset; i++) GEnv.Connections.TagAt(i).Button.Visible = false;
  329. int x = 2;
  330. int y = 3;
  331. int limit = x + GetTabAreaWidth();
  332. x += animation_offset;
  333. int offset = _scrollButtonOffset;
  334. int index = offset;
  335. while(offset < GEnv.Connections.Count) {
  336. ConnectionTag ct = GEnv.Connections.TagAt(offset);
  337. if(!ct.IsTerminated) {
  338. TabBarButton button = (TabBarButton)ct.Button;
  339. button.Left = x;
  340. button.Width = GetNecessaryButtonWidth(ct);
  341. SetButtonText(button, index, ct);
  342. if(x > limit && offset>_scrollButtonOffset) break; //彮側偔偲傕堦偮偼儃僞儞傪昞帵偡傞
  343. button.Top = y;
  344. button.Visible = true;
  345. button.Height = UNITHEIGHT - 4;
  346. x += button.Width + BUTTON_MARGIN;
  347. index++;
  348. }
  349. offset++;
  350. }
  351. for(int i=offset; i<GEnv.Connections.Count; i++) GEnv.Connections.TagAt(i).Button.Visible = false;
  352. _leftScrollButton.Left = this.Width-SCROLLBUTTON_SIZE*2;
  353. _leftScrollButton.Top  = y+2;
  354. _leftScrollButton.BringToFront();
  355. _leftScrollButton.Enabled = !animation && _scrollButtonOffset>0;
  356. _rightScrollButton.Left = this.Width-SCROLLBUTTON_SIZE;
  357. _rightScrollButton.Top  = y+2;
  358. _rightScrollButton.BringToFront();
  359. _rightScrollButton.Enabled = !animation && offset<GEnv.Connections.Count;
  360. //暆傪傆傗偟偰偄偭偨偲偒側偳丄僗儁乕僗偵梋桾偑偁傞側傜昞帵傪奼戝
  361. if(!animation && _scrollButtonOffset>0 && GEnv.Connections.TagAt(_scrollButtonOffset-1).Button.Width+BUTTON_MARGIN<limit-x) {
  362. _scrollButtonOffset--;
  363. ArrangeButtonsForScrollStyle(false, 0);
  364. }
  365. this.Height = y + UNITHEIGHT;
  366. }
  367. private void SetButtonText(TabBarButton btn, int index, ConnectionTag tag) {
  368. btn.HeadText = (index+1).ToString();
  369. string t = tag.FormatTabText();
  370. btn.Text = (t==null || t.Length==0)? " " : t; //僥僉僗僩側偟偩偲HeadText傕側偔側偭偰偟傑偆偺偱傗傓側偔夞旔
  371. }
  372. /// <summary>
  373. /// 巊梡偝傟偰偄傞儕僜乕僗偵屻張棟傪幚峴偟傑偡丅
  374. /// </summary>
  375. protected override void Dispose( bool disposing ) {
  376. if( disposing ) {
  377. if(components != null) {
  378. components.Dispose();
  379. }
  380. }
  381. base.Dispose( disposing );
  382. }
  383. #region Windows Form Designer generated code
  384. /// <summary>
  385. /// 僨僓僀僫 僒億乕僩偵昁梫側儊僜僢僪偱偡丅偙偺儊僜僢僪偺撪梕傪
  386. /// 僐乕僪 僄僨傿僞偱曄峏偟側偄偱偔偩偝偄丅
  387. /// </summary>
  388. private void InitializeComponent() {
  389. this.components = new System.ComponentModel.Container();
  390. // 
  391. // TabBar
  392. // 
  393. this.Name = "TabBar";
  394. this.Size = new System.Drawing.Size(292, 248);
  395. this.TabStop = false;
  396. }
  397. #endregion
  398. protected override void OnGotFocus(EventArgs args) {
  399. base.OnGotFocus(args);
  400. //GApp.GlobalCommandTarget.SetFocusToActiveConnection();
  401. }
  402. protected override void OnPaint(PaintEventArgs arg) {
  403. base.OnPaint(arg);
  404. //忋偵嬫愗傝慄傪堷偔
  405. Graphics g = arg.Graphics;
  406. Pen p = new Pen(Color.FromKnownColor(KnownColor.WindowFrame));
  407. g.DrawLine(p, 0, 0, Width, 0);
  408. p = new Pen(Color.FromKnownColor(KnownColor.Window));
  409. g.DrawLine(p, 0, 1, Width, 1);
  410. }
  411. }
  412. internal class TabBarScrollButton : Button {
  413. /* 偙偺宍
  414. *
  415. **
  416. ***
  417. **
  418. *
  419.  */ 
  420. internal bool _isRight; //塃岦偒偺偲偒true
  421. public TabBarScrollButton() {
  422. this.Image = null;
  423. this.Text = "";
  424. }
  425. protected override void OnPaint(PaintEventArgs args) {
  426. base.OnPaint(args);
  427. KnownColor col = this.Enabled? KnownColor.ControlText : KnownColor.ControlDark;
  428. Pen p = new Pen(Color.FromKnownColor(col));
  429. Graphics g = args.Graphics;
  430. int x = this.Width/2 + (_isRight? -1 : 1);
  431. int y = this.Height/2-4;
  432. for(int i=0; i<4; i++) { //廲慄傪昤夋
  433. int len = 7-i*2;
  434. g.DrawLine(p, x, y+i, x, y+i+len);
  435. x += _isRight? 1 : -1;
  436. }
  437. }
  438. }
  439. }