예제 #1
0
 def _init_win(self, window):
     '''Require at least 70 columns and 6 lines to fit current needs for
     display of partitions and slices. Builds two inner ScrollWindows for
     displaying/editing the data.
     
     '''
     if self.area.columns < 70:
         raise ValueError, "Insufficient space - area.columns < 70"
     if self.area.lines < 6:
         raise ValueError, "Insufficient space - area.lines < 6"
     self.win_width = (self.area.columns - DiskWindow.DEAD_ZONE
                       + DiskWindow.SCROLL_PAD) / 2
     
     super(DiskWindow, self)._init_win(window)
     
     win_area = WindowArea(self.area.lines - 1, self.win_width, 2, 0)
     win_area.scrollable_lines = self.area.lines - 2
     self.left_win = ScrollWindow(win_area, window=self, add_obj=False)
     self.left_win.color = None
     self.left_win.highlight_color = None
     win_area.x_loc = self.win_width + DiskWindow.DEAD_ZONE
     win_area.scrollable_lines = 2 * PartitionInfo.MAX_LOGICAL_PARTITIONS
     self.right_win = ScrollWindow(win_area, window=self, add_obj=False)
     self.right_win.color = None
     self.right_win.highlight_color = None
예제 #2
0
    def display_help(self):
        '''Display the single file help screen'''
        # customize header
        help_header = "%s: %s"
        logging.debug("self.screen is =%s", self.screen)
        if self.screen in self.help_dict:
            help_header = help_header % (_("Help"),
                                         self.help_dict[self.screen][1])
            help_text = self.get_help_text(self.help_dict[self.screen][0])
        else:
            help_header = help_header % (_("Help"), _("Not Available"))
            help_text = _("Help for this screen is not available")

        self.main_win.set_header_text(help_header)

        help_text = convert_paragraph(help_text, self.win_size_x - 5)
        logging.debug("help_text #lines=%d, text is \n%s", len(help_text),
                      help_text)
        area = WindowArea(x_loc=0,
                          y_loc=1,
                          scrollable_lines=(len(help_text) + 1))
        area.lines = self.win_size_y - 1
        area.columns = self.win_size_x
        self.scroll_region = ScrollWindow(area, window=self.center_win)
        self.scroll_region.add_paragraph(help_text, start_x=(area.x_loc + 3))
        self.center_win.activate_object(self.scroll_region)
예제 #3
0
    def test_no_ut_refresh(self):
        '''Ensure deep_refresh is updating nested window screen location '''

        scroll_win = ScrollWindow(WindowArea(60,
                                             70,
                                             0,
                                             0,
                                             scrollable_columns=75),
                                  color_theme=ColorTheme(force_bw=True))
        scroll_win.window = MockInnerWin()
        scroll_win.area.lower_right_y = 20
        scroll_win.area.lower_right_x = 20
        myscroll = ScrollWindow(WindowArea(10, 10, 0, 0,
                                           scrollable_columns=15),
                                color_theme=ColorTheme(force_bw=True))
        myscroll.window = MockInnerWin()
        myscroll.area.lower_right_y = 16
        myscroll.area.lower_right_x = 18
        scroll_win.objects.append(myscroll)
        scroll_win.area.y_loc = 3
        scroll_win.area.x_loc = 5
        abs_y = 12
        abs_x = 15
        scroll_win.latest_yx = (abs_y, abs_x)
        scroll_win.no_ut_refresh()
        self.assertEquals(myscroll.latest_yx[0], scroll_win.area.y_loc + abs_y)
        self.assertEquals(myscroll.latest_yx[1], scroll_win.area.x_loc + abs_x)
예제 #4
0
 def test_scrollable_columns(self):
     '''Test scrollable_columns getter and setter '''
     num_cols = 75
     my_win = WindowArea(50, num_cols, 0, 0)
     self.assertEqual(my_win.scrollable_columns, 75)
     my_win.scrollable_columns = 80
     self.assertEqual(my_win.scrollable_columns, 80)
예제 #5
0
 def test_scrollable_lines(self):
     '''Test scrollable_lines getter and setter '''
     print "\nhello"
     num_lines = 70
     my_win = WindowArea(num_lines, 60, 0, 0)
     self.assertEqual(my_win.scrollable_lines, num_lines)
     my_win.scrollable_lines = 80
     self.assertEqual(my_win.scrollable_lines, 80)
예제 #6
0
    def set_disk_info(self, disk_info):
        '''Set up this DiskWindow to represent disk_info'''
        if getattr(disk_info, "partitions", False):
            self.has_partition_data = True
        elif disk_info.slices:
            self.has_partition_data = False


