package me.rkfg.ns2gather.client; import static ru.ppsrk.gwt.client.ClientUtils.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import me.rkfg.ns2gather.dto.GatherState; import me.rkfg.ns2gather.dto.PlayerDTO; import me.rkfg.ns2gather.dto.ServerDTO; import me.rkfg.ns2gather.dto.Side; import me.rkfg.ns2gather.dto.VoteResultDTO; import me.rkfg.ns2gather.dto.VoteType; import ru.ppsrk.gwt.client.AlertRuntimeException; import ru.ppsrk.gwt.client.ClientUtils.MyAsyncCallback; import ru.ppsrk.gwt.client.ResultPopupPanel.ResultPopupPanelCallback; import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.cellview.client.CellList; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.SingleSelectionModel; public class VoteResultPanel extends DialogBox { private class ParticipantCell extends AbstractCell<PlayerDTO> { String baseClass = ""; public ParticipantCell(Side side) { switch (side) { case NONE: case MERC: baseClass = "regular"; break; case ALIENS: baseClass = "aliens"; break; case MARINES: baseClass = "marines"; break; } } @Override public void render(Context context, PlayerDTO value, SafeHtmlBuilder sb) { String playerClass = ""; if (comms.contains(value.getId())) { playerClass = "participant captain"; } else { playerClass = "participant " + baseClass; } sb.appendHtmlConstant("<span class=\"" + playerClass + "\" title=\"" + SafeHtmlUtils.fromString(value.getName()).asString() + "\">"); value.buildInfo(sb); if (value.getSide() == Side.MERC) { sb.appendEscaped(" [MERC]"); } sb.appendHtmlConstant("</span>"); } }; private SidePick sidePickPanel = new SidePick(); private final SimplePanel rootPanel = new SimplePanel(); private final FlexTable flexTable = new FlexTable(); private final Label label_commA = new Label("Командир А"); private final Label label_comm1 = new Label("comm1"); private final Label label_commB = new Label("Командир Б"); private final Label label_comm2 = new Label("comm2"); private final Label label_3 = new Label("Карта"); private final Label label_maps = new Label("maps"); private final Label label_1 = new Label("Сервер"); private final Label label_server = new Label("server"); private final HTML html_connect = new HTML("<a href=\"steam://connect/\">Подключиться</a>", true); private final Button button_close = new Button("Закрыть"); private final HorizontalPanel horizontalPanel = new HorizontalPanel(); private final Label label_2 = new Label("Вы сможете снова открыть это окно, щёлкнув по статусу gather'а."); private final HorizontalPanel horizontalPanel_buttons = new HorizontalPanel(); private final Button button_mute = new Button("<img src=\"icons/mute.png\">"); private final Label label_4 = new Label("Список участников:"); private NS2GServiceAsync ns2gService = NS2GServiceAsync.Util.getInstance(); private final ListDataProvider<PlayerDTO> dataProvider_marines = new ListDataProvider<PlayerDTO>(); private final CellList<PlayerDTO> cellList_marines = new CellList<PlayerDTO>(new ParticipantCell(Side.MARINES)); private final ListDataProvider<PlayerDTO> dataProvider_aliens = new ListDataProvider<PlayerDTO>(); private final CellList<PlayerDTO> cellList_aliens = new CellList<PlayerDTO>(new ParticipantCell(Side.ALIENS)); private final ListDataProvider<PlayerDTO> dataProvider_nonDistributed = new ListDataProvider<PlayerDTO>(); private final SingleSelectionModel<PlayerDTO> selectionModel_nonDistributed = new SingleSelectionModel<PlayerDTO>(); private final CellList<PlayerDTO> cellList_nonDistributed = new CellList<PlayerDTO>(new ParticipantCell(Side.NONE)); private final Button button_pick = new Button("Забрать"); private List<Long> comms = new ArrayList<Long>(); private final FlexTable flexTable_sides = new FlexTable(); private final ScrollPanel scrollPanel_marines = new ScrollPanel(); private final ScrollPanel scrollPanel_aliens = new ScrollPanel(); private final Label lblMarines = new Label("Marines"); private final Label lblAliens = new Label("Aliens"); private final ScrollPanel scrollPanel_nonDistributed = new ScrollPanel(); private final Label label_5 = new Label("Участники"); private Long myId = null; private final Label label_password = new Label("Пароль"); public VoteResultPanel() { setModal(false); setText("Результаты голосования"); flexTable.setCellPadding(5); setWidget(rootPanel); rootPanel.setWidget(flexTable); flexTable.setSize("100%", "100%"); label_commA.setWordWrap(false); flexTable.setWidget(0, 0, label_commA); label_comm1.setWordWrap(false); flexTable.setWidget(0, 1, label_comm1); flexTable.setWidget(1, 0, label_commB); label_comm2.setWordWrap(false); flexTable.setWidget(1, 1, label_comm2); flexTable.setWidget(2, 0, label_3); flexTable.setWidget(2, 1, label_maps); flexTable.setWidget(3, 0, label_1); flexTable.setWidget(3, 1, label_server); flexTable.setWidget(4, 0, html_connect); flexTable.getCellFormatter().setHorizontalAlignment(4, 0, HasHorizontalAlignment.ALIGN_CENTER); label_password.addStyleName("password"); flexTable.setWidget(5, 0, label_password); flexTable.setWidget(6, 0, label_4); flexTable.setWidget(7, 0, flexTable_sides); flexTable_sides.setSize("100%", "100%"); flexTable_sides.setWidget(0, 0, lblMarines); flexTable_sides.setWidget(0, 1, lblAliens); scrollPanel_marines.setStyleName("border-bs"); flexTable_sides.setWidget(1, 0, scrollPanel_marines); flexTable_sides.getCellFormatter().setHeight(1, 0, "150px"); flexTable_sides.getCellFormatter().setWidth(1, 0, "50%"); scrollPanel_marines.setSize("100%", "100%"); scrollPanel_marines.setWidget(cellList_marines); cellList_marines.setSize("100%", "100%"); dataProvider_marines.addDataDisplay(cellList_marines); scrollPanel_aliens.setStyleName("border-bs"); flexTable_sides.setWidget(1, 1, scrollPanel_aliens); flexTable_sides.getCellFormatter().setHeight(1, 1, "150px"); scrollPanel_aliens.setSize("100%", "100%"); flexTable_sides.getCellFormatter().setWidth(1, 1, "50%"); scrollPanel_aliens.setWidget(cellList_aliens); cellList_aliens.setSize("100%", "100%"); dataProvider_aliens.addDataDisplay(cellList_aliens); flexTable_sides.getCellFormatter().setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_CENTER); flexTable_sides.getCellFormatter().setHorizontalAlignment(0, 1, HasHorizontalAlignment.ALIGN_CENTER); flexTable_sides.setWidget(2, 0, label_5); scrollPanel_nonDistributed.setStyleName("border-bs"); flexTable_sides.setWidget(3, 0, scrollPanel_nonDistributed); flexTable_sides.getCellFormatter().setWidth(3, 0, "100%"); flexTable_sides.getCellFormatter().setHeight(3, 0, "200px"); scrollPanel_nonDistributed.setSize("100%", "100%"); dataProvider_nonDistributed.addDataDisplay(cellList_nonDistributed); scrollPanel_nonDistributed.setWidget(cellList_nonDistributed); cellList_nonDistributed.setSelectionModel(selectionModel_nonDistributed); flexTable_sides.getFlexCellFormatter().setColSpan(3, 0, 2); flexTable_sides.getFlexCellFormatter().setColSpan(2, 0, 2); flexTable_sides.getCellFormatter().setHorizontalAlignment(2, 0, HasHorizontalAlignment.ALIGN_CENTER); button_pick.addClickHandler(new Button_pickClickHandler()); button_pick.setEnabled(false); flexTable.setWidget(8, 0, button_pick); flexTable.setWidget(9, 0, horizontalPanel); horizontalPanel.setSize("100%", "50px"); horizontalPanel.add(label_2); horizontalPanel.setCellVerticalAlignment(label_2, HasVerticalAlignment.ALIGN_MIDDLE); flexTable.getCellFormatter().setWidth(9, 0, ""); flexTable.setWidget(10, 0, horizontalPanel_buttons); horizontalPanel_buttons.setWidth("100%"); horizontalPanel_buttons.add(button_close); horizontalPanel_buttons.setCellVerticalAlignment(button_close, HasVerticalAlignment.ALIGN_MIDDLE); horizontalPanel_buttons.setCellHorizontalAlignment(button_close, HasHorizontalAlignment.ALIGN_CENTER); horizontalPanel_buttons.add(button_mute); horizontalPanel_buttons.setCellWidth(button_mute, "48px"); horizontalPanel_buttons.setCellHorizontalAlignment(button_mute, HasHorizontalAlignment.ALIGN_RIGHT); button_close.addClickHandler(new Button_closeClickHandler()); flexTable.getFlexCellFormatter().setColSpan(9, 0, 2); html_connect.setStyleName("gwt-Label"); flexTable.getFlexCellFormatter().setColSpan(10, 0, 2); flexTable.getFlexCellFormatter().setColSpan(6, 0, 2); flexTable.getCellFormatter().setHorizontalAlignment(6, 0, HasHorizontalAlignment.ALIGN_CENTER); flexTable.getFlexCellFormatter().setColSpan(8, 0, 2); flexTable.getCellFormatter().setHorizontalAlignment(8, 0, HasHorizontalAlignment.ALIGN_CENTER); flexTable.getFlexCellFormatter().setColSpan(7, 0, 2); flexTable.getFlexCellFormatter().setColSpan(4, 0, 2); flexTable.getFlexCellFormatter().setColSpan(5, 0, 2); flexTable.getCellFormatter().setHorizontalAlignment(5, 0, HasHorizontalAlignment.ALIGN_CENTER); } public void setId(Long id) { myId = id; } public void fillFields(List<VoteResultDTO> result) { List<Label> labels = Arrays.asList(label_comm1, label_comm2, label_maps, label_server); int i = 0; for (Label label : labels) { VoteResultDTO voteResultDTO = result.get(i++); String name; if (voteResultDTO.getTarget() instanceof PlayerDTO) { name = ((PlayerDTO) voteResultDTO.getTarget()).getEffectiveName(); } else { name = voteResultDTO.getTarget().getName(); } label.setText(name + " [" + voteResultDTO.getVoteCount() + "]"); } setSteamConnectUrl(result.get(i - 1)); setPassword(result.get(i - 1)); comms.clear(); comms.add(result.get(0).getTarget().getId()); comms.add(result.get(1).getTarget().getId()); } private void setPassword(VoteResultDTO voteResultDTO) { ServerDTO serverDTO = (ServerDTO) voteResultDTO.getTarget(); String password = serverDTO.getPassword(); if (password != null && !password.isEmpty()) { label_password.setText("Пароль: " + password); } else { label_password.setText("Пароля нет"); } } private void setSteamConnectUrl(VoteResultDTO voteResultDTO) { if (voteResultDTO.getType() != VoteType.SERVER) { throw new AlertRuntimeException("Неверный тип результата голосования, ожидался голос за сервер, получено " + voteResultDTO.getType()); } ServerDTO item = (ServerDTO) voteResultDTO.getTarget(); html_connect.setHTML("<a href=\"steam://connect/" + item.getIp() + (!item.getPassword().isEmpty() ? "/" + item.getPassword() : "") + "\">Подключиться</a>"); } private class Button_closeClickHandler implements ClickHandler { public void onClick(ClickEvent event) { button_mute.click(); hide(); } } public void center(final GatherState gatherState) { setAnimationEnabled(true); ns2gService.getVoteResults(new MyAsyncCallback<List<VoteResultDTO>>() { @Override public void onSuccess(List<VoteResultDTO> result) { fillFields(result); loadParticipants(); VoteResultPanel.super.center(); if (gatherState == GatherState.SIDEPICK && comms.get(0).equals(myId)) { openPopupPanel(sidePickPanel, new ResultPopupPanelCallback<Side>() { @Override public void done(Side result) { ns2gService.pickSide(result, new MyAsyncCallback<Void>() { @Override public void onSuccess(Void result) { } }); } }); } } }); } public void loadParticipants() { ns2gService.getGatherParticipantsList(new MyAsyncCallback<List<PlayerDTO>>() { @Override public void onSuccess(List<PlayerDTO> result) { dataProvider_aliens.getList().clear(); dataProvider_marines.getList().clear(); dataProvider_nonDistributed.getList().clear(); for (PlayerDTO participant : result) { switch (participant.getSide()) { case ALIENS: dataProvider_aliens.getList().add(participant); break; case MARINES: dataProvider_marines.getList().add(participant); Long pId = participant.getId(); if (pId.equals(comms.get(0)) || pId.equals(comms.get(1))) { setMarineSide(pId); } break; case NONE: case MERC: dataProvider_nonDistributed.getList().add(participant); break; } } button_pick.setEnabled(dataProvider_aliens.getList().size() == dataProvider_marines.getList().size() && myId.equals(comms.get(1)) || dataProvider_aliens.getList().size() != dataProvider_marines.getList().size() && myId.equals(comms.get(0))); } }); } public Button getButton_mute() { return button_mute; } public void enablePickButton(boolean enabled) { button_pick.setEnabled(enabled); } public void setMarineSide(Long commId) { if (commId.equals(comms.get(0))) { label_commA.setText("Командир Marines"); label_commB.setText("Командир Aliens"); } else { label_commB.setText("Командир Marines"); label_commA.setText("Командир Aliens"); } } private class Button_pickClickHandler implements ClickHandler { public void onClick(ClickEvent event) { PlayerDTO selected = trySelectionModelValue(selectionModel_nonDistributed, "Выберите участника.", PlayerDTO.class); ns2gService.pickPlayer(selected.getId(), new MyAsyncCallback<Void>() { @Override public void onSuccess(Void result) { } }); } } }