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

338 lines
14 KiB
Python

import jmri
from javax.swing import JOptionPane, JFrame, JLabel, JButton, JTextField, JFileChooser, JMenu, JMenuItem, JMenuBar,JComboBox,JDialog,JList
from javax.swing import JOptionPane, WindowConstants, JScrollPane
#
# class OptionDialog
# Some Swing dialogs
#
class OptionDialog( jmri.jmrit.automat.AbstractAutomaton ) :
CLOSED_OPTION = False
logLevel = 0
def List(self, title, list_items, preferred_size = "default"):
my_list = JList(list_items)
my_list.setSelectedIndex(0)
scrollPane = JScrollPane(my_list)
if preferred_size != "default":
scrollPane.setPreferredSize(preferred_size) # preferred_size should be set to Dimension(300, 500) say
else:
no_rows_to_display = min(40, len(list_items))
my_list.setVisibleRowCount(no_rows_to_display)
dim = my_list.getPreferredScrollableViewportSize()
w = int(dim.getWidth())
h = int(dim.getHeight()) + 10 # to leave a bit of space at bottom. Height of row = approx 20
scrollPane.setPreferredSize(Dimension(w,h))
i = []
self.CLOSED_OPTION = False
options = ["OK"]
while len(i) == 0:
s = JOptionPane().showOptionDialog(None,
scrollPane,
title,
JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE,
None,
options,
options[0])
if s == JOptionPane.CLOSED_OPTION:
self.CLOSED_OPTION = True
if self.logLevel > 1 : print "closed Option"
return
i = my_list.getSelectedIndices()
index = i[0]
return list_items[index]
#list and option buttons
def ListOptions(self, list_items, title, options, message=None, preferred_size="default"):
# print "list_items=",list_items
my_list = JList(list_items)
# print "my_list=",my_list
if list_items != []:
my_list.setSelectedIndex(0)
scrollPane = JScrollPane(my_list)
if preferred_size != "default":
scrollPane.setPreferredSize(preferred_size) # preferred_size should be set to Dimension(300, 500) say
else:
no_rows_to_display = min(40, len(list_items))
my_list.setVisibleRowCount(no_rows_to_display)
dim = my_list.getPreferredScrollableViewportSize()
w = int(dim.getWidth()) + 20
h = int(dim.getHeight() + 20) # to leave a bit of space at bottom. Height of row = approx 20
scrollPane.setPreferredSize(Dimension(w,h))
self.CLOSED_OPTION = False
panel = JPanel()
panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS))
panel.add(JLabel(message))
# Add a little spacing
panel.add(Box.createVerticalStrut(10))
# Add the scrollPane containing the list
panel.add(scrollPane)
s = JOptionPane.showOptionDialog(None,
panel,
title,
JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE,
None,
options,
options[0])
if s == JOptionPane.CLOSED_OPTION:
self.CLOSED_OPTION = True
return [None,None,None]
if my_list.getModel().getSize() != 0:
index = my_list.getSelectedIndices()[0]
else:
index = 0
if list_items == []:
return [None, options[s], index]
return [list_items[index], options[s], index]
# call using
# list_items = ["list1","list2"]
# options = ["opt1", "opt2", "opt3"]
# title = "title"
# [list, option, index] = OptionDialog().ListOptions(list_items, title, options)
# print "option= " ,option, " list = ",list, " index = ",index
def MultipleListOptions(self, list_items, title, options, preferred_size = "default"):
my_list = JList(list_items)
if list_items != []:
my_list.setSelectedIndex(0)
scrollPane = JScrollPane(my_list)
if preferred_size != "default":
scrollPane.setPreferredSize(preferred_size) # preferred_size should be set to Dimension(300, 500) say
else:
no_rows_to_display = min(40, len(list_items))
my_list.setVisibleRowCount(no_rows_to_display)
dim = my_list.getPreferredScrollableViewportSize()
w = int(dim.getWidth()) + 20
h = int(dim.getHeight() + 20) # to leave a bit of space at bottom. Height of row = approx 20
scrollPane.setPreferredSize(Dimension(w,h))
self.CLOSED_OPTION = False
s = JOptionPane.showOptionDialog(None,
scrollPane,
title,
JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE,
None,
options,
options[0])
if s == JOptionPane.CLOSED_OPTION:
self.CLOSED_OPTION = True
return [None,"Cancel"]
if list_items == []:
return [None, options[s]]
indices = my_list.getSelectedIndices()
list_items = [list_items[index] for index in indices]
return [list_items, options[s]]
def variable_combo_box(self, options, default, msg, title = None, type = JOptionPane.QUESTION_MESSAGE):
result = JOptionPane.showInputDialog(
None, # parentComponent
msg, # message text
title, # title
type, # messageType
None, # icon
options, # selectionValues
default # initialSelectionValue
)
return result
def displayMessageNonModal(self, msg, jButtonMsg = "OK"):
global customDialog
customDialog = JDialog(None, msg, False); # 'true' for modal
# customDialog.addWindowListener(WindowAdapter())
# def windowClosing(self, e):
# print("jdialog window closing event received")
# # Add your custom closing logic herecustomDialog.addWindowListener(WindowAdapter():
# Add components to the customDialog
# customDialog.setSize(1200, 1200)
dimension = Dimension(400,150)
customDialog.setPreferredSize(dimension)
pane = customDialog.getContentPane();
pane.setLayout(None);
button = JButton(jButtonMsg, actionPerformed = self.click_action) ;
button.setBounds(10,10,300,60);
pane.add(button)
customDialog.setLocationRelativeTo(None);
# customDialog.setUndecorated(True)
customDialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)
customDialog.pack();
customDialog.setVisible(True);
def click_action(self,e):
global customDialog
# global jdialog_closed
sensors.getSensor("Jdialog_closed").setKnownState(ACTIVE)
# print "&&&&&&&&&&&&&& jdialog_closed", jdialog_closed
customDialog.dispose()
return
def displayMessage(self, msg, title = ""):
self.CLOSED_OPTION = False
s = JOptionPane.showOptionDialog(None,
msg,
title,
JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE,
None,
["OK"],
None)
#JOptionPane.showMessageDialog(None, msg, 'Message', JOptionPane.WARNING_MESSAGE)
if s == JOptionPane.CLOSED_OPTION:
self.CLOSED_OPTION = True
return
return s
def customQuestionMessage2str(self, msg, title, opt1, opt2):
self.CLOSED_OPTION = False
options = [opt1, opt2]
s = JOptionPane.showOptionDialog(None,
msg,
title,
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
None,
options,
options[1])
if s == JOptionPane.CLOSED_OPTION:
self.CLOSED_OPTION = True
return
if s == JOptionPane.YES_OPTION:
s1 = opt1
else:
s1 = opt2
return s1
def customQuestionMessage3str(self, msg, title, opt1, opt2, opt3):
self.CLOSED_OPTION = False
options = [opt1, opt2, opt3]
s = JOptionPane.showOptionDialog(None,
msg,
title,
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
None,
options,
options[0])
if s == JOptionPane.CLOSED_OPTION:
self.CLOSED_OPTION = True
return
if s == JOptionPane.YES_OPTION:
s1 = opt1
elif s == JOptionPane.NO_OPTION:
s1 = opt2
else:
s1 = opt3
return s1
def customQuestionMessage4str(self, msg, title, opt1, opt2, opt3, opt4):
self.CLOSED_OPTION = False
options = [opt1, opt2, opt3, opt4]
s = JOptionPane.showOptionDialog(None,
msg,
title,
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
None,
options,
options[0])
if s == JOptionPane.CLOSED_OPTION:
self.CLOSED_OPTION = True
return
if s == 0:
s1 = opt1
elif s == 1:
s1 = opt2
elif s == 2:
s1 = opt3
else:
s1 = opt4
return s1
def customQuestionMessage5str(self, msg, title, opt1, opt2, opt3, opt4, opt5):
self.CLOSED_OPTION = False
options = [opt1, opt2, opt3, opt4, opt5]
s = JOptionPane.showOptionDialog(None,
msg,
title,
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
None,
options,
options[0])
if s == JOptionPane.CLOSED_OPTION:
self.CLOSED_OPTION = True
return
if s == 0:
s1 = opt1
elif s == 1:
s1 = opt2
elif s == 2:
s1 = opt3
elif s == 3:
s1 = opt4
else:
s1 = opt5
return s1
def customMessage(self, msg, title, opt1):
self.CLOSED_OPTION = False
options = [opt1]
s = JOptionPane.showOptionDialog(None,
msg,
title,
JOptionPane.YES_OPTION,
JOptionPane.PLAIN_MESSAGE,
None,
options,
options[0])
if s == JOptionPane.CLOSED_OPTION:
self.CLOSED_OPTION = True
return
return s
def input(self,msg, title, default_value):
options = None
x = JOptionPane.showInputDialog( None, msg,title, JOptionPane.QUESTION_MESSAGE, None, options, default_value);
if x == None:
self.CLOSED_OPTION = True
return
return x
class modifiableJComboBox:
def __init__(self, list, msg, default = ""):
jcb = JComboBox(list)
jcb.setMaximumRowCount(30);
jcb.setSelectedItem(default);
jcb.setEditable(True)
JOptionPane.showMessageDialog( None, jcb, msg, JOptionPane.QUESTION_MESSAGE)
self.ans = str(jcb.getSelectedItem())
def return_val(self):
return self.ans
if __name__ == '__builtin__':
sensors.getSensor("stopMasterSensor").setKnownState(INACTIVE)
sensors.getSensor("modifyMasterSensor").setKnownState(INACTIVE)
msg = "Wait few seconds to finish starting up, then\n\n Set up a train in a section\n before dispatching a train "
OptionDialog().displayMessage(msg)
RunDispatchMaster = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/RunDispatchMaster.py')
exec(open(RunDispatchMaster).read())
RunDispatcherMaster()