#        else:
#            return

        if self.has_partition_data:
            if self.editable:
                self.headers = DiskWindow.EDIT_PARTITION_HEADERS
                self.list_area = WindowArea(
                    1, self.headers[0][0] + self.headers[1][0], 0,
                    DiskWindow.SCROLL_PAD)
                self.edit_area = WindowArea(1, self.headers[1][0], 0,
                                            self.headers[0][0])
            else:
                self.headers = DiskWindow.STATIC_PARTITION_HEADERS
        elif disk_info.slices:
            if self.editable:
                self.headers = DiskWindow.EDIT_SLICE_HEADERS
                self.list_area = WindowArea(
                    1, self.headers[0][0] + self.headers[1][0] +
                    self.headers[2][0], 0, DiskWindow.SCROLL_PAD)
                self.edit_area = WindowArea(
                    1, self.headers[2][0], 0,
                    self.headers[0][0] + self.headers[1][0])
            else:
                self.headers = DiskWindow.STATIC_SLICE_HEADERS

        self._orig_data = disk_info
        self.disk_info = deepcopy(disk_info)
        self.disk_info.add_unused_parts()

        self.left_win.clear()
        self.right_win.clear()
        self.window.erase()
        self.print_headers()

        if self.editable:
            self.active_object = None
            self.build_edit_fields()
            self.right_win.bottom = max(
                0,
                len(self.right_win.all_objects) - self.right_win.area.lines)
            if self.has_partition_data:
                self.orig_ext_part_field = None
                for obj in self.left_win.objects:
                    if (obj.data_obj.is_extended()):
                        self.orig_ext_part_field = obj
                        self.orig_logicals_active = True
                        break
        else:
            self.print_data()
예제 #7
0
    def test_horiz_scrollbar_created(self):
        '''Ensure horizontal scrollbar is created or not appropriately'''
        scroll_win = ScrollWindow(WindowArea(70, 70, 0, 0, 
                                  scrollable_columns=75),
                                  color_theme=ColorTheme(force_bw=True))
        self.assertTrue(scroll_win.get_use_horiz_scroll_bar())

        scroll_win = ScrollWindow(WindowArea(70, 70, 0, 0, 
                                  scrollable_columns=69),
                                  color_theme=ColorTheme(force_bw=True))
        self.assertFalse(scroll_win.get_use_horiz_scroll_bar())
예제 #8
0
    def test_vert_scrollbar_created(self):
        '''Ensure vertical scrollbar is created or not appropriately'''
        scroll_win = ScrollWindow(WindowArea(70, 70, 0, 0, 
                                  scrollable_lines=75),
                                  color_theme=ColorTheme(force_bw=True))
        self.assertTrue(scroll_win.get_use_vert_scroll_bar())

        scroll_win = ScrollWindow(WindowArea(70, 70, 0, 0, 
                                  scrollable_lines=70),
                                  color_theme=ColorTheme(force_bw=True))
        self.assertFalse(scroll_win.get_use_vert_scroll_bar())
예제 #9
0
    def test_scroll_down_up_arrow(self):
        '''Test to scroll down and up with arrow key '''
        lines = 4
        extra_lines = 9
        scroll_win = ScrollWindow(WindowArea(lines, 70, 0, 0, 
                                  scrollable_lines=lines + extra_lines),
                                  color_theme=ColorTheme(force_bw=True))
        scroll_win.active_object = None

        self.assertTrue(scroll_win.at_top())
        key = scroll_win.on_arrow_key(curses.KEY_DOWN)
        self.assertEqual(key, None)
        self.assertFalse(scroll_win.at_top())

        key = scroll_win.on_arrow_key(curses.KEY_UP)
        self.assertEqual(key, None)
        self.assertTrue(scroll_win.at_top())

        key = scroll_win.on_arrow_key(curses.KEY_UP)
        self.assertEqual(key, curses.KEY_UP)
        self.assertTrue(scroll_win.at_top())

        scroll_win.scroll(extra_lines-2)
        self.assertFalse(scroll_win.at_bottom())
        scroll_win.on_arrow_key(curses.KEY_DOWN)
        self.assertTrue(scroll_win.at_bottom())
            
        scroll_win.scroll(-(extra_lines-2))
        self.assertFalse(scroll_win.at_top())
        scroll_win.on_arrow_key(curses.KEY_UP)
        self.assertTrue(scroll_win.at_top())
예제 #10
0
    def test_active_object(self):
        '''Test that arrow key changes active object'''
        lines = 4
        extra_lines = 9
        scroll_win = ScrollWindow(WindowArea(lines,
                                             70,
                                             0,
                                             0,
                                             scrollable_lines=lines +
                                             extra_lines),
                                  color_theme=ColorTheme(force_bw=True))
        scroll_win.active_object = 0
        myobj0 = MockEditField()
        myobj0.area = MockInnerWin()
        myobj0.area.y_loc = 1
        myobj0.active = True
        myobj1 = MockEditField()
        myobj1.area = MockInnerWin()
        myobj1.area.y_loc = 3
        myobj1.active = False
        scroll_win.objects.append(myobj0)
        scroll_win.objects.append(myobj1)

        key = scroll_win.on_arrow_key(curses.KEY_DOWN)
        self.assertEquals(key, None)
        self.assertEquals(scroll_win.active_object, 1)
