import javax.swing.*;
import javax.swing.event.*;

class ReverseListAdapter extends AbstractListModel {
  public ReverseListAdapter(ListModel model) {
    this.model=model;
    model.addListDataListener(new BridgeListener());
  }
  
  public int getSize() {
    return model.getSize();
  }

  public Object getElementAt(int index) {
    return model.getElementAt(reverseIndex(index));
  }
  
  int reverseIndex(int index) {
    return getSize()-index-1;
  }
  
  class BridgeListener implements ListDataListener {
    public void contentsChanged(ListDataEvent e) {
      fireContentsChanged(ReverseListAdapter.this, reverseIndex(e.getIndex0()), reverseIndex(e.getIndex1()));
    }
    public void intervalAdded(ListDataEvent e) {
      fireIntervalAdded(ReverseListAdapter.this, reverseIndex(e.getIndex0()), reverseIndex(e.getIndex1()));
    }
    public void intervalRemoved(ListDataEvent e) {
      fireIntervalRemoved(ReverseListAdapter.this, reverseIndex(e.getIndex0()), reverseIndex(e.getIndex1()));
    }
  }
  
  private final ListModel model;
}