Exemple #1
0
    def __init__(self, parent, close_button=False, error_window=None):
        QFrame.__init__(self, parent)
        self._enabled = True
        toplo = QVBoxLayout(self)
        toplo.setContentsMargins(0, 0, 0, 0)
        toplo.setSpacing(0)

        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        splitter = QSplitter(Qt.Vertical, self)
        toplo.addWidget(splitter)
        splitter.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        splitter.setChildrenCollapsible(False)

        # figure out our app_gui parent
        self._appgui = app_proxy_gui.appgui(parent)

        # create an editor box
        editor_box = QFrame(splitter)
        lo = QVBoxLayout(editor_box)
        lo.setContentsMargins(0, 0, 0, 0)
        lo.setSpacing(0)

        # find main window to associate our toolbar with
        mainwin = parent
        while mainwin and not isinstance(mainwin, QMainWindow):
            mainwin = mainwin.parent()

        self._toolbar = QToolBar(mainwin or self)
        lo.addWidget(self._toolbar)
        self._toolbar.setIconSize(QSize(16, 16))

        #### populate toolbar

        # Exec button and menu
        self._tb_tdlexec = QToolButton(self._toolbar)
        self._toolbar.addWidget(self._tb_tdlexec)
        self._tb_tdlexec.setIcon(pixmaps.gear.icon())
        self._tb_tdlexec.setText("Exec")
        self._tb_tdlexec.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        self._tb_tdlexec.setToolTip(
            "Accesses run-time options & jobs defined by this TDL script")
        self._tb_tdlexec.hide()

        jobs = self._tdlexec_menu = TDLOptionsDialog(self)
        jobs.setWindowTitle("TDL Jobs & Runtime Options")
        jobs.setWindowIcon(pixmaps.gear.icon())
        jobs.hide()
        QObject.connect(self._tb_tdlexec, SIGNAL("clicked()"), jobs.exec_)

        # save menu and button
        self._tb_save = QToolButton(self._toolbar)
        self._toolbar.addWidget(self._tb_save)
        self._tb_save.setIcon(pixmaps.file_save.icon())
        self._tb_save.setToolTip(
            "Saves script. Click on the down-arrow for other options.")

        savemenu = QMenu(self)
        self._tb_save.setMenu(savemenu)
        self._tb_save.setPopupMode(QToolButton.MenuButtonPopup)
        self._tb_save._modified_color = QColor("yellow")
        qa_save = savemenu.addAction(pixmaps.file_save.icon(), "&Save script",
                                     self._save_file)
        qa_save.setShortcut(Qt.ALT + Qt.Key_S)
        QObject.connect(self._tb_save, SIGNAL("clicked()"), self._save_file)
        qa_save_as = savemenu.addAction(
            pixmaps.file_save.icon(), "Save script &as...",
            self.curry(self._save_file, save_as=True))
        qa_revert = self._qa_revert = savemenu.addAction(
            "Revert to saved", self._revert_to_saved)

        # run menu and button

        self._qa_run = self._toolbar.addAction(
            pixmaps.blue_round_reload.icon(), "&Save & reload",
            self._import_main_file)
        self._qa_run.setShortcut(Qt.ALT + Qt.Key_R)

        # Compile-time options and menu
        self._tb_opts = QToolButton(self._toolbar)
        self._toolbar.addWidget(self._tb_opts)
        self._tb_opts.setIcon(pixmaps.wrench.icon())
        self._tb_opts.setText("Options")
        self._tb_opts.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        self._tb_opts.setToolTip(
            "Accesses compile-time options for this TDL script")
        # self._tb_opts.hide();

        opts = self._options_menu = TDLOptionsDialog(
            self, ok_label="Compile", ok_icon=pixmaps.blue_round_reload)
        opts.setWindowTitle("TDL Compile-time Options")
        opts.setWindowIcon(pixmaps.wrench.icon())
        QObject.connect(opts, PYSIGNAL("accepted()"), self._compile_main_file)
        QObject.connect(TDLOptions.OptionObject, SIGNAL("mandatoryOptionsSet"),
                        self.mark_mandatory_options_set)
        opts.hide()
        QObject.connect(self._tb_opts, SIGNAL("clicked()"), opts.show)
        # cross-connect the rereshProfiles() signals, so that dialogs can update each other's
        # profile menus
        QObject.connect(self._options_menu, PYSIGNAL("refreshProfiles()"),
                        self._tdlexec_menu.refresh_profiles)
        QObject.connect(self._tdlexec_menu, PYSIGNAL("refreshProfiles()"),
                        self._options_menu.refresh_profiles)

        self._toolbar.addSeparator()

        # cursor position indicator
        self._poslabel = QLabel(self._toolbar)
        #wa = QWidgetAction(self._toolbar);
        #wa.setDefaultWidget(self._poslabel);
        #self._toolbar.addAction(wa);
        #self._toolbar.addWidget(self._poslabel);
        self._toolbar.addWidget(self._poslabel)
        width = self._poslabel.fontMetrics().width("L:999 C:999")
        self._poslabel.setMinimumWidth(width)
        self._poslabel.setText("L:0 C:0")

        # filename indicator
        self._pathlabel = QLabel(self._toolbar)
        #wa = QWidgetAction(self._toolbar);
        #wa.setDefaultWidget(self._pathlabel);
        self._toolbar.addWidget(self._pathlabel)
        #self._toolbar.addAction(wa);
        self._pathlabel.show()
        self._pathlabel.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        self._pathlabel.setIndent(10)
        self._pathlabel.setSizePolicy(QSizePolicy.Expanding,
                                      QSizePolicy.Minimum)
        if close_button:
            if not isinstance(close_button, QIcon):
                close_button = pixmaps.remove.icon()
            self._qa_close = self._toolbar.addAction(close_button,
                                                     "&Close file",
                                                     self._file_closed)
            self._qa_close.setShortcut(Qt.ALT + Qt.Key_W)
        self._pathlabel.setText("(no file)")

        #### add editor window

        self._editor = editor = QTextEdit(editor_box)
        lo.addWidget(self._editor)
        editor.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        editor.setAcceptRichText(False)
        editor.setLineWrapMode(QTextEdit.NoWrap)
        self._document = QTextDocument(self)
        editor.setDocument(self._document)
        QObject.connect(self._document, SIGNAL("modificationChanged(bool)"),
                        self._text_modified)
        QObject.connect(self._editor, SIGNAL("cursorPositionChanged()"),
                        self._display_cursor_position)
        # QObject.connect(self._editor,SIGNAL("textChanged()"),self._clear_transients);

        # add character formats for error display
        self._format_error = QTextCharFormat(self._editor.currentCharFormat())
        self._format_error.setBackground(QBrush(QColor("lightpink")))
        self._format_suberror = QTextCharFormat(
            self._editor.currentCharFormat())
        self._format_suberror.setBackground(QBrush(QColor("lightgrey")))
        self._format_current_error = QTextCharFormat(
            self._editor.currentCharFormat())
        self._format_current_error.setBackground(QBrush(QColor("orangered")))

        # add message window
        self._message_box = QFrame(editor_box)
        lo.addWidget(self._message_box)
        self._message_box.setSizePolicy(QSizePolicy.Expanding,
                                        QSizePolicy.Preferred)
        self._message_box.setFrameStyle(QFrame.Panel + QFrame.Sunken)
        self._message_box.setLineWidth(2)
        mblo = QVBoxLayout(self._message_box)
        mblo.setContentsMargins(0, 0, 0, 0)
        msgb1 = QHBoxLayout()
        mblo.addLayout(msgb1)
        msgb1.setContentsMargins(0, 0, 0, 0)
        msgb1.setSpacing(0)
        self._message_icon = QToolButton(self._message_box)
        msgb1.addWidget(self._message_icon)
        self._message = QLabel(self._message_box)
        msgb1.addWidget(self._message)
        self._message.setTextFormat(Qt.RichText)
        self._message.setWordWrap(True)
        self._message.setMargin(0)
        self._message.setSizePolicy(QSizePolicy.Expanding,
                                    QSizePolicy.Preferred)
        # self._message_icon.setAlignment(Qt.AlignTop);
        # self._message_icon.setMargin(4);
        self._message_icon.setAutoRaise(True)
        self._message_icon.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        QObject.connect(self._message_icon, SIGNAL("clicked()"),
                        self.clear_message)
        self._message_icon.setToolTip("Click here to clear the message")
        self._message_widgets = []
        self._message_transient = False

        # figure out if we already have an error box to attach to
        self._error_window = error_window or getattr(
            parent, '_tdlgui_error_window', None)
        if self._error_window:
            #self._resize_errwin = False;
            pass
        else:
            # otherwise create an error floater
            self._error_window = TDLErrorFloat(parent)
            setattr(parent, '_tdlgui_error_window', self._error_window)
            # self._resize_errwin = True;
        QObject.connect(self._error_window, PYSIGNAL("hasErrors()"),
                        self._reset_errors)
        QObject.connect(self._error_window, PYSIGNAL("showError()"),
                        self.show_error)

        # set filename
        self._filename = None
        # "official" path of file (None if new script not yet saved)
        self._mainfile = None
        # if not None, then we're "slaved" to a main file (see below)
        self._file_disktime = None
        # modtime on disk when file was loaded
        self._basename = None
        self._modified = False
        self._closed = False
        self._error_at_line = {}
        self._is_tree_in_sync = True
        self._pub_nodes = None
