001package jmri.jmrit.beantable.routetable;
002
003import jmri.InstanceManager;
004import jmri.Route;
005import jmri.Sensor;
006import jmri.Turnout;
007
008import javax.swing.*;
009import java.awt.*;
010import java.awt.event.ActionEvent;
011
012/**
013 * Edit frame for the Route Table.
014 *
015 * Split from {@link jmri.jmrit.beantable.RouteTableAction}
016 *
017 * @author Dave Duchamp Copyright (C) 2004
018 * @author Bob Jacobsen Copyright (C) 2007
019 * @author Simon Reader Copyright (C) 2008
020 * @author Pete Cressman Copyright (C) 2009
021 * @author Egbert Broerse Copyright (C) 2016
022 * @author Paul Bender Copyright (C) 2020
023 */
024public class RouteEditFrame extends AbstractRouteAddEditFrame {
025
026    private final String systemName;
027
028    public RouteEditFrame() {
029        this(Bundle.getMessage("TitleEditRoute"));
030    }
031
032    public RouteEditFrame(String systemName) {
033        this(Bundle.getMessage("TitleEditRoute"), systemName);
034    }
035
036    public RouteEditFrame(String name, String systemName) {
037        this(name,false,true, systemName);
038    }
039
040    public RouteEditFrame(String name, boolean saveSize, boolean savePosition, String systemName) {
041        super(name, saveSize, savePosition);
042        this.systemName = systemName;
043        initComponents();
044    }
045
046    @Override
047    public final void initComponents() {
048        super.initComponents();
049        _systemName.setText(systemName);
050        // identify the Route with this name if it already exists
051        String sName = _systemName.getText();
052        Route g = InstanceManager.getDefault(jmri.RouteManager.class).getBySystemName(sName);
053        if (g == null) {
054            sName = _userName.getText();
055            g = InstanceManager.getDefault(jmri.RouteManager.class).getByUserName(sName);
056            if (g == null) {
057                // Route does not exist, so cannot be edited
058                status1.setText(Bundle.getMessage("RouteAddStatusErrorNotFound"));
059                return;
060            }
061        }
062        // Route was found, make its system name not changeable
063        curRoute = g;
064        _systemName.setVisible(true);
065        _systemName.setText(sName);
066        _systemName.setEnabled(false);
067        nameLabel.setEnabled(true);
068        _autoSystemName.setVisible(false);
069        // deactivate this Route
070        curRoute.deActivateRoute();
071        // get information for this route
072        _userName.setText(g.getUserName());
073
074        setPageContent(g);
075
076        // begin with showing all Turnouts
077        // set up buttons and notes
078        status1.setText(Bundle.getMessage("RouteAddStatusInitial3", Bundle.getMessage("ButtonUpdate")));
079        status2.setText(Bundle.getMessage("RouteAddStatusInitial4", Bundle.getMessage("ButtonCancelEdit", Bundle.getMessage("ButtonEdit"))));
080        status2.setVisible(true);
081        setTitle(Bundle.getMessage("TitleEditRoute"));
082        editMode = true;
083    }
084
085    @Override
086    protected JPanel getButtonPanel() {
087        final JButton cancelEditButton = new JButton(Bundle.getMessage("ButtonCancelEdit", Bundle.getMessage("ButtonEdit"))); // I18N for word sequence "Cancel Edit"
088        final JButton deleteButton = new JButton(Bundle.getMessage("ButtonDelete") + " " + Bundle.getMessage("BeanNameRoute")); // I18N "Delete Route"
089        final JButton updateButton = new JButton(Bundle.getMessage("ButtonUpdate"));
090        final JButton exportButton = new JButton(Bundle.getMessage("ButtonExport"));
091        // add Buttons panel
092        JPanel pb = new JPanel();
093        pb.setLayout(new FlowLayout(FlowLayout.TRAILING));
094        // CancelEdit button
095        pb.add(cancelEditButton);
096        cancelEditButton.addActionListener(this::cancelPressed);
097        cancelEditButton.setToolTipText(Bundle.getMessage("TooltipCancelRoute"));
098        // Delete Route button
099        pb.add(deleteButton);
100        deleteButton.addActionListener(this::deletePressed);
101        deleteButton.setToolTipText(Bundle.getMessage("TooltipDeleteRoute"));
102        // Update Route button
103        pb.add(updateButton);
104        updateButton.addActionListener((ActionEvent e1) -> updatePressed(false));
105        updateButton.setToolTipText(Bundle.getMessage("TooltipUpdateRoute"));
106        // Export button
107        pb.add(exportButton);
108        exportButton.addActionListener(this::exportButtonPressed);
109        exportButton.setToolTipText(Bundle.getMessage("TooltipExportRoute"));
110
111        // Show the initial buttons, and hide the others
112        deleteButton.setVisible(true);
113        cancelEditButton.setVisible(true);
114        updateButton.setVisible(true);
115        exportButton.setVisible(true);
116        return pb;
117    }
118
119    /**
120     * Respond to the export button.
121     *
122     * @param e the action event
123     */
124    private void exportButtonPressed(ActionEvent e){
125        new RouteExportToLogix(_systemName.getText()).export();
126        status1.setText(Bundle.getMessage("BeanNameRoute")
127                + "\"" + _systemName.getText() + "\" " +
128                Bundle.getMessage("RouteAddStatusExported") + " ("
129                + get_includedTurnoutList().size() +
130                Bundle.getMessage("Turnouts") + ", " +
131                get_includedSensorList().size() + " " + Bundle.getMessage("Sensors") + ")");
132        finishUpdate();
133        closeFrame();
134    }
135
136    /**
137     * Respond to the CancelEdit button.
138     *
139     * @param e the action event
140     */
141    private void cancelPressed(ActionEvent e) {
142        cancelEdit();
143    }
144
145    /**
146     * Respond to the Delete button.
147     *
148     * @param e the action event
149     */
150    private void deletePressed(ActionEvent e) {
151        // route is already deactivated, just delete it
152        routeManager.deleteRoute(curRoute);
153
154        curRoute = null;
155        finishUpdate();
156        closeFrame();
157    }
158
159}