class DisclosurePanel(Composite): def __init__(self, headerText, isOpen=False, **kwargs): self.handlers = [] self.content = None # this is awkward: VerticalPanel is the composite, # so we get the element here, and pass it in to VerticalPanel. element = None if kwargs.has_key('Element'): element = kwargs.pop('Element') self.mainPanel = VerticalPanel(Element=element) self.header = ClickableHeader(self) self.contentWrapper = SimplePanel() self.mainPanel.add(self.header) self.mainPanel.add(self.contentWrapper) DOM.setStyleAttribute(self.contentWrapper.getElement(), "padding", "0px"); DOM.setStyleAttribute(self.contentWrapper.getElement(), "overflow", "hidden"); self.isOpen = isOpen self.headerObj = DefaultHeader(headerText, self) self.setHeader(self.headerObj) if not kwargs.has_key('StyleName'): kwargs['StyleName']="gwt-DisclosurePanel" Composite.__init__(self, self.mainPanel, **kwargs) self.setContentDisplay() def add(self, widget): if self.getContent() is None: self.setContent(widget) def addEventHandler(self, handler): self.handlers.append(handler) def removeEventHandler(self, handler): self.handlers.remove(handler) def clear(self): self.setContent(None) def getContent(self): return self.content def getHeader(self): return self.header.getWidget() def getOpen(self): return self.isOpen def remove(self, widget): if widget == self.getContent(): self.setContent(None) return True return False def setContent(self, widget): if self.content is not None: self.contentWrapper.setWidget(None) self.content.removeStyleName("content") self.content = widget if self.content is not None: self.contentWrapper.setWidget(self.content) self.content.addStyleName("content") self.setContentDisplay() def setHeader(self, widget): self.header.setWidget(widget) def setOpen(self, isOpen): if self.isOpen == isOpen: return self.isOpen = isOpen self.setContentDisplay() self.fireEvent() def fireEvent(self): for handler in self.handlers: if self.isOpen: handler.onOpen(self) else: handler.onClose(self) def setContentDisplay(self): if self.isOpen: self.addStyleName("open") self.removeStyleName("closed") else: self.addStyleName("closed") self.removeStyleName("open") self.contentWrapper.setVisible(self.isOpen)
class DisclosurePanel(Composite): def __init__(self, *args, **kwargs): self.handlers = [] self.content = None # this is awkward: VerticalPanel is the composite, # so we get the element here, and pass it in to VerticalPanel. element = kwargs.pop('Element', None) # process the passed arguments headerText = headerWidget = None isOpen = False if len(args) == 1: header = args[0] if len(args) == 2: header, isOpen = args[:2] # apparently "basestring" is not understood if isinstance(header, str): headerText = header else: headerWidget = header isOpen = kwargs.pop('isOpen', isOpen) headerText = kwargs.pop('header', headerText) headerWidget = kwargs.pop('header', headerWidget) # TODO: add ImageBundle # images = kwargs.pop('images', None) # If both headerText and headerWidget are arguments, headerText will # be used to preserve API compatibility. headerContent = headerWidget if headerText is not None or headerContent is None: if headerText is None: headerText = "" headerContent = DefaultHeader(headerText) self.mainPanel = VerticalPanel(Element=element) self._init_header(headerContent) self.contentWrapper = SimplePanel() self.mainPanel.add(self.header) self.mainPanel.add(self.contentWrapper) DOM.setStyleAttribute(self.contentWrapper.getElement(), "padding", "0px"); DOM.setStyleAttribute(self.contentWrapper.getElement(), "overflow", "hidden"); if not kwargs.has_key('StyleName'): kwargs['StyleName']="gwt-DisclosurePanel" Composite.__init__(self, self.mainPanel, **kwargs) # Must call setOpen after creating the initializing the object self.isOpen = None self.setOpen(isOpen) self.setContentDisplay() def _init_header(self, headerContent): self.header = ClickableHeader(self) self.headerObj = headerContent self.addEventHandler(self.headerObj) self.setHeader(self.headerObj) def add(self, widget): if self.getContent() is None: self.setContent(widget) def addEventHandler(self, handler): self.handlers.append(handler) def removeEventHandler(self, handler): self.handlers.remove(handler) def clear(self): self.setContent(None) def getContent(self): return self.content def getHeader(self): return self.header.getWidget() def getOpen(self): return self.isOpen def remove(self, widget): if widget == self.getContent(): self.setContent(None) return True return False def setContent(self, widget): if self.content is not None: self.contentWrapper.setWidget(None) self.content.removeStyleName("content") self.content = widget if self.content is not None: self.contentWrapper.setWidget(self.content) self.content.addStyleName("content") self.setContentDisplay() def setHeader(self, widget): self.header.setWidget(widget) def setOpen(self, isOpen): if self.isOpen == isOpen: return self.isOpen = isOpen self.setContentDisplay() self.fireEvent() def fireEvent(self): for handler in self.handlers: if self.isOpen: handler.onOpen(self) else: handler.onClose(self) def setContentDisplay(self): if self.isOpen: self.addStyleName("open") self.removeStyleName("closed") else: self.addStyleName("closed") self.removeStyleName("open") self.contentWrapper.setVisible(self.isOpen)