def newPositioner(self, context): # Use two widgets so that setPixelSize() consistently affects dimensions outer = SimplePanel() outer.addStyleName(CSS_DRAGDROP_POSITIONER) # place off screen for border calculation RootPanel.get().add(outer, -500, -500) # Ensure IE quirks mode returns valid outer.offsetHeight, and thus valid outer.setWidget(self.DUMMY_LABEL_IE_QUIRKS_MODE_OFFSET_HEIGHT) width = 0 height = 0 if isinstance(self.dropTarget,HorizontalPanel): for widget in context.selectedWidgets: width += widget.getOffsetWidth() height = Math.max(height, widget.getOffsetHeight()) else: for widget in context.selectedWidgets: width = Math.max(width, widget.getOffsetWidth()) height += widget.getOffsetHeight() inner = SimplePanel() inner.setPixelSize( width - DOMUtil.getHorizontalBorders(outer), height - DOMUtil.getVerticalBorders(outer)) outer.setWidget(inner) return outer
class Param(object): def __init__(self, container, kind, group, draw=True): self.container = container self.kind = kind self.group = group self.panel = SimplePanel(StyleName='aur-search-advanced-param') self.isInverted = False # assigned by parent, visual use only self.op = None if draw: self.draw() def draw(self): paramPanel = HorizontalPanel(Width='100%', VerticalAlignment='middle') options = self.drawOptions() label = Label(self.kind['item'], StyleName='aur-search-advanced-param-title') delSelf = Image(url='/ico/cross.png', Title='Delete this parameter') delSelf.addStyleName('aur-search-advanced-delete') if self.kind['allowsInverse']: invertSelf = Image(url='/ico/exclamation.png', Title='Invert this parameter') invertSelf.addClickListener(getattr(self, 'invertSelf')) else: invertSelf = Image(url='/ico/bullet_white.png', StyleName='aur-search-advanced-placeholder') self.container.add(self.panel) self.panel.setWidget(paramPanel) paramPanel.add(delSelf) paramPanel.add(label) paramPanel.add(options) paramPanel.add(invertSelf) paramPanel.setCellWidth(delSelf, '1px') paramPanel.setCellWidth(options, '1px') paramPanel.setCellWidth(invertSelf, '1px') delSelf.addClickListener(getattr(self, 'delSelf')) def drawOptions(self): widget = self.kind['widget']() if isinstance(widget, ListBox): for x in self.kind['params']: widget.addItem(x[0], x[1]) elif isinstance(widget, TextBox): pass elif isinstance(widget, CheckBox): if self.kind['params'][0]: widget.setChecked(True) elif isinstance(widget, DateField): pass return widget def delSelf(self, sender): self.group.delParam(self) def invertSelf(self, sender): if self.isInverted: self.isInverted = False self.panel.removeStyleName('aur-search-advanced-param-inverted') self.op.setText(self.group.operator) else: self.isInverted = True self.panel.addStyleName('aur-search-advanced-param-inverted') self.op.setText(self.group.operator + ' not')
def provider(content, cache=None): cont = SimplePanel(StyleName="aur-content-boundary") home = VerticalPanel.VerticalPanel( Width="100%", Height="100%", HorizontalAlignment="center", VerticalAlignment="middle" ) content.setWidget(cont) cont.setWidget(home) doBuildContent(home) return cont
def provider(content, cache=None): if cache is not None: content.setWidget(cache) return cache cont = SimplePanel(StyleName='aur-content-boundary') home = VerticalPanel.VerticalPanel(Width='100%', Height='100%', HorizontalAlignment='center', VerticalAlignment='middle') content.setWidget(cont) cont.setWidget(home) doBuildContent(home) return cont
def makePositioner(self, reference): outer = SimplePanel() # Use two widgets so that setPixelSize() consistently affects dimensions outer.addStyleName(CSS_DRAGDROP_POSITIONER) outer.getElement().getStyle().setProperty("margin", "0px") RootPanel.get().add(outer, -500, -500) # place off screen for border calculation outer.setWidget(DUMMY_LABEL_IE_QUIRKS_MODE_OFFSET_HEIGHT) # Ensure IE quirks mode returns valid outer.offsetHeight, and thus valid inner = SimplePanel() inner.getElement().getStyle().setProperty("margin", "0px") inner.getElement().getStyle().setProperty("border", "none") offsetWidth = reference.getOffsetWidth() - DOMUtil.getHorizontalBorders(outer) offsetHeight = reference.getOffsetHeight() - DOMUtil.getVerticalBorders(outer) inner.setPixelSize(offsetWidth, offsetHeight) outer.setWidget(inner) return outer
def __init__(self, sink): SimplePanel.__init__(self) self.sink = sink self.caption = HTML() self.child = None self.showing = False self.dragging = False self.dragStartX = 0 self.dragStartY = 0 self.panel = FlexTable() self.collapse = Image("./images/cancel.png") self.collapse.addClickListener(self) dock = DockPanel() dock.setSpacing(0) dock.add(self.collapse, DockPanel.EAST) dock.add(self.caption, DockPanel.WEST) dock.setCellHorizontalAlignment(self.collapse, HasAlignment.ALIGN_RIGHT) dock.setCellVerticalAlignment(self.collapse, HasAlignment.ALIGN_TOP) dock.setCellHorizontalAlignment(self.caption, HasAlignment.ALIGN_LEFT) dock.setCellWidth(self.caption, "100%") dock.setWidth("100%") dock.setHeight("100%") self.panel.setWidget(0, 0, dock) self.panel.setHeight("100%") self.panel.setWidth("100%") self.panel.setBorderWidth(0) self.panel.setCellPadding(0) self.panel.setCellSpacing(0) self.panel.getCellFormatter().setHeight(1, 0, "100%") self.panel.getCellFormatter().setWidth(1, 0, "100%") self.panel.getCellFormatter().setAlignment( 1, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_TOP) SimplePanel.setWidget(self, self.panel) self.setStyleName("gwt-DialogBox") self.caption.setStyleName("Caption") self.collapse.setStyleName("Close") dock.setStyleName("Header") #self.caption.addMouseListener(self) self.collapsed = False self.collapsed_width = "15px" self.uncollapsed_width = "100%"
def __init__(self, sink): SimplePanel.__init__(self) self.sink = sink self.caption = HTML() self.child = None self.showing = False self.dragging = False self.dragStartX = 0 self.dragStartY = 0 self.panel = FlexTable() self.collapse = Image("./images/cancel.png") self.collapse.addClickListener(self) dock = DockPanel() dock.setSpacing(0) dock.add(self.collapse, DockPanel.EAST) dock.add(self.caption, DockPanel.WEST) dock.setCellHorizontalAlignment(self.collapse, HasAlignment.ALIGN_RIGHT) dock.setCellVerticalAlignment(self.collapse, HasAlignment.ALIGN_TOP) dock.setCellHorizontalAlignment(self.caption, HasAlignment.ALIGN_LEFT) dock.setCellWidth(self.caption, "100%") dock.setWidth("100%") dock.setHeight("100%") self.panel.setWidget(0, 0, dock) self.panel.setHeight("100%") self.panel.setWidth("100%") self.panel.setBorderWidth(0) self.panel.setCellPadding(0) self.panel.setCellSpacing(0) self.panel.getCellFormatter().setHeight(1, 0, "100%") self.panel.getCellFormatter().setWidth(1, 0, "100%") self.panel.getCellFormatter().setAlignment(1, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_TOP) SimplePanel.setWidget(self, self.panel) self.setStyleName("gwt-DialogBox") self.caption.setStyleName("Caption") self.collapse.setStyleName("Close") dock.setStyleName("Header") #self.caption.addMouseListener(self) self.collapsed = False self.collapsed_width = "15px" self.uncollapsed_width = "100%"
def newPositioner(self, context): # Use two widgets so that setPixelSize() consistently affects dimensions # excluding positioner border in quirks and strict modes SimplePanel outer = SimplePanel() outer.addStyleName(CSS_DRAGDROP_POSITIONER) # place off screen for border calculation RootPanel.get().add(outer, -500, -500) # Ensure IE quirks mode returns valid outer.offsetHeight, and thus valid # DOMUtil.getVerticalBorders(outer) outer.setWidget(DUMMY_LABEL_IE_QUIRKS_MODE_OFFSET_HEIGHT) int width = 0 int height = 0 if dropTarget instanceof HorizontalPanel: for Iterator iterator = context.selectedWidgets.iterator(); iterator.hasNext();:
class ClickDelegatePanel(Composite): def __init__(self, p, child, cDelegate, kDelegate) : Composite.__init__(self) self.clickDelegate = cDelegate self.keyDelegate = kDelegate self.focusablePanel = SimplePanel(Focus.createFocusable()) self.focusablePanel.setWidget(child) wrapperWidget = p.createTabTextWrapper() if wrapperWidget is None: self.initWidget(self.focusablePanel) else : wrapperWidget.setWidget(self.focusablePanel) self.initWidget(wrapperWidget) if hasattr(child, "addKeyboardListener"): child.addKeyboardListener(kDelegate) self.sinkEvents(Event.ONCLICK | Event.ONKEYDOWN) # receive Label's onClick and pass it through, pretending it came from us def onClick(self, sender=None): self.clickDelegate.onClick(sender) def getFocusablePanel(self): return self.focusablePanel def onBrowserEvent(self, event) : type = DOM.eventGetType(event) if type == "click": self.onClick(self) elif type == "keydown": modifiers = KeyboardListener.getKeyboardModifiers(event) if hasattr(self.keyDelegate, "onKeyDown"): self.keyDelegate.onKeyDown(self, DOM.eventGetKeyCode(event), modifiers)
class ClickDelegatePanel(Composite): def __init__(self, p, child, cDelegate, kDelegate): Composite.__init__(self) self.clickDelegate = cDelegate self.keyDelegate = kDelegate self.focusablePanel = SimplePanel(Focus.createFocusable()) self.focusablePanel.setWidget(child) wrapperWidget = p.createTabTextWrapper() if wrapperWidget is None: self.initWidget(self.focusablePanel) else: wrapperWidget.setWidget(self.focusablePanel) self.initWidget(wrapperWidget) if hasattr(child, "addKeyboardListener"): child.addKeyboardListener(kDelegate) self.sinkEvents(Event.ONCLICK | Event.ONKEYDOWN) # receive Label's onClick and pass it through, pretending it came from us def onClick(self, sender=None): self.clickDelegate.onClick(sender) def getFocusablePanel(self): return self.focusablePanel def onBrowserEvent(self, event): type = DOM.eventGetType(event) if type == "click": self.onClick(self) elif type == "keydown": modifiers = KeyboardListener.getKeyboardModifiers(event) if hasattr(self.keyDelegate, "onKeyDown"): self.keyDelegate.onKeyDown(self, DOM.eventGetKeyCode(event), modifiers)
class Calendar(FocusPanel): monthsOfYear = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] daysOfWeek = ['S', 'M', 'T', 'W', 'T', 'F', 'S'] today = 'Today' tomorrow = 'Tomorrow' yesterday = 'Yesterday' cancel = 'Cancel' def __init__(self, **kwargs): FocusPanel.__init__(self, **kwargs) yr, mth, day = time.strftime("%Y-%m-%d").split("-") self.todayYear = int(yr) self.todayMonth = int(mth) # change to offset 0 as per javascript self.todayDay = int(day) self.currentMonth = self.todayMonth self.currentYear = self.todayYear self.currentDay = self.todayDay self.selectedDateListeners = [] self.defaultGrid = None # used later return def setDate(self,_date): """ _date - object of datetime.date class """ self.currentMonth = _date.month self.currentYear = _date.year self.currentDay = _date.day def getMonthsOfYear(self): return self.monthsOfYear def getDaysOfWeek(self): return self.daysOfWeek def addSelectedDateListener(self, listener): self.selectedDateListeners.append(listener) def removeSelectedDateListener(self, listener): self.selectedDateListeners.remove(listener) def isLeapYear(self, year): if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): return True else: return False def getDaysInMonth(self, mth, year): days = 0 if mth in [1, 3, 5, 7, 8, 10, 12]: days=31 elif mth in [4, 6, 9, 11]: days = 30 elif (mth==2 and self.isLeapYear(year)): days = 29 else: days = 28 return days def setPosition(self, left, top): element = self.getElement() DOM.setStyleAttribute(element, "left", "%dpx" % left) DOM.setStyleAttribute(element, "top", "%dpx" % top) def show(self, left, top): if left < 0: left = 0 if top < 0: top = 0 self.setPosition(left, top) self.drawCurrent() self.setVisible(True) def drawCurrent(self): yr, mth, day = self.currentYear, self.currentMonth, self.currentDay self.draw(int(mth), int(yr)) def draw(self, month , year): tod = time.localtime() mm = tod.tm_mon yy = tod.tm_year # has today changed and thus changed month? cater to rare case # where widget in created on last day of month and # page left till next day hasChangeMonth = False if yy <> self.todayYear or mm <> self.todayMonth: hasChangeMonth = True self.todayYear = yy self.todayMonth = mm # check to see if we have drawn the full widget before if self.defaultGrid is None: self.drawFull(month, year) else: # ok means we are re-drawing, but first check if it is the same # as the defaultGrid, if yes, just use it if not hasChangeMonth and month == self.todayMonth and \ year == self.todayYear: self.middlePanel.setWidget(self.defaultGrid) self.currentMonth = self.todayMonth self.currentYear = self.todayYear else: # we have to redraw the grid -- bah g = self.drawGrid(month, year) if hasChangeMonth: # reset the default grid as we have changed months self.defaultGrid = grid # # what about the title panel? # txt = "<b>" txt += self.getMonthsOfYear()[month-1] + " " + str(year) txt += "</b>" self.titlePanel.setWidget(HTML(txt)) self.setVisible(True) return def drawFull(self, month, year): # should be called only once when we draw the calendar for # the first time self.vp = VerticalPanel() self.vp.setSpacing(2) self.vp.addStyleName("calendarbox calendar-module calendar") self.setWidget(self.vp) self.setVisible(False) # mth = int(month) yr = int(year) tp = HorizontalPanel() tp.addStyleName("calendar-top-panel") tp.setSpacing(5) h1 = Hyperlink('<<') h1.addClickListener(getattr(self, 'onPreviousYear')) h2 = Hyperlink('<') h2.addClickListener(getattr(self, 'onPreviousMonth')) h4 = Hyperlink('>') h4.addClickListener(getattr(self, 'onNextMonth')) h5 = Hyperlink('>>') h5.addClickListener(getattr(self, 'onNextYear')) tp.add(h1) tp.add(h2) # titlePanel can be changed, whenever we draw, so keep the reference txt = "<b>" txt += self.getMonthsOfYear()[mth-1] + " " + str(yr) txt += "</b>" self.titlePanel = SimplePanel() self.titlePanel.setWidget(HTML(txt)) self.titlePanel.setStyleName("calendar-center") tp.add(self.titlePanel) tp.add(h4) tp.add(h5) tvp = VerticalPanel() tvp.setSpacing(10) tvp.add(tp) self.vp.add(tvp) # done with top panel self.middlePanel = SimplePanel() grid = self.drawGrid(mth, yr) self.middlePanel.setWidget(grid) self.vp.add(self.middlePanel) self.defaultGrid = grid self._gridShortcutsLinks() self._gridCancelLink() # # add code to test another way of doing the layout # self.setVisible(True) return def _gridShortcutsLinks(self): # # some links & handlers # bh1 = Hyperlink(self.yesterday) bh1.addClickListener(getattr(self, 'onYesterday')) bh2 = Hyperlink(self.today) bh2.addClickListener(getattr(self, 'onToday')) bh3 = Hyperlink(self.tomorrow) bh3.addClickListener(getattr(self, 'onTomorrow')) b = HorizontalPanel() b.add(bh1) b.add(bh2) b.add(bh3) b.addStyleName("calendar-shortcuts") self.vp.add(b) def _gridCancelLink(self): bh4 = Hyperlink(self.cancel) bh4.addClickListener(getattr(self, 'onCancel')) b2 = SimplePanel() b2.add(bh4) b2.addStyleName("calendar-cancel") self.vp.add(b2) def drawGrid(self, month, year): # draw the grid in the middle of the calendar daysInMonth = self.getDaysInMonth(month, year) # first day of the month & year secs = time.mktime((year, month, 1, 0, 0, 0, 0, 0, -1)) struct = time.localtime(secs) # 0 - sunday for our needs instead 0 = monday in tm_wday startPos = (struct.tm_wday + 1) % 7 slots = startPos + daysInMonth - 1 rows = int(slots/7) + 1 grid = Grid(rows+1, 7) # extra row for the days in the week grid.setWidth("100%") grid.addTableListener(self) self.middlePanel.setWidget(grid) # # put some content into the grid cells # for i in range(7): grid.setText(0, i, self.getDaysOfWeek()[i]) grid.cellFormatter.addStyleName(0, i, "calendar-header") # # draw cells which are empty first # day =0 pos = 0 while pos < startPos: grid.setText(1, pos , " ") grid.cellFormatter.setStyleAttr(1, pos, "background", "#f3f3f3") grid.cellFormatter.addStyleName(1, pos, "calendar-blank-cell") pos += 1 # now for days of the month row = 1 day = 1 col = startPos while day <= daysInMonth: if pos % 7 == 0 and day <> 1: row += 1 col = pos % 7 grid.setText(row, col, str(day)) if self.currentYear == self.todayYear and \ self.currentMonth == self.todayMonth and day == self.todayDay: grid.cellFormatter.addStyleName(row, col, "calendar-cell-today") else: grid.cellFormatter.addStyleName(row, col, "calendar-day-cell") day += 1 pos += 1 # # now blank lines on the last row # col += 1 while col < 7: grid.setText(row, col, " ") grid.cellFormatter.setStyleAttr(row, col, "background", "#f3f3f3") grid.cellFormatter.addStyleName(row, col, "calendar-blank-cell") col += 1 return grid def onCellClicked(self, grid, row, col): if row == 0: return text = grid.getText(row, col).strip() if text == "": return try: selectedDay = int(text) except ValueError, e: return # well if anyone is listening to the listener, fire that event for listener in self.selectedDateListeners: if hasattr(listener, "onDateSelected"): listener.onDateSelected(self.currentYear, self.currentMonth, selectedDay) else: listener(self.currentYear, self.currentMonth, selectedDay) self.setVisible(False)
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, basestring): 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") kwargs['StyleName'] = kwargs.get('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)
class Calendar(FocusPanel, DateSelectedHandler): monthsOfYear = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] daysOfWeek = ['S', 'M', 'T', 'W', 'T', 'F', 'S'] today = 'Today' tomorrow = 'Tomorrow' yesterday = 'Yesterday' cancel = 'Cancel' def __init__(self, **kwargs): FocusPanel.__init__(self, **kwargs) DateSelectedHandler.__init__(self) yr, mth, day = time.strftime("%Y-%m-%d").split("-") self.todayYear = int(yr) self.todayMonth = int(mth) # change to offset 0 as per javascript self.todayDay = int(day) self.currentMonth = self.todayMonth self.currentYear = self.todayYear self.currentDay = self.todayDay self.defaultGrid = None # used later return def setDate(self, _date): """ _date - object of datetime.date class """ self.currentMonth = _date.month self.currentYear = _date.year self.currentDay = _date.day def getMonthsOfYear(self): return self.monthsOfYear def getDaysOfWeek(self): return self.daysOfWeek def isLeapYear(self, year): if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): return True else: return False def getDaysInMonth(self, mth, year): days = 0 if mth in [1, 3, 5, 7, 8, 10, 12]: days = 31 elif mth in [4, 6, 9, 11]: days = 30 elif (mth == 2 and self.isLeapYear(year)): days = 29 else: days = 28 return days def setPosition(self, left, top): element = self.getElement() DOM.setStyleAttribute(element, "left", "%dpx" % left) DOM.setStyleAttribute(element, "top", "%dpx" % top) def show(self, left, top): if left < 0: left = 0 if top < 0: top = 0 self.setPosition(left, top) self.drawCurrent() self.setVisible(True) def drawCurrent(self): yr, mth, day = self.currentYear, self.currentMonth, self.currentDay self.draw(int(mth), int(yr)) def draw(self, month , year): tod = time.localtime() mm = tod.tm_mon yy = tod.tm_year # has today changed and thus changed month? cater to rare case # where widget in created on last day of month and # page left till next day hasChangeMonth = False if yy <> self.todayYear or mm <> self.todayMonth: hasChangeMonth = True self.todayYear = yy self.todayMonth = mm # check to see if we have drawn the full widget before if self.defaultGrid is None: self.drawFull(month, year) else: # ok means we are re-drawing, but first check if it is the same # as the defaultGrid, if yes, just use it if not hasChangeMonth and month == self.todayMonth and \ year == self.todayYear: self.middlePanel.setWidget(self.defaultGrid) self.currentMonth = self.todayMonth self.currentYear = self.todayYear else: # we have to redraw the grid -- bah g = self.drawGrid(month, year) if hasChangeMonth: # reset the default grid as we have changed months self.defaultGrid = grid # # what about the title panel? # txt = "<b>" txt += self.getMonthsOfYear()[month - 1] + " " + str(year) txt += "</b>" self.titlePanel.setWidget(HTML(txt)) self.setVisible(True) return def drawFull(self, month, year): # should be called only once when we draw the calendar for # the first time self.vp = VerticalPanel() self.vp.setSpacing(2) self.vp.addStyleName("calendarbox calendar-module calendar") self.setWidget(self.vp) self.setVisible(False) # mth = int(month) yr = int(year) tp = HorizontalPanel() tp.addStyleName("calendar-top-panel") tp.setSpacing(5) h1 = Hyperlink('<<') h1.addClickListener(getattr(self, 'onPreviousYear')) h2 = Hyperlink('<') h2.addClickListener(getattr(self, 'onPreviousMonth')) h4 = Hyperlink('>') h4.addClickListener(getattr(self, 'onNextMonth')) h5 = Hyperlink('>>') h5.addClickListener(getattr(self, 'onNextYear')) tp.add(h1) tp.add(h2) # titlePanel can be changed, whenever we draw, so keep the reference txt = "<b>" txt += self.getMonthsOfYear()[mth - 1] + " " + str(yr) txt += "</b>" self.titlePanel = SimplePanel() self.titlePanel.setWidget(HTML(txt)) self.titlePanel.setStyleName("calendar-center") tp.add(self.titlePanel) tp.add(h4) tp.add(h5) tvp = VerticalPanel() tvp.setSpacing(10) tvp.add(tp) self.vp.add(tvp) # done with top panel self.middlePanel = SimplePanel() grid = self.drawGrid(mth, yr) self.middlePanel.setWidget(grid) self.vp.add(self.middlePanel) self.defaultGrid = grid self._gridShortcutsLinks() self._gridCancelLink() # # add code to test another way of doing the layout # self.setVisible(True) return def _gridShortcutsLinks(self): # # some links & handlers # bh1 = Hyperlink(self.yesterday) bh1.addClickListener(getattr(self, 'onYesterday')) bh2 = Hyperlink(self.today) bh2.addClickListener(getattr(self, 'onToday')) bh3 = Hyperlink(self.tomorrow) bh3.addClickListener(getattr(self, 'onTomorrow')) b = HorizontalPanel() b.add(bh1) b.add(bh2) b.add(bh3) b.addStyleName("calendar-shortcuts") self.vp.add(b) def _gridCancelLink(self): bh4 = Hyperlink(self.cancel) bh4.addClickListener(getattr(self, 'onCancel')) b2 = SimplePanel() b2.add(bh4) b2.addStyleName("calendar-cancel") self.vp.add(b2) def drawGrid(self, month, year): # draw the grid in the middle of the calendar daysInMonth = self.getDaysInMonth(month, year) # first day of the month & year secs = time.mktime((year, month, 1, 0, 0, 0, 0, 0, -1)) struct = time.localtime(secs) # 0 - sunday for our needs instead 0 = monday in tm_wday startPos = (struct.tm_wday + 1) % 7 slots = startPos + daysInMonth - 1 rows = int(slots / 7) + 1 grid = Grid(rows + 1, 7) # extra row for the days in the week grid.setWidth("100%") grid.addTableListener(self) self.middlePanel.setWidget(grid) # # put some content into the grid cells # for i in range(7): grid.setText(0, i, self.getDaysOfWeek()[i]) grid.cellFormatter.addStyleName(0, i, "calendar-header") # # draw cells which are empty first # day = 0 pos = 0 while pos < startPos: grid.setText(1, pos , " ") grid.cellFormatter.setStyleAttr(1, pos, "background", "#f3f3f3") grid.cellFormatter.addStyleName(1, pos, "calendar-blank-cell") pos += 1 # now for days of the month row = 1 day = 1 col = startPos while day <= daysInMonth: if pos % 7 == 0 and day <> 1: row += 1 col = pos % 7 grid.setText(row, col, str(day)) if self.currentYear == self.todayYear and \ self.currentMonth == self.todayMonth and day == self.todayDay: grid.cellFormatter.addStyleName(row, col, "calendar-cell-today") else: grid.cellFormatter.addStyleName(row, col, "calendar-day-cell") day += 1 pos += 1 # # now blank lines on the last row # col += 1 while col < 7: grid.setText(row, col, " ") grid.cellFormatter.setStyleAttr(row, col, "background", "#f3f3f3") grid.cellFormatter.addStyleName(row, col, "calendar-blank-cell") col += 1 return grid def onCellClicked(self, grid, row, col): if row == 0: return text = grid.getText(row, col).strip() if text == "": return try: selectedDay = int(text) except ValueError, e: return self.fireDateSelectedEvent(date( self.currentYear, self.currentMonth, selectedDay, )) self.setVisible(False)
class Calendar(FocusPanel): monthsOfYear = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] daysOfWeek = ['M', 'T', 'W', 'T', 'F', 'S', 'S'] daysOfWeek3 = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] today = 'Today' tomorrow = 'Tomorrow' yesterday = 'Yesterday' cancel = 'Cancel' def __init__(self, **kwargs): self.backyear = kwargs.pop('BackyearSymbol', '<<') self.backmonth = kwargs.pop('BackmonthSymbol', '<') self.fwdyear = kwargs.pop('FwdyearSymbol', '>>') self.fwdmonth = kwargs.pop('FwdmonthSymbol', '>') self.addbuttons = kwargs.pop('AddButtons', True) self.mindate = kwargs.pop('MinDate', None) # (yr, mnth, day) self.maxdate = kwargs.pop('MaxDate', None) # (yr, mnth, day) self.weekdaylength = kwargs.pop('WeekdayLength', 1) self.dayoffset = kwargs.pop('DayOffset', 1) # 1 returns Mon, 0 for Sun self.daybuttons = kwargs.pop('DayButtons', False) if kwargs.pop('ArrowButtons', False): self.bkls = Button else: self.bkls = Hyperlink FocusPanel.__init__(self, **kwargs) self.setDate() self.todayYear = self.currentYear self.todayMonth = self.currentMonth self.todayDay = self.currentDay self.selectedDateListeners = [] self.defaultGrid = None # used later def setDate(self, _date=None, m=None, d=None): """ _date - object of datetime.date class """ if m is None and d is None: if _date is None: y, m, d = time.strftime("%Y-%m-%d").split("-") else: m = _date.month y = _date.year d = _date.day else: y = _date self.currentYear = int(y) self.currentMonth = int(m) self.currentDay = int(d) def getMonthsOfYear(self): return self.monthsOfYear def getDaysOfWeek(self): if self.weekdaylength == 1: dow = self.daysOfWeek else: dow = self.daysOfWeek3 return dow[-self.dayoffset:] + \ dow[:-self.dayoffset] def addSelectedDateListener(self, listener): self.selectedDateListeners.append(listener) def removeSelectedDateListener(self, listener): self.selectedDateListeners.remove(listener) def isLeapYear(self, year): if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): return True else: return False def _indaterange(self, year, mnth, day=None): if self.mindate is not None: if year < self.mindate[0]: return False if year == self.mindate[0]: if mnth < self.mindate[1]: return False if day is not None: if mnth == self.mindate[1] and day < self.mindate[2]: return False if self.maxdate is not None: if year > self.maxdate[0]: return False if year == self.maxdate[0]: if mnth > self.maxdate[1]: return False if day is not None: if mnth == self.maxdate[1] and day > self.maxdate[2]: return False return True def getDaysInMonth(self, mth, year): days = 0 if mth in [1, 3, 5, 7, 8, 10, 12]: days=31 elif mth in [4, 6, 9, 11]: days = 30 elif (mth==2 and self.isLeapYear(year)): days = 29 else: days = 28 return days def setPosition(self, left, top): element = self.getElement() DOM.setStyleAttribute(element, "left", "%dpx" % left) DOM.setStyleAttribute(element, "top", "%dpx" % top) def show(self, left, top): if left < 0: left = 0 if top < 0: top = 0 self.setPosition(left, top) self.drawCurrent() self.setVisible(True) def drawCurrent(self): self.drawDate() def draw(self, month , year): tod = time.localtime() mm = tod.tm_mon yy = tod.tm_year # has today changed and thus changed month? cater to rare case # where widget in created on last day of month and # page left till next day hasChangeMonth = False if yy != self.todayYear or mm != self.todayMonth: hasChangeMonth = True self.todayYear = yy self.todayMonth = mm # check to see if we have drawn the full widget before if self.defaultGrid is None: self.drawFull(month, year) else: # ok means we are re-drawing, but first check if it is the same # as the defaultGrid, if yes, just use it if not hasChangeMonth and month == self.todayMonth and \ year == self.todayYear: self.middlePanel.setWidget(self.defaultGrid) self.currentMonth = self.todayMonth self.currentYear = self.todayYear else: # we have to redraw the grid -- bah g = self.drawGrid(month, year) if hasChangeMonth: # reset the default grid as we have changed months self.defaultGrid = grid # # what about the title panel? # txt = "<b>" txt += self.getMonthsOfYear()[month-1] + " " + str(year) txt += "</b>" self.titlePanel.setWidget(HTML(txt)) self.setVisible(True) def drawFull(self, month, year): # should be called only once when we draw the calendar for # the first time self.vp = VerticalPanel() self.vp.setSpacing(0) self.vp.setPadding(0) self.vp.addStyleName("calendarbox calendar-module calendar") self.setWidget(self.vp) self.setVisible(False) # mth = int(month) yr = int(year) tp = HorizontalPanel(Width="100%") tp.addStyleName("calendar-top-panel") tp.setSpacing(0) tp.setPadding(0) self.h1 = None self.h2 = None self.h4 = None self.h5 = None if self.backyear: self.h1 = self.bkls(self.backyear, StyleName="calendar-arrows") self.h1.addClickListener(getattr(self, 'onPreviousYear')) tp.add(self.h1) tp.setCellHorizontalAlignment(self.h1, "left") if self.backmonth: self.h2 = self.bkls(self.backmonth, StyleName="calendar-arrows") self.h2.addClickListener(getattr(self, 'onPreviousMonth')) tp.add(self.h2) tp.setCellHorizontalAlignment(self.h2, "left") # titlePanel can be changed, whenever we draw, so keep the reference txt = "<b>" txt += self.getMonthsOfYear()[mth-1] + " " + str(yr) txt += "</b>" self.titlePanel = SimplePanel() self.titlePanel.setWidget(HTML(txt)) self.titlePanel.setStyleName("calendar-center") tp.add(self.titlePanel) tp.setCellHorizontalAlignment(self.titlePanel, "center") tp.setCellWidth(self.titlePanel, "100%") if self.fwdmonth: self.h4 = self.bkls(self.fwdmonth, StyleName="calendar-arrows") self.h4.addClickListener(getattr(self, 'onNextMonth')) tp.add(self.h4) tp.setCellHorizontalAlignment(self.h4, "right") tp.setCellWidth(self.h4, "100%") self.h4.setWidth("100%") if self.fwdyear: self.h5 = self.bkls(self.fwdyear, StyleName="calendar-arrows") self.h5.addClickListener(getattr(self, 'onNextYear')) tp.add(self.h5) tp.setCellHorizontalAlignment(self.h5, "right") tvp = VerticalPanel(Width="100%") tvp.setSpacing(2) tvp.add(tp) self.vp.add(tvp) # done with top panel self.middlePanel = SimplePanel() grid = self.drawGrid(mth, yr) self.middlePanel.setWidget(grid) self.vp.add(self.middlePanel) self.defaultGrid = grid if self.addbuttons: # # some links & handlers # bh1 = Hyperlink(self.yesterday) bh1.addClickListener(getattr(self, 'onYesterday')) bh2 = Hyperlink(self.today) bh2.addClickListener(getattr(self, 'onToday')) bh3 = Hyperlink(self.tomorrow) bh3.addClickListener(getattr(self, 'onTomorrow')) bh4 = Hyperlink(self.cancel) bh4.addClickListener(getattr(self, 'onCancel')) # # add code to test another way of doing the layout # b = HorizontalPanel() b.add(bh1) b.add(bh2) b.add(bh3) b.addStyleName("calendar-shortcuts") self.vp.add(b) b2 = SimplePanel() b2.add(bh4) b2.addStyleName("calendar-cancel") self.vp.add(b2) self.checkLinks(mth, yr) self.setVisible(True) def checkLinks(self, month=None, year=None): if month is None: month = self.currentMonth if year is None: year = self.currentYear if self.backyear: ok = self._indaterange(year-1, month) self.h1.setEnabled(ok) if self.backmonth: py, pm = self._previousMonth(year, month) ok = self._indaterange(py, pm) print "prevmonth", month, year, py, pm, ok self.h2.setEnabled(ok) if self.fwdmonth: ny, nm = self._nextMonth(year, month) ok = self._indaterange(ny, nm) print "nextmonth", month, year, ny, nm, ok self.h4.setEnabled(ok) if self.fwdyear: ok = self._indaterange(year+1, month) self.h5.setEnabled(ok) def drawGrid(self, month, year): # draw the grid in the middle of the calendar self.checkLinks(month, year) daysInMonth = self.getDaysInMonth(month, year) # first day of the month & year secs = time.mktime((year, month, 1, 0, 0, 0, 0, 0, -1)) struct = time.localtime(secs) startPos = (struct.tm_wday + self.dayoffset) % 7 slots = startPos + daysInMonth - 1 rows = int(slots/7) + 1 grid = Grid(rows+1, 7, # extra row for the days in the week StyleName="calendar-grid") grid.setWidth("100%") grid.addTableListener(self) self.middlePanel.setWidget(grid) cf = grid.getCellFormatter() # # put some content into the grid cells # for i in range(7): grid.setText(0, i, self.getDaysOfWeek()[i]) cf.addStyleName(0, i, "calendar-header") # # draw cells which are empty first # day = 0 pos = 0 while pos < startPos: self._setCell(grid, 1, pos, BLANKCELL, "calendar-blank-cell") pos += 1 # now for days of the month row = 1 day = 1 col = startPos while day <= daysInMonth: if pos % 7 == 0 and day != 1: row += 1 col = pos % 7 if not self._indaterange(self.currentYear, self.currentMonth, day): self._setCell(grid, row, col, BLANKCELL, "calendar-blank-cell") day += 1 pos += 1 continue if self.currentYear == self.todayYear and \ self.currentMonth == self.todayMonth and day == self.todayDay: style = "calendar-cell-today" else: style = "calendar-day-cell" self._setCell(grid, row, col, str(day), style) day += 1 pos += 1 # # now blank lines on the last row # col += 1 while col < 7: self._setCell(grid, row, col, BLANKCELL, "calendar-blank-cell") col += 1 return grid def _setCell(self, grid, row, col, txt, style): cf = grid.getCellFormatter() if self.daybuttons: if txt != BLANKCELL: listener = lambda x, col=col, row=row, grid=grid\ : self.onCellClicked(grid, row, col) else: listener = None b = Button(txt, listener=listener, StyleName="%s-button" % style) grid.setWidget(row, col, b) cf.setWidth(row, col, "100%") else: grid.setHTML(row, col, txt) cf.setStyleName(row, col, style) def onCellClicked(self, grid, row, col): if row == 0: return text = grid.getText(row, col).strip() if text == BLANKCELL: return try: selectedDay = int(text) except ValueError, e: return # fire event to all listeners for listener in self.selectedDateListeners: if hasattr(listener, "onDateSelected"): listener = listener.onDateSelected listener(self.currentYear, self.currentMonth, selectedDay) self.setVisible(False)
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, basestring): 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"); kwargs['StyleName'] = kwargs.get('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)
class ParamGroup(object): def __init__(self, container, kind, parent=None, level=0, draw=True, title=None): self.container = container self.kind = kind self.parent = parent self.level = level self.title = title self.panel = SimplePanel(StyleName='aur-search-advanced-group') if level % 2 == 0: self.panel.addStyleName('aur-search-advanced-group-nested') self.childPanel = VerticalPanel(StyleName='aur-search-advanced-group-list', Width='100%') self.paramPanel = VerticalPanel(StyleName='aur-search-advanced-param-list', Width='100%') self.listPanel = VerticalPanel(StyleName='aur-search-advanced-list-boundary', Width='100%', Visible=False) self.paramChooser = ListBox() self.children = [] self.parameters = [] self.isInverted = False self.operator = 'and' # assigned by parent, visual use only self.op = None if parent else Label('and') if draw: self.draw() def draw(self): cont = VerticalPanel(Width='100%') header = HorizontalPanel(Width='100%', VerticalAlignment='middle', StyleName='aur-search-advanced-group-header') params = self.paramChooser addParam = Image(url='/ico/tick.png', Title='Add parameter to this group') addGroup = Image(url='/ico/table_add.png', Title='Nest group within this group') addGroupFull = Image(url='/ico/table_lightning.png', Title='Nest group within this group; all parameters') invertSelf = Image(url='/ico/exclamation.png', Title='Invert this parameter group') self.container.add(self.panel) self.panel.setWidget(cont) cont.add(header) if self.parent: d = Image(url='/ico/cross.png', Title='Delete this parameter group') d.addStyleName('aur-search-advanced-delete') header.add(d) header.setCellWidth(d, '1px') d.addClickListener(getattr(self, 'delSelf')) if self.title: t = Label(self.title, StyleName='aur-search-advanced-group-header-title') header.add(t) header.setCellWidth(t, '1px') header.add(params) header.add(addParam) header.add(addGroup) header.add(addGroupFull) header.add(invertSelf) header.setCellWidth(params, '1px') header.setCellWidth(addGroup, '1px') header.setCellWidth(addGroupFull, '1px') header.setCellWidth(invertSelf, '1px') for x in self.kind: params.addItem(x['item'], x['index']) cont.add(self.listPanel) self.listPanel.add(self.paramPanel) self.listPanel.add(self.childPanel) addParam.addClickListener(getattr(self, 'addParam')) addGroup.addClickListener(getattr(self, 'addGroup')) addGroupFull.addClickListener(getattr(self, 'addGroupFull')) invertSelf.addClickListener(getattr(self, 'invertSelf')) def addGroup(self, sender): self.listPanel.setVisible(True) op = Label(self.operator, Title='Invert group operator', StyleName='aur-search-advanced-group-op', Visible=False) op.addClickListener(getattr(self, 'invertOperator')) if len(self.children) > 0 or len(self.parameters) > 0: op.setVisible(True) self.childPanel.add(op) self.childPanel.setCellHorizontalAlignment(op, 'right') g = ParamGroup(self.childPanel, self.kind, self, self.level+1) g.op = op self.children.append(g) def addGroupFull(self, sender): # this is a little hacky, but it's so fast you don't see it self.addGroup(None) group = self.children[len(self.children)-1] for x in range(group.paramChooser.getItemCount()): group.paramChooser.setSelectedIndex(x) group.addParam(None) group.paramChooser.setSelectedIndex(0) def addParam(self, sender): self.listPanel.setVisible(True) op = Label(self.operator, Title='Invert group operator', StyleName='aur-search-advanced-param-op', Visible=False) op.addClickListener(getattr(self, 'invertOperator')) if len(self.parameters) > 0: op.setVisible(True) self.paramPanel.add(op) self.paramPanel.setCellHorizontalAlignment(op, 'right') k = self.kind[self.paramChooser.getSelectedValues()[0]] p = Param(self.paramPanel, k, self) p.op = op self.parameters.append(p) if len(self.children) > 0: self.children[0].op.setVisible(True) def addParamFull(self, sender): # this is a little hacky, but it's so fast you don't see it old = self.paramChooser.getSelectedIndex() for x in range(self.paramChooser.getItemCount()): self.paramChooser.setSelectedIndex(x) self.addParam(None) self.paramChooser.setSelectedIndex(old) def delGroup(self, child): self.children.remove(child) self.childPanel.remove(child.op) self.childPanel.remove(child.panel) lp = len(self.parameters) lc = len(self.children) if lp == 0 and lc > 0: self.children[0].op.setVisible(False) if lp == 0 and lc == 0: self.listPanel.setVisible(False) def delParam(self, param): self.parameters.remove(param) self.paramPanel.remove(param.op) self.paramPanel.remove(param.panel) lp = len(self.parameters) lc = len(self.children) if lp > 0: self.parameters[0].op.setVisible(False) if lp == 0 and lc > 0: self.children[0].op.setVisible(False) if lp == 0 and lc == 0: self.listPanel.setVisible(False) def delSelf(self, sender): self.parent.delGroup(self) def invertSelf(self, sender): if self.isInverted: self.isInverted = False self.panel.removeStyleName('aur-search-advanced-group-inverted') self.op.setText(self.operator) else: self.isInverted = True self.panel.addStyleName('aur-search-advanced-group-inverted') self.op.setText(self.operator + ' not') def invertOperator(self, sender): self.operator = 'or' if self.operator == 'and' else 'and' for x in self.parameters: suffix = ' not' if x.isInverted else '' x.op.setText(self.operator + suffix) for x in self.children: suffix = ' not' if x.isInverted else '' x.op.setText(self.operator + suffix)
class DialogBox(PopupPanel): _props = [ ("caption", "Caption", "HTML", None), ] def __init__(self, autoHide=None, modal=True, centered=False, **kwargs): # Init section self.dragging = False self.dragStartX = 0 self.dragStartY = 0 self.child = None self.panel = FlexTable( Height="100%", BorderWidth="0", CellPadding="0", CellSpacing="0", ) cf = self.panel.getCellFormatter() rf = self.panel.getRowFormatter() # Arguments section self.modal = modal self.caption = HTML() self.caption.setStyleName("Caption") self.caption.addMouseListener(self) # Make the DialogBox a 3x3 table, like GWT does, with # empty elements with specific style names. These can be # used with CSS to, for example, create border around the # dialog box. self.generate_gwt15 = kwargs.pop('gwt15', False) and True if not self.generate_gwt15: cf.setHeight(1, 0, "100%") cf.setWidth(1, 0, "100%") cf.setAlignment( 1, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE, ) self.panel.setWidget(0, 0, self.caption) else: row_labels = ['Top', 'Middle', 'Bottom'] col_labels = ['Left', 'Center', 'Right'] for r in range(3): rf.setStyleName(r, 'dialog%s' % row_labels[r]) for c in range(3): cf.setStyleName(r, c, 'dialog%s%s' % (row_labels[r], col_labels[c])) sp = SimplePanel() sp.setStyleName('dialog%s%sInner' % (row_labels[r], col_labels[c])) self.panel.setWidget(r, c, sp) cf.setAlignment( 1, 1, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE, ) self.dialog_content = SimplePanel() self.dialog_content.setStyleName('dialogContent') self.panel.getWidget(0, 1).add(self.caption) self.panel.getWidget(1, 1).add(self.dialog_content) # Finalize kwargs['StyleName'] = kwargs.get('StyleName', "gwt-DialogBox") PopupPanel.__init__(self, autoHide, modal, **kwargs) PopupPanel.setWidget(self, self.panel) self.centered = centered def onWindowResized(self, width, height): super(DialogBox, self).onWindowResized(width, height) if self.centered: self.centerBox() def show(self): super(DialogBox, self).show() if self.centered: self.centerBox() @classmethod def _getProps(self): return PopupPanel._getProps() + self._props def onEventPreview(self, event): # preventDefault on mousedown events, outside of the # dialog, to stop text-selection on dragging type = DOM.eventGetType(event) if type == 'mousedown': target = DOM.eventGetTarget(event) elem = self.caption.getElement() event_targets_popup = target and DOM.isOrHasChild(elem, target) if event_targets_popup: DOM.eventPreventDefault(event) return PopupPanel.onEventPreview(self, event) def getHTML(self): return self.caption.getHTML() def getText(self): return self.caption.getText() def setHTML(self, html): self.caption.setHTML(html) def setText(self, text): self.caption.setText(text) def onMouseDown(self, sender, x, y): self.dragging = True GlassWidget.show(self.caption) self.dragStartX = x self.dragStartY = y def onMouseEnter(self, sender): pass def onMouseLeave(self, sender): pass def onMouseMove(self, sender, x, y): if not self.dragging: return absX = x + self.getAbsoluteLeft() absY = y + self.getAbsoluteTop() self.setPopupPosition(absX - self.dragStartX, absY - self.dragStartY) def onMouseUp(self, sender, x, y): self.endDragging() def onMouseGlassEnter(self, sender): pass def onMouseGlassLeave(self, sender): self.endDragging() def endDragging(self): if not self.dragging: return self.dragging = False GlassWidget.hide() def remove(self, widget): if self.child != widget: return False self.panel.remove(widget) self.child = None return True def doAttachChildren(self): PopupPanel.doAttachChildren(self) self.caption.onAttach() def doDetachChildren(self): PopupPanel.doDetachChildren(self) self.caption.onDetach() def setWidget(self, widget): if self.child is not None: if not self.generate_gwt15: self.panel.remove(self.child) else: self.dialog_content.remove(self.child) if widget is not None: if not self.generate_gwt15: self.panel.setWidget(1, 0, widget) else: self.dialog_content.setWidget(widget) self.child = widget