/**
* @version $Id: UIDictionary.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2011/10/13 10:28:41
* @author kousuke-morishima
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.internal.ui.views.model.impl;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import com.tida_okinawa.corona.internal.ui.views.model.IUIContainer;
import com.tida_okinawa.corona.internal.ui.views.model.IUIDictionary;
import com.tida_okinawa.corona.internal.ui.views.model.IUIElement;
import com.tida_okinawa.corona.internal.ui.views.model.IUILibFolder;
import com.tida_okinawa.corona.internal.ui.views.model.IUILibrary;
import com.tida_okinawa.corona.io.DialogPropertyDescriptor;
import com.tida_okinawa.corona.io.IoActivator;
import com.tida_okinawa.corona.io.PropertyUtil;
import com.tida_okinawa.corona.io.PropertyUtil.PropertyItem;
import com.tida_okinawa.corona.io.model.ICoronaDics;
import com.tida_okinawa.corona.io.model.TextItem;
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.IFlucDic;
import com.tida_okinawa.corona.io.model.dic.ILabelDic;
import com.tida_okinawa.corona.io.model.dic.ISynonymDic;
import com.tida_okinawa.corona.io.model.dic.IUserDic;
import com.tida_okinawa.corona.io.service.IIoService;
import com.tida_okinawa.corona.ui.editors.user.ComboItem;
/**
* @author kousuke-morishima
*/
public class UIDictionary extends UIElement implements IUIDictionary {
private int id;
/* public */UIDictionary(IUIContainer parent, ICoronaDic object, IFile resource) {
super(parent, object, resource);
IUILibrary uiLib = (IUILibrary) CoronaModel.INSTANCE.getUIContainer(IUILibrary.class, parent);
if (uiLib != null) {
ICoronaDics dics = uiLib.getObject();
if (dics == null) {
throw new IllegalStateException("辞書を追加できません");
}
dics.addDictionary(object);
}
id = object.getId();
}
@Override
public int getId() {
return id;
}
@Override
public ICoronaDic getObject() {
IUILibrary uiLib = CoronaModel.INSTANCE.getLibrary(this);
ICoronaDics lib = uiLib.getObject();
if (lib == null) {
return null;
}
ICoronaDic ret = lib.getDictionary(id);
return ret;
}
@Override
public IFile getResource() {
return (IFile) resource;
}
/* ****************************************
* property view
*/
ComboItem<TextItem> categoryItems = null;
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
IPropertyDescriptor[] sp = super.getPropertyDescriptors();
int size = 3;
ICoronaDic dic = getObject();
boolean isUserDic = (dic instanceof IUserDic);
boolean isCategoryDic = isUserDic && (((IUserDic) dic).getDicType()).equals(DicType.CATEGORY);
boolean canHaveParentDic = (dic instanceof ILabelDic) || (dic instanceof IDependDic);
size += (isUserDic) ? 3 : 0;
size += (isCategoryDic) ? 1 : 0;
size += (canHaveParentDic) ? 1 : 0;
IPropertyDescriptor[] descriptor = new IPropertyDescriptor[sp.length + size];
int i;
for (i = 0; i < sp.length; i++) {
descriptor[i] = sp[i];
}
PropertyUtil prop = new PropertyUtil();
descriptor[i++] = prop.getDescriptor(PropertyItem.PROP_DIC_TYPE);
descriptor[i++] = prop.getDescriptor(PropertyItem.PROP_RECORDS);
descriptor[i++] = prop.getDescriptor(PropertyItem.PROP_CREATEDATE);
/* ユーザ辞書特有 */
if (isUserDic) {
descriptor[i++] = prop.getDescriptor(PropertyItem.PROP_CHILD_LABEL);
descriptor[i++] = prop.getDescriptor(PropertyItem.PROP_CHILD_FLUC);
descriptor[i++] = prop.getDescriptor(PropertyItem.PROP_CHILD_SYNONYM);
}
/* 分野辞書特有 */
if (isCategoryDic) {
categoryItems = new ComboItem<TextItem>(IoActivator.getService().getCategorys()
.toArray(new TextItem[IoActivator.getService().getCategorys().size()])) {
@Override
protected String toName(TextItem item) {
return item.getText();
}
};
descriptor[i++] = PropertyUtil.getComboDescriptor(PropertyItem.PROP_CATEGORY, categoryItems.getNames());
}
/* ラベル辞書、ゆらぎ・同義語辞書特有 */
if (canHaveParentDic) {
IUILibrary uiLib = CoronaModel.INSTANCE.getLibrary(this);
DialogPropertyDescriptor dProp = PropertyUtil.getDialogDescriptor(uiLib.getObject(), dic);
List<Object> defaultValues = new ArrayList<Object>();
IIoService service = IoActivator.getService();
for (Integer id : dic.getParentIds()) {
ICoronaDic parentDic = service.getDictionary(id);
if (parentDic != null) {
defaultValues.add(parentDic);
}
}
dProp.setDefaultValueList(defaultValues);
descriptor[i++] = dProp;
}
return descriptor;
}
@Override
public Object getPropertyValue(Object id) {
if (PropertyItem.PROP_DIC_TYPE.getKey().equals(id)) {
ICoronaDic object = getObject();
if (object != null) {
Object ret = object.getPropertyValue(id);
if (ret == null) {
ret = "";
}
return ret;
}
} else if (PropertyItem.PROP_PARENT_NAME.getKey().equals(id)) {
IUILibrary uiLib = CoronaModel.INSTANCE.getLibrary(this);
if (uiLib == null) {
return PropertyUtil.DEFAULT_VALUE;
}
ICoronaDics lib = uiLib.getObject();
if (lib == null) {
return PropertyUtil.DEFAULT_VALUE;
}
ICoronaDic dic = getObject();
if (dic != null) {
StringBuilder parentName = new StringBuilder(128);
for (int pId : dic.getParentIds()) {
ICoronaDic parentDic = lib.getDictionary(pId);
if (parentDic != null) {
/* 親辞書名取得 */
parentName.append(", ").append(parentDic.getName());
}
}
if (parentName.length() > 0) {
return parentName.substring(2);
}
}
return PropertyUtil.DEFAULT_VALUE;
} else if (PropertyItem.PROP_CATEGORY.getKey().equals(id)) {
ICoronaDic dic = getObject();
if ((dic instanceof IUserDic) && (DicType.CATEGORY.equals(((IUserDic) dic).getDicType()))) {
return categoryItems.getIndex(((IUserDic) dic).getDicCategory());
}
return PropertyUtil.DEFAULT_VALUE;
} else if (PropertyItem.PROP_CHILD_LABEL.getKey().equals(id)) {
List<ICoronaDic> dics = IoActivator.getService().getDictionarys(ILabelDic.class);
return getChildName(dics);
} else if (PropertyItem.PROP_CHILD_FLUC.getKey().equals(id)) {
List<ICoronaDic> dics = IoActivator.getService().getDictionarys(IFlucDic.class);
return getChildName(dics);
} else if (PropertyItem.PROP_CHILD_SYNONYM.getKey().equals(id)) {
List<ICoronaDic> dics = IoActivator.getService().getDictionarys(ISynonymDic.class);
return getChildName(dics);
} else if (PropertyItem.PROP_RECORDS.getKey().equals(id)) {
ICoronaDic dic = IoActivator.getService().getDictionary(getId());
if (dic != null) {
return Integer.toString(dic.getItemCount());
} else {
return "件数を取得できません";
}
} else if (PropertyItem.PROP_CREATEDATE.getKey().equals(id)) {
ICoronaDic dic = getObject();
if (dic != null) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = dic.getCreationTime();
if (date == null) {
return PropertyUtil.DEFAULT_VALUE;
}
return sdf.format(date);
}
}
return super.getPropertyValue(id);
}
private TextItem changedCategory;
@Override
public void setPropertyValue(Object id, Object value) {
if (PropertyItem.PROP_CATEGORY.getKey().equals(id)) {
IUserDic dic = (IUserDic) getObject();
if (dic != null) {
changedCategory = categoryItems.get((Integer) value);
dic.setDicCategory(changedCategory);
dic.commit(false, new NullProgressMonitor());
}
} else if (PropertyItem.PROP_PARENT_NAME.getKey().equals(id)) {
/*
* ここで処理を実行する(プレビューダイアログを開く)と、プレビューダイアログが複数回開いてしまったので、
* DialogPropertyDescriptor内で処理している
*/
// UI上でこの辞書を保持しているターゲットがいれば、新しい親辞書を同じ場所に辞書を追加する
ICoronaDic dic = getObject();
if (dic != null) {
// 親辞書一覧を作る
Set<Integer> parentIds = dic.getParentIds();
List<ICoronaDic> parentDics = new ArrayList<ICoronaDic>(parentIds.size());
for (Integer parentId : parentIds) {
ICoronaDic parentDic = IoActivator.getService().getDictionary(parentId);
if (parentDic != null) {
parentDics.add(parentDic);
}
}
// 追加する場所を特定(自分と同じ辞書がいる位置を全部見つける
List<IUIElement> uiElements = CoronaModel.INSTANCE.adapter(dic);
uiElements.remove(this);
for (IUIElement uiElement : uiElements) {
// こいつらの親フォルダ(ICoronaDics)に、自分の親辞書を作る
IUILibrary uiLib = CoronaModel.INSTANCE.getLibrary(((IUIDictionary) uiElement));
IUIContainer uiParent = CoronaModel.INSTANCE.getUIContainer(IUILibFolder.class, uiElement.getParent());
ICoronaDics lib = uiLib.getObject();
for (ICoronaDic parentDic : parentDics) {
lib.addDictionary(parentDic);
createUIDic(uiParent, parentDic);
}
}
}
}
}
private static IUIDictionary createUIDic(IUIContainer uiParent, ICoronaDic dic) {
IFile newParentIFile = uiParent.getResource().getFile(new Path(dic.getName()));
IUIDictionary uiDic = (IUIDictionary) CoronaModel.INSTANCE.create(uiParent, dic, newParentIFile);
uiDic.update(null);
return uiDic;
}
private String getChildName(List<ICoronaDic> dics) {
StringBuffer childName = new StringBuffer(50);
Integer myId = getId();
/* 自分を親に持つ辞書取得 */
for (ICoronaDic dic : dics) {
for (int pId : dic.getParentIds()) {
if (pId == myId) {
/* 子辞書名取得 */
childName.append(", ").append(dic.getName());
}
}
}
if (childName.length() > 0) {
return childName.substring(2);
}
return PropertyUtil.DEFAULT_VALUE;
}
}