
// Copyright (c) 2001 
package uk.co.patrickhaston.mars;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//import oracle.dacf.layout.*;
import java.util.Observer;
import java.io.File;
import javax.swing.JMenuItem;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import java.math.*;

// Version 0.0.911
// last updated 24 May 2006
//
// issues:
//

/**
 * A Swing-based top level window class.
 * <P>
 * @author Patrick Haston
 */
public class MarsFrame extends JFrame 
{
  protected MarsApplication theApp;
  MPanel jPanel1 = new MPanel();
  public MarsModel mars = null;
  public MarsGlobePanel globe = null;
  JFileChooser fileDialog = null;
  public File referenceData = null;
  public File gameData = null;
  MarsStatsPanel stats = null;
  public MarsController theBoss = null;
  
  MarsMenuBar menuBar1 = null;
  JLabel statusBar = new JLabel();
  MPanel mapPanel;
  MPanel padPanel;
  MPanel messagePanel;
  MScrollPane messageScrollPanel = new MScrollPane();
  MarsMessageList messageList = null;
  MPanel controlPanel;
  MPanel statsPanel;
  MPanel navPanel;
  MPanel globePanel;
  MPanel treePanel;
  MarsPopupPanel popupPanel = null;
  navButton navNorth;
  navButton navSouth;
  navButton navEast;
  navButton navWest;
  navButton navZoomIn;
  navButton navZoomOut;
  navButton navNextDay;
  navButton navSpare2;
  navButton navSpare3;
  //BorderLayout borderLayout1 = new BorderLayout();
  MarsDirectoryTree marsTree = null;
  DefaultMutableTreeNode treeTop = null;
  MScrollPane treeView = null;
  DefaultTreeModel treeModel = null;
  MarsConversation conversation = null;

  public MarsMapPanel map = null;
  public MarsViewPanel settlementView = null;
  public MarsMeeting meetingView = null;
  public MarsReport reportView = null;
  
  public boolean isMapVisible = false;
  public boolean isConversationVisible = false;
  public boolean isSettlementVisible = false;
  public boolean isMeetingVisible = false;
  public boolean isReportVisible = false;
  
  public int currentView = 1;
  public int previousView = 1;

  public static int MAP_VIEW = 1;
  public static int CONVERSATION_VIEW = 2;
  public static int SETTLEMENT_VIEW = 3;
  public static int MEETING_VIEW = 4;
  public static int REPORT_VIEW = 5;
  
  public MarsStartFrame startFrame = null;
  public int selectedWayPoint = 0;
  

  /**
   * Constructs a new instance.
   */
  public MarsFrame(MarsApplication app) 
  {
    super();
    try  
    {
      theApp = app;
      jbInit();
      startFrame = new MarsStartFrame(this, MarsStartFrame.START);
      Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
      Dimension frameSize = startFrame.getSize();
      startFrame.setLocation((screenSize.width - frameSize.width)/2, (screenSize.height - frameSize.height)/2);
//      startFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { } });
      startFrame.setVisible(true);
      //startFrame.toFront();
    }
    catch (Exception e) 
    {
      e.printStackTrace();
    }
  }

