// ============================================================================
//
// Copyright (C) 2006-2012 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.core.prefs.collector;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
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.Control;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.core.runtime.i18n.Messages;
import org.talend.core.token.TokenCollectorFactory;
import us.monoid.json.JSONArray;
import us.monoid.json.JSONException;
import us.monoid.json.JSONObject;
/**
* ggu class global comment. Detailled comment
*/
public class TalendDataCollectorPreviewPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
public TalendDataCollectorPreviewPreferencePage() {
super();
setPreferenceStore(CoreRuntimePlugin.getInstance().getPreferenceStore());
setDescription(Messages.getString("TalendDataCollectorPreviewPreferencePage_Description")); //$NON-NLS-1$
noDefaultAndApplyButton();
}
public void init(IWorkbench arg0) {
}
@Override
protected Control createContents(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new GridLayout());
comp.setLayoutData(new GridData(GridData.FILL_BOTH));
// // label
// Label label = new Label(comp, SWT.NONE);
// label.setText(Messages.getString("TalendDataCollectorPreviewPreferencePage_Details")); //$NON-NLS-1$
// tree
TreeViewer treeViewer = new TreeViewer(comp, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
final Tree tree = treeViewer.getTree();
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.heightHint = 500;
gridData.minimumHeight = 500;
tree.setLayoutData(gridData);
TreeColumn keyColumn = new TreeColumn(tree, SWT.NONE);
keyColumn.setText(Messages.getString("TalendDataCollectorPreviewPreferencePage_Key")); //$NON-NLS-1$
keyColumn.setWidth(200);
TreeColumn valueColumn = new TreeColumn(tree, SWT.NONE);
valueColumn.setText(Messages.getString("TalendDataCollectorPreviewPreferencePage_Value")); //$NON-NLS-1$
valueColumn.setWidth(250);
treeViewer.setContentProvider(new JsonProvider());
treeViewer.setLabelProvider(new JsonProvider());
// set data
try {
TokenCollectorFactory factory = TokenCollectorFactory.getFactory();
factory.priorCollect();
treeViewer.setInput(factory.collectTokenInfors());
} catch (Exception e) {
//
}
//
treeViewer.expandAll();
keyColumn.pack();
return comp;
}
/**
*
* ggu JsonProvider class global comment. Detailled comment
*/
class JsonProvider extends LabelProvider implements ITreeContentProvider, ITableLabelProvider {
private static final String EMPTY = ""; //$NON-NLS-1$
/**
*
* ggu KeyValue class global comment. Detailled comment
*/
class KeyValue {
private String key;
private Object value;
public KeyValue(String key, Object value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public Object getValue() {
return value;
}
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public Image getColumnImage(Object arg0, int arg1) {
return null;
}
public String getColumnText(Object obj, int index) {
if (obj instanceof KeyValue) {
KeyValue kv = (KeyValue) obj;
if (index == 0) {
return kv.getKey();
} else if (index == 1) {
Object value = kv.getValue();
if (value instanceof JSONObject || value instanceof JSONArray) {
return getColumnText(value, index);
}
return value.toString();
}
} else if (index == 1) { // work for value
String emptyValue = Messages.getString("TalendDataCollectorPreviewPreferencePage_EmptyValue"); //$NON-NLS-1$
if (obj instanceof JSONObject) {
return ((JSONObject) obj).length() > 0 ? EMPTY : emptyValue;
} else if (obj instanceof JSONArray) {
return ((JSONArray) obj).length() > 0 ? EMPTY : emptyValue;
} else {
return obj.toString();
}
}
return null;
}
public Object[] getChildren(Object obj) {
if (obj instanceof JSONObject) {
JSONObject json = (JSONObject) obj;
Iterator<String> keys = json.keys();
List<KeyValue> list = new ArrayList<KeyValue>();
while (keys.hasNext()) {
String key = keys.next();
try {
Object value = json.get(key);
KeyValue kv = new KeyValue(key, value);
list.add(kv);
} catch (JSONException e) {
//
}
}
Collections.sort(list, new Comparator<KeyValue>() {
public int compare(KeyValue kv1, KeyValue kv2) {
if (kv1.getValue() instanceof JSONObject || kv1.getValue() instanceof JSONArray) {
if (kv2.getValue() instanceof JSONObject || kv2.getValue() instanceof JSONArray) {
// compare the key.
} else {
return 1;
}
}
if (kv2.getValue() instanceof JSONObject || kv2.getValue() instanceof JSONArray) {
if (kv1.getValue() instanceof JSONObject || kv1.getValue() instanceof JSONArray) {
// compare the key.
} else {
return -1;
}
}
return kv1.getKey().compareTo(kv2.getKey());
}
});
return list.toArray();
} else if (obj instanceof JSONArray) {
JSONArray array = (JSONArray) obj;
Object[] objects = new Object[array.length()];
for (int i = 0; i < array.length(); i++) {
try {
Object object = array.get(i);
objects[i] = object;
} catch (JSONException e) {
//
}
}
return objects;
} else if (obj instanceof KeyValue) {
KeyValue kv = (KeyValue) obj;
return getChildren(kv.getValue());
}
return null;
}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof JSONObject) {
return getChildren(inputElement);
}
return null;
}
public Object getParent(Object arg0) {
return null;
}
public boolean hasChildren(Object arg0) {
Object[] children = getChildren(arg0);
return children != null && children.length > 0;
}
}
}