1 /***************************************************************************
2  *                                                                         *
3  *   copyright : (C) 2007 The University of Toronto                        *
4  *                   netterfield@astro.utoronto.ca                         *
5  *                                                                         *
6  *   This program is free software; you can redistribute it and/or modify  *
7  *   it under the terms of the GNU General Public License as published by  *
8  *   the Free Software Foundation; either version 2 of the License, or     *
9  *   (at your option) any later version.                                   *
10  *                                                                         *
11  ***************************************************************************/
12 
13 #include "contenttab.h"
14 
15 #include "objectstore.h"
16 #include "relation.h"
17 #include "dialoglauncher.h"
18 #include "geticon.h"
19 
20 #include <qdebug.h>
21 
22 namespace Kst {
23 
ContentTab(QWidget * parent,ObjectStore * store)24 ContentTab::ContentTab(QWidget *parent, ObjectStore *store)
25   : DialogTab(parent), _store(store) {
26 
27   setupUi(this);
28 
29   _up->setIcon(KstGetIcon("kst_uparrow"));
30   _down->setIcon(KstGetIcon("kst_downarrow"));
31   _add->setIcon(KstGetIcon("kst_rightarrow"));
32   _remove->setIcon(KstGetIcon("kst_leftarrow"));
33   _up->setToolTip(tr("Raise in plot order: Alt+Up"));
34   _down->setToolTip(tr("Lower in plot order: Alt+Down"));
35   _add->setToolTip(tr("Select: Alt+s"));
36   _remove->setToolTip(tr("Remove: Alt+r"));
37 
38 
39   connect(_add, SIGNAL(clicked()), this, SLOT(addButtonClicked()));
40   connect(_remove, SIGNAL(clicked()), this, SLOT(removeButtonClicked()));
41   connect(_up, SIGNAL(clicked()), this, SLOT(upButtonClicked()));
42   connect(_down, SIGNAL(clicked()), this, SLOT(downButtonClicked()));
43 
44   connect(_add, SIGNAL(clicked()), this, SIGNAL(modified()));
45   connect(_remove, SIGNAL(clicked()), this, SIGNAL(modified()));
46   connect(_up, SIGNAL(clicked()), this, SIGNAL(modified()));
47   connect(_down, SIGNAL(clicked()), this, SIGNAL(modified()));
48 
49   connect(_availableRelationList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(availableDoubleClicked(QListWidgetItem*)));
50   connect(_displayedRelationList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(displayedDoubleClicked(QListWidgetItem*)));
51 
52   connect(_availableRelationList, SIGNAL(itemSelectionChanged()), this, SLOT(updateButtons()));
53   connect(_displayedRelationList, SIGNAL(itemSelectionChanged()), this, SLOT(updateButtons()));
54 
55   connect(_editSelectedAvailable, SIGNAL(clicked()), this, SLOT(editSelectedAvailable()));
56   connect(_editSelectedDisplayed, SIGNAL(clicked()), this, SLOT(editSelectedDisplayed()));
57   connect(_curveSearchEntry, SIGNAL(textChanged(QString)), this, SLOT(filterCurves(QString)));
58   connect(_curveSearch, SIGNAL(clicked()), this, SLOT(searchCurves()));
59 
60 }
61 
62 
~ContentTab()63 ContentTab::~ContentTab() {
64 }
65 
editSelectedAvailable()66 void ContentTab::editSelectedAvailable() {
67   QList<QListWidgetItem *> selected = _availableRelationList->selectedItems();
68 
69   if (selected.count()>1) {
70     QList<ObjectPtr> objects;
71     int n = selected.count();
72     for (int i=0; i<n; i++) {
73       objects.append(_store->retrieveObject(selected.at(i)->text()));
74     }
75     DialogLauncher::self()->showMultiObjectDialog(objects);
76   } else if (selected.count() > 0) {
77     QString name = selected.at(0)->text();
78     RelationPtr relation = kst_cast<Relation>(_store->retrieveObject(name));
79     DialogLauncher::self()->showObjectDialog(relation);
80   }
81 }
82 
editSelectedDisplayed()83 void ContentTab::editSelectedDisplayed() {
84   QList<QListWidgetItem *> selected = _displayedRelationList->selectedItems();
85 
86 
87   if (selected.count()>1) {
88     QList<ObjectPtr> objects;
89     int n = selected.count();
90     for (int i=0; i<n; i++) {
91       objects.append(_store->retrieveObject(selected.at(i)->text()));
92     }
93     DialogLauncher::self()->showMultiObjectDialog(objects);
94   } else if (selected.count() > 0) {
95     QString name = selected.at(0)->text();
96     RelationPtr relation = kst_cast<Relation>(_store->retrieveObject(name));
97     DialogLauncher::self()->showObjectDialog(relation);
98   }
99 }
100 
updateButtons()101 void ContentTab::updateButtons() {
102 
103   QList<QListWidgetItem *> displayedItems = _displayedRelationList->selectedItems();
104   QListWidgetItem *displayedItem = 0;
105 
106   if (displayedItems.count() > 0)
107     displayedItem = displayedItems.first();
108 
109   _remove->setEnabled(displayedItems.count() > 0);
110 
111   _up->setEnabled(_displayedRelationList->row(displayedItem) > 0);
112   _down->setEnabled(_displayedRelationList->row(displayedItem) >= 0 && _displayedRelationList->row(displayedItem) < (int)_displayedRelationList->count() - 1);
113 
114   _add->setEnabled(_availableRelationList->selectedItems().count() > 0);
115 }
116 
117 
removeButtonClicked()118 void ContentTab::removeButtonClicked() {
119   foreach (QListWidgetItem* item, _displayedRelationList->selectedItems()) {
120     _availableRelationList->addItem(_displayedRelationList->takeItem(_displayedRelationList->row(item)));
121   }
122 
123   _availableRelationList->clearSelection();
124   updateButtons();
125 }
126 
127 
displayedDoubleClicked(QListWidgetItem * item)128 void ContentTab::displayedDoubleClicked(QListWidgetItem * item) {
129   if (item) {
130     _availableRelationList->addItem(_displayedRelationList->takeItem(_displayedRelationList->row(item)));
131     _availableRelationList->clearSelection();
132     emit modified();
133     updateButtons();
134   }
135 }
136 
137 
addButtonClicked()138 void ContentTab::addButtonClicked() {
139   foreach (QListWidgetItem* item, _availableRelationList->selectedItems()) {
140     _displayedRelationList->addItem(_availableRelationList->takeItem(_availableRelationList->row(item)));
141   }
142   _displayedRelationList->clearSelection();
143   updateButtons();
144 }
145 
146 
availableDoubleClicked(QListWidgetItem * item)147 void ContentTab::availableDoubleClicked(QListWidgetItem * item) {
148   if (item) {
149     _displayedRelationList->addItem(_availableRelationList->takeItem(_availableRelationList->row(item)));
150     _displayedRelationList->clearSelection();
151     emit modified();
152     updateButtons();
153   }
154 }
155 
156 
upButtonClicked()157 void ContentTab::upButtonClicked() {
158   _displayedRelationList->setFocus();
159 
160   int i = _displayedRelationList->currentRow();
161   if (i != -1) {
162     QListWidgetItem *item = _displayedRelationList->takeItem(i);
163     _displayedRelationList->insertItem(i-1, item);
164     _displayedRelationList->clearSelection();
165     _displayedRelationList->setCurrentItem(item);
166     //item->setSelected(true);
167     updateButtons();
168   }
169 }
170 
171 
downButtonClicked()172 void ContentTab::downButtonClicked() {
173   _displayedRelationList->setFocus();
174   // move item down
175   int i = _displayedRelationList->currentRow();
176   if (i != -1) {
177     QListWidgetItem *item = _displayedRelationList->takeItem(i);
178     _displayedRelationList->insertItem(i+1, item);
179     _displayedRelationList->clearSelection();
180     _displayedRelationList->setCurrentItem(item);
181     //item->setSelected(true);
182     updateButtons();
183   }
184 }
185 
186 
setDisplayedRelations(QStringList displayedRelations,QStringList displayedRelationTips)187 void ContentTab::setDisplayedRelations(QStringList displayedRelations, QStringList displayedRelationTips) {
188   _displayedRelationList->clear();
189   _displayedRelationList->addItems(displayedRelations);
190   for (int i=0; i<_displayedRelationList->count(); i++) {
191     _displayedRelationList->item(i)->setToolTip(displayedRelationTips.at(i));
192   }
193 }
194 
195 
setAvailableRelations(QStringList availableRelations,QStringList availableRelationTips)196 void ContentTab::setAvailableRelations(QStringList availableRelations, QStringList availableRelationTips) {
197   _availableRelationList->clear();
198   _availableRelationList->addItems(availableRelations);
199   for (int i=0; i<_availableRelationList->count(); i++) {
200     _availableRelationList->item(i)->setToolTip(availableRelationTips.at(i));
201   }
202 }
203 
204 
displayedRelations()205 QStringList ContentTab::displayedRelations() {
206   QStringList relations;
207   for (int i = 0; i < _displayedRelationList->count(); i++) {
208     relations.append(_displayedRelationList->item(i)->text());
209   }
210   return relations;
211 }
212 
addObject(QString x)213 void ContentTab::addObject(QString x) {
214     for(int i=0;i<_availableRelationList->count();i++) {
215         if(_availableRelationList->item(i)->text().contains(x)) {
216             _displayedRelationList->addItem(_availableRelationList->takeItem(i));
217             return;
218         }
219     }
220 }
221 
removeObject(QString x)222 void ContentTab::removeObject(QString x) {
223     for(int i=0;i<_displayedRelationList->count();i++) {
224         if(_displayedRelationList->item(i)->text().contains(x)) {
225             _availableRelationList->addItem(_displayedRelationList->takeItem(i));
226             return;
227         }
228     }
229 }
230 
filterCurves(const QString & filter)231 void ContentTab::filterCurves(const QString &filter) {
232   _availableRelationList->clearSelection();
233 
234   if (filter=="*") { // optimization
235     _availableRelationList->selectAll();
236     return;
237   }
238 
239   QRegExp re(filter, Qt::CaseSensitive, QRegExp::Wildcard);
240   QStringList selected;
241 
242   for (int i = 0; i < _availableRelationList->count(); i++) {
243     QListWidgetItem *item = _availableRelationList->item(i);
244     if (re.exactMatch(item->text())) {
245       item = _availableRelationList->takeItem(i);
246       selected.append(item->text());
247       i--;
248     }
249   }
250 
251   _availableRelationList->insertItems(0, selected);
252 
253   // special case optimization:
254   // selecting and unselecting individual items is expensive,
255   // but selecting all of them is fast,
256   // so either select or select all, then unselect, which ever is fewer.
257   if (selected.count() > _availableRelationList->count()/2) {
258     _availableRelationList->selectAll();
259     for (int i=selected.count(); i<_availableRelationList->count(); i++) {
260       _availableRelationList->item(i)->setSelected(false);
261     }
262   } else {
263     for (int i=0; i<selected.count(); i++) {
264       _availableRelationList->item(i)->setSelected(true);
265     }
266   }
267 
268   if (selected.count()>0) {
269     _availableRelationList->scrollToTop();
270   }
271 
272 }
273 
searchCurves()274 void ContentTab::searchCurves() {
275   QString s = _curveSearchEntry->text();
276   if (!s.isEmpty()) {
277     if (s[0] != '*') {
278       s = '*' + s;
279     }
280     if (s[s.length()-1] != '*') {
281       s += '*';
282     }
283     _curveSearchEntry->setText(s);
284   }
285 }
286 
287 }
288 
289 // vim: ts=2 sw=2 et
290