I´m continue working on that widget. Now works in design time, integrated in UIBuilder tool. Adding rows -> http://www.youtube.com/watch?v=Dt0yz0JyBCg Master detail -> http://www.youtube.com/watch?v=FTW9Byqdgbk My main problem now is the speed. Is very very slow; one minute is needed for load 5000 rows (!!!) With MessageTally I see the next response... - 81732 tallies, 82014 msec. **Tree** -------------------------------- Process: (40s) 3296: nil -------------------------------- 50.3% {41253ms} CLGrid>>dataSource: 44.5% {36496ms} CLGrid>>addRow |21.7% {17797ms} CLScrollPanelContainer(Morph)>>addMorphBack: | |21.7% {17797ms} CLScrollPanelContainer(CLPanel)>>privateAddMorph:atIndex: | | 21.6% {17715ms} CLScrollPanelContainer(Morph)>>privateAddMorph:atIndex: | | 13.8% {11318ms} CLScrollPanelContainer(Morph)>>privateInvalidateMorph: | | |13.5% {11072ms} CLGridRow(Morph)>>fullBounds | | | 13.5% {11072ms} CLGridRow(Morph)>>doLayoutIn: | | | 8.6% {7053ms} TableLayout>>layout:in: | | | |8.6% {7053ms} TableLayout>>layoutLeftToRight:in: | | | | 5.8% {4757ms} CLGridCell(Morph)>>layoutInBounds: | | | | |5.3% {4347ms} CLGridCell(Morph)>>bounds: | | | | | 2.6% {2132ms} CLGridCell(Morph)>>position: | | | | | |1.5% {1230ms} CLGridCell(Morph)>>invalidRect: | | | | | | 1.5% {1230ms} CLGridCell(Morph)>>invalidRect:from: | | | | | | 1.5% {1230ms} CLGridRow(Morph)>>invalidRect:from: | | | | | | 1.1% {902ms} CLScrollPanelContainer(Morph)>>invalidRect:from: | | | | | 2.6% {2132ms} CLGridCell>>extent: | | | | | 2.4% {1968ms} CLGridCell(Morph)>>extent: | | | | | 1.6% {1312ms} CLGridCell(Morph)>>changed | | | | 2.7% {2214ms} CLGridCell(Morph)>>minExtent | | | 4.2% {3445ms} CLGridRow(Morph)>>adjustLayoutBounds | | | 3.9% {3199ms} CLGridRow(Morph)>>submorphBounds | | | 3.9% {3199ms} CLGridCell(Morph)>>fullBounds | | | 3.6% {2953ms} CLGridCell(Morph)>>doLayoutIn: | | | 2.0% {1640ms} TableLayout>>layout:in: | | | 1.8% {1476ms} TableLayout>>layoutTopToBottom:in: | | 7.7% {6315ms} CLGridRow(Morph)>>intoWorld: | | 7.7% {6315ms} CLGridCell(Morph)>>intoWorld: | | 7.6% {6233ms} CLCheckButton(Morph)>>intoWorld: | | 7.4% {6069ms} PasteUpMorph>>startStepping: | | 7.4% {6069ms} PasteUpMorph>>startStepping:at:selector:arguments:stepTime: | | 7.4% {6069ms} WorldState>>startStepping:at:selector:arguments:stepTime: | | 7.4% {6069ms} WorldState>>stopStepping:selector: | | 5.8% {4757ms} Heap(SequenceableCollection)>>select: | | |3.9% {3199ms} Heap>>at: | | |1.8% {1476ms} primitives | | 1.6% {1312ms} primitives |14.8% {12138ms} CLGridRow>>buildCellsStructureFrom: | |14.8% {12138ms} CLGridRow>>addCell: | | 14.8% {12138ms} CLGridRow>>pvtAddCell:ofType: | | 5.7% {4675ms} CLGridCell>>setColumn: | | |5.7% {4675ms} CLGridCell>>pvtBuildValueControl | | | 3.0% {2460ms} CLLabel class(Behavior)>>new | | | 2.0% {1640ms} CLCheckButton(CheckboxButtonMorph)>>initialize | | | |1.1% {902ms} CLCheckButton>>enabled: | | | | 1.1% {902ms} CLCheckButton(CheckboxButtonMorph)>>enabled: | | | 1.0% {820ms} CLLabel>>initialize | | 4.0% {3281ms} CLGridCell class(Behavior)>>new | | |4.0% {3281ms} CLGridCell>>initialize | | 2.4% {1968ms} CLGridCell(Morph)>>width: | | |2.4% {1968ms} CLGridCell>>extent: | | | 2.1% {1722ms} CLGridCell(Morph)>>extent: | | | 1.9% {1558ms} CLGridCell(Morph)>>changed | | | 1.4% {1148ms} CLGridCell(Morph)>>privateFullBounds | | 1.4% {1148ms} CLGridCell(Morph)>>borderColor: | | 1.3% {1066ms} CLGridCell(Morph)>>changed | | 1.3% {1066ms} CLGridCell(Morph)>>privateFullBounds |5.4% {4429ms} CLGridRow(CLPanel)>>color: | |5.4% {4429ms} CLGridRow(Morph)>>color: | | 5.4% {4429ms} CLGridRow(Morph)>>changed | | 5.4% {4429ms} CLGridRow(Morph)>>privateFullBounds | | 5.2% {4265ms} CLGridRow(Morph)>>submorphBounds | | 5.2% {4265ms} CLGridCell(Morph)>>fullBounds | | 4.8% {3937ms} CLGridCell(Morph)>>doLayoutIn: | | 3.3% {2706ms} TableLayout>>layout:in: | | 3.1% {2542ms} TableLayout>>layoutTopToBottom:in: | | 1.8% {1476ms} CLLabel(Morph)>>layoutInBounds: |1.3% {1066ms} CLGridRow class(Behavior)>>new | 1.3% {1066ms} CLGridRow>>initialize 5.6% {4593ms} CLGridRow>>listObject: 5.4% {4429ms} CLGridCell>>value: 4.3% {3527ms} CLLabel>>value: |4.3% {3527ms} CLLabel>>text: | 4.3% {3527ms} CLLabel(StringMorph)>>contents: | 4.3% {3527ms} CLLabel(StringMorph)>>fitContents | 4.1% {3363ms} CLLabel>>extent: | 4.0% {3281ms} CLLabel(Morph)>>extent: | 3.4% {2788ms} CLLabel(Morph)>>changed | 3.2% {2624ms} CLLabel(Morph)>>invalidRect: | 3.2% {2624ms} CLLabel(Morph)>>invalidRect:from: | 3.1% {2542ms} CLGridCell(Morph)>>invalidRect:from: | 2.7% {2214ms} CLGridRow(Morph)>>invalidRect:from: | 2.4% {1968ms} CLScrollPanelContainer(Morph)>>invalidRect:from: | 2.2% {1804ms} TransformMorph>>invalidRect:from: | 1.4% {1148ms} TransformMorph(Morph)>>invalidRect:from: | 1.4% {1148ms} CLScrollpanel(Morph)>>invalidRect:from: | 1.2% {984ms} CLGrid(Morph)>>invalidRect:from: 1.1% {902ms} CLCheckButton>>value: 1.1% {902ms} CLCheckButton(CheckboxButtonMorph)>>state: 30.5% {25014ms} CLGrid(Morph)>>openInWindowLabeled: 30.5% {25014ms} CLGrid(Morph)>>openInWindowLabeled:inWorld: 15.5% {12712ms} PasteUpMorph(Morph)>>addMorph: |15.5% {12712ms} PasteUpMorph>>addMorphFront: | 15.5% {12712ms} PasteUpMorph(Morph)>>addMorphInFrontOfLayer: | 15.5% {12712ms} PasteUpMorph(Morph)>>addMorph:inFrontOf: | 15.5% {12712ms} PasteUpMorph(Morph)>>privateAddMorph:atIndex: | 15.5% {12712ms} SystemWindow(Morph)>>intoWorld: | 15.5% {12712ms} CLGrid(Morph)>>intoWorld: | 15.5% {12712ms} CLGridRowHeader(Morph)>>intoWorld: | 15.5% {12712ms} CLGridCellHeader(Morph)>>intoWorld: | 15.5% {12712ms} CLScrollPanelContainer(Morph)>>intoWorld: | 15.5% {12712ms} CLGridRow(Morph)>>intoWorld: | 15.4% {12630ms} CLGridCell(Morph)>>intoWorld: | 15.4% {12630ms} CLCheckButton(Morph)>>intoWorld: | 15.3% {12548ms} PasteUpMorph>>startStepping: | 15.3% {12548ms} PasteUpMorph>>startStepping:at:selector:arguments:stepTime: | 15.3% {12548ms} WorldState>>startStepping:at:selector:arguments:stepTime: | 15.3% {12548ms} WorldState>>stopStepping:selector: | 9.1% {7463ms} Heap(SequenceableCollection)>>select: | |6.4% {5249ms} Heap>>at: | |2.7% {2214ms} primitives | 3.4% {2788ms} Heap(Collection)>>removeAll: | |3.4% {2788ms} Heap(Collection)>>remove: | | 3.4% {2788ms} Heap>>remove:ifAbsent: | | 1.7% {1394ms} StepMessage(MessageSend)>>= | | |1.7% {1394ms} primitives | | 1.7% {1394ms} primitives | 2.8% {2296ms} primitives 14.8% {12138ms} PasteUpMorph>>startSteppingSubmorphsOf: 14.6% {11974ms} CLCheckButton(Morph)>>arrangeToStartSteppingIn: 14.4% {11810ms} PasteUpMorph>>startStepping: 14.4% {11810ms} PasteUpMorph>>startStepping:at:selector:arguments:stepTime: 14.4% {11810ms} WorldState>>startStepping:at:selector:arguments:stepTime: 14.4% {11810ms} WorldState>>stopStepping:selector: 9.1% {7463ms} Heap(SequenceableCollection)>>select: |6.5% {5331ms} Heap>>at: |2.5% {2050ms} primitives 2.9% {2378ms} Heap(Collection)>>removeAll: |2.9% {2378ms} Heap(Collection)>>remove: | 2.9% {2378ms} Heap>>remove:ifAbsent: | 1.5% {1230ms} primitives | 1.4% {1148ms} StepMessage(MessageSend)>>= 2.4% {1968ms} primitives 7.9% {6479ms} CLGrid>>relocatePanels 7.9% {6479ms} CLScrollPanelContainer(Morph)>>position: 7.4% {6069ms} CLScrollPanelContainer(Morph)>>fullBounds 7.4% {6069ms} CLScrollPanelContainer(Morph)>>doLayoutIn: 7.4% {6069ms} TableLayout>>layout:in: 7.4% {6069ms} TableLayout>>layoutTopToBottom:in: 4.3% {3527ms} CLGridRow(Morph)>>minExtent |4.1% {3363ms} TableLayout>>minExtentOf:in: | 4.1% {3363ms} TableLayout>>minExtentHorizontal: | 4.0% {3281ms} CLGridCell(Morph)>>minExtent | 1.9% {1558ms} CLGridCell(Morph)>>fullBounds | |1.8% {1476ms} CLGridCell(Morph)>>doLayoutIn: | 1.3% {1066ms} TableLayout>>minExtentOf:in: | 1.2% {984ms} TableLayout>>minExtentVertical: | 1.1% {902ms} CLLabel(Morph)>>minExtent 3.1% {2542ms} CLGridRow(Morph)>>layoutInBounds: 2.4% {1968ms} CLGridRow(Morph)>>doLayoutIn: 1.9% {1558ms} TableLayout>>layout:in: 1.9% {1558ms} TableLayout>>layoutLeftToRight:in: 1.7% {1394ms} CLGridCell(Morph)>>minExtent **Leaves** 16.8% {13778ms} Heap>>at: 7.0% {5741ms} WeakActionSequence(SequenceableCollection)>>select: 6.9% {5659ms} Array(SequenceableCollection)>>identityIndexOf:ifAbsent: 6.8% {5577ms} WorldState>>stopStepping:selector: 3.7% {3035ms} Array(SequenceableCollection)>>identityIndexOf: 3.3% {2706ms} SmallIdentityDictionary(SmallDictionary)>>at:ifAbsent: 3.3% {2706ms} MorphExtension>>valueOfProperty:ifAbsent: 3.2% {2624ms} Heap>>remove:ifAbsent: 3.1% {2542ms} StepMessage(MessageSend)>>= 2.4% {1968ms} SmallIdentityDictionary>>findIndexForKey: 1.7% {1394ms} Rectangle>>setOrigin:corner: 1.6% {1312ms} Point>>+ 1.6% {1312ms} Rectangle class>>origin:corner: 1.4% {1148ms} RectangleMorph(Morph)>>valueOfProperty:ifAbsent: 1.3% {1066ms} Point>>- **Memory** old +20,789,788 bytes young +112,272 bytes used +20,902,060 bytes free -1,073,416 bytes **GCs** full 2 totalling 495ms (1.0% uptime), avg 248.0ms incr 45275 totalling 15,800ms (19.0% uptime), avg 0.0ms tenures 715 (avg 63 GCs/tenure) root table 0 overflows Perhaps I don´t interpret correctly that result. I understand than the more slow is the UI actions, when I add the cells in each row ( #buildCellsStructure ). Exists some way for accelerate the UI moves? Is possible stop the morphs events and only restart when is all builded? I did try reduce the slow sensation loading the rows in another thread (#fork), but the UI crushes, and appears a red rectangle with a yellow cross. Exists some way for use work with UI in another threads? Regards -- View this message in context: http://n4.nabble.com/Conseils-for-develop-a-grid-tp1299737p1471158.html Sent from the Pharo Smalltalk mailing list archive at Nabble.com.