예제 #11
0
    def test_scroll_right_left_arrow(self):
        '''Test to scroll right and left with arrow key '''
        cols = 3
        extra_cols = 5
        scroll_win = ScrollWindow(WindowArea(10, cols, 0, 0, 
                                  scrollable_columns=cols+extra_cols),
                                  color_theme=ColorTheme(force_bw=True))
        scroll_win.active_object = None

        self.assertTrue(scroll_win.at_left())
        key = scroll_win.on_arrow_key(curses.KEY_RIGHT)
        self.assertEqual(key, None)
        self.assertFalse(scroll_win.at_left())

        key = scroll_win.on_arrow_key(curses.KEY_LEFT)
        self.assertEqual(key, None)
        self.assertTrue(scroll_win.at_left())

        key = scroll_win.on_arrow_key(curses.KEY_LEFT)
        self.assertEqual(key, curses.KEY_LEFT)
        self.assertTrue(scroll_win.at_left())

        scroll_win.scroll(columns=extra_cols-2)
        self.assertFalse(scroll_win.at_left())
        self.assertFalse(scroll_win.at_right())
        scroll_win.on_arrow_key(curses.KEY_RIGHT)
        self.assertTrue(scroll_win.at_right())
            
        scroll_win.scroll(columns=-(extra_cols-2))
        self.assertFalse(scroll_win.at_left())
        self.assertFalse(scroll_win.at_right())
        scroll_win.on_arrow_key(curses.KEY_LEFT)
        self.assertTrue(scroll_win.at_left())
예제 #12
0
 def test_scroll_no_args(self):
     '''Test that scroll called with no args throws ValueError'''
     scroll_win = ScrollWindow(WindowArea(70, 70, 0, 0,
                               scrollable_lines=75),
                               color_theme=ColorTheme(force_bw=True))
     self.assertTrue(scroll_win.get_use_vert_scroll_bar())
     self.assertEquals(scroll_win.current_line[0], 0)
     self.assertRaises(ValueError, scroll_win.scroll)
예제 #13
0
 def _show(self):
     '''Create a scrollable region and fill it with the install log'''
     self.center_win.border_size = (0, 0)
     self.scroll_area = WindowArea(self.win_size_y, self.win_size_x, 0, 0,
                                   len(self.get_log_data()))
     log = ScrollWindow(self.scroll_area, window=self.center_win)
     log.add_paragraph(self.get_log_data(), 0, 2)
     self.center_win.activate_object(log)
예제 #14
0
    def __init__(self, main_win):
        super(DateTimeScreen, self).__init__(main_win)

        year_edit_width = DateTimeScreen.YEAR_DIGITS + 1
        list_width = DateTimeScreen.MAX_LEN + year_edit_width
        self.list_area = WindowArea(1, list_width, 0,
                                    DateTimeScreen.ITEM_OFFSET)
        self.year_edit_area = WindowArea(1, year_edit_width, 0,
                                         DateTimeScreen.MAX_LEN + 1)
        other_edit_width = DateTimeScreen.TWO_DIGITS + 1
        other_edit_offset = (
            DateTimeScreen.MAX_LEN +
            (DateTimeScreen.YEAR_DIGITS - DateTimeScreen.TWO_DIGITS) + 1)
        self.edit_area = WindowArea(1, other_edit_width, 0, other_edit_offset)
        self.info_offset = (DateTimeScreen.ITEM_OFFSET +
                            self.list_area.columns + 1)
        self.info_width = len(DateTimeScreen.YEAR_FORMAT)
        err_offset = self.info_offset + self.info_width + 2
        err_width = self.win_size_x - err_offset
        self.err_area = WindowArea(1, err_width, 0, err_offset)

        self.year_edit = None
        self.year_err = None
        self.year_list = None
        self.month_edit = None
        self.month_err = None
        self.month_list = None
        self.day_edit = None
        self.day_err = None
        self.day_list = None
        self.hour_edit = None
        self.hour_err = None
        self.hour_list = None
        self.minute_edit = None
        self.minute_err = None
        self.minute_list = None
        self.year_is_valid = True
        self.month_is_valid = True
        self.date_range_loc = None
        self.saved_year = None
        self.saved_month = None
        self.saved_day = None
        self.saved_hour = None
        self.saved_minute = None
        self.saved_days_in_month = None
예제 #15
0
 def test_scroll_one_col(self):
     '''Test to scroll one column '''
     scroll_win = ScrollWindow(WindowArea(70, 70, 0, 0, 
                               scrollable_columns=75),
                               color_theme=ColorTheme(force_bw=True))
     self.assertTrue(scroll_win.get_use_horiz_scroll_bar())
     self.assertEquals(scroll_win.current_line[1], 0)
     scroll_win.scroll(columns=1)
     self.assertEquals(scroll_win.current_line[1], 1)
예제 #16
0
 def test_scroll_to_right(self):
     '''Test to scroll multiple columns to right of scrollarea'''
     cols = 70
     extra_cols = 5
     scroll_win = ScrollWindow(WindowArea(70, cols, 0, 0, 
                               scrollable_columns=cols+extra_cols),
                               color_theme=ColorTheme(force_bw=True))
     scroll_win.scroll(scroll_to_column=5)
     self.assertTrue(scroll_win.at_right())
