// Дата последней ревизии $Date: 2008-02-04 18:52:02 +0300 (Пн, 04 фев 2008) $ // Дата последней проверки YYYY-MM-DD package com.bftcom.property.organizations.organization; import com.bftcom.fdt.applicationinterface.errormanager.ErrorManager; 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.model.details.DetailsList; import com.bftcom.fdt.ui.access.FormAccessor; import com.bftcom.fdt.ui.access.GridColumnAccessor; import com.bftcom.fdt.ui.access.ReflectionObjectAccessor; 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.common.actions.DefaultDeleteAction; import com.bftcom.fdt.ui.containers.common.actions.DefaultNewAction; 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.view.ViewEntityRequestDescription; import com.bftcom.fdt.ui.containers.standart.entity.view.ViewModeValidatingListener; 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.BasicUnitProvider; import com.bftcom.fdt.ui.forms.requests.ConstantUnit; import com.bftcom.fdt.ui.forms.requests.ConstructableFormProvider; import com.bftcom.fdt.ui.forms.requests.Unit; import com.bftcom.fdt.ui.forms.requests.UnitProvider; 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.jgoodies.validation.ValidationResultModel; import java.beans.PropertyChangeListener; import java.util.Iterator; import java.util.List; import javax.swing.Action; import javax.swing.JTable; import org.apache.commons.collections.IteratorUtils; import org.apache.commons.lang.Validate; /** * TODO: требуется документирование */ public class DetailGridSupport { private String[] detailsListPath; private Identifier gridId; private String toolBarName; private ColumnConfigurationProvider columnConfigurationProvider; public DetailGridSupport(String[] detailsListPath, Identifier gridId, String toolBarName, ColumnConfigurationProvider columnConfigurationProvider) { this.detailsListPath = detailsListPath; this.gridId = gridId; this.toolBarName = toolBarName; this.columnConfigurationProvider = columnConfigurationProvider; } public void addGridAccessor( UnitsMap context, FormAccessor accessor, MutableReference businessModel) { accessor.addAccessor(gridId, new FromColumnConfigurationFormAccessorProviderUnit( columnConfigurationProvider) { @Override protected MutableReference> getRegister( UnitsMap context) { return getRegisterReference(context); } }.getGridAccessor(context)); } @SuppressWarnings("unchecked") protected Register getRealRegister(UnitsMap context) { try { // DetailModel = AccessibleObject return (Register) getDetailsList(context).getDetails(); } catch (DenyException denyException) { return RegisterUtils.unmodifiable(new BasicRegister()); } } public void initGridColumns(UnitsMap context) { getGrid(context).setGridColumnsModel(new DefaultGridColumnsModel( new FromColumnsConfigurationColumnsDescriptionsProviderUnit( columnConfigurationProvider) { @Override protected MutableReference> getRegister( UnitsMap context) { return getRegisterReference(context); } }.getColumnsDescriptions(context))); } public Grid getGrid(UnitsMap context) { return (Grid) context.get(ViewUnit.class).get().getVisualComponent(gridId); } public void addConfigurationForRegister(ConstructableFormProvider formProvider) { UnitProvider provider = new BasicUnitProvider(); provider.setFormDefault(new DefaultRegisterReferenceUnit()); provider.setSpecific(ViewEntityRequestDescription.class, new ViewRegisterReferenceUnit()); formProvider.getConfiguration().addUnitProvider(RegisterReferenceUnit.class, provider); } public static MutableReference> getRegisterReference( final UnitsMap context) { return context.get(RegisterReferenceUnit.class).get(context); } private abstract class RegisterReferenceUnit extends Unit { public abstract MutableReference> get(UnitsMap context); } private class DefaultRegisterReferenceUnit extends RegisterReferenceUnit { private class ReferenceUnit extends ConstantUnit>> { public ReferenceUnit(MutableReference> value) { super(value); Validate.notNull(value, "Ссылка не можт быть null"); } } @Override public MutableReference> get(UnitsMap context) { if (!context.contains(ReferenceUnit.class)) { context.set(ReferenceUnit.class, new ReferenceUnit(createReference(context))); } return context.get(ReferenceUnit.class).get(); } protected MutableReference> createReference(UnitsMap context) { return new Reference(context); } protected class Reference extends MutableReference> { private UnitsMap context; public Reference(UnitsMap context) { Validate.notNull(context, "Контекст не может быть null"); this.context = context; } @Override public Register get() { return getRealRegister(context); } @Override public void set(Register referent) { throw new UnsupportedOperationException(); } } } private class ViewRegisterReferenceUnit extends DefaultRegisterReferenceUnit { @Override protected MutableReference> createReference( final UnitsMap context) { return new Reference( context) { private Register registerDecorator = new Register() { @Override public void add(AccessibleObject item) { throw new UnsupportedOperationException(); } @Override public AccessibleObject get(int index) { return getRealRegister(context).get(index); } @Override public AccessibleObject get(Key id) { return getRealRegister(context).get(id); } @Override public int getIndexOf(Key id) { return getRealRegister(context).getIndexOf(id); } @Override public void remove(int index) { throw new UnsupportedOperationException(); } @Override public void insert(int index, AccessibleObject item) { throw new UnsupportedOperationException(); } @Override public int size() { return getRealRegister(context).size(); } @Override public boolean isAddAllowed() { return false; } @Override public boolean isRemoveAllowed() { return false; } @Override @SuppressWarnings("unchecked") public Iterator iterator() { return IteratorUtils.unmodifiableIterator( getRealRegister(context).iterator()); } }; @Override public Register get() { if (!listenersAdded) { addListeners(); listenersAdded = true; } return registerDecorator; } private boolean listenersAdded; private void addListeners() { for (AccessibleObject entry : getRealRegister(context)) { entry.addVetoableChangeListener(new ViewModeValidatingListener()); } } }; } } public ToolBarPanel getToolBar(UnitsMap context) { return context.get(ViewUnit.class).get().getComponentByName( ToolBarPanel.class, toolBarName); } private ReflectionObjectAccessor detailsListAccessor; protected DetailsList getDetailsList(final UnitsMap context) throws DenyException { if (detailsListAccessor == null) { // Отложенное создание аксесора для списка детейлов до // того момента пока не станет известен контекст detailsListAccessor = new ReflectionObjectAccessor(new AsIsTransformator(), detailsListPath) { @Override protected AccessibleObject getRootObject(Identifier identifier) { return context.get(BusinessModelUnit.class).get().get(); } @Override public ValidationResultModel getValidationModel(Context context, Identifier identifier) { throw new UnsupportedOperationException(); } @Override public void addPropertyChangeListener(Context context, PropertyChangeListener listener, Identifier identifier) { throw new UnsupportedOperationException(); } }; } return (DetailsList) detailsListAccessor.getValue(null, null); } public void initToolBar(final UnitsMap context) { Action newActrion = new DefaultNewAction() { private static final long serialVersionUID = -1; @Override protected void performAction() { try { DetailGridSupport.getRegisterReference(context).get().add( getDetailsList(context).createNewDetail()); } catch (DenyException e) { ErrorManager.getInstance().showErrorDialog( "Добавление невозможно, т.к. чтение не разрешено"); } finally { getGrid(context).reload(); } } @Override public boolean isEnabled() { return DetailGridSupport.getRegisterReference(context).get().isAddAllowed(); } }; Action deleteAction = new DefaultDeleteAction() { private static final long serialVersionUID = -1; @Override protected void performAction() { List selectedKeys = GridPanelRegisterUtils.getSelectedObjectsIds( getGrid(context), DetailGridSupport.getRegisterReference(context).get()); for (Key selected : selectedKeys) { DetailGridSupport.getRegisterReference(context).get().remove( DetailGridSupport.getRegisterReference(context).get(). getIndexOf(selected)); } getGrid(context).reload(); } @Override public boolean isEnabled() { return DetailGridSupport.getRegisterReference(context).get().isRemoveAllowed(); } }; getToolBar(context).setActions(new Action[]{newActrion, deleteAction}); } private static class LookupGridColumnAccessor extends GridColumnAccessor { public LookupGridColumnAccessor( final Class columnsClass, final BeanPropertyInfo displayValuePropertyInfo, final MutableReference> register) { super( register, columnsClass, displayValuePropertyInfo); } @Override public void setValue(Context context, Object value, Identifier identifier) throws DenyException, VetoException { // Стандартная реализация попытается установить // значение по имени свойства. // Используется гридом для проверки того, можно ли // редактировать значение ячейки по тому // вернется ли DenyException. // Поэтому просто ничего не делаем. } } public static ColumnConfiguration createLookupColumnConfiguration( final UnitsMap context, final String title, final Class columnsClass, final BeanPropertyInfo keyPropertyInfo, final BeanPropertyInfo displayValuePropertyInfo, final Class objective, final MutableReference> register, final Identifier gridId) { GridColumnAccessor accessor = new LookupGridColumnAccessor(columnsClass, displayValuePropertyInfo, register); return createLookupColumnConfiguration(context, title, keyPropertyInfo, objective, gridId, accessor); } private static ColumnConfiguration createLookupColumnConfiguration( final UnitsMap context, final String title, final BeanPropertyInfo keyPropertyInfo, final Class objective, final Identifier gridId, final GridColumnAccessor accessor) { LookupEditor.LookupRequestHandler lookupHandler = new RegisterLookupRequestHandler( objective, context, gridId, keyPropertyInfo) { @Override protected Register getRegister( JTable table, Object value, boolean isSelected, int row, int column) { return getRegisterReference(context).get(); } }; LookupEditor editor = new LookupEditor(lookupHandler); ColumnDescription description = new ColumnDescription( title, ColumnDescription.getDefaultHeaderRenderer(), editor, new LookupRenderer()); return new ColumnConfiguration(description, accessor); } public static interface DisplayValueProvider { Object getDisplayValue( Context anotherContext, Identifier identifier, AccessibleObject registerEntry); } public static ColumnConfiguration createComputableLookupColumnConfiguration( final UnitsMap context, final String title, final Class columnsClass, final BeanPropertyInfo keyPropertyInfo, final BeanPropertyInfo displayValuePropertyInfo, final Class objective, final MutableReference> register, final Identifier gridId, Dis) { GridColumnAccessor accessor = new LookupGridColumnAccessor(columnsClass, displayValuePropertyInfo, register) { @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()); } }; return createLookupColumnConfiguration(context, title, keyPropertyInfo, objective, gridId, accessor); } } ----- Classpath: --------------------------------------------- bootPath: C:\Soft\java\jdk6u4\jre\lib\resources.jar;C:\Soft\java\jdk6u4\jre\lib\rt.jar;C:\Soft\java\jdk6u4\jre\lib\sunrsasign.jar;C:\Soft\java\jdk6u4\jre\lib\jsse.jar;C:\Soft\java\jdk6u4\jre\lib\jce.jar;C:\Soft\java\jdk6u4\jre\lib\charsets.jar;C:\Soft\java\jdk6u4\jre\classes;C:\Soft\java\jdk6u4\jre\lib\ext\dnsns.jar;C:\Soft\java\jdk6u4\jre\lib\ext\localedata.jar;C:\Soft\java\jdk6u4\jre\lib\ext\sunjce_provider.jar;C:\Soft\java\jdk6u4\jre\lib\ext\sunmscapi.jar;C:\Soft\java\jdk6u4\jre\lib\ext\sunpkcs11.jar classPath: Y:\FDT\FDT_Client\dist\FDT_Client.jar;Y:\FDT\FDT_Client\dist\lib\commons-beanutils.jar;Y:\FDT\FDT_Client\dist\lib\commons-betwixt.jar;Y:\FDT\FDT_Client\dist\lib\commons-cli.jar;Y:\FDT\FDT_Client\dist\lib\commons-collections.jar;Y:\FDT\FDT_Client\dist\lib\commons-configuration.jar;Y:\FDT\FDT_Client\dist\lib\commons-digester.jar;Y:\FDT\FDT_Client\dist\lib\commons-lang.jar;Y:\FDT\FDT_Client\dist\lib\commons-logging.jar;Y:\FDT\FDT_Client\dist\lib\FDT_Common.jar;Y:\FDT\FDT_Client\dist\lib\jcalendar.jar;Y:\FDT\FDT_Client\dist\lib\MultipleGradientPaint.jar;Y:\FDT\FDT_Client\dist\lib\swing-worker.jar;Y:\FDT\FDT_Client\dist\lib\validation.jar;Y:\FDT\FDT_Common\dist\lib\commons-codec.jar;Y:\FDT\KOT_Adapter\dist\KOT_Adapter.jar;Y:\FDT\KOT_Adapter\dist\lib\activation.jar;Y:\FDT\KOT_Adapter\dist\lib\avalon-framework.jar;Y:\FDT\KOT_Adapter\dist\lib\commons-beanutils.jar;Y:\FDT\KOT_Adapter\dist\lib\commons-betwixt.jar;Y:\FDT\KOT_Adapter\dist\lib\commons-cli.jar;Y:\FDT\KOT_Adapter\dist\lib\commons-collections.jar;Y:\FDT\KOT_Adapter\dist\lib\commons-configuration.jar;Y:\FDT\KOT_Adapter\dist\lib\commons-digester.jar;Y:\FDT\KOT_Adapter\dist\lib\commons-httpclient-2.0.jar;Y:\FDT\KOT_Adapter\dist\lib\commons-lang.jar;Y:\FDT\KOT_Adapter\dist\lib\commons-logging.jar;Y:\FDT\KOT_Adapter\dist\lib\commons-pool-1.2.jar;Y:\FDT\KOT_Adapter\dist\lib\concurrent.jar;Y:\FDT\KOT_Adapter\dist\lib\FDT_Client.jar;Y:\FDT\KOT_Adapter\dist\lib\FDT_Common.jar;Y:\FDT\KOT_Adapter\dist\lib\gdiff.jar;Y:\FDT\KOT_Adapter\dist\lib\jacob.jar;Y:\FDT\KOT_Adapter\dist\lib\jaybird-full-2.0.1.jar;Y:\FDT\KOT_Adapter\dist\lib\jcalendar.jar;Y:\FDT\KOT_Adapter\dist\lib\JSQLConnect.jar;Y:\FDT\KOT_Adapter\dist\lib\log4j-1.2.8.jar;Y:\FDT\KOT_Adapter\dist\lib\logkit.jar;Y:\FDT\KOT_Adapter\dist\lib\mail.jar;Y:\FDT\KOT_Adapter\dist\lib\MultipleGradientPaint.jar;Y:\FDT\KOT_Adapter\dist\lib\ojdbc14.jar;Y:\FDT\KOT_Adapter\dist\lib\openorb_orb-1.4.0.jar;Y:\FDT\KOT_Adapter\dist\lib\openorb_orb_omg-1.4.0.jar;Y:\FDT\KOT_Adapter\dist\lib\openorb_orb_tools-1.4.0.jar;Y:\FDT\KOT_Adapter\dist\lib\openorb_ssl-1.4.0.jar;Y:\FDT\KOT_Adapter\dist\lib\ostermillerutils.jar;Y:\FDT\KOT_Adapter\dist\lib\rainbow.jar;Y:\FDT\KOT_Adapter\dist\lib\serializer.jar;Y:\FDT\KOT_Adapter\dist\lib\swing-worker.jar;Y:\FDT\KOT_Adapter\dist\lib\tools-1.4.0.jar;Y:\FDT\KOT_Adapter\dist\lib\validation.jar;Y:\FDT\KOT_Adapter\dist\lib\xalan.jar;Y:\FDT\KOT_Adapter\dist\lib\xercesImpl.jar;Y:\FDT\KOT_Adapter\dist\lib\xml-apis.jar;Y:\FDT\KOT_Adapter\dist\lib\xmlsec-1.2.1.jar;Y:\Property\Property_Client\dist\Property_Client.jar;Y:\Property\Organizations\Organizations_Common\dist\Organizations_Common.jar;Y:\Property\Territory\Territory_Client\dist\Territory_Client.jar sourcePath: Y:\Property\Organizations\Organizations_Client\src ----- Original exception --------------------------------------------- java.lang.AssertionError at com.sun.tools.javac.comp.Attr.visitNewClass(Attr.java:1560) at com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1350) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:385) at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:402) at com.sun.tools.javac.comp.Attr.visitVarDef(Attr.java:755) at com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:713) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:385) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:422) at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:438) at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:788) at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:769) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:385) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:422) at com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:701) at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:657) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:385) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:422) at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:2781) at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:2707) at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:2641) at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1064) at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1040) at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:437) at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:417) at org.netbeans.api.java.source.JavaSource.moveToPhase(JavaSource.java:1308) at org.netbeans.api.java.source.CompilationInfoImpl.toPhase(CompilationInfoImpl.java:280) at org.netbeans.api.java.source.CompilationController.toPhase(CompilationController.java:80) at org.netbeans.modules.editor.java.JavaCompletionItem$ClassItem$1.run(JavaCompletionItem.java:709) at org.netbeans.modules.editor.java.JavaCompletionItem$ClassItem$1.run(JavaCompletionItem.java:708) at org.netbeans.api.java.source.JavaSource.runUserActionTask(JavaSource.java:665) at org.netbeans.modules.editor.java.JavaCompletionItem$ClassItem.substituteText(JavaCompletionItem.java:706) at org.netbeans.modules.editor.java.JavaCompletionItem.defaultAction(JavaCompletionItem.java:244) at org.netbeans.modules.editor.completion.CompletionImpl.dispatchKeyEvent(CompletionImpl.java:549) at org.netbeans.modules.editor.completion.CompletionImpl.keyPressed(CompletionImpl.java:350) at java.awt.AWTEventMulticaster.keyPressed(AWTEventMulticaster.java:233) at java.awt.AWTEventMulticaster.keyPressed(AWTEventMulticaster.java:232) at java.awt.Component.processKeyEvent(Component.java:5999) at javax.swing.JComponent.processKeyEvent(JComponent.java:2799) at java.awt.Component.processEvent(Component.java:5818) at java.awt.Container.processEvent(Container.java:2058) at java.awt.Component.dispatchEventImpl(Component.java:4413) at java.awt.Container.dispatchEventImpl(Container.java:2116) at java.awt.Component.dispatchEvent(Component.java:4243) at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848) at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:697) at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:962) at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:834) at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:661) at java.awt.Component.dispatchEventImpl(Component.java:4285) at java.awt.Container.dispatchEventImpl(Container.java:2116) at java.awt.Window.dispatchEventImpl(Window.java:2440) at java.awt.Component.dispatchEvent(Component.java:4243) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)