/** * @version $Id: UserDicEditor.java 1840 2014-04-16 05:38:34Z yukihiro-kinjyo $ * * 2011/08/02 15:34:23 * @author KMorishima * * Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved. */ package com.tida_okinawa.corona.ui.editors.user; import static com.tida_okinawa.corona.ui.editors.user.TermCellModifier.PROP_CLASS; import static com.tida_okinawa.corona.ui.editors.user.TermCellModifier.PROP_PART; import static com.tida_okinawa.corona.ui.editors.user.TermCellModifier.PROP_WORD; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.ViewForm; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; 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.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionFactory; import com.tida_okinawa.corona.internal.ui.actions.UserDicEditorCCP; import com.tida_okinawa.corona.internal.ui.component.CompositeUtil; import com.tida_okinawa.corona.internal.ui.views.model.IUILibrary; 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.ICoronaDics; 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.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.ITerm; import com.tida_okinawa.corona.io.model.dic.IUserDic; 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.PreferenceInitializer; import com.tida_okinawa.corona.ui.UIActivator; import com.tida_okinawa.corona.ui.editors.AbstractDicEditor; import com.tida_okinawa.corona.ui.editors.DicEditorInput; import com.tida_okinawa.corona.ui.editors.EditorUtil; import com.tida_okinawa.corona.ui.editors.IFilteringDataProvider; import com.tida_okinawa.corona.ui.editors.LabelRelationGroup; /** * * @author KMorishima */ public class UserDicEditor extends AbstractDicEditor { public static final String EDITOR_ID = "com.tida_okinawa.corona.ui.editor.productdic"; public UserDicEditor() { } Set<IDicItem> errorItems = new HashSet<IDicItem>(); @Override public void doSave(IProgressMonitor monitor) { if (errorItems.size() > 0) { StringBuilder message = new StringBuilder("以下のアイテムは入力情報に不足があるため保存されません。\n"); /* ただし、エラーアイテムに新たに紐づけたラベルは保存する */ for (IDicItem item : errorItems) { ITerm term = (ITerm) item; message.append(term.getValue()).append(":"); message.append(term.getTermPart().getName()).append(":"); message.append(term.getTermClass().getName()).append(":"); } MessageDialog.openInformation(getSite().getShell(), "", message.toString()); } /* 保存 */ try { monitor.beginTask("保存", 10); /* ユーザ辞書を保存 */ if (((UserDicDataProvider) dataProvider).commit(new SubProgressMonitor(monitor, 5))) { /* ラベルと単語の紐づけを保存 */ List<ILabelDic> labelDics = labelGroup.getRelatedlabelDics(); for (ILabelDic dic : labelDics) { dic.commit(new SubProgressMonitor(monitor, 5)); } } } catch (Exception e) { e.printStackTrace(); MessageDialog.openWarning(getSite().getShell(), "Exception", e.getMessage()); } finally { monitor.done(); viewer.setInput(dataProvider.current(true)); addEmptyRow(); /* エラーで保存されていないアイテムが残っていれば、dirty状態を維持する */ udic.setDirty(!errorItems.isEmpty()); firePropertyChange(PROP_DIRTY); } } private IUserDic udic; IFilteringDataProvider dataProvider; private IPartListener listener; @Override protected boolean validDictionary(ICoronaDic dic) { if (dic instanceof IUserDic) { udic = (IUserDic) dic; return true; } return false; } private boolean editable; /** * @return 辞書を編集できるならtrue */ public boolean isEditable() { return editable; } @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { super.init(site, input); IPreferenceStore store = UIActivator.getDefault().getPreferenceStore(); Assert.isLegal(coronaDic instanceof IUserDic); dataProvider = new UserDicDataProvider((IUserDic) coronaDic, store.getInt(PreferenceInitializer.PREF_NUM_VIEW_USERDIC_RECORD)); editable = !DicType.JUMAN.equals(((IUserDic) coronaDic).getDicType()); final ICoronaDic finalDic = coronaDic; listener = new IPartListener() { @Override public void partOpened(IWorkbenchPart part) { } @Override public void partDeactivated(IWorkbenchPart part) { if (UserDicEditorActionBar.dialog != null) { UserDicEditorActionBar.dialog.setBtnEnabled(false); } } @Override public void partClosed(IWorkbenchPart part) { /* 最新にアップデート&未保存データを破棄 */ if (UserDicEditor.this.equals(part)) { finalDic.update(); List<ILabelDic> labelDics = labelGroup.getRelatedlabelDics(); for (ICoronaDic dic : labelDics) { if (dic.isDirty()) { try { if (!isOpenRelatedLabelDicEditor((ILabelDic) dic)) { dic.update(); } } catch (PartInitException e) { e.printStackTrace(); } } } } } private boolean isOpenRelatedLabelDicEditor(ILabelDic labelDic) throws PartInitException { IEditorReference[] editorRefs = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditorReferences(); for (IEditorReference ref : editorRefs) { if (ref.getEditorInput() instanceof DicEditorInput) { DicEditorInput refInput = (DicEditorInput) ref.getEditorInput(); if (refInput.getDictionary().getId() == labelDic.getId()) { return true; } } } return false; } @Override public void partBroughtToTop(IWorkbenchPart part) { } @Override public void partActivated(IWorkbenchPart part) { if (UserDicEditor.this.equals(part)) { if (labelGroup != null) { labelGroup.refresh(); } assert part instanceof UserDicEditor; actionBar.activeUserDic((UserDicEditor) part); if (UserDicEditorActionBar.dialog != null) { UserDicEditorActionBar.dialog.setBtnEnabled(true); } } } }; /* リスナ登録 */ getSite().getPage().addPartListener(listener); } @Override public void dispose() { super.dispose(); /* リスナ削除 */ getSite().getPage().removePartListener(listener); labelGroup.dispose(); } @Override public boolean isDirty() { // 編集があったらtrueに設定する→保存ボタンが押せるようになる doSaveへ if (udic.isDirty()) { return true; } for (ILabelDic ldic : labelGroup.getRelatedlabelDics()) { if (ldic.isDicRelationDirty(udic.getId())) { return true; } } return false; } @Override public void doSaveAs() { } @Override public boolean isSaveAsAllowed() { return false; } /* **************************************** * UI構築 */ @Override public void createPartControl(Composite parent) { SashForm composite = CompositeUtil.defaultSashForm(parent, SWT.HORIZONTAL); createRecordGroup(composite); createLabelTreeGroup(composite); composite.setWeights(new int[] { 8, 2 }); List<Object> data = dataProvider.first(); toolbarGroup.updateDataNumLabel(); // 編集不可のとき、ラベルが更新されないので */ addEmptyRow(); viewer.setInput(data); // 開いた直後はアイテムを選択していないのでfalse labelGroup.setEnabled(false); super.createPartControl(parent); getSite().setSelectionProvider(viewer); } /* ******************** * レコード表示領域 */ TableViewer viewer; RecordNavToolBarGroup toolbarGroup; UserDicEditorActionBar actionBar; private void createRecordGroup(Composite parent) { ViewForm viewForm = new ViewForm(parent, SWT.BORDER); viewForm.setLayout(new GridLayout()); viewForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewForm.setBorderVisible(false); /* ツールバー領域1 */ toolbarGroup = new RecordNavToolBarGroup(viewForm, dataProvider); toolbarGroup.addPageMovedListener(new Listener() { @Override public void handleEvent(Event event) { if (event.data.equals(RecordNavToolBarGroup.LAST_BTN) || event.data.equals(RecordNavToolBarGroup.NEXT_BTN)) { addEmptyRow(); } viewer.setSelection(new StructuredSelection(viewer.getTable().getItem(0).getData()), true); } }); viewForm.setTopLeft(toolbarGroup.getControl()); /* ツールバー領域2 */ actionBar = new UserDicEditorActionBar(viewForm, this); viewForm.setTopRight(actionBar.getControl()); /* データ表示領域 */ viewer = new TableViewer(viewForm, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new UserDicLabelProvider(this, viewer, dataProvider)); viewer.addSelectionChangedListener(tableSelectionChangedListener); if (editable) { if (UIActivator.isAlpha()) { viewer.addFilter(new PartFilter(new TermPart[] { TermPart.NOUN, TermPart.NONE })); } } viewForm.setContent(viewer.getControl()); toolbarGroup.setViewer(viewer); // データ操作対象のViewerをセット /* カラム設定 */ final Table tbl = viewer.getTable(); tbl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); tbl.setHeaderVisible(true); createColumnWithSort(tbl, "", 20, null).setResizable(false); createColumnWithSort(tbl, "#", 50, UserDicFieldType.NONE); /* #477 よみのカラム削除により、デフォルトでソートするカラムを単語に変更 */ tbl.setSortColumn(createColumnWithSort(tbl, "単語*", 110, UserDicFieldType.HEADER)); createColumnWithSort(tbl, "品詞*", 120, UserDicFieldType.PART); createColumnWithSort(tbl, "品詞細分類*", 120, UserDicFieldType.CLASS); tbl.setSortDirection(SWT.UP); createColumnWithSort(tbl, "ラベル", 120, UserDicFieldType.LABEL); if (editable) { /* 編集設定 */ TermCellModifier modifier = new TermCellModifier(getSite()); modifier.addFinishModifyListener(new Listener() { @Override public void handleEvent(Event event) { ITerm term = (ITerm) event.data; /* #477 よみに自動で単語の文字列をいれる */ term.setReading(term.getValue()); if (isLastRow(term) && (term.getValue().trim().length() > 0)) { /* 辞書に追加する */ ((UserDicDataProvider) dataProvider).addData(emptyRow); addEmptyRow(); } viewer.update(term, null); if (!isLastRow(term) && term.isError()) { errorItems.add(term); } else { errorItems.remove(term); } /* element のisDirty をチェックする */ if (term.isDirty()) { markDirty(); } } }); String[] properties = new String[] { "", "", PROP_WORD, PROP_PART, PROP_CLASS, "" }; viewer.setColumnProperties(properties); List<CellEditor> editors = modifier.createEditors(tbl); editors.add(0, null); editors.add(0, null); editors.add(null); viewer.setCellEditors(editors.toArray(new CellEditor[editors.size()])); viewer.setCellModifier(modifier); /* キーボードでの入力支援 */ EditorUtil.setFocusMoveListener(editors.toArray(new CellEditor[editors.size()]), viewer, 2, 3, 4); setEditKeyListener(viewer, 2); } } /** * @param parent * @param title * @param width * @param sortField * nullならクリックしてもソートしない */ private TableColumn createColumnWithSort(final Table parent, String title, int width, final UserDicFieldType sortField) { final TableColumn column = CompositeUtil.createColumn(parent, title, width); if (sortField != null) { column.addSelectionListener(new SelectionAdapter() { private boolean asc = true; @Override public void widgetSelected(SelectionEvent e) { asc = !asc; ((UserDicDataProvider) dataProvider).setOrder(sortField, asc); viewer.setInput(dataProvider.current(true)); addEmptyRow(); parent.setSortColumn(column); parent.setSortDirection((asc) ? SWT.UP : SWT.DOWN); } }); } return column; } private static void setEditKeyListener(final TableViewer viewer, final int targetColumn) { viewer.getTable().addKeyListener(new KeyListener() { @Override public void keyReleased(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { switch (e.character) { case SWT.CR: EditorUtil.editMode(viewer, targetColumn); break; default: break; } } }); } /* ******************** * ラベル辞書エリア作成 */ LabelRelationGroup labelGroup; private void createLabelTreeGroup(Composite parent) { labelGroup = new LabelRelationGroup(parent, SWT.CHECK); labelGroup.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { // プログラムからのsetCheckでは呼ばれない */ // 何も選択していなときは、ここにはこない IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); if ((selection.size() == 1) && isLastRow((ITerm) selection.getFirstElement())) { /* emptyRowでreturnしてしまうと、先にラベルを選べない */ /* LabelGroupに無駄なキャッシュを抱えてしまうので、末行ではラベル選択をさせない */ return; } Object checkedItem = event.getElement(); ((CheckboxTreeViewer) event.getSource()).setGrayed(checkedItem, false); if (checkedItem instanceof ILabel) { List<ITerm> terms = new ArrayList<ITerm>(selection.size()); /* #767 複数選択のチェック */ // ラベルと用語の紐付けを外すかどうかをチェックするフラグ(true:紐付けを外す) boolean labelRemoveFlag = true; // 選択した用語が複数ある場合、選択した用語すべてにラベルが紐づいているかチェックする // 紐づいてい無いものが選択されている場合、既存のリレーションは外さないようフラグをfalseにする。 if (selection.size() > 1) { for (Object o : selection.toArray()) { List<ITerm> labelTerms = ((ILabel) checkedItem).getTerms(); if (!labelTerms.contains(o)) { labelRemoveFlag = false; break; } } } for (Object o : selection.toArray()) { if (o instanceof ITerm) { /* #767 ラベルの紐付けを更新 */ if (event.getChecked()) { // イベントのステータスがTrueの場合、現状と同じ紐付けを行う checkLabel((ILabel) checkedItem, (ITerm) o, true); } else { // イベントStatusがFalseの場合、その用語が既にラベルと紐づいているかチェックする List<ITerm> labelTerms = ((ILabel) checkedItem).getTerms(); if (!labelTerms.contains(o)) { // 用語とラベルが紐づいていない場合、用語とラベルを紐づける(半チェック状態または未チェック状態) checkLabel((ILabel) checkedItem, (ITerm) o, true); } else { //用語がラベル紐づいている場合、紐づけを外すかどうかのフラグをチェックする if (labelRemoveFlag) { //ラベルのリレーションを外す checkLabel((ILabel) checkedItem, (ITerm) o, false); } } } terms.add((ITerm) o); } } /* #767 ラベル情報を更新する */ labelGroup.setChecked(terms); // TODO つど保存したいが、ラベル辞書が取れない /* ラベルカラムの表示を更新 */ viewer.update(terms.toArray(), null); } } }); /* 関連付けるラベル辞書(複数)を取得する */ List<ICoronaDic> children; if (isLocalFile()) { IUILibrary uiLib = CoronaModel.INSTANCE.getLibrary(uiDic); ICoronaDics lib = uiLib.getObject(); if (lib != null) { children = searchChildDictionaries(udic, lib.getDictionarys(ILabelDic.class)); } else { children = new ArrayList<ICoronaDic>(0); } } else { children = searchChildDictionaries(udic, IoActivator.getService().getDictionarys(ILabelDic.class)); } List<ILabelDic> labelDics = new ArrayList<ILabelDic>(children.size()); for (ICoronaDic child : children) { if (child instanceof ILabelDic) { labelDics.add((ILabelDic) child); } } labelGroup.setRelatedLabelDics(labelDics, udic.getId()); } /** * このユーザ辞書で選択できるラベル辞書を増やす * * @param labelDic */ public void addRelated(ILabelDic labelDic) { labelGroup.addRelated(labelDic); } /** * このユーザ辞書で選択できるラベル辞書から除く * * @param labelDic */ public void removeRelated(ILabelDic labelDic) { labelGroup.removeRelated(labelDic); } private List<ILabel> labelsForEmptyRow = new ArrayList<ILabel>(); public List<ILabel> getLabels(ITerm term) { return labelGroup.getRelatedLabels(term); } /** * state == true ? labelにtermを紐づける<br /> * state == false ? labelからtermを消す。<br /> * termがemptyRowなら、バッファとしてため込む * * @param label * @param term * @param state */ void checkLabel(ILabel label, ITerm term, boolean state) { if (state) { if (isLastRow(term)) { labelsForEmptyRow.add(label); } label.addTerm(term); } else { if (isLastRow(term)) { labelsForEmptyRow.remove(label); } label.removeTerm(term); } markDirty(); } private ISelectionChangedListener tableSelectionChangedListener = new ISelectionChangedListener() { /** ラベルとの紐づけに使う */ IStructuredSelection currentSelection = new StructuredSelection(); @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection prevSelection = currentSelection; currentSelection = (IStructuredSelection) event.getSelection(); if (!currentSelection.equals(prevSelection)) { List<ITerm> terms = new ArrayList<ITerm>(currentSelection.size()); for (Object o : currentSelection.toArray()) { if (o instanceof ITerm) { terms.add((ITerm) o); } } if (!terms.isEmpty()) { labelGroup.setEnabled(true); labelGroup.setChecked(terms); } else { labelGroup.setEnabled(false); labelGroup.clearCheckedAll(); } } } }; /* **************************************** */ @Override public void setFocus() { viewer.getControl().setFocus(); } public void add(ITerm term) { List<ITerm> terms = new ArrayList<ITerm>(1); terms.add(term); add(terms); } public void add(List<ITerm> terms) { if (editable) { boolean add = false; boolean removeEmptyRow = dataProvider.removeData(emptyRow); for (ITerm term : terms) { if (term != null) { if (term.isError()) { errorItems.add(term); } dataProvider.addData(term); add = true; } } if (add) { /* 空行の件数が入ってしまうので、空行を戻す前に件数表示を更新 */ toolbarGroup.updateDataNumLabel(); } if (removeEmptyRow) { /* addEmptyRow()ほどたくさん処理しなくていい。空行を追加するだけ */ emptyRow = ((UserDicDataProvider) dataProvider).addEmptyData(); } if (add || removeEmptyRow) { viewer.refresh(); } } markDirty(); } /** * 選択されているアイテムを削除する。ただし、最終行(空行)は消さない */ public void remove() { boolean remove = false; IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); Object[] elements = selection.toArray(); if (elements.length > 0) { int size = elements.length - 1; for (int i = 0; i < size; i++) { Object o = elements[i]; if (o instanceof ITerm) { ITerm term = (ITerm) o; dataProvider.removeData(term); errorItems.remove(term); remove = true; } } /* * 空行だったら消さない。 * 空行の可能性があるのは一番最後だけなので、最後だけチェックする */ Object o = elements[size]; if (o instanceof ITerm) { if (!isLastRow((ITerm) o)) { ITerm term = (ITerm) o; dataProvider.removeData(term); errorItems.remove(term); remove = true; } } if (remove) { /* 用語に紐づくラベルがある場合、紐付けを外す */ List<ILabel> labels = labelGroup.getRelatedLabels((ITerm) o); for (ILabel label : labels) { checkLabel(label, (ITerm) o, false); } markDirty(); viewer.refresh(); toolbarGroup.updateDataNumLabel(); } } } void markDirty() { firePropertyChange(PROP_DIRTY); } ITerm emptyRow; public boolean isLastRow(ITerm term) { if (emptyRow != null) { return ((Object) emptyRow).equals(term); } return false; } void addEmptyRow() { if (editable) { toolbarGroup.updateDataNumLabel(); emptyRow = ((UserDicDataProvider) dataProvider).addEmptyData(); if (emptyRow != null) { /* 空行のまま保存されたときに消す紐づけをクリア */ labelsForEmptyRow.clear(); viewer.refresh(); } } } @Override public String getPartName() { return getEditorInput().getName(); } @Override public String getTitleToolTip() { return getEditorInput().getToolTipText(); } @Override public Image getTitleImage() { if (DicType.JUMAN.equals(udic.getDicType())) { return Icons.INSTANCE.get(Icons.IMG_DIC_JUMAN); } else if (DicType.COMMON.equals(udic.getDicType())) { return Icons.INSTANCE.get(Icons.IMG_DIC_COMMON); } else if (DicType.CATEGORY.equals(udic.getDicType())) { return Icons.INSTANCE.get(Icons.IMG_DIC_CATEGORY); } else if (DicType.SPECIAL.equals(udic.getDicType())) { return Icons.INSTANCE.get(Icons.IMG_DIC_SPECIAL); } return super.getTitleImage(); } /* ************************* * アクション関連 */ public static final String UDE_EDIT = "ude_edit"; @Override protected void hookContextMenu() { /* コンテクストメニューが出せるように設定 */ MenuManager menuMgr = new MenuManager(); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(IMenuManager manager) { Action action = ccp.getCutAction(); if (action != null) { manager.add(action); } action = ccp.getCopyAction(); if (action != null) { manager.add(action); } action = ccp.getPasteAction(); if (action != null) { manager.add(action); } manager.add(new GroupMarker(UDE_EDIT)); manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } }); viewer.getControl().setMenu(menuMgr.createContextMenu(viewer.getControl())); getSite().registerContextMenu(menuMgr, viewer); } UserDicEditorCCP ccp = null; @Override protected void createActions() { ccp = new UserDicEditorCCP(this); viewer.addSelectionChangedListener(ccp); setAction(ActionFactory.CUT.getId(), ccp.getCutAction()); setAction(ActionFactory.COPY.getId(), ccp.getCopyAction()); setAction(ActionFactory.PASTE.getId(), ccp.getPasteAction()); /* 全選択(最終行は除く) */ Action action = new Action() { @Override public void run() { TableItem[] items = viewer.getTable().getItems(); int length = items.length; TableItem lastItem = items[length - 1]; if (lastItem.getData() instanceof ITerm) { ITerm term = (ITerm) lastItem.getData(); if (isLastRow(term)) { length--; } } List<Object> select = new ArrayList<Object>(length); for (int i = 0; i < length; i++) { select.add(items[i].getData()); } viewer.setSelection(new StructuredSelection(select)); } }; setAction(ActionFactory.SELECT_ALL.getId(), action); action = new Action() { @Override public void run() { actionBar.openFilterDialog(); } }; setAction(ActionFactory.FIND.getId(), action); // 編集モード(F2) action = new Action() { @Override public void run() { EditorUtil.editMode(viewer, 2); } }; setAction(ActionFactory.RENAME.getId(), action); // 更新(F5) final ICoronaDic finalDic = coronaDic; action = new Action() { @Override public void run() { /* */ if (isDirty()) { /* 編集されていたら */ String message = "辞書は編集されています。\n更新を行うと編集内容は破棄され最終保存時の状態に戻ります。"; if (MessageDialog.openConfirm(getSite().getShell(), "辞書の更新", message)) { /* * Memo 辞書更新日のチェックによって保存に失敗する状況になった時、 * この条件を入れるとその状況が改善されない */ // if (finalDic.isDirty()) { finalDic.update(); // } for (ILabelDic ldic : labelGroup.getRelatedlabelDics()) { if (ldic.isDirty()) { ldic.updateRecords(); } } labelGroup.clearCache(); labelGroup.refresh(); ISelection prevSelection = viewer.getSelection(); viewer.setInput(dataProvider.current(true)); /* labelGroupのチェックを更新するために、用語を再選択する */ viewer.setSelection(null); viewer.setSelection(prevSelection); addEmptyRow(); markDirty(); } } else { /* 編集されていなかったら */ // TODO ↑の編集されていた時の処理と全く同じであるため、メソッド化予定 finalDic.update(); for (ILabelDic ldic : labelGroup.getRelatedlabelDics()) { if (ldic.isDirty()) { ldic.updateRecords(); } } labelGroup.clearCache(); labelGroup.refresh(); ISelection prevSelection = viewer.getSelection(); viewer.setInput(dataProvider.current(true)); /* labelGroupのチェックを更新するために、用語を再選択する */ viewer.setSelection(null); viewer.setSelection(prevSelection); addEmptyRow(); } } }; setAction(ActionFactory.REFRESH.getId(), action); // 削除(Delete) action = new Action() { @Override public void run() { if (isEditable()) remove(); } }; setAction(ActionFactory.DELETE.getId(), action); /** * #512 単語レコード選択中か、それ以外(文字列入力中も含む)を選択中かの場合でアクションを切り替える */ viewer.getControl().addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { setGlobalActions(true); } @Override public void focusLost(FocusEvent e) { setGlobalActions(false); } }); } }