class SettingsTableFrame(JFrame):
    def __init__(self, *args, **kwargs):
        # do not create any class members before calling JFrame.__init__ !
        s, size, title, savemode = None, None, None, False
        self.OKstatus = True
        if 'settings_config' in kwargs:
            s = kwargs.pop('settings_config')
        else:
            s = None
        if 'size' in kwargs:
            size = kwargs.pop('size')
        else:
            size = (300, 300)
        if 'widget' in kwargs:
            widget = kwargs.pop('widget')
        else:
            widget = None
        if 'savemode' in kwargs:
            savemode = kwargs.pop('savemode')
        defaultdir = None
        if 'defaultdir' in kwargs:
            defaultdir = kwargs.pop('defaultdir')
        if len(args) > 0:
            title = args[0]
        else:
            title = 'Save Settings'
        JFrame.__init__(self, title, size=size, **kwargs)
        self.widget = widget
        if self.widget == None:
            print "Need to pass keyword argument widget=widget when creating SettingsTableFrame"
        self.s = s
        self.savemode = savemode
        self.defaultdir = defaultdir
        # create FileChooser, make its window bigger and choose smaller font
        if self.defaultdir != None:
            self.fc = JFileChooser(self.defaultdir)
        else:
            self.fc = JFileChooser()
        self.fc.setPreferredSize(Dimension(800, 600))
        smallfont = Font("Lucida Sans", Font.PLAIN, 12)
        SetFontRecursively(self.fc.getComponents(), smallfont)
        filefilter = FileNameExtensionFilter("Settings Files",
                                             (DEFAULT_EXTENSION, ))
        self.fc.setFileFilter(filefilter)
        # fill the table, in save mode only with the current values, in load mode with current and setting values
        self.prepare_tabledata()
        # if not savemode, we first pop up a filechooser to select a loadable setting
        if self.savemode == False:
            self.OKstatus = self.load_setting()
            if not self.OKstatus:
                return
        # listener for data edited by user, good for providing PV write access within the table to the user
        self.dataListener = MyTableModelListener(savemode=self.savemode)
        self.dataModel.addTableModelListener(self.dataListener)
        self.table = JTable(self.dataModel)
        # create Buttons
        self.bu_do_label = "Save" if self.savemode == True else "Load"
        self.bu_do_handler = self.bu_save_handler if self.savemode == True else self.bu_load_handler
        self.bu_do = JButton(self.bu_do_label,
                             actionPerformed=self.bu_do_handler)
        self.bu_cancel = JButton("Cancel",
                                 actionPerformed=self.bu_cancel_handler)
        # BEGIN visual adaptations of JTable
        self.table.setRowHeight(24)
        self.table.getColumnModel().getColumn(0).setMinWidth(200)
        if self.savemode:
            self.table.getColumnModel().getColumn(3).setMaxWidth(60)
        else:
            self.table.getColumnModel().getColumn(4).setMaxWidth(60)
        smallfontr = MyTableCellRenderer(font=FONT_FAMILY,
                                         style=Font.PLAIN,
                                         fontsize=10)
        smallfontr.setHorizontalAlignment(JLabel.CENTER)
        bigfontplainr = MyTableCellRenderer(font=FONT_FAMILY,
                                            style=Font.PLAIN,
                                            fontsize=18)
        bigfontplainr.setHorizontalAlignment(JLabel.CENTER)
        bigfontr = MyTableCellRenderer(font=FONT_FAMILY,
                                       style=Font.BOLD,
                                       fontsize=18)
        bigfontr.setHorizontalAlignment(JLabel.CENTER)
        self.table.getColumnModel().getColumn(0).setCellRenderer(smallfontr)
        self.table.getColumnModel().getColumn(1).setCellRenderer(bigfontplainr)
        self.table.getColumnModel().getColumn(2).setCellRenderer(bigfontr)
        if not self.savemode:
            self.table.getColumnModel().getColumn(3).setCellRenderer(bigfontr)
        # END visual adaptations of JTable
        ## BEGIN layout of window (JFrame)
        self.getContentPane().setLayout(BorderLayout())
        self.add(JScrollPane(self.table))
        self.bottompanel = JPanel()
        self.bottompanel.setLayout(
            BoxLayout(self.bottompanel, BoxLayout.LINE_AXIS))
        self.bottompanel.add(Box.createHorizontalGlue())
        self.bottompanel.add(self.bu_do)
        self.bottompanel.add(Box.createRigidArea(Dimension(20, 0)))
        self.bottompanel.add(self.bu_cancel)
        self.bottompanel.add(Box.createHorizontalGlue())
        self.add(self.bottompanel, BorderLayout.SOUTH)
        # END layout of window (JFrame)

    def bu_cancel_handler(self, event):
        self.dispose()

    def bu_save_handler(self, event):
        dlg_answer = self.fc.showSaveDialog(self)
        if dlg_answer == self.fc.CANCEL_OPTION:
            return
        if dlg_answer == self.fc.APPROVE_OPTION:  # user clicked SAVE
            f = self.fc.getSelectedFile().getAbsolutePath()
            if not str(f).endswith("." + DEFAULT_EXTENSION):
                f = f + "." + DEFAULT_EXTENSION
            if os.path.exists(
                    f):  # file already exists, let user confirm overwriting
                choice = JOptionPane.showConfirmDialog(
                    self, "The file exists, overwrite?", "Existing file",
                    JOptionPane.YES_NO_CANCEL_OPTION)
                if choice in (JOptionPane.NO_OPTION,
                              JOptionPane.CANCEL_OPTION):
                    return
                if choice == JOptionPane.YES_OPTION:
                    self.do_save(f)
                    self.dispose()
            else:  # file does not exist, yet -> don't need to ask
                self.do_save(f)
                self.dispose()

    def bu_load_handler(self, event):
        for i in range(self.dataModel.getRowCount()):
            if self.dataModel.getValueAt(i, RESTORE_COL_LOADMODE) == False:
                continue
            curval = self.dataModel.getValueAt(i, VALUE_COLUMN)
            setval = self.dataModel.getValueAt(i, SETTING_COLUMN)
            if curval == '---' or setval == '---':  # either PV does not exist or value missing in the settings file
                continue
            pvname = self.dataModel.getValueAt(i, PV_COLUMN)
            writejob = BackgroundPVWriter(pvname, setval)
            writejob.schedule()
        self.dispose()

    def load_setting(self):
        dlg_answer = self.fc.showOpenDialog(self)
        if dlg_answer == self.fc.CANCEL_OPTION:
            return False
        if dlg_answer == self.fc.APPROVE_OPTION:
            f = self.fc.getSelectedFile().getAbsolutePath()
            self.parse_setting(f)
            return True

    def parse_setting(self, fpath):  # compatible to old set files
        with open(fpath, "r") as f:
            idxset = set(range(self.dataModel.getRowCount()))
            #lbuf = [l for l in f] # need to create a file buffer to traverse twice through the file
            for l in f:
                if len(l) == 0 or l.startswith('#'):
                    continue
                els = l.split()
                idstr = els[0]
                checkcolumn = ID_COLUMN
                for i in idxset:
                    if self.dataModel.getValueAt(i, checkcolumn) == idstr:
                        self.dataModel.setValueAt(els[1], i, SETTING_COLUMN)
                        idxset.remove(i)

            # remove restore flag for PVs that were missing in the settings file
            for i in idxset:
                self.dataModel.setValueAt(False, i, RESTORE_COL_LOADMODE)

    def parse_setting_pvtable_format(self, fpath):
        with open(fpath, "r") as f:
            idxset = set(range(self.dataModel.getRowCount()))
            lbuf = [
                l for l in f
            ]  # need to create a file buffer to traverse twice through the file
            # parse ID PVNAME mappings if present
            mapping_header_found = False
            pv_to_id = dict()
            for l in lbuf:
                if not mapping_header_found:
                    if l.startswith("### Mapping ID to PV"):
                        mapping_header_found = True
                    continue
                if not l.startswith("# "):
                    continue
                els = l.split()
                idstr = els[1]
                pvstr = " ".join(
                    els[2:]
                )  # tango PVs may contain blanks if additional parameters were included
                pv_to_id[pvstr] = idstr
            # second run through file: fill our table with values read from the file
            for l in lbuf:
                if len(l) == 0 or l.startswith('#'):
                    continue
                els = l.split()
                # default to PVNAME comparison if no PVNAME->ID mapping exists
                idstr = els[0]
                checkcolumn = PV_COLUMN
                # check if mapping exists, and override if so
                if idstr in pv_to_id:
                    idstr = pv_to_id[idstr]  # (set idstr to the mapped ID)
                    checkcolumn = ID_COLUMN  # (tell the following code that ID_COLUMN has to be compared)
                for i in idxset:
                    if self.dataModel.getValueAt(i, checkcolumn) == idstr:
                        self.dataModel.setValueAt(els[1], i, SETTING_COLUMN)
                        idxset.remove(i)

            # remove restore flag for PVs that were missing in the settings file
            for i in idxset:
                self.dataModel.setValueAt(False, i, RESTORE_COL_LOADMODE)

    def do_save(self,
                filepath):  # creates something compatible to older set files
        now = datetime.datetime.now()
        with open(filepath, "w") as f:
            f.write("### ------------------------------------\n")
            f.write("### SETTING saved from CSS\n")
            f.write("### " + now.strftime("Date: %Y-%m-%d   Time: %H:%M") +
                    "\n")
            f.write("### ------------------------------------\n")
            for row_index in range(self.dataModel.getRowCount()):
                IDstr = str(self.dataModel.getValueAt(row_index, ID_COLUMN))
                valstr = str(self.dataModel.getValueAt(row_index,
                                                       VALUE_COLUMN))
                f.write("%s %s\n" % (IDstr, valstr))
            f.write("### Mapping ID to PV\n")
            for row_index in range(self.dataModel.getRowCount()):
                IDstr = str(self.dataModel.getValueAt(row_index, ID_COLUMN))
                PVstr = str(self.dataModel.getValueAt(row_index, PV_COLUMN))
                f.write("# %s %s\n" % (IDstr, PVstr))

    def do_save_pvtableformat(self, filepath):
        now = datetime.datetime.now()
        with open(filepath, "w") as f:
            f.write("# save/restore file generated by CSS PVTable, " +
                    now.strftime("%Y-%m-%d %H:%M:0.0") + "\n")
            for row_index in range(self.dataModel.getRowCount()):
                PVstr = str(self.dataModel.getValueAt(row_index, PV_COLUMN))
                valstr = str(self.dataModel.getValueAt(row_index,
                                                       VALUE_COLUMN))
                f.write("%s %s\n" % (PVstr, valstr))
            f.write("<END>\n")
            f.write("### ------------------------------------\n")
            f.write("### SETTING saved from CSS\n")
            f.write("### " + now.strftime("Date: %Y-%m-%d   Time: %H:%M") +
                    "\n")
            f.write("### ------------------------------------\n")
            f.write("### Mapping ID to PV\n")
            for row_index in range(self.dataModel.getRowCount()):
                IDstr = str(self.dataModel.getValueAt(row_index, ID_COLUMN))
                PVstr = str(self.dataModel.getValueAt(row_index, PV_COLUMN))
                f.write("# %s %s\n" % (IDstr, PVstr))

    def prepare_tabledata(self):
        if self.s == None:
            self.tableData = [['', '', '', '', False]]
        else:
            self.tableData = []
            for l in self.s:
                idstr = l[0]
                pvname = l[1]
                # read PV value
                curval = "---"
                restore_flag = l[2]
                try:
                    ipv = PVUtil.createPV(pvname, self.widget)
                    curval = PVUtil.getString(ipv)
                except:
                    restore_flag = False
                if self.savemode:
                    self.tableData.append(
                        [pvname, idstr, curval, restore_flag])
                else:
                    self.tableData.append(
                        [pvname, idstr, curval, '---', restore_flag])

        if self.savemode:
            self.colNames = TABLE_HEADER_SAVEMODE
        else:
            self.colNames = TABLE_HEADER_LOADMODE

        self.dataModel = MyTableModel(self.tableData,
                                      self.colNames,
                                      savemode=self.savemode)
