def __init__(self): SimplePanel.__init__(self) panel = HorizontalPanel() panel.setBorderWidth(1) panel.setHorizontalAlignment(HasAlignment.ALIGN_CENTER) panel.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE) part1 = Label("Part 1") part2 = Label("Part 2") part3 = Label("Part 3") part4 = Label("Part 4") panel.add(part1) panel.add(part2) panel.add(part3) panel.add(part4) panel.setCellWidth(part1, "10%") panel.setCellWidth(part2, "70%") panel.setCellWidth(part3, "10%") panel.setCellWidth(part4, "10%") panel.setCellVerticalAlignment(part3, HasAlignment.ALIGN_BOTTOM) panel.setWidth("100%") panel.setHeight("200px") self.add(panel)
def setControls(self, minimize, maximize, close): if minimize is True: self.minimizeWidget = self.createDefaultControl('minimize') elif isinstance(minimize, basestring): self.minimizeWidget = Image(minimize) else: self.minimizeWidget = minimize if maximize is True: self.maximizeWidget = self.createDefaultControl('maximize') elif isinstance(maximize, basestring): self.maximizeWidget = Image(maximize) else: self.maximizeWidget = maximize if close is True: self.closeWidget = self.createDefaultControl('close') elif isinstance(close, basestring): self.closeWidget = Image(close) else: self.closeWidget = close if (isinstance(self.minimizeWidget, UIObject) or isinstance(self.maximizeWidget, UIObject) or isinstance(self.closeWidget, UIObject)): cf = self.panel.getCellFormatter() captionStyle = self.caption.getStyleName() captionPanel = FlexTable( Width="99%", BorderWidth="0", CellPadding="0", CellSpacing="0", ) controls = HorizontalPanel() controls.setStyleName("Controls") controls.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE) if isinstance(self.minimizeWidget, UIObject): self.minimizeWidget.setStyleName("Minimize") controls.add(self.minimizeWidget) self.minimizeWidget.addClickListener( getattr(self, "onMinimize"), ) if isinstance(self.maximizeWidget, UIObject): self.maximizeWidget.setStyleName("Maximize") controls.add(self.maximizeWidget) self.maximizeWidget.addClickListener( getattr(self, "onMaximize"), ) if isinstance(self.closeWidget, UIObject): self.closeWidget.setStyleName("Close") controls.add(self.closeWidget) self.closeWidget.addClickListener( getattr(self, "onClose"), ) self.closeable = True self.caption.removeStyleName(captionStyle) self.panel.setWidget(0, 0, captionPanel) captionPanel.setWidget(0, 0, self.caption) captionPanel.setWidget(0, 1, controls) captionPanel.setStyleName(captionStyle) cf = captionPanel.getCellFormatter() cf.setWidth(0, 1, '1%')
def make_footer(self): self.time = {} self.time['hour'] = ListBox() self.time['hour'].setVisibleItemCount(1) for hour in range(24): self.time['hour'].addItem('%02d' % hour) self.time['hour'].setSelectedIndex(12) self.time['minute'] = ListBox() self.time['minute'].setVisibleItemCount(1) for minute in range(0, 60, 5): self.time['minute'].addItem('%02d' % minute) self.time['minute'].setSelectedIndex(0) time_panel = HorizontalPanel() time_panel.setVerticalAlignment('center') time_panel.add(self.time['hour']) time_panel.add(Label(':')) time_panel.add(self.time['minute']) self.table.setWidget(1, 0, time_panel) weekdays_panel = HorizontalPanel() weekdays_panel.setSpacing(5) self.weekdays = {} for i in range(7): self.weekdays[i] = CheckBox(AlarmWidget.weekday_name[i]) self.weekdays[i].setChecked(i < 6) weekdays_panel.add(self.weekdays[i]) self.table.setWidget(1, 1, weekdays_panel) self.duration = ListBox() self.duration.setVisibleItemCount(1) choices = [ 1, 2, 3, 4, 5, 7, 10, 15, 20, 25, 30, 40, 50, 60 ] for seconds in choices: self.duration.addItem( '%ds' % seconds if seconds < 60 else '%dm' % (seconds / 60), seconds) self.duration.setSelectedIndex(2) self.table.setWidget(1, 2, self.duration) image = Image('icons/plus.png') image.setTitle('add'); image.addClickListener(self.plus_clicked) self.table.setWidget(1, 3, image) for col in range(4): self.table.getCellFormatter().setStyleName(1, col, 'tablecell noborder')
def onModuleLoad(self): p = HorizontalPanel() p.setSpacing(10) p.setVerticalAlignment(HasAlignment.ALIGN_BOTTOM) sc = SliderClass(False) p.add(sc) sc = SliderClass(True) p.add(sc) sc = SliderClass(True) p.add(sc) sc = HorizontalSliderClass(False) p.add(sc) sc = HorizontalSliderClass(True) p.add(sc) RootPanel().add(p)
def onModuleLoad(self): p = HorizontalPanel() p.setSpacing(10) p.setVerticalAlignment(HasAlignment.ALIGN_BOTTOM) sc = SliderClass(False) p.add(sc) sc = SliderClass(True) p.add(sc) sc = SliderClass(True) p.add(sc) sc = HorizontalSliderClass(False) p.add(sc) sc = HorizontalSliderClass(True) p.add(sc) RootPanel().add(p)
class Projects_Editor(SimplePanel): ''' Create and edit projects ''' def __init__(self): # We need to use old form of inheritance because of pyjamas SimplePanel.__init__(self) self.hpanel = HorizontalPanel(Width='475px') self.hpanel.setVerticalAlignment(HasAlignment.ALIGN_BOTTOM) self.name = TextBox() self.name.setStyleName('form-control') self.status = ListBox() self.status.addItem('Active') self.status.addItem('Inactive') self.status.setVisibleItemCount(0) self.status.setStyleName('form-control input-lg') self.status.setSize('100px', '34px') lbl = Label('', Width='10px') self.add_btn = Button('Add') self.add_btn.setStyleName('btn btn-primary') self.del_btn = Button('Delete') self.del_btn.setStyleName('btn btn-danger') self.hpanel.add(self.name) self.hpanel.add(lbl) self.hpanel.add(self.status) self.hpanel.add(self.add_btn) self.hpanel.add(self.del_btn) def get_name_txt(self): '''Return project name. ''' return self.name.getText() def get_status(self): '''Return project status. ''' return self.status.getItemText(self.status.getSelectedIndex())
def onModuleLoad(self): v = VerticalPanel(Spacing=10) p = HorizontalPanel(Spacing=10, VerticalAlignment=HasAlignment.ALIGN_BOTTOM) sc = SliderClass(False) p.add(CaptionPanel("clickable only", sc)) sc = SliderClass(True) p.add(CaptionPanel("draggable", sc)) sc = SliderClass(True) p.add(CaptionPanel("draggable", sc)) v.add(CaptionPanel("Vertical Sliders with inputboxes", p)) p = HorizontalPanel() p.setSpacing(10) p.setVerticalAlignment(HasAlignment.ALIGN_BOTTOM) sc = HSliderClass(False) p.add(CaptionPanel("clickable only", sc)) sc = HSliderClass(True) p.add(CaptionPanel("draggable", sc)) v.add(CaptionPanel("Horizontal Sliders with inputboxes", p)) p = HorizontalPanel() p.setSpacing(10) p.setVerticalAlignment(HasAlignment.ALIGN_BOTTOM) sc = ASliderClass(False) p.add(CaptionPanel("clickable only", sc)) sc = ASliderClass(True) p.add(CaptionPanel("draggable", sc)) v.add(CaptionPanel("2D Controls: Inputboxes are draggable as well", p)) RootPanel().add(v)
def onModuleLoad(self): v = VerticalPanel(Spacing=10) p = HorizontalPanel(Spacing=10, VerticalAlignment=HasAlignment.ALIGN_BOTTOM) sc = SliderClass(False) p.add(CaptionPanel("clickable only", sc)) sc = SliderClass(True) p.add(CaptionPanel("draggable", sc)) sc = SliderClass(True) p.add(CaptionPanel("draggable", sc)) v.add(CaptionPanel("Vertical Sliders with inputboxes", p)) p = HorizontalPanel() p.setSpacing(10) p.setVerticalAlignment(HasAlignment.ALIGN_BOTTOM) sc = HSliderClass(False) p.add(CaptionPanel("clickable only", sc)) sc = HSliderClass(True) p.add(CaptionPanel("draggable", sc)) v.add(CaptionPanel("Horizontal Sliders with inputboxes", p)) p = HorizontalPanel() p.setSpacing(10) p.setVerticalAlignment(HasAlignment.ALIGN_BOTTOM) sc = ASliderClass(False) p.add(CaptionPanel("clickable only", sc)) sc = ASliderClass(True) p.add(CaptionPanel("draggable", sc)) v.add(CaptionPanel("2D Controls: Inputboxes are draggable as well", p)) RootPanel().add(v)
class TabBar(Composite): STYLENAME_DEFAULT = "gwt-TabBarItem" def __init__(self, **kwargs): if not kwargs.has_key('StyleName'): kwargs['StyleName']="gwt-TabBar" # this is awkward: HorizontalPanel is the composite, # so we either the element here, and pass it in to HorizontalPanel. element = None if kwargs.has_key('Element'): element = kwargs.pop('Element') self.panel = HorizontalPanel(Element=element) self.selectedTab = None self.tabListeners = [] self.panel.setVerticalAlignment(HasAlignment.ALIGN_BOTTOM) first = HTML(" ", True) rest = HTML(" ", True) first.setStyleName("gwt-TabBarFirst") rest.setStyleName("gwt-TabBarRest") first.setHeight("100%") rest.setHeight("100%") self.panel.add(first) self.panel.add(rest) first.setHeight("100%") self.panel.setCellHeight(first, "100%") self.panel.setCellWidth(rest, "100%") Composite.__init__(self, self.panel, **kwargs) self.sinkEvents(Event.ONCLICK) def addTab(self, text, asHTML=False): self.insertTab(text, asHTML, self.getTabCount()) def addTabListener(self, listener): self.tabListeners.append(listener) def getSelectedTab(self): if self.selectedTab is None: return -1 return self.panel.getWidgetIndex(self.selectedTab) - 1 def getTabCount(self): return self.panel.getWidgetCount() - 2 def getTabHTML(self, index): if index >= self.getTabCount(): return None delPanel = self.panel.getWidget(index + 1) focusablePanel = delPanel.getFocusablePanel() widget = focusablePanel.getWidget() if hasattr(widget, "getHTML"): return widget.getHTML() elif hasattr(widget, "getText"): # assume it's a Label if it has getText return widget.getText() else: fpe = DOM.getParent(self.focusablePanel.getElement()) return DOM.getInnerHTML(fpe) def createTabTextWrapper(self): return None def insertTab(self, text, asHTML, beforeIndex=None): """ 1st arg can, instead of being 'text', be a widget. 1st arg can also be None, which results in a blank space between tabs. Use this to push subsequent tabs out to the right hand end of the TabBar. (the "blank" tab, by not being focussable, is not clickable). """ if beforeIndex is None: beforeIndex = asHTML asHTML = False if (beforeIndex < 0) or (beforeIndex > self.getTabCount()): #throw new IndexOutOfBoundsException(); pass if text is None: text = HTML(" ", True) text.setWidth("100%") text.setStyleName("gwt-TabBarRest") self.panel.insert(text, beforeIndex + 1) self.panel.setCellWidth(text, "100%") return istext = isinstance(text, basestring) if istext: if asHTML: item = HTML(text) else: item = Label(text) item.setWordWrap(False) else: # passing in a widget, it's expected to have its own style item = text self.insertTabWidget(item, beforeIndex) def insertTabWidget(self, widget, beforeIndex): delWidget = ClickDelegatePanel(self, widget, self, self) delWidget.setStyleName(self.STYLENAME_DEFAULT) focusablePanel = delWidget.getFocusablePanel() self.panel.insert(delWidget, beforeIndex + 1) self.setStyleName(DOM.getParent(delWidget.getElement()), self.STYLENAME_DEFAULT + "-wrapper", True) #print "insertTabWidget", DOM.getParent(delWidget.getElement()), DOM.getAttribute(DOM.getParent(delWidget.getElement()), "className") def onClick(self, sender=None): for i in range(1, self.panel.getWidgetCount() - 1): if DOM.isOrHasChild(self.panel.getWidget(i).getElement(), sender.getElement()): return self.selectTab(i - 1) return False def removeTab(self, index): self.checkTabIndex(index) toRemove = self.panel.getWidget(index + 1) if toRemove == self.selectedTab: self.selectedTab = None self.panel.remove(toRemove) def removeTabListener(self, listener): self.tabListeners.remove(listener) def selectTab(self, index): self.checkTabIndex(index) for listener in self.tabListeners: if not listener.onBeforeTabSelected(self, index): return False self.setSelectionStyle(self.selectedTab, False) if index == -1: self.selectedTab = None return True self.selectedTab = self.panel.getWidget(index + 1) self.setSelectionStyle(self.selectedTab, True) for listener in self.tabListeners: listener.onTabSelected(self, index) return True def checkTabIndex(self, index): if (index < -1) or (index >= self.getTabCount()): #throw new IndexOutOfBoundsException(); pass def setSelectionStyle(self, item, selected): if item is not None: if selected: item.addStyleName("gwt-TabBarItem-selected") self.setStyleName(DOM.getParent(item.getElement()), "gwt-TabBarItem-wrapper-selected", True) else: item.removeStyleName("gwt-TabBarItem-selected") self.setStyleName(DOM.getParent(item.getElement()), "gwt-TabBarItem-wrapper-selected", False)
class Milestones_Row(SimplePanel): ''' Create and edit projects ''' def __init__(self, milestone_names, milestone_dates): # We need to use old form of inheritance because of pyjamas SimplePanel.__init__(self) self.milestone_dates = milestone_dates self.hpanel = HorizontalPanel() self.hpanel.setVerticalAlignment(HasAlignment.ALIGN_TOP) self.name = ListBox(Height='34px', Width='208px') self.name.setStyleName('form-control input-lg') self.name.addChangeListener(getattr(self, 'on_milestone_changed')) for m in milestone_names: self.name.addItem(m) if len(self.milestone_dates) > 0: self.planned_completion = Label(self.milestone_dates[0]) else: self.planned_completion = Label('Undefined') self.planned_completion.setStyleName('form-control text-normal') self.expected_completion = Report_Date_Field(cal_ID='end') self.expected_completion.getTextBox().setStyleName('form-control') self.expected_completion.setRegex(DATE_MATCHER) self.expected_completion.appendValidListener(self._display_ok) self.expected_completion.appendInvalidListener(self._display_error) self.expected_completion.validate(None) self.hpanel.add(self.name) self.hpanel.add(Label(Width='10px')) self.hpanel.add(self.planned_completion) self.hpanel.add(Label(Width='10px')) self.hpanel.add(self.expected_completion) def get_name_txt(self): '''Return project name. ''' return self.name.getText() def get_milestone_data(self): '''Get milestone data and return in the form suitable for passing to the model. ''' name = self.name.getItemText(self.name.getSelectedIndex()) planned_completion = self.planned_completion.getText() expected_completion = self.expected_completion.getTextBox().getText() return (name, planned_completion, expected_completion) def _display_ok(self, obj): obj.setStyleName('form-input') def _display_error(self, obj): if len(obj.getTextBox().getText()) > 0: obj.setStyleName('form-group has-error') def on_milestone_changed(self, event): ''' Change completion date if milestone changed ''' ind = self.name.getSelectedIndex() self.planned_completion.setText(self.milestone_dates[ind])
class Milestones_Editor(SimplePanel): ''' Create and edit projects ''' def __init__(self): # We need to use old form of inheritance because of pyjamas SimplePanel.__init__(self) self.hpanel = HorizontalPanel(Width='755px') self.hpanel.setVerticalAlignment(HasAlignment.ALIGN_TOP) self.name = TextBox() self.name.setStyleName('form-control') self.start = Report_Date_Field(cal_ID='start') self.start.getTextBox().setStyleName('form-control') self.start.setRegex(DATE_MATCHER) self.start.appendValidListener(self._display_ok) self.start.appendInvalidListener(self._display_error) self.start.validate(None) self.end = Report_Date_Field(cal_ID='end') self.end.getTextBox().setStyleName('form-control') self.end.setRegex(DATE_MATCHER) self.end.appendValidListener(self._display_ok) self.end.appendInvalidListener(self._display_error) self.end.validate(None) self.status = ListBox() self.status.addItem('Active') self.status.addItem('Inactive') self.status.setVisibleItemCount(0) self.status.setStyleName('form-control input-lg') self.status.setSize('100px', '34px') spacer1 = Label(Width='10px') spacer2 = Label(Width='10px') spacer3 = Label(Width='10px') self.add_btn = Button('Add') self.add_btn.setStyleName('btn btn-primary') self.del_btn = Button('Delete') self.del_btn.setStyleName('btn btn-danger') self.hpanel.add(self.name) self.hpanel.add(spacer1) self.hpanel.add(self.status) self.hpanel.add(spacer2) self.hpanel.add(self.start) #self.hpanel.add(spacer3) self.hpanel.add(self.end) self.hpanel.add(self.add_btn) self.hpanel.add(Label(Width='10px')) self.hpanel.add(self.del_btn) def get_name_txt(self): '''Return project name. ''' return self.name.getText() def get_status(self): '''Return project status. ''' return self.status.getItemText(self.status.getSelectedIndex()) def get_milestone_data(self): '''Return all data for a milestone and validation result. ''' valid = False name_txt = self.get_name_txt() status_txt = self.get_status() start_txt = self.start.getTextBox().getText() end_txt = self.end.getTextBox().getText() data = [name_txt, status_txt, start_txt, end_txt] # We are only valid if these conditions are met if len(name_txt.strip()) > 0 and self.start.valid == True and self.end.valid == True: valid = True return (valid, data) def _display_ok(self, obj): obj.setStyleName('form-input') def _display_error(self, obj): if len(obj.getTextBox().getText()) > 0: obj.setStyleName('form-group has-error')
def init(self, ui, parent, style): """Initialise the object. FIXME: Note that we treat MODAL and POPUP as equivalent until we have an example that demonstrates how POPUP is supposed to work. """ self.ui = ui self.control = ui.control view = ui.view history = ui.history if self.control is not None: if history is not None: history.on_trait_change(self._on_undoable, 'undoable', remove=True) history.on_trait_change(self._on_redoable, 'redoable', remove=True) history.on_trait_change(self._on_revertable, 'undoable', remove=True) ui.reset() else: self.create_dialog(parent, style) self.set_icon(view.icon) # Convert the buttons to actions. buttons = [self.coerce_button(button) for button in view.buttons] nr_buttons = len(buttons) no_buttons = ((nr_buttons == 1) and self.is_button(buttons[0], '')) has_buttons = ((not no_buttons) and ((nr_buttons > 0) or view.undo or view.revert or view.ok or view.cancel)) if has_buttons or (view.menubar is not None): if history is None: history = UndoHistory() else: history = None ui.history = history if (not no_buttons) and (has_buttons or view.help): bbox = HorizontalPanel(width="100%") bbox.setHorizontalAlignment(HasAlignment.ALIGN_RIGHT) bbox.setVerticalAlignment(HasAlignment.ALIGN_RIGHT) # Create the necessary special function buttons. if nr_buttons == 0: if view.undo: self.check_button(buttons, UndoButton) if view.revert: self.check_button(buttons, RevertButton) if view.ok: self.check_button(buttons, OKButton) if view.cancel: self.check_button(buttons, CancelButton) if view.help: self.check_button(buttons, HelpButton) for button in buttons: if self.is_button(button, 'Undo'): self.undo = self.add_button(button, bbox, self._on_undo, False) history.on_trait_change(self._on_undoable, 'undoable', dispatch='ui') if history.can_undo: self._on_undoable(True) self.redo = self.add_button(button, bbox, self._on_redo, False, 'Redo') history.on_trait_change(self._on_redoable, 'redoable', dispatch='ui') if history.can_redo: self._on_redoable(True) elif self.is_button(button, 'Revert'): self.revert = self.add_button(button, bbox, self._on_revert, False) history.on_trait_change(self._on_revertable, 'undoable', dispatch='ui') if history.can_undo: self._on_revertable(True) elif self.is_button(button, 'OK'): self.ok = self.add_button(button, bbox) ui.on_trait_change(self._on_error, 'errors', dispatch='ui') elif self.is_button(button, 'Cancel'): self.add_button(button, bbox) elif self.is_button(button, 'Help'): self.add_button(button, bbox, self._on_help) elif not self.is_button(button, ''): self.add_button(button, bbox) else: bbox = None self.add_contents(panel(ui), bbox)