/**
* @version $Id: DeleteDicCategoryAction.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2012/01/12 20:18:25
* @author kousuke-morishima
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.ui.views.db.action;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import com.tida_okinawa.corona.CoronaActivator;
import com.tida_okinawa.corona.PreviewDialog;
import com.tida_okinawa.corona.PreviewableAction;
import com.tida_okinawa.corona.io.IoActivator;
import com.tida_okinawa.corona.io.model.TextItem;
import com.tida_okinawa.corona.io.model.dic.DicType;
import com.tida_okinawa.corona.io.model.dic.ICoronaDic;
import com.tida_okinawa.corona.io.model.dic.IUserDic;
/**
* @author kousuke-morishima
*/
public class DeleteDicCategoryAction extends PreviewableAction {
/**
* 選択された分野
*/
List<TextItem> categories;
/**
* 分野に対して、紐づいている辞書のリストマップ
*/
private Map<TextItem, List<ICoronaDic>> dependencyItems = new HashMap<TextItem, List<ICoronaDic>>();
public DeleteDicCategoryAction(List<TextItem> categories) {
this.categories = categories;
}
public DeleteDicCategoryAction(IStructuredSelection selection) {
categories = new ArrayList<TextItem>(selection.size());
for (Object o : selection.toArray()) {
if (o instanceof TextItem) {
categories.add((TextItem) o);
}
}
}
/*
*
* 辞書に紐づいている分野が一つもない場合、または紐づいている辞書一覧表示後に呼ばれる。
* 辞書に紐づいていない分野のみ削除を行う
*/
@Override
protected void doRun() {
for (TextItem category : categories) {
if (!dependencyItems.containsKey(category)) {
IoActivator.getService().removeCategory(category.getText());
}
}
}
/*
*
* 辞書に紐付く分野がひとつでもあれば、
* その分野に削除処理が走るように false を返す
*/
@Override
protected boolean checkEffected() {
List<ICoronaDic> dics = IoActivator.getService().getDictionarys(IUserDic.class);
for (TextItem category : categories) {
for (ICoronaDic dic : dics) {
if (DicType.CATEGORY.equals(((IUserDic) dic).getDicType())) {
if (category.equals(((IUserDic) dic).getDicCategory())) {
if (!dependencyItems.containsKey(category)) {
dependencyItems.put(category, new ArrayList<ICoronaDic>());
}
dependencyItems.get(category).add(dic);
}
}
}
}
return dependencyItems.keySet().size() > 0;
}
@Override
protected boolean doRunWhenNoEffectedItems() {
return true;
}
@Override
protected int openPreviewDialog(Shell shell) {
/* プレビューはする。処理はしない */
String message = "以下の辞書は分類に属しているため、削除できませんでした。";
PreviewDialog dialog = new PreviewDialog(shell, false) {
@Override
protected void createDetailArea(Composite parent) {
}
@Override
protected void selectionChanged(IStructuredSelection selection) {
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, "OK", true);
}
};
dialog.setTreeContentProvider(new ConPro());
dialog.setTreeLabelProvider(new LabelProvider());
dialog.setMessage(message);
dialog.setInput(dependencyItems);
dialog.setWeight(new int[] { 1 });
dialog.open();
/* コンソールにメッセージを表示 */
CoronaActivator.getDefault().getLogger().getOutStream().println(message);
for (Map.Entry<TextItem, List<ICoronaDic>> entry : dependencyItems.entrySet()) {
CoronaActivator.getDefault().getLogger().getOutStream().print("[ " + entry.getKey().getText() + " ]\n ");
for (ICoronaDic dic : entry.getValue()) {
CoronaActivator.getDefault().getLogger().getOutStream().print(dic.getName() + ", ");
}
CoronaActivator.getDefault().getLogger().getOutStream().println();
}
CoronaActivator.getDefault().getLogger().getOutStream().println(); // new
// line
/**
* ダイアログ表示後、辞書に紐づいていない分野の削除も行うために OK code を返している
*/
return dialog.getReturnCode();
}
private class ConPro extends PreviewDialog.ContentProvider {
@Override
public Object[] getElements(Object input) {
return ((HashMap<?, ?>) input).keySet().toArray();
}
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof TextItem) {
return dependencyItems.get(parentElement).toArray();
}
return new Object[0];
}
/*
*
* 指定された分野に依存している辞書があるかどうかを返す。
* 辞書がきたら無視
*
* {@link #checkEffected()} で作成された dependencyItems には
* 辞書が依存している分野しか入っていないので
* 必ず true が返る
*
* @param element
*
* @return 分野に依存している辞書があるかどうか。辞書がきたら false
*/
@Override
public boolean hasChildren(Object element) {
return (element instanceof TextItem) || dependencyItems.containsKey(element);
}
}
}