/** * 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.game; import java.util.List; import net.sf.freecol.client.gui.MapViewer; import net.sf.freecol.client.gui.MapViewer.MapViewerListener; import net.sf.freecol.client.gui.action.BuildColonyAction; import net.sf.freecol.client.gui.action.FreeColAction; import net.sf.freecol.client.gui.i18n.Messages; import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.Tile; import net.sf.freecol.common.model.Unit; import org.freecolandroid.R; import org.freecolandroid.debug.FCLog; import org.freecolandroid.repackaged.javax.swing.ImageIcon; import org.freecolandroid.ui.FreeColFragment; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class GameFragment extends FreeColFragment implements MapViewerListener, OnTouchListener { private final static String ACTION_PAN_CAMERA = "pan_camera"; private final static String ACTION_MOVE_UNIT = "move_unit"; private String mSelectedAction = ACTION_PAN_CAMERA; private ImageView mUnitImage; private TextView mUnitName; private TextView mUnitMoves; private ImageView mPrevUnit; private ImageView mNextUnit; private Tile mDragStart; private void buildColony() { AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() { @Override public void run() { // Make use of BuildColonyAction FreeColAction action = mClient.getActionManager().getFreeColAction( BuildColonyAction.id); action.update(); if (action.isEnabled()) { action.actionPerformed(null); } } }); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); GameCanvas canvas = (GameCanvas) getView().findViewById(R.id.canvas); canvas.init(mClient); canvas.setOnTouchListener(this); mUnitImage = (ImageView) getView().findViewById(R.id.unit_image); mUnitName = (TextView) getView().findViewById(R.id.unit_name); mUnitMoves = (TextView) getView().findViewById(R.id.unit_moves); mPrevUnit = (ImageView) getView().findViewById(R.id.prev_unit); mPrevUnit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Unit currentUnit = mClient.getGUI().getMapViewer().getActiveUnit(); List<Unit> units = mClient.getMyPlayer().getUnits(); int currentIndex = units.indexOf(currentUnit); if (currentIndex > 0) { mClient.getGUI().getMapViewer().setActiveUnit(units.get(currentIndex - 1)); } } }); mNextUnit = (ImageView) getView().findViewById(R.id.next_unit); mNextUnit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Unit currentUnit = mClient.getGUI().getMapViewer().getActiveUnit(); List<Unit> units = mClient.getMyPlayer().getUnits(); int currentIndex = units.indexOf(currentUnit); if (currentIndex < units.size() - 1) { mClient.getGUI().getMapViewer().setActiveUnit(units.get(currentIndex + 1)); } } }); Unit activeUnit = mClient.getGUI().getMapViewer().getActiveUnit(); if (activeUnit != null) { onUnitSelected(activeUnit); } mClient.getGUI().getMapViewer().addListener(this); } @Override public void onAttach(Activity activity) { super.onAttach(activity); activity.getActionBar().show(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_actions, menu); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.frag_game, container, false); } @Override public void onResume() { super.onResume(); getActivity().getActionBar().setTitle(R.string.app_name); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_move) { Toast.makeText(getActivity(), "Select target", Toast.LENGTH_SHORT).show(); mSelectedAction = ACTION_MOVE_UNIT; return true; } else if (id == R.id.action_end_turn) { mClient.getInGameController().endTurn(); } else if (id == R.id.action_build_colony) { buildColony(); } return false; } @Override public void onTileSelected(Tile tile) { // TODO Auto-generated method stub } @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); MapViewer map = mClient.getGUI().getMapViewer(); if (action == MotionEvent.ACTION_DOWN) { mDragStart = map.convertToMapTile((int) event.getX(), (int) event.getY()); } else if (action == MotionEvent.ACTION_UP) { Tile tile = null; try { tile = map.convertToMapTile((int) event.getX(), (int) event.getY()); } catch (Exception e) { FCLog.log("Error getting tile", e); } if (tile != null) { if (ACTION_PAN_CAMERA.equals(mSelectedAction)) { if (tile == mDragStart) { // No dragging map.setFocus(tile); // Check if there is a colony in the tile Colony colony = tile.getColony(); if (colony != null) { mClient.getGUI().showColonyPanel(colony); } // Check if there is a unit that can move this turn Unit unit = tile.getMovableUnit(); if (unit == null) { // Otherwise select the first available unit unit = tile.getFirstUnit(); } if (unit != null) { mClient.getGUI().setActiveUnit(unit); } } else if (mDragStart != null) { Unit unit = map.getActiveUnit(); if (unit != null) { FCLog.log("Drag from " + mDragStart + " to " + tile); if (unit.getTile() != mDragStart) { // Not moving the selected unit, check if there // is a movable unit in the start tile unit = mDragStart.getMovableUnit(); } if (unit != null) { // Move the unit: mClient.getInGameController().setDestination(unit, tile); if (mClient.currentPlayerIsMyPlayer()) { mClient.getInGameController().moveToDestination(unit); } } } } } else if (ACTION_MOVE_UNIT.equals(mSelectedAction)) { // Move the unit: Unit unit = map.getActiveUnit(); mClient.getInGameController().setDestination(unit, tile); if (mClient.currentPlayerIsMyPlayer()) { mClient.getInGameController().moveToDestination(unit); } } } mSelectedAction = ACTION_PAN_CAMERA; } return true; } @Override public void onUnitSelected(Unit unit) { if (unit != null) { mUnitName.setText(Messages.message(Messages.getLabel(unit))); mUnitMoves.setText(Messages.message("moves") + " " + unit.getMovesAsString()); ImageIcon unitIcon = mClient.getGUI().getImageLibrary().getUnitImageIcon(unit); mUnitImage.setImageBitmap(unitIcon.getImage().getBitmap()); // Enable or disable next/previous unit buttons List<Unit> units = mClient.getMyPlayer().getUnits(); int currentIndex = units.indexOf(unit); if (currentIndex == 0) { mPrevUnit.setVisibility(View.GONE); } else { mPrevUnit.setVisibility(View.VISIBLE); } if (currentIndex == units.size() - 1) { mNextUnit.setVisibility(View.GONE); } else { mNextUnit.setVisibility(View.VISIBLE); } } } }