public Widget draw() {

    this.titleWidget.setText(
        Utils.getStrippedStringWithEllipsis(group.getName()) + ": " + "ext sources");

    // main panel
    VerticalPanel vp = new VerticalPanel();
    vp.setSize("100%", "100%");

    // HORIZONTAL MENU
    TabMenu menu = new TabMenu();
    menu.addWidget(UiElements.getRefreshButton(this));

    // get VO resources
    final GetGroupExtSources extSources = new GetGroupExtSources(groupId);

    // refresh table event
    final JsonCallbackEvents events = JsonCallbackEvents.refreshTableEvents(extSources);

    // create ext source button
    CustomButton addButton =
        TabMenu.getPredefinedButton(
            ButtonType.ADD,
            true,
            ButtonTranslation.INSTANCE.addExtSource(),
            new ClickHandler() {
              public void onClick(ClickEvent event) {
                session
                    .getTabManager()
                    .addTabToCurrentTab(new AddGroupExtSourceTabItem(groupId), true);
              }
            });
    if (session.isVoAdmin(voId)) {
      menu.addWidget(addButton);
    }

    final CustomButton removeButton =
        TabMenu.getPredefinedButton(
            ButtonType.REMOVE, ButtonTranslation.INSTANCE.removeExtSource());
    removeButton.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent event) {
            final ArrayList<ExtSource> extSourcesToRemove = extSources.getTableSelectedList();
            String text =
                "Following external sources will be removed from Group. You won't be able to import members from them anymore.";
            UiElements.showDeleteConfirm(
                extSourcesToRemove,
                text,
                new ClickHandler() {
                  @Override
                  public void onClick(ClickEvent clickEvent) {
                    // TODO - SHOULD HAVE ONLY ONE CALLBACK TO CORE !!
                    for (int i = 0; i < extSourcesToRemove.size(); i++) {
                      RemoveExtSource request;
                      if (i == extSourcesToRemove.size() - 1) {
                        request =
                            new RemoveExtSource(
                                JsonCallbackEvents.disableButtonEvents(removeButton, events));
                      } else {
                        request =
                            new RemoveExtSource(
                                JsonCallbackEvents.disableButtonEvents(removeButton));
                      }
                      request.removeGroupExtSource(groupId, extSourcesToRemove.get(i).getId());
                    }
                  }
                });
          }
        });
    if (session.isVoAdmin(voId)) {
      menu.addWidget(removeButton);
    }

    // authorization - enable buttons for vo admin only.
    if (!session.isVoAdmin(voId)) {
      addButton.setEnabled(false);
      removeButton.setEnabled(false);
      extSources.setCheckable(false);
    }

    menu.addFilterWidget(
        new ExtendedSuggestBox(extSources.getOracle()),
        new PerunSearchEvent() {
          @Override
          public void searchFor(String text) {
            extSources.filterTable(text);
          }
        },
        "Filter external sources by name or type");

    // add menu to the main panel
    vp.add(menu);
    vp.setCellHeight(menu, "30px");

    CellTable<ExtSource> table = extSources.getTable();

    if (session.isVoAdmin(voId)) {
      removeButton.setEnabled(false);
      JsonUtils.addTableManagedButton(extSources, table, removeButton);
    }

    table.addStyleName("perun-table");
    table.setWidth("100%");
    ScrollPanel sp = new ScrollPanel(table);
    sp.addStyleName("perun-tableScrollPanel");

    vp.add(sp);

    session.getUiElements().resizePerunTable(sp, 350, this);

    this.contentWidget.setWidget(vp);

    return getWidget();
  }
  public Widget draw() {

    titleWidget.setText(def.getName());
    final TabItem tab = this;

    // create main panel for content
    final FlexTable mainPage = new FlexTable();
    mainPage.setWidth("100%");

    final ExtendedTextBox description = new ExtendedTextBox();
    description.setWidth("100%");
    description.getTextBox().setText(def.getDescription());
    final ExtendedTextBox.TextBoxValidator validator =
        new ExtendedTextBox.TextBoxValidator() {
          @Override
          public boolean validateTextBox() {
            if (description.getTextBox().getText().trim().isEmpty()) {
              description.setError("Description can't be empty.");
              return false;
            }
            description.setOk();
            return true;
          }
        };

    final ExtendedTextBox displayName = new ExtendedTextBox();
    displayName.setWidth("100%");
    displayName.getTextBox().setText(def.getDisplayName());
    final ExtendedTextBox.TextBoxValidator validatorName =
        new ExtendedTextBox.TextBoxValidator() {
          @Override
          public boolean validateTextBox() {
            if (displayName.getTextBox().getText().trim().isEmpty()) {
              displayName.setError("Display name can't be empty.");
              return false;
            }
            displayName.setOk();
            return true;
          }
        };

    description.setValidator(validator);
    displayName.setValidator(validatorName);

    FlexTable attributeDetailTable = new FlexTable();
    attributeDetailTable.setStyleName("inputFormFlexTable");

    final CustomButton updateButton =
        TabMenu.getPredefinedButton(ButtonType.SAVE, "Save attribute details");
    updateButton.addClickHandler(
        new ClickHandler() {
          @Override
          public void onClick(ClickEvent event) {

            final ArrayList<AttributeRights> list = new ArrayList<AttributeRights>();
            for (AttributeRights r : rights) {
              if (r.getRole().equalsIgnoreCase("SELF")) {
                list.add(getRightsFromWidgets(selfRead, selfWrite, r));
              } else if (r.getRole().equalsIgnoreCase("VOADMIN")) {
                list.add(getRightsFromWidgets(voRead, voWrite, r));
              } else if (r.getRole().equalsIgnoreCase("GROUPADMIN")) {
                list.add(getRightsFromWidgets(groupRead, groupWrite, r));
              } else if (r.getRole().equalsIgnoreCase("FACILITYADMIN")) {
                list.add(getRightsFromWidgets(facilityRead, facilityWrite, r));
              }
            }

            if ((!def.getDescription().equals(description.getTextBox().getText().trim())
                || !def.getDisplayName().equals(displayName.getTextBox().getText().trim()))) {

              if (!validator.validateTextBox() || !validatorName.validateTextBox()) return;

              def.setDescription(description.getTextBox().getText().trim());
              def.setDisplayName(displayName.getTextBox().getText().trim());

              UpdateAttribute request =
                  new UpdateAttribute(
                      JsonCallbackEvents.disableButtonEvents(
                          updateButton,
                          new JsonCallbackEvents() {
                            @Override
                            public void onFinished(JavaScriptObject jso) {

                              // after update - update rights
                              SetAttributeRights request =
                                  new SetAttributeRights(
                                      JsonCallbackEvents.disableButtonEvents(
                                          updateButton,
                                          new JsonCallbackEvents() {
                                            @Override
                                            public void onFinished(JavaScriptObject jso) {
                                              enableDisableWidgets(true);
                                            }

                                            @Override
                                            public void onLoadingStart() {
                                              enableDisableWidgets(false);
                                            }

                                            @Override
                                            public void onError(PerunError error) {
                                              enableDisableWidgets(true);
                                            }
                                          }));
                              request.setAttributeRights(list);
                            }
                          }));
              request.updateAttribute(def);
            } else {

              // after update - update rights
              SetAttributeRights request =
                  new SetAttributeRights(
                      JsonCallbackEvents.disableButtonEvents(
                          updateButton,
                          new JsonCallbackEvents() {
                            @Override
                            public void onFinished(JavaScriptObject jso) {
                              enableDisableWidgets(true);
                            }

                            @Override
                            public void onLoadingStart() {
                              enableDisableWidgets(false);
                            }

                            @Override
                            public void onError(PerunError error) {
                              enableDisableWidgets(true);
                            }
                          }));
              request.setAttributeRights(list);
            }
          }
        });

    attributeDetailTable.setHTML(0, 0, "Display name:");
    attributeDetailTable.setWidget(0, 1, displayName);
    attributeDetailTable.setHTML(1, 0, "Description:");
    attributeDetailTable.setWidget(1, 1, description);
    for (int i = 0; i < attributeDetailTable.getRowCount(); i++) {
      attributeDetailTable.getFlexCellFormatter().setStyleName(i, 0, "itemName");
    }

    final FlexTable rightsTable = new FlexTable();
    rightsTable.setStyleName("inputFormFlexTable");

    rightsTable.setHTML(0, 1, "<strong>SELF</strong>");
    rightsTable.setHTML(0, 2, "<strong>VO</strong>");
    rightsTable.setHTML(0, 3, "<strong>GROUP</strong>");
    rightsTable.setHTML(0, 4, "<strong>FACILITY</strong>");

    rightsTable.setHTML(1, 0, "<strong>READ</strong>");
    rightsTable.setHTML(2, 0, "<strong>WRITE</strong>");

    rightsTable.setWidget(1, 1, selfRead);
    rightsTable.setWidget(2, 1, selfWrite);
    rightsTable.setWidget(1, 2, voRead);
    rightsTable.setWidget(2, 2, voWrite);
    rightsTable.setWidget(1, 3, groupRead);
    rightsTable.setWidget(2, 3, groupWrite);
    rightsTable.setWidget(1, 4, facilityRead);
    rightsTable.setWidget(2, 4, facilityWrite);

    rightsTable.addStyleName("centeredTable");

    TabMenu menu = new TabMenu();
    menu.addWidget(updateButton);

    menu.addWidget(
        TabMenu.getPredefinedButton(
            ButtonType.CLOSE,
            "",
            new ClickHandler() {
              @Override
              public void onClick(ClickEvent event) {
                session.getTabManager().closeTab(tab, false);
              }
            }));

    GetAttributeRights rightsCall =
        new GetAttributeRights(
            def.getId(),
            new JsonCallbackEvents() {
              @Override
              public void onFinished(JavaScriptObject jso) {
                rights = JsonUtils.jsoAsList(jso);
                for (AttributeRights r : rights) {
                  if (r.getRole().equalsIgnoreCase("SELF")) {
                    setRightsToWidgets(selfRead, selfWrite, r);
                  } else if (r.getRole().equalsIgnoreCase("VOADMIN")) {
                    setRightsToWidgets(voRead, voWrite, r);
                  } else if (r.getRole().equalsIgnoreCase("GROUPADMIN")) {
                    setRightsToWidgets(groupRead, groupWrite, r);
                  } else if (r.getRole().equalsIgnoreCase("FACILITYADMIN")) {
                    setRightsToWidgets(facilityRead, facilityWrite, r);
                  }
                }
                enableDisableWidgets(true);
                rightsTable.setVisible(true);
              }

              @Override
              public void onError(PerunError error) {
                enableDisableWidgets(true);
                rightsTable.setVisible(false);
              }

              @Override
              public void onLoadingStart() {
                enableDisableWidgets(false);
                rightsTable.setVisible(false);
              }
            });
    rightsCall.retrieveData();

    // create new instance for jsonCall
    final GetServicesByAttrDefinition services = new GetServicesByAttrDefinition(def.getId());
    services.setCheckable(false);

    CellTable<Service> attrDefTable =
        services.getTable(
            new FieldUpdater<Service, String>() {
              @Override
              public void update(int index, Service object, String value) {
                session.getTabManager().addTab(new ServiceDetailTabItem(object));
              }
            });
    attrDefTable.setStyleName("perun-table");
    ScrollPanel scrollTable = new ScrollPanel(attrDefTable);
    scrollTable.addStyleName("perun-tableScrollPanel");
    session.getUiElements().resizePerunTable(scrollTable, 350, this);

    // set content to page

    mainPage.setWidget(0, 0, menu);
    mainPage.getFlexCellFormatter().setColSpan(0, 0, 2);

    mainPage.setWidget(1, 0, attributeDetailTable);
    mainPage.setWidget(1, 1, rightsTable);
    mainPage.getFlexCellFormatter().setWidth(1, 0, "50%");
    mainPage.getFlexCellFormatter().setWidth(1, 1, "50%");

    HTML title = new HTML("<p>Required by service</p>");
    title.setStyleName("subsection-heading");
    mainPage.setWidget(2, 0, title);
    mainPage.getFlexCellFormatter().setColSpan(2, 0, 2);

    // put page into scroll panel
    mainPage.setWidget(3, 0, scrollTable);
    mainPage.getFlexCellFormatter().setColSpan(3, 0, 2);
    mainPage.getFlexCellFormatter().setHeight(3, 0, "100%");

    this.contentWidget.setWidget(mainPage);

    return getWidget();
  }