/**
* @version $Id: ExtractCooccurrenceDialog.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2013/01/08 9:47:29
* @author s.takuro
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.ui.editors.extract;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import com.tida_okinawa.corona.correction.collocation.CorrectionStringList;
import com.tida_okinawa.corona.correction.parsing.model.AndOperator;
import com.tida_okinawa.corona.correction.parsing.model.DicPatternUtil;
import com.tida_okinawa.corona.correction.parsing.model.Modification;
import com.tida_okinawa.corona.correction.parsing.model.OrOperator;
import com.tida_okinawa.corona.correction.parsing.model.Order;
import com.tida_okinawa.corona.correction.parsing.model.Pattern;
import com.tida_okinawa.corona.correction.parsing.model.PatternContainer;
import com.tida_okinawa.corona.correction.parsing.model.PatternKind;
import com.tida_okinawa.corona.correction.parsing.model.PatternRecord;
import com.tida_okinawa.corona.correction.parsing.model.SearchScopeType;
import com.tida_okinawa.corona.correction.parsing.model.Sequence;
import com.tida_okinawa.corona.correction.parsing.model.Term;
import com.tida_okinawa.corona.io.IoActivator;
import com.tida_okinawa.corona.io.model.MorphemeElement;
import com.tida_okinawa.corona.io.model.dic.ICoronaDic;
import com.tida_okinawa.corona.io.model.dic.IDicName;
import com.tida_okinawa.corona.io.model.dic.IPatternDic;
import com.tida_okinawa.corona.io.model.dic.TermClass;
import com.tida_okinawa.corona.io.model.dic.TermPart;
/**
* @author s.takuro
* #173 パターン自動生成(共起抽出)
*/
public class ExtractCooccurrenceDialog extends Dialog {
private static final int BTN_CLOSE_ID = 100;
private static final int BTN_ENTRY_ID = 200;
private ArrayContentProvider tableContentProvider;
private CooccurrenceListTableLabelProvider tableLabelProvider;
private List<IDicName> dicNames;
private List<ExtractCooccurrenceElement> extractCooccurrenceElement;
private int cooccurrenceInt;
/**
* 共起抽出UI(ダイアログ)
*
* @param parentShell
* 親シェル
*/
protected ExtractCooccurrenceDialog(Shell parentShell) {
super(parentShell);
}
/** 新規Shellオブジェクト構成 */
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(Messages.EXTRACT_COOCCURRENCE_TITLE);
}
/**
* 係り受け抽出一覧のコンテンツ・プロバイダーの設定
*
* @param provider
* TableViewerに設定するContentProvider
*/
public void setTableContentProvider(ArrayContentProvider provider) {
this.tableContentProvider = provider;
}
/**
* 係り受け抽出一覧のラベル・プロバイダーの設定
*
* @param provider
* TableViewerに設定するLabelProvider
*/
public void setTableLabelProvider(CooccurrenceListTableLabelProvider provider) {
this.tableLabelProvider = provider;
}
/**
* 全パターン辞書名の設定
*
* @param dicNames
* 辞書名一覧
*/
public void setDicName(List<IDicName> dicNames) {
this.dicNames = dicNames;
}
/**
* 共起語の設定
*
* @param element
* 共起語リスト
*/
public void setExtractCooccurrenceElement(List<ExtractCooccurrenceElement> element) {
this.extractCooccurrenceElement = element;
}
/**
* 共起語数の設定
*
* @param cooccurrenceNum
* 共起語数
*/
public void setExtractCount(int cooccurrenceNum) {
this.cooccurrenceInt = cooccurrenceNum;
}
/* ****************************************
* UI
*/
@Override
protected Control createDialogArea(Composite parent) {
/* マスター全体の作成 */
Composite compAll = new Composite(parent, SWT.NONE);
compAll.setLayout(new GridLayout());
compAll.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
/* マスター上部の作成 */
Composite compTitle = new Composite(compAll, SWT.NONE);
compTitle.setLayout(new GridLayout());
compTitle.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
setTopComposite(compTitle);
Label labelSeparator1 = new Label(compAll, SWT.SEPARATOR | SWT.HORIZONTAL);
labelSeparator1.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
/* マスター中央部の作成 */
Composite compMiddle = new Composite(compAll, SWT.NONE);
compMiddle.setLayout(new GridLayout(2, false));
compMiddle.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
setMiddleComposite(compMiddle);
/* マスター下部の作成(セパレート表示) */
Composite compButton = new Composite(compAll, SWT.NONE);
compButton.setLayout(new GridLayout());
compButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Label labelSeparator2 = new Label(compButton, SWT.SEPARATOR | SWT.HORIZONTAL);
labelSeparator2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
return parent;
}
/**
* 上部の領域のコンポーネント配置
*
* @param parent
* 親Composite
*/
@SuppressWarnings("static-method")
private void setTopComposite(Composite parent) {
Label labelOutline = new Label(parent, SWT.NONE);
labelOutline.setText(Messages.EXTRACT_COOCCURRENCE_OUTLINE);
}
/**
* 中央の領域のコンポーネント配置
*
* @param parent
* 親Composite
*/
private void setMiddleComposite(Composite parent) {
/* 上側のコンボボックス(種類)用 Composite作成 */
Composite compComboType = new Composite(parent, SWT.NONE);
compComboType.setLayout(new GridLayout());
compComboType.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
setComboType(compComboType);
/* 上側のコンボボックス(保存先)用 Composite作成 */
Composite compComboSaved = new Composite(parent, SWT.NONE);
compComboSaved.setLayout(new GridLayout());
compComboSaved.setLayoutData(new GridData(SWT.END, SWT.NONE, false, false));
setComboSaved(compComboSaved);
/* 下側のテーブル用のComposite作成 */
Composite compTable = new Composite(parent, SWT.BORDER);
compTable.setLayout(new GridLayout());
GridData layoutTable = new GridData(SWT.FILL, SWT.FILL, true, true);
layoutTable.horizontalSpan = 2;
layoutTable.widthHint = 800;
layoutTable.heightHint = 400;
compTable.setLayoutData(layoutTable);
setTableList(compTable);
}
/* ****************************************
* Component
*/
private TableViewer cooccurrenceTableViewer = null;
private ModifyListener comboModifyListener = null;
private Combo comboToPatternType = null;
private Combo comboToSave = null;
private Button okButton = null;
private List<TableColumn> tableColumns = null;
private ExtractCooccurrenceTableSorter tableSorter = null;
/**
* 種類選択用コンボ(左)
*
* @param parent
* 親Composite
*/
private void setComboType(Composite parent) {
Composite compCombo = new Composite(parent, SWT.NONE);
compCombo.setLayout(new GridLayout(2, false));
compCombo.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
Label labelCombo = new Label(compCombo, SWT.NONE);
labelCombo.setText(Messages.EXTRACT_COOCCURRENCE_COMBO_KIND);
comboToPatternType = new Combo(compCombo, SWT.READ_ONLY);
comboToPatternType.setItems(createComboItemToPatternType());
comboModifyListener = getModifyListener();
comboToPatternType.addModifyListener(getModifyListener());
}
/**
* 保存先選択用コンボ(右)
*
* @param parent
* 親Composite
*/
private void setComboSaved(Composite parent) {
Composite compCombo = new Composite(parent, SWT.NONE);
compCombo.setLayout(new GridLayout(2, false));
compCombo.setLayoutData(new GridData(SWT.END, SWT.NONE, false, false));
Label labelCombo = new Label(compCombo, SWT.NONE);
labelCombo.setText(Messages.EXTRACT_COOCCURRENCE_COMBO_ENTRY);
labelCombo.setLayoutData(new GridData(SWT.NONE, SWT.NONE, false, false));
comboToSave = new Combo(compCombo, SWT.READ_ONLY);
comboToSave.setItems(createComboItemToSave());
comboToSave.select(0);
}
/**
* 共起語表示用テーブル(下)
*
* @param parent
* 親Composite
*/
private void setTableList(Composite parent) {
cooccurrenceTableViewer = new TableViewer(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.VIRTUAL);
cooccurrenceTableViewer.setUseHashlookup(true);
Table cooccurrenceTable = cooccurrenceTableViewer.getTable();
GridData gdMorphemeList = new GridData(GridData.FILL, SWT.FILL, true, true);
cooccurrenceTable.setToolTipText(""); //$NON-NLS-1$
cooccurrenceTable.setHeaderVisible(true);
cooccurrenceTable.setLinesVisible(true);
cooccurrenceTable.setLayoutData(gdMorphemeList);
cooccurrenceTableViewer.setLabelProvider(tableLabelProvider);
cooccurrenceTableViewer.setContentProvider(tableContentProvider);
cooccurrenceTableViewer.setInput(extractCooccurrenceElement);
cooccurrenceTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
comboModifyListener = null;
comboToPatternType.setItems(createComboItemToPatternType());
comboModifyListener = getModifyListener();
}
});
tableSorter = new ExtractCooccurrenceTableSorter();
cooccurrenceTableViewer.setSorter(tableSorter);
/* カラム生成 */
tableColumns = new ArrayList<TableColumn>(100);
tableColumns.add(createTableColumn(0, cooccurrenceTable, SWT.LEFT, Messages.EXTRACT_COOCCURRENCE_TABLE_COLUMN_KIND, 100));
tableColumns.add(createTableColumn(1, cooccurrenceTable, SWT.LEFT, Messages.EXTRACT_COOCCURRENCE_TABLE_COLUMN_NUMBER, 100));
for (int i = 1; i <= cooccurrenceInt; i++) {
tableColumns.add(createTableColumn(i + 1, cooccurrenceTable, SWT.LEFT, Messages.EXTRACT_COOCCURRENCE_TABLE_COLUMN_TERM + i, 100));
}
}
/**
* テーブルのカラムの生成
*
* @param pos
* カラムの位置
* @param table
* テーブル
* @param style
* スタイル
* @param title
* タイトル
* @param width
* 横幅
* @return TableColumn
*/
private TableColumn createTableColumn(final int pos, Table table, int style, String title, int width) {
TableColumn tc = new TableColumn(table, style);
tc.setText(title);
tc.setResizable(true);
tc.setWidth(width);
tc.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
tableSorter.setPos(pos);
tableSorter.changeSortMode();
cooccurrenceTableViewer.refresh();
}
});
return tc;
}
/** ボタン・バーの設定 */
@Override
protected void createButtonsForButtonBar(Composite parent) {
okButton = createButton(parent, BTN_ENTRY_ID, Messages.EXTRACT_COOCCURRENCE_BUTTON_ENTER, true);
okButton.setEnabled(false);
createButton(parent, BTN_CLOSE_ID, Messages.EXTRACT_COOCCURRENCE_BUTTON_CLOSE, true);
}
@Override
protected void buttonPressed(int buttonId) {
switch (buttonId) {
case BTN_ENTRY_ID:
if (questionMessageBox(getShell(), Messages.EXTRACT_COOCCURRENCE_CONFIRM_CREATE) == SWT.OK) {
ErrorNumber result = entryPatternAction();
/* 作成成功時のメッセージは表示させない */
if (result != ErrorNumber.RESULT_CREATE_OK) {
if (result == ErrorNumber.RESULT_NOT_PATTERNDIC) {
errorMessageBox(getShell(), Messages.EXTRACT_ERROR_NOT_PATTERNDIC);
} else if (result == ErrorNumber.RESULT_NOT_SAVELOCATION) {
warningMessageBox(getShell(), Messages.EXTRACT_ERROR_NOT_SAVE_LOCATION);
} else if (result == ErrorNumber.RESULT_NOT_CHECK) {
warningMessageBox(getShell(), Messages.EXTRACT_ERROR_NOT_CHOOSE);
} else {
errorMessageBox(getShell(), Messages.EXTRACT_ERROR_NOT_CREATE_PATTERN);
}
}
}
break;
case BTN_CLOSE_ID:
setReturnCode(BTN_CLOSE_ID);
close();
break;
default:
super.buttonPressed(buttonId);
break;
}
}
/* ****************************************
* Componentサポート
*/
/**
* Combo用ModifyListenerの取得
*
* @return ModifyListener
*/
private ModifyListener getModifyListener() {
return new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (cooccurrenceTableViewer != null && comboModifyListener != null) {
/* 選択中のテーブルアイテムに、Comboで選択したパターンのタイプを設定する */
IStructuredSelection ss = (IStructuredSelection) cooccurrenceTableViewer.getSelection();
if (ss != null) {
Object[] array = ss.toArray();
for (Object element : array) {
if (element instanceof ExtractCooccurrenceElement) {
((ExtractCooccurrenceElement) element).setPatternType(comboToPatternType.getText());
}
}
cooccurrenceTableViewer.update(array, null);
}
/* 登録アイテムが選択されているかの判定 */
boolean selected = false;
for (ExtractCooccurrenceElement element : extractCooccurrenceElement) {
if (!("".equals(element.getPatternType()))) { //$NON-NLS-1$
selected = true;
break;
}
}
if (selected) {
okButton.setEnabled(true);
} else {
okButton.setEnabled(false);
}
}
}
};
}
/**
* 保存先用のComboアイテムを生成
*
* @return Comboに表示する文字列
*/
private String[] createComboItemToSave() {
if (dicNames == null) {
return new String[0];
}
int cnt = 0;
String[] comboItem = new String[dicNames.size()];
/* 辞書アイテムのソート(辞書名で昇順) */
Collections.sort(dicNames, new Comparator<IDicName>() {
@Override
public int compare(IDicName o1, IDicName o2) {
String s1 = o1.getDicName();
String s2 = o2.getDicName();
return s1.compareToIgnoreCase(s2);
}
});
/* 辞書選択コンボにアイテム追加 */
for (IDicName name : dicNames) {
comboItem[cnt++] = name.getDicName();
}
return comboItem;
}
/**
* パターンの種類選択用のComboアイテムを生成
*
* @return Comboに表示する文字列
*/
private String[] createComboItemToPatternType() {
boolean enableModify = true;
List<String> comboItem = new ArrayList<String>(6);
/* テーブルの行が選択されている場合 */
if (cooccurrenceTableViewer != null) {
IStructuredSelection ss = (IStructuredSelection) cooccurrenceTableViewer.getSelection();
if (ss != null) {
Object[] array = ss.toArray();
for (Object element : array) {
/* 選択された単語が3つ以上の場合、係り受けは選択不可 */
if (element instanceof ExtractCooccurrenceElement) {
if (2 < ((ExtractCooccurrenceElement) element).getSize()) {
enableModify = false;
break;
}
}
}
}
}
comboItem.add(""); //$NON-NLS-1$
comboItem.add(PatternKind.AND.toString());
comboItem.add(PatternKind.OR.toString());
if (enableModify == true) {
comboItem.add(PatternKind.MODIFICATION.toString());
}
comboItem.add(PatternKind.SEQUENCE.toString());
comboItem.add(PatternKind.ORDER.toString());
return comboItem.toArray(new String[comboItem.size()]);
}
/* ****************************************
* 登録
*/
private boolean resultEntry = false;
private enum ErrorNumber {
RESULT_CREATE_OK, RESULT_CREATE_NG, RESULT_NOT_PATTERNDIC, RESULT_NOT_SAVELOCATION, RESULT_NOT_CHECK
}
/**
* パターン辞書に登録
*
* @return エラー番号
*/
private ErrorNumber entryPatternAction() {
if ("".equals(comboToSave.getText())) { //$NON-NLS-1$
/* 保存先が未選択の場合 */
return ErrorNumber.RESULT_NOT_SAVELOCATION;
}
/* Comboで選択中の登録先辞書を取得 */
IDicName dicName = dicNames.get(comboToSave.getSelectionIndex());
ICoronaDic coronaDic = IoActivator.getService().getDictionary(dicName.getDicId());
if (!(coronaDic instanceof IPatternDic)) {
/* パターン辞書の取得に失敗した場合 */
return ErrorNumber.RESULT_NOT_PATTERNDIC;
}
if (entryExec(coronaDic) != true) {
/* 一つもチェックが入っていなければエラーメッセージを表示してリターン */
return ErrorNumber.RESULT_NOT_CHECK;
}
/* コミット */
if (coronaDic.commit(new NullProgressMonitor()) != true) {
return ErrorNumber.RESULT_CREATE_NG;
}
/* updateで更新不可なので再セット */
cooccurrenceTableViewer.setInput(extractCooccurrenceElement);
okButton.setEnabled(false);
return ErrorNumber.RESULT_CREATE_OK;
}
/**
* 登録の実行処理
*
* @param coronaDic
* 登録先辞書
* @return true:成功、false:失敗(登録アイテムがない)
*/
private boolean entryExec(final ICoronaDic coronaDic) {
ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell());
try {
dialog.run(true, true, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
monitor.beginTask(Messages.EXTRACT_MESSAGEBOX_TITLE_ENTRY, extractCooccurrenceElement.size() * 6);
monitor.subTask(Messages.EXTRACT_MESSAGEBOX_TEXT_EXEC_JUMAN);
for (ExtractCooccurrenceElement element : extractCooccurrenceElement) {
PatternRecord input = createPatternRecord(element, monitor);
if (input != null) {
element.setCompletion(true);
element.setPatternType(""); //$NON-NLS-1$
input.getIPattern().setDirty(true);
((IPatternDic) coronaDic).addItem(input.getIPattern());
resultEntry = true;
}
}
monitor.done();
}
});
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return resultEntry;
}
/**
* パターンレコードの生成
*
* @param ece
* 係り受け抽出結果
* @param monitor
* プログレス・モニター
* @return パターンレコード
*/
private PatternRecord createPatternRecord(IExtractCooccurrenceElement ece, IProgressMonitor monitor) {
StringBuilder label = new StringBuilder(128);
PatternRecord record = new PatternRecord();
Pattern pattern = createPattern(record, ece, monitor);
if (pattern == null) {
return null;
}
for (int i = 1; i <= ece.getSize(); i++) {
if (i > 1) {
label.append(",").append(ece.getTerm(i)); //$NON-NLS-1$
} else {
label.append(ece.getTerm(i));
}
}
record.addChild(pattern);
record.setLabel(label.toString());
/* レコードをテキストに変換して登録(レコードに子を追加しただけではデータベースに登録されないので) */
String convertString = DicPatternUtil.convertFrom(record);
record.getIPattern().setText(convertString);
monitor.worked(1);
return record;
}
/**
* パターンを作成する
*
* @param record
* パターンレコード
* @param ece
* 共起抽出結果
* @param monitor
* プログレス・モニター
* @return パターン
*/
private Pattern createPattern(PatternRecord record, IExtractCooccurrenceElement ece, IProgressMonitor monitor) {
/* パターン生成 */
String patternType = ece.getPatternType();
PatternContainer pattern = null;
if (PatternKind.AND.toString().equals(patternType)) {
pattern = new AndOperator(record);
} else if (PatternKind.OR.toString().equals(patternType)) {
pattern = new OrOperator(record);
} else if (PatternKind.ORDER.toString().equals(patternType)) {
pattern = new Order(record);
} else if (PatternKind.SEQUENCE.toString().equals(patternType)) {
pattern = new Sequence(record);
} else if (PatternKind.MODIFICATION.toString().equals(patternType)) {
pattern = new Modification(record, true);
} else {
return null;
}
/* Juman実行 */
List<MorphemeElement[]> morphemeLists = correctionExtractCooccurrence(ece.getTerms(), monitor);
if (morphemeLists.size() == 0) {
return null;
}
if (pattern instanceof Modification) {
/* 係り受けの場合は係り元と係り先を追加 */
createChild(((Modification) pattern).getSource(), morphemeLists.get(0));
createChild(((Modification) pattern).getDestination(), morphemeLists.get(1));
} else {
/* 係り受け以外は単語の数だけ子を追加 */
for (MorphemeElement[] morphemeResults : morphemeLists) {
createChild(pattern, morphemeResults);
}
}
monitor.worked(1);
return pattern;
}
/**
* 共起抽出した語をJuman実行にかける
*
* @param texts
* 共起抽出語リスト
* @param monitor
* プログレス・モニター
* @return Juman実行結果
*/
private static List<MorphemeElement[]> correctionExtractCooccurrence(List<String> texts, IProgressMonitor monitor) {
CorrectionStringList correctionList = new CorrectionStringList();
List<MorphemeElement[]> morphemeList = null;
/* Juman実行 */
List<String> jumanLists = correctionList.jumanExec(texts, monitor);
morphemeList = new ArrayList<MorphemeElement[]>(100);
for (String jumanList : jumanLists) {
/* Juman実行結果を","単位で区切って格納 */
String[] jumanResults = jumanList.split(","); //$NON-NLS-1$
List<MorphemeElement> input = new ArrayList<MorphemeElement>(jumanResults.length);
for (String jumanResult : jumanResults) {
/* 先頭が"@"から始まるものは排除 */
String[] rengo = jumanResult.split(" "); //$NON-NLS-1$
if (!"@".equals(rengo[0])) { //$NON-NLS-1$
input.add(new MorphemeElement(jumanResult));
}
}
morphemeList.add(input.toArray(new MorphemeElement[input.size()]));
}
monitor.worked(1);
monitor.subTask(Messages.EXTRACT_MESSAGEBOX_TEXT_ENTRY_PATTERN);
return morphemeList;
}
/**
* 子要素の生成
* (このメソッド自体は作成する単語数が複数の場合にSequenceを生成する)
*
* @param element
* 親パターン
* @param morphemes
* 形態素(本メソッドで呼び出している単語の生成にて使用)
*/
private void createChild(PatternContainer element, MorphemeElement[] morphemes) {
/* 複数の形態素を持つ場合はSequenceを生成する(但し、既に親がSequenceの場合を除く) */
if (morphemes.length > 1 && !(element instanceof Sequence)) {
Sequence sequence = new Sequence(element);
element.addChild(sequence);
/* "文節"に設定 */
sequence.setScope(SearchScopeType.SEARCH_SEGMENT);
setTerms(sequence, morphemes);
} else {
setTerms(element, morphemes);
}
}
/**
* 単語の生成
*
* @param element
* 親パターン
* @param morphemes
* 形態素
*/
@SuppressWarnings("static-method")
private void setTerms(PatternContainer element, MorphemeElement[] morphemes) {
for (MorphemeElement morpheme : morphemes) {
Term term = new Term(element);
term.setWord(morpheme.getGenkei());
term.setPart(TermPart.valueOfName(morpheme.getHinshi()));
term.setWordClass(TermClass.valueOfName(morpheme.getHinshiSaibunrui()));
element.addChild(term);
}
}
/* ****************************************
* その他
*/
/**
* メッセージボックス(確認用)
*
* @param shell
* 親Shell
* @param message
* メッセージ
* @return 処理結果
*/
private static int questionMessageBox(Shell shell, String message) {
MessageBox messageBox = new MessageBox(shell, SWT.ICON_QUESTION | SWT.OK | SWT.CANCEL);
messageBox.setText(Messages.EXTRACT_MESSAGEBOX_TEXT_QUESTION);
messageBox.setMessage(message);
return messageBox.open();
}
/**
* メッセージボックス(確認用)
*
* @param shell
* 親Shell
* @param message
* メッセージ
*/
private static void warningMessageBox(Shell shell, String message) {
MessageBox messageBox = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK);
messageBox.setText(Messages.EXTRACT_MESSAGEBOX_TEXT_WARNING);
messageBox.setMessage(message);
messageBox.open();
}
/**
* メッセージボックス(エラー用)
*
* @param shell
* 親Shell
* @param message
* メッセージ
*/
private static void errorMessageBox(Shell shell, String message) {
MessageBox messageBox = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
messageBox.setText(Messages.EXTRACT_MESSAGEBOX_TEXT_ERROR);
messageBox.setMessage(message);
messageBox.open();
}
@Override
protected boolean isResizable() {
return true;
}
}