/** * @version $Id: TermCellModifier.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $ * * 2011/10/27 14:05:54 * @author kousuke-morishima * * Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved. */ package com.tida_okinawa.corona.ui.editors.user; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ComboBoxCellEditor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IWorkbenchPartSite; import com.tida_okinawa.corona.correction.erratum.Erratum; import com.tida_okinawa.corona.io.model.dic.ITerm; import com.tida_okinawa.corona.io.model.dic.TermClass; import com.tida_okinawa.corona.io.model.dic.TermPart; import com.tida_okinawa.corona.ui.UIActivator; /** * @author kousuke-morishima */ public class TermCellModifier implements ICellModifier { private IWorkbenchPartSite site; private PrivateTermPart termParts; public TermCellModifier(IWorkbenchPartSite site) { this.site = site; init(); } private void init() { properties = new ArrayList<String>(); properties.add(PROP_WORD); properties.add(PROP_PART); properties.add(PROP_CLASS); if (UIActivator.isAlpha()) { /* α版対応 品詞だけをコンボに出力 */ termParts = new PrivateTermPart(new TermPart[] { TermPart.NOUN }); } else { TermPart[] part = TermPart.values(); /* なしは表示しない */ TermPart[] part2 = new TermPart[part.length - 1]; for (int i = 1; i < part.length; i++) { part2[i - 1] = part[i]; } termParts = new PrivateTermPart(part2); } } /* **************************************** * Litener */ private ListenerList listeners = new ListenerList(); /** * セルの編集が終わったタイミングで、通知を受けるリスナーを登録する。 * handleEventが、{@link CellModifierEvent}と一緒に呼び出される。 * * @param listener */ public void addFinishModifyListener(Listener listener) { listeners.add(listener); } public void removeFinishModifyLitener(Listener listener) { listeners.remove(listener); } private void fireEvent(Object element, String property, Object value) { CellModifierEvent e = new CellModifierEvent(); e.data = element; e.property = property; e.value = value; Object[] listeners = this.listeners.getListeners(); for (Object l : listeners) { ((Listener) l).handleEvent(e); } } public static class CellModifierEvent extends Event { /** * 編集したセルを表すプロパティ */ public String property; /** * 編集確定後の値 */ public Object value; } /* **************************************** * getter */ public static final String PROP_WORD = "word"; public static final String PROP_PART = "part"; public static final String PROP_CLASS = "wordClass"; private List<String> properties; /** * @return このCellModifierで編集可能なプロパティを返す */ public List<String> properties() { return properties; } private List<CellEditor> editors; private ComboBoxCellEditor detailComboEditor; public List<CellEditor> createEditors(Table tbl) { if (editors == null) { editors = new ArrayList<CellEditor>(3); /* 品詞詳細アイテム設定 */ detailComboEditor = new ComboBoxCellEditor(tbl, new String[0]); editors.add(new TextCellEditor(tbl)); editors.add(new ComboBoxCellEditor(tbl, termParts.names)); editors.add(detailComboEditor); } return editors; } /* **************************************** * Modifier */ @Override public void modify(Object element, String property, Object value) { // ユーザが編集を確定した時に呼ばれる // 値を、モデルに反映させる。 ITerm term = (ITerm) ((TableItem) element).getData(); if (property.equals(PROP_WORD)) { String word = (String) value; Erratum erratum = new Erratum(); String corrected = erratum.convert(word); /* 全角へ変換 */ term.setValue(corrected); // IllegalWord メッセージ if (erratum.hasIllegalWords()) { MessageDialog.openConfirm(site.getShell(), "単語", "無効な文字列が含まれています"); } /* 品詞が未入力だったら、品詞にデフォルト値を設定 */ if (!word.trim().equals("")) { if (term.getTermPart().equals(TermPart.NONE)) { term.setTermPart(TermPart.NOUN); /* 品詞詳細アイテム設定 */ PrivateTermClass termClasses = createTermClass(TermPart.NOUN.getIntValue()); detailComboEditor.setItems(termClasses.names); /* 品詞詳細アイテム の最初を選択 */ term.setTermClass(termClasses.get(0)); } } } else if (property.equals(PROP_PART)) { int index = (Integer) value; /* 品詞設定 */ if (index >= 0) { /* 品詞の値が変わったとき */ TermPart newPart = termParts.items[index]; if (!newPart.equals(term.getTermPart())) { term.setTermPart(newPart); /* 品詞詳細取得 */ PrivateTermClass termClasses = createTermClass(newPart.getIntValue()); detailComboEditor.setItems(termClasses.names); term.setTermClass(termClasses.get(0)); } } } else if (property.equals(PROP_CLASS)) { int index = (Integer) value; if (index != -1) { /* 品詞に対する品詞詳細リスト */ term.setTermClass(createTermClass(term.getTermPart().getIntValue()).get(index)); } } fireEvent(term, property, value); } @Override public Object getValue(Object element, String property) { // canModifyでtrueを返すと呼ばれる // 編集対象になった項目の、現在の値を返す ITerm term = (ITerm) element; if (property.equals(PROP_WORD)) { return term.getValue(); } else if (property.equals(PROP_PART)) { /* ”なし”の場合は-1 */ if (TermPart.NONE.equals(term.getTermPart())) { return -1; } return termParts.getIndex(term.getTermPart()); } else if (property.equals(PROP_CLASS)) { /* 品詞詳細アイテム設定 */ PrivateTermClass termClasses = createTermClass(term.getTermPart().getIntValue()); detailComboEditor.setItems(termClasses.names); /* 品詞に対する品詞詳細リスト */ if (TermClass.NONE.equals(term.getTermClass())) { return -1; } return termClasses.getIndex(term.getTermClass()); } return null; } @Override public boolean canModify(Object element, String property) { for (String prop : properties) { if (prop.equals(property)) { return true; } } return false; } private static PrivateTermClass createTermClass(int partId) { /* 品詞詳細アイテム設定 */ return new PrivateTermClass(TermClass.values(partId).toArray(new TermClass[TermClass.values(partId).size()])); } }