package net.katsuster.strview.gui;

import java.awt.*;

import javax.swing.*;

import net.katsuster.strview.util.*;
import net.katsuster.strview.media.*;

/**
 * <p>
 * パケットリストを表示するクラスです。
 * </p>
 *
 * @author katsuhiro
 */
public class PacketListViewer extends JPanel {
    private static final long serialVersionUID = 1L;

    private JList viewer;
    private PacketListModel model;

    //表示させるパケットリスト
    private LargeList<? extends Packet> list;

    //今まで取得成功したパケット番号の最大値
    private long n_max = 0;

    public PacketListViewer(LargeList<? extends Packet> l) {
        setBackground(Color.WHITE);
        setLayout(new BorderLayout());

        //リストボックスを追加する
        model = new PacketListModel();
        viewer = new JList();
        viewer.setFixedCellWidth(200);
        viewer.setFixedCellHeight(16);
        viewer.setModel(model);

        add(viewer, BorderLayout.CENTER);

        //表示するリストを設定する
        setPacketList(l);
    }

    protected class PacketListModel extends AbstractListModel {
        @Override
        public int getSize() {
            return (int)getMax();
        }

        @Override
        public Object getElementAt(int index) {
            return index + ": " + list.get(index).getShortName();
        }

        public void update() {
            fireIntervalAdded(this, 0, getSize());
        }
    }

    /**
     * <p>
     * 表示するパケットリストを取得します。
     * </p>
     *
     * @return 表示するパケットリスト
     */
    public LargeList<? extends Packet> getPacketList() {
        return list;
    }

    /**
     * <p>
     * 表示するパケットリストを設定します。
     * </p>
     *
     * @param l 表示するパケットリスト
     */
    public void setPacketList(LargeList<? extends Packet> l) {
        list = l;

        //とりあえず 100 要素取ってみる
        try {
            list.get(100);
            setMax(100);
        } catch (IndexOutOfBoundsException ex) {
            //短そうなので全カウント
            list.count();
        }
    }

    /**
     * <p>
     * パケット番号の最大値を取得します。
     * </p>
     *
     * <p>
     * パケットリストの大きさが既知の場合は、
     * パケットリストの大きさを返します。
     * 大きさが未知の場合は、
     * 今までに取得成功したパケット番号の最大値を返します。
     * </p>
     *
     * @return パケット番号の最大値
     */
    public long getMax() {
        long l = getPacketList().length();

        if (l == LargeList.LENGTH_UNKNOWN) {
            return n_max;
        }

        return l;
    }

    /**
     * <p>
     * パケット番号の最大値を設定します。
     * </p>
     *
     * <p>
     * パケットリストの大きさが既知の場合は、
     * パケットリストの大きさを返します。
     * </p>
     *
     * @param n パケット番号の最大値
     */
    protected void setMax(long n) {
        n_max = n;

        if (model != null) {
            model.update();
        }
    }

    public JList getViewer() {
        return viewer;
    }

    /**
     * <p>
     * 指定された位置にある行を取得します。
     * </p>
     *
     * @param x 表示領域の左端からの距離
     * @param y 表示領域の上端からの距離
     * @return 指定された位置にある行、領域外の時は -1
     */
    public long getRowForLocation(int x, int y) {
        return viewer.locationToIndex(new Point(x, y));
    }
}

@@ -1268,16 +1268,39 @@
  update(
+long before, long after
 ) %7B%0A    
@@ -1335,20 +1335,31 @@
 is, 
-0, getSize()
+(int)before, (int)after
 );%0A 
@@ -2574,24 +2574,54 @@
 x(long n) %7B%0A
+        long before = n_max;%0A%0A
         n_ma
@@ -2682,16 +2682,29 @@
 .update(
+before, n_max
 );%0A     

Fix to repaint items in List.