Files
2026-06-17 14:00:51 +02:00

355 lines
14 KiB
Python

from javax.swing import JTable, JScrollPane, JFrame, JPanel, JComboBox, BorderFactory, DefaultCellEditor, JLabel, UIManager, SwingConstants, JFileChooser
from javax.swing.table import TableCellRenderer, DefaultTableCellRenderer
from java.awt.event import MouseAdapter,MouseEvent, WindowListener, WindowEvent
from java.awt import GridLayout, Dimension, BorderLayout, Color
from javax.swing.table import AbstractTableModel, DefaultTableModel
from java.lang.Object import getClass
import jarray
from javax.swing.event import TableModelListener, TableModelEvent
from javax.swing.filechooser import FileNameExtensionFilter
from org.apache.commons.io import FilenameUtils
from java.io import File
from java.awt.event import WindowAdapter
from java.util.concurrent import CountDownLatch
class CreateAndShowGUI7(TableModelListener):
def __init__(self):
# Define a listener that counts down when the window is closed
class MyWindowListener(WindowAdapter):
def windowClosed(self, e):
global latch
if "latch" in globals():
print "counting down latch"
latch.countDown()
self.logLevel = 0
# Create and set up the window.
self.initialise_model()
self.frame = JFrame("For a station group put a group name in the stations for that group")
self.frame.setSize(600, 600)
self.completeTablePanel()
# print "about to populate"
self.populate_action(None)
self.cancel = False
self.toggle = True
self.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)
self.frame.addWindowListener(MyWindowListener())
def completeTablePanel(self):
self.topPanel= JPanel()
self.topPanel.setLayout(BoxLayout(self.topPanel, BoxLayout.X_AXIS))
self.self_table()
scrollPane = JScrollPane(self.table)
scrollPane.setSize(600,600)
self.topPanel.add(scrollPane)
self.buttonPane = JPanel()
self.buttonPane.setLayout(BoxLayout(self.buttonPane, BoxLayout.LINE_AXIS))
self.buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10))
button_close = JButton("Save and Close", actionPerformed = self.close_action)
self.buttonPane.add(button_close)
self.buttonPane.add(Box.createHorizontalGlue())
contentPane = self.frame.getContentPane()
contentPane.removeAll()
contentPane.add(self.topPanel, BorderLayout.CENTER)
contentPane.add(self.buttonPane, BorderLayout.PAGE_END)
self.frame.pack()
self.frame.setVisible(True)
return
def initialise_model(self):
self.model = None
self.model = MyTableModel7()
self.table = JTable(self.model)
self.model.addTableModelListener(MyModelListener7(self));
def self_table(self):
self.table.setFillsViewportHeight(True);
self.table.setRowHeight(30)
columnModel = self.table.getColumnModel()
[station_col, platform_col, station_group_col] = [0, 1, 2]
columnModel.getColumn(station_col).setPreferredWidth(300)
columnModel.getColumn(platform_col).setPreferredWidth(200)
columnModel.getColumn(station_group_col).setPreferredWidth(200)
jpane = JScrollPane(self.table)
panel = JPanel()
panel.add(jpane)
result = JScrollPane(panel)
return self.table
def add_row_action(self, e):
model = e.getSource()
# data = self.model.getValueAt(0, 0)
count = self.model.getRowCount()
colcount = self.model.getColumnCount()
self.model.add_row()
self.completeTablePanel()
def get_locations_list(self):
LocationsManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.locations.LocationManager)
locations_list = LocationsManager.getLocationsByNameList()
my_list = [[loc.getName()] for loc in locations_list]
return my_list
def populate_action(self, event):
items_to_put_in_dropdown = self.get_station_list()
self.model.populate(items_to_put_in_dropdown)
self.tidy_action(None)
self.completeTablePanel()
pass
def tidy_action(self,e):
self.model.remove_not_set_row()
height = self.set_frame_height()
self.frame.setPreferredSize(Dimension(600, height))
def set_frame_height(self):
size_of_one_row = 30
# set height of non row data
height = 130
# add height of row data
for row in reversed(range(len(self.model.data))):
height += size_of_one_row
height = min(height, 800)
# print "height", height
return height
def close_action(self, event):
self.save()
self.frame.dispatchEvent(WindowEvent(self.frame, WindowEvent.WINDOW_CLOSING));
def save_action(self, event):
self.save()
def save(self):
[station_col, platform_col, station_group_col] = [0, 1, 2,]
# print "save_action"
# self.clear_everything()
# print "apply action"
for row in reversed(range(len(self.model.data))):
# time_name = str(self.model.data[row][time_col])
station_name = str(self.model.data[row][station_col])
platform_name = str(self.model.data[row][platform_col])
station_group_name = str(self.model.data[row][station_group_col])
# repeat_name = str(self.model.data[row][repeat_col])
# if time_name != "" and route_name != "" and train_name_val != "":
if station_name != "":
self.save_values(station_name, platform_name, station_group_name)
pass
else:
msg = "Cannot save row: " + str(row) + " train name, route or delay is not set"
OptionDialog().displayMessage(msg,"")
self.completeTablePanel()
if self.model.getRowCount() == 0:
self.frame.dispatchEvent(WindowEvent(self.frame, WindowEvent.WINDOW_CLOSING))
def save_values(self, station_name, platform_name, station_group_name):
LocationManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.locations.LocationManager)
location = LocationManager.getLocationByName(station_name)
self.set_location_platform(location, platform_name)
self.set_location_station_group(location, station_group_name)
def set_location_platform(self, location, location_value):
if location_value != None:
# call using set_turnout(location, "Platform 1")
tag = "IMIS:"+ location.getName().replace(" ","_") +"_Platform"
memory = memories.provideMemory(tag)
memory.setValue(location_value)
def set_location_station_group(self, location, location_value):
if location_value != None:
# call using set_location_station_group(location, "Winchester")
tag = "IMIS:"+ location.getName().replace(" ","_") +"_StationGroup"
memory = memories.provideMemory(tag)
memory.setValue(location_value)
def get_station_list(self):
# only display the locations that are in the routes, as these are the ones that can be displayed in the timetable
# the locations can get out of synch if we have deleted a station
TrainManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.trains.TrainManager)
train_list = TrainManager.getTrainsByTimeList()
my_scheduled_route_list = [train.getRoute() for train in train_list]
print "my_scheduled_route_list"
if None in my_scheduled_route_list:
OptionDialog().displayMessage("check scheduled routes are entered correctly\ncannot proceed with timetable")
return []
else:
RouteManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.routes.RouteManager)
station_list = []
for route in my_scheduled_route_list:
route_locations_list = route.getLocationsBySequenceList()
station_list1 = [str(route_location.getName()) for route_location in route_locations_list \
if ".py" not in route_location.getName()]
for x in station_list1:
if x not in station_list:
station_list.append(x)
station_list.sort()
if self.logLevel > 0: print "station list", station_list
return station_list
class MyModelListener7(TableModelListener):
# def __init__(self, class_CreateAndShowGUI6, class_SchedulerPanel):
def __init__(self, class_CreateAndShowGUI6):
self.class_CreateAndShowGUI6 = class_CreateAndShowGUI6
# self.class_SchedulerPanel = class_SchedulerPanel
self.cancel = False
self.logLevel = 0
self.i = 0
def tableChanged(self, e) :
global CreateAndShowGUI6_glb
# print "INDES", self.i
row = e.getFirstRow()
column = e.getColumn()
# print "table changed", column
self.model = e.getSource()
self.class_CreateAndShowGUI6.save() # save everything when the table is chabged
def delete_row(self, row):
# print "deleting row"
self.model.data.pop(row)
def show_time_picker(self):
# Show a simple JOptionPane input dialog for time selection
selected_time = JOptionPane.showInputDialog(None, "Select a time (HH:mm):")
# if selected_time:
# print("Selected time:", selected_time)
return selected_time
class ComboBoxCellRenderer6 (TableCellRenderer):
def getTableCellRendererComponent(self, jtable, value, isSelected, hasFocus, row, column) :
panel = self.createPanel(value)
return panel
def createPanel(self, s) :
p = JPanel(BorderLayout())
p.add(JLabel(str(s), JLabel.LEFT), BorderLayout.WEST)
icon = UIManager.getIcon("Table.descendingSortIcon");
p.add(JLabel(icon, JLabel.RIGHT), BorderLayout.EAST);
p.setBorder(BorderFactory.createLineBorder(Color.blue));
return p;
class MyTableModel7 (DefaultTableModel):
columnNames = ["Station", "Platform", "Station Group"]
def __init__(self):
l1 = ["", "", ""]
self.data = [l1]
def remove_not_set_row(self):
b = False
for row in reversed(range(len(self.data))):
# print "row", row
if self.data[row][0] == "":
self.data.pop(row)
def populate(self, items_to_put_in_dropdown):
# print "in populate"
for row in reversed(range(len(self.data))):
self.data.pop(row)
# print "cleared everything"
# self.data = []
# append all trains to put in dropdown
[station_col, platform_col, station_group_col] = [0, 1, 2]
for location_name in items_to_put_in_dropdown:
LocationManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.locations.LocationManager)
location = LocationManager.getLocationByName(location_name)
platform = self.get_location_platform(location)
station_group = self.get_location_station_group(location)
self.data.append([location_name, platform, station_group])
# print "populated"
def find_between(self, s, first, last):
try:
start = s.index(first) + len(first)
end = s.index(last, start)
return s[start:end]
except ValueError:
return ""
def getColumnCount(self) :
return len(self.columnNames)
def getRowCount(self) :
return len(self.data)
def getColumnName(self, col) :
return self.columnNames[col]
def getValueAt(self, row, col) :
return self.data[row][col]
def getColumnClass(self, col) :
return java.lang.Boolean.getClass(self.getValueAt(0,col))
#only include if table editable
def isCellEditable(self, row, col) :
# Note that the data/cell address is constant,
# no matter where the cell appears onscreen.
# cell_value = self.getValueAt(row, col)
return True
# only include if data can change.
def setValueAt(self, value, row, col) :
# print "row", row, "col", col, "value", value
self.data[row][col] = value
self.fireTableCellUpdated(row, col)
# if (isValidValue(aValue)) {
# data[rowIndex][columnIndex] = aValue;
# fireTableCellUpdated(rowIndex, columnIndex); // Notify the table
# }
def get_location_platform(self, location):
#item_tag is "platform" or "station_group"
tag = "IMIS:"+ location.getName().replace(" ","_") + "_Platform"
memory = memories.getMemory(tag)
if memory != None:
# print "$$$$$$$$$$$$$$$$", turnout, 'IMIS:the_turnout_' +turnout_str
# print "value", turnout.getValue()
return str(memory.getValue())
else:
return " "
def set_location_platform(self, location, location_value):
if location_value != None:
# call using set_turnout(location, "Platform 1")
tag = "IMIS:"+ location.getName().replace(" ","_") +"_Platform"
memory = memories.provideMemory(tag)
memory.setValue(location_value)
def get_location_station_group(self, location):
# call using Station_group = self.get_location_station_group(location)
tag = "IMIS:"+ location.getName().replace(" ","_") +"_StationGroup"
memory = memories.getMemory(tag)
if memory != None:
# print "$$$$$$$$$$$$$$$$", turnout, 'IMIS:the_turnout_' +turnout_str
# print "value", turnout.getValue()
return str(memory.getValue())
else:
return " "