package com.onpositive.commons.ui.viewers;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
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.Display;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IExpansionListener;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import com.positive.charting.Chart;
import com.positive.charting.ChartCanvas;
import com.positive.charting.ChartFactory;
import com.positive.charts.block.RectangleInsets;
import com.positive.charts.data.general.DefaultPieDataset;
import com.positive.charts.plot.PiePlot;
public abstract class AbstractViewerEditorPart extends EditorPart {
protected FormToolkit formToolkit;
private ImageRegistry registry;
private String imagesId;
protected Form form;
protected Composite buttons;
public PageBook pageBook;
protected ConfigurableViewer viewer;
ArrayList<Runnable> modes = new ArrayList<Runnable>();
ArrayList<ImageHyperlink> hyperLinks = new ArrayList<ImageHyperlink>();
int mode;
long lastChange;
protected String modeText;
private Composite viewerHolder;
boolean sheduled = false;
public ToolBarManager treeManager;
private Composite lowBar;
private Composite overview;
public final class ShowOverViewRunnable implements Runnable {
public void run() {
enableFilters(false);
treeManager.removeAll();
treeManager.update(true);
pageBook.showPage(overview);
}
}
public AbstractViewerEditorPart(String imagesHolder) {
this.imagesId = imagesHolder;
}
public void dispose() {
super.dispose();
formToolkit.dispose();
registry.dispose();
}
protected abstract void enableFilters(boolean enable);
public void doSave(IProgressMonitor monitor) {
}
public void doSaveAs() {
}
public boolean isDirty() {
return false;
}
public boolean isSaveAsAllowed() {
return false;
}
public void setFocus() {
}
public class ViewerConfigurationRunnable implements Runnable {
private ViewerConfiguration config;
public ViewerConfigurationRunnable(ViewerConfiguration config) {
this.config = config;
}
public void run() {
pageBook.showPage(viewerHolder);
viewerHolder.setRedraw(false);
enableFilters(true);
onSetActiveConfig(config);
viewer.configure(config);
treeManager.removeAll();
if (config.hasDrillDown()) {
DrillDownAdapter dd = new DrillDownAdapter(viewer
.getTreeViewer()) {
public void goBack() {
super.goBack();
updateTitle(viewer.getTreeViewer().getInput());
}
public void goHome() {
super.goHome();
updateTitle(viewer.getTreeViewer().getInput());
}
public void goInto(Object newInput) {
super.goInto(newInput);
updateTitle(viewer.getTreeViewer().getInput());
}
};
dd.addNavigationActions(treeManager);
}
treeManager.update(true);
treeManager.getControl().getParent().layout(true, true);
treeManager.getControl().getParent().getParent().layout(true);
viewerHolder.setRedraw(true);
}
}
protected abstract void updateTitle(Object input);
public abstract void onSetActiveConfig(ViewerConfiguration config);
public void createPartControl(Composite parent) {
formToolkit = new FormToolkit(parent.getDisplay());
registry = new ImageRegistry();
form = formToolkit.createForm(parent);
// formToolkit.decorateFormHeading(createForm);
buttons = formToolkit.createComposite(form.getHead(), SWT.NONE);
buttons.setBackgroundMode(SWT.INHERIT_DEFAULT);
// buttons.setBackground(null);
buttons.setLayout(new GridLayout(7, false));
form.setHeadClient(buttons);
pageBook = new PageBook(form.getBody(), SWT.NONE);
pageBook.setLayoutData(GridDataFactory.fillDefaults().grab(true, true)
.create());
viewerHolder = formToolkit.createComposite(pageBook);
// pageBook.showPage(overview);
viewerHolder.setLayoutData(GridDataFactory.fillDefaults().grab(true,
true).create());
viewerHolder.setLayout(new FillLayout());
viewer = createViewer(viewerHolder);
createHyperLinks();
Composite c = formToolkit.createComposite(buttons, SWT.NONE);
c.setLayoutData(new GridData(GridData.END, GridData.FILL, true, true));
c.setLayout(new FillLayout(SWT.HORIZONTAL));
treeManager = new ToolBarManager(new ToolBar(c, SWT.NONE));
overview = createOverview(pageBook);
createExtraPages(pageBook);
viewer.setFilter(getViewerFilter());
lowBar = formToolkit.createComposite(form.getBody());
lowBar.setLayoutData(GridDataFactory.fillDefaults().grab(true, false)
.create());
createLowBarControls(lowBar);
createControls(parent);
init(mode);
getSite().setSelectionProvider(getSelectionProvider());
Composite body = form.getBody();
GridLayout ll2 = new GridLayout(1, false);
body.setLayout(ll2);
modes.get(mode).run();
}
protected void createExtraPages(PageBook pageBook2) {
}
protected abstract void createLowBarControls(Composite lowBar);
protected abstract ConfigurableViewer createViewer(Composite viewerHolder);
protected abstract void createHyperLinks();
protected Image getImage(String text) {
Image image = registry.get(text);
if (image != null) {
return image;
}
ImageDescriptor imageDescriptorFromPlugin = AbstractUIPlugin
.imageDescriptorFromPlugin(imagesId, text);
registry.put(text, imageDescriptorFromPlugin);
return registry.get(text);
}
protected void sheduleFilterAdjust() {
lastChange = System.currentTimeMillis();
if (!sheduled) {
sheduled = true;
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
long currentTimeMillis = System.currentTimeMillis();
if (currentTimeMillis - lastChange > 500) {
sheduled = false;
if (!viewerHolder.isDisposed()) {
setupNewFilter();
}
} else {
Display.getCurrent().asyncExec(this);
}
}
});
}
}
protected ISelectionProvider getSelectionProvider() {
return viewer.getSelectionProvider();
}
protected abstract void setupNewFilter();
protected void createViewerConfigurationLink(String text, String image,
ViewerConfiguration hotSpotConfiguration) {
createLink(text, image, new ViewerConfigurationRunnable(
hotSpotConfiguration));
}
protected abstract IFilter getViewerFilter();
protected ImageHyperlink createLink(String text, String image,
final Runnable toRun) {
modes.add(toRun);
ImageHyperlink createImageHyperlink = formToolkit.createImageHyperlink(
buttons, SWT.NONE);
hyperLinks.add(createImageHyperlink);
createImageHyperlink.setText(text);
createImageHyperlink.setImage(getImage(image));
createImageHyperlink.addHyperlinkListener(new IHyperlinkListener() {
public void linkActivated(HyperlinkEvent e) {
onNavigate(toRun);
}
public void linkEntered(HyperlinkEvent e) {
}
public void linkExited(HyperlinkEvent e) {
}
});
return createImageHyperlink;
}
protected void init(int mode2) {
ImageHyperlink sel = hyperLinks.get(mode2);
for (ImageHyperlink h : hyperLinks) {
if (h != sel) {
h.setUnderlined(true);
h.setBackground(h.getParent().getBackground());
} else {
h.setUnderlined(false);
modeText = h.getText();
form.setText(modeText /* + ("(" + getPartName() + ")") */);
h.setBackground(formToolkit.getColors().getColor(
IFormColors.H_GRADIENT_START));
}
}
}
protected abstract void createControls(Composite parent);
protected Composite createOverview(PageBook pageBook2) {
Map<String, String> infoMap = getInfoMap();
final Composite overview = formToolkit.createComposite(pageBook2,
SWT.NONE);
final Section createSection = formToolkit.createSection(
(Composite) overview, Section.TITLE_BAR | Section.TWISTIE);
createSection.setText("Summary");
Composite createComposite = formToolkit.createComposite(createSection);
createComposite.setLayout(new GridLayout(1, false));
formToolkit.createLabel(createComposite,
"This section contains basic information about this snapshot");
createOptions(createComposite, infoMap);
Section chartsSection = formToolkit.createSection(overview,
Section.TITLE_BAR | Section.TWISTIE);
chartsSection.setText("Analisys");
createSection.setClient(createComposite);
createSection.setExpanded(true);
createSection.setLayoutData(GridDataFactory.fillDefaults().grab(true,
false).create());
chartsSection.setExpanded(true);
chartsSection.setLayoutData(GridDataFactory.fillDefaults().grab(true,
true).create());
IExpansionListener listener = new IExpansionListener() {
public void expansionStateChanged(ExpansionEvent e) {
Control c = (Control) e.getSource();
if (e.getState()) {
c.setLayoutData(GridDataFactory.fillDefaults().grab(true,
c == createSection ? false : true).create());
} else {
c.setLayoutData(GridDataFactory.fillDefaults().grab(true,
false).create());
}
overview.layout(true, true);
}
public void expansionStateChanging(ExpansionEvent e) {
}
};
chartsSection.addExpansionListener(listener);
createSection.addExpansionListener(listener);
CTabFolder flt = new CTabFolder(chartsSection, SWT.BOTTOM);
chartsSection.setClient(flt);
createAnalisysParts(flt);
overview.setLayout(new GridLayout(1, true));
return overview;
}
protected abstract void createAnalisysParts(CTabFolder flt);
protected Map<String, String> getInfoMap() {
return null;
}
protected void createOptions(Composite createComposite,
Map<String, String> summary) {
FormText createFormText = formToolkit.createFormText(createComposite,
false);
if (summary != null) {
StringBuilder info = new StringBuilder();
info.append("<form>");
for (String s : summary.keySet()) {
info.append("<li><b>");
info.append(s);
info.append(':');
info.append("</b> ");
info.append(summary.get(s));
info.append("</li>");
}
info.append("</form>");
createFormText.setText(info.toString(), true, true);
}
}
protected void createChartSectionPart(final Object[] hotSpotsByModule,
String title, final CTabFolder basicData, Object calc) {
createChartSectionPart(hotSpotsByModule, title, basicData, calc, true);
}
protected void createChartSectionPart(final Object[] hotSpotsByModule,
String title, final CTabFolder basicData, Object calc,
boolean createLabels) {
final Composite chart = formToolkit
.createComposite((Composite) basicData);
Composite createComposite1 = formToolkit.createComposite(chart);
createComposite1.setLayout(new GridLayout(1, false));
// formToolkit
// .createLabel(createComposite1,
// "This section contains information about detected module hot spots");
// chart.setClient(createComposite1);
// chart.setText(title);
chart.setLayoutData(GridDataFactory.fillDefaults().grab(true, true)
.create());
// chart.setExpanded(true);
chart.setLayout(new GridLayout(3, false));
CTabItem item = new CTabItem(basicData, SWT.NONE);
item.setText(title);
item.setControl(chart);
DefaultPieDataset dataset = new DefaultPieDataset();
double rest = 100;
for (int a = 0; a < hotSpotsByModule.length; a++) {
double value = getChartValue(calc, hotSpotsByModule[a]);
rest -= value;
dataset.setValue(getChartKey(hotSpotsByModule[a], calc), value);
}
if (rest > 1) {
dataset.setValue("Other" + " "
+ StringUtils.getPercentNumberString(rest), rest);
}
Chart ch = createChart(dataset, title);
ChartCanvas chartCanvas = new ChartCanvas(chart, SWT.DOUBLE_BUFFERED,
true, ch);
if (createLabels) {
Composite bs = formToolkit.createComposite(chart);
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = 20;
bs.setLayout(layout);
for (int a = 0; a < hotSpotsByModule.length; a++) {
double value = getChartValue(calc, hotSpotsByModule[a]);
ImageHyperlink createImageHyperlink = formToolkit
.createImageHyperlink(bs, SWT.NONE);
createImageHyperlink.setText(getChartName(hotSpotsByModule[a]));
final Image image = new Image(Display.getCurrent(), 16, 16);
GC gc = new GC(image);
PiePlot plot = (PiePlot) ch.getPlot();
String key = getChartName(hotSpotsByModule[a]) + " "
+ StringUtils.getPercentNumberString(value);
gc.setBackground(plot.lookupSectionPaint(key, true));
gc.fillRoundRectangle(0, 0, 16, 16, 2, 2);
gc.dispose();
final int b = a;
createImageHyperlink.setImage(image);
createImageHyperlink.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
image.dispose();
}
});
createImageHyperlink
.addHyperlinkListener(new IHyperlinkListener() {
public void linkActivated(HyperlinkEvent e) {
handleOpen(hotSpotsByModule[b]);
}
public void linkEntered(HyperlinkEvent e) {
}
public void linkExited(HyperlinkEvent e) {
}
});
}
bs.setLayoutData(GridDataFactory.fillDefaults().align(GridData.END,
GridData.BEGINNING).grab(false, true).create());
}
chartCanvas.setLayoutData(GridDataFactory.fillDefaults().grab(true,
true).create());
}
protected abstract String getChartName(Object object);
protected abstract double getChartValue(Object calc, Object object);
protected Comparable<?> getChartKey(Object calc, Object object) {
return getChartName(calc)
+ " "
+ StringUtils
.getPercentNumberString(getChartValue(object, calc));
}
protected abstract void handleOpen(Object object);
private Chart createChart(DefaultPieDataset dataset, String title) {
Chart chart = ChartFactory.createPieChart(title,
// title
dataset, // data
true, Locale.getDefault()// include legend
);
PiePlot plot = (PiePlot) chart.getPlot();
plot.setSectionOutlinesVisible(false);
plot.setNoDataMessage("No data available");
plot.setSimpleLabels(false);
plot.setCircular(true);
chart.setPadding(new RectangleInsets(0, 0, 0, 0));
chart.removeLegend();
return chart;
}
protected void onNavigate(final Runnable toRun) {
init(modes.indexOf(toRun));
toRun.run();
}
}