/*************************************************************************** * Gump.cs * ------------------- * begin : May 1, 2002 * copyright : (C) The RunUO Software Team * email : info@runuo.com * * $Id$ * ***************************************************************************/ /*************************************************************************** * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * ***************************************************************************/ using System; using System.Collections; using System.Collections.Generic; using System.Text; using Server; using Server.Network; namespace Server.Gumps { public class Gump { private List m_Entries; private List m_Strings; internal int m_TextEntries, m_Switches; private static int m_NextSerial = 1; private int m_Serial; private int m_TypeID; private int m_X, m_Y; private bool m_Dragable = true; private bool m_Closable = true; private bool m_Resizable = true; private bool m_Disposable = true; public static int GetTypeID( Type type ) { return type.FullName.GetHashCode(); } public Gump( int x, int y ) { do { m_Serial = m_NextSerial++; } while ( m_Serial == 0 ); // standard client apparently doesn't send a gump response packet if serial == 0 m_X = x; m_Y = y; m_TypeID = GetTypeID( this.GetType() ); m_Entries = new List(); m_Strings = new List(); } public void Invalidate() { //if ( m_Strings.Count > 0 ) // m_Strings.Clear(); } public int TypeID { get { return m_TypeID; } } public List Entries { get{ return m_Entries; } } public int Serial { get { return m_Serial; } set { if ( m_Serial != value ) { m_Serial = value; Invalidate(); } } } public int X { get { return m_X; } set { if ( m_X != value ) { m_X = value; Invalidate(); } } } public int Y { get { return m_Y; } set { if ( m_Y != value ) { m_Y = value; Invalidate(); } } } public bool Disposable { get { return m_Disposable; } set { if ( m_Disposable != value ) { m_Disposable = value; Invalidate(); } } } public bool Resizable { get { return m_Resizable; } set { if ( m_Resizable != value ) { m_Resizable = value; Invalidate(); } } } public bool Dragable { get { return m_Dragable; } set { if ( m_Dragable != value ) { m_Dragable = value; Invalidate(); } } } public bool Closable { get { return m_Closable; } set { if ( m_Closable != value ) { m_Closable = value; Invalidate(); } } } public void AddPage( int page ) { Add( new GumpPage( page ) ); } public void AddAlphaRegion( int x, int y, int width, int height ) { Add( new GumpAlphaRegion( x, y, width, height ) ); } public void AddBackground( int x, int y, int width, int height, int gumpID ) { Add( new GumpBackground( x, y, width, height, gumpID ) ); } public void AddButton( int x, int y, int normalID, int pressedID, int buttonID, GumpButtonType type, int param ) { Add( new GumpButton( x, y, normalID, pressedID, buttonID, type, param ) ); } public void AddCheck( int x, int y, int inactiveID, int activeID, bool initialState, int switchID ) { Add( new GumpCheck( x, y, inactiveID, activeID, initialState, switchID ) ); } public void AddGroup( int group ) { Add( new GumpGroup( group ) ); } public void AddTooltip( int number ) { Add( new GumpTooltip( number ) ); } public void AddHtml( int x, int y, int width, int height, string text, bool background, bool scrollbar ) { Add( new GumpHtml( x, y, width, height, text, background, scrollbar ) ); } public void AddHtmlLocalized( int x, int y, int width, int height, int number, bool background, bool scrollbar ) { Add( new GumpHtmlLocalized( x, y, width, height, number, background, scrollbar ) ); } public void AddHtmlLocalized( int x, int y, int width, int height, int number, int color, bool background, bool scrollbar ) { Add( new GumpHtmlLocalized( x, y, width, height, number, color, background, scrollbar ) ); } public void AddHtmlLocalized( int x, int y, int width, int height, int number, string args, int color, bool background, bool scrollbar ) { Add( new GumpHtmlLocalized( x, y, width, height, number, args, color, background, scrollbar ) ); } public void AddImage( int x, int y, int gumpID ) { Add( new GumpImage( x, y, gumpID ) ); } public void AddImage( int x, int y, int gumpID, int hue ) { Add( new GumpImage( x, y, gumpID, hue ) ); } public void AddImageTiled( int x, int y, int width, int height, int gumpID ) { Add( new GumpImageTiled( x, y, width, height, gumpID ) ); } public void AddImageTiledButton( int x, int y, int normalID, int pressedID, int buttonID, GumpButtonType type, int param, int itemID, int hue, int width, int height ) { Add( new GumpImageTileButton( x, y, normalID, pressedID, buttonID, type, param, itemID, hue, width, height ) ); } public void AddImageTiledButton( int x, int y, int normalID, int pressedID, int buttonID, GumpButtonType type, int param, int itemID, int hue, int width, int height, int localizedTooltip ) { Add( new GumpImageTileButton( x, y, normalID, pressedID, buttonID, type, param, itemID, hue, width, height, localizedTooltip ) ); } public void AddItem( int x, int y, int itemID ) { Add( new GumpItem( x, y, itemID ) ); } public void AddItem( int x, int y, int itemID, int hue ) { Add( new GumpItem( x, y, itemID, hue ) ); } public void AddLabel( int x, int y, int hue, string text ) { Add( new GumpLabel( x, y, hue, text ) ); } public void AddLabelCropped( int x, int y, int width, int height, int hue, string text ) { Add( new GumpLabelCropped( x, y, width, height, hue, text ) ); } public void AddRadio( int x, int y, int inactiveID, int activeID, bool initialState, int switchID ) { Add( new GumpRadio( x, y, inactiveID, activeID, initialState, switchID ) ); } public void AddTextEntry( int x, int y, int width, int height, int hue, int entryID, string initialText ) { Add( new GumpTextEntry( x, y, width, height, hue, entryID, initialText ) ); } public void AddTextEntry( int x, int y, int width, int height, int hue, int entryID, string initialText, int size ) { Add( new GumpTextEntryLimited( x, y, width, height, hue, entryID, initialText, size ) ); } public void Add( GumpEntry g ) { if ( g.Parent != this ) { g.Parent = this; } else if ( !m_Entries.Contains( g ) ) { Invalidate(); m_Entries.Add( g ); } } public void Remove( GumpEntry g ) { Invalidate(); m_Entries.Remove( g ); g.Parent = null; } public int Intern( string value ) { int indexOf = m_Strings.IndexOf( value ); if ( indexOf >= 0 ) { return indexOf; } else { Invalidate(); m_Strings.Add( value ); return m_Strings.Count - 1; } } public void SendTo( NetState state ) { state.AddGump( this ); state.Send( Compile( state ) ); } public static byte[] StringToBuffer( string str ) { return Encoding.ASCII.GetBytes( str ); } private static byte[] m_BeginLayout = StringToBuffer( "{ " ); private static byte[] m_EndLayout = StringToBuffer( " }" ); private static byte[] m_NoMove = StringToBuffer( "{ nomove }" ); private static byte[] m_NoClose = StringToBuffer( "{ noclose }" ); private static byte[] m_NoDispose = StringToBuffer( "{ nodispose }" ); private static byte[] m_NoResize = StringToBuffer( "{ noresize }" ); private Packet Compile() { return Compile( null ); } private Packet Compile( NetState ns ) { IGumpWriter disp; if ( ns != null && ns.Unpack ) disp = new DisplayGumpPacked( this ); else disp = new DisplayGumpFast( this ); if ( !m_Dragable ) disp.AppendLayout( m_NoMove ); if ( !m_Closable ) disp.AppendLayout( m_NoClose ); if ( !m_Disposable ) disp.AppendLayout( m_NoDispose ); if ( !m_Resizable ) disp.AppendLayout( m_NoResize ); int count = m_Entries.Count; GumpEntry e; for ( int i = 0; i < count; ++i ) { e = m_Entries[i]; disp.AppendLayout( m_BeginLayout ); e.AppendTo( disp ); disp.AppendLayout( m_EndLayout ); } disp.WriteStrings( m_Strings ); disp.Flush(); m_TextEntries = disp.TextEntries; m_Switches = disp.Switches; return disp as Packet; } public virtual void OnResponse( NetState sender, RelayInfo info ) { } public virtual void OnServerClose( NetState owner ) { } } }