// Дата последней ревизии $Date: 2008-03-20 19:46:54 +0300 (Чт, 20 мар 2008) $ // Дата последней проверки YYYY-MM-DD package com.bftcom.property.organizations.organization; import com.bftcom.fdt.applicationinterface.ApplicationInterface; import com.bftcom.fdt.applicationinterface.errormanager.ErrorManager; import com.bftcom.fdt.exception.BusinessLogicException; import com.bftcom.fdt.model.AccessibleObject; import com.bftcom.fdt.model.BasicRegister; import com.bftcom.fdt.model.BeanPropertyInfo; import com.bftcom.fdt.model.BusinessObjectModel; import com.bftcom.fdt.model.DenyException; import com.bftcom.fdt.model.Register; import com.bftcom.fdt.model.RegisterUtils; import com.bftcom.fdt.model.VetoException; import com.bftcom.fdt.ui.access.ComboBoxAccessor; import com.bftcom.fdt.ui.access.FormAccessor; import com.bftcom.fdt.ui.access.GridColumnAccessor; import com.bftcom.fdt.ui.access.transformators.AsIsTransformator; import com.bftcom.fdt.ui.components.base.Identifier; import com.bftcom.fdt.ui.components.grid.ColumnDescription; import com.bftcom.fdt.ui.components.grid.DefaultGridColumnsModel; import com.bftcom.fdt.ui.components.grid.Grid; import com.bftcom.fdt.ui.components.grid.LookupEditor; import com.bftcom.fdt.ui.components.grid.LookupRenderer; import com.bftcom.fdt.ui.containers.LookupFieldController; import com.bftcom.fdt.ui.containers.StandardLookupFieldController; import com.bftcom.fdt.ui.containers.common.actions.DefaultDeleteAction; import com.bftcom.fdt.ui.containers.common.actions.DefaultNewAction; import com.bftcom.fdt.ui.containers.standart.BeforeStandartVisualPropertiesUnit; import com.bftcom.fdt.ui.containers.standart.BusinessModelClassUnit; import com.bftcom.fdt.ui.containers.standart.LookupControllersProviderUnit; import com.bftcom.fdt.ui.containers.standart.ToolBarPanel; import com.bftcom.fdt.ui.containers.standart.ViewUnit; import com.bftcom.fdt.ui.containers.standart.entity.BusinessModelUnit; import com.bftcom.fdt.ui.containers.standart.entity.StandardEntityFormAccessorProviderUnit; import com.bftcom.fdt.ui.containers.standart.entity.StandardEntityFormProvider; import com.bftcom.fdt.ui.containers.standart.entity.createcopy.CopyBusinessModelUnit; import com.bftcom.fdt.ui.containers.standart.gridpanel.GridPanelRegisterUtils; import com.bftcom.fdt.ui.containers.standart.gridpanel.RegisterLookupRequestHandler; import com.bftcom.fdt.ui.containers.standart.register.ColumnConfiguration; import com.bftcom.fdt.ui.containers.standart.register.ColumnConfigurationProvider; import com.bftcom.fdt.ui.containers.standart.register.FromColumnConfigurationFormAccessorProviderUnit; import com.bftcom.fdt.ui.containers.standart.register.FromColumnsConfigurationColumnsDescriptionsProviderUnit; import com.bftcom.fdt.ui.forms.requests.ConstantUnit; import com.bftcom.fdt.ui.forms.requests.ConstructableFormProvider; import com.bftcom.fdt.ui.forms.requests.TargetFormClassUnit; import com.bftcom.fdt.ui.forms.requests.UnitsMap; import com.bftcom.fdt.util.MutableReference; import com.bftcom.fdt.util.context.Context; import com.bftcom.fdt.util.keys.Key; import com.bftcom.property.organizations.economicactivity.EconomicActivityBM; import com.bftcom.property.organizations.economicactivity.EconomicActivityRegisterForm; import com.bftcom.property.organizations.legalform.LegalFormBM; import com.bftcom.property.organizations.legalform.LegalFormRegisterForm; import com.bftcom.property.organizations.organization.RolesDictionary.RolesBM; import com.bftcom.property.organizations.personnel.PersonnelBM; import com.bftcom.property.organizations.personnel.PersonnelRegisterForm; import com.bftcom.property.organizations.rank.RankBM; import com.bftcom.property.organizations.rank.RankRegisterForm; import com.bftcom.property.territory.territories.TerritoryBM; import com.bftcom.property.territory.territories.TerritoryRegisterForm; import java.util.List; import java.util.logging.Logger; import javax.swing.Action; import javax.swing.JTable; import org.apache.commons.lang.Validate; /** * TODO: требуется документирование * TODO: следует упростить код подготавливающий ColumnConfiguration для колонок детейлов */ public class OrganizationEntityFormsProvider extends ConstructableFormProvider { public static final BeanPropertyInfo TERRITORY_CAPTION = TerritoryBM.NAME.addReference("territory"); public static final BeanPropertyInfo TERRITORY_CODE = TerritoryBM.CODE.addReference("territory"); public static final BeanPropertyInfo LEGALFORM_CODE = LegalFormBM.CODE.addReference("legalForm"); public static final BeanPropertyInfo ACTIVITY_CODE = EconomicActivityBM.CODE.addReference("economicActivity"); public static final BeanPropertyInfo ROLE_CAPTION = RolesBM.CODE.addReference("role"); public OrganizationEntityFormsProvider() { final ColumnConfigurationProvider contactPersonColumnConfigurationProvider = new ColumnConfigurationProvider() { @Override protected ColumnConfiguration[] createColumnConfiguration(final UnitsMap context, MutableReference> register) { return new ColumnConfiguration[]{ // new ColumnConfiguration( new ColumnDescription( "Контактное лицо", ColumnDescription.getDefaultHeaderRenderer(), new LookupEditor( new RegisterLookupRequestHandler( PersonnelRegisterForm.class, context, OrganizationEntityForm.CONTACT_PERSON_GRID_ID, ContactPersonBM.PERSONNEL_ID) { // FIXME copy/paste @Override @SuppressWarnings("unchecked") protected Register getRegister( JTable table, Object value, boolean isSelected, int row, int column) { try { return (Register) (getBM(context)).getContactPerson(). getDetails(); } catch (DenyException ex) { logger.warning( "DenyException при запросе реестра контактных лиц в обработчике запроса выбора из реестра"); return RegisterUtils.unmodifiable( new BasicRegister()); } } }), new LookupRenderer()), new GridColumnAccessor(register, new AsIsTransformator(), "не используется") { @Override public Object getValue(Context anotherContext, Identifier identifier) throws DenyException { PersonnelBM personnel = ((ContactPersonBM) getRootObject( identifier)).getPersonnel(); if (personnel == null) { return ""; } return makeFullName( personnel.getFirstName(), personnel.getLastName(), personnel.getPatronymic()); } @Override public void setValue(Context context, Object value, Identifier identifier) throws DenyException, VetoException { // Стандартная реализация попытается установить // значение по имени свойства. // Используется гридом для проверки того, можно ли // редактировать значение ячейки по тому // вернется ли DenyException. // Поэтому просто ничего не делаем. } }), // new ColumnConfiguration( new ColumnDescription("Должность контактного лица", ColumnDescription.getDefaultHeaderRenderer(), new LookupEditor( new RegisterLookupRequestHandler( RankRegisterForm.class, context, OrganizationEntityForm.CONTACT_PERSON_GRID_ID, ContactPersonBM.RANK_ID) { @Override @SuppressWarnings("unchecked") protected Register getRegister( JTable table, Object value, boolean isSelected, int row, int column) { try { return (Register) (getBM(context)).getContactPerson(). getDetails(); } catch (DenyException ex) { logger.warning( "DenyException при запросе реестра контактных лиц в обработчике запроса выбора из реестра"); return RegisterUtils.unmodifiable( new BasicRegister()); } } }), new LookupRenderer()), new GridColumnAccessor(register, String.class, RankBM.NAME.addReference("rank")) { // FIXME copy/paste @Override public void setValue(Context context, Object value, Identifier identifier) throws DenyException, VetoException { // Стандартная реализация попытается установить // значение по имени свойства. // Используется гридом для проверки того, можно ли // редактировать значение ячейки по тому // вернется ли DenyException. // Поэтому просто ничего не делаем. } }), // new ColumnConfiguration( new ColumnDescription("Контактный телефон", String.class), new GridColumnAccessor(register, String.class, PersonnelBM.PHONE.addReference("personnel"))), // }; } }; StandardEntityFormProvider.addStandardConfiguration(this, new TargetFormClassUnit(OrganizationEntityForm.class), new BusinessModelClassUnit(OrganizationBM.class), new CopyBusinessModelUnit() { @Override public void copyBusinessModel(BusinessObjectModel BOMFrom, BusinessObjectModel BOMTo) { OrganizationBM to = (OrganizationBM) BOMTo; OrganizationBM from = (OrganizationBM) BOMFrom; try { to.setActivityId(from.getActivityId()); to.setAddress(from.getAddress()); to.setCaption(from.getCaption()); to.setDescription(from.getDescription()); to.setKpp(from.getKpp()); to.setLawAddress(from.getLawAddress()); to.setLegalFormId(from.getLegalFormId()); to.setName(from.getName()); to.setOkonh(from.getOkonh()); to.setOkpo(from.getOkpo()); to.setOrganisationRole(from.getOrganisationRole()); to.setTaxInspectionNo(from.getTaxInspectionNo()); to.setTaxInspectionDate(from.getTaxInspectionDate()); to.setTaxcode(from.getTaxcode()); to.setTerritoryId(from.getTerritoryId()); } catch (DenyException ex) { throw new RuntimeException( String.format("Ошибка при создании копии объекта"), ex); } catch (VetoException ex) { throw new RuntimeException( String.format("Ошибка при создании копии объекта"), ex); } } }, new StandardEntityFormAccessorProviderUnit() { @Override protected void addFieldAccessors(UnitsMap context, FormAccessor accessor, MutableReference businessModel) { accessor.addAccessor(businessModel, OrganizationEntityForm.NAME, OrganizationBM.NAME); accessor.addAccessor(businessModel, OrganizationEntityForm.CAPTION, OrganizationBM.CAPTION); accessor.addAccessor(businessModel, OrganizationEntityForm.DESCRIPTION, OrganizationBM.DESCRIPTION); accessor.addAccessor(businessModel, OrganizationEntityForm.LAWADDRESS, OrganizationBM.LAWADDRESS); accessor.addAccessor(businessModel, OrganizationEntityForm.ADDRESS, OrganizationBM.ADDRESS); accessor.addAccessor(businessModel, OrganizationEntityForm.TAXCODE, OrganizationBM.TAXCODE); accessor.addAccessor(businessModel, OrganizationEntityForm.KPP, OrganizationBM.KPP); accessor.addAccessor(businessModel, OrganizationEntityForm.OKONH, OrganizationBM.OKONH); accessor.addAccessor(businessModel, OrganizationEntityForm.TAX_INSPECTION_NUMBER, OrganizationBM.TAXINSPECTIONNUMBER); accessor.addAccessor(businessModel, OrganizationEntityForm.TAX_INSPECTION_DATE, OrganizationBM.TAXINSPECTIONDATE); accessor.addAccessor(businessModel, OrganizationEntityForm.TERRITORY_CAPTION, TERRITORY_CAPTION); accessor.addAccessor(businessModel, OrganizationEntityForm.LEGALFORM_CODE, LEGALFORM_CODE); accessor.addAccessor(businessModel, OrganizationEntityForm.ACTIVITY_CODE, ACTIVITY_CODE); accessor.addAccessor(businessModel, OrganizationEntityForm.TERRITORY_CODE, TERRITORY_CODE); accessor.addAccessor(businessModel, OrganizationEntityForm.OKPO, OrganizationBM.OKPO); accessor.addAccessor(OrganizationEntityForm.CONTACT_PERSON_GRID_ID, new FromColumnConfigurationFormAccessorProviderUnit( contactPersonColumnConfigurationProvider) { @Override protected MutableReference> getRegister( UnitsMap context) { return getRegisterReference(context); } }.getGridAccessor(context)); try { Register roles = new BasicRegister(); roles.add(new RolesBM(null, " ")); for (BusinessObjectModel role : ApplicationInterface.getInstance(). getRegister(RolesBM.class)) { roles.add((RolesBM) role); } accessor.addAccessor( OrganizationEntityForm.ROLE.getId(), new ComboBoxAccessor( roles, "name", businessModel, OrganizationBM.ROLE.getPath())); } catch (BusinessLogicException ex) { throw ErrorManager.getInstance().onBusinessLogicException(ex, null); } } }, "Просмотр организации", "Создание организации", "Создание организации", "Редактирование организации"); getConfiguration().getUnitProvider(LookupControllersProviderUnit.class).setFormDefault( new LookupControllersProviderUnit() { @Override public LookupFieldController[] getLookupControllers(final UnitsMap context) { return new LookupFieldController[]{ new StandardLookupFieldController(context, LegalFormRegisterForm.class, OrganizationEntityForm.LEGALFORM_ID.getId(), OrganizationBM.LEGALFORM_ID), new StandardLookupFieldController(context, EconomicActivityRegisterForm.class, OrganizationEntityForm.ACTIVITY_ID.getId(), OrganizationBM.ACTIVITY_ID), new StandardLookupFieldController(context, TerritoryRegisterForm.class, OrganizationEntityForm.TERRITORY_ID.getId(), OrganizationBM.TERRITORY_ID) }; } }); getConfiguration().getUnitProvider(BeforeStandartVisualPropertiesUnit.class).setFormDefault( new BeforeStandartVisualPropertiesUnit() { @Override public void doAdditionalWork(UnitsMap context) { initContactPersonsGrid(context); initContactPersonsToolBar(context); } private void initContactPersonsToolBar(final UnitsMap context) { ToolBarPanel toolBar = context.get(ViewUnit.class).get().getComponentByName( ToolBarPanel.class, OrganizationEntityForm.CONTACT_PERSONS_TOOLBAR); toolBar.setActions( new Action[]{ new DefaultNewAction() { private static final long serialVersionUID = -1; @Override protected void performAction() { try { getBM(context).getContactPerson().getDetails(). add(getBM(context).getContactPerson(). createNewDetail()); } catch (DenyException ex) { ErrorManager.getInstance().showErrorMessage("Добавление не разрешено " + ex.getLocalizedMessage()); }finally{ getGrid(context).reload(); } } }, new DefaultDeleteAction() { private static final long serialVersionUID = -1; @Override protected void performAction() { try { Register details = getBM( context).getContactPerson().getDetails(); List selectedKeys = GridPanelRegisterUtils. getSelectedObjectsIds(getGrid(context), details); for (Key selected : selectedKeys) { details.remove(details.getIndexOf(selected)); } } catch (DenyException ex) { ErrorManager.getInstance().showErrorMessage("Удаление не разрешено " + ex.getLocalizedMessage()); }finally{ getGrid(context).reload(); } } }, }); } private void initContactPersonsGrid(UnitsMap context) { if (getParent() != null) { ((BeforeStandartVisualPropertiesUnit) getParent()).doAdditionalWork( context); } ColumnDescription[] columnsDescriptions = new FromColumnsConfigurationColumnsDescriptionsProviderUnit( contactPersonColumnConfigurationProvider) { @Override protected MutableReference> getRegister( UnitsMap context) { return getRegisterReference(context); } }.getColumnsDescriptions(context); getGrid(context).setGridColumnsModel(new DefaultGridColumnsModel( columnsDescriptions)); } }); getco } private static class ContactPersonRegisterUnit extends ConstantUnit>> { public ContactPersonRegisterUnit(MutableReference> value) { super(value); Validate.notNull(value, " null"); } } private static MutableReference> getRegisterReference( final UnitsMap context) { if (!context.contains(ContactPersonRegisterUnit.class)) { context.set(ContactPersonRegisterUnit.class, new ContactPersonRegisterUnit( new MutableReference>() { @Override @SuppressWarnings("unchecked") public Register get() { try { return (Register) getBM(context).getContactPerson().getDetails(); } catch (DenyException denyException) { return RegisterUtils.unmodifiable( new BasicRegister()); } } @Override public void set(Register referent) { throw new UnsupportedOperationException(); } })); } return context.get(ContactPersonRegisterUnit.class).get(); } public static String makeFullName(String name, String surname, String patronymic) { return new StringBuilder(surname).append(" "). append(name).append(" ").append(patronymic). toString(); } private final static Logger logger = Logger.getLogger(OrganizationEntityFormsProvider.class. getName()); private static OrganizationBM getBM(UnitsMap context) { return (OrganizationBM) context.get(BusinessModelUnit.class).get().get(); } private static Grid getGrid(UnitsMap context) { return (Grid) context.get(ViewUnit.class).get().getVisualComponent( OrganizationEntityForm.CONTACT_PERSON_GRID_ID); } }