/**
* @version $Id: LabelItem.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2011/08/03
* @author shingo-takahashi
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.io.model.dic.impl;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.PropertyDescriptor;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;
import com.tida_okinawa.corona.io.model.dic.ILabel;
import com.tida_okinawa.corona.io.model.dic.ITerm;
import com.tida_okinawa.corona.io.model.dic.abstraction.DicItem;
/**
* @author shingo-takahashi
*
*/
public class LabelItem extends DicItem implements ILabel {
private ILabel _parent;
private int _parentId;
private List<ILabel> _children = new ArrayList<ILabel>();
private List<ILabel> _delChildren = new ArrayList<ILabel>();
private String _name;
private List<ITerm> _terms = new ArrayList<ITerm>();
private List<ITerm> _delTerms = new ArrayList<ITerm>();
public LabelItem(String name, ILabel parent) {
this._name = name;
this._parent = parent;
this._children = new ArrayList<ILabel>();
if (parent != null) {
parent.addChild(this);
setDicId(parent.getComprehensionDicId());
}
}
@Override
public ILabel getParent() {
return _parent;
}
@Override
public void setParent(ILabel parent) {
/*
* Memo エディタで使うようになるとバグを生みそう。 削除とか。
* parentの子の移し替えは別メソッドを呼び出してもらうようにすると安全かなぁ
*/
/* 前の親から自分を外す */
if (this._parent != null) {
this._parent.getChildren().remove(this);
}
/* 新しい親に自分をセットする */
this._parent = parent;
if (this._parent != null) {
this._parent.getChildren().add(this);
}
if (parent != null) {
if (_parentId != parent.getId()) {
/* 親の変更のみdirtyフラグを立てる */
_parentId = parent.getId();
setDirty(true);
}
} else {
if (_parentId != 0) {
_parentId = 0;
setDirty(true);
}
}
}
@Override
public List<ILabel> getChildren() {
return _children;
}
@Override
public void setChildren(List<ILabel> children) {
this._children = children;
// // TODO 親子関係の整合性が崩れないように持つ
// /* うまくできていないようなので、コメントアウト */
// /* 前の子の親を外す */
// for (ILabel label : this._children) {
// label.setParent(null);
// }
// /* 新しい子に自分をセットする */
// this._children = children;
// for (ILabel label : this._children) {
// label.setParent(this);
// }
// this.dirty = true;
}
@Override
public String getName() {
return _name;
}
@Override
public void setName(String name) {
if (!this._name.equals(name)) {
this._name = name;
setDirty(true);
}
}
@Override
public List<ITerm> getTerms() {
return _terms;
}
@Override
public void setTerms(List<ITerm> terms) {
this._terms = terms;
setDirty(true);
}
/**
* @param parentId
*/
public void setParentId(int parentId) {
if (this._parentId == parentId) {
return;
}
this._parentId = parentId;
setDirty(true);
}
public int getParentId() {
return this._parentId;
}
@Override
public boolean addChild(ILabel label) {
if (_children.add(label)) {
setDirty(true);
return true;
}
return false;
}
@Override
public boolean removeChild(ILabel label) {
if (label == null)
return false;
if (_children.remove(label)) {
((DicItem) label).setInActive(true);
_delChildren.add(label);
setDirty(true);
return true;
}
return false;
}
@Override
public void addTerm(ITerm term) {
if (!_terms.contains(term)) {
if (_terms.add(term)) {
_delTerms.remove(term); // Memo 再度紐づけられたとき、削除は取り消す Morishima
setDirty(true);
}
}
}
@Override
public void removeTerm(ITerm term) {
if (term == null)
return;
if (_terms.remove(term)) {
_delTerms.add(term);
setDirty(true);
}
}
@Override
public String toString() {
return _name;
}
/**
*
* @return
*/
public List<ITerm> getDelTerms() {
return _delTerms;
}
public void clearDelTerms() {
_delTerms.clear();
}
@Override
public int hashCode() {
if (_id == UNSAVED_ID) {
return 47;
}
return _id;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof LabelItem)) {
return false;
}
LabelItem l2 = (LabelItem) obj;
if (_id == UNSAVED_ID) {
if (l2._id == UNSAVED_ID) {
return equals(l2);
}
return false;
}
if (l2._id == UNSAVED_ID) {
return false;
}
return _id == l2._id;
}
private boolean equals(LabelItem l2) {
/* いずれかのidが-1のとき、フィールドを比べる */
return _name.equals(l2._name) && _parentId == l2._parentId;
}
@Override
public String getTreeName() {
String str = this._name;
if (this._parent != null) {
str = _parent.getTreeName() + "/" + str;
}
return str;
}
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
List<IPropertyDescriptor> descriptor = new ArrayList<IPropertyDescriptor>();
descriptor.add(new TextPropertyDescriptor("id", "ID"));
descriptor.add(new TextPropertyDescriptor("name", "ラベル名"));
descriptor.add(new TextPropertyDescriptor("term", "用語"));
for (int i = 0; i < getChildren().size(); i++) {
descriptor.add(new PropertyDescriptor("child" + i, "子ラベル[" + i + "]"));
}
return descriptor.toArray(new IPropertyDescriptor[descriptor.size()]);
}
@Override
public Object getPropertyValue(Object id) {
if (id.equals("id")) {
return String.valueOf(getId());
}
if (id.equals("name")) {
return getTreeName();
}
if (id instanceof String) {
String s = (String) id;
if (s.contains("child")) {
s = s.replace("child", "");
return getChildren().get(Integer.parseInt(s));
}
}
if (id.equals("term")) {
StringBuilder strBuf = new StringBuilder("");
if (getTerms().size() < 1) {
return null;
}
for (ITerm t : getTerms()) {
strBuf.append(" , ");
strBuf.append(t.getValue());
}
return strBuf.toString().substring(3);
}
return null;
}
}