/**
 * Copyright 2008 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.dev;

import com.google.gwt.core.ext.TreeLogger.Type;
import com.google.gwt.dev.ModuleTabPanel.Session;
import com.google.gwt.dev.shell.log.SwingLoggerPanel;
import com.google.gwt.dev.shell.log.SwingLoggerPanel.CloseHandler;
import com.google.gwt.dev.util.log.AbstractTreeLogger;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * A panel which represents a single module session.
 */
public class ModulePanel extends JPanel implements Disconnectable {

  private SwingLoggerPanel loggerPanel;

  private Session session;
  
  private boolean disconnected;

  public ModulePanel(Type maxLevel, String moduleName,
      Session session, File logFile) {
    super(new BorderLayout());
    this.session = session;
    if (false) {
      JPanel topPanel = new JPanel();
      JButton compileButton = new JButton("Compile (not yet implemented)");
      compileButton.setEnabled(false);
      compileButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          JOptionPane.showMessageDialog(null, "Compiling not implemented yet", 
              "Alert: Not Implemented", JOptionPane.INFORMATION_MESSAGE);
        }
      });
      topPanel.add(compileButton);
      add(topPanel, BorderLayout.NORTH);
    }
    loggerPanel = new SwingLoggerPanel(maxLevel, logFile);
    add(loggerPanel);
    session.addModule(moduleName, this);
  }

  /* (non-Javadoc)
   * @see com.google.gwt.dev.Disconnectable#disconnect()
   */
  public void disconnect() {
    setDisconnected();
  }

  public AbstractTreeLogger getLogger() {
    return loggerPanel.getLogger();
  }

  /* (non-Javadoc)
   * @see com.google.gwt.dev.Disconnectable#isDisconnected()
   */
  public boolean isDisconnected() {
    return disconnected;
  }
  
  /**
   * Called by ModuleTabPanel when the user forces the close.
   */
  void setDisconnected() {
    disconnected = true;
    loggerPanel.disconnected();
    // TODO(jat): allow closing open connections once we do away with SWT
    loggerPanel.setCloseHandler(new CloseHandler() {
      public void onCloseRequest(SwingLoggerPanel loggerPanelToClose) {
        session.disconnectModule(ModulePanel.this);
      }
    });
  }
}
