/** * Copyright (C) 2012 The FreeCol-Android Team * * This file is part of FreeCol-Android. * * FreeCol-Android 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. * * FreeCol 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 FreeCol-Android. If not, see <http://www.gnu.org/licenses/>. */ package org.freecolandroid.ui.adapters; import java.util.Collections; import java.util.List; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.common.model.Ability; import net.sf.freecol.common.model.AbstractGoods; import net.sf.freecol.common.model.Building; import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.ProductionInfo; import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.resources.ResourceManager; import org.freecolandroid.R; import org.freecolandroid.ui.colony.DragHolder; import org.freecolandroid.ui.colony.OnColonyUpdatedListener; import android.content.ClipData; import android.content.Context; import android.graphics.Bitmap; import android.view.DragEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnDragListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class BuildingsListAdapter extends BaseAdapter implements OnDragListener, OnTouchListener { private final List<Building> mBuildings; private final Context mContext; private final FreeColClient mClient; private OnColonyUpdatedListener mListener; private final ImageView mDragShadowView; public BuildingsListAdapter(Context context, FreeColClient client, Colony colony, ImageView dragShadowView) { mBuildings = colony.getBuildings(); mContext = context; mClient = client; mDragShadowView = dragShadowView; Collections.sort(mBuildings); } @Override public int getCount() { return mBuildings.size(); } @Override public Object getItem(int position) { return mBuildings.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item_building, parent, false); convertView.setOnDragListener(this); } Building building = mBuildings.get(position); convertView.setTag(building); ImageView buildingImage = (ImageView) convertView.findViewById(R.id.building_image); buildingImage.setImageBitmap(ResourceManager .getImage(building.getType().getId() + ".image").getBitmap()); // Set building production info TextView prodText = (TextView) convertView.findViewById(R.id.building_production); ImageView prodIcon = (ImageView) convertView.findViewById(R.id.production_icon); ProductionInfo info = building.getProductionInfo(); if (info == null || info.getProduction().isEmpty()) { prodText.setVisibility(View.GONE); prodIcon.setVisibility(View.GONE); } else { prodText.setVisibility(View.VISIBLE); prodIcon.setVisibility(View.VISIBLE); AbstractGoods output = info.getProduction().get(0); if (output.getAmount() > 0) { if (building.hasAbility(Ability.AVOID_EXCESS_PRODUCTION)) { int stored = building.getColony().getGoodsCount(output.getType()); int capacity = building.getColony().getWarehouseCapacity(); if (output.getAmount() + stored > capacity) { output = new AbstractGoods(output.getType(), capacity - stored); } } Bitmap icon = mClient.getGUI().getImageLibrary() .getGoodsImageIcon(output.getType()).getImage().getBitmap(); prodIcon.setImageBitmap(icon); prodText.setText("x " + Integer.toString(output.getAmount())); } } // Set list of working units LinearLayout unitsInBuilding = (LinearLayout) convertView .findViewById(R.id.units_in_building); unitsInBuilding.removeAllViews(); for (Unit unit : building.getUnitList()) { Bitmap unitIcon = mClient.getGUI().getImageLibrary().getUnitImageIcon(unit).getImage() .getBitmap(); ImageView unitView = new ImageView(mContext); unitView.setOnTouchListener(this); unitView.setTag(unit); unitView.setLayoutParams(new LayoutParams(40, 40)); unitView.setImageBitmap(unitIcon); unitsInBuilding.addView(unitView); } return convertView; } @Override public boolean onDrag(View v, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: DragHolder holder = (DragHolder) event.getLocalState(); return holder.unit != null; case DragEvent.ACTION_DROP: { DragHolder dragHolder = (DragHolder) event.getLocalState(); Unit unit = dragHolder.unit; Building targetBuilding = (Building) v.getTag(); if (dragHolder.origin != targetBuilding) { assignUnitToBuilding(unit, targetBuilding); mListener.onUnitLocationUpdated(unit, targetBuilding); } } break; } return true; } @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { Unit unit = (Unit) v.getTag(); mDragShadowView.setImageBitmap(mClient.getGUI().getImageLibrary() .getUnitImageIcon(unit).getImage().getBitmap()); DragHolder dragHolder = new DragHolder(unit, unit.getWorkBuilding()); v.startDrag(ClipData.newPlainText("Drag", "Drag"), new View.DragShadowBuilder( mDragShadowView), dragHolder, 0); } return true; } private void assignUnitToBuilding(Unit unit, Building building) { mClient.getInGameController().work(unit, building); } public void setOnUnitLocationUpdatedListener(OnColonyUpdatedListener listener) { mListener = listener; } }