sernet.gs.ui.rcp.main.bsi.views.chart.ChartView.java Source code

Java tutorial

Introduction

Here is the source code for sernet.gs.ui.rcp.main.bsi.views.chart.ChartView.java

Source

/*******************************************************************************
 * Copyright (c) 2009 Alexander Koderman <ak[at]sernet[dot]de>.
 * This program is free software: you can redistribute it and/or 
 * modify it under the terms of the GNU Lesser General Public License 
 * as published by the Free Software Foundation, either version 3 
 * of the License, or (at your option) any later version.
 *     This program is distributed in the hope that it will be useful,    
 * but WITHOUT ANY WARRANTY; without even the implied warranty 
 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
 * See the GNU Lesser General Public License for more details.
 *     You should have received a copy of the GNU Lesser General Public 
 * License along with this program. 
 * If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     Alexander Koderman <ak[at]sernet[dot]de> - initial API and implementation
 ******************************************************************************/
package sernet.gs.ui.rcp.main.bsi.views.chart;

import org.apache.log4j.Logger;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
import org.jfree.chart.JFreeChart;
import org.jfree.experimental.chart.swt.ChartComposite;

import sernet.gs.ui.rcp.main.Activator;
import sernet.gs.ui.rcp.main.ImageCache;
import sernet.gs.ui.rcp.main.common.model.CnAElementFactory;
import sernet.gs.ui.rcp.main.common.model.IModelLoadListener;
import sernet.verinice.iso27k.rcp.JobScheduler;
import sernet.verinice.model.bsi.BSIModel;
import sernet.verinice.model.bsi.IBSIModelListener;
import sernet.verinice.model.common.ChangeLogEntry;
import sernet.verinice.model.common.CnALink;
import sernet.verinice.model.common.CnATreeElement;
import sernet.verinice.model.iso27k.IISO27KModelListener;
import sernet.verinice.model.iso27k.ISO27KModel;
import sernet.verinice.model.validation.CnAValidation;

/**
 * Displays charts to visualize progress and other data.
 * 
 * @author koderman[at]sernet[dot]de
 * @version $Rev$ $LastChangedDate$ $LastChangedBy$
 * 
 */
public class ChartView extends ViewPart {

    public static final String ID = "sernet.gs.ui.rcp.main.chartview"; //$NON-NLS-1$
    private static final Logger LOG = Logger.getLogger(ChartView.class);

    private IModelLoadListener loadListener;

    private ChangeListener changeListener;

    private Composite parent;

    private ChartComposite frame;

    private Action chooseBarDiagramAction;

    private Action chooseProgressDiagramAction;

    private IChartGenerator currentChartGenerator;

    private UmsetzungBarChart barChart;

    private RealisierungLineChart progressChart;

    private Emptychart emptyChart;

    private StufenBarChart stufenChart;

    private LebenszyklusBarChart zyklusChart;

    private SchichtenBarChart schichtenChart;

    private MaturitySpiderChart maturitySpiderChart;

    protected SamtProgressChart samtProgressChart;

    private Action chooseMaturityDiagramAction;

    private ISelectionListener selectionListener;

    // use getElement()!
    protected CnATreeElement element = null;

    private Action chooseMaturityBarDiagramAction;

    private MaturityBarChart maturityBarChart;

    /**
     * Creates a new view.
     */
    public ChartView() {
        super();
    }

    @Override
    public void createPartControl(Composite parent) {
        initView(parent);
        startInitDataJob();
    }

    private void initView(Composite parent) {
        this.parent = parent;
        frame = new ChartComposite(parent, SWT.NONE, null, true);
        createChartGenerators();
        createSelectionListeners();
        hookSelectionListeners();
        hookPageSelection();
        createMenus();
        setDescription();

        currentChartGenerator = getDefaultChartGenerator();
    }

    protected void setDescription() {
        this.setContentDescription(Messages.ChartView_0);
    }

    protected synchronized void startInitDataJob() {
        if (CnAElementFactory.isModelLoaded()) {
            JobScheduler.scheduleInitJob(createDrawChartJob());
        }
        // if models are not loaded yet: loadListener does this job
    }

    protected IChartGenerator getDefaultChartGenerator() {
        return barChart;
    }

    private void createChartGenerators() {
        barChart = new UmsetzungBarChart();
        progressChart = new RealisierungLineChart();
        emptyChart = new Emptychart();
        stufenChart = new StufenBarChart();
        zyklusChart = new LebenszyklusBarChart();
        schichtenChart = new SchichtenBarChart();
        maturitySpiderChart = new MaturitySpiderChart();
        maturityBarChart = new MaturityBarChart();
        samtProgressChart = new SamtProgressChart();

    }

