/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.dm.view.controller.action;
import java.util.EventObject;
import java.util.Vector;
import java.util.logging.Logger;
import javax.swing.Icon;
import org.openflexo.components.AskParametersDialog;
import org.openflexo.dm.view.controller.DMController;
import org.openflexo.foundation.action.FlexoActionFinalizer;
import org.openflexo.foundation.action.FlexoActionInitializer;
import org.openflexo.foundation.dm.DMEntity;
import org.openflexo.foundation.dm.DMTranstyper;
import org.openflexo.foundation.dm.DMTranstyper.DMTranstyperEntry;
import org.openflexo.foundation.dm.DMType;
import org.openflexo.foundation.dm.action.CreateDMTranstyper;
import org.openflexo.foundation.param.DMTypeParameter;
import org.openflexo.foundation.param.LabelParameter;
import org.openflexo.foundation.param.ParameterDefinition;
import org.openflexo.foundation.param.ParametersModel;
import org.openflexo.foundation.param.PropertyListParameter;
import org.openflexo.foundation.param.RadioButtonListParameter;
import org.openflexo.foundation.param.ReadOnlyTextFieldParameter;
import org.openflexo.foundation.param.TextFieldParameter;
import org.openflexo.icon.DMEIconLibrary;
import org.openflexo.inspector.model.PropertyListColumn;
import org.openflexo.inspector.widget.LabelWidget;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.view.controller.ActionInitializer;
import org.openflexo.view.controller.ControllerActionInitializer;
public class CreateDMTranstyperInitializer extends ActionInitializer {
@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(ControllerActionInitializer.class.getPackage().getName());
CreateDMTranstyperInitializer(DMControllerActionInitializer actionInitializer) {
super(CreateDMTranstyper.actionType, actionInitializer);
}
@Override
protected DMControllerActionInitializer getControllerActionInitializer() {
return (DMControllerActionInitializer) super.getControllerActionInitializer();
}
@Override
protected FlexoActionInitializer<CreateDMTranstyper> getDefaultInitializer() {
return new FlexoActionInitializer<CreateDMTranstyper>() {
@Override
public boolean run(EventObject e, final CreateDMTranstyper action) {
ReadOnlyTextFieldParameter declaringEntityParam = new ReadOnlyTextFieldParameter("declaringEntity", "declaring_entity",
action.getEntity().getName());
TextFieldParameter nameParam = new TextFieldParameter("transtyperName", "transtyper_name", action.getEntity().getDMModel()
.getNextDefautTranstyperName(action.getEntity()));
DMTypeParameter typeParam = new DMTypeParameter("returnedType", "returned_type", DMType.makeResolvedDMType(action
.getEntity()));
final TranstyperEntryInfoParameter entriesParameters = new TranstyperEntryInfoParameter("entries",
"required_entries_for_this_new_transtyper", action.getFocusedObject(), 20, 8);
entriesParameters.addAddAction("add_entry", "params.entries.addEntry", "params.entries.addEntryEnabled", null);
entriesParameters.addDeleteAction("remove_entry", "params.entries.removeEntry", "params.entries.removeEntryEnabled", null);
entriesParameters.addIconColumn("icon", "", 30, false);
entriesParameters.addTextFieldColumn("name", "entry_name", 150, true);
PropertyListColumn typeColumn = entriesParameters.addCustomColumn("type", "entry_type",
"org.openflexo.components.widget.DMTypeInspectorWidget", 180, true);
typeColumn.setValueForParameter("format", "simplifiedStringRepresentation");
final String ALLOWS_MAPPING = FlexoLocalization.localizedForKey("mapping_definition_is_allowed_as_HTML");
final String REFUSE_MAPPING = FlexoLocalization.localizedForKey("mapping_definition_is_not_allowed_as_HTML");
final LabelParameter allowsMappingDefinitionParam = new LabelParameter("allowsMappingDefinition", "", ALLOWS_MAPPING, false);
allowsMappingDefinitionParam.setAlign(LabelWidget.CENTER);
typeParam.addValueListener(new ParameterDefinition.ValueListener<DMType>() {
@Override
public void newValueWasSet(ParameterDefinition param, DMType oldValue, DMType newValue) {
allowsMappingDefinitionParam.setValue(DMTranstyper.allowsMappingDefinitionForType(newValue) ? ALLOWS_MAPPING
: REFUSE_MAPPING);
}
});
final String DEFINE_MAPPING = FlexoLocalization.localizedForKey("define_data_mapping");
final String CUSTOM_CODE = FlexoLocalization.localizedForKey("mapping_will_be_later_encoded");
String[] relationshipTypeChoices = { DEFINE_MAPPING, CUSTOM_CODE };
final RadioButtonListParameter<String> transtyperTypeChoiceParam = new RadioButtonListParameter<String>("transtyperType",
"please_select_a_choice", DEFINE_MAPPING, relationshipTypeChoices);
transtyperTypeChoiceParam.setDepends("allowsMappingDefinition");
transtyperTypeChoiceParam.setConditional("allowsMappingDefinition=\"" + ALLOWS_MAPPING + "\"");
AskParametersDialog dialog = AskParametersDialog.createAskParametersDialog(
getProject(),
null,
action.getLocalizedName(),
FlexoLocalization.localizedForKey("please_enter_parameters_for_new_transtyper"),
new AskParametersDialog.ValidationCondition() {
@Override
public boolean isValid(ParametersModel model) {
if (entriesParameters.getValue().size() == 0) {
errorMessage = FlexoLocalization.localizedForKey("please_supply_at_least_one_entry");
return false;
} else {
for (DMTranstyperEntry entry : entriesParameters.getValue()) {
if (entry.getType() == null) {
errorMessage = FlexoLocalization.localizedForKeyWithParams("entry_($0)_has_undefined_type",
entry.getName());
return false;
}
}
return true;
}
}
}, declaringEntityParam, nameParam, typeParam, entriesParameters, allowsMappingDefinitionParam,
transtyperTypeChoiceParam);
if (dialog.getStatus() == AskParametersDialog.VALIDATE) {
action.setNewTranstyperName(nameParam.getValue());
action.setNewTranstyperType(typeParam.getValue());
action.setEntries(entriesParameters.getValue());
action.setIsMappingDefined(transtyperTypeChoiceParam.getValue().equals(DEFINE_MAPPING));
return true;
}
// Cancelled
return false;
}
};
}
@Override
protected FlexoActionFinalizer<CreateDMTranstyper> getDefaultFinalizer() {
return new FlexoActionFinalizer<CreateDMTranstyper>() {
@Override
public boolean run(EventObject e, CreateDMTranstyper action) {
((DMController) getController()).getSelectionManager().setSelectedObject(action.getNewTranstyper());
return true;
}
};
}
@Override
protected Icon getEnabledIcon() {
return DMEIconLibrary.DM_TRANSTYPER_ICON;
}
public class TranstyperEntryInfoParameter extends PropertyListParameter<DMTranstyperEntry> {
private DMEntity _declaringEntity;
public TranstyperEntryInfoParameter(String name, String label, DMEntity declaringEntity, int rowHeight, int visibleRowCount) {
super(name, label, new Vector<DMTranstyperEntry>(), rowHeight, visibleRowCount);
_declaringEntity = declaringEntity;
}
public DMTranstyperEntry addEntry() {
DMTranstyperEntry newEntry = new DMTranstyperEntry(_declaringEntity.getDMModel(), null);
newEntry.setName(FlexoLocalization.localizedForKey("entry") + (getValue().size() + 1));
getValue().add(newEntry);
return newEntry;
}
public void removeEntry(DMTranstyperEntry entry) {
getValue().remove(entry);
}
public boolean addEntryEnabled(DMTranstyperEntry entry) {
return true;
}
public boolean removeEntryEnabled(DMTranstyperEntry entry) {
return true;
}
}
}