2 // System.Windows.Forms.Menu
5 // Alberto Fernandez (infjaf00@yahoo.es)
9 using System
.ComponentModel
;
10 using System
.Collections
;
14 namespace System
.Windows
.Forms
{
16 public abstract class Menu
: Component
{
18 private MenuItemCollection _items
;
21 Gtk
.Application
.Init();
23 protected Menu (System
.Windows
.Forms
.MenuItem
[] items
) {
24 _items
= new MenuItemCollection(this);
26 foreach (System
.Windows
.Forms
.MenuItem m
in items
)
32 // Public properties not to be used
34 //public const int FindHandle=0;
36 //public const int FindShortcut=0;
40 public virtual IntPtr Handle
{
41 get {return IntPtr.Zero;}
43 public virtual bool IsParent
{
44 get{ return (MenuItems.Count != 0); }
47 public virtual System
.Windows
.Forms
.MenuItem MdiListItem
{
50 public virtual System
.Windows
.Forms
.Menu
.MenuItemCollection MenuItems
{
51 get { return _items; }
55 protected virtual void CloneMenu (System
.Windows
.Forms
.Menu menuSrc
){
59 protected override void Dispose (bool disposing
){
60 base.Dispose (disposing
);
65 public virtual System
.Windows
.Forms
.MenuItem
FindMenuItem (int type
, IntPtr
value){
70 protected virtual int FindMergePosition (int mergeOrder
){
71 throw new NotImplementedException();
74 public virtual ContextMenu
GetContextMenu (){
75 System
.Windows
.Forms
.Menu menu
= this;
76 while((menu
!= null) && !(menu
is ContextMenu
)){
77 if(menu
is System
.Windows
.Forms
.MenuItem
){
78 menu
= ((System
.Windows
.Forms
.MenuItem
)menu
).Parent
;
84 return (ContextMenu
)menu
;
86 public virtual MainMenu
GetMainMenu(){
88 while((menu
!= null) && !(menu
is MainMenu
)){
89 if(menu
is System
.Windows
.Forms
.MenuItem
){
90 menu
= ((System
.Windows
.Forms
.MenuItem
)menu
).Parent
;
96 return (MainMenu
)menu
;
100 public virtual void MergeMenu (Menu menuSrc
){
101 if (menuSrc
== this){
102 throw new Exception ();
108 protected internal virtual bool ProcessCmdKey (ref Message msg
, Keys keyData
){
109 throw new NotImplementedException();
112 public override String
ToString (){
113 return base.ToString() + ", Item.Count=" + _items
.Count
;
118 internal virtual void OnNewMenuItemAdd (MenuItem item
){
120 internal virtual void OnNewMenuItemAdd (int index
, MenuItem item
){
122 internal virtual void OnRemoveMenuItem (MenuItem item
){
124 internal virtual void OnLastSubItemRemoved (){
128 internal Gtk
.Widget widget
;
129 internal virtual Gtk
.Widget Widget
{
132 widget
= CreateWidget();
137 internal abstract Gtk
.Widget
CreateWidget();
141 public class MenuItemCollection
: IList
, ICollection
, IEnumerable
{
142 private ArrayList items_
= new ArrayList();
143 private Menu parentMenu_
= null;
148 public MenuItemCollection (Menu m
) {
155 public virtual int Add (MenuItem mi
) {
157 if( mi
!= null && parentMenu_
!= null){
158 parentMenu_
.OnNewMenuItemAdd(mi
);
160 result
= items_
.Count
- 1;
162 if (mi
.Parent
!= null){
163 mi
.Parent
.MenuItems
.Remove (mi
);
165 mi
.SetParent (parentMenu_
);
170 private MenuItem
AddMenuItemCommon (MenuItem mi
) {
171 return ( -1 != Add (mi
)) ? mi
: null;
174 public virtual MenuItem
Add ( string s
) {
175 return AddMenuItemCommon( new MenuItem (s
));
178 public virtual int Add ( int i
, MenuItem mi
) {
179 if( i
> items_
.Count
){
180 // FIXME: Set exception details
181 throw new System
.ArgumentException();
184 if( mi
!= null && parentMenu_
!= null){
185 parentMenu_
.OnNewMenuItemAdd(i
, mi
);
186 items_
.Insert(i
, mi
);
189 if (mi
.Parent
!= null){
190 mi
.Parent
.MenuItems
.Remove (mi
);
192 mi
.SetParent (parentMenu_
);
197 public virtual MenuItem
Add (string s
, EventHandler e
) {
198 return AddMenuItemCommon(new MenuItem ( s
, e
));
201 public virtual MenuItem
Add (string s
, MenuItem
[] items
) {
202 return AddMenuItemCommon(new MenuItem ( s
, items
));
205 public virtual void AddRange(MenuItem
[] items
) {
207 foreach( MenuItem mi
in items
) {
213 private void DoClear() {
214 if( parentMenu_
!= null) {
215 foreach( MenuItem mi
in items_
) {
216 parentMenu_
.OnRemoveMenuItem( mi
);
220 if( parentMenu_
!= null) {
221 parentMenu_
.OnLastSubItemRemoved();
225 public virtual void Clear() {
229 public bool Contains(MenuItem m
) {
230 return items_
.Contains(m
);
233 public void CopyTo(Array a
, int i
) {
235 foreach( MenuItem mi
in items_
) {
236 MenuItem newMi
= mi
.CloneMenu();
237 a
.SetValue(newMi
,targetIdx
++);
241 //public override bool Equals(object o) {
242 // return base.Equals(o);
246 //public override int GetHashCode() {
247 //FIXME add our proprities
248 // return base.GetHashCode();
251 public IEnumerator
GetEnumerator() {
252 return items_
.GetEnumerator();
255 public int IndexOf(MenuItem m
) {
256 return items_
.IndexOf(m
);
259 public virtual void Remove(MenuItem m
) {
260 if( m
!= null && parentMenu_
!= null){
262 parentMenu_
.OnRemoveMenuItem(m
);
264 if( items_
.Count
== 0){
265 parentMenu_
.OnLastSubItemRemoved();
272 public virtual void RemoveAt(int i
) {
273 Remove(items_
[i
] as MenuItem
);
276 public override string ToString() {
277 return base.ToString();
281 // -- Protected Methods
284 ~
MenuItemCollection() {
290 // -- Public Properties
294 get {return items_.Count;}
298 /// IList Interface implmentation.
300 bool IList
.IsReadOnly
{
301 get { return items_.IsReadOnly; }
304 bool IList
.IsFixedSize
{
305 get { return false; }
308 public MenuItem
this[int index
] {
309 get { return items_[index] as MenuItem; }
313 object IList
.this[int index
] {
314 get { return items_[index]; }
316 // FIXME: Set exception members
317 throw new System
.NotSupportedException();
326 private MenuItem
Object2MenuItem( object value) {
327 MenuItem result
= value as MenuItem
;
328 if( result
== null) {
329 // FIXME: Set exception parameters
330 throw new System
.ArgumentException();
336 int IList
.Add( object value) {
337 return Add( Object2MenuItem(value));
341 bool IList
.Contains( object value) {
342 return Contains(Object2MenuItem(value));
346 int IList
.IndexOf( object value) {
347 return IndexOf(Object2MenuItem(value));
351 void IList
.Insert(int index
, object value) {
352 Add( index
, Object2MenuItem(value));
356 void IList
.Remove( object value) {
357 Remove( Object2MenuItem(value));
361 void IList
.RemoveAt( int index
){
364 // End of IList interface
367 /// ICollection Interface implmentation.
369 int ICollection
.Count
{
370 get { return Count; }
372 bool ICollection
.IsSynchronized
{
373 get { return items_.IsSynchronized; }
375 object ICollection
.SyncRoot
{
376 get { return items_.SyncRoot; }
378 void ICollection
.CopyTo(Array array
, int index
){
379 CopyTo(array
, index
);
381 // End Of ICollection