On a current project we had been struggling with this problem fairly often: 'Undefined Object does not understand RowSeparatorHeight'. We determined that it occurs only in AIX under various scenarios, one of which is when a container has just enough items in it that it is full (without a scroll bar) plus a partial row sometimes referred to as the bottom margin item. This error is within EwTableList. We have made a fix for this that initializes the marginItem in cases where it is being instantiated through lazy initialization.
marginItem
"Answer a fake item which represents the bottom margin.
This value is lazily-initialized."
marginItem isNil ifTrue: [
marginItem := self visibleItemNodeClass new.
self adjustMarginItem].
^marginItem
We made a simple test window that recreates this problem every time in AIX.
We are hoping that this fix will be included in the next VA release.
I tried to include the class as an attachment but for some strange reason this forum doesn't accept attachments even with extensions .st, .txt, or .doc. I have included the class fileout text below instead.
AbtAppBldrView subclass: #MyClass1
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''!
!MyClass1 class privateMethods !
_PRAGMA_IS_
"%%PRAGMA DECLARE
(name: IS_MyClass1 isPool: true isConstant: false)
(pool: IS_MyClass1 declarations: (
(name: IS_instanceInterfaceSpec isConstant: false)
))"!
abtPrimFlushInterfaceSpecCache
IS_MyClass1 associationsDo: [: poolDictionaryAssoc | poolDictionaryAssoc value: nil].
super abtPrimFlushInterfaceSpecCache!
abtUntranslatedConstants
"** Do not modify or delete ** See: AbtAppBldrPart class>>#about_abtUntranslatedConstants"
^#('column 1')!
IS_instanceInterfaceSpec
"Private - ** Warning ** This method is generated by VisualAge and should not
be modified or deleted. This method is responsible for returning a featureSpec
that describes the implementation of a particular feature of the receiver"
^IS_MyClass1::IS_instanceInterfaceSpec notNil
ifTrue: [IS_MyClass1::IS_instanceInterfaceSpec]
ifFalse: [
IS_MyClass1::IS_instanceInterfaceSpec := AbtInterfaceSpec new]! !
!MyClass1 publicMethods !
asdf
^6!
items
^OrderedCollection new
add: 'abcdef';
add: 'abcdef2';
add: 'abcdef3';
add: 'abcdef4';
add: 'abcdef5';
add: 'abcdef6';
yourself! !
!MyClass1 privateMethods !
abtBuildInternals
"** Do not modify or delete ** See: AbtAppBldrPart class>>#about_abtBuildInternals"
| gui window containerDetails1 containerDetailsColumn1 pushButton1 conn1 conn11 conn2 |
gui := self class abtSeparatedConstants.
window := AbtShellView abtCreatePart: 'Window' parent: nil owner: self.
containerDetails1 :=
AbtContainerDetailsView abtCreatePart: 'Container Details1' parent: window.
containerDetailsColumn1 :=
AbtContainerDetailsColumn
abtCreatePart: 'Container Details Column1'
parent: containerDetails1.
pushButton1 := AbtPushButtonView abtCreatePart: 'Push Button1' parent: window.
self primaryPart: window.
window framingSpec: (
AbtViewAttachmentConstraint new
leftEdge: (AbtEdgeConstant new offset: 30);
rightEdge: (AbtEdgeConstant new offset: 533);
topEdge: (AbtEdgeConstant new offset: 30);
bottomEdge: (AbtEdgeConstant new offset: 426)).
containerDetails1
framingSpec: (
AbtViewAttachmentConstraint new
leftEdge: (
AbtRunEdgeAttachmentConstraint new
attachment: XmATTACHFORM;
offset: 56);
rightEdge: (
AbtRunEdgeAttachmentConstraint new
attachment: XmATTACHSELFOPPOSITE;
offset: 320);
topEdge: (
AbtRunEdgeAttachmentConstraint new
attachment: XmATTACHFORM;
offset: 39);
bottomEdge: (
AbtRunEdgeAttachmentConstraint new
attachment: XmATTACHSELFOPPOSITE;
offset: 180));
rowSeparators: false.
containerDetailsColumn1
width: 301;
attributeName: nil;
heading: (gui at: 1) " 'column 1' ";
abtEditPolicyItems: (OrderedCollection new yourself).
pushButton1 framingSpec: (
AbtViewAttachmentConstraint new
leftEdge: (
AbtRunEdgeAttachmentConstraint new
attachment: XmATTACHFORM;
offset: 312);
rightEdge: (AbtRunEdgeAttachmentConstraint new attachment: XmATTACHNONE);
topEdge: (
AbtRunEdgeAttachmentConstraint new
attachment: XmATTACHFORM;
offset: 358);
bottomEdge: (AbtRunEdgeAttachmentConstraint new attachment: XmATTACHNONE)).
pushButton1
abtWhenPrimitive: #clicked
perform: (
conn1 :=
AbtEventToActionConnection new
source: pushButton1;
eventName: #clicked;
actionProvider: self
variableFeatureName: #closeWidget
featureSelector: #IS_closeWidget).
self attributeConnections add: (
conn11 :=
AbtAttributeToCodeHookConnection new
connectSource: containerDetails1
featureName: #items
feature: AbtContainerDetailsView IS_items
toTarget: self
selector: #items).
self attributeConnections add: (
conn2 :=
AbtAttributeToCodeHookConnection new
connectSource: containerDetails1
featureName: #selectionIndex
feature: AbtContainerDetailsView IS_selectionIndex
toTarget: self
selector: #asdf).
self initializeAttributeConnections.
self finalInitialize! !
MyClass1 initializeAfterLoad!