summaryrefslogtreecommitdiffstats
path: root/src/libgui/breakpoint_view.cpp
blob: 6f49aac85e82c7ecc5cbebe7d6a6e503617def40 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/***************************************************************************
 *   Copyright (C) 2006 Nicolas Hadacek <hadacek@kde.org>                  *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 ***************************************************************************/
#include "breakpoint_view.h"

#include <qlayout.h>
#include <klocale.h>
#include <qpopupmenu.h>

#include "main_global.h"
#include "editor_manager.h"
#include "coff/base/text_coff.h"
#include "gui_debug_manager.h"

//----------------------------------------------------------------------------
void Breakpoint::updateActions(const Data *data)
{
  bool hasBreakpoint = (data ? Breakpoint::list().contains(*data) : false);
  Main::action("toggle_breakpoint")->setText(hasBreakpoint ? i18n("Remove breakpoint") : i18n("Set breakpoint"));
  Main::action("toggle_breakpoint")->setEnabled(data);
  bool isActive = (hasBreakpoint ? Breakpoint::list().state(*data)==Breakpoint::Active : false);
  Main::action("enable_breakpoint")->setText(!isActive ? i18n("Enable breakpoint") : i18n("Disable breakpoint"));
  Main::action("enable_breakpoint")->setEnabled(Debugger::manager->coff() && hasBreakpoint);
}

//----------------------------------------------------------------------------
Breakpoint::ListViewItem::ListViewItem(ListView *parent, const Data &data)
  : KListViewItem(parent), _data(data)
{}

//----------------------------------------------------------------------------
Breakpoint::View::View(QWidget *parent)
  : QWidget(parent, "breakpoints_view"), GenericView(Breakpoint::list()),
    _currentData(0)
{
  QVBoxLayout *top = new QVBoxLayout(this);
  _listview = new ListView(this);
  connect(_listview, SIGNAL(clicked(QListViewItem *)), SLOT(itemClicked(QListViewItem *)));
  connect(_listview, SIGNAL(contextMenuRequested(QListViewItem *, const QPoint &, int)),
          SLOT(contextMenu(QListViewItem *, const QPoint &, int)));
  _listview->setAllColumnsShowFocus(true);
  _listview->addColumn(i18n("Status"));
  _listview->addColumn(i18n("Location"));
  _listview->addColumn(i18n("Address"));
  top->addWidget(_listview);
}

void Breakpoint::View::updateView()
{
  // #### flickering...
  _listview->clear();
  for (uint i=0; i<Breakpoint::list().count(); i++) {
    const Data &data = Breakpoint::list().data(i);
    KListViewItem *item = new ListViewItem(_listview, data);
    item->setPixmap(0, TextEditor::pixmap(Debugger::manager->breakpointType(data)));
    item->setText(1, data.url.filename() + ":" + QString::number(data.line));
    Address address = Breakpoint::list().address(data);
    if ( address.isValid() ) item->setText(2, toHexLabelAbs(address));
    else if ( Debugger::manager->coff() ) item->setText(2, i18n("Non-code breakpoint"));
    else item->setText(2, "---");
  }
}

void Breakpoint::View::itemClicked(QListViewItem *item)
{
  if ( item==0 ) return;
  const Data &data = static_cast<ListViewItem *>(item)->data();
  Address address = Breakpoint::list().address(data);
  TextEditor *editor = ::qt_cast<TextEditor *>(Main::currentEditor());
  const Coff::TextObject *coff = Debugger::manager->coff();
  int line = -1;
  if ( coff && editor && editor->fileType()==PURL::Coff && address.isValid() )
    line = coff->lineForAddress(editor->url(), address);
  if ( line==-1 ) {
    editor = ::qt_cast<TextEditor *>(Main::editorManager().openEditor(data.url));
    line = data.line;
  }
  if ( editor==0 ) return;
  editor->show();
  editor->setCursor(line, 0);
}

void Breakpoint::View::contextMenu(QListViewItem *item, const QPoint &pos, int)
{
  _currentData = (item ? &static_cast<ListViewItem *>(item)->data() : 0);
  updateActions(_currentData);
  Main::popup("breakpoint_context_menu").exec(pos);
  _currentData = 0;
}