/** * @version $Id: ResultPatternPage.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $ * * 2011/09/02 21:49:11 * @author imai * * Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved. */ package com.tida_okinawa.corona.ui.editors; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.viewers.IFontProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableColorProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; 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.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.views.properties.IPropertySheetPage; import org.eclipse.ui.views.properties.PropertySheetPage; import com.tida_okinawa.corona.common.Range; import com.tida_okinawa.corona.correction.morphem.SyntaxStructure; import com.tida_okinawa.corona.correction.parsing.model.Pattern; import com.tida_okinawa.corona.correction.parsing.model.PatternDecoder; import com.tida_okinawa.corona.correction.parsing.model.PatternRecord; import com.tida_okinawa.corona.internal.ui.component.CompositeUtil; 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.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.IClaimWorkPattern; import com.tida_okinawa.corona.io.model.ICoronaProduct; import com.tida_okinawa.corona.io.model.IResultCoronaPattern; import com.tida_okinawa.corona.io.model.MorphemeElement; import com.tida_okinawa.corona.io.model.cleansing.HitPosition; import com.tida_okinawa.corona.io.model.cleansing.HitPositionConverter; import com.tida_okinawa.corona.io.model.dic.IPattern; import com.tida_okinawa.corona.io.model.dic.PatternType; import com.tida_okinawa.corona.io.model.table.IField; import com.tida_okinawa.corona.io.model.table.IFieldHeader; import com.tida_okinawa.corona.io.model.table.IRecord; import com.tida_okinawa.corona.io.service.IIoService; import com.tida_okinawa.corona.ui.TIDA; import com.tida_okinawa.corona.ui.editors.ResultMorphemeEditor.TableLabelProvider; import com.tida_okinawa.corona.ui.editors.pattern.PatternDicContentProvider; import com.tida_okinawa.corona.ui.editors.pattern.TmpPatternDicLabelProvider; /** * 構文解析(パターンマッチング)結果ビュー * * @author imai */ public class ResultPatternPage extends FormPage { protected String formTitle; /** * @param editor * 親エディター */ public ResultPatternPage(FormEditor editor) { this(editor, "ResultPatternPage.UniqueIdentifier", "パターン別"); //$NON-NLS-1$ //$NON-NLS-2$ } /** * * @param editor * 親エディター * @param id * ページID * @param title * ページタイトル */ public ResultPatternPage(FormEditor editor, String id, String title) { super(editor, id, title); this.formTitle = "構文解析フォーム(パターン別)"; //$NON-NLS-1$ } private IPartListener partListener = new IPartListener() { @Override public void partOpened(IWorkbenchPart part) { } @Override public void partDeactivated(IWorkbenchPart part) { if (tooltip != null) { /* 破棄 */ tooltip.dispose(); tooltip = null; } } @Override public void partClosed(IWorkbenchPart part) { } @Override public void partBroughtToTop(IWorkbenchPart part) { } @Override public void partActivated(IWorkbenchPart part) { } }; @Override public void init(IEditorSite site, IEditorInput input) { super.init(site, input); site.getPage().addPartListener(partListener); } @Override public void dispose() { super.dispose(); getSite().getPage().removePartListener(partListener); } @Override protected void createFormContent(IManagedForm managedForm) { ScrolledForm form = managedForm.getForm(); form.setText(formTitle); form.getBody().setLayout(new GridLayout()); form.getBody().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Composite composite = CompositeUtil.defaultComposite(form.getBody(), 1); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); SashForm sashForm = new SashForm(composite, SWT.VERTICAL); sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); // 原文 createTextArea(sashForm); /* 構文解析結果 */ SashForm resultSash = new SashForm(sashForm, SWT.HORIZONTAL); createPatternViewer(resultSash); createRecordViewer(resultSash); sashForm.setWeights(new int[] { 2, 8 }); resultSash.setWeights(new int[] { 2, 1 }); } /** * 原文を表示 */ StyledText text; protected void createTextArea(Composite parent) { text = new StyledText(parent, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); text.setEditable(false); GridData gdText = new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1); gdText.heightHint = 30; text.setLayoutData(gdText); } /** * 結果表示部分 */ TreeViewer resultTreeViewer; protected void createPatternViewer(Composite parent) { Tree resultTree = new Tree(parent, SWT.FULL_SELECTION | SWT.VIRTUAL); resultTree.setHeaderVisible(true); resultTree.setLinesVisible(true); resultTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); CompositeUtil.createColumn(resultTree, "パターン", 150); //$NON-NLS-1$ CompositeUtil.createColumn(resultTree, "解析対象テキスト", 260); //$NON-NLS-1$ CompositeUtil.createColumn(resultTree, "Rec#", 50); //$NON-NLS-1$ // TODO These are show in PropertyView // CompositeUtil.createColumn(resultTree, "Claim#", 60); // CompositeUtil.createColumn(resultTree, "Field#", 60); configureTree(resultTree); resultTreeViewer = new TreeViewer(resultTree); resultTreeViewer.setContentProvider(new ITreeContentProvider() { @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public void dispose() { } @Override public boolean hasChildren(Object element) { return (element instanceof IPattern) || (element instanceof PatternType); } @Override public Object getParent(Object element) { ResultPatternEditorInput input = (ResultPatternEditorInput) getEditorInput(); if (element instanceof IPattern) { return input.getParent((IPattern) element); } return null; } @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof ResultPatternEditorInput) { return ((ResultPatternEditorInput) inputElement).getElements(); } return new Object[0]; } @Override public Object[] getChildren(Object parentElement) { ResultPatternEditorInput input = (ResultPatternEditorInput) getEditorInput(); if (parentElement instanceof PatternType) { return input.getChildren((PatternType) parentElement); } if (parentElement instanceof IPattern) { return input.getChildren((IPattern) parentElement); } return new Object[0]; } }); resultTreeViewer.setLabelProvider(new ColorTableLabelProvider() { @Override public String getColumnText(Object element, int columnIndex) { ITreeContentProvider cp = (ITreeContentProvider) resultTreeViewer.getContentProvider(); ResultPatternEditorInput input = (ResultPatternEditorInput) getEditorInput(); if (element instanceof PatternType) { PatternType patternType = (PatternType) element; switch (columnIndex) { case 0: return patternType.getPatternName(); case 1: // 件数 = クレームの件数 - 該当なしの件数 // IClaimData claimData = // Activator.getService().getClaimData(input.claimWorkPattern.getClaimId()); Set<Integer> counter = new HashSet<Integer>(); for (Object child : input.getChildren(patternType)) { IPattern pattern = (IPattern) child; if (!"該当なし".equals(pattern.getLabel())) { //$NON-NLS-1$ for (Object o : cp.getChildren(child)) { if (o instanceof IResultCoronaPattern) { IResultCoronaPattern result = (IResultCoronaPattern) o; counter.add(result.getRecordId()); } } } else { } } return (counter.size()) + " 件"; //$NON-NLS-1$ } } else if (element instanceof IPattern) { IPattern pattern = (IPattern) element; switch (columnIndex) { case 0: return pattern.getLabel(); case 1: Object[] children = cp.getChildren(element); int n = (children == null) ? 0 : children.length; return n + " 件"; //$NON-NLS-1$ } } else if (element instanceof IResultCoronaPattern) { IResultCoronaPattern result = (IResultCoronaPattern) element; switch (columnIndex) { case 0: break; case 1: // text return (result.getText()); case 2: // record id return String.valueOf(result.getRecordId()); default: break; } } return ""; //$NON-NLS-1$ } private final Color URL_COLOR = new Color(null, 0, 5, 255); @Override public Color getForeground(Object element, int columnIndex) { String value = getColumnText(element, columnIndex); if (value.matches(TIDA.URL_REGEX)) { return URL_COLOR; } return super.getForeground(element, columnIndex); } }); resultTreeViewer.setInput(getEditorInput()); if (resultTreeViewer.getTree().getItemCount() > 0) { resultTreeViewer.expandToLevel(resultTreeViewer.getTree().getTopItem().getData(), 1); } configureToolTip(resultTreeViewer.getTree()); } /** * Tableだと左のツリーと行幅がずれるのでTree */ TreeViewer recordTreeViewer; protected void createRecordViewer(Composite parent) { final int claimID; final int currFieldId; final IEditorInput editorInput = getEditorInput(); if (editorInput instanceof IResultPatternEditorInput) { claimID = ((IResultPatternEditorInput) editorInput).getClaimId(); currFieldId = ((IResultPatternEditorInput) editorInput).getFieldId(); } else { return; } final Tree recordTree = new Tree(parent, SWT.FULL_SELECTION); recordTree.setLinesVisible(true); recordTree.setHeaderVisible(true); CompositeUtil.createColumn(recordTree, "列名", 80); //$NON-NLS-1$ CompositeUtil.createColumn(recordTree, "値", 200); //$NON-NLS-1$ recordTreeViewer = new TreeViewer(recordTree); IIoService service = IoActivator.getService(); final IClaimData claim = service.getClaimData(claimID); final List<IFieldHeader> fields = new ArrayList<IFieldHeader>(claim.getFieldInformations()); int pF = claim.getProductField(); for (Iterator<IFieldHeader> itr = fields.iterator(); itr.hasNext();) { IFieldHeader f = itr.next(); int id = f.getId(); /* 表示する必要のない列を除去 */ if (!((id != 1) && (id != pF) && (id != currFieldId))) { itr.remove(); } } recordTreeViewer.setContentProvider(new ITreeContentProvider() { @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public void dispose() { } @Override public boolean hasChildren(Object element) { return false; } @Override public Object getParent(Object element) { return null; } @Override public Object[] getElements(Object input) { final int claimID; final IEditorInput editorInput = getEditorInput(); if (editorInput instanceof IResultPatternEditorInput) { claimID = ((IResultPatternEditorInput) editorInput).getClaimId(); } else { return new Object[0]; } if (input instanceof IResultCoronaPattern) { IResultCoronaPattern result = (IResultCoronaPattern) input; IClaimData claim = IoActivator.getService().getClaimData(claimID); int recordId = result.getRecordId(); IRecord rec = claim.getRecord(recordId); if (rec != null) { Object[] ret = new Object[fields.size()]; int i = 0; for (Iterator<IFieldHeader> itr = fields.iterator(); itr.hasNext();) { IField field = rec.getField(itr.next().getId()); ret[i++] = field; } return ret; } } else if (input instanceof IRecord) { IRecord rec = (IRecord) input; Object[] ret = new Object[fields.size()]; int i = 0; for (Iterator<IFieldHeader> itr = fields.iterator(); itr.hasNext();) { IField field = rec.getField(itr.next().getId()); ret[i++] = field; } return ret; } return new Object[0]; } @Override public Object[] getChildren(Object parent) { return new Object[0]; } }); recordTreeViewer.setLabelProvider(new ColorTableLabelProvider() { @Override public String getColumnText(Object element, int columnIndex) { if (element instanceof IField) { switch (columnIndex) { case 0: return ((IField) element).getHeader().getDispName(); case 1: // TODO 20131224 null対策 /* * シート名が問合せデータに欠落している場合に構文解析結果画面でエラー(nullが原因の例外エラー) * が発生する件への対応 */ if (((IField) element).getValue() == null) { return ""; //$NON-NLS-1$ } return ((IField) element).getValue().toString(); } } return ""; //$NON-NLS-1$ } private final Color URL_COLOR = new Color(null, 0, 5, 255); @Override public Color getForeground(Object element, int columnIndex) { String value = getColumnText(element, columnIndex); if (value.matches(TIDA.URL_REGEX)) { return URL_COLOR; } return super.getForeground(element, columnIndex); } }); recordTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { if (((IStructuredSelection) event.getSelection()).getFirstElement() instanceof IField) { IField item = (IField) ((IStructuredSelection) event.getSelection()).getFirstElement(); String value = item.getValue().toString(); text.setText(value); } else { /* リスナーを後に追加したため、左ツリーのsetTextを上書きしてしまうことがある。 */ if (recordTreeViewer.getTree().isFocusControl()) { text.setText(""); //$NON-NLS-1$ } } } }); recordTree.addMouseListener(new MouseAdapter() { @Override public void mouseDoubleClick(MouseEvent e) { TreeItem item = recordTree.getItem(new Point(e.x, e.y)); if (item != null) { IField field = (IField) item.getData(); openBrowser(field.getValue().toString()); } } }); recordTree.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e) { if ((e.item != null) && (e.item.getData() instanceof IField)) { IField field = (IField) e.item.getData(); openBrowser(field.getValue().toString()); } } }); recordTree.addMouseMoveListener(new MouseMoveListener() { private Cursor defaultCursor = new Cursor(null, SWT.CURSOR_ARROW); private Cursor handCursor = new Cursor(null, SWT.CURSOR_HAND); @Override public void mouseMove(MouseEvent e) { ViewerCell cell = recordTreeViewer.getCell(new Point(e.x, e.y)); if (cell != null) { String value = cell.getText(); if (value.matches(TIDA.URL_REGEX)) { recordTree.setCursor(handCursor); } else { recordTree.setCursor(defaultCursor); } } else { recordTree.setCursor(defaultCursor); } } }); resultTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) resultTreeViewer.getSelection(); recordTreeViewer.setInput(selection.getFirstElement()); } }); } /** * 選択した解析結果の解析元テキストを取得する * * @param resultCoronaPattern * パターンマッチ結果 * @return 解析元テキスト */ protected String getInputText(IResultCoronaPattern resultCoronaPattern) { String textData = ""; //$NON-NLS-1$ IClaimWorkPattern workPattern = ((IResultPatternEditorInput) getEditorInput()).getClaimWorkPattern(); List<IUIElement> uiElements = CoronaModel.INSTANCE.adapter(workPattern); if (uiElements.size() > 0) { IUIProduct uiProduct = (IUIProduct) uiElements.get(0).getParent().getParent(); ICoronaProduct product = uiProduct.getObject(); String dataType = ""; //$NON-NLS-1$ /* ClaimWorkDataTypeを取得する */ String[] types = workPattern.getNote().split(","); //$NON-NLS-1$ /*  入力データ種別と自分の種別の2つはあるはず  */ if (types.length > 1) { dataType = types[types.length - 2]; } /*  形態素係り受け時はKNPフラグが付加されているので分ける  */ if (dataType.contains(":")) { //$NON-NLS-1$ dataType = dataType.substring(0, dataType.indexOf(":")); //$NON-NLS-1$ } // クレンジング元履歴IDを取得する int formerHistoryId = workPattern.getFormerHistoryId(); // クレンジング元履歴IDと問い合わせデータで取得したIDより解析元のワークデータを取得する IClaimWorkData workData = product.getClaimWorkData(workPattern.getClaimId(), ClaimWorkDataType.valueOfName(dataType), workPattern.getFieldId()); textData = workData.getClaimWorkData(resultCoronaPattern.getRecordId(), formerHistoryId); } return textData; } protected void configureTree(final Tree tree) { final int fieldID; final IEditorInput editorInput = getEditorInput(); if (editorInput instanceof IResultPatternEditorInput) { fieldID = ((IResultPatternEditorInput) editorInput).getFieldId(); } else { return; } tree.addSelectionListener(new SelectionAdapter() { Color hitInfoFore = new Color(null, 255, 0, 255); TreeItem currentItem = null; @Override public void widgetSelected(SelectionEvent event) { TreeItem item = (TreeItem) event.item; /* 同じものを選択した時は処理を行わない。 */ if (item.equals(currentItem)) { return; } currentItem = item; if (item.getData() instanceof IResultCoronaPattern) { IResultCoronaPattern resultPattern = (IResultCoronaPattern) item.getData(); /* Hit箇所に色付けを行う処理 */ List<StyleRange> styleRanges = new ArrayList<StyleRange>(); SyntaxStructure importText = new SyntaxStructure(getInputText(resultPattern)); Range r = new Range(); /* TODO ClaimWorkData#getHistoryId が IF に公開されていないため、取得できない */ // int history = ((ResultPatternEditorInput) getEditorInput()).getClaimWorkPattern().getHistoryId(); Map<IPattern, List<String>> hitPositions = resultPattern.getHitPositions(0); for (Entry<IPattern, List<String>> e : hitPositions.entrySet()) { if (((IPattern) item.getParentItem().getData()).equals(e.getKey())) { for (String hitString : e.getValue()) { HitPosition hitPosition = HitPositionConverter.convertHitPosition(hitString); int[] hitRange = hitPosition.getRange(); hitRange[1] += hitRange[0] - 1; r.add(hitRange); } } } r.marge(); for (int[] pos : r.getRanges()) { pos = calcHighlightRange(importText, pos); styleRanges.add(new StyleRange(pos[0], pos[1], hitInfoFore, null)); } /* テキストエリアに表示する解析元テキストを作る。 */ StringBuilder token = new StringBuilder(200); for (MorphemeElement me : importText.getMorphemeElemsnts()) { token.append(me.getHyouki()); } /* 表示テキスト(パターン解析対象テキスト)をセット */ text.setText(token.toString()); /* 色付け */ text.setStyleRanges(styleRanges.toArray(new StyleRange[styleRanges.size()])); } else if (item.getData() instanceof IRecord) { IRecord record = (IRecord) item.getData(); IField field = record.getField(fieldID); if ((field != null) && (field.getValue() != null)) { text.setText(field.getValue().toString()); } else { text.setText(""); //$NON-NLS-1$ } } else { text.setText(""); //$NON-NLS-1$ } } /** * ヒット位置(形態素)をハイライト位置(文字数)に変換する */ int[] calcHighlightRange(SyntaxStructure ss, int[] matchPosition) { int matchPoint[] = new int[2]; StringBuilder matchText = new StringBuilder(200); StringBuilder previousText = new StringBuilder(1000); int i = 0; for (; i < matchPosition[0]; i++) { previousText.append(ss.getMorphemeElemsnts().get(i).getHyouki()); } int matchPos = matchPosition[1]; if (ss.getMorphemeElemsnts().size() <= matchPosition[1]) { matchPos = ss.getMorphemeElemsnts().size() - 1; } for (; i <= matchPos; i++) { matchText.append(ss.getMorphemeElemsnts().get(i).getHyouki()); } matchPoint[0] = previousText.length();/* 開始位置 */ matchPoint[1] = matchText.length();/* マッチ箇所の文字列長 */ return matchPoint; } }); tree.setCursor(new Cursor(null, SWT.CURSOR_ARROW)); tree.addMouseMoveListener(new MouseMoveListener() { private Cursor defaultCursor = new Cursor(null, SWT.CURSOR_ARROW); private Cursor handCursor = new Cursor(null, SWT.CURSOR_HAND); @Override public void mouseMove(MouseEvent e) { ViewerCell cell = resultTreeViewer.getCell(new Point(e.x, e.y)); if (cell != null) { String value = cell.getText(); if (value.matches(TIDA.URL_REGEX)) { tree.setCursor(handCursor); } else { tree.setCursor(defaultCursor); } } else { tree.setCursor(defaultCursor); } } }); } void openBrowser(String url) { TIDA.openBrowser(url, "構文解析結果", "ブラウザ", null); //$NON-NLS-1$ //$NON-NLS-2$ } private Shell tooltip; protected void configureToolTip(final Tree tree) { tree.setToolTipText(""); // cancel default tool tip //$NON-NLS-1$ final Listener listener = new Listener() { Label label; TreeViewer viewer; @Override public void handleEvent(Event event) { switch (event.type) { case SWT.Deactivate: case SWT.Dispose: case SWT.KeyDown: case SWT.MouseMove: { if (tooltip == null) { break; } /* 破棄 */ tooltip.dispose(); tooltip = null; label = null; viewer = null; break; } case SWT.MouseHover: final IEditorInput editorInput = getEditorInput(); final IClaimWorkPattern cwp; if (editorInput instanceof IResultPatternEditorInput) { cwp = ((IResultPatternEditorInput) editorInput).getClaimWorkPattern(); } else { return; } /* ツールチップ作成 */ Point point = new Point(event.x, event.y); TreeItem item = tree.getItem(point); if (item != null) { if ((item.getData() instanceof IPattern) && (item.getBounds(0).contains(point))) { /* パターン名にカーソルを当てているときだけ表示する */ IPattern iPattern = (IPattern) item.getData(); // TODO:仮対応。一時データのパターンを表示する。本来はitemデータの設定時に下記データを設定する iPattern = cwp.getPattern(iPattern.getId()); PatternDecoder decoder = new PatternDecoder(); if (iPattern == null || iPattern.getText() == null) { return; } Pattern ptn = decoder.encode(iPattern.getText()); if (ptn != null) { final Color background = tree.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND); final Color foreground = tree.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND); tooltip = new Shell(tree.getShell(), SWT.ON_TOP | SWT.RESIZE | SWT.TOOL); tooltip.setLayout(CompositeUtil.gridLayout(1, 2, 2, 0, 0)); tooltip.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); tooltip.setBackground(background); /* パターン名 */ label = new Label(tooltip, SWT.NONE); label.setText(iPattern.getLabel()); label.setBackground(background); label.setForeground(foreground); /* パターンツリー */ viewer = new TreeViewer(tooltip, SWT.NONE); viewer.setContentProvider(new PatternDicContentProvider()); viewer.setLabelProvider(new TmpPatternDicLabelProvider(cwp.getPatternDics().get(0))); viewer.setInput(new PatternRecord(iPattern)); // viewer.setInput(new // PatternRecords(cwp.getPatternDics().get(0))); viewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer.getTree().setBackground(background); viewer.getTree().setForeground(foreground); /* 位置、サイズ指定 */ Rectangle bound = item.getBounds(0); Point dispPoint = item.getParent().toDisplay(bound.x, bound.y); tooltip.setBounds(dispPoint.x, dispPoint.y, 300, 200); tooltip.setVisible(true); } break; } } break; default: break; } } }; tree.addListener(SWT.Dispose, listener); tree.addListener(SWT.KeyDown, listener); tree.addListener(SWT.MouseMove, listener); tree.addListener(SWT.MouseHover, listener); } protected static class ColorTableLabelProvider extends TableLabelProvider implements ITableColorProvider, IFontProvider { public ColorTableLabelProvider() { } @Override public Color getForeground(Object element, int columnIndex) { return null; } @Override public Color getBackground(Object element, int columnIndex) { return null; } @Override public Font getFont(Object element) { return null; } } /* **************************************** * 保存 */ @Override public void doSave(IProgressMonitor monitor) { } @Override public void doSaveAs() { } @Override public boolean isDirty() { return false; } @Override public boolean isSaveAsAllowed() { return false; } @Override public void setFocus() { resultTreeViewer.getControl().setFocus(); } @Override public String getTitleToolTip() { return getEditorInput().getToolTipText(); } @Override public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) { if (adapter.equals(IPropertySheetPage.class)) { return new PropertySheetPage(); } return super.getAdapter(adapter); } }