Exemple #2
0
    def __init__(self, parent, name):
        self._wtop = wtop = QWidget(parent)
        self._wtop_lo = wtop_lo = QVBoxLayout(self._wtop)
        wtop_lo.setContentsMargins(0, 0, 0, 0)
        wtop_lo.setSpacing(0)
        self._appgui = app_proxy_gui.appgui(parent)

        # find main window to associate our toolbar with
        self._toolbar = QToolBar("Profiler tools", wtop)
        wtop_lo.addWidget(self._toolbar)
        self._toolbar.setIconSize(QSize(16, 16))
        self._toolbar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)

        ## COLLECT button
        self._qa_collect = self._toolbar.addAction(pixmaps.refresh.icon(),
                                                   "Collect",
                                                   self.collect_stats)
        self._qa_collect.setToolTip("Collect profiling stats from meqserver")

        #self._tb_collect = QToolButton(self._toolbar);
        #self._tb_collect.setIcon(pixmaps.refresh.icon());
        #self._tb_collect.setText("Collect");
        #self._tb_collect.setToolButtonStyle(Qt.ToolButtonTextBesideIcon);
        #self._tb_collect.setToolTip("Collect profiling stats from meqserver");
        #QObject.connect(self._tb_collect,SIGNAL("clicked()"),self.collect_stats);

        ## RESET button
        qa_reset = self._toolbar.addAction(pixmaps.grey_round_cross.icon(),
                                           "Reset", self.reset_stats)
        qa_reset.setToolTip("Reset meqserver's profiling stats")

        #tb_reset = QToolButton(self._toolbar);
        #tb_reset.setIcon(pixmaps.grey_round_cross.icon());
        #tb_reset.setText("Reset");
        #tb_reset.setToolButtonStyle(Qt.ToolButtonTextBesideIcon);
        #tb_reset.setToolTip("Reset meqserver's profiling stats");
        #QObject.connect(tb_reset,SIGNAL("clicked()"),self.reset_stats);

        ## label
        self._label = QLabel(self._toolbar)
        self._toolbar.addWidget(self._label)
        # self._toolbar.setStretchableWidget(self._label);
        self._label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        self._label.setIndent(20)

        ## listview
        self._tw = QTreeWidget(wtop)
        wtop_lo.addWidget(self._tw)
        self._tw.setHeaderLabels([
            '',
            '',
            # profiling columns
            'Exec',
            '#',
            'avg',
            'Ch/x',
            '#',
            'avg',
            'Own',
            '#',
            'avg',
            # all cache columns
            'Rq all',
            'c/hit',
            'c/m',
            'c/-',
            '+C',
            '++C',
            # new cache columns
            'Rq new',
            'c/hit',
            'c/m',
            'c/-',
            '+C',
            '++C'
        ])
        self._tw.setRootIsDecorated(True)
        self._tw.setAllColumnsShowFocus(True)
        self._tw.setSortingEnabled(True)
        self._tw.header().setResizeMode(QHeaderView.ResizeToContents)
        self._tw.header().setMovable(False)
        self._tw.header().setDefaultAlignment(Qt.AlignRight)
        QObject.connect(self._tw, SIGNAL('itemExpanded(QTreeWidgetItem*)'),
                        self._expand_item)
        #    for col in range(1,self._tw.columns()):
        #      self._tw.setColumnAlignment(col,Qt.AlignRight);

        ## subscribe to nodelist changes
        meqds.subscribe_nodelist(self._process_nodelist)
  def __init__ (self,parent,close_button=False,error_window=None):
    QFrame.__init__(self,parent);
    self._enabled = True;
    toplo = QVBoxLayout(self);
    toplo.setContentsMargins(0,0,0,0);
    toplo.setSpacing(0);

    self.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding);
    splitter = QSplitter(Qt.Vertical,self);
    toplo.addWidget(splitter);
    splitter.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding);
    splitter.setChildrenCollapsible(False);

    # figure out our app_gui parent
    self._appgui = app_proxy_gui.appgui(parent);

    # create an editor box
    editor_box = QFrame(splitter);
    lo = QVBoxLayout(editor_box);
    lo.setContentsMargins(0,0,0,0);
    lo.setSpacing(0);

    # find main window to associate our toolbar with
    mainwin = parent;
    while mainwin and not isinstance(mainwin,QMainWindow):
      mainwin = mainwin.parent();

    self._toolbar = QToolBar(mainwin or self);
    lo.addWidget(self._toolbar);
    self._toolbar.setIconSize(QSize(16,16));

    #### populate toolbar

    # Exec button and menu
    self._tb_tdlexec = QToolButton(self._toolbar);
    self._toolbar.addWidget(self._tb_tdlexec);
    self._tb_tdlexec.setIcon(pixmaps.gear.icon());
    self._tb_tdlexec.setText("Exec");
    self._tb_tdlexec.setToolButtonStyle(Qt.ToolButtonTextBesideIcon);
    self._tb_tdlexec.setToolTip("Accesses run-time options & jobs defined by this TDL script");
    self._tb_tdlexec.hide();

    jobs = self._tdlexec_menu = TDLOptionsDialog(self);
    jobs.setWindowTitle("TDL Jobs & Runtime Options");
    jobs.setWindowIcon(pixmaps.gear.icon());
    jobs.hide();
    QObject.connect(self._tb_tdlexec,SIGNAL("clicked()"),jobs.exec_);

    # save menu and button
    self._tb_save = QToolButton(self._toolbar);
    self._toolbar.addWidget(self._tb_save);
    self._tb_save.setIcon(pixmaps.file_save.icon());
    self._tb_save.setToolTip("Saves script. Click on the down-arrow for other options.");

    savemenu = QMenu(self);
    self._tb_save.setMenu(savemenu);
    self._tb_save.setPopupMode(QToolButton.MenuButtonPopup);
    self._tb_save._modified_color = QColor("yellow");
    qa_save = savemenu.addAction(pixmaps.file_save.icon(),"&Save script",self._save_file);
    qa_save.setShortcut(Qt.ALT+Qt.Key_S);
    QObject.connect(self._tb_save,SIGNAL("clicked()"),self._save_file);
    qa_save_as = savemenu.addAction(pixmaps.file_save.icon(),"Save script &as...",
                                     self.curry(self._save_file,save_as=True));
    qa_revert = self._qa_revert = savemenu.addAction("Revert to saved",self._revert_to_saved);

    # run menu and button

    self._qa_run = self._toolbar.addAction(pixmaps.blue_round_reload.icon(),
                              "&Save & reload",self._import_main_file);
    self._qa_run.setShortcut(Qt.ALT+Qt.Key_R);

    # Compile-time options and menu
    self._tb_opts = QToolButton(self._toolbar);
    self._toolbar.addWidget(self._tb_opts);
    self._tb_opts.setIcon(pixmaps.wrench.icon());
    self._tb_opts.setText("Options");
    self._tb_opts.setToolButtonStyle(Qt.ToolButtonTextBesideIcon);
    self._tb_opts.setToolTip("Accesses compile-time options for this TDL script");
    # self._tb_opts.hide();

    opts = self._options_menu = TDLOptionsDialog(self,ok_label="Compile",ok_icon=pixmaps.blue_round_reload);
    opts.setWindowTitle("TDL Compile-time Options");
    opts.setWindowIcon(pixmaps.wrench.icon());
    QObject.connect(opts,PYSIGNAL("accepted()"),self._compile_main_file);
    QObject.connect(TDLOptions.OptionObject,SIGNAL("mandatoryOptionsSet"),self.mark_mandatory_options_set);
    opts.hide();
    QObject.connect(self._tb_opts,SIGNAL("clicked()"),opts.show);
    # cross-connect the rereshProfiles() signals, so that dialogs can update each other's
    # profile menus
    QObject.connect(self._options_menu,PYSIGNAL("refreshProfiles()"),self._tdlexec_menu.refresh_profiles);
    QObject.connect(self._tdlexec_menu,PYSIGNAL("refreshProfiles()"),self._options_menu.refresh_profiles);

    self._toolbar.addSeparator();

    # cursor position indicator
    self._poslabel = QLabel(self._toolbar);
    #wa = QWidgetAction(self._toolbar);
    #wa.setDefaultWidget(self._poslabel);
    #self._toolbar.addAction(wa);
    #self._toolbar.addWidget(self._poslabel);
    self._toolbar.addWidget(self._poslabel);
    width = self._poslabel.fontMetrics().width("L:999 C:999");
    self._poslabel.setMinimumWidth(width);
    self._poslabel.setText("L:0 C:0");

    # filename indicator
    self._pathlabel = QLabel(self._toolbar);
    #wa = QWidgetAction(self._toolbar);
    #wa.setDefaultWidget(self._pathlabel);
    self._toolbar.addWidget(self._pathlabel);
    #self._toolbar.addAction(wa);
    self._pathlabel.show();
    self._pathlabel.setAlignment(Qt.AlignRight|Qt.AlignVCenter);
    self._pathlabel.setIndent(10);
    self._pathlabel.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Minimum);
    if close_button:
      if not isinstance(close_button,QIcon):
        close_button = pixmaps.remove.icon();
      self._qa_close = self._toolbar.addAction(close_button,"&Close file",self._file_closed);
      self._qa_close.setShortcut(Qt.ALT+Qt.Key_W);
    self._pathlabel.setText("(no file)");

    #### add editor window

    self._editor = editor = QTextEdit(editor_box);
    lo.addWidget(self._editor);
    editor.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding);
    editor.setAcceptRichText(False);
    editor.setLineWrapMode(QTextEdit.NoWrap);
    self._document = QTextDocument(self);
    editor.setDocument(self._document);
    QObject.connect(self._document,SIGNAL("modificationChanged(bool)"),self._text_modified);
    QObject.connect(self._editor,SIGNAL("cursorPositionChanged()"),self._display_cursor_position);
    # QObject.connect(self._editor,SIGNAL("textChanged()"),self._clear_transients);

    # add character formats for error display
    self._format_error = QTextCharFormat(self._editor.currentCharFormat());
    self._format_error.setBackground(QBrush(QColor("lightpink")));
    self._format_suberror = QTextCharFormat(self._editor.currentCharFormat());
    self._format_suberror.setBackground(QBrush(QColor("lightgrey")));
    self._format_current_error = QTextCharFormat(self._editor.currentCharFormat());
    self._format_current_error.setBackground(QBrush(QColor("orangered")));

    # add message window
    self._message_box = QFrame(editor_box);
    lo.addWidget(self._message_box);
    self._message_box.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Preferred);
    self._message_box.setFrameStyle(QFrame.Panel+QFrame.Sunken);
    self._message_box.setLineWidth(2);
    mblo = QVBoxLayout(self._message_box);
    mblo.setContentsMargins(0,0,0,0);
    msgb1 = QHBoxLayout();
    mblo.addLayout(msgb1);
    msgb1.setContentsMargins(0,0,0,0);
    msgb1.setSpacing(0);
    self._message_icon = QToolButton(self._message_box);
    msgb1.addWidget(self._message_icon);
    self._message = QLabel(self._message_box);
    msgb1.addWidget(self._message);
    self._message.setTextFormat(Qt.RichText);
    self._message.setWordWrap(True);
    self._message.setMargin(0);
    self._message.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Preferred);
    # self._message_icon.setAlignment(Qt.AlignTop);
    # self._message_icon.setMargin(4);
    self._message_icon.setAutoRaise(True);
    self._message_icon.setSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed);
    QObject.connect(self._message_icon,SIGNAL("clicked()"),self.clear_message);
    self._message_icon.setToolTip("Click here to clear the message");
    self._message_widgets = [];
    self._message_transient = False;

    # figure out if we already have an error box to attach to
    self._error_window = error_window or getattr(parent,'_tdlgui_error_window',None);
    if self._error_window:
      #self._resize_errwin = False;
      pass;
    else:
      # otherwise create an error floater
      self._error_window = TDLErrorFloat(parent);
      setattr(parent,'_tdlgui_error_window',self._error_window);
      # self._resize_errwin = True;
    QObject.connect(self._error_window,PYSIGNAL("hasErrors()"),self._reset_errors);
    QObject.connect(self._error_window,PYSIGNAL("showError()"),self.show_error);

    # set filename
    self._filename = None;       # "official" path of file (None if new script not yet saved)
    self._mainfile = None;       # if not None, then we're "slaved" to a main file (see below)
    self._file_disktime = None;  # modtime on disk when file was loaded
    self._basename = None;
    self._modified = False;
    self._closed = False;
    self._error_at_line = {};
    self._is_tree_in_sync = True;
    self._pub_nodes = None;
  def __init__ (self,parent,name):
    self._wtop = wtop = QWidget(parent);
    self._wtop_lo = wtop_lo = QVBoxLayout(self._wtop);
    wtop_lo.setContentsMargins(0,0,0,0);
    wtop_lo.setSpacing(0);
    self._appgui = app_proxy_gui.appgui(parent);
    
    # find main window to associate our toolbar with
    self._toolbar = QToolBar("Profiler tools",wtop);
    wtop_lo.addWidget(self._toolbar);
    self._toolbar.setIconSize(QSize(16,16));
    self._toolbar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon);
    
    ## COLLECT button
    self._qa_collect = self._toolbar.addAction(pixmaps.refresh.icon(),"Collect",self.collect_stats);
    self._qa_collect.setToolTip("Collect profiling stats from meqserver");

    #self._tb_collect = QToolButton(self._toolbar);
    #self._tb_collect.setIcon(pixmaps.refresh.icon());
    #self._tb_collect.setText("Collect");
    #self._tb_collect.setToolButtonStyle(Qt.ToolButtonTextBesideIcon);
    #self._tb_collect.setToolTip("Collect profiling stats from meqserver");
    #QObject.connect(self._tb_collect,SIGNAL("clicked()"),self.collect_stats);
   
    ## RESET button
    qa_reset = self._toolbar.addAction(pixmaps.grey_round_cross.icon(),"Reset",self.reset_stats);
    qa_reset.setToolTip("Reset meqserver's profiling stats");

    #tb_reset = QToolButton(self._toolbar);
    #tb_reset.setIcon(pixmaps.grey_round_cross.icon());
    #tb_reset.setText("Reset");
    #tb_reset.setToolButtonStyle(Qt.ToolButtonTextBesideIcon);
    #tb_reset.setToolTip("Reset meqserver's profiling stats");
    #QObject.connect(tb_reset,SIGNAL("clicked()"),self.reset_stats);
    
    ## label     
    self._label = QLabel(self._toolbar);
    self._toolbar.addWidget(self._label);
    # self._toolbar.setStretchableWidget(self._label);
    self._label.setAlignment(Qt.AlignRight|Qt.AlignVCenter);
    self._label.setIndent(20);
    
    ## listview
    self._tw = QTreeWidget(wtop);
    wtop_lo.addWidget(self._tw);
    self._tw.setHeaderLabels(['','',
    # profiling columns
         'Exec',
         '#',
         'avg',
         'Ch/x',
         '#',
         'avg',
         'Own',
         '#',
         'avg',
    # all cache columns
         'Rq all',
         'c/hit',
         'c/m',
         'c/-',
         '+C',
         '++C',
    # new cache columns
         'Rq new',
         'c/hit',
         'c/m',
         'c/-',
         '+C',
         '++C'
      ]);
    self._tw.setRootIsDecorated(True);
    self._tw.setAllColumnsShowFocus(True);
    self._tw.setSortingEnabled(True);
    self._tw.header().setResizeMode(QHeaderView.ResizeToContents);
    self._tw.header().setMovable(False);
    self._tw.header().setDefaultAlignment(Qt.AlignRight);
    QObject.connect(self._tw,SIGNAL('itemExpanded(QTreeWidgetItem*)'),self._expand_item);
#    for col in range(1,self._tw.columns()):
#      self._tw.setColumnAlignment(col,Qt.AlignRight);
    
    ## subscribe to nodelist changes
    meqds.subscribe_nodelist(self._process_nodelist);