public void showAction(PlayerLocation location, Action action)
			throws IOException {
		if (!(action.getType() instanceof StandardActionType)) {
			showActionDefault(location, action);
			return;
		}

		switch ((StandardActionType) action.getType()) {
		case DEAL:
			PlayerLocation.Relation zhuangRelation = contextView.getMyLocation()
					.getRelationOf(contextView.getZhuangLocation());
			StringBuilder showStr = new StringBuilder();
			showStr.append(DEAL_DONE.str());
			showStr.append(' ').append(ZHUANG.str());
			showStr.append(':').append(str(zhuangRelation)).append(str(contextView.getZhuangLocation()));
			showStr.append(' ').append(str(contextView.getTableView().getPlayerName(contextView.getZhuangLocation())));
			showActionStr(location, showStr);
			break;
		case CHI:
		case PENG:
		case ZHIGANG:
			ActionAndLocation discardAction = contextView.getDoneActions()
					.get(contextView.getDoneActions().size() - 2);
			Set<Tile> groupTiles = mergedSet(action.getTiles(),
					discardAction.getAction().getTiles());
			showActionStr(location,
					getDefaultActionStr(action.getType(), groupTiles));
			break;
		case BUGANG:
			showActionStr(location, getDefaultActionStr(action.getType(),
					Tile.allOfType(action.getTile().type())));
			break;
		case ANGANG:
			showActionStr(location,
					getDefaultActionStr(action.getType(), null));
			break;
		case DISCARD_WITH_TING:
			StringBuilder str = getDefaultActionStr(DISCARD, action.getTiles());
			str.append(" ");
			str.append(TING_START_STR);
			str.append(TING.str());
			str.append(TING_END_STR);
			showActionStr(location, str);
			break;
		case WIN:
			showWinAction(location, action);
			break;
		default:
			showActionDefault(location, action);
			return;
		}

	}