package com.hundsun.ares.studio.ui;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.IARESModule;
import com.hundsun.ares.studio.core.IARESModuleRoot;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.model.CommonModel;
import com.hundsun.ares.studio.core.model.ICommonModel;
import com.hundsun.ares.studio.core.model.ResGroup;
import com.hundsun.ares.studio.core.registry.ARESResRegistry;
import com.hundsun.ares.studio.core.registry.IModuleRootDescriptor;
import com.hundsun.ares.studio.core.registry.IResDescriptor;
import com.hundsun.ares.studio.core.registry.ModulesRootTypeRegistry;
public class CommonElementLabelProvider extends ARESElementLabelProvider{
private static final String TAG_CNAME = "{cname}";
private static final String TAG_ENAME = "{ename}";
private static final String TAG_ID = "{id}";
protected CommonElementContentProvider cp;
private boolean flatLayout;
/*
* 2014��2��19�� sundl TASK #9493 ��ѡ��������Դ����ʾ��δ�����������.
* �л���ѡ����LabelPattern���õ�ʱ�����{id} {ename}�ij�{ename}��������������
* ԭ������Sorter�У�û��ֱ�ӻ�ȡViewer��LabelProvder��ȡ������ʾֵ(Ϊʲô���� ���Բο�ARESElementComparater�е�ע��˵��)��
* ��������new��һ������������CommonElementLabelProvider���ж��ʵ������������Ļ�����һ��LabelProvder���������ѡ��仯��
* Ȼ��ˢ�£�ˢ�»ᴥ��Sorter����������ʱ��Sorter�����Լ�new����������һ��LPʵ����û���յ���ѡ��仯��֪ͨ�����Ի��᷵���ϵ��ı���
* ����SorterҲ�Ͱ��ϵ��ı���������
* ����������ij�static���Խ���������
*/
private static String PATTERN_RESOURCE = TAG_ENAME + "(" + TAG_CNAME + ")";
// 2014-2-19 sundl TASK #9492 ģ������ʾ��ģ������ѡ�����õ�������
private static String PATTERN_MODULE = TAG_ENAME + "(" + TAG_CNAME + ")";
private IPropertyChangeListener preferenceListener;
public CommonElementLabelProvider(final CommonElementContentProvider cp) {
this.cp = cp;
if (cp == null)
this.cp = new CommonElementContentProvider(false);
flatLayout = ARESUI.getDefault().getPreferenceStore().getBoolean(ARESPreferences.FLATLAYOUT);
String prefRes = ARESUI.getDefault().getPreferenceStore().getString(ARESPreferences.LABEL_RESOURCE);
if (!StringUtils.isEmpty(prefRes)) {
PATTERN_RESOURCE = prefRes;
}
String prefModule = ARESUI.getDefault().getPreferenceStore().getString(ARESPreferences.LABEL_MODULE);
if (!StringUtils.isEmpty(prefModule)) {
PATTERN_MODULE = prefModule;
}
preferenceListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(ARESPreferences.FLATLAYOUT))
flatLayout = Boolean.parseBoolean(String.valueOf(event.getNewValue()));
else if (event.getProperty().equals(ARESPreferences.LABEL_RESOURCE)) {
PATTERN_RESOURCE = String.valueOf(event.getNewValue());
if (CommonElementLabelProvider.this.cp != null)
CommonElementLabelProvider.this.cp.safeRefresh();
} else if (event.getProperty().equals(ARESPreferences.LABEL_MODULE)) {
PATTERN_MODULE = String.valueOf(event.getNewValue());
if (CommonElementLabelProvider.this.cp != null)
CommonElementLabelProvider.this.cp.safeRefresh();
}
}
};
ARESUI.getDefault().getPreferenceStore().addPropertyChangeListener(preferenceListener);
}
public String getText(Object element) {
if (!flatLayout && element instanceof IARESModule) {
IARESModule module = (IARESModule) element;
if (module.isDefaultModule())
return super.getText(element);
String eName = null;
Object parent = CommonElementContentProvider.getHierarchicalModuleParent((IARESModule) element);
if (parent instanceof IARESModule) {
eName = getNameDelta((IARESModule) parent, (IARESModule) element);
} else {
eName = super.getText(element);
}
IARESResource property = module.getARESResource(IARESModule.MODULE_PROPERTY_FILE);
if (property != null && property.exists()) {
try {
Object info = property.getInfo(Object.class);
if (info != null) {
ICommonModel model = getCommonModel(info);
if (model != null) {
DelegateCommonModel common = new DelegateCommonModel(model, eName);
return getPreferencedLabel(common, PATTERN_MODULE);
}
}
} catch (ARESModelException e) {
e.printStackTrace();
}
}
return eName;
} else if (element instanceof IARESResource) {
IARESResource ares = (IARESResource)element;
IResDescriptor descriptor = ARESResRegistry.getInstance().getResDescriptor(ares);
if (descriptor != null && !StringUtils.isEmpty(descriptor.getFileName())) {
return descriptor.getName();
}
// ��ȡ������ʾ��������
try {
Object info = ares.getInfo(Object.class);
ICommonModel model = getCommonModel(info);
if (model != null) {
DelegateCommonModel delegated = new DelegateCommonModel(model, ares.getName());
return getPreferencedLabel(delegated, PATTERN_RESOURCE);
}
} catch (ARESModelException e) {
// e.printStackTrace();
}
} else if (element instanceof IARESModuleRoot) {
String type = ((IARESModuleRoot)element).getType();
IModuleRootDescriptor rootDesc = ModulesRootTypeRegistry.getInstance().getModuleRootDescriptor(type);
if (rootDesc != null && !StringUtils.isEmpty(rootDesc.getName()))
return rootDesc.getName();
IARESModuleRoot root = (IARESModuleRoot) element;
IARESModule module = root.getModule("");
IARESResource property = module.getARESResource(IARESModuleRoot.PROPERTY_FILE);
if (property != null && property.exists()) {
try {
Object info = property.getInfo(Object.class);
if (info != null) {
ICommonModel model = getCommonModel(info);
if (model != null) {
DelegateCommonModel common = new DelegateCommonModel(model, root.getElementName());
return getPreferencedLabel(common, PATTERN_MODULE);
}
}
} catch (ARESModelException e) {
e.printStackTrace();
}
}
} else if (element instanceof ResGroup) {
return ((ResGroup) element).getName();
}
return super.getText(element);
}
// �������Ķ���ת��Ϊ
private ICommonModel getCommonModel(Object info) {
ICommonModel commonModel = null;
if (info == null) {
commonModel = null;
} else if (info instanceof ICommonModel) {
commonModel = (ICommonModel)info;
} else if (info instanceof IAdaptable) {
IAdaptable adapter = (IAdaptable)info;
commonModel = (ICommonModel) adapter.getAdapter(ICommonModel.class);
} else {
IAdapterManager manager = Platform.getAdapterManager();
commonModel = (ICommonModel)manager.loadAdapter(info, ICommonModel.class.getName());
}
return commonModel;
}
private String getPreferencedLabel(ICommonModel model, String pattern) {
String cName = model.getString(ICommonModel.CNAME);
String name = model.getString(ICommonModel.NAME);
String id = model.getString(ICommonModel.ID);
String result = pattern.replace(TAG_CNAME, cName).replace(TAG_ENAME, name).replace(TAG_ID, id);
if (result.length() == 0)
result = name;
return result;
}
private String getNameDelta(IARESModule parent, IARESModule fragment) {
String prefix = parent.getElementName() + '.';
String fullName = fragment.getElementName();
if (fullName.startsWith(prefix)) {
return fullName.substring(prefix.length());
}
return fullName;
}
public void dispose() {
super.dispose();
ARESUI.getDefault().getPreferenceStore().removePropertyChangeListener(preferenceListener);
}
}
/**
* Ӣ��������Դģ����һ��ȡ����������Ҫ���ⲿ����һ�������Ұ�����������Ϣ������ת��������ģ�ʹ���
* @author sundl
*/
class DelegateCommonModel extends CommonModel {
private static Logger logger = Logger.getLogger(DelegateCommonModel.class);
private ICommonModel delegate;
private String eName;
public DelegateCommonModel(ICommonModel delegate, String eName) {
this.delegate = delegate;
this.eName = eName;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.core.model.ICommonModel#getValue(java.lang.String)
*/
public Object getValue(String key) {
if (key.equals(NAME))
return eName;
try {
return delegate.getValue(key);
} catch (Exception e) {
logger.error("", e);
}
return StringUtils.EMPTY;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.core.model.ICommonModel#setValue(java.lang.String, java.lang.Object)
*/
public void setValue(String key, Object value) {
delegate.setValue(key, value);
}
}