/** * @version $Id: PartPatternModifyAction.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $ * * 2011/12/27 13:15:09 * @author kousuke-morishima * * Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved. */ package com.tida_okinawa.corona.internal.ui.actions; import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import com.tida_okinawa.corona.PreviewDialog; import com.tida_okinawa.corona.PreviewableAction; import com.tida_okinawa.corona.correction.parsing.model.Link; import com.tida_okinawa.corona.correction.parsing.model.Pattern; import com.tida_okinawa.corona.correction.parsing.model.PatternContainer; import com.tida_okinawa.corona.correction.parsing.model.PatternRecord; import com.tida_okinawa.corona.io.IoActivator; 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.Icons; import com.tida_okinawa.corona.ui.editors.pattern.PatternDicContentProvider; import com.tida_okinawa.corona.ui.editors.pattern.PatternDicLabelProvider; /** * パターンを削除したり、パターンの参照可能フラグをfalseにしたときに、影響を受けるパターンを探す。 * * @author kousuke-morishima */ public class PartPatternModifyAction extends PreviewableAction { private List<PatternRecord> patterns; private PatternRecord patternRecord = null; /** * @param patterns * エディタに表示されているパターンすべて */ public PartPatternModifyAction(List<PatternRecord> patterns) { this.patterns = patterns; } /** * @param pattern * 参照不可能に変更したか、削除したパターン */ public void set(PatternRecord pattern) { this.patternRecord = pattern; } @Override protected void doRun() { for (Link link : effectedItems) { link.setLinkPattern(null); } } private List<Link> effectedItems = null; @Override protected boolean checkEffected() { effectedItems = new ArrayList<Link>(); patterns.remove(patternRecord); for (PatternRecord rec : patterns) { /* recが、patternRecordを参照しているかどうか確認する */ if (rec.hasChildren()) { check(rec.getChildren().get(0)); } } return !effectedItems.isEmpty(); } private void check(Pattern pattern) { if (pattern instanceof Link) { Link link = (Link) pattern; IPattern linkPattern = link.getLinkPattern(); if (linkPattern != null) { /* リンクしているパターンのisPart()がfalseなら参照を外す */ if (linkPattern.equals(patternRecord.getIPattern())) { PatternContainer parent = link.getParent(); while ((parent != null) && !(parent instanceof PatternRecord)) { parent = parent.getParent(); } if (((PatternRecord) parent).getIPattern().getComprehensionDicId() != ICoronaDic.UNSAVED_ID) { effectedItems.add(link); } } } } else if (pattern instanceof PatternContainer) { /* 子をチェック */ for (Pattern child : ((PatternContainer) pattern).getChildren()) { check(child); } } } @Override protected int openPreviewDialog(Shell shell) { // TODO open PreviewDialog d = new PreviewDialog(shell, false) { @Override protected void createDetailArea(Composite parent) { // not create } @Override protected void selectionChanged(IStructuredSelection selection) { } }; d.setTreeContentProvider(new PatternDicContentProvider() { Object[] items = null; @Override public Object[] getElements(Object input) { if (input instanceof PatternRecord[]) { items = (PatternRecord[]) input; Set<ICoronaDic> root = new TreeSet<ICoronaDic>(new Comparator<ICoronaDic>() { @Override public int compare(ICoronaDic o1, ICoronaDic o2) { return o1.getId() - o2.getId(); } }); for (Object o : items) { int dicId = ((PatternRecord) o).getIPattern().getComprehensionDicId(); ICoronaDic dic = IoActivator.getService().getDictionary(dicId); root.add(dic); } return root.toArray(); } return new Object[0]; } @Override public Object[] getChildren(Object parent) { if (parent instanceof ICoronaDic) { List<PatternRecord> recs = new ArrayList<PatternRecord>(); for (Object o : items) { if (((PatternRecord) o).getIPattern().getComprehensionDicId() == ((ICoronaDic) parent).getId()) { recs.add((PatternRecord) o); } } return recs.toArray(); } return new Object[0]; } @Override public boolean hasChildren(Object element) { return (element instanceof ICoronaDic); } @Override public Object getParent(Object element) { if (element instanceof PatternRecord) { int dicId = ((PatternRecord) element).getIPattern().getComprehensionDicId(); return IoActivator.getService().getDictionary(dicId); } return null; } }); d.setTreeLabelProvider(new PatternDicLabelProvider() { @Override public Image getImage(Object element) { if (element instanceof IPatternDic) { return Icons.INSTANCE.get(Icons.IMG_DIC_PATTERN); } return super.getImage(element); } }); d.setInput(createRecords(effectedItems)); /* #755 アイテムが単体の場合にアイテム名を表記するように対応 */ if (effectedItems.size() == 1) { d.setMessage(effectedItems.get(0).getLabel() + "の" + Messages.PartPatternModifyAction_labelRefPattern); } else { d.setMessage(Messages.PartPatternModifyAction_labelRefPattern); } d.setWeight(new int[] { 1 }); return d.open(); } private static PatternRecord[] createRecords(List<Link> effectedLinks) { Set<PatternRecord> ret = new HashSet<PatternRecord>(effectedLinks.size()); for (Link link : effectedLinks) { PatternContainer parent = link.getParent(); while ((parent != null) && !(parent instanceof PatternRecord)) { parent = parent.getParent(); } ret.add((PatternRecord) parent); } return ret.toArray(new PatternRecord[ret.size()]); } // TODO 関係ないパターンを除いて、参照パターンまでの最短パスだけを表示する試み。失敗中 // private PatternContainer create(Pattern child) { // PatternContainer parent = child.getParent(); // if (parent != null) { // parent = parent.getClass().newInstance(); // } // try { // Pattern pattern = child.newInstance(); // return pattern; // } catch (InstantiationException e) { // e.printStackTrace(); // } catch (IllegalAccessException e) { // e.printStackTrace(); // } // return parent; // } }