/** * @version $Id: LinkDetailsPage.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $ * * 2011/08/31 16:28:51 * @author kousuke-morishima * * Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved. */ package com.tida_okinawa.corona.ui.editors.pattern; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelection; 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.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; 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.ui.forms.IFormPart; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.IFormPage; import org.eclipse.ui.forms.widgets.Section; import com.tida_okinawa.corona.correction.parsing.model.Link; import com.tida_okinawa.corona.correction.parsing.model.PatternContainer; import com.tida_okinawa.corona.correction.parsing.model.PatternRecord; import com.tida_okinawa.corona.internal.ui.views.model.IUIContainer; 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.impl.CoronaModel; import com.tida_okinawa.corona.io.IoActivator; 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.IPattern; import com.tida_okinawa.corona.io.model.dic.IPatternDic; import com.tida_okinawa.corona.ui.editors.DicEditorInput; /** * @author kousuke-morishima */ public class LinkDetailsPage extends PatternDetailsPage { PatternDicEditorMasterBlock masterBlock; Boolean comboDisable = false; /** * エディター右画面を生成 * * @param editor */ public LinkDetailsPage(FormEditor editor) { super(editor); if (editor instanceof PatternDicEditor) { IFormPage page = editor.getActivePageInstance(); masterBlock = ((PatternDicPage) page).master; } } ComboViewer nameCombo, dicCombo; Button b; @Override public void createContents(Composite parent) { parent.setLayout(new FillLayout()); Section section = createSection(parent, Messages.LinkDetailsPage_labelPatternSetting, DESCRIPTION_LINK); Composite client = kit.createComposite(section); client.setLayout(new GridLayout(3, false)); client.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Label dicLabel = kit.createLabel(client, Messages.LinkDetailsPage_labelPatternDic); dicCombo = new ComboViewer(client, SWT.NONE); dicCombo.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); dicCombo.setContentProvider(new ArrayContentProvider()); /** #1109 辞書更新機能をカプセル化 */ updateDics(); dicCombo.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { ICoronaDic dic = (ICoronaDic) element; return dic.getName(); } }); dicCombo.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { updateDicItems(dicCombo.getSelection()); } }); /* #1109 新規に追加されたパターン辞書も参照の選択肢に表示 */ dicCombo.getCombo().addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { } @Override public void focusGained(FocusEvent e) { updateDics(); } }); @SuppressWarnings("unused") Label dummy = kit.createLabel(client, null); IInformationControl info = getInformationControl(editor.getSite().getShell(), false, new Point(500, 200)); setHover(info, dicLabel, Messages.LinkDetailsPage_hintPatternDic); Label nameLabel = kit.createLabel(client, Messages.LinkDetailsPage_labelPatternName); /* #756 入力可能なコンボボックスに変更 */ nameCombo = new ComboViewer(client, SWT.NONE); nameCombo.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); nameCombo.setContentProvider(new ArrayContentProvider()); nameCombo.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { IPattern p = (IPattern) element; return p.getLabel(); } }); nameCombo.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IPattern p = (IPattern) ((IStructuredSelection) event.getSelection()).getFirstElement(); if (p != null) { link.setLinkPattern(p); } else { link.setLinkPattern(null); } editor.editorDirtyStateChanged(); ((PatternDicPage) ((PatternDicEditor) editor).getActivePageInstance()).update(); } }); nameCombo.getCombo().addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { } @Override public void focusGained(FocusEvent e) { /* 保存するとここにくるので、ここで更新しておけばよい */ updateDicItems(dicCombo.getSelection()); } }); b = kit.createButton(client, Messages.LinkDetailsPage_buttonClear, SWT.PUSH); b.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { nameCombo.getCombo().deselectAll(); link.setLinkPattern(null); } }); IInformationControl info2 = getInformationControl(editor.getSite().getShell(), false, new Point(500, 200)); setHover(info2, nameLabel, Messages.LinkDetailsPage_hintPatternItem); section.setClient(client); } @Override protected void doSave() { commit(); } @Override protected void commit() { /* selectionChangedでセット済み */ } @Override public void setFocus() { nameCombo.getControl().setFocus(); } Link link; @Override protected void selectionChanged(IFormPart part, Object selectedObject) { /* 初期状態の設定 */ link = (Link) selectedObject; ICoronaDic dummyDic = null; if (link.getId() != IPatternDic.UNSAVED_ID && !(link.getLabel().isEmpty())) { /* 既存アイテムの場合 */ dummyDic = IoActivator.getService().getDictionary(link.getDicName()); } else { /* 新規アイテムの場合 */ String dicName = editor.getEditorInput().getName(); dummyDic = IoActivator.getService().getDictionary(dicName); } dicCombo.setSelection(new StructuredSelection(dummyDic)); updateDicItems(new StructuredSelection(dummyDic)); /* データベースビューから辞書を開いた場合、選択項目をdisable化 */ if (comboDisable) { dicCombo.getCombo().setEnabled(false); nameCombo.getCombo().setEnabled(false); b.setEnabled(false); } } /** #1109 辞書を最新化する */ void updateDics() { /* リスト内で選択されている位置を取得(未設定の場合は-1) */ int pos = dicCombo.getCombo().getSelectionIndex(); Set<ICoronaDic> dics = new HashSet<ICoronaDic>(); IUIElement element = ((DicEditorInput) editor.getEditorInput()).getUIDictionary(); if (element != null) { /* プロジェクトビューから辞書を開いた場合 */ /* プロジェクトに紐づくパターン辞書のみをComboboxへ設定する */ IUIProject uiProject = CoronaModel.INSTANCE.getProject(element); ICoronaProject project = uiProject.getObject(); /* 共通辞書をAdd */ dics.addAll(project.getDictionarys(IPatternDic.class)); IUIContainer container = element.getParent().getParent(); if (container instanceof IUIProduct) { List<ICoronaDic> element2 = ((IUIProduct) container).getObject().getDictionarys(IPatternDic.class); /* ターゲットに紐づくパターン辞書をAdd */ dics.addAll(element2); } } else { /* データベースビューから辞書を開いた場合 */ /* DBから辞書を展開し、選択不可とする */ dics.addAll(IoActivator.getService().getDictionarys(IPatternDic.class)); comboDisable = true; } dicCombo.setInput(dics.toArray()); /* リスト内で選択されている場合、位置を設定する */ if (pos >= 0) { dicCombo.getCombo().select(pos); } } /** * 辞書コンボボックスを最新化する。 * * @param selection */ void updateDicItems(ISelection selection) { /* 部品パターンの初期値設定 */ IPattern dummy = IoActivator.getDicFactory().createPattern(link.getLabel(), "", 0, true); //$NON-NLS-1$ dummy.setId(link.getId()); new StructuredSelection(dummy); ICoronaDic coronaDic = (ICoronaDic) ((IStructuredSelection) selection).getFirstElement(); IPattern[] cur = masterBlock.createPartPatterns(coronaDic); PatternContainer parent = link.getParent(); while (parent != null && !(parent instanceof PatternRecord)) { parent = parent.getParent(); } int i = 0; for (; i < cur.length; i++) { /* 自身を除く */ if (((PatternRecord) parent).getIPattern().equals(cur[i])) { break; } } if (i != cur.length) { IPattern[] tmp = new IPattern[cur.length - 1]; System.arraycopy(cur, 0, tmp, 0, i); System.arraycopy(cur, i + 1, tmp, i, tmp.length - i); cur = tmp; } nameCombo.setInput(cur); nameCombo.setSelection(new StructuredSelection(dummy)); } }