/**
* @version $Id: NewProductCreationWizardPage.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2011/08/03 15:17:48
* @author kousuke-morishima
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.ui.wizards;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
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.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import com.tida_okinawa.corona.CoronaActivator;
import com.tida_okinawa.corona.common.StringUtil;
import com.tida_okinawa.corona.internal.ui.actions.CoronaElementDeleteOperation;
import com.tida_okinawa.corona.internal.ui.component.CompositeUtil;
import com.tida_okinawa.corona.internal.ui.component.ElementListSelectionDialog1;
import com.tida_okinawa.corona.internal.ui.component.TextWithBrowseButtonGroup;
import com.tida_okinawa.corona.internal.ui.util.CollectionUtil;
import com.tida_okinawa.corona.internal.ui.views.model.IUIClaim;
import com.tida_okinawa.corona.internal.ui.views.model.IUIDictionary;
import com.tida_okinawa.corona.internal.ui.views.model.IUIElement;
import com.tida_okinawa.corona.internal.ui.views.model.IUIProduct;
import com.tida_okinawa.corona.internal.ui.views.model.IUIProject;
import com.tida_okinawa.corona.internal.ui.views.model.IUIWork;
import com.tida_okinawa.corona.internal.ui.views.model.impl.CoronaModel;
import com.tida_okinawa.corona.io.IoActivator;
import com.tida_okinawa.corona.io.model.ClaimWorkDataType;
import com.tida_okinawa.corona.io.model.IClaimData;
import com.tida_okinawa.corona.io.model.IClaimWorkData;
import com.tida_okinawa.corona.io.model.ICoronaProduct;
import com.tida_okinawa.corona.io.model.ICoronaProject;
import com.tida_okinawa.corona.io.model.dic.ICoronaDic;
import com.tida_okinawa.corona.io.model.table.IFieldHeader;
import com.tida_okinawa.corona.io.util.CoronaIoUtils;
import com.tida_okinawa.corona.ui.Icons;
import com.tida_okinawa.corona.ui.UIActivator;
/**
* @author kousuke-morishima
*/
public class NewProductCreationWizardPage extends WizardPageBase {
protected NewProductCreationWizardPage(String pageName, IStructuredSelection selection) {
super(pageName);
setTitle(Messages.NewProductCreationWizardPage_wizardTitleEntryProduct);
setDescription(Messages.NewProductCreationWizardPage_wizardPageDescription);
Object item = selection.getFirstElement();
IProject project = null;
if (item instanceof IUIElement) {
project = ((IUIElement) item).getResource().getProject();
} else if (item instanceof IResource) {
project = ((IResource) item).getProject();
}
setSelectedProject(project);
}
/* ****************************************
* インタフェース
*/
/**
* ターゲットアイテムを作って返す
*
* @return
*/
public List<IUIProduct> createProducts() {
/* 入力内容を更新 */
getSelectedProductNames(true);
getSelectedFields(true);
IUIProject uiProject = getSelectedUIProject();
if (uiProject == null) {
return new ArrayList<IUIProduct>(0);
}
final ICoronaProject coronaProject = uiProject.getObject();
if (coronaProject == null) {
return new ArrayList<IUIProduct>(0);
}
final IClaimData currentClaim = getSelectedClaimData();
/* 新規問い合わせデータなら追加する */
boolean isNewClaim = !includeProject(currentClaim);
if (isNewClaim) {
coronaProject.addClaimData(currentClaim);
IUIClaim uiClaim = CoronaModel.INSTANCE.getClaim(uiProject, currentClaim);
uiClaim.update(null);
}
/*
* 既存ターゲットのマイニングフィールドを変更した場合、更新する
*/
int claimId = currentClaim.getId();
for (IUIProduct uiProduct : uiProject.getProducts()) {
updateMiningFields(uiProduct, claimId);
}
List<IUIProduct> products = new ArrayList<IUIProduct>(); /* 新規に作ったターゲットを入れておく */
for (String name : selectedProductNames) {
/* 既存ターゲットであれば、何もしなくていい */
if (!isNewClaim && includeProject(name)) {
continue;
}
/* IFolderを作る(handleを取得する) */
IFolder productFolder = selectedProject.getFolder(StringUtil.convertValidFileName(name));
/* ICoronaProductを作る(既存ターゲットであれば、キャッシュが返ってくる) */
IUIProduct uiProduct = (IUIProduct) CoronaModel.INSTANCE.create(productFolder, name);
ICoronaProduct product = uiProduct.getObject();
if (product == null) {
CoronaActivator.log(new Status(IStatus.ERROR, UIActivator.PLUGIN_ID, Messages.NewProductCreationWizardPage_errorProduct + name
+ Messages.NewProductCreationWizardPage_errorCreate, new NullPointerException(Messages.NewProductCreationWizardPage_error)), false);
continue;
}
products.add(uiProduct);
// 新規ターゲットなので、追加するだけ
for (IFieldHeader field : selectedFields) {
product.addMiningField(claimId, field.getId());
}
/* ターゲット(IFolder)を作る */
uiProduct.update(null);
/* 子フォルダを作る */
for (IUIElement child : uiProduct.getChildren()) {
child.update(null);
}
/* ターゲットに紐づいた辞書、処理結果があれば作る */
List<ICoronaDic> dics = product.getDictionarys(ICoronaDic.class);
for (ICoronaDic dic : dics) {
IUIDictionary uiDic = CoronaModel.INSTANCE.getDic(uiProduct, dic);
uiDic.update(null);
}
Set<IClaimWorkData> works = product.getClaimWorkDatas();
for (IClaimWorkData work : works) {
IUIWork uiWork = CoronaModel.INSTANCE.getWork(uiProduct, work);
uiWork.update(null);
}
}
return products;
}
/**
* uiProductが現在選択している問合せデータに関連するターゲットだったら、マイニングフィールドを更新する。
*
* @param uiProduct
* 検査対象のターゲット
* @param claimId
* 今回選択した問合せデータのID
*/
private void updateMiningFields(IUIProduct uiProduct, int claimId) {
ICoronaProduct product = uiProduct.getObject();
if (product == null) {
return;
}
Collection<Integer> currentMiningFields = product.getMiningFields(claimId);
/*
* 関連する問合せデータに対しては、必ずマイニングフィールドがひとつ以上存在するので
* 空なら関係ない問合せデータと判断できる
*/
if (currentMiningFields.isEmpty()) {
return;
}
/*
* addMiningField, removeMiningFieldはいちいちDBに書き込みにいくので、
* 追加分、削除分を先に抽出
*/
Collection<Integer> newFields = new ArrayList<Integer>(selectedFields.size());
for (IFieldHeader fieldHeader : selectedFields) {
newFields.add(fieldHeader.getId());
}
Collection<Integer> added = new ArrayList<Integer>();
Collection<Integer> deleted = new ArrayList<Integer>();
CollectionUtil.diff(currentMiningFields, newFields, added, deleted);
/* 追加されたフィールドをマイニング対象に設定 */
for (Integer fieldId : added) {
product.addMiningField(claimId, fieldId);
IClaimWorkData work = product.getClaimWorkData(claimId, ClaimWorkDataType.CORRECTION_MISTAKES, fieldId);
CoronaModel.INSTANCE.getWork(uiProduct, work).update(null);
}
/* 削除されたフィールドをマイニング対象から削除。 */
if (deleted.size() > 0) {
List<IUIWork> deleteWorks = new ArrayList<IUIWork>();
for (Integer fieldId : deleted) {
product.removeMiningFeild(claimId, fieldId);
for (Iterator<IClaimWorkData> itr = product.getClaimWorkDatas().iterator(); itr.hasNext();) {
IClaimWorkData work = itr.next();
if (work.getFieldId() == fieldId && work.getClaimId() == claimId) {
deleteWorks.add(CoronaModel.INSTANCE.getWork(uiProduct, work));
}
}
}
try {
IUIElement[] deleteObjects = deleteWorks.toArray(new IUIElement[deleteWorks.size()]);
CoronaElementDeleteOperation op = new CoronaElementDeleteOperation(deleteObjects, ""); //$NON-NLS-1$
op.execute(null, null);
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
/* ****************************************
* UI構築
*/
private boolean isUiCreated;
@Override
public void createControl(Composite parent) {
Composite composite = CompositeUtil.defaultComposite(parent, 1);
Composite projectGroup = CompositeUtil.defaultComposite(composite, 1);
((GridData) projectGroup.getLayoutData()).grabExcessVerticalSpace = false;
createProjectGroup(projectGroup);
SashForm productGroup = CompositeUtil.defaultSashForm(composite, SWT.HORIZONTAL);
((GridData) productGroup.getLayoutData()).heightHint = 350;
createClaimList(productGroup);
SashForm subComposite = CompositeUtil.defaultSashForm(productGroup, SWT.VERTICAL);
createProductList(subComposite);
createFieldList(subComposite);
productGroup.setWeights(new int[] { 1, 1 });
productGroup.setSashWidth(5);
subComposite.setWeights(new int[] { 1, 1 });
subComposite.setSashWidth(5);
setControl(composite);
isUiCreated = true;
claimListViewer.getTable().select(0);
claimListViewer.getControl().setFocus();
setClaimDatas(getSelectedProject());
claimListViewer.getTable().setSelection(0);
updateList();
setPageComplete(fieldValidate());
}
/* ********************
* Project
*/
private TextWithBrowseButtonGroup projectGroup;
private void createProjectGroup(Composite parent) {
projectGroup = new TextWithBrowseButtonGroup(parent, Messages.NewProductCreationWizardPage_groupProjectToCreate, "..."); //$NON-NLS-1$
GridData layoutData = new GridData(SWT.NONE, SWT.NONE, false, false);
layoutData.widthHint = 500;
projectGroup.setTextLayout(layoutData);
projectGroup.setEditable(false);
projectGroup.addButtonSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
/* 表示するプロジェクトをCoronaProjectに限定 */
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
List<IProject> input = new ArrayList<IProject>(Arrays.asList(projects));
for (Iterator<IProject> itr = input.iterator(); itr.hasNext();) {
IProject project = itr.next();
if (!CoronaModel.INSTANCE.isCoronaProject(project)) {
itr.remove();
}
}
ElementListSelectionDialog1 dialog = new ElementListSelectionDialog1(getShell(), new LabelProvider() {
@Override
public Image getImage(Object element) {
return Icons.INSTANCE.get(Icons.IMG_PROJECT);
}
@Override
public String getText(Object element) {
return ((IProject) element).getName();
}
});
dialog.setTitle(Messages.NewProductCreationWizardPage_messageSelectProject);
dialog.setMessage(Messages.NewProductCreationWizardPage_messageSelectProject);
dialog.setElements(input.toArray());
dialog.setInitialSelections(new Object[] { getSelectedProject() });
if (dialog.open() == Dialog.OK) {
Object o = dialog.getFirstResult();
if (o instanceof IProject) {
setSelectedProject((IProject) o);
setClaimDatas((IProject) o);
} else {
setSelectedProject(null);
setClaimDatas(null);
}
setPageComplete(fieldValidate());
}
}
});
setSelectedProjectText(getSelectedProject());
}
private IProject selectedProject;
/**
* @return may be null
*/
public IProject getSelectedProject() {
return selectedProject;
}
void setSelectedProject(IProject project) {
if (selectedProject == null) {
if (project != null) {
selectedProject = project;
setSelectedProjectText(project);
updateList();
}
} else {
if (!selectedProject.equals(project)) {
selectedProject = project;
setSelectedProjectText(project);
updateList();
}
}
}
private void setSelectedProjectText(IProject project) {
if (projectGroup != null) {
if (project == null) {
projectGroup.clearText();
} else {
projectGroup.setText("/" + project.getName()); //$NON-NLS-1$
}
}
}
/**
* @return may be null
*/
private IUIProject getSelectedUIProject() {
return (IUIProject) CoronaModel.INSTANCE.adapter(selectedProject, false);
}
/* ********************
* Claim
*/
private TableViewer claimListViewer;
private void createClaimList(Composite parent) {
/* 問い合わせデータの一覧を表示する */
Composite composite = CompositeUtil.defaultComposite(parent, 1);
Label l = new Label(composite, SWT.NONE);
l.setText(Messages.NewProductCreationWizardPage_labelDataFile);
claimListViewer = new TableViewer(composite, SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER);
claimListViewer.setContentProvider(new ArrayContentProvider());
claimListViewer.setLabelProvider(new ColorLabelProvider());
if (initialClaimDatas != null) {
claimListViewer.setInput(initialClaimDatas);
}
Table t = claimListViewer.getTable();
t.setLayout(new GridLayout());
t.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
claimListViewer.addSelectionChangedListener(tableItemSelectionChangedListener);
}
private List<IClaimData> initialClaimDatas;
/**
* @param project
* may be null
*/
void setClaimDatas(IProject project) {
/* TODO setSelectedProjectと統合したい */
/*
* 問い合わせデータの一覧を表示する
*/
List<IClaimData> ret = null;
ret = IoActivator.getService().getClaimDatas();
Collections.sort(ret, new Comparator<IClaimData>() {
@Override
public int compare(IClaimData o1, IClaimData o2) {
return o1.getName().compareTo(o2.getName());
}
});
if (claimListViewer != null) {
claimListViewer.setInput(ret);
} else {
initialClaimDatas = ret;
}
}
/**
* @return 選択している問い合わせデータ
*/
public IClaimData getSelectedClaimData() {
if ((claimListViewer != null) && (claimListViewer.getSelection() != null)) {
return (IClaimData) ((IStructuredSelection) claimListViewer.getSelection()).getFirstElement();
}
return null;
}
/* ********************
* Product
*/
TableViewer productList;
Button productDeselectButton;
private void createProductList(Composite parent) {
/* 選択した問い合わせデータにあるターゲット一覧を表示する */
Composite composite = CompositeUtil.defaultComposite(parent, 2);
Composite tableGroup = CompositeUtil.defaultComposite(composite, 1);
Label l = new Label(tableGroup, SWT.NONE);
l.setText(Messages.NewProductCreationWizardPage_labelProductName);
productList = new TableViewer(tableGroup, SWT.CHECK | SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER);
productList.setContentProvider(new ArrayContentProvider());
productList.setLabelProvider(new ColorLabelProvider());
Table t = productList.getTable();
t.setLayout(new GridLayout());
t.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
t.addSelectionListener(productSelection);
t.addSelectionListener(callValidate);
Composite buttonGroup = CompositeUtil.defaultComposite(composite, 1);
((GridLayout) buttonGroup.getLayout()).marginTop = l.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
GridData layoutData = (GridData) buttonGroup.getLayoutData();
layoutData.grabExcessHorizontalSpace = false;
layoutData.minimumWidth = 100;
/* Button selectAllButton = */CompositeUtil.createBtn(buttonGroup, SWT.PUSH, Messages.NewProductCreationWizardPage_buttonAllEnable,
selectAllButtonListener);
productDeselectButton = CompositeUtil.createBtn(buttonGroup, SWT.PUSH, Messages.NewProductCreationWizardPage_buttonAllDisable,
deselectAllButtonListener);
}
private List<String> selectedProductNames;
public List<String> getSelectedProductNames(boolean force) {
if (force || selectedProductNames == null) {
selectedProductNames = new ArrayList<String>();
if (productList != null) {
TableItem[] items = productList.getTable().getItems();
for (TableItem item : items) {
if (item.getChecked()) {
selectedProductNames.add(((String) item.getData()).trim());
}
}
}
}
return selectedProductNames;
}
/* ********************
* Mining Field
*/
TableViewer fieldList;
Button fieldDeselectButton;
private void createFieldList(Composite parent) {
/* 選択した問い合わせデータのカラム一覧を表示する */
Composite composite = CompositeUtil.defaultComposite(parent, 2);
Composite fieldGroup = CompositeUtil.defaultComposite(composite, 1);
Label l = new Label(fieldGroup, SWT.NONE);
l.setText(Messages.NewProductCreationWizardPage_labelMiningField);
fieldList = new TableViewer(fieldGroup, SWT.CHECK | SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER);
fieldList.setContentProvider(new ArrayContentProvider());
fieldList.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof IFieldHeader) {
return ((IFieldHeader) element).getDispName();
}
return super.getText(element);
}
});
Table t = fieldList.getTable();
t.setLayout(new GridLayout());
t.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
t.addSelectionListener(fieldSelection);
t.addSelectionListener(callValidate);
Composite buttonGroup = CompositeUtil.defaultComposite(composite, 1);
((GridLayout) buttonGroup.getLayout()).marginTop = l.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
GridData layoutData = (GridData) buttonGroup.getLayoutData();
layoutData.grabExcessHorizontalSpace = false;
layoutData.minimumWidth = 100;
fieldDeselectButton = CompositeUtil.createBtn(buttonGroup, SWT.PUSH, Messages.NewProductCreationWizardPage_buttonAllDisable, deselectAllButtonListener);
}
private List<IFieldHeader> selectedFields;
/**
* @param force
* @return チェックを入れたフィールド
*/
public List<IFieldHeader> getSelectedFields(boolean force) {
if (selectedFields == null || force) {
selectedFields = new ArrayList<IFieldHeader>();
if (fieldList != null) {
TableItem[] items = fieldList.getTable().getItems();
for (TableItem item : items) {
if (item.getChecked()) {
selectedFields.add((IFieldHeader) item.getData());
}
}
}
}
return selectedFields;
}
/* ****************************************
* ページチェック
*/
boolean fieldValidate() {
boolean valid = true;
if (getSelectedProject() == null) {
if (valid) {
setErrorMessage(Messages.NewProductCreationWizardPage_errorMessageSelectProject);
}
valid = false;
}
if (getSelectedClaimData() == null) {
if (valid) {
setErrorMessage(Messages.NewProductCreationWizardPage_errorMessageSelectDataFile);
}
valid = false;
}
if (getSelectedProductNames(true).size() == 0) {
if (valid) {
setErrorMessage(Messages.NewProductCreationWizardPage_errorMessageSelectProduct);
}
valid = false;
}
if (getSelectedFields(true).size() == 0) {
if (valid) {
setErrorMessage(Messages.NewProductCreationWizardPage_errorMessageSelectField);
}
valid = false;
}
if (valid) {
setErrorMessage(null);
}
return valid;
}
/* ****************************************
* Listeners
*/
private final ISelectionChangedListener tableItemSelectionChangedListener = new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
updateList();
setPageComplete(fieldValidate());
}
};
private static final Object[] EMPTY_ARRAY = new Object[0];
void updateList() {
if (!isUiCreated) {
return;
}
IStructuredSelection selection = (IStructuredSelection) claimListViewer.getSelection();
IClaimData claim = (IClaimData) selection.getFirstElement();
if (claim != null) {
/* ターゲット一覧 */
/* Memo IClaimData#getProductsが遅い。10万件にSelect Group Byが遅い。遅いけどふつう? */
productList.setInput(claim.getProducts());
/* マイニングフィールド一覧(誤記補正したフィールドだけ表示する) */
List<IFieldHeader> rest = new ArrayList<IFieldHeader>();
List<IFieldHeader> fields = claim.getFieldInformations();
List<Integer> fieldIds = new ArrayList<Integer>(claim.getCorrectionMistakesFields());
for (IFieldHeader field : fields) {
for (Iterator<Integer> itr = fieldIds.iterator(); itr.hasNext();) {
Integer id = itr.next();
if (field.getId() == id) {
itr.remove();
rest.add(field);
break;
}
}
}
fieldList.setInput(rest);
/* チェックボックスの状態を初期化 */
IUIProject uiProject = getSelectedUIProject();
if (uiProject != null) {
ICoronaProject project = getSelectedUIProject().getObject();
/* ターゲットの初期選択 */
TableItem[] pItems = productList.getTable().getItems();
for (TableItem item : pItems) {
item.setChecked(false);
if (includeProject((String) item.getData())) {
item.setChecked(true);
}
}
/* マイニングフィールドの初期選択 */
TableItem[] fItems = fieldList.getTable().getItems();
if (project.getProducts().size() > 0) {
Set<TableItem> checkItems = new HashSet<TableItem>(fItems.length * 4 / 3);
for (ICoronaProduct product : project.getProducts()) {
Set<Integer> ids = product.getMiningFields(claim.getId());
for (TableItem item : fItems) {
/* 選択済みではないマイニングフィールドがチェックされてしまう問題を修正 */
item.setChecked(false);
for (Integer id : ids) {
if (((IFieldHeader) item.getData()).getId() == id) {
checkItems.add(item);
break;
}
}
}
}
for (TableItem item : checkItems) {
item.setChecked(true);
}
} else {
for (TableItem item : fItems) {
item.setChecked(false);
}
}
}
} else {
productList.setInput(EMPTY_ARRAY);
fieldList.setInput(EMPTY_ARRAY);
}
}
private final SelectionListener selectAllButtonListener = new SuperSelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
setCheckedAll(productList, true);
/* マイニング対象フィールドがひとつだけであればそのマイニング対象フィールドもチェックする */
TableItem[] items = fieldList.getTable().getItems();
if (items.length == 1) {
if (!items[0].getChecked()) {
items[0].setChecked(true);
}
}
super.widgetSelected(e);
}
};
private final SelectionListener deselectAllButtonListener = new SuperSelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
if (((Button) e.getSource()).equals(productDeselectButton)) {
setCheckedAll(productList, false);
} else if (((Button) e.getSource()).equals(fieldDeselectButton)) {
setCheckedAll(fieldList, false);
}
super.widgetSelected(e);
}
};
void setCheckedAll(TableViewer viewer, boolean checked) {
Table t = viewer.getTable();
t.removeSelectionListener(callValidate);
TableItem[] items = t.getItems();
if (viewer.equals(productList)) {
for (TableItem item : items) {
if (!includeProject((String) item.getData())) {
item.setChecked(checked);
}
}
} else {
for (TableItem item : items) {
item.setChecked(checked);
}
}
t.addSelectionListener(callValidate);
}
class SuperSelectionListener implements SelectionListener {
@Override
public void widgetSelected(SelectionEvent e) {
setPageComplete(fieldValidate());
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
};
private SelectionListener callValidate = new SuperSelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
if ((e.detail & SWT.CHECK) != 0) {
setPageComplete(fieldValidate());
}
};
};
private SelectionListener fieldSelection = new SuperSelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
if ((e.detail & SWT.CHECK) != 0) {
/* マイニング対象フィールドにチェックを入れた時、ターゲットがひとつだけであればそのターゲットもチェックする */
if ((getSelectedFields(true).size() == 1) && ((TableItem) e.item).getChecked()) {
TableItem[] items = productList.getTable().getItems();
if (items.length == 1) {
if (!items[0].getChecked()) {
items[0].setChecked(true);
}
}
}
super.widgetSelected(e);
}
};
};
private SelectionListener productSelection = new SuperSelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
if ((e.detail & SWT.CHECK) != 0) {
/* マイニングフィールドのずれをなくすため、登録済みのターゲットはチェックを外せなくする */
String name = (String) ((TableItem) e.item).getData();
if (includeProject(name)) {
((TableItem) e.item).setChecked(true);
}
/* ターゲットにチェックを入れた時、マイニング対象フィールドがひとつだけであればそのマイニング対象フィールドもチェックする */
if ((getSelectedProductNames(true).size() == 1) && ((TableItem) e.item).getChecked()) {
TableItem[] items = fieldList.getTable().getItems();
if (items.length == 1) {
if (!items[0].getChecked()) {
items[0].setChecked(true);
}
}
}
super.widgetSelected(e);
}
};
};
/**
* 現在選択しているプロジェクトに、指定の問合せデータが登録されていればtrue
*
* @param target
* @return
*/
boolean includeProject(IClaimData target) {
IUIProject uiProject = getSelectedUIProject();
if (uiProject == null) {
return false;
}
final ICoronaProject coronaProject = uiProject.getObject();
if (coronaProject == null) {
return false;
}
List<IClaimData> registerdClaims = coronaProject.getClaimDatas();
for (IClaimData claim : registerdClaims) {
if (claim.getId() == target.getId()) {
return true;
}
}
return false;
}
/**
* ターゲット名が、選択しているプロジェクトの、選択している問合せデータと紐づいて登録されていればtrue
*
* @param productName
* 検査するターゲット名
* @return
*/
boolean includeProject(String productName) {
IUIProject uiProject = getSelectedUIProject();
if (uiProject == null) {
return false;
}
ICoronaProject project = uiProject.getObject();
if (project == null) {
return false;
}
IClaimData selectedClaim = getSelectedClaimData();
if (selectedClaim == null) {
return false;
}
for (IUIProduct uiProduct : uiProject.getProducts()) {
ICoronaProduct product = uiProduct.getObject();
if (product.getName().equals(productName)) {
return product.getClaimDatas().contains(selectedClaim);
}
}
return false;
}
@Override
public void setFocus() {
claimListViewer.getTable().setFocus();
}
/* ****************************************
* LabelProvider
*/
private class ColorLabelProvider extends LabelProvider implements IColorProvider {
public final Color CLAIM_COLOR;
public final Color PRODUCT_COLOR;
public ColorLabelProvider() {
CLAIM_COLOR = new Color(null, 0, 0, 255);
PRODUCT_COLOR = new Color(null, 160, 160, 160);
}
@Override
public String getText(Object element) {
if (element instanceof IClaimData) {
IClaimData claim = (IClaimData) element;
return Messages.bind(Messages.NewProductCreationWizardPage_Claim_TableAndFile, CoronaIoUtils.getTableNameSuffix(claim.getTableName()),
claim.getFileName());
}
return super.getText(element);
}
@Override
public Color getForeground(Object element) {
if (element instanceof IClaimData) {
if (includeProject((IClaimData) element)) {
return CLAIM_COLOR;
}
} else if (element instanceof String) {
if (includeProject((String) element)) {
return PRODUCT_COLOR;
}
}
return null;
}
@Override
public Color getBackground(Object element) {
return null;
}
@Override
public void dispose() {
CLAIM_COLOR.dispose();
PRODUCT_COLOR.dispose();
super.dispose();
}
}
}