/*
* Copyright 2012 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.workbench.common.screens.projecteditor.client.widgets;
import java.util.Map;
import javax.inject.Inject;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import org.guvnor.common.services.project.model.HasListFormComboPanelProperties;
import org.kie.workbench.common.widgets.client.popups.text.FormPopup;
import org.kie.workbench.common.widgets.client.popups.text.PopupSetFieldCommand;
import org.uberfire.client.mvp.LockRequiredEvent;
public abstract class ListFormComboPanel<T extends HasListFormComboPanelProperties>
implements IsWidget, ListFormComboPanelView.Presenter {
private Map<String, T> items;
protected final ListFormComboPanelView view;
private final FormPopup namePopup;
private String selectedItemName = null;
private final Form<T> form;
@Inject
private javax.enterprise.event.Event<LockRequiredEvent> lockRequired;
public ListFormComboPanel(ListFormComboPanelView view,
Form<T> form,
FormPopup namePopup) {
this.view = view;
this.namePopup = namePopup;
this.form = form;
view.setForm(form);
view.setPresenter(this);
}
@Override
public Widget asWidget() {
return view.asWidget();
}
public void setItems(Map<String, T> sessions) {
view.clearList();
this.items = sessions;
for (String name : sessions.keySet()) {
view.addItem(name);
}
}
@Override
public void onSelect(String fullName) {
setSelected(items.get(fullName));
}
@Override
public void onAdd() {
namePopup.setOldName("");
namePopup.show(new PopupSetFieldCommand() {
@Override
public void setName(String name) {
if (items.containsKey(name)) {
view.showThereAlreadyExistAnItemWithTheGivenNamePleaseSelectAnotherName();
} else if (!XsdIDValidator.validate(name)) {
view.showXsdIDError();
} else {
T model = createNew(name);
view.addItem(model.getName());
items.put(model.getName(), model);
setSelected(model);
namePopup.hide();
fireLockRequiredEvent();
}
}
});
}
@Override
public void onRename() {
namePopup.setOldName(selectedItemName);
namePopup.show(new PopupSetFieldCommand() {
@Override
public void setName(String name) {
if (XsdIDValidator.validate(name)) {
T model = items.get(selectedItemName);
items.remove(selectedItemName);
model.setName(name);
items.put(name, model);
view.remove(selectedItemName);
view.addItem(name);
setSelected(model);
namePopup.hide();
fireLockRequiredEvent();
} else {
view.showXsdIDError();
}
}
});
}
private void setSelected(T model) {
selectedItemName = model.getName();
view.setSelected(model.getName());
if (model.isDefault()) {
view.disableMakeDefault();
} else {
view.enableMakeDefault();
}
view.enableItemEditingButtons();
form.setModel(model);
}
protected abstract T createNew(String name);
public void refresh() {
if (itemsIsNotNullOrEmpty()) {
setSelected(getFirstItem());
} else {
selectedItemName = null;
form.clear();
}
}
private T getFirstItem() {
return items.values().iterator().next();
}
private boolean itemsIsNotNullOrEmpty() {
return items != null && !items.isEmpty();
}
@Override
public void onRemove() {
fireLockRequiredEvent();
if (selectedItemName == null) {
view.showPleaseSelectAnItem();
} else {
items.remove(selectedItemName);
view.remove(selectedItemName);
view.disableMakeDefault();
view.disableItemEditingButtons();
form.clear();
form.makeReadOnly();
selectedItemName = null;
}
}
@Override
public void onMakeDefault() {
fireLockRequiredEvent();
if (selectedItemName == null) {
view.showPleaseSelectAnItem();
} else {
for (HasListFormComboPanelProperties item : items.values()) {
item.setDefault(false);
}
items.get(selectedItemName).setDefault(true);
view.disableMakeDefault();
}
}
private void fireLockRequiredEvent() {
if (lockRequired != null) {
lockRequired.fire( new LockRequiredEvent() );
}
}
}