import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import PrintGame.*;
import PrintGame.Robot;
import LevelEditor.*;
import java.lang.Integer;


public class LevelEditor
implements ActionListener, WindowListener, ItemListener
{
  private Labyrinth labyrinth_;
  private LabyrinthField labyrinth_field_;
  private LabyrinthCanvas labyrinth_canvas_;
  private Frame frame_;
  private Panel radio_panel_, button_panel_, new_panel_, export_panel_;
  private Button import_button_, export_button_, new_button_;
  private TextField textfield_1, textfield_2;
  private Label export_label_, label_, label_2_;
  
  private final static String EXPORT = "Export to XML";
  private final static String IMPORT = "Import";
  private final static String WALL = "Wall";
  private final static String WAY = "Way";
  private final static String DIAMOND = "Diamond";
  private final static String STARTPOINT = "Startpoint";
  private final static String NEW = "New Labyrinth";
  
/**
 * method to build an application
 *
 */
 public void init() 
 {
   frame_ = new Frame("LevelEditor");
   frame_.addWindowListener(this);
   frame_.setLayout(new BorderLayout());
   
   button_panel_ = new Panel(new GridLayout(2,1));
   frame_.add(button_panel_, BorderLayout.NORTH);
   
   new_panel_ = new Panel(new FlowLayout());

   label_ = new Label("Rows");
   label_.setAlignment(Label.RIGHT);   
   new_panel_.add(label_);
  
   textfield_1 = new TextField("",2);
   new_panel_.add(textfield_1);
   
   label_2_ = new Label("Cols");
   label_2_.setAlignment(Label.RIGHT);     
   new_panel_.add(label_2_); 
   
   textfield_2 = new TextField("",2);
   new_panel_.add(textfield_2);
   
   new_button_ = new Button(NEW);
   new_button_.addActionListener(this); 
   new_panel_.add(new_button_);
   
   button_panel_.add(new_panel_);

   export_panel_ = new Panel(new FlowLayout());
   
   import_button_ = new Button(IMPORT);
   import_button_.addActionListener(this);
   export_panel_.add(import_button_);

   
   export_button_ = new Button(EXPORT);
   export_button_.addActionListener(this);
   export_button_.setEnabled(false);
   export_panel_.add(export_button_);
   
   export_label_ = new Label("                                        ");
   export_label_.setAlignment(Label.LEFT);
   export_panel_.add(export_label_);
   
   button_panel_.add(export_panel_);

   
   radio_panel_ = new Panel(new GridLayout(1, 4));
   frame_.add(radio_panel_, BorderLayout.CENTER);   
   CheckboxGroup cbg = new CheckboxGroup();
   Checkbox wall = new Checkbox(WALL, cbg, false);
   Checkbox way = new Checkbox(WAY, cbg, true);
   Checkbox diamond = new Checkbox(DIAMOND, cbg, false);
   Checkbox start_point = new Checkbox(STARTPOINT, cbg, false);
   wall.addItemListener(this);
   way.addItemListener(this);
   diamond.addItemListener(this);
   start_point.addItemListener(this);
   radio_panel_.add(wall);
   radio_panel_.add(way);
   radio_panel_.add(diamond);
   radio_panel_.add(start_point);
      
    frame_.pack();
    frame_.setVisible(true);
   // labyrinth_canvas_.repaint();
 }
 

 
 public static void main(String[] args)
 {
   LevelEditor level_editor = new LevelEditor(); 
   level_editor.init();
 }
 
 public void actionPerformed(ActionEvent e) 
  {
    if (e.getActionCommand() == EXPORT )
    {
      try
      {
        Robot temp_robot = new Robot();
        Direction start_direction = labyrinth_canvas_.getStartDirection();
        temp_robot.setStartDirection(start_direction);
        FileDialog dlg = new FileDialog(frame_, EXPORT, FileDialog.SAVE);
        dlg.show();
        String directory = dlg.getDirectory();
        String file_name = dlg.getFile();
        WriteLabToXML xml_writer = new WriteLabToXML(labyrinth_field_, temp_robot);
        xml_writer.writeXMLFile(directory + file_name, 0);       // num_missing_diamonds fehlt noch
        export_label_.setText("                                        ");
      }
      catch (IllegalDirectionException ex)
      {
        export_label_.setText("Set startpoint first!");
       // System.out.println("Es wurde kein File geschrieben - " + ex.getMessage());
      }
    }
    else if(e.getActionCommand() == NEW)
    {
      export_label_.setText("                                        ");
      int rows_new = Integer.decode(textfield_1.getText()).intValue();
      int cols_new = Integer.decode(textfield_2.getText()).intValue();
      if( labyrinth_canvas_ !=null)
        frame_.remove(labyrinth_canvas_);
      
      labyrinth_field_ = new LabyrinthField(rows_new, cols_new);
      labyrinth_canvas_ = new LabyrinthCanvas(labyrinth_field_); 
      export_button_.setEnabled(true);
      frame_.add(labyrinth_canvas_, BorderLayout.SOUTH);
      frame_.pack();
      labyrinth_canvas_.repaint();
    }
    if (e.getActionCommand() == IMPORT )
    {
      if( labyrinth_canvas_ !=null)
        frame_.remove(labyrinth_canvas_);

      Labyrinth temp_lab = new Labyrinth();
      FileDialog dlg = new FileDialog(frame_, EXPORT, FileDialog.LOAD);
      dlg.show();
      String directory = dlg.getDirectory();
      String file_name = dlg.getFile();

      temp_lab.loadLabyrinth(directory + file_name);
      labyrinth_field_ = temp_lab.getLabyrinthField();
      labyrinth_canvas_ = new LabyrinthCanvas(labyrinth_field_); 
      labyrinth_canvas_.setStartDirection(temp_lab.getStartDirection());
      export_label_.setText("                                        ");
      
      export_button_.setEnabled(true);
      frame_.add(labyrinth_canvas_, BorderLayout.SOUTH);
      frame_.pack();
      labyrinth_canvas_.repaint();      
    }
    
  }
 public void itemStateChanged(ItemEvent e) 
  {
    if(e.getItem() == WALL)
      labyrinth_canvas_.setDrawSelector(LabyrinthCanvas.DRAW_WALL);
    else if(e.getItem() == WAY)
      labyrinth_canvas_.setDrawSelector(LabyrinthCanvas.DRAW_WAY);
    else if(e.getItem() == DIAMOND)
      labyrinth_canvas_.setDrawSelector(LabyrinthCanvas.DRAW_DIAMOND);
    else if(e.getItem() == STARTPOINT)
      labyrinth_canvas_.setDrawSelector(LabyrinthCanvas.DRAW_STARTPOINT);
    else
      System.out.println("Unknown item");
  } 
 
  public void windowClosing(WindowEvent e) 
  {
    frame_.dispose();
    System.exit(0);
  }
  
  public void windowActivated(WindowEvent e) {}
  
  public void windowClosed(WindowEvent e) {}
    
  public void windowDeactivated(WindowEvent e) {}
  
  public void windowDeiconified(WindowEvent e) {}
  
  public void windowIconified(WindowEvent e) {}
  
  public void windowOpened(WindowEvent e) {}
  
}
  