338 lines
14 KiB
Python
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()
|