package com.planimod.ui.views.admin.product;

import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.window.IShellProvider;

import com.patrikdufresne.managers.ManagerException;
import com.patrikdufresne.printing.IPrintFactory;
import com.patrikdufresne.printing.PrintAction;
import com.patrikdufresne.util.Localized;
import com.planimod.core.PlanimodManagers;
import com.planimod.ui.PlanimodPolicy;
import com.planimod.ui.preference.PlanimodPreferences;

/**
 * This action allow the user to print a list of product and it's associated
 * position.
 * 
 * @author Patrik Dufresne
 * 
 */
public class ProductPositionPrintAction extends PrintAction {
	/**
	 * Define the preference key for this action
	 */
	private static final String PREF_KEY = "ProductPositionPrintAction.printPreference"; //$NON-NLS-1$

	/**
	 * Managers to use.
	 */
	private PlanimodManagers managers;

	/**
	 * Create a new Print Employee Action
	 * 
	 * @param shell
	 *            A Shell provider used to create new windows
	 * @param operation
	 *            type of operation : PRINT or PREVIEW
	 */
	public ProductPositionPrintAction(PlanimodManagers managers,
			IShellProvider shell, int operation, IRunnableContext context) {
		super(shell, new ProductPositionPrintFactory(), operation, context);
		if (managers == null) {
			throw new NullPointerException();
		}
		this.managers = managers;
		setPrefKey(PREF_KEY);
		setPreferenceStore(PlanimodPreferences.getPreferenceStore());
		setEnabled(true);
		if (operation == PrintAction.PRINT_ACTION) {
			setText(Localized.get(ProductPositionPrintAction.class,
					"ProductPositionPrintAction.print"));
		} else {
			setText(Localized.get(ProductPositionPrintAction.class,
					"ProductPositionPrintAction.preview"));
		}
	}

	/**
	 * Returns the managers used by this action.
	 * 
	 * @return
	 */
	protected PlanimodManagers getManagers() {
		return this.managers;
	}

	/**
	 * This implementation set the employee to print
	 * 
	 * @param factory
	 *            the factory
	 */
	@Override
	protected void initFactory(IPrintFactory factory) {
		try {
			((ProductPositionPrintFactory) factory)
					.setProductPosition(getManagers()
							.getProductPositionManager().list());
		} catch (ManagerException e) {
			PlanimodPolicy.showException(e);
		}
	}
}
