package org.freecolandroid.ui.colony;
import net.sf.freecol.client.FreeColClient;
import net.sf.freecol.client.gui.ImageLibrary;
import net.sf.freecol.client.gui.i18n.Messages;
import net.sf.freecol.common.model.Goods;
import net.sf.freecol.common.model.StringTemplate;
import net.sf.freecol.common.model.Unit;
import org.freecolandroid.R;
import android.content.ClipData;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.AttributeSet;
import android.view.DragEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
public class CargoView extends FrameLayout {
private class CargoListAdapter extends BaseAdapter {
@Override
public int getCount() {
return mCarrier == null ? 0 : mCarrier.getGoodsCount() + mCarrier.getUnitCount();
}
@Override
public Object getItem(int position) {
throw new UnsupportedOperationException("Not implemented");
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getViewTypeCount() {
if (mCarrier != null && mCarrier.getGoodsCount() > 0 && mCarrier.getUnitCount() > 0) {
return 2;
} else {
return 1;
}
}
@Override
public int getItemViewType(int position) {
if (mCarrier == null) {
return 0;
} else if (getViewTypeCount() == 1 || position < mCarrier.getUnitCount()) {
return 0;
} else {
return 1;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageLibrary lib = mClient.getGUI().getImageLibrary();
if (position < mCarrier.getUnitCount()) {
// Create or populate a unit view
ImageView unitView;
if (convertView != null) {
unitView = (ImageView) convertView;
} else {
unitView = new ImageView(getContext());
convertView = unitView;
}
Bitmap icon = lib.getUnitImageIcon(mCarrier.getUnitList().get(position)).getImage()
.getBitmap();
unitView.setImageBitmap(icon);
} else {
// Create or populate a goods view
position -= mCarrier.getUnitCount();
final ImageView goodsView;
if (convertView != null) {
goodsView = (ImageView) convertView;
} else {
goodsView = new ImageView(getContext());
convertView = goodsView;
}
final Goods goods = mCarrier.getGoodsList().get(position);
Bitmap icon = lib.getGoodsImage(goods.getType()).getBitmap();
goodsView.setImageBitmap(icon);
// Setup drag & drop
goodsView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
DragHolder dragHolder = new DragHolder(goods, mCarrier);
v.startDrag(ClipData.newPlainText("Drag", "Drag"),
new View.DragShadowBuilder(goodsView), dragHolder, 0);
}
return true;
}
});
}
return convertView;
}
}
private Unit mCarrier;
private CargoListAdapter mAdapter;
private FreeColClient mClient;
private OnColonyUpdatedListener mListener;
public CargoView(Context context) {
super(context);
}
public CargoView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CargoView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
LayoutInflater inf = LayoutInflater.from(getContext());
inf.inflate(R.layout.view_cargo, this, true);
mAdapter = new CargoListAdapter();
GridView grid = (GridView) findViewById(R.id.grid);
grid.setAdapter(mAdapter);
}
public void init(FreeColClient client, OnColonyUpdatedListener listener) {
mClient = client;
mListener = listener;
}
public void setCarrier(Unit carrier) {
if (carrier != null && !carrier.isCarrier()) {
throw new IllegalArgumentException("Unit must be a carrier");
}
mCarrier = carrier;
update();
}
public void update() {
TextView title = (TextView) findViewById(R.id.title);
if (mCarrier == null) {
// Show empty view
title.setText(Messages.message("cargoOnCarrier"));
} else {
// Update the title
int spaceLeft = mCarrier.getSpaceLeft();
StringTemplate t = StringTemplate.template("cargoOnCarrierLong")
.addStringTemplate("%name%", Messages.getLabel(mCarrier))
.addAmount("%space%", spaceLeft);
title.setText(Messages.message(t));
}
mAdapter.notifyDataSetChanged();
}
@Override
public boolean onDragEvent(DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED: {
DragHolder holder = (DragHolder) event.getLocalState();
return holder.goods != null;
}
case DragEvent.ACTION_DROP: {
DragHolder holder = (DragHolder) event.getLocalState();
int loadableAmount = mCarrier.getLoadableAmount(holder.goods.getType());
loadableAmount = Math.min(loadableAmount, holder.goods.getAmount());
if (loadableAmount > 0) {
Goods goodsToAdd = new Goods(holder.goods.getGame(), holder.goods.getLocation(),
holder.goods.getType(), loadableAmount);
holder.goods.setAmount(holder.goods.getAmount() - loadableAmount);
mClient.getInGameController().loadCargo(goodsToAdd, mCarrier);
mListener.onGoodsMoved();
}
}
break;
default:
break;
}
return true;
}
}