Java tutorial
/* * JBoss, Home of Professional Open Source * Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors * as indicated by the @author tags. All rights reserved. * See the copyright.txt in the distribution for a * full listing of individual contributors. * * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ package org.jboss.as.console.client.shared.subsys.security; import com.google.gwt.cell.client.CompositeCell; import com.google.gwt.cell.client.HasCell; import com.google.gwt.cell.client.TextCell; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.IdentityColumn; import com.google.gwt.user.client.ui.LayoutPanel; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.ProvidesKey; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SingleSelectionModel; import org.jboss.as.console.client.Console; import org.jboss.as.console.client.shared.properties.NewPropertyWizard; import org.jboss.as.console.client.shared.properties.PropertyEditor; import org.jboss.as.console.client.shared.properties.PropertyManagement; import org.jboss.as.console.client.shared.properties.PropertyRecord; import org.jboss.as.console.client.shared.subsys.security.model.GenericSecurityDomainData; import org.jboss.as.console.client.widgets.ContentDescription; import org.jboss.ballroom.client.widgets.ContentGroupLabel; import org.jboss.ballroom.client.widgets.ContentHeaderLabel; import org.jboss.ballroom.client.widgets.tables.DefaultCellTable; import org.jboss.ballroom.client.widgets.tables.DefaultPager; import org.jboss.ballroom.client.widgets.tools.ToolButton; import org.jboss.ballroom.client.widgets.tools.ToolStrip; import org.jboss.ballroom.client.widgets.window.DefaultWindow; import org.jboss.ballroom.client.widgets.window.Feedback; import java.util.ArrayList; import java.util.List; /** * @author David Bosschaert * @author Heiko Braun */ public abstract class AbstractDomainDetailEditor<T extends GenericSecurityDomainData> implements PropertyManagement { final Class<T> entityClass; final SecurityDomainsPresenter presenter; DefaultCellTable<T> attributesTable; ListDataProvider<T> attributesProvider; String domainName; boolean resourceExists; ToolButton addModule; DefaultWindow window; ContentHeaderLabel headerLabel; Wizard<T> wizard; PropertyEditor propertyEditor; DefaultWindow propertyWindow; private String description; AbstractDomainDetailEditor(SecurityDomainsPresenter presenter, Class<T> entityClass) { this.presenter = presenter; this.entityClass = entityClass; } abstract String getEntityName(); abstract String getStackElementName(); abstract String getStackName(); abstract Wizard<T> getWizard(); abstract ProvidesKey<T> getKeyProvider(); protected void setDescription(String description) { this.description = description; } abstract void saveData(); abstract void removeData(); Widget asWidget() { VerticalPanel vpanel = new VerticalPanel(); vpanel.setStyleName("rhs-content-panel"); // TODO: in order for the selection to retain we need a distinct key per module. // attributesTable = new DefaultCellTable<T>(4, getKeyProvider()); attributesTable = new DefaultCellTable<T>(4); attributesTable.getElement().setAttribute("style", "margin-top:5px;"); attributesProvider = new ListDataProvider<T>(); attributesProvider.addDataDisplay(attributesTable); headerLabel = new ContentHeaderLabel("TITLE HERE"); vpanel.add(headerLabel); vpanel.add(new ContentDescription(description)); vpanel.add(new ContentGroupLabel(getStackName())); ToolStrip tableTools = new ToolStrip(); addModule = new ToolButton(Console.CONSTANTS.common_label_add()); addModule.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { openWizard(null); } }); addModule.ensureDebugId(Console.DEBUG_CONSTANTS.debug_label_add_abstractDomainDetailEditor()); tableTools.addToolButtonRight(addModule); tableTools.addToolButtonRight(new ToolButton(Console.CONSTANTS.common_label_remove(), new ClickHandler() { @Override public void onClick(ClickEvent event) { final T policy = getCurrentSelection(); Feedback.confirm(Console.MESSAGES.deleteTitle(getEntityName()), Console.MESSAGES.deleteConfirm(policy.getCode()), new Feedback.ConfirmationHandler() { @Override public void onConfirmation(boolean isConfirmed) { if (isConfirmed) { attributesProvider.getList().remove(policy); if (attributesProvider.getList().size() > 0) { saveData(); } // call remove() on last provider-module instead of save() else { removeData(); } } } }); } })); vpanel.add(tableTools); // ------- Column<T, String> codeColumn = new Column<T, String>(new TextCell()) { @Override public String getValue(T record) { return record.getCode(); } }; attributesTable.addColumn(codeColumn, Console.CONSTANTS.subsys_security_codeField()); addCustomColumns(attributesTable); List<HasCell<T, T>> actionCells = new ArrayList<HasCell<T, T>>(); IdentityColumn<T> actionColumn = new IdentityColumn<T>(new CompositeCell(actionCells)); attributesTable.addColumn(actionColumn, ""); vpanel.add(attributesTable); // ------- DefaultPager pager = new DefaultPager(); pager.setDisplay(attributesTable); vpanel.add(pager); // ------- propertyEditor = new PropertyEditor(this, true); propertyEditor.setHideButtons(false); final SingleSelectionModel<T> ssm = new SingleSelectionModel<T>(); ssm.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { T policy = ssm.getSelectedObject(); if (policy == null) // Can this actually happen? { return; } List<PropertyRecord> props = policy.getProperties(); if (props == null) { props = new ArrayList<PropertyRecord>(); policy.setProperties(props); } propertyEditor.setProperties("", policy.getProperties()); wizard.edit(policy); } }); attributesTable.setSelectionModel(ssm); wizard = getWizard(); TabPanel bottomTabs = new TabPanel(); bottomTabs.setStyleName("default-tabpanel"); bottomTabs.add(wizard.asWidget(), "Attributes"); bottomTabs.add(propertyEditor.asWidget(), "Module Options"); propertyEditor.setAllowEditProps(false); vpanel.add(new ContentGroupLabel("Details")); vpanel.add(bottomTabs); bottomTabs.selectTab(0); // ------- ScrollPanel scroll = new ScrollPanel(vpanel); LayoutPanel layout = new LayoutPanel(); layout.add(scroll); layout.setWidgetTopHeight(scroll, 0, Style.Unit.PX, 100, Style.Unit.PCT); return layout; } private T getCurrentSelection() { return ((SingleSelectionModel<T>) attributesTable.getSelectionModel()).getSelectedObject(); } void addCustomColumns(DefaultCellTable<T> attributesTable) { // by default no custom columns are needed } void setData(String domainName, List<T> newList, boolean resourceExists) { this.domainName = domainName; this.resourceExists = resourceExists; this.headerLabel.setText("Security Domain: " + domainName); List<T> list = attributesProvider.getList(); list.clear(); list.addAll(newList); if (!list.isEmpty()) { attributesTable.getSelectionModel().setSelected(list.get(0), true); } else if (wizard != null) // loading happens before asWidget() is invoked { wizard.clearValues(); propertyEditor.clearValues(); } } void openWizard(T editedObject) { Wizard<T> wizard = getWizard(); wizard.setIsDialogue(true); if (wizard == null) return; window = new DefaultWindow((editedObject == null ? Console.CONSTANTS.common_label_add() : Console.CONSTANTS.common_label_edit()) + " " + getStackElementName()); window.setWidth(480); window.setHeight(400); window.trapWidget(wizard.asWidget()); if (editedObject != null) wizard.edit(editedObject); window.setGlassEnabled(true); window.center(); } public void closeWizard() { if (window != null) window.hide(); } public void addAttribute(T policy) { attributesProvider.getList().add(policy); save(policy); } public void save(T policy) { saveData(); // This combination seems to consistently update the details view attributesTable.getSelectionModel().setSelected(policy, true); SelectionChangeEvent.fire(attributesTable.getSelectionModel()); } public interface Wizard<T> { void edit(T object); Widget asWidget(); Wizard setIsDialogue(boolean b); void clearValues(); } @Override public void onCreateProperty(String reference, PropertyRecord prop) { closePropertyDialoge(); T currentSelection = getCurrentSelection(); if (null == currentSelection.getProperties()) currentSelection.setProperties(new ArrayList<PropertyRecord>()); currentSelection.getProperties().add(prop); save(currentSelection); } @Override public void onDeleteProperty(String reference, PropertyRecord prop) { T currentSelection = getCurrentSelection(); currentSelection.getProperties().remove(prop); save(currentSelection); } @Override public void onChangeProperty(String reference, PropertyRecord prop) { // Not provided } @Override public void launchNewPropertyDialoge(String reference) { propertyWindow = new DefaultWindow(Console.MESSAGES.createTitle("Module Option")); propertyWindow.setWidth(320); propertyWindow.setHeight(240); propertyWindow.trapWidget(new NewPropertyWizard(this, "", false).asWidget()); propertyWindow.setGlassEnabled(true); propertyWindow.center(); } @Override public void closePropertyDialoge() { propertyWindow.hide(); } }