예제 #17
0
 def test_scroll_to_bottom(self):
     '''Test to scroll multiple lines to bottom of scrollarea'''
     lines = 70
     extra_lines = 5
     scroll_win = ScrollWindow(WindowArea(lines, 70, 0, 0, 
                               scrollable_lines=lines + extra_lines),
                               color_theme=ColorTheme(force_bw=True))
     scroll_win.scroll(scroll_to_line=5)
     self.assertTrue(scroll_win.at_bottom())
예제 #18
0
    def __init__(self, main_win):
        super(UserScreen, self).__init__(main_win)

        self.max_text_len = (self.win_size_x - UserScreen.PASS_SCREEN_LEN -
                             UserScreen.ITEM_OFFSET) / 2
        max_field = max(textwidth(UserScreen.ROOT_LABEL),
                        textwidth(UserScreen.CONFIRM_LABEL),
                        textwidth(UserScreen.NAME_LABEL),
                        textwidth(UserScreen.USERNAME_LABEL),
                        textwidth(UserScreen.USER_PASS_LABEL))
        self.text_len = min(max_field + 1, self.max_text_len)
        self.list_area = WindowArea(1, self.text_len, 0,
                                    UserScreen.ITEM_OFFSET)
        scrollable_columns = UserInfo.MAX_PASS_LEN + 1
        self.edit_area = WindowArea(1,
                                    UserScreen.PASS_SCREEN_LEN + 1,
                                    0,
                                    self.text_len,
                                    scrollable_columns=scrollable_columns)
        self.username_edit_area = WindowArea(1, UserInfo.MAX_USERNAME_LEN + 1,
                                             0, self.text_len)
        err_x_loc = 2 * self.max_text_len - self.text_len
        err_width = (self.text_len + UserScreen.PASS_SCREEN_LEN)
        self.error_area = WindowArea(1, err_width, 0, err_x_loc)
        self.root = None
        self.user = None
        self.root_pass_list = None
        self.root_pass_edit = None
        self.root_pass_err = None
        self.root_confirm_err = None
        self.root_confirm_list = None
        self.root_confirm_edit = None
        self.real_name_err = None
        self.real_name_list = None
        self.real_name_edit = None
        self.username_err = None
        self.username_list = None
        self.username_edit = None
        self.user_pass_err = None
        self.user_pass_list = None
        self.user_pass_edit = None
        self.user_confirm_err = None
        self.user_confirm_list = None
        self.user_confirm_edit = None
예제 #19
0
    def __init__(self, main_win):
        super(ZpoolScreen, self).__init__(main_win)

        pool_header_text = []
        for header in ZpoolScreen.POOL_HEADERS:
            header_str = fit_text_truncate(header[1],
                                           header[0] - 1,
                                           just="left")
            pool_header_text.append(header_str)
        self.pool_header_text = " ".join(pool_header_text)

        self.existing_pools = []
        self.num_targets = 0
        max_note_size = ZpoolScreen.POOL_HEADERS[2][0]
        self.too_small_text = ZpoolScreen.TOO_SMALL[:max_note_size]
        self._size_line = None
        self.selected_pool = 0
        self._minimum_size = None
        self._recommended_size = None
        self.pool_win = None

        max_field = max(textwidth(ZpoolScreen.BE_LABEL),
                        textwidth(ZpoolScreen.BE_NAME_EMPTY_ERROR),
                        textwidth(ZpoolScreen.BE_NAME_UNALLOWED_ERROR),
                        textwidth(ZpoolScreen.NO_POOLS))

        self.max_text_len = int((self.win_size_x - ZpoolScreen.BE_SCREEN_LEN -
                                 ZpoolScreen.ITEM_OFFSET) / 2)
        self.text_len = min(max_field + 1, self.max_text_len)
        self.list_area = WindowArea(1, self.text_len, 0,
                                    ZpoolScreen.ITEM_OFFSET)

        self.edit_area = WindowArea(1, ZpoolScreen.BE_SCREEN_LEN + 1, 0,
                                    self.text_len)
        err_x_loc = 2
        err_width = (self.text_len + ZpoolScreen.BE_SCREEN_LEN)
        self.error_area = WindowArea(1, err_width + 1, 0, err_x_loc)
        self.be_name_list = None
        self.be_name_edit = None
        self.be_name_err = None

        self.boot_configuration_item = None
        self.do_copy = False  # Flag indicating if install_profile.pool_name
예제 #20
0
 def test_scroll_past_left(self):
     '''Test to scroll past left, should end up at left '''
     cols = 70
     extra_cols = 5
     scroll_win = ScrollWindow(WindowArea(70, cols, 0, 0, 
                               scrollable_columns=cols+extra_cols),
                               color_theme=ColorTheme(force_bw=True))
     self.assertTrue(scroll_win.at_left())
     scroll_win.scroll(columns=-3)
     self.assertTrue(scroll_win.at_left())
