/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/SideBar/SideTab.cs

https://github.com/eusebiu/SharpDevelop · C# · 552 lines · 458 code · 83 blank · 11 comment · 35 complexity · 835c8126f727dc8bb30b2568f2f9a397 MD5 · raw file

  1. // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
  2. // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Drawing;
  6. using System.Windows.Forms;
  7. namespace ICSharpCode.SharpDevelop.Widgets.SideBar
  8. {
  9. public enum SideTabStatus {
  10. Normal,
  11. Selected,
  12. Dragged
  13. }
  14. public delegate void SideTabEventHandler(object source, SideTabEventArgs e);
  15. public class SideTabEventArgs
  16. {
  17. SideTab tab;
  18. public SideTabEventArgs(SideTab tab)
  19. {
  20. this.tab = tab;
  21. }
  22. public SideTab SideTab {
  23. get {
  24. return tab;
  25. }
  26. }
  27. }
  28. public delegate void SideTabItemEventHandler(object source, SideTabItemEventArgs e);
  29. public class SideTabItemEventArgs
  30. {
  31. SideTabItem item;
  32. public SideTabItemEventArgs(SideTabItem item)
  33. {
  34. this.item = item;
  35. }
  36. public SideTabItem Item {
  37. get {
  38. return item;
  39. }
  40. }
  41. }
  42. public delegate void SideTabItemExchangeEventHandler(object source, SideTabItemExchangeEventArgs e);
  43. public class SideTabItemExchangeEventArgs
  44. {
  45. SideTabItem item1;
  46. SideTabItem item2;
  47. public SideTabItemExchangeEventArgs(SideTabItem item1, SideTabItem item2)
  48. {
  49. this.item1 = item1;
  50. this.item2 = item2;
  51. }
  52. public SideTabItem Item1 {
  53. get {
  54. return item1;
  55. }
  56. }
  57. public SideTabItem Item2 {
  58. get {
  59. return item2;
  60. }
  61. }
  62. }
  63. public class SideTab
  64. {
  65. string name, displayName;
  66. bool canDragDrop = true;
  67. bool canBeDeleted = true;
  68. bool canBeRenamed = true;
  69. SideTabItemCollection items = new SideTabItemCollection();
  70. SideTabStatus sideTabStatus;
  71. SideTabItem selectedItem = null;
  72. SideTabItem choosedItem = null;
  73. ImageList largeImageList = null;
  74. ImageList smallImageList = null;
  75. int scrollIndex = 0;
  76. public bool Hidden = false;
  77. public int ScrollIndex {
  78. get {
  79. return scrollIndex;
  80. }
  81. set {
  82. scrollIndex = value;
  83. }
  84. }
  85. public ImageList LargeImageList {
  86. get {
  87. return largeImageList;
  88. }
  89. set {
  90. largeImageList = value;
  91. }
  92. }
  93. public ImageList SmallImageList {
  94. get {
  95. return smallImageList;
  96. }
  97. set {
  98. smallImageList = value;
  99. }
  100. }
  101. public SideTabStatus SideTabStatus {
  102. get {
  103. return sideTabStatus;
  104. }
  105. set {
  106. sideTabStatus = value;
  107. }
  108. }
  109. public bool CanBeDeleted {
  110. get {
  111. return canBeDeleted;
  112. }
  113. set {
  114. canBeDeleted = value;
  115. }
  116. }
  117. public bool CanBeRenamed {
  118. get {
  119. return canBeRenamed;
  120. }
  121. set {
  122. canBeRenamed = value;
  123. }
  124. }
  125. public string Name {
  126. get {
  127. return name;
  128. }
  129. set {
  130. name = value;
  131. displayName = value;
  132. }
  133. }
  134. public string DisplayName {
  135. get { return displayName; }
  136. set { displayName = value; }
  137. }
  138. public SideTabItemCollection Items {
  139. get {
  140. return items;
  141. }
  142. }
  143. public bool CanDragDrop {
  144. get {
  145. return canDragDrop;
  146. }
  147. set {
  148. canDragDrop = value;
  149. }
  150. }
  151. bool canSaved = true;
  152. public bool CanSaved {
  153. get {
  154. return canSaved;
  155. }
  156. set {
  157. canSaved = value;
  158. }
  159. }
  160. public SideTabItem SelectedItem {
  161. get {
  162. return selectedItem;
  163. }
  164. set {
  165. if (selectedItem != null && selectedItem != choosedItem) {
  166. selectedItem.SideTabItemStatus = SideTabItemStatus.Normal;
  167. }
  168. selectedItem = value;
  169. if (selectedItem != null && selectedItem != choosedItem) {
  170. selectedItem.SideTabItemStatus = SideTabItemStatus.Selected;
  171. }
  172. }
  173. }
  174. protected void OnChoosedItemChanged(EventArgs e)
  175. {
  176. if (ChoosedItemChanged != null) {
  177. ChoosedItemChanged(this, e);
  178. }
  179. }
  180. public event EventHandler ChoosedItemChanged;
  181. public SideTabItem ChoosedItem {
  182. get {
  183. return choosedItem;
  184. }
  185. set {
  186. if (choosedItem != null) {
  187. choosedItem.SideTabItemStatus = SideTabItemStatus.Normal;
  188. }
  189. choosedItem = value;
  190. if (choosedItem != null) {
  191. choosedItem.SideTabItemStatus = SideTabItemStatus.Choosed;
  192. }
  193. OnChoosedItemChanged(null);
  194. }
  195. }
  196. /// <summary>
  197. /// A SideTabItem has been removed.
  198. /// </summary>
  199. public event SideTabItemEventHandler ItemRemoved;
  200. /// <summary>
  201. /// Two SideTabItems have exchanged locations.
  202. /// </summary>
  203. public event SideTabItemExchangeEventHandler ItemsExchanged;
  204. public ISideTabItemFactory SideTabItemFactory {
  205. get {
  206. return items.SideTabItemFactory;
  207. }
  208. set {
  209. items.SideTabItemFactory = value;
  210. }
  211. }
  212. protected SideTab()
  213. {
  214. }
  215. public SideTab(ISideTabItemFactory sideTabItemFactory)
  216. {
  217. SideTabItemFactory = sideTabItemFactory;
  218. }
  219. public SideTab(SideBarControl sideBar, string name) : this(sideBar.SideTabItemFactory)
  220. {
  221. this.Name = name;
  222. SetCanRename();
  223. items.ItemRemoved += OnSideTabItemRemoved;
  224. }
  225. public SideTab(string name)
  226. {
  227. this.Name = name;
  228. SetCanRename();
  229. items.ItemRemoved += OnSideTabItemRemoved;
  230. }
  231. public bool ScrollDownButtonActivated {
  232. get {
  233. return scrollIndex > 0;
  234. }
  235. }
  236. public bool ScrollUpButtonActivated {
  237. get {
  238. return true;
  239. }
  240. }
  241. public void DrawTabHeader(Graphics g, Font font, Point pos, int width)
  242. {
  243. switch (sideTabStatus) {
  244. case SideTabStatus.Normal:
  245. ControlPaint.DrawBorder3D(g, new Rectangle(0, pos.Y, width - 4, font.Height + 4), Border3DStyle.RaisedInner);
  246. g.DrawString(displayName, font, SystemBrushes.ControlText, new RectangleF(1, pos.Y + 1, width - 5, font.Height + 1));
  247. break;
  248. case SideTabStatus.Selected:
  249. ControlPaint.DrawBorder3D(g, new Rectangle(0, pos.Y, width - 4, font.Height + 4), Border3DStyle.Sunken);
  250. g.DrawString(displayName, font, SystemBrushes.ControlText, new RectangleF(1 + 1, pos.Y + 2, width - 5, font.Height + 2));
  251. break;
  252. case SideTabStatus.Dragged:
  253. Rectangle r = new Rectangle(0, pos.Y, width - 4, font.Height + 4);
  254. ControlPaint.DrawBorder3D(g, r, Border3DStyle.RaisedInner);
  255. r.X += 2;
  256. r.Y += 1;
  257. r.Width -= 4;
  258. r.Height -= 2;
  259. g.FillRectangle(SystemBrushes.ControlDarkDark, r);
  260. g.DrawString(displayName, font, SystemBrushes.HighlightText, new RectangleF(1 + 1, pos.Y + 2, width - 5, font.Height + 2));
  261. break;
  262. }
  263. }
  264. public int Height {
  265. get {
  266. return Items.Count * 20;
  267. }
  268. }
  269. public Point GetLocation(SideTabItem whichItem)
  270. {
  271. for (int i = 0; i < Items.Count; ++i) {
  272. SideTabItem item = (SideTabItem)Items[i];
  273. if (item == whichItem) {
  274. return new Point(0, i * 20);
  275. }
  276. }
  277. return new Point(-1, -1);
  278. }
  279. public SideTabItem GetItemAt(int x, int y)
  280. {
  281. int index = ScrollIndex + y / 20;
  282. return (index >= 0 && index < Items.Count) ? (SideTabItem)Items[index] : null;
  283. }
  284. public SideTabItem GetItemAt(Point pos)
  285. {
  286. return GetItemAt(pos.X, pos.Y);
  287. }
  288. public int ItemHeight {
  289. get {
  290. return 20;
  291. }
  292. }
  293. public void DrawTabContent(Graphics g, Font f, Rectangle rectangle)
  294. {
  295. for (int i = 0; i + ScrollIndex < Items.Count; ++i) {
  296. SideTabItem item = (SideTabItem)Items[ScrollIndex + i];
  297. if (rectangle.Height < i * ItemHeight) {
  298. break;
  299. }
  300. item.DrawItem(g, f, new Rectangle(rectangle.X,
  301. rectangle.Y + i * ItemHeight,
  302. rectangle.Width,
  303. ItemHeight));
  304. }
  305. }
  306. /// <summary>
  307. /// Swaps two side tab items with the given indexes.
  308. /// </summary>
  309. public void Exchange(int a, int b)
  310. {
  311. SideTabItem itemA = Items[a];
  312. SideTabItem itemB = Items[b];
  313. Items[a] = itemB;
  314. Items[b] = itemA;
  315. OnExchange(itemA, itemB);
  316. }
  317. void SetCanRename()
  318. {
  319. if (name != null && name.StartsWith("${res:")) {
  320. canBeRenamed = false;
  321. }
  322. }
  323. void OnSideTabItemRemoved(object source, SideTabItemEventArgs e)
  324. {
  325. if (ItemRemoved != null) {
  326. ItemRemoved(this, e);
  327. }
  328. }
  329. void OnExchange(SideTabItem item1, SideTabItem item2)
  330. {
  331. if (ItemsExchanged != null) {
  332. ItemsExchanged(this, new SideTabItemExchangeEventArgs(item1, item2));
  333. }
  334. }
  335. public class SideTabItemCollection : ICollection<SideTabItem>, IEnumerable<SideTabItem>
  336. {
  337. List<SideTabItem> list = new List<SideTabItem>();
  338. ISideTabItemFactory sideTabItemFactory = new DefaultSideTabItemFactory();
  339. public event SideTabItemEventHandler ItemRemoved;
  340. public ISideTabItemFactory SideTabItemFactory {
  341. get {
  342. return sideTabItemFactory;
  343. }
  344. set {
  345. sideTabItemFactory = value;
  346. }
  347. }
  348. public SideTabItemCollection()
  349. {
  350. }
  351. public SideTabItem this[int index] {
  352. get {
  353. return (SideTabItem)list[index];
  354. }
  355. set {
  356. list[index] = value;
  357. }
  358. }
  359. public int DraggedIndex {
  360. get {
  361. for (int i = 0; i < Count; ++i) {
  362. if (this[i].SideTabItemStatus == SideTabItemStatus.Drag)
  363. return i;
  364. }
  365. return -1;
  366. }
  367. }
  368. public int Count {
  369. get {
  370. return list.Count;
  371. }
  372. }
  373. public virtual bool IsSynchronized {
  374. get {
  375. return false;
  376. }
  377. }
  378. public virtual object SyncRoot {
  379. get {
  380. return this;
  381. }
  382. }
  383. public virtual void Add(SideTabItem item)
  384. {
  385. list.Add(item);
  386. }
  387. public virtual SideTabItem Add(string name, object content)
  388. {
  389. return Add(name, content, -1);
  390. }
  391. public virtual SideTabItem Add(string name, object content, int imageIndex)
  392. {
  393. SideTabItem item = sideTabItemFactory.CreateSideTabItem(name, imageIndex);
  394. item.Tag = content;
  395. Add(item);
  396. return item;
  397. }
  398. public virtual void Clear()
  399. {
  400. list.Clear();
  401. }
  402. public bool Contains(SideTabItem item)
  403. {
  404. return list.Contains(item);
  405. }
  406. public IEnumerator<SideTabItem> GetEnumerator()
  407. {
  408. return list.GetEnumerator();
  409. }
  410. System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
  411. {
  412. return list.GetEnumerator();
  413. }
  414. public int IndexOf(SideTabItem item)
  415. {
  416. return list.IndexOf(item);
  417. }
  418. public void CopyTo(Array dest, int index)
  419. {
  420. list.CopyTo((SideTabItem[])dest, index);
  421. }
  422. public virtual SideTabItem Insert(int index, SideTabItem item)
  423. {
  424. list.Insert(index, item);
  425. return item;
  426. }
  427. public virtual SideTabItem Insert(int index, string name, object content)
  428. {
  429. return Insert(index, name, content, -1);
  430. }
  431. public virtual SideTabItem Insert(int index, string name, object content, int imageIndex)
  432. {
  433. SideTabItem item = sideTabItemFactory.CreateSideTabItem(name, imageIndex);
  434. item.Tag = content;
  435. return Insert(index, item);
  436. }
  437. public virtual bool Remove(SideTabItem item)
  438. {
  439. bool r = list.Remove(item);
  440. OnItemRemoved(item);
  441. return r;
  442. }
  443. public virtual void RemoveAt(int index)
  444. {
  445. if (index < 0 || index >= list.Count) {
  446. return;
  447. }
  448. SideTabItem item = this[index];
  449. list.Remove(item);
  450. OnItemRemoved(item);
  451. }
  452. void OnItemRemoved(SideTabItem item)
  453. {
  454. if (ItemRemoved != null) {
  455. ItemRemoved(this, new SideTabItemEventArgs(item));
  456. }
  457. }
  458. public bool IsReadOnly {
  459. get {
  460. return false;
  461. }
  462. }
  463. public void CopyTo(SideTabItem[] array, int arrayIndex)
  464. {
  465. throw new NotImplementedException();
  466. }
  467. }
  468. }
  469. }