/** * @version $Id: DataBaseViewContentProvider.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $ * * 2011/10/05 15:54:59 * @author kyohei-miyazato * * Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved. */ package com.tida_okinawa.corona.ui.views.db; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.ui.views.properties.IPropertyDescriptor; import org.eclipse.ui.views.properties.IPropertySource; import com.tida_okinawa.corona.io.PropertyUtil; import com.tida_okinawa.corona.io.PropertyUtil.PropertyItem; import com.tida_okinawa.corona.io.model.IClaimData; import com.tida_okinawa.corona.io.model.ICoronaProject; import com.tida_okinawa.corona.io.model.dic.DicType; import com.tida_okinawa.corona.io.model.dic.ICoronaDic; import com.tida_okinawa.corona.io.model.dic.IDependDic; import com.tida_okinawa.corona.io.model.dic.ILabelDic; import com.tida_okinawa.corona.io.model.dic.IPatternDic; import com.tida_okinawa.corona.io.model.dic.IUserDic; import com.tida_okinawa.corona.io.model.dic.PatternType; import com.tida_okinawa.corona.io.service.IIoService; import com.tida_okinawa.corona.io.util.CoronaIoUtils; import com.tida_okinawa.corona.ui.views.CoronaDicComparator; /** * @author kyohei-miyazato */ public class DataBaseViewContentProvider implements ITreeContentProvider { private static final Object[] EMPTY_ARRAY = new Object[0]; private IIoService service; final static String CHILD_CATEGORY = "カテゴリ"; private static final DBViewFolder projFolder = new DBViewFolder("プロジェクト"); private static final DBViewFolder dicFolder = new DBViewFolder("辞書"); private static final DBViewFolder udicFolder = new DBViewFolder("ユーザ用語辞書"); private static final DBViewFolder ldicFolder = new DBViewFolder("ラベル辞書"); private static final DBViewFolder ddicFolder = new DBViewFolder("ゆらぎ・同義語辞書"); private static final DBViewFolder pdicFolder = new DBViewFolder("構文パターン辞書"); private static final DBViewFolder jdicFolder = new DBViewFolder("Juman辞書"); private static final DBViewFolder claimFolder = new DBViewFolder("問い合わせデータ"); private static final DBViewFolder catFolder = new DBViewFolder(CHILD_CATEGORY); private static final DBViewFolder ptypeFolder = new DBViewFolder("パターン分類"); private static final DBViewFolder domainFolder = new DBViewFolder("分野名"); @Override public Object[] getElements(Object input) { service = (IIoService) input; List<DBViewFolder> folder = new ArrayList<DBViewFolder>(); folder.add(projFolder); folder.add(dicFolder); folder.add(claimFolder); folder.add(catFolder); return folder.toArray(); } @Override public Object[] getChildren(Object parent) { // testH25 20130806 互換性テスト 20130822 Boolean isCoronaConnect = service.isConnect(); if (!isCoronaConnect) { return EMPTY_ARRAY;/* 空の配列を返す */ } // testH25 20130806 互換性テスト /* プロパティビュー表示対応  フォルダ名を取得  */ if (parent instanceof DBViewFolder) { if (projFolder.equals(parent)) { /* プロジェクト情報を取る */ return service.getProjects().toArray(); } if (dicFolder.equals(parent)) { /* 存在しない辞書のフォルダは表示しない。 */ Set<DBViewFolder> ret = new HashSet<DBViewFolder>(5, 1); List<ICoronaDic> dics = service.getDictionarys(ICoronaDic.class); for (ICoronaDic dic : dics) { if (dic instanceof IUserDic) { if (DicType.JUMAN.equals(((IUserDic) dic).getDicType())) { ret.add(jdicFolder); } else { ret.add(udicFolder); } } else if (dic instanceof ILabelDic) { ret.add(ldicFolder); } else if (dic instanceof IDependDic) { ret.add(ddicFolder); } else if (dic instanceof IPatternDic) { ret.add(pdicFolder); } } return ret.toArray(); } /* 各辞書フォルダ */ if (udicFolder.equals(parent)) { List<ICoronaDic> dics = service.getDictionarys(IUserDic.class); for (Iterator<ICoronaDic> itr = dics.iterator(); itr.hasNext();) { if (((IUserDic) itr.next()).getDicType().equals(DicType.JUMAN)) { itr.remove(); } } return dics.toArray(); } else if (jdicFolder.equals(parent)) { List<ICoronaDic> dics = service.getDictionarys(IUserDic.class); for (Iterator<ICoronaDic> itr = dics.iterator(); itr.hasNext();) { if (!((IUserDic) itr.next()).getDicType().equals(DicType.JUMAN)) { itr.remove(); } } return dics.toArray(); } else if (ldicFolder.equals(parent)) { return service.getDictionarys(ILabelDic.class).toArray(); } else if (pdicFolder.equals(parent)) { return service.getDictionarys(IPatternDic.class).toArray(); } else if (ddicFolder.equals(parent)) { return service.getDictionarys(IDependDic.class).toArray(); } if (claimFolder.equals(parent)) { /* 問い合わせデータの情報を取る */ return service.getClaimDatas().toArray(); } if (catFolder.equals(parent)) { return new Object[] { ptypeFolder, domainFolder }; } if (ptypeFolder.equals(parent)) { /* デフォルトで入っている値を除いて表示する */ PatternType[] types = service.getPatternTypes(); int dst = 0; for (int i = 0; i < types.length; i++) { PatternType type = types[i]; if (type.getId() > 0) { types[dst++] = type; } } Object[] ret = new Object[dst]; System.arraycopy(types, 0, ret, 0, dst); return ret; } else if (domainFolder.equals(parent)) { return service.getCategorys().toArray(); } } return EMPTY_ARRAY;/* 空の配列を返す */ } @Override public Object getParent(Object element) { if (element instanceof ICoronaDic) { return dicFolder; } else if (element instanceof ICoronaProject) { return projFolder; } else if (element instanceof IClaimData) { return claimFolder; } else if (element instanceof PatternType) { return ptypeFolder; } else if (ptypeFolder.equals(element)) { return catFolder; } else if (domainFolder.equals(element)) { return catFolder; } return null; } @Override public boolean hasChildren(Object element) { /* 子供が居るかどうか。左側の矢印を付けるかどうかを決める所。 */ /* プロパティビュー表示対応 */ return (element instanceof DBViewFolder); } @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } static ViewerSorter getSorter() { final CoronaDicComparator comparator = new CoronaDicComparator(); return new ViewerSorter() { final Integer CATEGORY_OTHER = 99; @Override public int category(Object element) { if (element instanceof DBViewFolder) { if (jdicFolder.equals(element)) { return 9; } else if (udicFolder.equals(element)) { return 1; } else if (ldicFolder.equals(element)) { return 5; } else if (ddicFolder.equals(element)) { return 3; } else if (pdicFolder.equals(element)) { return 7; } String folder = ((DBViewFolder) element).getFolderName(); if ((DataBaseViewContentProvider.CHILD_CATEGORY).equals(folder)) { return CATEGORY_OTHER; } } return comparator.category(element); } @Override public int compare(Viewer viewer, Object e1, Object e2) { /* * DBViewで、並び順が意図したとおりにならないので、テーブル名だけをソート対象にする * ex) s1 と s1_2を並べた時、s1_2が上に来てしまって、ProjExplと異なってしまうことに対応 */ if (e1 instanceof IClaimData) { e1 = CoronaIoUtils.getTableNameSuffix(((IClaimData) e1).getTableName()); } if (e2 instanceof IClaimData) { e2 = CoronaIoUtils.getTableNameSuffix(((IClaimData) e2).getTableName()); } return super.compare(viewer, e1, e2); } }; } static class DBViewFolder implements IPropertySource { private String name = ""; DBViewFolder(String name) { this.name = name; } public String getFolderName() { return this.name; } @Override public int hashCode() { return name.hashCode(); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof DBViewFolder)) { return false; } DBViewFolder f2 = (DBViewFolder) obj; if (name.equals(f2.name)) { return true; } return false; } /* **************************************** * property view */ @Override public Object getEditableValue() { return null; } @Override public IPropertyDescriptor[] getPropertyDescriptors() { PropertyUtil prop = new PropertyUtil(); IPropertyDescriptor[] descriptor = new IPropertyDescriptor[] { prop.getDescriptor(PropertyItem.PROP_NAME), }; return descriptor; } @Override public Object getPropertyValue(Object id) { if (PropertyItem.PROP_NAME.getKey().equals(id)) { return getFolderName(); } return PropertyUtil.DEFAULT_VALUE; } @Override public boolean isPropertySet(Object id) { return false; } @Override public void resetPropertyValue(Object id) { } @Override public void setPropertyValue(Object id, Object value) { } } }