/** Update the permission map and then save it. */
  protected void beginApply() {
    setEnabled(false);
    for (Iterator itr = groups2Permissions.entrySet().iterator(); itr.hasNext(); ) {
      Map.Entry e = (Map.Entry) itr.next();

      WGroup g = (WGroup) e.getKey();
      Collection permGrants = (Collection) e.getValue();

      int row = rows.indexOf(g.getName());

      for (Iterator pgItr = permGrants.iterator(); pgItr.hasNext(); ) {
        WPermissionGrant pg = (WPermissionGrant) pgItr.next();

        int col = getPermissionColumn(pg.getPermission().getName());

        setGrant(row, col, pg);
      }
    }

    AbstractCallback callback =
        new AbstractCallback(errorPanel) {

          public void onCallFailure(Throwable caught) {
            super.onFailure(caught);
            setEnabled(true);
          }

          public void onCallSuccess(Object arg0) {
            errorPanel.setMessage(administrationConstants.permissionsSaved());
            setEnabled(true);
          }
        };
    applyPermissions(groups2Permissions, callback);
  }
  protected void receiveGroups(Map groups2Permissions) {
    this.groups2Permissions = groups2Permissions;
    mainPanel.clear();

    ContentPanel cp = new FullContentPanel();
    cp.setHeading(administrationConstants.usersGroup());

    // add inline help string and widget
    //        cp.setTopComponent(new
    // InlineHelpPanel(galaxy.getRepositoryConstants().repo_Security_Tip(), 15));
    mainPanel.add(cp);

    table = createRowTable();
    cp.add(table);

    int col = 1;
    table.setWidget(0, 0, new Image("images/clearpixel.gif"));
    for (Iterator itr = permissions.iterator(); itr.hasNext(); ) {
      WPermission p = (WPermission) itr.next();
      table.setWidget(0, col, createTitleText(p.getDescription()));

      col++;
    }

    rows = new ArrayList<String>();
    for (Iterator itr = groups2Permissions.keySet().iterator(); itr.hasNext(); ) {
      rows.add(((WGroup) itr.next()).getName());
    }
    Collections.sort(rows);

    for (Iterator itr = groups2Permissions.entrySet().iterator(); itr.hasNext(); ) {
      Map.Entry e = (Map.Entry) itr.next();

      final WGroup role = (WGroup) e.getKey();
      final String groupName = role.getName();
      final Hyperlink hl = new Hyperlink(groupName, "groups/" + role.getId());

      int row = rows.indexOf(groupName) + 1;

      // certain groups should not be removed or edited via the GUI
      boolean isUberGroup = groupName.equals("Administrators") || groupName.equals("Anonymous");
      if (isUberGroup) {
        table.setWidget(row, 0, new Label(groupName));
      } else {
        table.setWidget(row, 0, hl);
      }

      Collection grants = (Collection) e.getValue();
      for (Iterator gItr = grants.iterator(); gItr.hasNext(); ) {
        WPermissionGrant pg = (WPermissionGrant) gItr.next();
        int permCol = getPermissionColumn(pg.getPermission().getName());
        if (permCol != -1) {
          Widget w = createGrantWidget(pg, isUberGroup);
          table.setWidget(row, permCol, w);
        }
      }
      row++;
    }

    // table.getFlexCellFormatter().setColSpan(rows.size() + 1, 0, col);

    SelectionListener listener =
        new SelectionListener<ComponentEvent>() {
          public void componentSelected(ComponentEvent ce) {
            Button btn = (Button) ce.getComponent();

            if (btn == applyButton) {
              beginApply();
            }
            if (btn == resetButton) {
              // Go back to the previously saved state.
              errorPanel.clearErrorMessage();
              doShowPage();
            }
          }
        };

    applyButton = new Button(administrationConstants.save(), listener);
    resetButton = new Button(administrationConstants.cancel(), listener);

    ButtonBar bb = new ButtonBar();
    bb.add(applyButton);
    bb.add(resetButton);
    bb.add(createHistoryButton(administrationConstants.newAdmin(), "groups/new"));

    // table.setWidget(rows.size() + 1, 0, bb);
    cp.add(bb);

    cp.layout(true);
  }