package com.giftoftheembalmer.gotefarm.client; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.event.dom.client.KeyPressHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DeferredCommand; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.HTMLTable.CellFormatter; import java.util.ArrayList; import java.util.List; public class EventEditor extends Composite implements ChangeHandler { Admin admin; JSEventTemplate et; VerticalPanel vpanel = new VerticalPanel(); TextBox name = new TextBox(); TextBox size = new TextBox(); TextBox minlevel = new TextBox(); ListBox instances = new ListBox(); TextBox newinst = new TextBox(); ListBox bosses = new ListBox(true); TextBox newboss = new TextBox(); ListBox roles = new ListBox(); TextBox newrole = new TextBox(); FlexTable roleft = new FlexTable(); ListBox badges = new ListBox(); TextBox newbadge = new TextBox(); FlexTable badgeft = new FlexTable(); final String NEW_EVENT = "New Event"; final String NEW_INSTANCE = "New Instance"; final String NEW_BOSS = "New Boss"; final String NEW_ROLE = "New Role"; final String NEW_BADGE = "New Badge"; final String SELECT_A_ROLE = "Select a role"; final String SELECT_A_BADGE = "Select a badge"; final String ALL_ROLES = "All roles"; final String MAX_LEVEL = "80"; public EventEditor(final Admin admin, JSEventTemplate et) { this.admin = admin; this.et = et; vpanel.setWidth("100%"); vpanel.setHeight("100%"); final Label errmsg = new Label(); errmsg.addStyleName(errmsg.getStylePrimaryName() + "-error"); errmsg.addStyleName(errmsg.getStylePrimaryName() + "-bottom"); FlexTable grid = new FlexTable(); grid.setWidth("100%"); CellFormatter cf = grid.getCellFormatter(); // right align field labels cf.setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_RIGHT); cf.setHorizontalAlignment(1, 0, HasHorizontalAlignment.ALIGN_RIGHT); cf.setHorizontalAlignment(2, 0, HasHorizontalAlignment.ALIGN_RIGHT); cf.setHorizontalAlignment(3, 0, HasHorizontalAlignment.ALIGN_RIGHT); cf.setHorizontalAlignment(4, 0, HasHorizontalAlignment.ALIGN_RIGHT); cf.setHorizontalAlignment(5, 0, HasHorizontalAlignment.ALIGN_RIGHT); cf.setHorizontalAlignment(7, 0, HasHorizontalAlignment.ALIGN_RIGHT); grid.setText(0, 0, "Event Name:"); grid.setText(1, 0, "Raid Size:"); grid.setText(2, 0, "Minimum Level:"); grid.setText(3, 0, "Instance:"); grid.setText(4, 0, "Bosses:"); grid.setText(5, 0, "Roles:"); grid.setText(7, 0, "Badges:"); size.setVisibleLength(2); minlevel.setVisibleLength(2); size.addChangeHandler(new ChangeHandler() { public void onChange(ChangeEvent event) { try { int sizen = Integer.parseInt(size.getText()); if (sizen < 0) { size.setText("0"); } } catch (NumberFormatException e) { size.setText("25"); } updateRoleTotals(); } }); minlevel.addChangeHandler(new ChangeHandler() { public void onChange(ChangeEvent event) { try { int minleveln = Integer.parseInt(minlevel.getText()); if (minleveln < 0) { size.setText("0"); } } catch (NumberFormatException e) { size.setText(MAX_LEVEL); } } }); instances.setWidth("100%"); instances.setVisibleItemCount(1); roles.setWidth("100%"); roles.setVisibleItemCount(1); badges.setWidth("100%"); badges.setVisibleItemCount(1); grid.setWidget(0, 1, name); grid.setWidget(1, 1, size); grid.setWidget(2, 1, minlevel); grid.setWidget(3, 1, instances); GoteFarm.goteService.getInstances(admin.current_guild.key, new AsyncCallback<List<JSInstance>>() { public void onSuccess(List<JSInstance> results) { int sel = 0; for (JSInstance i : results) { instances.addItem(i.name, i.key); if (EventEditor.this.et != null && i.key.equals(EventEditor.this.et.instance_key)) { sel = instances.getItemCount() - 1; } } instances.setSelectedIndex(sel); updateBosses(); } public void onFailure(Throwable caught) { } }); instances.addChangeHandler(this); roles.addChangeHandler(this); badges.addChangeHandler(this); grid.setWidget(3, 2, newinst); newinst.setText(NEW_INSTANCE); newinst.addKeyPressHandler(new KeyPressHandler() { public void onKeyPress(KeyPressEvent event) { if (event.getCharCode() == KeyCodes.KEY_ENTER) { final String inst = newinst.getText(); boolean found = false; for (int i = 0; i < instances.getItemCount(); ++i) { if (instances.getItemText(i).equals(inst)) { instances.setSelectedIndex(i); focusBoss(); found = true; break; } } if (!found) { GoteFarm.goteService.addInstance( admin.current_guild.key, inst, new AsyncCallback<JSInstance>() { public void onSuccess(JSInstance result) { instances.addItem(result.name, result.key); instances.setSelectedIndex(instances.getItemCount()-1); bosses.clear(); focusBoss(); } public void onFailure(Throwable caught) { errmsg.setText(caught.getMessage()); } }); } } } }); grid.setWidget(4, 1, bosses); grid.setWidget(4, 2, newboss); bosses.setWidth("100%"); bosses.setVisibleItemCount(10); newboss.setText(NEW_BOSS); newboss.addKeyPressHandler(new KeyPressHandler() { public void onKeyPress(KeyPressEvent event) { if (event.getCharCode() == KeyCodes.KEY_ENTER) { int selinst = instances.getSelectedIndex(); if (selinst == -1) { errmsg.setText( "You need to select and instance to " + "add a boss."); return; } final String boss = newboss.getText(); boolean found = false; for (int i = 0; i < bosses.getItemCount(); ++i) { if (bosses.getItemText(i).equals(boss)) { bosses.setItemSelected(i, true); focusBoss(); found = true; break; } } if (!found) { GoteFarm.goteService.addBoss( instances.getValue(selinst), boss, new AsyncCallback<JSBoss>() { public void onSuccess(JSBoss result) { bosses.addItem(result.name, result.key); bosses.setItemSelected(bosses.getItemCount()-1, true); focusBoss(); } public void onFailure(Throwable caught) { errmsg.setText(caught.getMessage()); } }); } } } }); grid.setWidget(5, 1, roles); roles.addItem(SELECT_A_ROLE); GoteFarm.goteService.getRoles(admin.current_guild.key, new AsyncCallback<List<JSRole>>() { public void onSuccess(List<JSRole> results) { for (JSRole i : results) { roles.addItem(i.name, i.key); } } public void onFailure(Throwable caught) { } }); grid.setWidget(5, 2, newrole); newrole.setText(NEW_ROLE); newrole.addKeyPressHandler(new KeyPressHandler() { private void focusRole() { newrole.setFocus(true); newrole.setText(NEW_ROLE); newrole.setSelectionRange(0, NEW_ROLE.length()); } public void onKeyPress(KeyPressEvent event) { if (event.getCharCode() == KeyCodes.KEY_ENTER) { final String role = newrole.getText(); boolean found = false; for (int i = 0; i < roles.getItemCount(); ++i) { if (roles.getItemText(i).equals(role)) { roles.setSelectedIndex(i); addRole(role); focusRole(); found = true; break; } } if (!found) { GoteFarm.goteService.addRole(admin.current_guild.key, role, true, new AsyncCallback<JSRole>() { public void onSuccess(JSRole result) { roles.addItem(role, result.key); roles.setSelectedIndex(roles.getItemCount()-1); addRole(role); focusRole(); } public void onFailure(Throwable caught) { errmsg.setText(caught.getMessage()); } }); } } } }); roleft.setWidth("100%"); roleft.setCellSpacing(0); roleft.setCellPadding(5); roleft.setText(0, 0, "Role"); roleft.setText(0, 1, "Min"); roleft.setText(0, 2, "Max"); roleft.setText(1, 0, "Totals"); FlexTable.FlexCellFormatter rcf = roleft.getFlexCellFormatter(); rcf.addStyleName(0, 0, "header"); rcf.addStyleName(0, 1, "header"); rcf.addStyleName(0, 2, "header"); rcf.addStyleName(0, 3, "header"); rcf.addStyleName(1, 0, "footer"); rcf.addStyleName(1, 1, "footer"); rcf.addStyleName(1, 2, "footer"); rcf.addStyleName(1, 3, "footer"); FlexTable.FlexCellFormatter gcf = grid.getFlexCellFormatter(); grid.setWidget(6, 0, roleft); gcf.setColSpan(6, 0, 3); grid.setWidget(7, 1, badges); badges.addItem(SELECT_A_BADGE); GoteFarm.goteService.getBadges(admin.current_guild.key, new AsyncCallback<List<JSBadge>>() { public void onSuccess(List<JSBadge> results) { for (JSBadge badge : results) { badges.addItem(badge.name, badge.key); } } public void onFailure(Throwable caught) { } }); grid.setWidget(7, 2, newbadge); newbadge.setText(NEW_BADGE); newbadge.addKeyPressHandler(new KeyPressHandler() { private void focusBadge() { newbadge.setFocus(true); newbadge.setText(NEW_BADGE); newbadge.setSelectionRange(0, NEW_BADGE.length()); } public void onKeyPress(KeyPressEvent event) { if (event.getCharCode() == KeyCodes.KEY_ENTER) { final String badge = newbadge.getText(); boolean found = false; for (int i = 0; i < badges.getItemCount(); ++i) { if (badges.getItemText(i).equals(badge)) { addBadge(badge); focusBadge(); found = true; break; } } if (!found) { GoteFarm.goteService.addBadge(admin.current_guild.key, badge, 0, new AsyncCallback<JSBadge>() { public void onSuccess(JSBadge result) { badges.addItem(badge, result.key); badges.setSelectedIndex(badges.getItemCount()-1); addBadge(badge); focusBadge(); } public void onFailure(Throwable caught) { errmsg.setText(caught.getMessage()); } }); } } } }); badgeft.setWidth("100%"); badgeft.setCellSpacing(0); badgeft.setCellPadding(5); badgeft.setText(0, 0, "Badge"); badgeft.setText(0, 1, "Require For Sign Up"); badgeft.setText(0, 2, "Apply To Role"); badgeft.setText(0, 3, "Num Role Slots"); badgeft.setText(0, 4, "Early Signup (Hours)"); FlexTable.FlexCellFormatter bcf = badgeft.getFlexCellFormatter(); bcf.addStyleName(0, 0, "header"); bcf.addStyleName(0, 1, "header"); bcf.addStyleName(0, 2, "header"); bcf.addStyleName(0, 3, "header"); bcf.addStyleName(0, 4, "header"); bcf.addStyleName(0, 5, "header"); grid.setWidget(8, 0, badgeft); gcf.setColSpan(8, 0, 3); vpanel.add(grid); HorizontalPanel hpanel = new HorizontalPanel(); hpanel.setWidth("100%"); final CheckBox modify = new CheckBox("Modify published events (can change signups)"); modify.setValue(true); modify.addStyleName(modify.getStylePrimaryName() + "-bottom"); modify.addStyleName(modify.getStylePrimaryName() + "-left"); Button save = new Button("Save", new ClickHandler() { public void onClick(ClickEvent event) { // clear error message errmsg.setText(""); final JSEventTemplate t = new JSEventTemplate(); if (EventEditor.this.et != null) { t.key = EventEditor.this.et.key; } else { t.key = null; } t.name = name.getText(); t.size = getRaidSize(); t.minimumLevel = Integer.parseInt(minlevel.getText()); int index = instances.getSelectedIndex(); if (index < 0) { errmsg.setText("Please select an instance for this event."); return; } t.instance_key = instances.getValue(index); t.boss_keys = new ArrayList<String>(); for (int i = 0; i < bosses.getItemCount(); ++i) { if (bosses.isItemSelected(i)) { t.boss_keys.add(bosses.getValue(i)); } } t.roles = new ArrayList<JSEventRole>(); for (int i = 0; i < roleft.getRowCount() - 2; ++i) { JSEventRole er = new JSEventRole(); er.name = roleft.getText(i + 1, 0); er.role_key = getRoleKey(er.name); TextBox minmax; minmax = (TextBox)roleft.getWidget(i + 1, 1); er.min = Integer.parseInt(minmax.getText()); minmax = (TextBox)roleft.getWidget(i + 1, 2); er.max = Integer.parseInt(minmax.getText()); t.roles.add(er); } t.badges = new ArrayList<JSEventBadge>(); for (int i = 0; i < badgeft.getRowCount() - 1; ++i) { JSEventBadge eb = new JSEventBadge(); eb.name = badgeft.getText(i + 1, 0); eb.badge_key = getBadgeKey(eb.name); CheckBox cb = (CheckBox)badgeft.getWidget(i + 1, 1); eb.requireForSignup = cb.getValue(); ListBox lb = (ListBox)badgeft.getWidget(i + 1, 2); String role = lb.getItemText(lb.getSelectedIndex()); if (!role.equals(ALL_ROLES)) { eb.applyToRole = role; } TextBox tb; tb = (TextBox)badgeft.getWidget(i + 1, 3); eb.numSlots = Integer.parseInt(tb.getText()); tb = (TextBox)badgeft.getWidget(i + 1, 4); eb.earlySignup = Integer.parseInt(tb.getText()); t.badges.add(eb); } t.modifyEvents = modify.getValue(); GoteFarm.goteService.saveEventTemplate( admin.current_guild.key, t, new AsyncCallback<JSEventTemplate>() { public void onSuccess(JSEventTemplate result) { EventEditor.this.admin.eventAdded(); EventEditor.this.admin.setCenterWidget(null); if (t.key != null && t.modifyEvents) { admin.fireAdminChange( AdminChange.getEventsChanged() ); } } public void onFailure(Throwable caught) { errmsg.setText(caught.getMessage()); } }); } }); save.addStyleName(save.getStylePrimaryName() + "-bottom"); save.addStyleName(save.getStylePrimaryName() + "-left"); Button cancel = new Button("Cancel", new ClickHandler() { public void onClick(ClickEvent event) { EventEditor.this.admin.setCenterWidget(null); } }); cancel.addStyleName(cancel.getStylePrimaryName() + "-bottom"); cancel.addStyleName(cancel.getStylePrimaryName() + "-right"); hpanel.add(save); // Editing an existing event? if (EventEditor.this.et != null) { hpanel.add(modify); } hpanel.add(errmsg); hpanel.add(cancel); vpanel.add(hpanel); if (et != null) { for (JSEventRole ev : et.roles) { addRole(ev.name, ev.min, ev.max); } for (JSEventBadge eb : et.badges) { addBadge(eb.name, eb.requireForSignup, eb.applyToRole, eb.numSlots, eb.earlySignup); } } if (et == null) { name.setText(NEW_EVENT); DeferredCommand.addCommand(new Command() { public void execute() { name.setFocus(true); name.setSelectionRange(0, NEW_EVENT.length()); } }); size.setText("25"); minlevel.setText(MAX_LEVEL); } else { name.setText(et.name); size.setText("" + et.size); minlevel.setText("" + et.minimumLevel); } updateRoleTotals(); initWidget(vpanel); setStyleName("Admin-EventEditor"); } public EventEditor(Admin admin) { this(admin, null); } private void focusBoss() { newboss.setFocus(true); newboss.setText(NEW_BOSS); newboss.setSelectionRange(0, NEW_BOSS.length()); } public void updateBosses() { int index = instances.getSelectedIndex(); if (index < 0) return; final String inst_key = instances.getValue(index); GoteFarm.goteService.getInstanceBosses( inst_key, new AsyncCallback<List<JSBoss>>() { public void onSuccess(List<JSBoss> results) { bosses.clear(); for (JSBoss ib : results) { bosses.addItem(ib.name, ib.key); if (et != null && inst_key.equals(et.instance_key)) { for (String eb : et.boss_keys) { if (ib.key.equals(eb)) { bosses.setItemSelected(bosses.getItemCount() - 1, true); break; } } } } } public void onFailure(Throwable caught) { } }); } public void addRole(String role) { addRole(role, 0, 0); } public void addRole(String role, int min_value, int max_value) { if (role.equals(SELECT_A_ROLE)) { return; } final int rows = roleft.getRowCount() - 2; // check role doesn't already exist for (int row = 0; row < rows; ++row) { if (roleft.getText(row + 1, 0).equals(role)) { return; } } roleft.insertRow(rows + 1); roleft.setText(rows + 1, 0, role); final TextBox min = new TextBox(); final TextBox max = new TextBox(); min.setText("" + min_value); max.setText("" + max_value); min.setVisibleLength(2); max.setVisibleLength(2); ChangeHandler minmax = new ChangeHandler() { public void onChange(ChangeEvent event) { final Object sender = event.getSource(); try { Integer minv = Integer.parseInt(min.getText()); Integer maxv = Integer.parseInt(max.getText()); if (sender == min) { if (minv > maxv) { max.setText(min.getText()); } } else if (sender == max) { if (maxv < minv) { min.setText(max.getText()); } } } catch (NumberFormatException e) { if (sender == min) { min.setText("0"); } else if (sender == max) { max.setText("0"); } } updateRoleTotals(); } }; min.addChangeHandler(minmax); max.addChangeHandler(minmax); roleft.setWidget(rows + 1, 1, min); roleft.setWidget(rows + 1, 2, max); roleft.setWidget(rows + 1, 3, new Button("Remove", new ClickHandler() { public void onClick(ClickEvent event) { final Object sender = event.getSource(); final int rows = roleft.getRowCount() - 2; for (int i = 0; i < rows; ++i) { if (roleft.getWidget(i + 1, 3) == sender) { roleft.removeRow(i + 1); updateBadgeRoles(); break; } } } })); updateRoleTotals(); } public void addBadge(String badge) { addBadge(badge, false, null, 0, 0); } public void addBadge(String badge, boolean requireForSignup, String applyToRole, int numSlots, int earlySignup) { if (badge.equals(SELECT_A_BADGE)) { return; } final int rows = badgeft.getRowCount() - 1; badgeft.setText(rows + 1, 0, badge); final CheckBox cb = new CheckBox(); cb.setValue(requireForSignup); badgeft.setWidget(rows + 1, 1, cb); final ListBox roles = new ListBox(); roles.setVisibleItemCount(1); roles.addItem(ALL_ROLES); int sel_index = 0; for (int i = 0; i < roleft.getRowCount() - 2; ++i) { String role = roleft.getText(i + 1, 0); roles.addItem(role); if (applyToRole != null && role.equals(applyToRole)) { sel_index = roles.getItemCount() - 1; } } roles.setSelectedIndex(sel_index); badgeft.setWidget(rows + 1, 2, roles); final TextBox slots = new TextBox(); slots.setVisibleLength(2); if (requireForSignup && applyToRole != null) { slots.setText("" + numSlots); } else { slots.setEnabled(false); slots.setText("0"); } badgeft.setWidget(rows + 1, 3, slots); slots.addChangeHandler(new ChangeHandler() { public void onChange(ChangeEvent event) { try { int num = Integer.parseInt(slots.getText()); if (num < 0) { slots.setText("0"); } } catch (NumberFormatException e) { slots.setText("0"); } } }); cb.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { if (cb.getValue() && roles.getSelectedIndex() > 0) { slots.setEnabled(true); } else { slots.setEnabled(false); slots.setText("0"); } } }); roles.addChangeHandler(new ChangeHandler() { public void onChange(ChangeEvent event) { if (cb.getValue() && roles.getSelectedIndex() > 0) { slots.setEnabled(true); } else { slots.setEnabled(false); slots.setText("0"); } } }); final TextBox early = new TextBox(); early.setVisibleLength(2); early.setText("" + earlySignup); badgeft.setWidget(rows + 1, 4, early); early.addChangeHandler(new ChangeHandler() { public void onChange(ChangeEvent event) { try { int num = Integer.parseInt(early.getText()); if (num < 0) { early.setText("0"); } } catch (NumberFormatException e) { early.setText("0"); } } }); badgeft.setWidget(rows + 1, 5, new Button("Remove", new ClickHandler() { public void onClick(ClickEvent event) { final Object sender = event.getSource(); final int rows = badgeft.getRowCount() - 1; for (int i = 0; i < rows; ++i) { if (badgeft.getWidget(i + 1, 5) == sender) { badgeft.removeRow(i + 1); break; } } } })); } public int getRaidSize() { try { return Integer.parseInt(size.getText()); } catch (NumberFormatException e) { return 0; } } private String getBadgeKey(String name) { for (int i = 0; i < badges.getItemCount(); ++i) { if (badges.getItemText(i).equals(name)) { return badges.getValue(i); } } return null; } private String getRoleKey(String name) { for (int i = 0; i < roles.getItemCount(); ++i) { if (roles.getItemText(i).equals(name)) { return roles.getValue(i); } } return null; } public void updateRoleTotals() { int mint = 0; int maxt = 0; final int rows = roleft.getRowCount() - 2; for (int row = 0; row < rows; ++row) { TextBox minw = (TextBox)roleft.getWidget(row + 1, 1); TextBox maxw = (TextBox)roleft.getWidget(row + 1, 2); mint += Integer.parseInt(minw.getText()); maxt += Integer.parseInt(maxw.getText()); } roleft.setText(rows + 1, 1, "" + mint); roleft.setText(rows + 1, 2, "" + maxt); int size = getRaidSize(); FlexTable.FlexCellFormatter fcf = roleft.getFlexCellFormatter(); if (mint < size) { fcf.addStyleName(rows + 1, 1, "error"); } else { fcf.removeStyleName(rows + 1, 1, "error"); } if (maxt < size) { fcf.addStyleName(rows + 1, 2, "error"); } else { fcf.removeStyleName(rows + 1, 2, "error"); } updateBadgeRoles(); } public void updateBadgeRoles() { final int role_rows = roleft.getRowCount() - 2; final int badge_rows = badgeft.getRowCount() - 1; for (int i = 0; i < badge_rows; ++i) { ListBox broles = (ListBox)badgeft.getWidget(i + 1, 2); String selected = broles.getItemText(broles.getSelectedIndex()); broles.clear(); broles.addItem(ALL_ROLES); int selected_index = 0; for (int j = 0; j < role_rows; ++j) { String role = roleft.getText(j + 1, 0); broles.addItem(role); if (role.equals(selected)) { selected_index = j + 1; } } broles.setSelectedIndex(selected_index); // should num slots be enabled? boolean enable = false; if (selected_index > 0) { CheckBox cb = (CheckBox)badgeft.getWidget(i + 1, 1); if (cb.getValue()) { enable = true; } } TextBox tb = (TextBox)badgeft.getWidget(i + 1, 3); tb.setEnabled(enable); if (!enable) { tb.setText("0"); } } } public void onChange(ChangeEvent event) { Object sender = event.getSource(); if (sender == instances) { updateBosses(); } else if (sender == roles) { addRole(roles.getItemText(roles.getSelectedIndex())); } else if (sender == badges) { addBadge(badges.getItemText(badges.getSelectedIndex())); } } }