litesoft
@ 151
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
// This Source Code is in the Public Domain per: http://litesoft.org/License.txt package org.litesoft.GWT.client.widgets.datatables; import java.util.*; class DetailRowModelImpl<RowType> implements DetailRowModel<RowType> { private DetailRowAlignment mAlign = DetailRowAlignment.Top; private int mIndex = -1; private RowType mItem = null; private DetailRowCallback<RowType> mCallback = null; public DetailRowCallback<RowType> getCallback() { return mCallback; } public void setCallback( DetailRowCallback<RowType> pCallback ) { mCallback = pCallback; } @Override public int getDetailRow() { return mIndex; } public RowType getDetailItem() { return mItem; } @Override public DetailRowAlignment getAlign() { return mAlign; } @Override public boolean isDetailRow( int pIndex ) { return mIndex == pIndex; } public boolean isDetailRow( RowType pItem ) { return mItem == pItem; } private boolean canShowDetailFor( int index, RowType pItem ) { return (mCallback == null) || mCallback.canShowDetailFor( index, pItem ); } /** * @return true if changed */ public boolean maybeSetDetailRow( int pIndex, RowType pItem ) { if ( mIndex != pIndex && canShowDetailFor( pIndex, pItem ) ) { setDetailRow( pIndex, pItem ); return true; } return false; } private void setDetailRow( int pIndex, RowType pItem ) { assert pIndex >= 0; assert pItem != null; if ( mIndex != pIndex && canShowDetailFor( pIndex, pItem ) ) { int oldIndex = mIndex; mIndex = pIndex; mItem = pItem; mAlign = (oldIndex == -1 || pIndex < oldIndex) ? DetailRowAlignment.Top : DetailRowAlignment.Bottom; } } private void clearDetailRow() { mIndex = -1; mItem = null; } /** * @return true if changed */ public boolean update( List<RowType> pRowValues, int pOffset, int pCount ) { assert pOffset + pCount <= pRowValues.size() : "size=" + pRowValues.size() + ",offset=" + pOffset + ",count=" + pCount; if ( mIndex >= 0 && mIndex < pCount && canShowDetailFor( mIndex, mItem ) ) { return false; } int candidateIndex = mIndex; if ( candidateIndex > pCount ) { candidateIndex = pCount; } for ( int i = candidateIndex + 1; i < pCount; i++ ) { RowType candidate = pRowValues.get( i + pOffset ); if ( canShowDetailFor( i, candidate ) ) { setDetailRow( i, candidate ); return true; } } for ( int i = candidateIndex - 1; i >= 0; i-- ) { RowType candidate = pRowValues.get( i + pOffset ); if ( canShowDetailFor( i, candidate ) ) { setDetailRow( i, candidate ); return true; } } if ( mIndex != -1 ) { clearDetailRow(); return true; } else { return false; } } } |