예제 #2
0
class CTSearchTab(ITab):
    # constructor:
    def __init__(self, callbacks):
        self.callbacks = callbacks
        self._stdout = PrintWriter(callbacks.getStdout(), True)

    # Implement ITab:
    def saveResults(self, e):
        self._stdout.println("Saving results")
        fileChooser = JFileChooser()
        fileChooser.setDialogTitle("Specify the file name")
        userSelection = fileChooser.showSaveDialog(self.getUiComponent())
        if userSelection == JFileChooser.APPROVE_OPTION:
            f = fileChooser.getSelectedFile()
            fileout = open(f, 'w')
            for domain in self.domain_list:
                self._stdout.println("writing ")
                fileout.write("I AM FILE")
            fileout.close()

    def addToScope(self, whatever):
        self._stdout.println("add to scope called")
        rowCount = self.domainTable.getRowCount()
        for row in range(0, rowCount):
            if self.domainTable.getValueAt(row, CHECK_COLUMN) == True:
                domain = self.domainTable.getValueAt(row, DOMAIN_COLUMN)
                domain = domain.replace("*.", "")
                url1 = URL("https://{}/".format(domain))
                if not self.callbacks.isInScope(url1):
                    self.callbacks.includeInScoe(url1)

    def check_address(self, addrblobs):
        for addrblob in addrblobs:
            addr_arr = addrblob.split("|")
            rrow = int(addr_arr[0])
            addr = addr_arr[1]
            try:
                result = InetAddress.getByName(addr)
                yield [rrow, "Success", result]
            except UnknownHostException:
                yield [rrow, "Fail", None]

    def resolveDns(self, event):
        rowCount = self.domainTable.getRowCount()
        dns_check_list = []
        for row in range(0, rowCount):
            if self.domainTable.getValueAt(row, CHECK_COLUMN) == True:
                domain = self.domainTable.getValueAt(row, DOMAIN_COLUMN)
                domain = domain.replace("*.", "")
                domain_string = str(row) + "|" + domain
                dns_check_list.append(domain_string)

        dns_results = self.check_address(dns_check_list)
        for dns_result in dns_results:
            saved_row = dns_result[0]
            if dns_result[1] == "Success":
                self.domainTable.setValueAt("Resolved", saved_row, DNS_COLUMN)
            else:
                self.domainTable.setValueAt("No DNS Record", saved_row,
                                            DNS_COLUMN)

    def getTabCaption(self):
        return "CT Search "

    def getUiComponent(self):
        self.domainTable = JTable(ResourceTableModel())
        self.domainTable.setRowHeight(30)
        #Delete:
        #jcolumnModel = self.domainTable.getColumnModel()

        splitpane = JSplitPane(JSplitPane.VERTICAL_SPLIT)
        topPane = JPanel()
        image_label = HelpLabel(self.callbacks)
        image_label.setHelpIcon("nothing")
        image_label.addMouseListener(ScreenMouseListener(self.callbacks))
        scope_button = JButton("Add Selected Domains To Scope",
                               actionPerformed=self.addToScope)
        dns_button = JButton("Resolve DNS", actionPerformed=self.resolveDns)
        #        search_text = JTextField("")
        saveButton = JButton("Save results", actionPerformed=self.saveResults)
        topPane.add(image_label)
        topPane.add(scope_button)
        topPane.add(dns_button)
        topPane.add(saveButton)
        scrollpane = JScrollPane(self.domainTable)
        splitpane.setTopComponent(topPane)
        splitpane.setBottomComponent(scrollpane)
        return splitpane

    def setDomainList(self, domain_list):
        self.domain_list = domain_list
        tableModel = self.domainTable.getModel()
        n = 0
        dns_ans = "Not Checked"
        for d in domain_list:
            row = [str(n), d, dns_ans, True]
            tableModel.addRow(row)
            n = n + 1