001         package com.croftsoft.apps.chat.controller;
002    
003         import java.awt.*;
004         import java.awt.event.*;
005         import javax.swing.*;
006    
007         import com.croftsoft.core.gui.event.UserInputAdapter;
008         import com.croftsoft.core.lang.NullArgumentException;
009         import com.croftsoft.core.math.geom.Point2DD;
010         import com.croftsoft.core.security.Authentication;
011         import com.croftsoft.core.util.queue.Queue;
012    
013         import com.croftsoft.apps.chat.request.CreateModelRequest;
014         import com.croftsoft.apps.chat.request.MoveRequest;
015         import com.croftsoft.apps.chat.request.TalkRequest;
016    
017         /*********************************************************************
018         * Chat controller.
019         *
020         * @version
021         *   2003-06-17
022         * @since
023         *   2003-06-06
024         * @author
025         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
026         *********************************************************************/
027    
028         public final class  ChatController
029           extends UserInputAdapter
030           implements ActionListener, ItemListener
031         //////////////////////////////////////////////////////////////////////
032         //////////////////////////////////////////////////////////////////////
033         {
034    
035         private final Authentication  authentication;
036    
037         private final Queue           requestQueue;
038    
039         //
040    
041         private JMenu              avatarMenu;
042    
043         private JComponent         moveComponent;
044    
045         private JCheckBoxMenuItem  musicCheckBoxMenuItem;
046    
047         private JTextField         talkTextField;
048    
049         //////////////////////////////////////////////////////////////////////
050         //////////////////////////////////////////////////////////////////////
051    
052         public ChatController (
053           Authentication  authentication,
054           Queue           requestQueue )
055         //////////////////////////////////////////////////////////////////////
056         {
057           NullArgumentException.check (
058             this.authentication = authentication );
059    
060           NullArgumentException.check ( this.requestQueue = requestQueue );
061         }
062    
063         //////////////////////////////////////////////////////////////////////
064         // mutator methods
065         //////////////////////////////////////////////////////////////////////
066    
067         public void  setAvatarMenu ( JMenu  avatarMenu )
068         //////////////////////////////////////////////////////////////////////
069         {
070           if ( this.avatarMenu != null )
071           {
072             throw new IllegalStateException ( );
073           }
074    
075           NullArgumentException.check ( this.avatarMenu = avatarMenu );
076    
077           Component [ ]  menuComponents = avatarMenu.getMenuComponents ( );
078    
079           for ( int  i = 0; i < menuComponents.length; i++ )
080           {
081             Component  menuComponent = menuComponents [ i ];
082    
083             if ( menuComponent instanceof JRadioButtonMenuItem )
084             {
085               ( ( JRadioButtonMenuItem ) menuComponent ).addItemListener (
086                 this );
087             }
088           }
089         }
090    
091         public void  setMusicCheckBoxMenuItem (
092           JCheckBoxMenuItem  musicCheckBoxMenuItem )
093         //////////////////////////////////////////////////////////////////////
094         {
095           NullArgumentException.check ( musicCheckBoxMenuItem );
096    
097           if ( this.musicCheckBoxMenuItem != null )
098           {
099             this.musicCheckBoxMenuItem.removeItemListener ( this );
100           }
101    
102           this.musicCheckBoxMenuItem = musicCheckBoxMenuItem;
103    
104           musicCheckBoxMenuItem.addItemListener ( this );
105         }
106    
107         public void  setMoveComponent ( JComponent  moveComponent )
108         //////////////////////////////////////////////////////////////////////
109         {
110           NullArgumentException.check ( moveComponent );
111    
112           if ( this.moveComponent != null )
113           {
114             this.moveComponent.removeMouseListener ( this );
115           }
116    
117           this.moveComponent = moveComponent;
118    
119           moveComponent.addMouseListener ( this );
120         }
121    
122         public void  setTalkTextField ( JTextField  talkTextField )
123         //////////////////////////////////////////////////////////////////////
124         {
125           NullArgumentException.check ( talkTextField );
126    
127           if ( this.talkTextField != null )
128           {
129             this.talkTextField.removeActionListener ( this );
130           }
131    
132           this.talkTextField = talkTextField;
133    
134           talkTextField.addActionListener ( this );
135         }
136    
137         //////////////////////////////////////////////////////////////////////
138         // interface ActionListener method
139         //////////////////////////////////////////////////////////////////////
140    
141         public void  actionPerformed ( ActionEvent  actionEvent )
142         //////////////////////////////////////////////////////////////////////
143         {
144           if ( actionEvent.getSource ( ) == talkTextField )
145           {
146             String  text = talkTextField.getText ( );
147    
148             talkTextField.setText ( "" );
149    
150             requestQueue.replace ( new TalkRequest ( authentication, text ) );
151           }
152           else
153           {
154             throw new IllegalArgumentException ( );
155           }
156         }
157    
158         //////////////////////////////////////////////////////////////////////
159         // interface ItemListener method
160         //////////////////////////////////////////////////////////////////////
161    
162         public void  itemStateChanged ( ItemEvent  itemEvent )
163         //////////////////////////////////////////////////////////////////////
164         {
165           Object  item = itemEvent.getItem ( );
166    
167           if ( item == musicCheckBoxMenuItem )
168           {
169             System.out.println (
170               "Music:  " + musicCheckBoxMenuItem.isSelected ( ) );
171           }
172           else if ( item instanceof JRadioButtonMenuItem )
173           {
174             JRadioButtonMenuItem  radioButtonMenuItem
175               = ( JRadioButtonMenuItem ) item;
176    
177             if ( itemEvent.getStateChange ( ) == ItemEvent.SELECTED )
178             {
179               String  avatarType
180                 = radioButtonMenuItem.getText ( );
181    
182               requestQueue.replace ( new CreateModelRequest (
183                 authentication, avatarType, 0.0, 0.0 ) );
184             }
185           }
186           else
187           {
188             throw new IllegalArgumentException ( );
189           }
190         }
191    
192         //////////////////////////////////////////////////////////////////////
193         // interface MouseListener method
194         //////////////////////////////////////////////////////////////////////
195    
196         public void  mousePressed ( MouseEvent  mouseEvent )
197         //////////////////////////////////////////////////////////////////////
198         {
199           if ( mouseEvent.getSource ( ) == moveComponent )
200           {
201             Point  mousePoint = mouseEvent.getPoint ( );
202    
203             requestQueue.replace (
204               new MoveRequest (
205                 authentication,
206                 new Point2DD ( mousePoint.x, mousePoint.y ) ) );
207           }
208           else
209           {
210             throw new IllegalArgumentException ( );
211           }
212         }
213    
214         //////////////////////////////////////////////////////////////////////
215         //////////////////////////////////////////////////////////////////////
216         }