package com.gaubert.test;

import java.util.ArrayList;
import java.util.List;

import com.trolltech.qt.core.QAbstractListModel;
import com.trolltech.qt.core.QModelIndex;
import com.trolltech.qt.core.Qt.DropAction;
import com.trolltech.qt.core.Qt.DropActions;
import com.trolltech.qt.core.Qt.ItemDataRole;
import com.trolltech.qt.core.Qt.ItemFlag;
import com.trolltech.qt.core.Qt.ItemFlags;

public class DraggableListModel extends QAbstractListModel {

	private List<String> internalList = new ArrayList<String>();	

	public DraggableListModel(){
		super();
		for(int i=0;i<15;++i){
			internalList.add("Chaîne n°"+i);
		}
	}
	
	@Override
	public int rowCount(QModelIndex arg0) {
		int result = internalList.size();
		return result;
	}
	
	@Override
	public Object data(QModelIndex index, int role) {
		Object result = null;
		switch(role){
			case ItemDataRole.DisplayRole :
				result = internalList.get(index.row());
				break;
			default :
				result = null;
		}
		return result;
	}

	@Override
	public boolean setData(QModelIndex index, Object value, int role) {
		switch(role){
			case ItemDataRole.DisplayRole :
				String castedValue = (String) value;
				internalList.set(index.row(), castedValue);
				break;
		}
		
		return true;

	}

	@Override
	public boolean removeRows(int row, int count, QModelIndex parent) {
		boolean result = true;
		beginRemoveRows(parent, row, row + count - 1);
		
		if(parent==null){
			for(int i = row;i<row+count;++i){
				internalList.remove(i);
			}
			result = true;
		} else {
			result = false;
		}
		
		endRemoveRows();
		return result;
	}

	@Override
	public boolean insertRows(int row, int count, QModelIndex parent) {
		boolean result = true;
		beginInsertRows(parent, row, row + count - 1);
		
		if(parent==null){
			for(int i = row;i<row+count;++i){
				internalList.add(i, "");
			}
			result = true;
		} else {
			result = false;
		}
		
		endInsertRows();
		return result;
	}
	
	@Override
	public DropActions supportedDropActions() {
		DropAction[] actions = {
//				DropAction.CopyAction,
				DropAction.MoveAction};
		DropActions result = new DropActions(actions);
		return result;
	}

	@Override
	public ItemFlags flags(QModelIndex index) {
		ItemFlags result = null;

		ItemFlag[] flags = {
				ItemFlag.ItemIsDragEnabled,
//				ItemFlag.ItemIsDropEnabled,
				ItemFlag.ItemIsSelectable,
				ItemFlag.ItemIsEnabled};
		result = new ItemFlags(flags);

		return result;
	}

}