예제 #21
0
 def test_scroll_past_top(self):
     '''Test to scroll past top, should end up at top '''
     lines = 70
     extra_lines = 5
     scroll_win = ScrollWindow(WindowArea(lines, 70, 0, 0, 
                               scrollable_lines=lines + extra_lines),
                               color_theme=ColorTheme(force_bw=True))
     self.assertTrue(scroll_win.at_top())
     scroll_win.scroll(lines=-3)
     self.assertTrue(scroll_win.at_top())
예제 #22
0
    def display_help_topics(self):
        '''Display the help topics screen.'''

        self.main_win.set_header_text(HelpScreen.HELP_HEADER)
        y_loc = 1

        y_loc += self.center_win.add_paragraph(HelpScreen.INTRO,
                                               y_loc,
                                               1,
                                               max_x=(self.win_size_x - 1))
        y_loc += 1

        area = WindowArea(scrollable_lines=(len(self.help_info) + 1),
                          y_loc=y_loc,
                          x_loc=0)
        logging.debug("lines=%s", len(self.help_dict))
        area.lines = self.win_size_y - (y_loc + 1)
        area.columns = self.win_size_x

        self.scroll_region = ScrollWindow(area, window=self.center_win)

        # add the entries to the screen
        logging.debug("range=%s", len(self.help_info))
        for idx, info in enumerate(self.help_info):
            # create ListItem for each help topic
            topic_format = info[1]
            help_topic = self.get_help_topic(info[0])
            help_topic = topic_format % help_topic
            hilite = min(self.win_size_x, textwidth(help_topic) + 1)
            list_item = ListItem(WindowArea(1, hilite, idx, 0),
                                 window=self.scroll_region,
                                 text=help_topic)
            help_screens = info[0]
            logging.debug("help_screens=%s", list(help_screens))
            logging.debug("self.screen_last=%s", self.screen_last)
            if self.screen_last in help_screens:
                logging.debug("Set cur_help_idx = %s", idx)
                self.cur_help_idx = idx
        logging.debug("beg_y=%d, beg_x=%d", *list_item.window.getbegyx())

        self.center_win.activate_object(self.scroll_region)
        self.scroll_region.activate_object(self.cur_help_idx)
예제 #23
0
 def init_status_bar(self, y_loc, x_loc, width):
     '''Initialize the progress bar window and set to 0%'''
     self.status_bar_width = width
     status_bar_area = WindowArea(1, width + 3, y_loc, x_loc + 1)
     self.status_bar = InnerWindow(status_bar_area, window=self.center_win)
     self.status_bar.window.addch(0, 0, InstallProgress.PROG_BAR_ENDS[0])
     self.status_bar.window.addch(0, width + 1,
                                  InstallProgress.PROG_BAR_ENDS[1])
     self.progress_color = self.center_win.color_theme.progress_bar
     self.last_update = 0
     self.set_status_percent(0)
예제 #24
0
 def __init__(self, main_win):
     super(NICConfigure, self).__init__(main_win)
     self.dns_description = None
     self.domain_description = None
     item_length = max(len(NICConfigure.IP_LABEL),
                       len(NICConfigure.NETMASK_LABEL),
                       len(NICConfigure.GATEWAY_LABEL),
                       len(NICConfigure.DNS_LABEL),
                       len(NICConfigure.DOMAIN_LABEL))
     item_length += 1
     list_width = item_length + NICConfigure.EDIT_FIELD_LEN
     self.list_area = WindowArea(1, list_width, 0, NICConfigure.ITEM_OFFSET)
     self.edit_area = WindowArea(1, NICConfigure.EDIT_FIELD_LEN, 0,
                                 item_length)
     self.ip_field = None
     self.netmask_field = None
     self.gateway_field = None
     self.dns_field = None
     self.domain_field = None
     self.nic = None
예제 #25
0
 def test_act_obj_indexerr_not_edge(self):
     '''Test arrow key, active object, IndexError, not at edge'''
     lines = 4
     extra_lines = 9
     scroll_win = ScrollWindow(WindowArea(lines, 70, 0, 0, 
                               scrollable_lines=lines + extra_lines),
                               color_theme=ColorTheme(force_bw=True))
     scroll_win.active_object = 0
     scroll_win.objects.append(object())
     key = scroll_win.on_arrow_key(curses.KEY_DOWN)
     self.assertEquals(scroll_win.current_line[0], 1)
     self.assertEquals(key, None)
예제 #26
0
 def _show(self):
     '''Prepare a text summary from the install_profile and display it
     to the user in a ScrollWindow
     
     '''
     y_loc = 1
     y_loc += self.center_win.add_paragraph(SummaryScreen.PARAGRAPH, y_loc)
     
     y_loc += 1
     summary_text = self.build_summary()
     # Wrap the summary text, accounting for the INDENT (used below in
     # the call to add_paragraph)
     max_chars = self.win_size_x - SummaryScreen.INDENT - 1
     summary_text = convert_paragraph(summary_text, max_chars)
     area = WindowArea(x_loc=0, y_loc=y_loc,
                       scrollable_lines=(len(summary_text)+1))
     area.lines = self.win_size_y - y_loc
     area.columns = self.win_size_x
     scroll_region = ScrollWindow(area, window=self.center_win)
     scroll_region.add_paragraph(summary_text, start_x=SummaryScreen.INDENT)
     
     self.center_win.activate_object(scroll_region)
