/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.mahout.ga.watchmaker.travellingsalesman;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

/**
 * Panel for controlling the execution of the Travelling Salesman applet. Contains controls for starting and
 * stopping the route-finding algorithms and for displaying progress and results.
 * 
 * <br>
 * The original code is from <b>the Watchmaker project</b> (https://watchmaker.dev.java.net/).
 */
final class ExecutionPanel extends JPanel implements ProgressListener {
  
  private final JButton startButton;
  private final JTextArea output;
  private final JScrollPane scroller;
  private final JProgressBar progressBar;
  
  ExecutionPanel() {
    super(new BorderLayout());
    Container controlPanel = new JPanel(new BorderLayout());
    startButton = new JButton("Start");
    controlPanel.add(startButton, BorderLayout.WEST);
    progressBar = new JProgressBar(0, 100);
    controlPanel.add(progressBar, BorderLayout.CENTER);
    add(controlPanel, BorderLayout.NORTH);
    output = new JTextArea();
    output.setEditable(false);
    output.setLineWrap(true);
    output.setWrapStyleWord(true);
    output.setFont(new Font("Monospaced", Font.PLAIN, 12));
    scroller = new JScrollPane(output);
    scroller.setBorder(BorderFactory.createTitledBorder("Results"));
    add(scroller, BorderLayout.CENTER);
  }
  
  /**
   * Adds logic to the start button so that something happens when it is clicked.
   * 
   * @param actionListener
   *          The action to perform when the button is clicked.
   */
  public void addActionListener(ActionListener actionListener) {
    startButton.addActionListener(actionListener);
  }
  
  /**
   * Updates the position of the progress bar.
   */
  @Override
  public void updateProgress(final double percentComplete) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        progressBar.setValue((int) percentComplete);
      }
    });
  }
  
  /**
   * Appends the specified text to this panel's text area.
   * 
   * @param text
   *          The text to append.
   */
  public void appendOutput(String text) {
    output.append(text);
  }
  
  @Override
  public void setEnabled(boolean b) {
    startButton.setEnabled(b);
    scroller.setEnabled(b);
    super.setEnabled(b);
  }
}
