/**
* Filename : OrderedItemCollection.java
* Created : Sep 6, 2006 by Administrator
*/
package org.tcm1998.accat;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.StringTokenizer;
//import org.tcm1998.accat.BaseItemCollection.ItemDescription;
import org.tcm1998.accat.ItemFilter.FilterCriteria;
import org.tcm1998.utils.ResourceUtils;
/**
* @author Administrator
*
*/
public class OrderedItemCollection {
private ArrayList m_groups; // groupnames
private ArrayList m_catagories;
//private Item m_catagories[][];
private ArrayList m_items;
private HashMap m_baseIDByindex;
private class Item{
int itemID;
int groupID;
int catagoryID;
boolean filtered;
}
public OrderedItemCollection(String listName, BaseItemCollection base){
m_items=new ArrayList();
m_baseIDByindex = new HashMap();
LoadOrderedItemList(listName);
}
void LoadOrderedItemList (String listName){
m_groups = new ArrayList();
m_catagories = new ArrayList();
// m_catagories = new Item[baseColl.GetNumberOfCatagories()][];
int phase = 0;
String line;
BufferedReader buf_in = ResourceUtils.openResource(listName);
try{
if (buf_in != null){
line = buf_in.readLine();
while (line != null){
line = line.trim();
if (line.length() != 0){
if (line.equals("#"))
{
phase++;
}
else
{
switch (phase)
{
case 0:
m_groups.add(line);
break;
case 1:
m_catagories.add(line);
break;
case 2:
Item item = LoadItem(line);
m_baseIDByindex.put(new Integer(item.itemID), new Integer(m_items.size()));
m_items.add(item);
break;
}
}
}
line = buf_in.readLine();
}
}
}
catch (IOException e){
}
}
private Item LoadItem(String line){
Item i = new Item();
boolean bSkipComma = false;
int iCounter = 0;
String param;
StringTokenizer st = new StringTokenizer(line,",",true); // include the tokens
while (st.hasMoreTokens()){
param = st.nextToken();
param = param.trim();
if (!param.equals(",")){
if (param.length() > 0){
switch (iCounter){
case 0:
i.itemID = Integer.parseInt(param);
break;
case 1:
i.groupID = Integer.parseInt(param);
break;
case 2:
i.catagoryID = Integer.parseInt(param);
break;
default:
break;
}
}
iCounter++;
bSkipComma = true;
}
else{
if (!bSkipComma){
iCounter++;
}
bSkipComma = false;
}
}
return i;
}
public String[] GetCatagories()
{
String[] retVal = new String[m_catagories.size()];
for (int i=0; i<retVal.length;i++)
{
retVal[i] = (String)m_catagories.get(i);
}
return retVal;
}
int GetBaseItemID (int number){
return ((Item)m_items.get(number)).itemID;
}
int GetIndex (int id){
return ((Integer)m_baseIDByindex.get(new Integer(id))).intValue();
}
int GetCatagory (int id)
{
int index = GetIndex(id);
int check_id = ((Item)m_items.get(index)).itemID;
if (check_id != id)
{
index++;
}
return ((Item)m_items.get(index)).catagoryID-1;
}
String GetCatagoryName (int id)
{
return ((String)m_catagories.get(GetCatagory(id)));
}
public boolean IsFiltered(int number)
{
return ((Item)m_items.get(number)).filtered;
}
int GetNumberOfItems()
{
return m_items.size();
}
public String GetGroupName (int number){
String retVal;
int groupNr;
if (m_groups == null){
retVal="items";
}
else{
groupNr = ((Item)m_items.get(number)).groupID;
if (groupNr == -1){
retVal = "items";
}
else{
retVal = (String)m_groups.get(groupNr);
}
}
return retVal;
}
public void doFilter (ItemFilter oFilter)
{
FilterCriteria criteria = null;
int iNumCrit = oFilter.getNumCriteria();
if (iNumCrit > 0)
{
criteria = oFilter.getCriteria(0);
initFilter (!criteria.negative, oFilter);
for (int iCrit = 0; iCrit < iNumCrit; iCrit++)
{
criteria = oFilter.getCriteria(iCrit);
switch (oFilter.getCriteriaId(criteria.type, true))
{
case ItemFilter.CR_CAT:
FilterCatagory (criteria.parameters[0], !criteria.negative);
break;
}
}
}
}
public void initFilter (boolean bClear, ItemFilter oFilter)
{
//boolean[] bUsedCrits = new boolean[m_catagories.size()];
for (int iCrit = 0; iCrit < oFilter.getNumCriteria();iCrit++)
{
switch (oFilter.getCriteriaId(oFilter.getCriteria(iCrit).type,true))
{
case ItemFilter.CR_ORDERABLE:
// for (int iCat = 0; iCat < m_catagories.size(); iCat++)
// {
//bUsedCrits[iCat] = true;
// }
break;
case ItemFilter.CR_FENGSHUI:
//bUsedCrits[0] = true;
case ItemFilter.CR_SEASON:
//bUsedCrits[3] = true;
case ItemFilter.CR_PSEASON:
case ItemFilter.CR_PTOD:
case ItemFilter.CR_TOD:
// bUsedCrits[9] = true;
// bUsedCrits[10] = true;
break;
}
}
boolean bfiltered = bClear;
for (int iItem = 0; iItem < m_items.size(); iItem++)
{
((Item)m_items.get(iItem)).filtered = bfiltered;
}
}
public int FilterCatagory(int p_iSelection, boolean bAdd)
{
int total = 0;
for (int item = 0; item < m_items.size();item++)
{
if (((Item)m_items.get(item)).catagoryID == p_iSelection)
{
((Item)m_items.get(item)).filtered = !bAdd;
total++;
}
}
return total;
}
}