/** * 画像ファイル情報リスト基本クラス */ package jp.crwdev.app.container; import java.awt.Dimension; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import jp.crwdev.app.constant.Constant; import jp.crwdev.app.imagefilter.ImageFilterParam; import jp.crwdev.app.imagefilter.SplitFilter; import jp.crwdev.app.interfaces.IImageFileInfo; import jp.crwdev.app.interfaces.IImageFileInfoList; public abstract class ImageFileInfoList implements IImageFileInfoList { /** 画像ファイル情報リスト */ protected List<IImageFileInfo> mList = new ArrayList<IImageFileInfo>(); /** ソート有効フラグ */ protected boolean mEnableSort = true; /** * 本文ページの最大サイズを取得 * @param list * @return */ public static Dimension getTextPageUnionDimension(IImageFileInfoList list){ if(list == null){ return new Dimension(0,0); } Dimension max = new Dimension(0,0); int size = list.size(); for(int i=0; i<size; i++){ IImageFileInfo info = list.get(i); ImageFilterParam param = info.getFilterParam(); if(param.getPageType() == Constant.PAGETYPE_TEXT && info.isEnable()){ int width = info.getWidth(); int height = info.getHeight(); if(max.width < width){ max.width = width; } if(max.height < height){ max.height = height; } } } return max; } /** * renew()用共通処理。SplitTypeを反映した新しいリストを構築する * @param list * @return */ protected IImageFileInfoList renewInternal(IImageFileInfoList list){ for(int i=0; i<mList.size(); i++){ IImageFileInfo info = mList.get(i); ImageFilterParam param = info.getFilterParam(); if(info instanceof ImageFileInfoSplitWrapper){ // 分割中 ImageFileInfoSplitWrapper infow = (ImageFileInfoSplitWrapper)info; // 1つめのSplitType boolean update = false; ImageFileInfoSplitWrapper firstInfo = infow.getFirstSplitInfo(); int orgSplitType = firstInfo.getFilterParam().getSplitType(); for(int n=1; n<firstInfo.getRelativeSplitInfoSize(); n++){ if(orgSplitType != firstInfo.getRelativeSplitInfoFilterParam(n).getSplitType()){ update = true; break; } } if(!update){ list.add(infow); } else if(param.getSplitIndex() == 0){ // 1つ目が全ての情報を持っている int pageType = param.getSplitType(); IImageFileInfo baseInfo = infow.getBaseFileInfo(); baseInfo.getFilterParam().setSplitType(pageType, param.getSplitOffsetV(), param.getSplitOffsetV()); if(pageType == SplitFilter.TYPE_NONE){ // 分割なしに戻す(全ての分割情報は捨てる) list.add(baseInfo); } else{ // 分割し直す(全ての分割情報は捨てる) int splitCount = 1; switch(param.getSplitType()){ case SplitFilter.TYPE_L2R_2: case SplitFilter.TYPE_R2L_2: splitCount = 2; break; case SplitFilter.TYPE_L2R_2x2: case SplitFilter.TYPE_R2L_2x2: splitCount = 4; break; case SplitFilter.TYPE_L2R_3x3: case SplitFilter.TYPE_R2L_3x3: splitCount = 9; break; case SplitFilter.TYPE_CUSTOM: splitCount = (param.getSplitOffsetV().length-1) * (param.getSplitOffsetH().length-1); break; default: } boolean sameCount = splitCount == infow.getRelativeSplitInfoSize(); ImageFileInfoSplitWrapper first = null; for(int index=0; index<splitCount; index++){ ImageFileInfoSplitWrapper wrapInfo = new ImageFileInfoSplitWrapper(baseInfo, index); if(sameCount){ wrapInfo.setEnable(infow.getRelativeSplitInfo(index).isEnable()); wrapInfo.setFilterParam(infow.getRelativeSplitInfoFilterParam(index)); } list.add(wrapInfo); if(first == null){ first = wrapInfo; } first.addRelativeSplitInfo(wrapInfo); wrapInfo.setFirstSplitInfo(first); } } } }else{ if(param.getSplitType() != SplitFilter.TYPE_NONE){ // 1 → 分割 int splitCount = 1; switch(param.getSplitType()){ case SplitFilter.TYPE_L2R_2: case SplitFilter.TYPE_R2L_2: splitCount = 2; break; case SplitFilter.TYPE_L2R_2x2: case SplitFilter.TYPE_R2L_2x2: splitCount = 4; break; case SplitFilter.TYPE_L2R_3x3: case SplitFilter.TYPE_R2L_3x3: splitCount = 9; break; case SplitFilter.TYPE_CUSTOM: splitCount = (param.getSplitOffsetV().length-1) * (param.getSplitOffsetH().length-1); break; default: } ImageFileInfoSplitWrapper first = null; for(int index=0; index<splitCount; index++){ ImageFileInfoSplitWrapper wrapInfo = new ImageFileInfoSplitWrapper(info, index); list.add(wrapInfo); if(first == null){ first = wrapInfo; } first.addRelativeSplitInfo(wrapInfo); wrapInfo.setFirstSplitInfo(first); } } else{ // 分割なし list.add(info); } } } list.setEnableSort(isEnableSort()); list.sort(); // for(int i=0; i<mList.size(); i++){ // IImageFileInfo info = mList.get(i); // ImageFilterParam param = info.getFilterParam(); // if(info instanceof ImageFileInfoSplitWrapper){ // ImageFileInfoSplitWrapper infow = (ImageFileInfoSplitWrapper)info; // if(param.getSplitIndex() == 0){ // int pageType = param.getSplitType(); // IImageFileInfo baseInfo = infow.getBaseFileInfo(); // baseInfo.getFilterParam().setSplitType(pageType); // if(pageType == Constant.SPLITTYPE_NONE){ // list.add(baseInfo); // } // else{ // list.add(new ImageFileInfoSplitWrapper(baseInfo, 0)); // list.add(new ImageFileInfoSplitWrapper(baseInfo, 1)); // } // } // }else{ // if(param.getSplitType() != Constant.SPLITTYPE_NONE){ // // list.add(new ImageFileInfoSplitWrapper(info, 0)); // list.add(new ImageFileInfoSplitWrapper(info, 1)); // } // else{ // list.add(info); // } // } // } return list; } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void sort() { if(mEnableSort){ Collections.sort(mList, new Comparator(){ @Override public int compare(Object o1, Object o2) { IImageFileInfo a = (IImageFileInfo)o1; IImageFileInfo b = (IImageFileInfo)o2; int comp = a.getSortString().compareToIgnoreCase(b.getSortString()); if(comp == 0){ comp = a.getFilterParam().getSplitIndex() - b.getFilterParam().getSplitIndex(); } return comp; } }); } else{ Collections.sort(mList, new Comparator(){ @Override public int compare(Object o1, Object o2) { IImageFileInfo a = (IImageFileInfo)o1; IImageFileInfo b = (IImageFileInfo)o2; int aOrder = a.getSortOrder(); int bOrder = b.getSortOrder(); if(aOrder < 0 && bOrder < 0){ int comp = a.getSortString().compareToIgnoreCase(b.getSortString()); if(comp == 0){ comp = a.getFilterParam().getSplitIndex() - b.getFilterParam().getSplitIndex(); } return comp; } else if(aOrder < 0){ return -1; } else if(bOrder < 0){ return 1; } else{ return aOrder - bOrder; } } }); } } @Override public void setEnableSort(boolean enable){ mEnableSort = enable; if(!enable){ for(int i=0; i<size(); i++){ IImageFileInfo info = get(i); info.setSortOrder(i); } } } @Override public boolean isEnableSort(){ return mEnableSort; } protected String getSuffix(String fileName) { if (fileName == null) return null; fileName = fileName.toLowerCase(); int point = fileName.lastIndexOf("."); if (point != -1) { return fileName.substring(point + 1); } return fileName; } @Override public int size() { return mList.size(); } @Override public IImageFileInfo get(int index) { return mList.get(index); } @Override public IImageFileInfo remove(int index) { return mList.remove(index); } @Override public void clear(){ mList.clear(); } @Override public boolean add(IImageFileInfo info) { return mList.add(info); } @Override public void insert(int index, IImageFileInfo info) { mList.add(index, info); } @Override public void release(){ } }