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

kwallet

  • sources
  • kde-4.14
  • kdeutils
  • kwalletmanager
  • src
  • manager
kwmapeditor.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003,2004 George Staikos <staikos@kde.org>
3 
4  This program is free software; you can redistribute it and/or
5  modify it under the terms of the GNU General Public
6  License as published by the Free Software Foundation; either
7  version 2 of the License, or (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; see the file COPYING. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  Boston, MA 02110-1301, USA.
18 */
19 
20 #include "kwmapeditor.h"
21 #include <kaction.h>
22 #include <kactioncollection.h>
23 #include <kdebug.h>
24 #include <klocale.h>
25 #include <kmenu.h>
26 #include <kstandardaction.h>
27 #include <kwindowsystem.h>
28 #include <QPointer>
29 #include <QApplication>
30 #include <QClipboard>
31 #include <QToolButton>
32 #include <ktextedit.h>
33 #include <QFocusEvent>
34 #include <QKeyEvent>
35 #include <QItemDelegate>
36 
37 class InlineEditor : public KTextEdit {
38  public:
39  InlineEditor(KWMapEditor *p) : KTextEdit(), _p(p) {
40  setAttribute(Qt::WA_DeleteOnClose);
41  setWindowFlags(Qt::Widget | Qt::FramelessWindowHint);
42  setCheckSpellingEnabled(false);
43  connect(p, SIGNAL(destroyed()), SLOT(close()));
44  }
45 
46  protected:
47  virtual void focusOutEvent(QFocusEvent *e) {
48  if (e->reason() == Qt::PopupFocusReason) {
49  // TODO: It seems we only get here if we're disturbed
50  // by our own popup. this needs some clearance though.
51  return;
52  }
53 
54  close();
55  }
56  virtual void keyPressEvent(QKeyEvent *e) {
57  if (e->key() == Qt::Key_Escape) {
58  e->accept();
59  close();
60  } else {
61  e->ignore();
62  KTextEdit::keyPressEvent(e);
63  }
64  }
65  virtual void contextMenuEvent( QContextMenuEvent *event )
66  {
67  QMenu *menu = createStandardContextMenu();
68  popup = menu;
69  popup->exec( event->globalPos() );
70  delete popup;
71  }
72  QPointer<KWMapEditor> _p;
73  QPointer<QMenu> popup;
74 };
75 
76 class KWMapEditorDelegate : public QItemDelegate
77 {
78  public:
79  KWMapEditorDelegate(KWMapEditor *parent) : QItemDelegate(parent)
80  {
81  }
82 
83  QWidget *createEditor(QWidget *parentWidget, const QStyleOptionViewItem &option, const QModelIndex &index) const
84  {
85  if (index.column() != 2) {
86  return QItemDelegate::createEditor(parentWidget, option, index);
87  }
88 
89  KWMapEditor *mapEditor = static_cast<KWMapEditor*>(parent());
90  return new InlineEditor(mapEditor);
91  }
92 
93  void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
94  {
95  if (dynamic_cast<InlineEditor*>(editor))
96  {
97  KWMapEditor *mapEditor = static_cast<KWMapEditor*>(parent());
98  const QRect geo = mapEditor->visualRect(index);
99  editor->move(mapEditor->mapToGlobal(geo.topLeft()));
100  editor->resize(geo.width() * 2, geo.height() * 3);
101  }
102  else
103  {
104  QItemDelegate::updateEditorGeometry(editor, option, index);
105  }
106  }
107 
108  void setEditorData(QWidget *editor, const QModelIndex &index) const
109  {
110  InlineEditor *e = dynamic_cast<InlineEditor*>(editor);
111  if (e)
112  {
113  KWMapEditor *mapEditor = static_cast<KWMapEditor*>(parent());
114  e->setText(mapEditor->item(index.row(), index.column())->text());
115  }
116  else
117  {
118  QItemDelegate::setEditorData(editor, index);
119  }
120  }
121 
122  void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
123  {
124  InlineEditor *e = dynamic_cast<InlineEditor*>(editor);
125  if (e)
126  {
127  KWMapEditor *mapEditor = static_cast<KWMapEditor*>(parent());
128  mapEditor->item(index.row(), index.column())->setText(e->toPlainText());
129  }
130  else
131  {
132  QItemDelegate::setModelData(editor, model, index);
133  }
134  }
135 };
136 
137 KWMapEditor::KWMapEditor(QMap<QString,QString>& map, QWidget *parent)
138 : QTableWidget(0, 3, parent), _map(map) {
139  setItemDelegate(new KWMapEditorDelegate(this));
140  _ac = new KActionCollection(this);
141  _copyAct = KStandardAction::copy(this, SLOT(copy()), _ac);
142  connect(this, SIGNAL(itemChanged(QTableWidgetItem*)), this, SIGNAL(dirty()));
143  connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenu(QPoint)));
144  setSelectionMode(NoSelection);
145  setHorizontalHeaderLabels(QStringList() << QString() << i18n("Key") << i18n("Value"));
146  setContextMenuPolicy(Qt::CustomContextMenu);
147  reload();
148 }
149 
150 void KWMapEditor::reload() {
151  int row = 0;
152 
153  while ((row = rowCount()) > _map.count()) {
154  removeRow(row - 1);
155  }
156 
157  if ((row = rowCount()) < _map.count()) {
158  setRowCount(_map.count());
159  for (int x = row; x < rowCount(); ++x) {
160  QToolButton *b = new QToolButton(this);
161  b->setIcon(KIcon("edit-delete"));
162  b->setToolTip(i18n("Delete Entry"));
163  connect(b, SIGNAL(clicked()), this, SLOT(erase()));
164  setCellWidget(x, 0, b);
165  if (columnWidth(0) != b->sizeHint().width()) {
166  setColumnWidth(0, b->sizeHint().width());
167  }
168  setItem(x, 1, new QTableWidgetItem());
169  setItem(x, 2, new QTableWidgetItem());
170  }
171  }
172 
173  row = 0;
174  for (QMap<QString,QString>::Iterator it = _map.begin(); it != _map.end(); ++it) {
175  item(row, 1)->setText(it.key());
176  item(row, 2)->setText(it.value());
177  row++;
178  }
179 }
180 
181 
182 KWMapEditor::~KWMapEditor() {
183 }
184 
185 
186 void KWMapEditor::erase() {
187  const QObject *o = sender();
188  for (int i = 0; i < rowCount(); i++) {
189  if (cellWidget(i, 0) == o) {
190  removeRow(i);
191  break;
192  }
193  }
194 
195  emit dirty();
196 }
197 
198 
199 void KWMapEditor::saveMap() {
200  _map.clear();
201 
202  for (int i = 0; i < rowCount(); i++) {
203  _map[item(i, 1)->text()] = item(i, 2)->text();
204  }
205 }
206 
207 
208 void KWMapEditor::addEntry() {
209  int x = rowCount();
210  insertRow(x);
211  QToolButton *b = new QToolButton(this);
212  b->setIcon(KIcon("edit-delete"));
213  b->setToolTip(i18n("Delete Entry"));
214  connect(b, SIGNAL(clicked()), this, SLOT(erase()));
215  setCellWidget(x, 0, b);
216  setItem(x, 1, new QTableWidgetItem());
217  setItem(x, 2, new QTableWidgetItem());
218  scrollToItem(item(x, 1));
219  setCurrentCell(x, 1);
220  emit dirty();
221 }
222 
223 
224 void KWMapEditor::emitDirty() {
225  emit dirty();
226 }
227 
228 
229 void KWMapEditor::contextMenu(const QPoint& pos) {
230  QTableWidgetItem *twi = itemAt(pos);
231  _contextRow = row(twi);
232  KMenu *m = new KMenu(this);
233  m->addAction( i18n("&New Entry" ), this, SLOT(addEntry()));
234  m->addAction( _copyAct );
235  m->popup(mapToGlobal(pos));
236 }
237 
238 
239 void KWMapEditor::copy() {
240  QTableWidgetItem *twi = item(_contextRow, 2);
241  if (twi)
242  QApplication::clipboard()->setText(twi->text());
243 }
244 
245 #include "kwmapeditor.moc"
QWidget::customContextMenuRequested
void customContextMenuRequested(const QPoint &pos)
QModelIndex
QTableView::setColumnWidth
void setColumnWidth(int column, int width)
QWidget
KWMapEditor::contextMenu
void contextMenu(const QPoint &pos)
Definition: kwmapeditor.cpp:229
QSize::width
int width() const
QToolButton::sizeHint
virtual QSize sizeHint() const
QAbstractItemView::setSelectionMode
void setSelectionMode(QAbstractItemView::SelectionMode mode)
QTableWidget::removeRow
void removeRow(int row)
QTableWidgetItem
QTableWidget::scrollToItem
void scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint)
QTableWidget::cellWidget
QWidget * cellWidget(int row, int column) const
QTableWidget::setItem
void setItem(int row, int column, QTableWidgetItem *item)
QObject::sender
QObject * sender() const
KMenu
QMap< QString, QString >
QPointer< KWMapEditor >
QWidget::mapToGlobal
QPoint mapToGlobal(const QPoint &pos) const
KWMapEditor::~KWMapEditor
virtual ~KWMapEditor()
Definition: kwmapeditor.cpp:182
QRect::height
int height() const
QPoint
QTableWidget::itemChanged
void itemChanged(QTableWidgetItem *item)
KWMapEditor::saveMap
void saveMap()
Definition: kwmapeditor.cpp:199
QMap::clear
void clear()
QContextMenuEvent::globalPos
const QPoint & globalPos() const
QAbstractButton::setIcon
void setIcon(const QIcon &icon)
QTableWidget
QWidget::resize
void resize(int w, int h)
QFocusEvent::reason
Qt::FocusReason reason() const
KWMapEditor::dirty
void dirty()
QTableWidget::setCellWidget
void setCellWidget(int row, int column, QWidget *widget)
QRect
QTableWidget::insertRow
void insertRow(int row)
QEvent::ignore
void ignore()
QItemDelegate::setEditorData
virtual void setEditorData(QWidget *editor, const QModelIndex &index) const
QWidget::x
int x() const
QTableWidget::setHorizontalHeaderLabels
void setHorizontalHeaderLabels(const QStringList &labels)
QApplication::clipboard
QClipboard * clipboard()
QStyleOptionViewItem
QContextMenuEvent
QObject
QAbstractItemView::setItemDelegate
void setItemDelegate(QAbstractItemDelegate *delegate)
QModelIndex::row
int row() const
KWMapEditor::KWMapEditor
KWMapEditor(QMap< QString, QString > &map, QWidget *parent=0)
Definition: kwmapeditor.cpp:137
QItemDelegate
KWMapEditor
Definition: kwmapeditor.h:30
QWidget::move
void move(int x, int y)
QItemDelegate::updateEditorGeometry
virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
KWMapEditor::addEntry
void addEntry()
Definition: kwmapeditor.cpp:208
QTableView::columnWidth
int columnWidth(int column) const
QString
QMap::end
iterator end()
KWMapEditor::erase
void erase()
Definition: kwmapeditor.cpp:186
QMenu::exec
QAction * exec()
QMap::begin
iterator begin()
QStringList
QToolButton
QKeyEvent::key
int key() const
QMenu
QEvent::accept
void accept()
QWidget::setContextMenuPolicy
void setContextMenuPolicy(Qt::ContextMenuPolicy policy)
QTableWidgetItem::text
QString text() const
QAbstractItemView::visualRect
virtual QRect visualRect(const QModelIndex &index) const =0
QItemDelegate::createEditor
virtual QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
QItemDelegate::setModelData
virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
QKeyEvent
QTableWidget::itemAt
QTableWidgetItem * itemAt(const QPoint &point) const
QRect::width
int width() const
KWMapEditor::emitDirty
void emitDirty()
Definition: kwmapeditor.cpp:224
QTableWidget::row
int row(const QTableWidgetItem *item) const
QTableWidgetItem::setText
void setText(const QString &text)
QTableWidget::item
QTableWidgetItem * item(int row, int column) const
QRect::topLeft
QPoint topLeft() const
QModelIndex::column
int column() const
QAbstractItemModel
QAbstractItemView::clicked
void clicked(const QModelIndex &index)
QClipboard::setText
void setText(const QString &text, Mode mode)
QWidget::setToolTip
void setToolTip(const QString &)
kwmapeditor.h
QTableWidget::setCurrentCell
void setCurrentCell(int row, int column)
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QTableWidget::rowCount
int rowCount() const
QObject::parent
QObject * parent() const
QFocusEvent
QMap::count
int count(const Key &key) const
KWMapEditor::reload
void reload()
Definition: kwmapeditor.cpp:150
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:42:01 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kwallet

Skip menu "kwallet"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdeutils API Reference

Skip menu "kdeutils API Reference"
  • ark
  • filelight
  • kcalc
  • kcharselect
  • kdf
  • kfloppy
  • kgpg
  • ktimer
  • kwallet
  • sweeper

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