/**
* @version $Id: CleansingViewerControl.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2012/01/06 11:32:25
* @author takayuki-matsumoto
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.ui.wizards;
import java.util.List;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import com.tida_okinawa.corona.internal.ui.component.CompositeUtil;
import com.tida_okinawa.corona.io.IoActivator;
import com.tida_okinawa.corona.io.model.ICoronaDicPri;
import com.tida_okinawa.corona.io.model.dic.ICoronaDic;
import com.tida_okinawa.corona.ui.Icons;
/**
* @author takayuki-matsumoto
*/
public class CleansingViewerControl {
CheckboxTableViewer viewer;
List<ICoronaDicPri> pris;
/**
* クレンジング実行ウィザードのコンポジット(コンテナー)設定値を定義
*
* @param parent
*/
public CleansingViewerControl(Composite parent) {
createContents(parent);
}
/* ****************************************
* UI
*/
private Button selectAllButton;
private Button deselectAllButton;
private Button upButton;
private Button downButton;
private void createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(2, false);
gridLayout.marginWidth = 10;
gridLayout.marginHeight = 0;
composite.setLayout(gridLayout);
GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
composite.setLayoutData(layoutData);
viewer = CheckboxTableViewer.newCheckList(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.SINGLE);
viewer.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
if (event.getElement() instanceof ICoronaDicPri) {
((ICoronaDicPri) event.getElement()).setInActive(!event.getChecked());
fireCheckStateChanged();
}
}
});
/* カラム設定 */
final Table tbl = viewer.getTable();
layoutData = new GridData(SWT.FILL, SWT.FILL, false, true);
layoutData.heightHint = 200;
tbl.setLayoutData(layoutData);
tbl.setHeaderVisible(true);
CompositeUtil.createColumn(tbl, "辞書名", 300);
viewer.addDragSupport(DND.DROP_MOVE, new Transfer[] { LocalSelectionTransfer.getTransfer() }, dragSource);
viewer.addDropSupport(DND.DROP_MOVE, new Transfer[] { LocalSelectionTransfer.getTransfer() }, new DicDropTargetListener(viewer));
viewer.setContentProvider(new ArrayContentProvider());
viewer.setLabelProvider(new CleansingLabelProvider());
viewer.setInput(this.pris);
Composite buttonGroup = CompositeUtil.defaultComposite(composite, 1);
((GridLayout) buttonGroup.getLayout()).makeColumnsEqualWidth = true;
((GridData) buttonGroup.getLayoutData()).grabExcessHorizontalSpace = true;
selectAllButton = CompositeUtil.createBtn(buttonGroup, SWT.PUSH, "全選択(&A)", selectAllButtonListener);
selectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
deselectAllButton = CompositeUtil.createBtn(buttonGroup, SWT.PUSH, "全解除(&D)", deselectAllButtonListener);
deselectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
upButton = CompositeUtil.createBtn(buttonGroup, SWT.PUSH, "優先度を上げる(&U)", selectUpButtonListener);
upButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
downButton = CompositeUtil.createBtn(buttonGroup, SWT.PUSH, "優先度を下げる(&W)", selectDownButtonListener);
downButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
}
/**
* 共通・個人設定のどちらかが有効でない場合にボタン、ビューを無効化(グレーアウト)
*
* @param enabled
*/
public void setControlsEnabled(boolean enabled) {
selectAllButton.setEnabled(enabled);
deselectAllButton.setEnabled(enabled);
upButton.setEnabled(enabled);
downButton.setEnabled(enabled);
viewer.getTable().setEnabled(enabled);
}
/**
* @param list
* must not null
*/
public void setInput(List<ICoronaDicPri> list) {
this.pris = list;
viewer.setInput(list);
if (list.size() > 0) {
for (ICoronaDicPri pri : list) {
viewer.setChecked(pri, !pri.isInActive());
}
fireCheckStateChanged();
}
}
private boolean usePriorityFunction = true;
/**
* @return 優先度設定機能を使える状態ならtrue
*/
boolean isUsePriorityFunction() {
return usePriorityFunction;
}
/**
* 優先度設定機能を使うかどうか
*
* @param use
*/
public void setUsePriorityFunction(boolean use) {
upButton.setVisible(use);
downButton.setVisible(use);
usePriorityFunction = use;
}
/**
* ウィザードを開く際のフォーカス位置を指定(チェックボックス)
*
*/
public void setFocus() {
viewer.getControl().setFocus();
}
/* ****************************************
* リスナー
*/
private final SelectionListener selectAllButtonListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
TableItem[] items = viewer.getTable().getItems();
for (TableItem item : items) {
/* チェックボックスのチェックを入れる */
item.setChecked(true);
/* Inactiveフラグにデータを設定 */
ICoronaDicPri pri = (ICoronaDicPri) item.getData();
pri.setInActive(false);
}
fireCheckStateChanged();
}
};
private final SelectionListener deselectAllButtonListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
TableItem[] items = viewer.getTable().getItems();
for (TableItem item : items) {
/* チェックボックスのチェックを外す */
item.setChecked(false);
/* Inactiveフラグにデータを設定 */
ICoronaDicPri pri = (ICoronaDicPri) item.getData();
pri.setInActive(true);
}
fireCheckStateChanged();
}
};
private final SelectionListener selectUpButtonListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int index = viewer.getTable().getSelectionIndex();
ICoronaDicPri dic = (ICoronaDicPri) viewer.getElementAt(index);
if (index > 0) {
pris.remove(dic);
pris.add(index - 1, dic);
viewer.setInput(pris);
/* スクロールさせる */
TableItem item = viewer.getTable().getItem(index - 1);
viewer.getTable().showItem(item);
}
}
};
private final SelectionListener selectDownButtonListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Integer index = viewer.getTable().getSelectionIndex();
ICoronaDicPri dic = (ICoronaDicPri) viewer.getElementAt(index);
if (index < viewer.getTable().getItemCount() - 1) {
pris.add(index + 2, dic);
pris.remove(dic);
viewer.setInput(pris);
/* スクロールさせる */
TableItem item = viewer.getTable().getItem(index + 1);
viewer.getTable().showItem(item);
}
}
};
/* ****************************************
* 外部リスナー
*/
private ListenerList listeners = new ListenerList();
protected void fireCheckStateChanged() {
for (Object l : listeners.getListeners()) {
((Listener) l).handleEvent(null);
}
}
/**
* チェックの状態が変わった通知を受け取るリスナーを登録する
* eventにはnullが渡ってくるので、本当に状態が変わったことしかわからない
*
* @param listener
*/
public void addCheckStateChangedListener(Listener listener) {
listeners.add(listener);
}
/* ****************************************
* DnD
* ドラッグ開始
* 1. dragStart(Source)
* 2. validateDrop(Target)
* ドラッグやめた
* 3. dragSetData(Source)
* 4. performDrop(Target)
* 5. dragFinished(Source)
*/
private DragSourceListener dragSource = new DragSourceAdapter() {
@Override
public void dragStart(DragSourceEvent event) {
/* 優先度入れ替え機能を使わないならキャンセル */
event.doit = isUsePriorityFunction();
}
@Override
public void dragSetData(DragSourceEvent event) {
IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
Object element = selection.getFirstElement();
if (element instanceof ICoronaDicPri) {
if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) {
((LocalSelectionTransfer) ((DragSource) event.getSource()).getTransfer()[0]).setSelection(selection);
}
}
}
};
private class DicDropTargetListener extends ViewerDropAdapter {
public DicDropTargetListener(CheckboxTableViewer viewer) {
super(viewer);
}
@Override
public boolean validateDrop(Object targetObject, int operation, TransferData transferType) {
return true;
}
@Override
public boolean performDrop(Object data) {
ICoronaDicPri srcDic = (ICoronaDicPri) ((IStructuredSelection) data).getFirstElement();
ICoronaDicPri dstDic = (ICoronaDicPri) getCurrentTarget();
if (dstDic == null) {
return true;
}
Integer dstIndex = pris.indexOf(dstDic);
Integer srcIndex = pris.indexOf(srcDic);
Integer location = getCurrentLocation();
if (location == LOCATION_BEFORE) {
if (dstIndex - srcIndex > 0) {
pris.add(dstIndex, srcDic);
pris.remove(srcDic);
} else {
pris.remove(srcDic);
pris.add(dstIndex, srcDic);
}
} else if (location == LOCATION_AFTER) {
if (dstIndex - srcIndex > 0) {
pris.add(dstIndex + 1, srcDic);
pris.remove(srcDic);
} else {
pris.remove(srcDic);
pris.add(dstIndex + 1, srcDic);
}
} else if (location == LOCATION_ON) {
pris.remove(srcDic);
pris.add(dstIndex, srcDic);
}
viewer.setInput(pris);
return true;
}
};
private static class CleansingLabelProvider extends LabelProvider {
public CleansingLabelProvider() {
}
@Override
public String getText(Object element) {
if (element instanceof ICoronaDicPri) {
int dicId = ((ICoronaDicPri) element).getDicId();
ICoronaDic dic = IoActivator.getService().getDictionary(dicId);
if (dic != null) {
return dic.getName();
} else {
return "辞書を習得できません";
}
}
return super.getText(element);
}
@Override
public Image getImage(Object element) {
/* 辞書 */
if (element instanceof ICoronaDicPri) {
int dicId = ((ICoronaDicPri) element).getDicId();
element = IoActivator.getService().getDictionary(dicId);
/* 一般辞書 */
if (((ICoronaDic) element).getName().endsWith(".cdic")) {
return Icons.INSTANCE.get(Icons.IMG_DIC_COMMON);
}
/* 分野辞書 */
if (((ICoronaDic) element).getName().endsWith(".ddic")) {
return Icons.INSTANCE.get(Icons.IMG_DIC_CATEGORY);
}
/* 固有辞書 */
if (((ICoronaDic) element).getName().endsWith(".dic")) {
return Icons.INSTANCE.get(Icons.IMG_DIC_SPECIAL);
}
/* ゆらぎ辞書 */
if (((ICoronaDic) element).getName().endsWith(".fdic")) {
return Icons.INSTANCE.get(Icons.IMG_DIC_FLUC);
}
/* ラベル辞書 */
if (((ICoronaDic) element).getName().endsWith(".ldic")) {
return Icons.INSTANCE.get(Icons.IMG_DIC_LABEL);
}
/* 構文パターン辞書 */
if (((ICoronaDic) element).getName().endsWith(".pdic")) {
return Icons.INSTANCE.get(Icons.IMG_DIC_PATTERN);
}
/* 同義語辞書 */
if (((ICoronaDic) element).getName().endsWith(".sdic")) {
return Icons.INSTANCE.get(Icons.IMG_DIC_SYNONYM);
}
/* JUMAN辞書 */
if (((ICoronaDic) element).getName().endsWith(".jdic")) {
return Icons.INSTANCE.get(Icons.IMG_DIC_JUMAN);
}
}
return super.getImage(element);
}
}
}