/**
* @version $Id: TemplateTreeLabelProvider.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2012/12/05 16:40:50
* @author s.takuro
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.ui.editors.template;
import static com.tida_okinawa.corona.correction.template.TemplateUtil.ATTR_KIND_LABEL;
import static com.tida_okinawa.corona.correction.template.TemplateUtil.ATTR_KIND_WORD;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import com.tida_okinawa.corona.correction.template.IVariableTemplate;
import com.tida_okinawa.corona.correction.template.Template;
import com.tida_okinawa.corona.correction.template.TemplateContainer;
import com.tida_okinawa.corona.correction.template.TemplateLink;
import com.tida_okinawa.corona.correction.template.TemplateRecord;
import com.tida_okinawa.corona.correction.template.TemplateTerm;
import com.tida_okinawa.corona.correction.template.VariableTemplate;
import com.tida_okinawa.corona.ui.Icons;
/**
* @author s.takuro
* #187 構文パターン自動生成
* Tree用のラベルプロバイダ
*/
public class TemplateTreeLabelProvider extends LabelProvider implements IColorProvider {
private static List<Template> variableTemplates = null;
private Color color = Display.getCurrent().getSystemColor(SWT.COLOR_RED);
@Override
public String getText(Object element) {
setVariableElement(element);
if (element instanceof Template) {
/* 単語(Term)の場合 */
if (element instanceof TemplateTerm) {
TemplateTerm term = (TemplateTerm) element;
if (term.getFixCheck() != true) {
/* 要素の位置を取得 */
int cnt = getVariableElementPos(term);
/* 単語(Word) */
if (ATTR_KIND_WORD.equals(term.getState())) {
StringBuilder buf = new StringBuilder(128);
buf.append(Messages.TEMPLATE_OUTPUT_LESS_THAN).append(Messages.TEMPLATE_OUTPUT_ELEMENT).append(cnt)
.append(Messages.TEMPLATE_OUTPUT_GREATER_THAN).append(Messages.TEMPLATE_OUTPUT_COLON1);
buf.append((term.getPart() == null) ? "" : term.getPart().getName()).append(Messages.TEMPLATE_OUTPUT_COLON2); //$NON-NLS-1$
buf.append((term.getWordClass() == null) ? "" : term.getWordClass().getName()).append(Messages.TEMPLATE_OUTPUT_COLON2); //$NON-NLS-1$
buf.append("").append(Messages.TEMPLATE_OUTPUT_COLON2); //$NON-NLS-1$
buf.append((term.getQuant() == null) ? "" : term.getQuant().getName()); //$NON-NLS-1$
buf.append(Messages.TEMPLATE_OUTPUT_TERM);
return buf.toString();
}
/* ラベル(Label) */
else if (ATTR_KIND_LABEL.equals(term.getState())) {
StringBuilder buf = new StringBuilder(128);
buf.append("").append(Messages.TEMPLATE_OUTPUT_COLON1); //$NON-NLS-1$
buf.append((term.getPart() == null) ? "" : term.getPart().getName()).append(Messages.TEMPLATE_OUTPUT_COLON2); //$NON-NLS-1$
buf.append((term.getWordClass() == null) ? "" : term.getWordClass().getName()).append(Messages.TEMPLATE_OUTPUT_COLON2); //$NON-NLS-1$
buf.append(Messages.TEMPLATE_OUTPUT_LESS_THAN).append(Messages.TEMPLATE_OUTPUT_ELEMENT).append(cnt)
.append(Messages.TEMPLATE_OUTPUT_GREATER_THAN).append(Messages.TEMPLATE_OUTPUT_COLON2);
buf.append((term.getQuant() == null) ? "" : term.getQuant().getName()); //$NON-NLS-1$
buf.append(Messages.TEMPLATE_OUTPUT_TERM);
return buf.toString();
}
/* その他(エラー) */
else {
return Messages.TEMPLATE_ERROR_TYPE;
}
}
}
/* 参照(Link)の場合 */
else if (element instanceof TemplateLink) {
TemplateLink link = (TemplateLink) element;
if (link.getFixCheck() != true) {
/* 要素の位置を取得 */
int cnt = getVariableElementPos(link);
return Messages.TEMPLATE_OUTPUT_LESS_THAN + Messages.TEMPLATE_OUTPUT_ELEMENT + cnt + Messages.TEMPLATE_OUTPUT_GREATER_THAN
+ Messages.TEMPLATE_OUTPUT_LINK;
}
}
return ((Template) element).toString();
}
return super.getText(element);
}
@Override
public Image getImage(Object element) {
final Icons icon = Icons.INSTANCE;
if (element instanceof TemplateRecord) {
if (((TemplateRecord) element).isPart()) {
return icon.get(Icons.IMG_PATTERN_PART);
}
return icon.get(Icons.IMG_PATTERN_RECORD);
}
return null;
}
@Override
public Color getForeground(Object element) {
if ((element instanceof TemplateTerm) || (element instanceof TemplateLink)) {
if (((VariableTemplate) element).getFixCheck() != true) {
return color;
}
}
return null;
}
@Override
public Color getBackground(Object element) {
return null;
}
/**
* 可変の要素を記憶する
*
* @param element
* 選択中の要素
*/
private void setVariableElement(Object element) {
if (element instanceof Template) {
variableTemplates = new ArrayList<Template>(100);
Template template = (Template) element;
while (template.getParent() != null) {
template = template.getParent();
}
recursiveSetVariableElement(template);
}
}
/**
* 再帰的に状態が可変の要素をセットする
*
* @param template
* ひな型
*/
private void recursiveSetVariableElement(Template template) {
if (template == null) {
new Exception(Messages.TEMPLATE_EXCEPTION_NULL).printStackTrace();
}
/* 要素が可変の場合 */
if (template instanceof VariableTemplate) {
if (((IVariableTemplate) template).getFixCheck() != true) {
variableTemplates.add(template);
}
}
if (template instanceof TemplateContainer) {
List<Template> children = ((TemplateContainer) template).getChildren();
for (Template p : children) {
recursiveSetVariableElement(p);
}
}
}
/**
* 可変の要素の位置を取得
*
* @param template
* ひな型
* @return 可変の要素の位置
*/
private static int getVariableElementPos(Template template) {
int cnt = 0;
for (Template variableTemplate : variableTemplates) {
cnt++;
/* 要素が一致する場合 */
if (variableTemplate.equals(template)) {
return cnt;
}
}
return 0;
}
@Override
public void dispose() {
color.dispose();
}
}