예제 #27
0
    def _show(self):
        '''Create a list of NICs to choose from. If more than 15 NICs are
        found, create a scrolling region to put them in
        
        '''
        self.nic = self.install_profile.nic
        if self.nic.type != NetworkInfo.MANUAL:
            raise SkipException
        if len(self.ether_nics) == 1:
            self.set_nic_in_profile(self.ether_nics[0])
            raise SkipException

        try:
            selected_nic_name = self.nic.nic_name
        except AttributeError:
            selected_nic_name = ""

        y_loc = 1
        y_loc += self.center_win.add_paragraph(NICSelect.PARAGRAPH, y_loc)

        selected_nic = 0

        y_loc += 1
        max_nics = min(NICSelect.MAX_NICS, self.center_win.area.lines - y_loc)
        if len(self.ether_nics) > max_nics:
            columns = self.win_size_x - NICSelect.LIST_OFFSET
            win_area = WindowArea(lines=max_nics,
                                  columns=columns,
                                  y_loc=y_loc,
                                  x_loc=NICSelect.LIST_OFFSET,
                                  scrollable_lines=len(self.ether_nics))
            window = ScrollWindow(win_area, window=self.center_win)
            y_loc = 0
        else:
            window = self.center_win

        for nic in self.ether_nics:
            self.list_area.y_loc = y_loc
            self.list_area.columns = len(nic) + 1
            list_item = ListItem(self.list_area,
                                 window=window,
                                 text=nic,
                                 data_obj=nic)
            if nic == selected_nic_name:
                selected_nic = list_item
            y_loc += 1

        self.main_win.do_update()
        self.center_win.activate_object(selected_nic)
예제 #28
0
 def reset(self):
     '''Create the InnerWindows representing the header, footer/border,
     error line, and main central_area
     
     '''
     window_size = self.initscr.getmaxyx()
     win_size_y = window_size[0]
     win_size_x = window_size[1]
     footer_area = WindowArea(1, win_size_x, win_size_y - 1, 0)
     self.footer = InnerWindow(footer_area,
                               color_theme=self.theme,
                               color=self.theme.border)
     top = self.initscr.derwin(1, win_size_x, 0, 0)
     left = self.initscr.derwin(win_size_y - 2, 1, 1, 0)
     right = self.initscr.derwin(win_size_y - 2, 1, 1, win_size_x - 1)
     self.footer.more_windows = [top, left, right]
     self.footer.set_color(self.theme.border)
     header_area = WindowArea(1, win_size_x - 2, 1, 1)
     self.header = InnerWindow(header_area,
                               color_theme=self.theme,
                               color=self.theme.header)
     central_win_area = WindowArea(win_size_y - 4, win_size_x - 2, 2, 1)
     self.central_area = InnerWindow(central_win_area,
                                     border_size=(0, 2),
                                     color_theme=self.theme)
     self._active_win = self.central_area
     popup_win_area = WindowArea(central_win_area.lines - 10,
                                 central_win_area.columns - 20, 5, 10,
                                 central_win_area.lines - 10)
     self.popup_win = ScrollWindow(popup_win_area,
                                   window=self.central_area,
                                   color=self.theme.error_msg,
                                   highlight_color=self.theme.error_msg)
     error_area = WindowArea(1, win_size_x - 2, win_size_y - 2, 1)
     self.error_line = ErrorWindow(error_area, color_theme=self.theme)
     self.reset_actions()
예제 #29
0
    def setUp(self):
        '''unit test set up
         Sets several functions to call do_nothing to allow
         test execution in non-curses environment. Original
         functions are saved so they can be later restored in
         tearDown.

        '''
        self.inner_window_init_win = InnerWindow._init_win
        self.disk_window_init_win = DiskWindow._init_win
        self.inner_window_set_color = InnerWindow.set_color
        InnerWindow._init_win = do_nothing
        InnerWindow.set_color = do_nothing
        DiskWindow._init_win = do_nothing
        self.disk_win = DiskWindow(WindowArea(70, 70, 0, 0),
                                   DiskInfo(),
                                   color_theme=ColorTheme(force_bw=True),
                                   window=MockAll())
        self.edit_field = MockEditField()
        self.part_field = MockPartField()
        self.part_info = MockPartInfo()
        self.inner_win = MockInnerWin()
        self.disk_win.objects = []
        self.part_field.objects = []
