/**
* @version $Id: UserDicEditorActionBar.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2011/11/15 18:01:23
* @author kousuke-morishima
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.ui.editors.user;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import com.tida_okinawa.corona.correction.erratum.Erratum;
import com.tida_okinawa.corona.internal.ui.component.CheckboxWithCombo;
import com.tida_okinawa.corona.internal.ui.component.CheckboxWithText;
import com.tida_okinawa.corona.internal.ui.component.CompositeUtil;
import com.tida_okinawa.corona.internal.ui.component.SortedFilterList;
import com.tida_okinawa.corona.internal.ui.component.ToolBarGroup;
import com.tida_okinawa.corona.io.model.dic.IDicItem;
import com.tida_okinawa.corona.io.model.dic.ILabel;
import com.tida_okinawa.corona.io.model.dic.ILabelDic;
import com.tida_okinawa.corona.io.model.dic.TermClass;
import com.tida_okinawa.corona.io.model.dic.TermPart;
import com.tida_okinawa.corona.io.model.dic.UserDicFieldType;
import com.tida_okinawa.corona.ui.Icons;
import com.tida_okinawa.corona.ui.editors.IFilteringDataProvider;
/**
* @author kousuke-morishima
*/
public class UserDicEditorActionBar extends ToolBarGroup {
UserDicEditor editor;
IFilteringDataProvider dataProvider;
public UserDicEditorActionBar(Composite parent, UserDicEditor editor) {
super(parent);
this.editor = editor;
this.dataProvider = editor.dataProvider;
}
@Override
protected void addButtons() {
Image filterIcon = Icons.INSTANCE.get(Icons.IMG_TOOL_FILTER);
createToolItem(SWT.PUSH, "", "検索(Ctrl+F)", filterIcon, new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
openFilterDialog();
}
});
}
protected static FilterDialog dialog;
public synchronized void openFilterDialog() {
if (dialog == null) {
dialog = new FilterDialog(getControl().getShell(), "単語検索", editor);
dialog.open();
dialog = null;
} else {
dialog.open();
dialog = null;
}
}
public synchronized void activeUserDic(UserDicEditor editor) {
this.editor = editor;
this.dataProvider = editor.dataProvider;
if (dialog != null) {
dialog.setDialogClear();
dialog.setDialogInfo(editor);
dialog.setPrevValue();
}
}
static class FilterDialog extends Dialog {
private String title;
private UserDicEditor editor2;
private IFilteringDataProvider dataProvider2;
protected FilterDialog(Shell parentShell, String title, UserDicEditor editor) {
super(parentShell);
this.title = title;
setDialogInfo(editor);
}
public void setDialogClear() {
setTermText("");
if (termField.isChecked()) {
termField.setChecked(false);
}
if (partField.isChecked()) {
setTermPart(0);
partField.setChecked(false);
}
refreshTermClass();
if (classField.isChecked()) {
classField.setChecked(false);
}
/* ラベル関連情報初期化 */
labelList.sortedFilterListClear();
labelList.setCheckedAll(false);
}
public synchronized void setDialogInfo(UserDicEditor editor) {
this.editor2 = editor;
this.dataProvider2 = editor.dataProvider;
if (dialog != null) {
setLabelList(editor2);
}
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
getButton(OK).setText("検索");
getButton(CANCEL).setText("閉じる");
}
private CheckboxWithText termField;
CheckboxWithCombo partField;
CheckboxWithCombo classField;
SortedFilterList labelList;
@Override
protected Control createDialogArea(Composite parent) {
Composite root = CompositeUtil.defaultComposite(parent, 2);
Label l = CompositeUtil.createLabel(root, " * = 任意の文字列", -1);
l.setLayoutData(CompositeUtil.gridData(true, false, 2, 1));
termField = new CheckboxWithText(root, "単語");
termField.setLayoutData(CompositeUtil.gridData(true, false, 2, 1));
partField = new CheckboxWithCombo(root, "品詞");
partField.setLayoutData(CompositeUtil.gridData(true, false, 2, 1));
PrivateTermPart termParts = new PrivateTermPart(TermPart.values());
partField.setItems(termParts.names);
partField.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
refreshTermClass();
}
});
partField.addCheckStateChangedListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (((Button) e.widget).getSelection()) {
refreshTermClass();
} else {
classField.setItems(new PrivateTermClass(TermClass.values()).names);
}
}
});
classField = new CheckboxWithCombo(root, "品詞細分類");
classField.setLayoutData(CompositeUtil.gridData(true, false, 2, 1));
PrivateTermClass termClasses = new PrivateTermClass(TermClass.values());
classField.setItems(termClasses.names);
/* ラベル */
Composite labelGroup = CompositeUtil.defaultComposite(root, 2);
Label messageLabel = CompositeUtil.createLabel(labelGroup, "ラベル", -1);
messageLabel.setLayoutData(CompositeUtil.gridData(true, false, 2, 1));
labelList = new SortedFilterList(labelGroup, SWT.CHECK | SWT.BORDER | SWT.SINGLE, new LabelProvider());
labelList.setContentProvider(new ConPro());
setLabelList(editor2);
GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
layoutData.heightHint = 180;
labelList.setLayoutData(layoutData);
Composite btnGroup = CompositeUtil.defaultComposite(labelGroup, 1);
btnGroup.setLayoutData(new GridData(SWT.NONE, SWT.FILL, false, false));
CompositeUtil.createBtn(btnGroup, SWT.PUSH, "全選択(&A)", new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
labelList.setCheckedAll(true);
}
});
CompositeUtil.createBtn(btnGroup, SWT.PUSH, "全解除(&D)", new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
labelList.setCheckedAll(false);
}
});
setPrevValue();
return root;
}
private void setPrevValue() {
Map<Object, Object[]> filters = dataProvider2.getFilters();
for (Entry<Object, Object[]> e : filters.entrySet()) {
if (e.getKey() instanceof UserDicFieldType) {
if (e.getValue().length > 0) {
switch ((UserDicFieldType) e.getKey()) {
case HEADER:
setTermText((String) e.getValue()[0]);
break;
case PART:
setTermPart((Integer) e.getValue()[0]);
refreshTermClass();
break;
case CLASS:
setTermClass((Integer) e.getValue()[0]);
break;
case CFORM:
setTermCForm((Integer) e.getValue()[0]);
break;
case LABEL:
labelList.setChecked(e.getValue(), true);
break;
default:
break;
}
}
}
}
}
@Override
protected void okPressed() {
Map<Object, Object[]> filter = new HashMap<Object, Object[]>();
/* 複数フィールドのフィルタには対応していないので、先頭の一つのみフィルタがかかるはず */
if (termField.isChecked()) {
filter.put(UserDicFieldType.HEADER, new Object[] { getTermText() });
}
if (partField.isChecked()) {
filter.put(UserDicFieldType.PART, new Object[] { getTermPart().getIntValue() });
}
if (classField.isChecked()) {
filter.put(UserDicFieldType.CLASS, new Object[] { getTermClass().getIntValue() });
}
if (labelList.getChecked().length > 0) {
filter.put(UserDicFieldType.LABEL, labelList.getChecked());
}
dataProvider2.setFilter(filter);
dataProvider2.first();
editor2.viewer.setInput(dataProvider2.current(true));
editor2.toolbarGroup.updateDataNumLabel();
editor2.addEmptyRow();
}
void refreshTermClass() {
TermPart part = TermPart.valueOfName(partField.getValue());
PrivateTermClass termClasses = null;
if (TermPart.NONE.equals(part)) {
termClasses = new PrivateTermClass(TermClass.values());
} else if (part != null) {
List<TermClass> classes = TermClass.values(part.getIntValue());
termClasses = new PrivateTermClass(classes.toArray(new TermClass[classes.size()]));
} else {
termClasses = new PrivateTermClass(TermClass.values());
}
classField.setItems(termClasses.names);
}
/* ****************************************
* getter/setter
*/
private final String REP_PERSENT = Erratum.convertZenkakuString("&persent");
private String getTermText() {
String text = Erratum.convertZenkakuString(termField.getValue().trim().replaceAll("\\*", REP_PERSENT));
return text.replaceAll(REP_PERSENT, "%");
}
private void setTermText(String term) {
if (term != null) {
termField.setValue(term.replaceAll("%", "*"));
}
}
private TermPart getTermPart() {
return TermPart.valueOfName(partField.getValue());
}
private void setTermPart(int partId) {
partField.setValue(TermPart.valueOf(partId).getName());
}
private TermClass getTermClass() {
return TermClass.valueOfName(classField.getValue());
}
private void setTermClass(int classId) {
classField.setValue(TermClass.valueOf(classId).getName());
}
private void setTermCForm(int cformId) {
/* フィールドを用意していないので、コメントアウト */
// cformField.setValue(TermCForm.valueOf(cformId).getName());
}
/* ****************************************
* other
*/
@Override
protected boolean isResizable() {
return true;
}
@Override
protected void setShellStyle(int newShellStyle) {
newShellStyle = newShellStyle & (~SWT.APPLICATION_MODAL | SWT.MODELESS);
super.setShellStyle(newShellStyle);
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(title);
}
protected void setLabelList(UserDicEditor editor2) {
labelList.setInput(editor2.labelGroup.getRelatedlabelDics());
}
protected void setBtnEnabled(boolean bFlg) {
getButton(OK).setEnabled(bFlg);
}
}
static class ConPro extends ArrayContentProvider {
@Override
public Object[] getElements(Object inputElement) {
List<IDicItem> labels = new ArrayList<IDicItem>();
Object[] ret = super.getElements(inputElement);
for (Object o : ret) {
labels.addAll(toFlat(((ILabelDic) o).getItems()));
((ILabelDic) o).getItems();
}
return labels.toArray();
}
private List<IDicItem> toFlat(List<? extends IDicItem> items) {
List<IDicItem> ret = new ArrayList<IDicItem>();
for (IDicItem item : items) {
ret.add(item);
ret.addAll(toFlat(((ILabel) item).getChildren()));
}
return ret;
}
}
}