PhaseSpacePanel.java

// @formatter:off
 /*******************************************************************************
 *
 * This file is part of JMad.
 * 
 * Copyright (c) 2008-2011, CERN. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 ******************************************************************************/
// @formatter:on

package cern.accsoft.steering.jmad.gui.panels.elements;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JCheckBox;
import javax.swing.JPanel;

import cern.accsoft.steering.jmad.domain.elem.Element;
import cern.accsoft.steering.jmad.domain.ex.JMadModelException;
import cern.accsoft.steering.jmad.domain.optics.EditableOpticPointImpl;
import cern.accsoft.steering.jmad.domain.optics.OpticPoint;
import cern.accsoft.steering.jmad.domain.types.enums.JMadPlane;
import cern.accsoft.steering.jmad.gui.dv.ChartFactory;
import cern.accsoft.steering.jmad.gui.manage.ElementSelectionManager;
import cern.accsoft.steering.jmad.gui.manage.ElementSelectionManagerListener;
import cern.accsoft.steering.jmad.model.JMadModel;
import cern.accsoft.steering.jmad.model.manage.JMadModelManager;
import cern.jdve.Chart;
import cern.jdve.data.DefaultDataSource;

/**
 * Shows several graphs which display the closed orbit in phase and real space at one or more elements.
 * 
 * @author Kajetan Fuchsberger (kajetan.fuchsberger at cern.ch)
 */
public class PhaseSpacePanel extends JPanel {
    private static final long serialVersionUID = 1L;

    /**
     * The manager from which we get the information which elements are currently selected.
     */
    private ElementSelectionManager elementSelectionManager;

    /**
     * The factory which creates the default charts for jmad
     */
    private ChartFactory chartFactory;

    /** The model manager to retrieve the optics values */
    private JMadModelManager modelManager;

    /** The datasets which contain the phase space datas */
    private List<PhaseSpaceDataSet> dataSets = new ArrayList<PhaseSpaceDataSet>();

    /**
     * init method called by spring
     */
    public void init() {
        initComponents();
    }

    /**
     * creates all the gui components
     */
    private void initComponents() {
        setLayout(new GridBagLayout());

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.fill = GridBagConstraints.BOTH;
        constraints.weightx = 1;
        constraints.weighty = 1;

        Chart chart = createChart(JMadPlane.H);
        add(chart, constraints);

        constraints.gridx++;
        chart = createChart(JMadPlane.V);
        add(chart, constraints);

        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.weighty = 0;

        final JCheckBox chkNormalized = new JCheckBox("Normalized");
        chkNormalized.setSelected(dataSets.get(0).isNormalized());
        chkNormalized.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                boolean normalized = chkNormalized.isSelected();
                for (PhaseSpaceDataSet dataSet : dataSets) {
                    dataSet.setNormalized(normalized);
                }
            }
        });

        add(chkNormalized, constraints);
    }

    private Chart createChart(JMadPlane plane) {
        PhaseSpaceDataSet dataSet = new PhaseSpaceDataSet("Phase Space " + plane.toString(), plane);
        this.dataSets.add(dataSet);
        DefaultDataSource dataSource = new DefaultDataSource(dataSet);
        Chart chart = new Chart();
        getChartFactory().configurePolylineChart(dataSource, chart);
        return chart;
    }

    public void setElementSelectionManager(ElementSelectionManager elementSelectionManager) {
        this.elementSelectionManager = elementSelectionManager;
        this.elementSelectionManager.addListener(new ElementSelectionManagerListener() {

            @Override
            public void changedSelectedElements(List<Element> selectedElements, Element lastSelectedElement) {
                updateOpticsPoints(selectedElements);
            }
        });
    }

    /**
     * updates the optics points for all datasets
     * 
     * @param selectedElements
     */
    private void updateOpticsPoints(List<Element> selectedElements) {
        List<OpticPoint> opticsPoints = getElementOptics(selectedElements);
        for (PhaseSpaceDataSet dataSet : this.dataSets) {
            dataSet.setOpticsPoints(opticsPoints);
        }
    }

    /**
     * retrieves the optics-point for each element from the model and handles exceptions if they occur.
     * 
     * @param elements the elements for which to get the optics point
     * @return the {@link EditableOpticPointImpl}
     */
    private List<OpticPoint> getElementOptics(List<Element> elements) {
        List<OpticPoint> opticsPoints = new ArrayList<OpticPoint>();
        JMadModel model = getModelManager().getActiveModel();
        for (Element element : elements) {
            OpticPoint opticPoint = null;
            try {
                opticPoint = model.getOptics().getPoint(element);
            } catch (JMadModelException e) {
                ; /* just do not add the optics point */
            }
            if (opticPoint != null) {
                opticsPoints.add(opticPoint);
            }
        }
        return opticsPoints;
    }

    public void setChartFactory(ChartFactory chartFactory) {
        this.chartFactory = chartFactory;
    }

    private ChartFactory getChartFactory() {
        return chartFactory;
    }

    public void setModelManager(JMadModelManager modelManager) {
        this.modelManager = modelManager;
    }

    private JMadModelManager getModelManager() {
        return modelManager;
    }
}