    protected void createMenus() {
        Action chooseStufenDiagramAction;
        Action chooseZyklusDiagramAction;
        Action chooseSchichtDiagramAction;
        IMenuManager menuManager = getViewSite().getActionBars().getMenuManager();
        chooseBarDiagramAction = new Action(Messages.ChartView_1, SWT.CHECK) {
            @Override
            public void run() {
                currentChartGenerator = barChart;
                drawChart();
            }
        };
        chooseBarDiagramAction
                .setImageDescriptor(ImageCache.getInstance().getImageDescriptor(ImageCache.CHART_BAR));

        chooseProgressDiagramAction = new Action(Messages.ChartView_2, SWT.CHECK) {
            @Override
            public void run() {
                currentChartGenerator = progressChart;
                drawChart();
            }
        };
        chooseProgressDiagramAction
                .setImageDescriptor(ImageCache.getInstance().getImageDescriptor(ImageCache.CHART_CURVE));

        chooseStufenDiagramAction = new Action(Messages.ChartView_3, SWT.CHECK) {
            @Override
            public void run() {
                currentChartGenerator = stufenChart;
                drawChart();
            }
        };

        chooseZyklusDiagramAction = new Action(Messages.ChartView_4, SWT.CHECK) {
            @Override
            public void run() {
                currentChartGenerator = zyklusChart;
                drawChart();
            }
        };

        chooseSchichtDiagramAction = new Action(Messages.ChartView_5, SWT.CHECK) {
            @Override
            public void run() {
                currentChartGenerator = schichtenChart;
                drawChart();
            }
        };

        chooseMaturityDiagramAction = new Action(Messages.ChartView_7, SWT.CHECK) {
            @Override
            public void run() {
                currentChartGenerator = maturitySpiderChart;
                drawChart();
                setContentDescription(Messages.ChartView_8);
            }
        };
        chooseMaturityDiagramAction
                .setImageDescriptor(ImageCache.getInstance().getImageDescriptor(ImageCache.CHART_PIE));

        chooseMaturityBarDiagramAction = new Action(Messages.ChartView_9, SWT.CHECK) {
            @Override
            public void run() {
                currentChartGenerator = maturityBarChart;
                drawChart();
                setContentDescription(Messages.ChartView_10);
            }
        };
        chooseMaturityBarDiagramAction
                .setImageDescriptor(ImageCache.getInstance().getImageDescriptor(ImageCache.CHART_BAR));

        menuManager.add(chooseBarDiagramAction);
        menuManager.add(chooseProgressDiagramAction);
        menuManager.add(chooseStufenDiagramAction);
        menuManager.add(chooseZyklusDiagramAction);
        menuManager.add(chooseSchichtDiagramAction);
        menuManager.add(new Separator());
        menuManager.add(chooseMaturityDiagramAction);
        menuManager.add(chooseMaturityBarDiagramAction);

        fillLocalToolBar();
    }

    private void fillLocalToolBar() {
        IActionBars bars = getViewSite().getActionBars();
        IToolBarManager manager = bars.getToolBarManager();
        manager.add(chooseBarDiagramAction);
        manager.add(chooseProgressDiagramAction);
        manager.add(new Separator());
        manager.add(chooseMaturityDiagramAction);
        manager.add(chooseMaturityBarDiagramAction);
    }

    protected synchronized void drawChart() {
        createDrawChartJob().schedule();
    }

    private WorkspaceJob createDrawChartJob() {
        WorkspaceJob job = new WorkspaceJob(Messages.ChartView_6) {
            @Override
            public IStatus runInWorkspace(IProgressMonitor monitor) {
                Activator.inheritVeriniceContextState();

                if (parent != null && !parent.isDisposed() && frame != null && !frame.isDisposed()) {
                    final JFreeChart chart;
                    CnATreeElement currentElement = null;
                    if (currentChartGenerator instanceof ISelectionChartGenerator) {
                        currentElement = getElement();
                        if (currentElement == null) {
                            currentElement = getDefaultElement();
                        }
                        chart = ((ISelectionChartGenerator) currentChartGenerator).createChart(currentElement);
                    } else {
                        chart = currentChartGenerator.createChart();
                    }
                    if (chart != null) {
                        Display.getDefault().syncExec(new Runnable() {
                            public void run() {
                                try {
                                    if (frame.isDisposed()) {
                                        return;
                                    }
                                    frame.setChart(chart);
                                    frame.forceRedraw();
                                } catch (Exception e) {
                                    // chart disposed:
                                    LOG.error(e);
                                }
                            }
                        });
                    }
                }
                return Status.OK_STATUS;
            }
        };
        return job;
    }

    private void createSelectionListeners() {
        loadListener = new IModelLoadListener() {

            public void closed(BSIModel model) {
                Display.getDefault().asyncExec(new Runnable() {
                    public void run() {
                        currentChartGenerator = emptyChart;
                        drawChart();
                    }
                });
            }

            public void loaded(final BSIModel model) {
                Display.getDefault().asyncExec(new Runnable() {
                    public void run() {
                        CnAElementFactory.getLoadedModel().addBSIModelListener(changeListener);
                    }
                });
            }

            public void loaded(ISO27KModel model) {
                Display.getDefault().asyncExec(new Runnable() {
                    public void run() {
                        CnAElementFactory.getInstance().getISO27kModel().addISO27KModelListener(changeListener);
                        currentChartGenerator = getDefaultChartGenerator();
                        drawChart();
                    }
                });

            }
        };

        changeListener = createChangeListener();
    }

    protected ChangeListener createChangeListener() {
        return new ChangeListener();
    }

    private void hookPageSelection() {
        selectionListener = new ISelectionListener() {
            public void selectionChanged(IWorkbenchPart part, ISelection selection) {
                pageSelectionChanged(part, selection);
            }
        };
        getSite().getPage().addPostSelectionListener(selectionListener);
    }

    /**
     * Method is called if the selection in the GUI is changed.
      * 
      * @param part
      * @param selection the newly selected GUI element
     */
    protected synchronized void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {
        if (!(selection instanceof IStructuredSelection)) {
            return;
        }
        Object firstSelection = ((IStructuredSelection) selection).getFirstElement();
        CnATreeElement selectedElement = (CnATreeElement) firstSelection;
        if (LOG.isDebugEnabled()) {
            LOG.debug("Selection changed, selected element: " + selectedElement); //$NON-NLS-1$
        }

        if (firstSelection instanceof CnATreeElement) {
            if (this.element != null && selectedElement == this.element) {
                return;
            }
            this.element = selectedElement;
            drawChart();
        }
    }

    protected void hookSelectionListeners() {
        CnAElementFactory.getInstance().addLoadListener(loadListener);
        if (CnAElementFactory.getLoadedModel() != null) {
            CnAElementFactory.getLoadedModel().addBSIModelListener(changeListener);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
     */
    @Override
    public void dispose() {
        getSite().getPage().removePostSelectionListener(selectionListener);
        CnAElementFactory.getInstance().removeLoadListener(loadListener);
        if (CnAElementFactory.getLoadedModel() != null) {
            CnAElementFactory.getLoadedModel().removeBSIModelListener(changeListener);
        }
        if (CnAElementFactory.getLoadedModel() != null) {
            CnAElementFactory.getLoadedModel().removeBSIModelListener(changeListener);
        }
        if (LOG.isDebugEnabled()) {
            LOG.debug("Disposing chart view " + this); //$NON-NLS-1$
        }
    }

    /**
      * Passing the focus request to the viewer's control.
      */
    @Override
    public void setFocus() {
        frame.setFocus();
    }

    /**
     * Currently selected  element for which a chart is generated
     * 
     * @return currently selected element or null if nothing is selected
     */
    protected CnATreeElement getElement() {
        return element;
    }

    /**
     * The default element for which a chart is generated or null
     * 
     * @return the default element or null
     */
    protected CnATreeElement getDefaultElement() {
        return null;
    }

    protected class ChangeListener implements IBSIModelListener, IISO27KModelListener {
        public void childAdded(CnATreeElement category, CnATreeElement child) {
            // do nothing
        }

        public void childChanged(CnATreeElement child) {
            // do nothing
        }

        public void childRemoved(CnATreeElement category, CnATreeElement child) {
            // do nothing
        }

        public void linkChanged(CnALink old, CnALink link, Object source) {
            // do nothing
        }

        public void linkRemoved(CnALink link) {
            // do nothing

        }

        public void modelRefresh(Object source) {
            drawChart();
        }

        public void linkAdded(CnALink link) {
        }

        public void databaseChildAdded(CnATreeElement child) {
        }

        public void databaseChildChanged(CnATreeElement child) {
        }

        public void databaseChildRemoved(CnATreeElement child) {
        }

        public void modelRefresh() {
        }

        public void modelReload(BSIModel newModel) {
        }

        public void modelReload(ISO27KModel newModel) {
        }

        public void databaseChildRemoved(ChangeLogEntry entry) {
        }

        @Override
        public void validationAdded(Integer scopeId) {
        };

        @Override
        public void validationRemoved(Integer scopeId) {
        };

        @Override
        public void validationChanged(CnAValidation oldValidation, CnAValidation newValidation) {
        };
    }

}