/**
* @version $Id: DbViewExportHandler.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2011/12/16 14:48:10
* @author shingo-takahashi
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.ui.handlers;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import com.tida_okinawa.corona.CoronaActivator;
import com.tida_okinawa.corona.internal.ui.actions.DictionaryExportOperation;
import com.tida_okinawa.corona.io.IoActivator;
import com.tida_okinawa.corona.io.model.IClaimData;
import com.tida_okinawa.corona.io.model.ICoronaProject;
import com.tida_okinawa.corona.io.model.dic.ICoronaDic;
import com.tida_okinawa.corona.io.model.dic.ILabelDic;
import com.tida_okinawa.corona.io.model.dic.IUserDic;
import com.tida_okinawa.corona.ui.UIActivator;
/**
* @author shingo-takahashi
*/
public class DbViewExportHandler extends AbstractHandler {
private IStructuredSelection selection;
private IWorkbenchWindow window;
private Shell shell;
File exportDir;
final Map<ICoronaDic, Set<ILabelDic>> map = new HashMap<ICoronaDic, Set<ILabelDic>>();
List<ICoronaDic> coronaDics = new ArrayList<ICoronaDic>();
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
try {
shell = HandlerUtil.getActiveShell(event);
DirectoryDialog dialog = new DirectoryDialog(shell);
dialog.setMessage("エクスポート先を指定してください");
String path = dialog.open();
// ファイルパスがnullの場合は処理を中止します。
if (path == null) {
return false;
}
exportDir = new File(path);
coronaDics = new ArrayList<ICoronaDic>();
Object appContextObj = event.getApplicationContext();
if (appContextObj instanceof IEvaluationContext) {
IEvaluationContext context = (IEvaluationContext) event.getApplicationContext();
Object var = context.getDefaultVariable();
// 選択されている辞書リスト
if (var instanceof List<?>) {
for (Object o : (List<?>) var) {
if (o instanceof ICoronaDic) {
if (o instanceof IUserDic) {
List<ICoronaDic> ldics = IoActivator.getService().getDictionarys(ILabelDic.class);
for (ICoronaDic dic : ldics) {
Set<Integer> id = dic.getParentIds();
if (id.contains(((ICoronaDic) o).getId())) {
Set<ILabelDic> list = map.get(o);
if (list == null) {
list = new HashSet<ILabelDic>();
map.put((ICoronaDic) o, list);
}
list.add((ILabelDic) dic);
}
}
}
coronaDics.add((ICoronaDic) o);
}
}
}
}
} catch (Exception e) {
return false;
}
final DictionaryExportOperation op = new DictionaryExportOperation();
Job exportJob = new Job("エクスポート") {
@Override
protected IStatus run(IProgressMonitor monitor) {
IStatus status = null;
try {
status = op.execute(coronaDics.toArray(new ICoronaDic[coronaDics.size()]), exportDir, map, monitor);
} catch (ExecutionException e) {
e.printStackTrace();
status = new Status(Status.ERROR, UIActivator.PLUGIN_ID, e.getLocalizedMessage());
}
if (status.getSeverity() == IStatus.CANCEL) {
CoronaActivator.getDefault().getLogger().getOutStream().println("処理がキャンセルされました。");
}
return status;
}
@Override
public boolean belongsTo(Object family) {
return false;
}
};
exportJob.setUser(true);
exportJob.setSystem(false);
exportJob.schedule();
return true;
}
@Override
public boolean isEnabled() {
window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window == null) {
return false;
}
/*
* 何も選択されていなければfalse
* 単/複数選択時、フォルダを含んで選択している場合はfalse
* 辞書(ラベル辞書以外)を選択している場合true
*/
selection = (IStructuredSelection) window.getActivePage().getSelection();
if (selection != null && selection.size() > 0) {
for (Object item : selection.toArray()) {
if (item instanceof ICoronaDic) {
// ラベル辞書のエクスポートは対象外
if (item instanceof ILabelDic) {
return false;
}
} else if (item instanceof ICoronaProject) {
return false;
} else if (item instanceof IClaimData) {
return false;
} else {
return false;
}
}
return true;
}
return false;
}
}