• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdevelop API Reference
  • KDE Home
  • Contact Us
 

kdevelop/kdevplatform/debugger

  • extragear
  • kdevelop
  • kdevelop
  • kdevplatform
  • debugger
  • breakpoint
breakpoint.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE project
2  Copyright (C) 2002 Matthias Hoelzer-Kluepfel <[email protected]>
3  Copyright (C) 2002 John Firebaugh <[email protected]>
4  Copyright (C) 2006, 2008 Vladimir Prus <[email protected]>
5  Copyright (C) 2007 Hamish Rodda <[email protected]>
6 
7  This library is free software; you can redistribute it and/or
8  modify it under the terms of the GNU Library General Public
9  License as published by the Free Software Foundation; either
10  version 2 of the License, or (at your option) any later version.
11 
12  This library is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  Library General Public License for more details.
16 
17  You should have received a copy of the GNU Library General Public License
18  along with this library; see the file COPYING.LIB.
19  If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #include "breakpoint.h"
23 
24 #include <QIcon>
25 
26 #include <KLocalizedString>
27 #include <KConfigGroup>
28 
29 #include "breakpointmodel.h"
30 
31 #include <array>
32 
33 using namespace KDevelop;
34 
35 static const std::array<QString, Breakpoint::LastBreakpointKind> BREAKPOINT_KINDS = {
36  QStringLiteral("Code"),
37  QStringLiteral("Write"),
38  QStringLiteral("Read"),
39  QStringLiteral("Access"),
40 };
41 
42 static Breakpoint::BreakpointKind stringToKind(const QString& kindString)
43 {
44  for (int i = 0; i < Breakpoint::LastBreakpointKind; ++i) {
45  if (kindString == BREAKPOINT_KINDS[i]) {
46  return (Breakpoint::BreakpointKind)i;
47  }
48  }
49  return Breakpoint::CodeBreakpoint;
50 }
51 
52 Breakpoint::Breakpoint(BreakpointModel *model, BreakpointKind kind)
53  : m_model(model), m_enabled(true)
54  , m_deleted(false)
55  , m_state(NotStartedState)
56  , m_kind(kind)
57  , m_line(-1)
58  , m_movingCursor(nullptr)
59  , m_hitCount(0)
60  , m_ignoreHits(0)
61 {
62  if (model) {
63  model->registerBreakpoint(this);
64  }
65 }
66 
67 Breakpoint::Breakpoint(BreakpointModel *model, const KConfigGroup& config)
68  : m_model(model), m_enabled(true)
69  , m_deleted(false)
70  , m_state(NotStartedState)
71  , m_line(-1)
72  , m_movingCursor(nullptr)
73  , m_hitCount(0)
74  , m_ignoreHits(0)
75 {
76  if (model) {
77  model->registerBreakpoint(this);
78  }
79 
80  m_kind = stringToKind(config.readEntry("kind", ""));
81  m_enabled = config.readEntry("enabled", false);
82  m_url = config.readEntry("url", QUrl());
83  m_line = config.readEntry("line", -1);
84  m_expression = config.readEntry("expression", QString());
85  setCondition(config.readEntry("condition", ""));
86  setIgnoreHits(config.readEntry("ignoreHits", 0));
87 }
88 
89 BreakpointModel *Breakpoint::breakpointModel()
90 {
91  return m_model;
92 }
93 
94 bool Breakpoint::setData(int index, const QVariant& value)
95 {
96  if (index == EnableColumn)
97  {
98  m_enabled = static_cast<Qt::CheckState>(value.toInt()) == Qt::Checked;
99  }
100 
101  if (index == LocationColumn || index == ConditionColumn)
102  {
103  QString s = value.toString();
104  if (index == LocationColumn) {
105  QRegExp rx(QStringLiteral("^(.+):([0-9]+)$"));
106  int idx = rx.indexIn(s);
107  if (m_kind == CodeBreakpoint && idx != -1) {
108  m_url = QUrl::fromLocalFile(rx.cap(1));
109  m_line = rx.cap(2).toInt() - 1;
110  m_expression.clear();
111  } else {
112  m_expression = s;
113  m_url.clear();
114  m_line = -1;
115  }
116  } else {
117  m_condition = s;
118  }
119  }
120 
121  reportChange(static_cast<Column>(index));
122 
123  return true;
124 }
125 
126 QVariant Breakpoint::data(int column, int role) const
127 {
128  if (column == EnableColumn)
129  {
130  if (role == Qt::CheckStateRole)
131  return m_enabled ? Qt::Checked : Qt::Unchecked;
132  else if (role == Qt::DisplayRole)
133  return QVariant();
134  else
135  return QVariant();
136  }
137 
138  if (column == StateColumn)
139  {
140  if (role == Qt::DecorationRole) {
141  if (!errorText().isEmpty()) {
142  return QIcon::fromTheme(QStringLiteral("dialog-warning"));
143  }
144  switch (state()) {
145  case NotStartedState:
146  return QVariant();
147  case DirtyState:
148  return QIcon::fromTheme(QStringLiteral("system-switch-user"));
149  case PendingState:
150  return QIcon::fromTheme(QStringLiteral("help-contents"));
151  case CleanState:
152  return QIcon::fromTheme(QStringLiteral("dialog-ok-apply"));
153  }
154  } else if (role == Qt::ToolTipRole) {
155  if (!errorText().isEmpty()) {
156  return i18nc("@info:tooltip", "Error");
157  }
158  switch (state()) {
159  case NotStartedState:
160  return QString();
161  case DirtyState:
162  return i18nc("@info:tooltip", "Dirty");
163  case PendingState:
164  return i18nc("@info:tooltip", "Pending");
165  case CleanState:
166  return i18nc("@info:tooltip", "Clean");
167  }
168  } else if (role == Qt::DisplayRole) {
169  return QVariant();
170  }
171  return QVariant();
172  }
173 
174  if (column == TypeColumn && role == Qt::DisplayRole)
175  {
176  return BREAKPOINT_KINDS[m_kind];
177  }
178 
179  if (column == ConditionColumn && (role == Qt::DisplayRole || role == Qt::EditRole)) {
180  return m_condition;
181  }
182 
183  if (column == LocationColumn) {
184  if (role == LocationRole || role == Qt::EditRole || role == Qt::ToolTipRole || role == Qt::DisplayRole) {
185  QString ret;
186  if (m_kind == CodeBreakpoint && m_line != -1) {
187  if (role == Qt::DisplayRole) {
188  ret = m_url.fileName();
189  } else {
190  ret = m_url.toDisplayString(QUrl::PreferLocalFile | QUrl::StripTrailingSlash);
191  }
192  ret += QLatin1Char(':') + QString::number(m_line+1);
193  } else {
194  ret = m_expression;
195  }
196  //FIXME: there should be proper columns for function name and address.
197  if (!m_address.isEmpty() && role == Qt::DisplayRole) {
198  ret = i18nc("location (address)", "%1 (%2)", ret, m_address);
199  }
200  return ret;
201  }
202  }
203 
204  return QVariant();
205 }
206 
207 void Breakpoint::setDeleted()
208 {
209  m_deleted = true;
210  BreakpointModel* m = breakpointModel();
211  if (!m)
212  return; // already removed
213 
214  if (m->breakpointIndex(this, 0).isValid()) {
215  m->removeRow(m->breakpointIndex(this, 0).row());
216  }
217  m_model = nullptr; // invalidate
218 }
219 
220 int Breakpoint::line() const {
221  return m_line;
222 }
223 void Breakpoint::setLine(int line) {
224  Q_ASSERT(m_kind == CodeBreakpoint);
225  m_line = line;
226  reportChange(LocationColumn);
227 }
228 void Breakpoint::setUrl(const QUrl& url) {
229  Q_ASSERT(m_kind == CodeBreakpoint);
230  Q_ASSERT(url.isEmpty() || (!url.isRelative() && !url.fileName().isEmpty()));
231  m_url = url;
232  reportChange(LocationColumn);
233 }
234 QUrl Breakpoint::url() const {
235  return m_url;
236 }
237 void Breakpoint::setLocation(const QUrl& url, int line)
238 {
239  Q_ASSERT(m_kind == CodeBreakpoint);
240  Q_ASSERT(url.isEmpty() || (!url.isRelative() && !url.fileName().isEmpty()));
241  m_url = url;
242  m_line = line;
243  reportChange(LocationColumn);
244 }
245 
246 QString KDevelop::Breakpoint::location() {
247  return data(LocationColumn, LocationRole).toString();
248 }
249 
250 
251 void Breakpoint::save(KConfigGroup& config)
252 {
253  config.writeEntry("kind", BREAKPOINT_KINDS[m_kind]);
254  config.writeEntry("enabled", m_enabled);
255  config.writeEntry("url", m_url);
256  config.writeEntry("line", m_line);
257  config.writeEntry("expression", m_expression);
258  config.writeEntry("condition", m_condition);
259  config.writeEntry("ignoreHits", m_ignoreHits);
260 }
261 
262 Breakpoint::BreakpointKind Breakpoint::kind() const
263 {
264  return m_kind;
265 }
266 
267 void Breakpoint::setAddress(const QString& address)
268 {
269  m_address = address;
270  //reportChange();
271 }
272 
273 QString Breakpoint::address() const
274 {
275  return m_address;
276 }
277 
278 int Breakpoint::hitCount() const
279 {
280  return m_hitCount;
281 }
282 
283 bool Breakpoint::deleted() const
284 {
285  return m_deleted;
286 }
287 
288 bool Breakpoint::enabled() const
289 {
290  return data(EnableColumn, Qt::CheckStateRole).toBool();
291 }
292 
293 void KDevelop::Breakpoint::setMovingCursor(KTextEditor::MovingCursor* cursor) {
294  m_movingCursor = cursor;
295 }
296 KTextEditor::MovingCursor* KDevelop::Breakpoint::movingCursor() const {
297  return m_movingCursor;
298 }
299 
300 void Breakpoint::setIgnoreHits(int c)
301 {
302  if (m_ignoreHits != c) {
303  m_ignoreHits = c;
304  reportChange(IgnoreHitsColumn);
305  }
306 }
307 
308 int Breakpoint::ignoreHits() const
309 {
310  return m_ignoreHits;
311 }
312 
313 
314 void Breakpoint::setCondition(const QString& c)
315 {
316  if (c != m_condition) {
317  m_condition = c;
318  reportChange(ConditionColumn);
319  }
320 }
321 
322 QString Breakpoint::condition() const
323 {
324  return m_condition;
325 }
326 
327 void Breakpoint::setExpression(const QString& e)
328 {
329  if (e != m_expression) {
330  m_expression = e;
331  reportChange(LocationColumn);
332  }
333 }
334 
335 QString Breakpoint::expression() const
336 {
337  return m_expression;
338 }
339 
340 Breakpoint::BreakpointState Breakpoint::state() const
341 {
342  return m_state;
343 }
344 
345 QString Breakpoint::errorText() const
346 {
347  return m_errorText;
348 }
349 
350 void KDevelop::Breakpoint::reportChange(Column c)
351 {
352  if (!breakpointModel())
353  return;
354 
355  breakpointModel()->reportChange(this, c);
356 }
KDevelop::Breakpoint::ignoreHits
int ignoreHits() const
Definition: breakpoint.cpp:308
KDevelop::Breakpoint::save
void save(KConfigGroup &config)
Definition: breakpoint.cpp:251
QRegExp::cap
QString cap(int nth) const
QUrl::clear
void clear()
KDevelop::Breakpoint::reportChange
void reportChange(Column c)
Definition: breakpoint.cpp:350
KDevelop::Breakpoint::m_deleted
bool m_deleted
Definition: breakpoint.h:129
KDevelop::Breakpoint::state
BreakpointState state() const
Definition: breakpoint.cpp:340
KDevelop::Breakpoint::m_expression
QString m_expression
Definition: breakpoint.h:140
KDevelop::Breakpoint::hitCount
int hitCount() const
Definition: breakpoint.cpp:278
KDevelop::Breakpoint::setCondition
void setCondition(const QString &c)
Definition: breakpoint.cpp:314
KDevelop::Breakpoint::PendingState
Definition: breakpoint.h:51
QAbstractItemModel::removeRow
bool removeRow(int row, const QModelIndex &parent)
KDevelop::Breakpoint::m_kind
BreakpointKind m_kind
Definition: breakpoint.h:131
KDevelop::Breakpoint::m_errorText
QString m_errorText
Definition: breakpoint.h:141
BREAKPOINT_KINDS
static const std::array< QString, Breakpoint::LastBreakpointKind > BREAKPOINT_KINDS
Definition: breakpoint.cpp:35
KDevelop::Breakpoint::m_hitCount
int m_hitCount
Definition: breakpoint.h:138
KDevelop::Breakpoint::setDeleted
void setDeleted()
Definition: breakpoint.cpp:207
KDevelop::BreakpointModel::breakpointIndex
QModelIndex breakpointIndex(Breakpoint *b, int column)
Definition: breakpointmodel.cpp:254
KDevelop::Breakpoint::line
int line() const
Definition: breakpoint.cpp:220
KDevelop::Breakpoint::m_model
BreakpointModel * m_model
Definition: breakpoint.h:127
KDevelop::Breakpoint::movingCursor
KTextEditor::MovingCursor * movingCursor() const
Definition: breakpoint.cpp:296
KDevelop::BreakpointModel
Definition: breakpointmodel.h:43
KDevelop::Breakpoint::LocationColumn
Definition: breakpoint.h:75
QUrl::isEmpty
bool isEmpty() const
KDevelop::Breakpoint::data
QVariant data(int column, int role) const
Note: to retrieve the full path use LocationRole, Qt::DisplayRole return only a file's name...
Definition: breakpoint.cpp:126
KDevelop::Breakpoint::Column
Column
Definition: breakpoint.h:71
KDevelop::Breakpoint::condition
QString condition() const
Definition: breakpoint.cpp:322
KDevelop::Breakpoint::Breakpoint
Breakpoint(BreakpointModel *model, BreakpointKind kind)
Definition: breakpoint.cpp:52
QString::clear
void clear()
KDevelop::Breakpoint::kind
BreakpointKind kind() const
Definition: breakpoint.cpp:262
QRegExp::indexIn
int indexIn(const QString &str, int offset, CaretMode caretMode) const
QRegExp
QModelIndex::isValid
bool isValid() const
KDevelop::Breakpoint::BreakpointKind
BreakpointKind
Definition: breakpoint.h:41
QString::number
QString number(int n, int base)
KDevelop::Breakpoint::m_address
QString m_address
Definition: breakpoint.h:133
QVariant::toInt
int toInt(bool *ok) const
KDevelop::Breakpoint::CodeBreakpoint
Definition: breakpoint.h:42
breakpointmodel.h
stringToKind
static Breakpoint::BreakpointKind stringToKind(const QString &kindString)
Definition: breakpoint.cpp:42
KDevelop::Breakpoint::deleted
bool deleted() const
Definition: breakpoint.cpp:283
QString::toInt
int toInt(bool *ok, int base) const
QString::isEmpty
bool isEmpty() const
KDevelop::Breakpoint::setLine
void setLine(int line)
Definition: breakpoint.cpp:223
QModelIndex::row
int row() const
KDevelop::Breakpoint::StateColumn
Definition: breakpoint.h:73
KDevelop::Breakpoint::CleanState
Definition: breakpoint.h:52
KDevelop::Breakpoint::setAddress
void setAddress(const QString &address)
Definition: breakpoint.cpp:267
KDevelop::Breakpoint::m_line
int m_line
Definition: breakpoint.h:135
QString
KDevelop::Breakpoint::setExpression
void setExpression(const QString &c)
Definition: breakpoint.cpp:327
breakpoint.h
KDevelop::Breakpoint::url
QUrl url() const
Definition: breakpoint.cpp:234
KDevelop::Breakpoint::location
QString location()
Definition: breakpoint.cpp:246
KDevelop::Breakpoint::BreakpointState
BreakpointState
Definition: breakpoint.h:48
QUrl
QLatin1Char
QUrl::fileName
QString fileName() const
KDevelop::Breakpoint::breakpointModel
BreakpointModel * breakpointModel()
Return the model this breakpoint is attached to.
Definition: breakpoint.cpp:89
KDevelop::Breakpoint::setMovingCursor
void setMovingCursor(KTextEditor::MovingCursor *cursor)
Definition: breakpoint.cpp:293
KDevelop::Breakpoint::IgnoreHitsColumn
Definition: breakpoint.h:78
KDevelop::Breakpoint::ConditionColumn
Definition: breakpoint.h:76
KDevelop::Breakpoint::LastBreakpointKind
Definition: breakpoint.h:46
KDevelop::Breakpoint::enabled
bool enabled() const
Definition: breakpoint.cpp:288
KDevelop::Breakpoint::LocationRole
Retrieves breakpoint's full path unlike Qt::DisplayRole. Note: it's only appliable to LocationColumn...
Definition: breakpoint.h:56
QUrl::isRelative
bool isRelative() const
KDevelop::Breakpoint::errorText
QString errorText() const
Definition: breakpoint.cpp:345
KDevelop::Breakpoint::m_ignoreHits
int m_ignoreHits
Definition: breakpoint.h:139
KDevelop::Breakpoint::EnableColumn
Definition: breakpoint.h:72
KDevelop::Breakpoint::setLocation
void setLocation(const QUrl &url, int line)
Definition: breakpoint.cpp:237
QVariant::toBool
bool toBool() const
KDevelop::Breakpoint::DirtyState
Definition: breakpoint.h:50
QIcon::fromTheme
QIcon fromTheme(const QString &name, const QIcon &fallback)
KDevelop::Breakpoint::NotStartedState
Definition: breakpoint.h:49
KDevelop::Breakpoint::setData
bool setData(int index, const QVariant &value)
Definition: breakpoint.cpp:94
KDevelop::Breakpoint::m_enabled
bool m_enabled
Definition: breakpoint.h:128
KDevelop::Breakpoint::expression
QString expression() const
Definition: breakpoint.cpp:335
KDevelop::Breakpoint::setUrl
void setUrl(const QUrl &url)
Definition: breakpoint.cpp:228
QVariant::toString
QString toString() const
KDevelop::Breakpoint::TypeColumn
Definition: breakpoint.h:74
KDevelop::Breakpoint::m_state
BreakpointState m_state
Definition: breakpoint.h:130
KDevelop::Breakpoint::m_condition
QString m_condition
Definition: breakpoint.h:136
KDevelop::Breakpoint::m_url
QUrl m_url
Definition: breakpoint.h:134
QUrl::fromLocalFile
QUrl fromLocalFile(const QString &localFile)
KDevelop::Breakpoint::setIgnoreHits
void setIgnoreHits(int c)
Definition: breakpoint.cpp:300
QVariant
KDevelop::Breakpoint::address
QString address() const
Definition: breakpoint.cpp:273
This file is part of the KDE documentation.
Documentation copyright © 1996-2019 The KDE developers.
Generated on Sat Dec 14 2019 02:56:17 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kdevelop/kdevplatform/debugger

Skip menu "kdevelop/kdevplatform/debugger"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdevelop API Reference

Skip menu "kdevelop API Reference"
  •   kdevplatform
  •     debugger
  •     documentation
  •     interfaces
  •     language
  •       assistant
  •       backgroundparser
  •       checks
  •       classmodel
  •       codecompletion
  •       codegen
  •       duchain
  •       editor
  •       highlighting
  •       interfaces
  •       util
  •     outputview
  •     project
  •     serialization
  •     shell
  •     sublime
  •     tests
  •     util
  •     vcs

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal