/**
 * Created on Sep 19, 2008
 *
 * Copyright (C) Azureus Software, Inc, All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA 
 */
 
package com.aelitis.azureus.ui.swt.columns.torrent;


import org.eclipse.swt.graphics.Image;

import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTGraphicImpl;
import org.gudy.azureus2.ui.swt.views.table.CoreTableColumnSWT;

import com.aelitis.azureus.core.torrent.PlatformTorrentUtils;
import com.aelitis.azureus.ui.common.table.TableRowCore;
import com.aelitis.azureus.ui.swt.imageloader.ImageLoader;

import org.gudy.azureus2.plugins.download.Download;
import org.gudy.azureus2.plugins.ui.menus.MenuItem;
import org.gudy.azureus2.plugins.ui.menus.MenuItemListener;
import org.gudy.azureus2.plugins.ui.tables.*;

/**
 * @author TuxPaper
 * @created Sep 19, 2008
 *
 */
public class ColumnUnopened
	extends CoreTableColumnSWT
	implements TableCellAddedListener, TableCellRefreshListener,
	TableCellMouseListener
{
	public static final Class<?> DATASOURCE_TYPE = Download.class;

	public static final String COLUMN_ID = "unopened";

	public void fillTableColumnInfo(TableColumnInfo info) {
		info.addCategories(new String[] { CAT_CONTENT, CAT_ESSENTIAL });
		info.setProficiency(TableColumnInfo.PROFICIENCY_BEGINNER);
	}

	private static UISWTGraphicImpl graphicCheck;
	private static UISWTGraphicImpl graphicUnCheck;
	private static UISWTGraphicImpl[] graphicsProgress;

	private static int WIDTH = 38; // enough to fit title


	/**
	 * @param name
	 * @param tableID
	 */
	public ColumnUnopened(String tableID) {
		super(COLUMN_ID, tableID);
		
		synchronized( ColumnUnopened.class ){
			
			if (graphicCheck == null) {
				Image img = ImageLoader.getInstance().getImage("image.unopened");
				graphicCheck = new UISWTGraphicImpl(img);
			}
			if (graphicUnCheck == null) {
				Image img = ImageLoader.getInstance().getImage("image.opened");
				graphicUnCheck = new UISWTGraphicImpl(img);
			}
	
			if (graphicsProgress == null) {
				
				Image[] imgs = ImageLoader.getInstance().getImages("image.sidebar.vitality.dl");
				graphicsProgress = new UISWTGraphicImpl[imgs.length];
				for(int i = 0 ; i < imgs.length ; i++) {
					graphicsProgress[i] = new UISWTGraphicImpl(imgs[i]);
				}
				
			}
		}
		
		TableContextMenuItem menuItem = addContextMenuItem("label.toggle.new.marker");

		menuItem.addMultiListener(new MenuItemListener() {
			public void selected(MenuItem menu, Object target) {
				Object[] dataSources = (Object[])target;
				
				for ( Object _ds: dataSources ){

					if (_ds instanceof TableRowCore) {
						TableRowCore row = (TableRowCore) _ds;
						_ds = row.getDataSource(true);
					}

					if ( _ds instanceof DownloadManager ){
						
						DownloadManager dm = (DownloadManager)_ds;
						
						boolean x = PlatformTorrentUtils.getHasBeenOpened( dm );
						
						PlatformTorrentUtils.setHasBeenOpened(dm, !x );
					}
				}
			}
		});
		
		initializeAsGraphic(WIDTH);
	}

	// @see org.gudy.azureus2.plugins.ui.tables.TableCellAddedListener#cellAdded(org.gudy.azureus2.plugins.ui.tables.TableCell)
	public void cellAdded(TableCell cell) {
		cell.setMarginWidth(0);
		cell.setMarginHeight(0);
	}

	// @see org.gudy.azureus2.plugins.ui.tables.TableCellRefreshListener#refresh(org.gudy.azureus2.plugins.ui.tables.TableCell)
	public void refresh(TableCell cell) {
		DownloadManager dm = (DownloadManager) cell.getDataSource();
		if (dm == null) {
			return;
		}
		int sortVal;
		boolean complete = dm.getAssumedComplete();
		boolean hasBeenOpened = false;
		if (complete) {
			hasBeenOpened = PlatformTorrentUtils.getHasBeenOpened(dm);
			sortVal = hasBeenOpened ? 1 : 0;
		} else {
			sortVal = isSortAscending()?2:-1;
		}

		if (!cell.setSortValue(sortVal) && cell.isValid()) {
			if(complete) {
				return;
			}
		}
		if (!cell.isShown()) {
			return;
		}
		
		if (complete) {
			cell.setGraphic(hasBeenOpened ? graphicUnCheck : graphicCheck);
		} else {
			if(dm.getState() == DownloadManager.STATE_DOWNLOADING) {
				int i = TableCellRefresher.getRefreshIndex(1, graphicsProgress.length);
				cell.setGraphic(graphicsProgress[i]);
				TableCellRefresher.addCell(this, cell);
			} else {
				cell.setGraphic(null);
			}
			
		}
	}

	// @see org.gudy.azureus2.plugins.ui.tables.TableCellMouseListener#cellMouseTrigger(org.gudy.azureus2.plugins.ui.tables.TableCellMouseEvent)
	public void cellMouseTrigger(TableCellMouseEvent event) {
		if (event.eventType == TableRowMouseEvent.EVENT_MOUSEUP && event.button == 1) {
			DownloadManager dm = (DownloadManager) event.cell.getDataSource();
			boolean complete = dm.getAssumedComplete();
			if(!complete) return;
			boolean hasBeenOpened = !PlatformTorrentUtils.getHasBeenOpened(dm);
			PlatformTorrentUtils.setHasBeenOpened(dm, hasBeenOpened);
			event.cell.setGraphic(hasBeenOpened ? graphicUnCheck : graphicCheck);
			event.cell.invalidate();
		}
	}
}
