/** * @version $Id: PatternRecord.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $ * * 2011/08/29 17:49:34 * @author kousuke-morishima * * Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved. */ package com.tida_okinawa.corona.correction.parsing.model; import org.eclipse.core.runtime.ListenerList; import org.eclipse.ui.views.properties.IPropertyDescriptor; import org.eclipse.ui.views.properties.IPropertySource; import org.eclipse.ui.views.properties.TextPropertyDescriptor; import com.tida_okinawa.corona.correction.parsing.model.IPatternListener.PatternEvent; import com.tida_okinawa.corona.io.IoActivator; import com.tida_okinawa.corona.io.model.dic.IPattern; /** * @author kousuke-morishima */ public class PatternRecord extends PatternContainer { private boolean executed = true; private Pattern pattern = null; private IPattern iPattern; public PatternRecord() { this(null); } public PatternRecord(IPattern iPattern) { super(null); init(iPattern); } protected void init(IPattern iPattern) { /* 実際にPatternを作成するのは、子を要求されたとき */ if (iPattern == null) { iPattern = IoActivator.getDicFactory().createPattern("", "", -99, false); //$NON-NLS-1$ //$NON-NLS-2$ } this.iPattern = iPattern; } @Override protected void createChildren() { super.createChildren(); /* 読み出したデータがあれば変換 */ pattern = DicPatternUtil.convertFrom(iPattern.getText()); if (pattern != null) { /* トップ要素には親が設定されていないので、セットする */ pattern.setParent(this); /* 追加イベントが起きてしまうので、直接addしている */ children.add(pattern); } } /* **************************************** * プロパティフィールド */ /** * @return パターンのID。0ならDB未登録 */ public int getId() { return iPattern.getId(); } /** * @return パターンの名称。not null */ public String getLabel() { return iPattern.getLabel(); } public void setLabel(String label) { if (iPattern.getLabel().equals(label)) { return; } iPattern.setLabel((label == null) ? "" : label); //$NON-NLS-1$ propertyChanged(); } /** * @return パターンの種別 */ public int getType() { return iPattern.getPatternType(); } public void setType(int type) { if (iPattern.getPatternType() == type) { return; } iPattern.setPatternType(type); propertyChanged(); } /** * @return パターン解析できたかできなかったかを表すフラグ */ public boolean isExecuted() { // 対応するものがIPatternにない return executed; } /** * パターン解析できたかできなかったかを表すフラグ。構文解析をしてみて、解析できない形式のパターンを含んでいた場合に呼び出される * * @param executed * trueなら解析できた。falseなら解析できなかった。 */ public void setExecuted(boolean executed) { this.executed = executed; } /** * @return 使い回しするパーツかどうか */ public boolean isPart() { return iPattern.isParts(); } public void setPart(boolean part) { if (iPattern.isParts() == part) { return; } iPattern.setParts(part); propertyChanged(); } /* **************************************** * パターン */ /** * @return パターン(UI表示モデル) */ public Pattern getPattern() { return pattern; } public void setPattern(Pattern pattern) { if (this.pattern == null) { if (pattern == null) { return; } } else { if (this.pattern.equals(pattern)) { return; } } this.pattern = pattern; propertyChanged(); } /** * @return パターン */ public IPattern getIPattern() { return iPattern; } /* **************************************** * 子供の管理 */ @Override public boolean canHaveChild(PatternKind kind) { switch (kind) { case MODIFICATION_SOURCE: return false; case MODIFICATION_DESTINATION: return false; default: break; } if (!childCreated) { /* 作られていないのであれば、作ったあとで判定 */ createChildren(); } return pattern == null; } @Override public boolean hasChildren() { if (!childCreated) { return super.hasChildren(); } return pattern != null; } /* **************************************** * 表示更新イベント管理 */ @Override public void addChild(Pattern child) { if (pattern == null) { pattern = child; super.addChild(child); } } @Override public void addChild(int index, Pattern child) { addChild(child); } @Override public void removeChild(Pattern child) { if (child == null) { return; } if ((pattern != null) && pattern.equals(child)) { pattern = null; super.removeChild(child); } } @Override void childAdded(PatternContainer parent, Pattern child, int position) { iPattern.setText(DicPatternUtil.convertFrom(pattern)); patternAdded(parent, child, position); } @Override void childRemoved(PatternContainer parent, Pattern child) { iPattern.setText(DicPatternUtil.convertFrom(pattern)); patternRemoved(parent, child); } @Override protected void propertyChanged(Pattern own) { if (!isIgnoreChange()) { if (!childCreated) { createChildren(); } iPattern.setText(DicPatternUtil.convertFrom(pattern)); patternChanged(own); } } /* **************************************** * 外部へのリスナー */ private ListenerList listeners = new ListenerList(); public void addPatternListener(IPatternListener listener) { listeners.add(listener); } public void removePatternListener(IPatternListener listener) { listeners.remove(listener); } protected void patternAdded(PatternContainer parent, Pattern child, int position) { Object[] listeners = this.listeners.getListeners(); PatternEvent event = new PatternEvent(parent, child, position); for (Object l : listeners) { ((IPatternListener) l).patternAdded(event); } } protected void patternRemoved(PatternContainer parent, Pattern child) { Object[] listeners = this.listeners.getListeners(); PatternEvent event = new PatternEvent(parent, child); for (Object l : listeners) { ((IPatternListener) l).patternRemoved(event); } } protected void patternChanged(Pattern target) { PatternEvent event = new PatternEvent(null, target); for (Object l : listeners.getListeners()) { ((IPatternListener) l).patternChanged(event); } } /* **************************************** * その他 */ @Override public String toString() { return getLabel(); } @Override protected PatternContainer ownClone() { PatternRecord rec = new PatternRecord(null); rec.setLabel(getLabel()); rec.setPart(isPart()); rec.setExecuted(isExecuted()); rec.setType(getType()); return rec; } @Override public PatternKind getKind() { return PatternKind.ROOT; } @Override public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) { if (adapter.equals(IPropertySource.class)) { return source; } return null; } private IPropertySource source = new IPropertySource() { @Override public IPropertyDescriptor[] getPropertyDescriptors() { IPropertyDescriptor[] descriptor = new IPropertyDescriptor[] { new TextPropertyDescriptor("id", "ID"), new TextPropertyDescriptor("kind", "パターン型"), new TextPropertyDescriptor("label", "パターン名") }; return descriptor; } @Override public Object getPropertyValue(Object id) { if (id.equals("id")) { return String.valueOf(getId()); } if (id.equals("label")) { return getLabel(); } if (id.equals("kind")) { return getKind(); } return null; } @Override public boolean isPropertySet(Object id) { return false; } @Override public void resetPropertyValue(Object id) { } @Override public void setPropertyValue(Object id, Object value) { } @Override public Object getEditableValue() { return null; } }; }