예제 #30
0
    def _show(self):
        '''Create a list of disks to choose from and create the window
        for displaying the partition/slice information from the selected
        disk
        
        '''
        if self.install_profile.install_to_pool:
            raise SkipException

        self.wait_for_disks()
        self.num_targets = 0
        
        if not self.disks:
            self.center_win.add_paragraph(DiskScreen.NO_DISKS, 1, 1,
                                          max_x=(self.win_size_x - 1))
            return
        
        if isinstance(self.disks[0], BaseException):
            if len(self.disks) == 1:
                raise tgt.TgtError(("Unexpected error (%s) during target "
                                    "discovery. See log for details.") %
                                    self.disks[0])
            else:
                self.disks = self.disks[1:]
                logging.warn("Failure in target discovery, but one or more"
                             " disks found. Continuing.")
        
        boot_disk = self.disks[0]
        for disk in self.disks:
            if (disk.size.size_as("gb") > self.minimum_size):
                self.num_targets += 1
            if disk.boot:
                boot_disk = disk
        self.disks.remove(boot_disk)
        self.disks.insert(0, boot_disk)
        
        if self.num_targets == 0:
            self.center_win.add_paragraph(DiskScreen.NO_TARGETS, 1, 1,
                                          max_x=(self.win_size_x - 1))
            return
        
        self.main_win.reset_actions()
        self.main_win.show_actions()
        
        y_loc = 1
        self.center_win.add_text(DiskScreen.PARAGRAPH, y_loc, 1)
        
        y_loc += 1
        self.center_win.add_text(self.size_line, y_loc, 1)
        
        y_loc += 2
        self.center_win.add_text(self.disk_header_text, y_loc, 1)
        
        y_loc += 1
        self.center_win.window.hline(y_loc, self.center_win.border_size[1] + 1,
                                     curses.ACS_HLINE,
                                     textwidth(self.disk_header_text))
        
        y_loc += 1
        disk_win_area = WindowArea(4, textwidth(self.disk_header_text) + 2,
                                   y_loc, 0)
        disk_win_area.scrollable_lines = len(self.disks) + 1
        self.disk_win = ScrollWindow(disk_win_area,
                                     window=self.center_win)
        
        disk_item_area = WindowArea(1, disk_win_area.columns - 2, 0, 1)
        disk_index = 0
        len_use = DiskScreen.DISK_HEADERS[0][0] - 1
        len_type = DiskScreen.DISK_HEADERS[1][0] - 1
        len_size = DiskScreen.DISK_HEADERS[2][0] - 1
        len_boot = DiskScreen.DISK_HEADERS[3][0] - 1
        len_dev = DiskScreen.DISK_HEADERS[4][0] - 1
        len_mftr = DiskScreen.DISK_HEADERS[5][0] - 1
        for disk in self.disks:
            disk_text_fields = []
            type_field = disk.type[:len_type]
            type_field = ljust_columns(type_field, len_type)
            disk_text_fields.append(type_field)
            disk_size = disk.size.size_as("gb")
            size_field = "%*.1f" % (len_size, disk_size)
            disk_text_fields.append(size_field)
            if disk.boot:
                bootable_field = "+".center(len_boot)
            else:
                bootable_field = " " * (len_boot)
            disk_text_fields.append(bootable_field)
            device_field = disk.name[:len_dev]
            device_field = ljust_columns(device_field, len_dev)
            disk_text_fields.append(device_field)
            if disk.vendor is not None:
                mftr_field = disk.vendor[:len_mftr]
                mftr_field = ljust_columns(mftr_field, len_mftr)
            else:
                mftr_field = " " * len_mftr
            disk_text_fields.append(mftr_field)
            selectable = True
            if disk_size < self.minimum_size:
                note_field = self.too_small_text
                selectable = False
            elif DiskInfo.GPT in disk.label:
                note_field = DiskScreen.GPT_LABELED
            elif disk_size > SliceInfo.MAX_VTOC.size_as("gb"):
                note_field = self.too_big_warn
            else:
                note_field = ""
            # Use first selectable disk if no disk was used yet
            if disk.used is None and not self.one_disk_used and selectable:
               disk.used = True
               self.one_disk_used = True
            disk_text_fields.append(note_field)
            disk_text = " ".join(disk_text_fields)
            disk_item_area.y_loc = disk_index
            disk_list_item = MultiListItem(disk_item_area, window=self.disk_win,
                                      text=disk_text, add_obj=selectable, used=disk.used)
            disk_list_item.on_make_active = on_activate
            disk_list_item.on_make_active_kwargs["disk_info"] = disk
            disk_list_item.on_make_active_kwargs["disk_select"] = self

            disk_list_item.on_select = on_select
            disk_list_item.on_select_kwargs["disk_info"] = disk
            disk_list_item.on_select_kwargs["disk_select"] = self
            disk_index += 1
        self.disk_win.no_ut_refresh()
        
        y_loc += 7
        disk_detail_area = WindowArea(6, 70, y_loc, 1)
        self.disk_detail = DiskWindow(disk_detail_area, self.disks[0],
                                      window=self.center_win)
        
        self.main_win.do_update()
        self.center_win.activate_object(self.disk_win)
        self.disk_win.activate_object(self.selected_disk)
        # Set the flag so that the disk is not copied by on_change_screen,
        # unless on_select gets called as a result of the user changing
        # the selected disks.
        self.do_copy = False
