001package jmri.jmrit.operations.setup.gui;
002
003import java.awt.GridBagLayout;
004import java.util.Hashtable;
005
006import javax.swing.*;
007
008import jmri.InstanceManager;
009import jmri.jmrit.operations.setup.*;
010import jmri.jmrit.operations.trains.TrainManager;
011import jmri.jmrit.operations.trains.schedules.TrainScheduleManager;
012
013/**
014 * Panel for user edit of day to name mapping
015 * @author Dan Boudreau Copyright (C) 2026
016 */
017public class EditDayToNameMapPanel extends OperationsPreferencesPanel {
018
019    // major buttons
020    JButton saveButton = new JButton(Bundle.getMessage("ButtonSave"));
021    JButton daysButton = new JButton(Bundle.getMessage("DaysOfWeek"));
022    JButton resetButton = new JButton(Bundle.getMessage("Reset"));
023
024    protected Hashtable<Integer, JTextField> hashTableDayToName = new Hashtable<>();
025 
026
027    public EditDayToNameMapPanel() {
028        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
029        JPanel pDays = new JPanel();
030        JScrollPane pManifestPane = new JScrollPane(pDays);
031        pManifestPane.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("BorderLayoutDays")));
032        pDays.setLayout(new BoxLayout(pDays, BoxLayout.Y_AXIS));
033        
034        for (int i = 0; i < Control.numberOfDays; i++) {            
035            JPanel pDay = new JPanel();
036            pDay.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("BorderLayoutDay", i)));
037            JTextField textField = new JTextField(25);
038            pDay.add(textField);
039            pDays.add(pDay);
040            String name = Setup.getDayToName(Integer.toString(i));
041            textField.setText(name);
042            hashTableDayToName.put(i, textField);
043        }
044        
045        // row 11
046        JPanel pControl = new JPanel();
047        pControl.setBorder(BorderFactory.createTitledBorder(""));
048        pControl.setLayout(new GridBagLayout());
049        addItem(pControl, resetButton, 0, 0);
050        addItem(pControl, daysButton, 1, 0);
051        addItem(pControl, saveButton, 2, 0);
052
053        add(pManifestPane);
054        add(pControl);
055
056        // set up buttons
057        addButtonAction(resetButton);
058        addButtonAction(daysButton);
059        addButtonAction(saveButton);
060   
061    }
062
063    // Save buttons
064    @Override
065    public void buttonActionPerformed(java.awt.event.ActionEvent ae) {
066        if (ae.getSource() == resetButton) {
067            hashTableDayToName.forEach((key, textField) -> {
068                textField.setText("");
069            });
070        }
071        if (ae.getSource() == daysButton) {
072            loadDays();
073        }
074        if (ae.getSource() == saveButton) {
075            savePreferences();
076            var topLevelAncestor = getTopLevelAncestor();
077            if (Setup.isCloseWindowOnSaveEnabled() && topLevelAncestor instanceof EditDayToNameMapFrame) {
078                ((EditDayToNameMapFrame) topLevelAncestor).dispose();
079            }
080        }
081    }
082    
083    private void loadDays() {
084        String[] days = InstanceManager.getDefault(TrainScheduleManager.class).getDaysOfWeek();
085        int j = 0;
086        for (int i = 0; i < Control.numberOfDays; i++) {
087            JTextField textField = hashTableDayToName.get(i);
088            textField.setText(days[j++]);
089            if (j == days.length) {
090                j = 0;
091            }
092        }
093    }
094
095    @Override
096    public String getTabbedPreferencesTitle() {
097        return Bundle.getMessage("TitleDayToNameMap");
098    }
099
100    @Override
101    public String getPreferencesTooltip() {
102        return null;
103    }
104
105    @Override
106    public void savePreferences() {
107        for (int i = 0; i < Control.numberOfDays; i++) {
108            JTextField textField = hashTableDayToName.get(i);
109            Setup.setDayToName(Integer.toString(i), textField.getText());
110        } 
111        InstanceManager.getDefault(OperationsSetupXml.class).writeOperationsFile();
112        InstanceManager.getDefault(TrainManager.class).setTrainsModified();
113    }
114
115    @Override
116    public boolean isDirty() {
117        return false;
118    }
119}