/*
 * Copyright 2009 the original author or authors.
 *
 * 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 org.gradle.gradleplugin.userinterface.swing.generic;

import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
import org.gradle.gradleplugin.userinterface.AlternateUIInteraction;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.ImageIcon;
import javax.imageio.ImageIO;
import java.awt.Component;
import java.awt.image.BufferedImage;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.InputStream;
import java.io.IOException;

/**
 * This just wraps up an OutputPanel so it has a tab header that can be dynamic. The current (rather awkward) JTabbedPane
 * implementation is to separate the tab contents from its component. This only works with java 1.6 or later.
 *
 * @author mhunsicker
 */
public class OutputTab extends OutputPanel {

    private static final Logger LOGGER = Logging.getLogger(OutputTab.class);

    private JPanel mainPanel;
    private JLabel mainTextLabel;
    private JLabel pinnedLabel;
    private JLabel closeLabel;

   private static ImageIcon closeIcon;
   private static ImageIcon closeHighlightIcon;

   public OutputTab(OutputPanelParent parent, String header, AlternateUIInteraction alternateUIInteraction) {
        super( parent, alternateUIInteraction );
        mainPanel = new JPanel();
        mainPanel.setOpaque(false);
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS));

        mainTextLabel = new JLabel(header);
        pinnedLabel = new JLabel("(Pinned) ");
        pinnedLabel.setVisible(isPinned());

        setupCloseLabel();

        mainPanel.add(mainTextLabel);
        mainPanel.add(Box.createHorizontalStrut(5));
        mainPanel.add(pinnedLabel);
        mainPanel.add(closeLabel);
    }

   private void setupCloseLabel()
   {
      if( closeIcon == null )
      {
          BufferedImage closeImage = getImageResource( "close.png" );
          BufferedImage closeHighlightImage = getImageResource( "close-highlight.png" );

          if( closeImage != null ) {
             closeIcon = new ImageIcon( closeImage );
          }

         if( closeHighlightImage != null ) {
            closeHighlightIcon = new ImageIcon( closeHighlightImage );
         }
      }

      closeLabel = new JLabel( closeIcon );
      closeLabel.addMouseListener( new MouseAdapter() {
         @Override
         public void mouseEntered( MouseEvent e ) {
            closeLabel.setIcon( closeHighlightIcon );
         }

         @Override
         public void mouseExited( MouseEvent e ) {
            closeLabel.setIcon( closeIcon );
         }

         public void mouseClicked(MouseEvent e) {
             close();
         }
      } );
   }

   private BufferedImage getImageResource( String imageResourceName )
    {
       InputStream inputStream = getClass().getResourceAsStream(imageResourceName);
       if (inputStream != null) {
          try {
              BufferedImage image = ImageIO.read(inputStream);
             return image;
          }
          catch ( IOException e) {
              LOGGER.error("Reading image " + imageResourceName, e);
          }
       }

       return null;
    }

    /**
     * Call this if you're going to reuse this. it resets its output.
     *
     * @author mhunsicker
     */
    @Override
    public void reset() {
        super.reset();
        closeLabel.setEnabled(true);
    }

    public Component getTabHeader() {
        return mainPanel;
    }

    public void setTabHeaderText(String newText) {
        mainTextLabel.setText(newText);
    }

    public boolean close() {
        closeLabel.setEnabled(false); // provide feedback to the user that we received their click

        boolean result = super.close();
        if( result ) {
           closeLabel.setEnabled(true);
        }

       return result;
    }

    /**
     * Overridden so we can indicate the pinned state.
     *
     * @param pinned whether or not we're pinned
     * @author mhunsicker
    */
    @Override
    public void setPinned(boolean pinned) {
        pinnedLabel.setVisible(pinned);

        super.setPinned(pinned);
    }
}