예제 #31
0
 def _show(self):
     '''Create a list of disks to choose from and create the window
     for displaying the partition/slice information from the selected
     disk
     
     '''
     self.wait_for_disks()
     self.num_targets = 0
     
     if not self.disks:
         self.center_win.add_paragraph(DiskScreen.NO_DISKS, 1, 1,
                                       max_x=(self.win_size_x - 1))
         return
     
     if isinstance(self.disks[0], BaseException):
         if len(self.disks) == 1:
             raise tgt.TgtError(("Unexpected error (%s) during target "
                                 "discovery. See log for details.") %
                                 self.disks[0])
         else:
             self.disks = self.disks[1:]
             logging.warn("Failure in target discovery, but one or more"
                          " disks found. Continuing.")
     
     boot_disk = self.disks[0]
     for disk in self.disks:
         if (disk.size.size_as("gb") > self.minimum_size):
             self.num_targets += 1
         if disk.boot:
             boot_disk = disk
     self.disks.remove(boot_disk)
     self.disks.insert(0, boot_disk)
     
     if self.num_targets == 0:
         self.center_win.add_paragraph(DiskScreen.NO_TARGETS, 1, 1,
                                       max_x=(self.win_size_x - 1))
         return
     
     self.main_win.reset_actions()
     self.main_win.show_actions()
     
     y_loc = 1
     self.center_win.add_text(DiskScreen.PARAGRAPH, y_loc, 1)
     
     y_loc += 1
     self.center_win.add_text(self.size_line, y_loc, 1)
     
     y_loc += 2
     self.center_win.add_text(self.disk_header_text, y_loc, 1)
     
     y_loc += 1
     self.center_win.window.hline(y_loc, self.center_win.border_size[1] + 1,
                                  curses.ACS_HLINE,
                                  textwidth(self.disk_header_text))
     
     y_loc += 1
     disk_win_area = WindowArea(4, textwidth(self.disk_header_text) + 2,
                                y_loc, 0)
     disk_win_area.scrollable_lines = len(self.disks) + 1
     self.disk_win = ScrollWindow(disk_win_area,
                                  window=self.center_win)
     
     disk_item_area = WindowArea(1, disk_win_area.columns - 2, 0, 1)
     disk_index = 0
     len_type = DiskScreen.DISK_HEADERS[0][0] - 1
     len_size = DiskScreen.DISK_HEADERS[1][0] - 1
     len_boot = DiskScreen.DISK_HEADERS[2][0] - 1
     len_dev = DiskScreen.DISK_HEADERS[3][0] - 1
     len_mftr = DiskScreen.DISK_HEADERS[4][0] - 1
     for disk in self.disks:
         disk_text_fields = []
         type_field = disk.type[:len_type]
         type_field = ljust_columns(type_field, len_type)
         disk_text_fields.append(type_field)
         disk_size = disk.size.size_as("gb")
         size_field = "%*.1f" % (len_size, disk_size)
         disk_text_fields.append(size_field)
         if disk.boot:
             bootable_field = "+".center(len_boot)
         else:
             bootable_field = " " * (len_boot)
         disk_text_fields.append(bootable_field)
         device_field = disk.name[:len_dev]
         device_field = ljust_columns(device_field, len_dev)
         disk_text_fields.append(device_field)
         if disk.vendor is not None:
             mftr_field = disk.vendor[:len_mftr]
             mftr_field = ljust_columns(mftr_field, len_mftr)
         else:
             mftr_field = " " * len_mftr
         disk_text_fields.append(mftr_field)
         selectable = True
         if disk_size < self.minimum_size:
             note_field = self.too_small_text
             selectable = False
         elif DiskInfo.GPT in disk.label:
             note_field = DiskScreen.GPT_LABELED
         elif disk_size > SliceInfo.MAX_VTOC.size_as("gb"):
             note_field = self.too_big_warn
         else:
             note_field = ""
         disk_text_fields.append(note_field)
         disk_text = " ".join(disk_text_fields)
         disk_item_area.y_loc = disk_index
         disk_list_item = ListItem(disk_item_area, window=self.disk_win,
                                   text=disk_text, add_obj=selectable)
         disk_list_item.on_make_active = on_activate
         disk_list_item.on_make_active_kwargs["disk_info"] = disk
         disk_list_item.on_make_active_kwargs["disk_select"] = self
         disk_index += 1
     self.disk_win.no_ut_refresh()
     
     y_loc += 7
     disk_detail_area = WindowArea(6, 70, y_loc, 1)
     self.disk_detail = DiskWindow(disk_detail_area, self.disks[0],
                                   window=self.center_win)
     
     self.main_win.do_update()
     self.center_win.activate_object(self.disk_win)
     self.disk_win.activate_object(self.selected_disk)
     # Set the flag so that the disk is not copied by on_change_screen,
     # unless on_activate gets called as a result of the user changing
     # the selected disk.
     self.do_copy = False