/** * @file TermElementListSelectionDialog.java * @version $Id$ * * 2013/08/05 16:26:12 * @author s.takuro * * Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved. */ package com.tida_okinawa.corona.ui.editors.pattern; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import com.tida_okinawa.corona.correction.erratum.Erratum; import com.tida_okinawa.corona.internal.ui.component.ElementListSelectionDialog1; import com.tida_okinawa.corona.internal.ui.util.DelayTimer; import com.tida_okinawa.corona.io.model.dic.ICoronaDic; import com.tida_okinawa.corona.io.model.dic.IDicItem; /** * #1385 単語選択ダイアログ表示の高速化の為に、一部機能をOverrideしてカスタマイズ * * @author s.takuro */ public class TermElementListSelectionDialog extends ElementListSelectionDialog1 { List<ICoronaDic> ICoronaDics; /** * @param parent * このダイアログの親Shell * @param renderer * 表示するアイテムのラベルプロバイダ */ public TermElementListSelectionDialog(Shell parent, ILabelProvider renderer) { super(parent, renderer); isSettingElements = true; } /** * @param input * 辞書 */ public void setDicList(List<ICoronaDic> input) { ICoronaDics = input; } /* **************************************** * Override */ private Text filteredText; private boolean isSettingElements; @Override protected Text createFilterText(Composite parent) { final Text finalText = filteredText = super.createFilterText(parent); /* 入力直後にフィルタを適用するリスナーがついているので、元のリスナーを外す */ Listener[] listeners = filteredText.getListeners(SWT.Modify); for (Listener listener : listeners) { filteredText.removeListener(SWT.Modify, listener); } final DelayTimer timer = new DelayTimer("", new Runnable() { //$NON-NLS-1$ @Override public void run() { getShell().getDisplay().asyncExec(new Runnable() { @Override public void run() { if (isConvertZenkaku()) { String zenkakuString = Erratum.convertZenkakuString(finalText.getText()).replace('*', '*'); getFilteredList().setFilter(zenkakuString); } else { getFilteredList().setFilter(finalText.getText()); } } }); } }); Listener listener = new Listener() { @Override public void handleEvent(Event e) { getShell().setCursor(new Cursor(null, SWT.CURSOR_WAIT)); /* ユーザ辞書から単語を取得してダイアログに設定 */ if (isSettingElements) { /* 2度目以降に単語を取得する際、メモリに保管した場合と比較しても速度にほぼ差はない */ List<IDicItem> viewItems = new ArrayList<IDicItem>(); for (ICoronaDic dic : ICoronaDics) { viewItems.addAll(dic.getItems()); } setListElements(viewItems.toArray()); isSettingElements = false; } /* テキストボックスが空欄となった場合 */ else if (finalText.getText().isEmpty()) { setListElements(null); isSettingElements = true; } getShell().setCursor(new Cursor(null, SWT.CURSOR_ARROW)); timer.run(getFilterDelay()); } }; FocusListener focusListener = new FocusListener() { private int oldImeMode = -1; @Override public void focusGained(FocusEvent e) { Shell shell = getShell(); oldImeMode = shell.getImeInputMode(); if (getImeMode() == -1) { shell.setImeInputMode(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().getImeInputMode()); } else { shell.setImeInputMode(getImeMode()); } } @Override public void focusLost(FocusEvent e) { Shell shell = getShell(); shell.setImeInputMode(oldImeMode); } }; filteredText.addListener(SWT.Modify, listener); filteredText.addFocusListener(focusListener); return filteredText; } @Override protected void handleEmptyList() { /* リストが空でもコントロールを無効にしない */ updateOkState(); } }