/*
 * Copyright 2008-2014, David Karnok 
 * The file is part of the Open Imperium Galactica project.
 * 
 * The code should be distributed under the LGPL license.
 * See http://www.gnu.org/licenses/lgpl.html for details.
 */

package hu.openig.editors.ce;

import hu.openig.core.Action0;
import hu.openig.core.Action1;

import java.awt.BorderLayout;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

/**
 * The technology videos.
 * @author akarnokd, 2012.11.03.
 */
public class CETechnologyVideosPanel extends CESlavePanel {
	/** */
	private static final long serialVersionUID = 5330630746779319543L;
	/** The video field. */
	CEValueBox<JTextField> videoField;
	/** The normal video. */
	CEVideoRef normalVideo;
	/** The wired video. */
	CEVideoRef wiredVideo;
	/**
	 * Constructor. Initializes the GUI.
	 * @param context the context
	 */
	public CETechnologyVideosPanel(CEContext context) {
		super(context);
		initGUI();
	}
	/** Initializes the GUI. */
	private void initGUI() {
		JPanel panel = new JPanel();
		GroupLayout gl = new GroupLayout(panel);
		panel.setLayout(gl);
		gl.setAutoCreateContainerGaps(true);
		gl.setAutoCreateGaps(true);
		
		videoField = CEValueBox.of(get("tech.video"), new JTextField());
		
		normalVideo = new CEVideoRef(get("tech.video.normal"));
		wiredVideo = new CEVideoRef(get("tech.video.wired"));
		
		addValidator(videoField, new Action1<Object>() {
			@Override
			public void invoke(Object value) {
				setVideos();
			}
		});
		
		// --------------------------------------------------
		
		int imageSize = 100;
		
		gl.setHorizontalGroup(
			gl.createParallelGroup()
			.addComponent(videoField)
			.addGroup(
				gl.createSequentialGroup()
				.addComponent(normalVideo.image, imageSize, imageSize, imageSize)
				.addComponent(normalVideo.valid)
				.addComponent(normalVideo.label)
				.addComponent(normalVideo.path)
				.addGap(30)
				.addComponent(wiredVideo.image, imageSize, imageSize, imageSize)
				.addComponent(wiredVideo.valid)
				.addComponent(wiredVideo.label)
				.addComponent(wiredVideo.path)
			)
		);
		
		gl.setVerticalGroup(
			gl.createSequentialGroup()
			.addComponent(videoField)
			.addGroup(
				gl.createParallelGroup(Alignment.CENTER)
				.addComponent(normalVideo.image, imageSize, imageSize, imageSize)
				.addComponent(normalVideo.valid)
				.addComponent(normalVideo.label)
				.addComponent(normalVideo.path, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE)
				.addComponent(wiredVideo.image, imageSize, imageSize, imageSize)
				.addComponent(wiredVideo.valid)
				.addComponent(wiredVideo.label)
				.addComponent(wiredVideo.path, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE)
			)
		);
		
		JScrollPane sp = new JScrollPane(panel);

		sp.getVerticalScrollBar().setUnitIncrement(30);
		sp.getVerticalScrollBar().setBlockIncrement(90);

		setLayout(new BorderLayout());
		add(sp, BorderLayout.CENTER);
	}
	/** Set the video images. */
	void setVideos() {
		String videoBase = videoField.component.getText();
		if (master != null) {
			master.set("video", videoBase);
		}
		if (videoBase != null && !videoBase.isEmpty()) {
			Action0 act = new Action0() {
				@Override
				public void invoke() {
					validateVideos();
				}
			};
			
			normalVideo.setVideo(videoBase + ".ani.gz", context, act);
			wiredVideo.setVideo(videoBase + "_wired.ani.gz", context, act);
		} else {
			normalVideo.error(errorIcon);
			wiredVideo.error(errorIcon);
			validateVideos();
		}
	}
	/** Validate the video fields. */
	void validateVideos() {
		ImageIcon invalidIcon = videoField.getInvalid();
		invalidIcon = max(invalidIcon, normalVideo.getInvalid());
		
		ImageIcon wi = wiredVideo.getInvalid();
		if ("0".equals(master.get("level", "")) && wi != null) {
			wi = warningIcon;
		}
		invalidIcon = max(invalidIcon, wi);
		onValidate(invalidIcon);
	}
	@Override
	public void onMasterChanged() {
		if (master != null) {
			setTextAndEnabled(videoField, master, "video", true);
		} else {
			setTextAndEnabled(videoField, null, "", false);
			normalVideo.clear();
			wiredVideo.clear();
		}
	}
}