File: MainUI.java

package info (click to toggle)
spring 104.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 47,512 kB
  • sloc: cpp: 391,093; ansic: 79,943; python: 12,356; java: 12,201; awk: 5,889; sh: 1,826; xml: 655; makefile: 486; perl: 405; php: 211; objc: 194; sed: 2
file content (180 lines) | stat: -rw-r--r-- 6,014 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// Copyright Hugh Perkins 2009
// hughperkins@gmail.com http://manageddreams.com
//
// 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.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
//  more details.
//
// You should have received a copy of the GNU General Public License along
// with this program in the file licence.txt; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-
// 1307 USA
// You can find the licence also on the web at:
// http://www.opensource.org/licenses/gpl-license.php
//
// ======================================================================================
//

package hughai.ui;

import java.awt.*;
import java.awt.event.*;

import java.lang.reflect.*;
import javax.swing.*;

import java.util.*;
import java.util.Map;
import java.lang.annotation.*;

import com.springrts.ai.*;
import com.springrts.ai.oo.clb.*;

import hughai.*;
import hughai.EnemyTracker.EnemyAdapter;
import hughai.basictypes.*;
import hughai.mapping.*;
import hughai.packcoordinators.*;
import hughai.unitdata.*;
import hughai.unitdata.UnitController.UnitAdapter;
import hughai.utils.*;
import hughai.utils.Config.ConfigListener;

// This creates a form with buttons in
// other components register their methods with this form
// for now, this just handles buttons, and simple no-parameter methods
// might be extended in the future!
public class MainUI {
   public interface ButtonHandler {
      public void go();
   }

   ButtonActionHandler buttonActionHandler = new ButtonActionHandler();

   PlayerObjects playerObjects;

   JFrame frame;

   JTabbedPane tabbedPane;

   JPanel actionsPanel;
   GridLayout actionsGridLayout;

   public MainUI( PlayerObjects playerObjects ) {
      this.playerObjects = playerObjects;
      Init();
   }
   
   public void Init() {
      frame = new JFrame( "HughAI " + playerObjects.getAicallback().getSkirmishAI().getTeamId() );
      frame.setSize( 200, 500 );
      frame.setVisible( true );

      tabbedPane = new JTabbedPane();
      frame.add( tabbedPane );

      //      if( false ) {
      actionsGridLayout = new GridLayout(0,1);
      actionsPanel = new JPanel( actionsGridLayout );
      tabbedPane.addTab( "Actions", actionsPanel );
      
      frame.setVisible( playerObjects.getConfig().isGUIActivated() );
      //      }
      this.playerObjects.getCSAI().registerShutdown( new ShutdownHandler() );
      this.playerObjects.getConfig().registerListener( new ConfigHandler() );
   }
   
   class ConfigHandler implements ConfigListener {
      @Override
      public void configUpdated() {
         playerObjects.getLogFile().WriteLine( "MainUI.ConfigHandler()" );
         frame.setVisible( playerObjects.getConfig().isGUIActivated() );         
      }
   }

   class ShutdownHandler implements CSAI.ShutdownHandler {
      @Override
      public void shutdown() {
         //      if( false ) {
         playerObjects.getLogFile().WriteLine( "MainUI.shutdown()" );
         synchronized ( buttonhandlerbybutton ) {
            for( JButton button : buttonhandlerbybutton.keySet() ) {
               button.removeActionListener( buttonActionHandler );
            }
            buttonhandlerbybutton.clear();
         }
         //frame.setVisible( false );
         actionsPanel = null;
         actionsGridLayout = null;
         buttonActionHandler = null;
         buttonhandlerbybutton = null;
         frame.dispose();
         frame = null;
         playerObjects = null;
         //      }
      }
   }
   
   public void addPanelToTabbedPanel( String title, JPanel panel ) {
      playerObjects.getLogFile().WriteLine( "MainUI: addpaneltotabbedpanel " + title );
      tabbedPane.addTab( title, panel );
      frame.validate();
   }

   @Override
   protected void finalize() {
      System.out.println( this.getClass().getSimpleName() + ".finalize()");
   }

   //  HashSet<JButton> buttons = new HashSet<JButton>();

   // we could just add the handlers directly to the button
   // but I fear this may be part of the cause of the major swing
   // memory leak I had when I decided to move them into this hashmap
   HashMap<JButton,ButtonHandler> buttonhandlerbybutton = new HashMap<JButton, ButtonHandler>();

   class ButtonActionHandler implements ActionListener {
      @Override
      public void actionPerformed( ActionEvent e ){
         if( JButton.class.isAssignableFrom( e.getSource().getClass() ) ) {
            JButton button = (JButton)e.getSource();
            ButtonHandler handler = null;
            synchronized( buttonhandlerbybutton ) {
               handler = buttonhandlerbybutton.get( button );
            }
            // make sure this runs outside of the synchronized section above
            if( handler != null ) {
               handler.go();
            }
         }
      }
   }

   public void registerButton( String buttonText, ButtonHandler buttonHandler  ) {
      //      if( false ) {
      playerObjects.getLogFile().WriteLine( "MainUI.registerbutton " + buttonText );
      JButton button = new JButton( buttonText );
      button.addActionListener( buttonActionHandler );
      synchronized (buttonhandlerbybutton) {
         buttonhandlerbybutton.put( button, buttonHandler );
      }
      actionsGridLayout.setRows( actionsGridLayout.getRows() + 1 );
      actionsPanel.add( button );
      //frame.setSize( 200, gridLayout.getRows() * 50 );
      frame.setSize( 400, 450 );

      actionsPanel.validate();
      frame.validate();
      //      }
   }
   
   public void showInfo( String message ) {
      JOptionPane.showMessageDialog( frame, message );
   }
}