00001 import traceback
00002
00003 import cterm
00004 from cterm.cterm_const import *
00005
00006 import clnch_misc
00007 import clnch_colortable
00008
00009
00010
00011 MSGBOX_TYPE_OK = 0
00012 MSGBOX_TYPE_YESNO = 1
00013
00014 MSGBOX_RESULT_CANCEL = 0
00015 MSGBOX_RESULT_OK = 1
00016 MSGBOX_RESULT_YES = 2
00017 MSGBOX_RESULT_NO = 3
00018
00019
00020
00021 class MessageBox( cterm.Window ):
00022
00023 BUTTON_OK = 0
00024 BUTTON_YES = 1
00025 BUTTON_NO = 2
00026
00027 def __init__( self, x, y, parent_window, show=True, msgbox_type=MSGBOX_TYPE_OK, title=u"", message=u"", return_modkey=False ):
00028
00029 cterm.Window.__init__(
00030 self,
00031 x=x,
00032 y=y,
00033 width=5,
00034 height=5,
00035 origin= ORIGIN_X_CENTER | ORIGIN_Y_CENTER,
00036 parent_window=parent_window,
00037 bg_color = clnch_colortable.bg,
00038 show = False,
00039 resizable = False,
00040 title = title,
00041 minimizebox = False,
00042 maximizebox = False,
00043 close_handler = self.onClose,
00044 keydown_handler = self.onKeyDown,
00045 )
00046
00047 message_width = self.getStringWidth(message)
00048
00049 window_width = message_width + 2
00050 if window_width<20 : window_width=20
00051
00052 self.setPosSize(
00053 x=x,
00054 y=y,
00055 width=window_width,
00056 height=5,
00057 origin= ORIGIN_X_CENTER | ORIGIN_Y_CENTER
00058 )
00059 self.show(show)
00060
00061 self.msgbox_type = msgbox_type
00062 self.message = message
00063 self.return_modkey = return_modkey
00064
00065 if self.msgbox_type==MSGBOX_TYPE_OK:
00066 self.focus = MessageBox.BUTTON_OK
00067 elif self.msgbox_type==MSGBOX_TYPE_YESNO:
00068 self.focus = MessageBox.BUTTON_YES
00069 else:
00070 assert(False)
00071
00072 self.result = MSGBOX_RESULT_CANCEL
00073 self.result_mod = 0
00074
00075 self.paint()
00076
00077 def onClose(self):
00078 self.quit()
00079
00080 def onKeyDown( self, vk, mod ):
00081 if vk==VK_LEFT:
00082 if self.focus==MessageBox.BUTTON_NO:
00083 self.focus=MessageBox.BUTTON_YES
00084 self.paint()
00085 elif vk==VK_RIGHT:
00086 if self.focus==MessageBox.BUTTON_YES:
00087 self.focus=MessageBox.BUTTON_NO
00088 self.paint()
00089 elif vk==VK_RETURN:
00090 if self.focus==MessageBox.BUTTON_OK:
00091 self.result = MSGBOX_RESULT_OK
00092 self.result_mod = mod
00093 elif self.focus==MessageBox.BUTTON_YES:
00094 self.result = MSGBOX_RESULT_YES
00095 self.result_mod = mod
00096 elif self.focus==MessageBox.BUTTON_NO:
00097 self.result = MSGBOX_RESULT_NO
00098 self.result_mod = mod
00099 self.quit()
00100
00101 elif vk==VK_ESCAPE:
00102 if self.msgbox_type==MSGBOX_TYPE_OK:
00103 self.result = MSGBOX_RESULT_CANCEL
00104 self.result_mod = mod
00105 self.quit()
00106 elif self.msgbox_type==MSGBOX_TYPE_YESNO:
00107 self.result = MSGBOX_RESULT_CANCEL
00108 self.result_mod = mod
00109 self.quit()
00110
00111 def paint(self):
00112
00113 attribute_normal = cterm.Attribute( fg=clnch_colortable.fg )
00114 attribute_normal_selected = cterm.Attribute( fg=clnch_colortable.fg, bg=clnch_colortable.select_bg )
00115
00116 message_width = self.getStringWidth(self.message)
00117 self.putString( (self.width()-message_width)/2, 1, message_width, 1, attribute_normal, self.message )
00118
00119 if self.msgbox_type==MSGBOX_TYPE_OK:
00120 btn_string = u" OK "
00121 btn_width = self.getStringWidth(btn_string)
00122 self.putString( (self.width()-btn_width)/2, 3, btn_width, 1, attribute_normal_selected, btn_string )
00123
00124 elif self.msgbox_type==MSGBOX_TYPE_YESNO:
00125
00126 btn1_string = u"はい"
00127 btn1_width = self.getStringWidth(btn1_string)
00128 btn2_string = u"いいえ"
00129 btn2_width = self.getStringWidth(btn2_string)
00130
00131 if self.focus==MessageBox.BUTTON_YES:
00132 attr = attribute_normal_selected
00133 else:
00134 attr = attribute_normal
00135
00136 self.putString( (self.width()-btn1_width-btn2_width-4)/2, 3, btn1_width, 1, attr, btn1_string )
00137
00138 if self.focus==MessageBox.BUTTON_NO:
00139 attr = attribute_normal_selected
00140 else:
00141 attr = attribute_normal
00142
00143 self.putString( (self.width()+btn1_width-btn2_width+4)/2, 3, btn2_width, 1, attr, btn2_string )
00144
00145 def getResult(self):
00146 if self.return_modkey:
00147 return self.result, self.result_mod
00148 else:
00149 return self.result
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 def popMessageBox( main_window, msgbox_type, title, message, return_modkey=False ):
00184 pos = main_window.centerOfWindowInPixel()
00185 msgbox = MessageBox( pos[0], pos[1], main_window, False, msgbox_type, title, message, return_modkey )
00186 clnch_misc.adjustWindowPosition( main_window, msgbox, default_up=False )
00187 msgbox.show(True)
00188 main_window.enable(False)
00189 msgbox.messageLoop()
00190 result = msgbox.getResult()
00191 main_window.enable(True)
00192 main_window.activate()
00193 msgbox.destroy()
00194 return result
00195
00196