def handleMouseEvent(self, event): if event.isPopupTrigger(): loadMenu = JMenuItem("Load .proto") loadMenu.addActionListener(self.tab.listener) popup = JPopupMenu() popup.add(loadMenu) if self.tab.descriptors: deserializeAsMenu = JMenu("Deserialize As...") popup.addSeparator() popup.add(deserializeAsMenu) for pb2, descriptors in self.tab.descriptors.iteritems(): subMenu = JMenu(pb2) deserializeAsMenu.add(subMenu) for name, descriptor in descriptors.iteritems(): protoMenu = JMenuItem(name) protoMenu.addActionListener( DeserializeProtoActionListener(self.tab, descriptor)) subMenu.add(protoMenu) popup.show(event.getComponent(), event.getX(), event.getY()) return
class OptionsCallbackPopupMenu: # options should be a list of (name, function, [arg1, [arg2]]) tuples def __init__(self, parent, x, y, options, extraOptions=None): self.popupMenu = JPopupMenu() self.options = options self.addToMenuForOptions(options) if extraOptions: self.addToMenuForOptions(extraOptions) self.popupMenu.show(parent, x, y) def addToMenuForOptions(self, options, menu=None): if not menu: menu = self.popupMenu for option in options: if not option or not option[0]: menu.addSeparator() else: if type(option[1]) in [tuple, list]: # nested menu submenu = JMenu(option[0]) self.addToMenuForOptions(option[1], submenu) menu.add(submenu) else: menuItem = JMenuItem(option[0], actionPerformed=lambda event, option=option: self.OnChoice(option)) menu.add(menuItem) def OnChoice(self, option): if len(option) == 2: option[1]() elif len(option) == 3: option[1](option[2]) elif len(option) == 4: option[1](option[2], option[3])
def show(self, component, onChange): self.__onChange = onChange menu = JPopupMenu() jcalendar = JCalendar() jcalendar.addDateListener(self) menu.add(jcalendar) menu.show(component, 0, component.getY() + int(component.getSize().getHeight()))
def actionPerformed(self, event): messages = self.browser.getSelectedMessages() numMessages = messages.size() if numMessages == 0: self.browser.showInformationDialog("No messages selected") return if numMessages > 1: self.browser.showInformationDialog("%d messages selected, choose one" % numMessages) return message = messages.get(0) replyToId = message.getJMSMessageID() replyToQueue0 = message.getJMSReplyTo() if replyToQueue0 != None: replyToQueue0 = replyToQueue0.getQueueName() p = Pattern.compile("[^\\s:/]+://[^\\s:/]*/([^\\s:/?]+)\\??.*") m = p.matcher(replyToQueue0) if m.matches(): replyToQueue0 = m.group(1) else: replyToQueue0 = None dNode = self.browser.getBrowserTree().getFirstSelectedDestinationNode() hNode = self.browser.getBrowserTree().getSelectedHermesNode() if dNode == None or hNode == None: self.browser.showInformationDialog("Unknown destination, select destination queue") return hermes = hNode.getHermes() replyToQueue1 = dNode.getDestinationName() replyToDomain = dNode.getDomain() if replyToQueue0 == None and replyToQueue1 == None: self.browser.showInformationDialog("Unknown destination, select destination queue") return # show menu if replyToQueue0 != None and replyToQueue1 != None and replyToQueue0 != replyToQueue1: menu = JPopupMenu() q0item = JMenuItem(replyToQueue0) q0item.addActionListener(MenuItemHandler(self, hermes, replyToId, replyToQueue0, replyToDomain)) menu.add(q0item) q1item = JMenuItem(replyToQueue1) q1item.addActionListener(MenuItemHandler(self, hermes, replyToId, replyToQueue1, replyToDomain)) menu.add(q1item) menu.show(self.button, 0, self.button.getHeight()) return # show new message dialog else: if replyToQueue0 != None: replyToQueue = replyToQueue0 else: replyToQueue = replyToQueue1 self.replyTo(hermes, replyToId, replyToQueue, replyToDomain)
class DataPanel(JPanel,MouseListener): def __init__(self,view): JPanel.__init__(self) self.view=view self.background=Color.white self.layout=BorderLayout() self.popup=JPopupMenu() self.popup_items={} self.add(self.make_controls(),BorderLayout.SOUTH) data,title=self.extract_data() self.table=JTable(DefaultTableModel(data,title)) scroll=JScrollPane(self.table) self.add(scroll) scroll.addMouseListener(self) self.table.tableHeader.addMouseListener(self) self.table.addMouseListener(self) self.fileChooser=JFileChooser() self.fileChooser.setFileFilter(CSVFilter()) self.fileChooser.setSelectedFile(File('%s.csv'%self.view.network.name)) def make_controls(self): from timeview.components.timecontrol import Icon, ShadedIcon panel=JPanel(background=self.background) panel.add(JButton(Icon.refresh,actionPerformed=self.refresh,rolloverIcon=ShadedIcon.refresh,toolTipText='refresh',borderPainted=False,focusPainted=False,contentAreaFilled=False)) filter=JPanel(layout=BorderLayout(),opaque=False) self.filter = JSpinner(SpinnerNumberModel(self.view.tau_filter,0,0.5,0.01),stateChanged=self.refresh) filter.add(self.filter) filter.add(JLabel('filter'),BorderLayout.NORTH) filter.maximumSize=filter.preferredSize panel.add(filter) decimals=JPanel(layout=BorderLayout(),opaque=False) self.decimals = JSpinner(SpinnerNumberModel(3,0,10,1),stateChanged=self.refresh) decimals.add(self.decimals) decimals.add(JLabel('decimal places'),BorderLayout.NORTH) decimals.maximumSize=decimals.preferredSize panel.add(decimals) panel.add(JButton(Icon.save,actionPerformed=self.save,rolloverIcon=ShadedIcon.save,toolTipText='save',borderPainted=False,focusPainted=False,contentAreaFilled=False)) return panel def extract_data(self): pause_state=self.view.paused self.view.paused=True while self.view.simulating: java.lang.Thread.sleep(10) tau=float(self.filter.value) dt=self.view.dt if tau<dt: dt_tau=None else: dt_tau=dt/tau decimals=int(self.decimals.value) format='%%1.%df'%decimals start_index=max(0,self.view.timelog.tick_count-self.view.timelog.tick_limit+1) count=min(self.view.timelog.tick_limit,self.view.timelog.tick_count) start_time=start_index*self.view.dt data=None title=['t'] keys = self.view.watcher.active.keys() keys.sort() for key in keys: watch = self.view.watcher.active[key] name,func,args=key code='%s.%s%s'%(name,func.__name__,args) if code not in self.popup_items: state=True if 'spike' in func.__name__: state=False if 'voltage' in func.__name__: state=False self.popup_items[code]=JCheckBoxMenuItem(code,state,stateChanged=self.refresh) self.popup.add(self.popup_items[code]) if self.popup_items[code].state is False: continue d=watch.get(dt_tau=dt_tau,start=start_index,count=count) n=len(watch.get_first()) if data is None: data=[] while len(data)<len(d): data.append(['%0.4f'%(start_time+(len(data)+0)*self.view.dt)]) for i in range(n): title.append('%s[%d]'%(code,i)) for j in range(len(data)): dd=d[j] if dd is None: data[j].append('') else: data[j].append(format%dd[i]) self.view.paused=pause_state return data,title def save(self,event=None): if self.fileChooser.showSaveDialog(self)==JFileChooser.APPROVE_OPTION: f=self.fileChooser.getSelectedFile() writer=BufferedWriter(FileWriter(f)) data,title=self.extract_data() title=[t.replace(',',' ') for t in title] writer.write(','.join(title)+'\n') for row in data: writer.write(','.join(row)+'\n') writer.close() def refresh(self,event=None): data,title=self.extract_data() self.table.model.setDataVector(data,title) def mouseClicked(self, event): if event.button==MouseEvent.BUTTON3 or (event.button==MouseEvent.BUTTON1 and event.isControlDown()): if self.popup is not None: self.popup.show(event.source,event.x-5,event.y-5) def mouseEntered(self, event): pass def mouseExited(self, event): pass def mousePressed(self, event): pass def mouseReleased(self, event): pass
class DataViewComponent(JPanel, MouseListener, MouseWheelListener, MouseMotionListener, ActionListener): #hover_border=BorderFactory.createLineBorder(Color.black,2); #item_hover_border=BorderFactory.createLineBorder(Color(0.5,0.5,0.5),1); hover_border = RoundedBorder(Color.black, thickness=2) item_hover_border = RoundedBorder(Color(0.7, 0.7, 0.7)) default_border = BorderFactory.createEmptyBorder() def __init__(self, label=None): JPanel.__init__(self) self.addMouseListener(self) self.addMouseWheelListener(self) self.addMouseMotionListener(self) self.hover = False self.min_width = 20 self.min_height = 20 self.resize_border = 20 self.max_show_dim = 30 # The maximum number of display dimensions to show in the popup menu self.setSize(100, 50) self.border = self.default_border self.popup = JPopupMenu() self.popup.add(JMenuItem('hide', actionPerformed=self.hideme)) self.show_label = False self.label = label self.label_offset = 0 if self.label is not None: self.show_label = True self.popup.add(JPopupMenu.Separator()) self.popup_label = JCheckBoxMenuItem('label', self.show_label, actionPerformed=self.toggle_label) self.popup.add(self.popup_label) self.label_height = 15 self.update_label() else: self.label_height = 0 def save(self): return dict(x=self.x, y=self.y, width=self.width, height=self.height, label=self.show_label) def restore(self, d): self.setLocation(d['x'], d['y']) self.setSize(d['width'], d['height']) self.show_label = d.get('label', False) if self.label is not None: self.popup_label.state = self.show_label self.label_offset = self.label_height * self.show_label def do_hide(self): parent = self.parent self.visible = False if self.parent is not None: self.parent.remove(self) parent.repaint() def hideme(self, event): if event.actionCommand == 'hide': self.do_hide() def toggle_label(self, event): self.show_label = event.source.state self.update_label() def update_label(self): if(self.show_label): self.setLocation(self.x, self.y - self.label_height) self.setSize(self.size.width, self.size.height + self.label_height) self.label_offset = self.label_height else: self.setLocation(self.x, self.y + self.label_height) self.setSize(self.size.width, self.size.height - self.label_height) self.label_offset = 0 self.repaint() def mouseWheelMoved(self, event): delta = event.wheelRotation scale = 0.9 if delta < 0: scale = 1.0 / scale delta = -delta w = self.size.width h = self.size.height for i in range(delta): w *= scale h *= scale if w < self.min_width: w = self.min_width if h < self.min_height: h = self.min_height w = int(w) h = int(h) self.setLocation(int(self.x - (w - self.size.width) / 2), int(self.y - (h - self.size.height) / 2)) self.setSize(w, h) def mouseClicked(self, event): if event.button == MouseEvent.BUTTON3 or (event.button == MouseEvent.BUTTON1 and event.isControlDown()): self.parent.add(self.popup) self.popup.show(self, event.x - 5, event.y - 5) def mouseEntered(self, event): self.border = self.hover_border for n in self.view.area.components: if n is not self and hasattr(n, 'name') and n.name == self.name: n.border = n.item_hover_border self.repaint() def mouseExited(self, event): self.border = self.default_border for n in self.view.area.components: if n is not self and hasattr(n, 'name') and n.name == self.name: n.border = n.default_border self.repaint() def mousePressed(self, event): self.mouse_pressed_x = event.x self.mouse_pressed_y = event.y self.mouse_pressed_size = self.size def mouseReleased(self, event): pass def mouseDragged(self, event): if self.cursor.type == Cursor.HAND_CURSOR: self.setLocation(self.x + event.x - self.mouse_pressed_x, self.y + event.y - self.mouse_pressed_y) if self.cursor.type in [Cursor.W_RESIZE_CURSOR, Cursor.NW_RESIZE_CURSOR, Cursor.SW_RESIZE_CURSOR]: w = self.size.width - event.x + self.mouse_pressed_x if w < self.min_width: w = self.min_width self.setLocation(self.x - w + self.size.width, self.y) self.setSize(w, self.size.height) if self.cursor.type in [Cursor.E_RESIZE_CURSOR, Cursor.NE_RESIZE_CURSOR, Cursor.SE_RESIZE_CURSOR]: w = self.mouse_pressed_size.width + event.x - self.mouse_pressed_x if w < self.min_width: w = self.min_width self.setSize(w, self.size.height) if self.cursor.type in [Cursor.N_RESIZE_CURSOR, Cursor.NW_RESIZE_CURSOR, Cursor.NE_RESIZE_CURSOR]: h = self.size.height - event.y + self.mouse_pressed_y if h < self.min_height: h = self.min_height self.setLocation(self.x, self.y - h + self.size.height) self.setSize(self.size.width, h) if self.cursor.type in [Cursor.S_RESIZE_CURSOR, Cursor.SW_RESIZE_CURSOR, Cursor.SE_RESIZE_CURSOR]: h = self.mouse_pressed_size.height + event.y - self.mouse_pressed_y if h < self.min_height: h = self.min_height self.setSize(self.size.width, h) self.view.area.repaint() def mouseMoved(self, event): size = self.resize_border if event.x < size: if event.y < size: self.cursor = Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR) elif event.y >= self.size.height - size: self.cursor = Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR) else: self.cursor = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR) elif event.x >= self.size.width - size: if event.y < size: self.cursor = Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR) elif event.y >= self.size.height - size: self.cursor = Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR) else: self.cursor = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR) else: if event.y < size: self.cursor = Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR) elif event.y >= self.size.height - size: self.cursor = Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR) else: self.cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR) def paintComponent(self, g): #if self.hover: # g.color=Color(0.9,0.9,0.9) # g.fillRect(0,0,self.size.width,self.size.height) #else: g.color = Color.white g.fillRect(0, 0, self.size.width, self.size.height) g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) if self.show_label: g.color = Color(0.3, 0.3, 0.3) bounds = g.font.getStringBounds(self.label, g.fontRenderContext) g.drawString(self.label, self.size.width / 2 - bounds.width / 2, bounds.height) def tick(self, t): """This method will be called in the simulation timescale (as opposed to the rendering timescale of paintComponent). This is useful for updating the data that will be displayed by paintComponent, since the data changes at the simulation timescale. Note however that this method is not guaranteed to be called every simulation timestep; for example, if the simulation is running very quickly, it would not be desirable to be updating the data far more quickly than it can be displayed. :param float t: the current simulation time""" pass