  /**
   * Initializes the state of this instance.
   */
  private void jbInit() throws Exception 
  {
    this.getContentPane().setLayout( new BorderLayout() );
    this.setSize(new Dimension(720, 500));
    this.setTitle("Mars");
    this.getContentPane().setBackground(Color.gray);
    

    // create the model
    mars = new MarsModel(this);

    //mars.referenceDataFile = "C:\\Program Files\\Oracle\\JDeveloper 3.2.3\\myprojects\\Mars\\MarsData.txt";
    mars.referenceDataFile = "C:\\Mars\\data\\MarsData.txt";
    mars.LoadReferenceData();

    // create view objects
    //globe = new MarsGlobePanel(this);
    map = new MarsMapPanel(this);
    
    //globe.setMinimumSize(new Dimension(100, 100));
    //map.setPreferredSize(new Dimension(580, 310));
    stats = new MarsStatsPanel(this);
    stats.setPreferredSize(new Dimension(100, 100));

    // register the views with the model
    //mars.addObserver((Observer) globe);
    //mars.addObserver((Observer) map);
    mars.addObserver((Observer) stats);

    fileDialog = new JFileChooser();
    MarsFileFilter MarsFilter = new MarsFileFilter(".mars", "Mars Saved Games (*.mars)");
    fileDialog.addChoosableFileFilter(MarsFilter);
    fileDialog.setFileFilter(MarsFilter);

    theBoss = new MarsController(this, mars);
    theBoss.setDaemon(true);

    // Create the message window
    messagePanel = new MPanel();
    messagePanel.setLayout( new GridLayout(1,1) );
    messageList = new MarsMessageList(/*this*/);
    messageScrollPanel.getViewport().add(messageList, null);
    messageScrollPanel.setBounds(new Rectangle(0, 0, 300, 100));
    messagePanel.add(messageScrollPanel);
    messageList.setListData(mars.Messages);
    //messageList.setPreferredSize(new Dimension(300, 100));
    messageScrollPanel.setPreferredSize(new Dimension(300, 100));
    messagePanel.setPreferredSize(new Dimension(300, 100));
    mars.systemMessage("test");
    MouseListener mouseListener = new MouseAdapter() 
    {
      public void mouseClicked(MouseEvent e) 
      {
        if (e.getClickCount() == 2) 
        {
          int index = messageList.locationToIndex(e.getPoint());
          if (index >= 0)
          {
            int caller = ((MarsMessage) mars.Messages.elementAt(index)).sender;
            showDialog(caller);
          }
        }
      }
    };
    messageList.addMouseListener(mouseListener);
    
    // Create the popupPanel even though it's not visible yet
    popupPanel = new MarsPopupPanel(this);

    statusBar.setText("");
    menuBar1 = new MarsMenuBar(this);
    this.setJMenuBar(menuBar1);
    
    mapPanel = new MPanel();
    mapPanel.setLayout( new GridLayout(1,1) );
    
    padPanel = new MPanel();
    padPanel.setLayout(new GridLayout(1,2));
    
    controlPanel = new MPanel();
    controlPanel.setLayout(new GridLayout(1,3));
    
    statsPanel = new MPanel();
    
    navPanel = new MPanel();
    navPanel.setLayout(new GridLayout(3,3));
    
    globePanel = new MPanel();
    globePanel.setLayout(new FlowLayout());
    
    navNorth = new navButton("N");
    navNorth.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        panNorth_ActionPerformed(e);
      }
    });
    navSouth = new navButton("S");
    navSouth.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        panSouth_ActionPerformed(e);
      }
    });
    navEast = new navButton("E");
    navEast.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        panEast_ActionPerformed(e);
      }
    });
    navWest = new navButton("W");
    navWest.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        panWest_ActionPerformed(e);
      }
    });
    navZoomIn = new navButton("+");
    navZoomIn.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        viewZoomIn_ActionPerformed(e);
      }
    });
    navZoomOut = new navButton("-");
    navZoomOut.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        viewZoomOut_ActionPerformed(e);
      }
    });
    navNextDay = new navButton("Ok");
    navSpare2 = new navButton(" ");
    navSpare2.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        navSpare2_ActionPerformed(e);
      }
    });
    navSpare3 = new navButton(" ");
    navSpare3.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        navSpare3_ActionPerformed(e);
      }
    });
    navSpare3.setMargin(new Insets(0, 0, 0, 0));
    navSouth.setMargin(new Insets(0, 0, 0, 0));
    navSpare2.setMargin(new Insets(0, 0, 0, 0));
    navEast.setMargin(new Insets(0, 0, 0, 0));
    navNextDay.setMargin(new Insets(0, 0, 0, 0));
    navWest.setMargin(new Insets(0, 0, 0, 0));
    navZoomOut.setMargin(new Insets(0, 0, 0, 0));
    navNorth.setMargin(new Insets(0, 0, 0, 0));
    navZoomIn.setMargin(new Insets(0, 0, 0, 0));
    navNextDay.addActionListener(new ActionListener() 
    {
      public void actionPerformed(ActionEvent e) 
      {
        gameNextDay_ActionPerformed(e);
      }
    });

    // Assemble the NavPanel
    navPanel.add(navZoomIn);
    navPanel.add(navNorth);
    navPanel.add(navZoomOut);

    navPanel.add(navWest);
    navPanel.add(navNextDay);
    navPanel.add(navEast);

    navPanel.add(navSpare2);
    navPanel.add(navSouth);
    navPanel.add(navSpare3);

    // Assemble the control panel
    //globePanel.add(globe);
    statsPanel.add(stats);
    controlPanel.add(statsPanel);
    controlPanel.add(navPanel);
    controlPanel.add(globePanel);

    padPanel.add(messagePanel);
    padPanel.add(controlPanel);

    //mapPanel.add(conversation);
    //mapPanel.remove(conversation);
    mapPanel.add(map);
    //mapPanel.setBackground(SystemColor.control);
    //currentView = CONVERSATION_VIEW;
    
    mapPanel.setMinimumSize(new Dimension(610, 310));
    //mapPanel.showBorder(true, MPanel.PLAIN);

    treeTop = new DefaultMutableTreeNode("Mars");
    treeModel = new DefaultTreeModel(treeTop);
    marsTree = new MarsDirectoryTree(treeModel);
    treeView = new MScrollPane(marsTree);
    treeView.setMinimumSize(new Dimension(100, 300));
    //treeView.setMaximumSize(new Dimension(100, 900));
    treePanel = new MPanel();
    treePanel.setLayout( new GridLayout(1,1) );
    treePanel.setMinimumSize(new Dimension(100, 310));
    treePanel.add(treeView);
    MouseListener ml = new MouseAdapter() 
    {
      public void mousePressed(MouseEvent e) 
      {
        int selRow = marsTree.getRowForLocation(e.getX(), e.getY());
        TreePath selPath = marsTree.getPathForLocation(e.getX(), e.getY());
        if(selRow != -1) 
        {
          if(e.getClickCount() == 2) 
          {
            //myDoubleClick(selRow, selPath);
            String s = selPath.toString();
            mars.systemMessage(s);
            if (s.startsWith("[Mars, People,"))
            {
              // find out which person
    //          TreePath p = selPath.getParentPath();
    //          mars.systemMessage("Parent row " + new Integer(p.getPathCount()).toString());
              String name = "";
              int idx = 15;
              int next;

              next = s.indexOf("," , idx);
              if (next > 0)
                name = s.substring(idx,next);
              else
                name = s.substring(idx);
              mars.systemMessage(name);
              idx = mars.People.search(name);
              if(idx > 0)
              {
                mars.systemMessage(name + idx);
                //showDialog(idx);
                if(currentView == CONVERSATION_VIEW)
                {
                  stopConversation();
                }
                else
                {
                  if(currentView == MEETING_VIEW)
                  {
                    // Do nothing - you can't have a private conversation in a meeting
                  }
                  else
                  {
                    startConversation(idx);
                  }
                }
              }
            }
          }
        }
      }
    };
    marsTree.addMouseListener(ml);

    conversation = new MarsConversation(this);
    meetingView = new MarsMeeting(this);

    this.getContentPane().add(treePanel, BorderLayout.EAST);
    this.getContentPane().add(mapPanel, BorderLayout.CENTER);
    this.getContentPane().add(padPanel, BorderLayout.SOUTH);

    createTreeNodes();
    //map.showFeatures(true);
    //map.setScale(50000);
    //globe.setScale(200000);
    repositionPanels();
  }

  /**
   * Performs the action defined for "File|Open".
   * @param e
   */
  void fileOpen_ActionPerformed(ActionEvent e)
  {
      int result = fileDialog.showOpenDialog(this);
      gameData = fileDialog.getSelectedFile();
      if (gameData != null) 
      {
        mars.LoadGameData();
      }
  }
  /**
   * Performs the action defined for "File|Save".
   * @param e
   */
  void fileSave_ActionPerformed(ActionEvent e)
  {
    if (gameData == null)
    {
      int result = fileDialog.showSaveDialog(this);
      gameData = fileDialog.getSelectedFile();
      if (gameData != null) 
      {
        if (!gameData.getName().toLowerCase().endsWith(".mars"))
          gameData = new File(gameData.getAbsoluteFile() + ".mars");
        mars.SaveGameData();
      }
    }
    else
    {
      mars.SaveGameData();
    }
  }

  /**
   * Performs the action defined for "File|Save As".
   * @param e
   */
  void fileSaveAs_ActionPerformed(ActionEvent e)
  {
      int result = fileDialog.showSaveDialog(this);
      gameData = fileDialog.getSelectedFile();
      if (gameData != null) 
      {
        if (!gameData.getName().toLowerCase().endsWith(".mars"))
          gameData = new File(gameData.getAbsoluteFile() + ".mars");
        mars.SaveGameData();
      }
  }

  /**
   * Performs the action defined for "File|New".
   * @param e
   */
  void fileNew_ActionPerformed(ActionEvent e)
  {
    mars.LoadNewEasyGame();
    createTreeNodes();
  }

  /**
   * Performs the action defined for "File|Exit".
   * @param e
   */
  void fileExit_ActionPerformed(ActionEvent e)
  {
    System.exit(0);
  }

  /**
   * Performs the action defined for "View|Zoom In".
   * @param e
   */
  void viewZoomIn_ActionPerformed(ActionEvent e) 
  {
    switch(this.currentView)
    {
      case 1:
        map.zoomIn();
        break;
      case 3:
        settlementView.zoomIn();
        break;
    }
    repaint();
  }

  /**
   * Performs the action defined for "View|Zoom Out".
   * @param e
   */
  void viewZoomOut_ActionPerformed(ActionEvent e) 
  {
    switch(this.currentView)
    {
      case 1:
        map.zoomOut();
        break;
      case 3:
        settlementView.zoomOut();
        break;
    }
    repaint();
  }

  /**
   * Performs the action defined for "View|North" and navNorth.
   * @param e
   */
  void panNorth_ActionPerformed(ActionEvent e)
  {
    switch(this.currentView)
    {
      case 1:
        map.panNorth();
        //globe.panNorth();
        break;
      case 3:
        settlementView.theView.pan_North();
        break;
    }
    repaint();
  }

  /**
   * Performs the action defined for "View|East" and navEast.
   * @param e
   */
  void panEast_ActionPerformed(ActionEvent e)
  {
    switch(this.currentView)
    {
      case 1:
        map.panEast();
        //globe.panEast();
        break;
      case 3:
        settlementView.theView.pan_East();
        break;
    }
    repaint();
  }

  /**
   * Performs the action defined for "View|South" and navSouth.
   * @param e
   */
  void panSouth_ActionPerformed(ActionEvent e)
  {
    switch(this.currentView)
    {
      case 1:
        map.panSouth();
        //globe.panSouth();
        break;
      case 3:
        settlementView.theView.pan_South();
        break;
    }
    repaint();
  }

  /**
   * Performs the action defined for "View|West" and navWest.
   * @param e
   */
  void panWest_ActionPerformed(ActionEvent e)
  {
    switch(this.currentView)
    {
      case 1:
        map.panWest();
        //globe.panWest();
        break;
      case 3:
        settlementView.theView.pan_West();
        break;
    }
    repaint();
  }

  /**
   * Performs the action defined for "View|Info".
   * @param e
   */
  void viewInfo_ActionPerformed(ActionEvent e)
  {
    JOptionPane.showMessageDialog(this, new MarsInfoPanel(this), "Info", JOptionPane.PLAIN_MESSAGE);
  }

  /**
   * Performs the action defined for "Help|About".
   * @param e
   */
  void helpAbout_ActionPerformed(ActionEvent e) 
  {
    JOptionPane.showMessageDialog(this, new MarsFrame_AboutBoxPanel1(), "About", JOptionPane.PLAIN_MESSAGE);
  }

  /**
   * Performs the action defined for "View|West" and navWest.
   * @param e
   */
  void gameNextDay_ActionPerformed(ActionEvent e)
  {
    switch (mars.gameStatus)
    {
      case 0: // no game loaded
      showDialog(1);
        break;
      case 1: // loaded but not started
        mars.gameStatus = 2;
        mars.gameSpeed = 1;
        theBoss.start();
        break;
      case 2: // running
        mars.gameStatus = 3;
        //theBoss.interrupt();
        break;
      case 3: // paused
        mars.gameStatus = 2;
        //theBoss.start();
        break;
    }
  }

  private void showDialog(int m)
  {
//    JOptionPane.showMessageDialog(this, new MarsInfoPanel(this), "Info", JOptionPane.PLAIN_MESSAGE);
//    JOptionPane.showMessageDialog(this, new MarsDialog(this, m), "Info", JOptionPane.PLAIN_MESSAGE);
    MarsDialog dialog = new MarsDialog(this, m);
    if( JOptionPane.showConfirmDialog(this,dialog,"Change...",JOptionPane.OK_CANCEL_OPTION)
      == JOptionPane.OK_OPTION)
    {
      // Send a message to the person telling them the new task they have been set.
      int p = dialog.p;
      int a = dialog.activityType.getSelectedIndex() + 1;
      int s = dialog.activityDetail.getSelectedIndex() + 1;
      mars.systemMessage("Activity p (" + p + ") a(" + a + ") s(" + s + ")");
      mars.People.startNewActivity(p, a, s);
    }
  }

  public void createTreeNodes()
  {
    DefaultMutableTreeNode category = null;
    DefaultMutableTreeNode item = null;

    treeTop.removeAllChildren();
    
    category = new DefaultMutableTreeNode("Settlements");
    treeTop.add(category);

    if(mars.Settlements != null)
    {
      for (int i=1; i<mars.Settlements.size(); i++)
      {
        item = new DefaultMutableTreeNode( (MarsSettlement) mars.Settlements.elementAt(i) );
        category.add(item);
      }
    }

    category = new DefaultMutableTreeNode("People");
    treeTop.add(category);

    if(mars.People != null)
    {
      for (int i=1; i<mars.People.size(); i++)
      {
        item = new DefaultMutableTreeNode( (MarsPerson) mars.People.elementAt(i) );
        category.add(item);
      }
    }
        
    treeModel.reload(treeTop);
  }

  public void startConversation(int p)
  {
    // First clear any messages
    conversation.clear();
    // Now set the person
    conversation.setPerson(p);
    // This code is added to set the list of statements in the conversation view
    conversation.setStatements(1);
    //conversation.setLayout(new BorderLayout());
    //conversation.setPreferredSize(new Dimension(580, 310));
    previousView = currentView;
    currentView = CONVERSATION_VIEW;
    //mapPanel.removeAll();
    
    popupPanel.add(conversation);
    //mapPanel.add(popupPanel);
    popupPanel.setMode(popupPanel.POPUP_CONVERSATION);
    showView();
    //mapPanel.setMinimumSize(new Dimension(610, 310));
    //conversation.setBounds(0,0,610,310);
    //Rectangle r = this.getBounds();
    //r.width = r.width + 1;
    //this.setBounds(r);
    conversation.validate();
    /*
    if(conversation.isValid())
    {
      mars.systemMessage("Conversation is valid");
    }
    else
    {
      mars.systemMessage("Conversation is not valid");
    }
    //conversation.setVisible(true);
    if(conversation.isVisible())
    {
      mars.systemMessage("Conversation is visible");
    }
    else
    {
      mars.systemMessage("Conversation is not visible");
    }*/
     repositionPanels();
    this.validate();
    repaint();
    //conversation.setSize(mapPanel.size());
  }
  
  public void showPreviousView()
  {
    currentView = previousView;
    showView();
  }
  
  public void showView()
  {
    mapPanel.removeAll();
    switch(currentView)
    {
      case 1: // Map view
        mapPanel.add(map);
        break;
      case 2: // conversation view
       mapPanel.add(popupPanel);
       break;
      case 3: // Settlement View
        mapPanel.add(settlementView);
        break;
    }
  }

  public void stopConversation()
  {
    popupPanel.remove(conversation);
    showPreviousView();
    /*
    mapPanel.removeAll();
    switch(previousView)
    {
      case 1: // Map view
        mapPanel.add(map);
        break;
      case 3: // Settlement View
        mapPanel.add(settlementView);
        break;
    }
    //mapPanel.add(map);
    currentView = previousView;
    popupPanel.setMode(popupPanel.POPUP_HIDDEN);
    */
    repositionPanels();
    this.validate();
    repaint();
  }
  
  public void showWaypoint(int wp)
  {
    if(isSettlementVisible) 
    {
      //hideWaypoint();
      isSettlementVisible = false;
      showPreviousView();
      return;
    }
    settlementView = new MarsViewPanel(this, wp);
    //settlementView.setPreferredSize(new Dimension(400, 400));
    currentView = SETTLEMENT_VIEW;
    showView();
    //mapPanel.removeAll();
    //mapPanel.add(settlementView);
    isSettlementVisible = true;
    settlementView.validate();
    repositionPanels();
    this.validate();
    repaint();
  }
  
  public void hideWaypoint()
  {
    mapPanel.removeAll();
    isSettlementVisible = true;
    mapPanel.add(map);
    currentView = MAP_VIEW;
    repositionPanels();
    repaint();
  }
  
  public void showReport()
  {
    if(isReportVisible) hideReport();
    //if(currentView == REPORT_VIEW) return;
    //if(currentView == CONVERSATION_VIEW) return;
    //if(currentView == MEETING_VIEW) return;
    int h = this.getHeight() - 100;
    int w = this.getWidth() - 100;
    int c = 1;
    if(isMapVisible) c++;
    if(isReportVisible) c++;
    w = w / c;
    reportView = new MarsReport(this);
    map.setPreferredSize(new Dimension(w,h));
    settlementView.setPreferredSize(new Dimension(w,h));
    reportView.setPreferredSize(new Dimension(w,h));
    //previousView = currentView;
    //currentView = REPORT_VIEW;
    //mapPanel.removeAll();
    mapPanel.add(reportView);
    isReportVisible = true;
    reportView.validate();
    repositionPanels();
    this.validate();
    repaint();
  }

  public void showReport(int reportType, int id)
  {
    if(isReportVisible) hideReport();
    //if(currentView == REPORT_VIEW) return;
    //if(currentView == CONVERSATION_VIEW) return;
    //if(currentView == MEETING_VIEW) return;
    reportView = new MarsReport(this, reportType, id);
    reportView.setPreferredSize(new Dimension(400,400));
    //previousView = currentView;
    //mapPanel.removeAll();
    //currentView = REPORT_VIEW;
    mapPanel.add(reportView);
    isReportVisible = true;
    reportView.validate();
    repositionPanels();
    this.validate();
    repaint();
  }
  
  public void hideReport()
  {
    mapPanel.remove(reportView);
    isReportVisible = false;
    //if(previousView == MAP_VIEW) mapPanel.add(map);
    //if(previousView == SETTLEMENT_VIEW) mapPanel.add(settlementView);
    //currentView = previousView;
     repositionPanels();
    repaint();
  }
  
  public void navSpare2_ActionPerformed(ActionEvent e)
  {
    int landingWP;
    landingWP = mars.Settlements.getWaypoint(1);
    int nearestWP;
    nearestWP = mars.Waypoints.findNearestUnsurveyed(landingWP);
    mars.systemMessage("Landing: " + landingWP + " Nearest: " + nearestWP);
  }

  public void navSpare3_ActionPerformed(ActionEvent e)
  {
    if( (currentView == MAP_VIEW) || (currentView == SETTLEMENT_VIEW))
    {
      // First clear any messages
      meetingView.clear();
      // Now set the person
      meetingView.addPeople();
      // This code is added to set the list of statements in the conversation view
      //conversation.setStatements(1);
      
      previousView = currentView;
      currentView = MEETING_VIEW;
      mapPanel.removeAll();
      
      //popupPanel.add(meetingView);
      mapPanel.add(meetingView);
      //popupPanel.setMode(popupPanel.POPUP_CONVERSATION);
      //mapPanel.setMinimumSize(new Dimension(610, 310));
      //conversation.setBounds(0,0,610,310);
      //Rectangle r = this.getBounds();
      //r.width = r.width + 1;
      //this.setBounds(r);
      //conversation.validate();
       repositionPanels();
      this.validate();
      repaint();
    }
    else
    {
      if(currentView == MEETING_VIEW)
      {
        endMeeting();
      }
    }
  }
  
  public void updateConversation()
  {
    // time to get another statement
    if(currentView == CONVERSATION_VIEW)
    {
      conversation.updateConversation();
    }
    if(currentView == MEETING_VIEW)
    {
      meetingView.updateConversation();
    }
  }
  
  public void endMeeting()
  {
    // stop the meeting
    mapPanel.removeAll();
    switch(previousView)
    {
      case 1: // Map view
        mapPanel.add(map);
        break;
      case 3: // Settlement View
        mapPanel.add(settlementView);
        break;
    }
    //mapPanel.add(map);
    currentView = previousView;
    repositionPanels();
    this.validate();
    repaint();
  }
  
  public void repositionPanels()
  {
    MPanel panel = null;
    int views = mapPanel.getComponentCount();
    int rows = 1;
    if(views > 2) rows++;
    if(views > 8) rows++;
    if(views > 18) rows++;
    int cols = (int) views/rows;
    int rownum = 1;
    int colnum = 1;
    int h = (int) (this.getHeight() - 100)/rows;
    int w = 0;
    for (int i=0;  i < views; i++)
    {
      panel = (MPanel) mapPanel.getComponent(i);
      // find out if this is the last row
      if(rownum == rows)
      {
        w = (int) (this.getWidth() - 100)/(views - i);
      }
      else
      {
        w = (int) (this.getWidth() - 100)/cols;
      }
      panel.setPanelSize(w, h);
      panel.setBounds(h * (rownum-1), w * (colnum-1), w, h);
      colnum++;
      if(colnum > cols)
      {
        colnum = 1;
        rownum++;
      }
    }
  }
}


