1 /*****************************************************************************
2  * Copyright (C) 2005 Csaba Karai <krusader@users.sourceforge.net>           *
3  * Copyright (C) 2005-2019 Krusader Krew [https://krusader.org]              *
4  *                                                                           *
5  * This file is part of Krusader [https://krusader.org].                     *
6  *                                                                           *
7  * Krusader is free software: you can redistribute it and/or modify          *
8  * it under the terms of the GNU General Public License as published by      *
9  * the Free Software Foundation, either version 2 of the License, or         *
10  * (at your option) any later version.                                       *
11  *                                                                           *
12  * Krusader 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             *
15  * GNU General Public License for more details.                              *
16  *                                                                           *
17  * You should have received a copy of the GNU General Public License         *
18  * along with Krusader.  If not, see [http://www.gnu.org/licenses/].         *
19  *****************************************************************************/
20 
21 #include "kurllistrequester.h"
22 #include "../FileSystem/filesystem.h"
23 #include "../icon.h"
24 
25 // QtGui
26 #include <QPixmap>
27 #include <QCursor>
28 #include <QKeyEvent>
29 // QtWidgets
30 #include <QFileDialog>
31 #include <QLayout>
32 #include <QGridLayout>
33 #include <QMenu>
34 
35 #include <KI18n/KLocalizedString>
36 #include <KWidgetsAddons/KMessageBox>
37 
38 #define DELETE_ITEM_ID    100
39 
KURLListRequester(Mode requestMode,QWidget * parent)40 KURLListRequester::KURLListRequester(Mode requestMode, QWidget *parent)
41     : QWidget(parent), mode(requestMode)
42 {
43     // Creating the widget
44 
45     QGridLayout *urlListRequesterGrid = new QGridLayout(this);
46     urlListRequesterGrid->setSpacing(0);
47     urlListRequesterGrid->setContentsMargins(0, 0, 0, 0);
48 
49     urlLineEdit = new KLineEdit(this);
50     urlListRequesterGrid->addWidget(urlLineEdit, 0, 0);
51 
52     urlListBox = new KrListWidget(this);
53     urlListBox->setSelectionMode(QAbstractItemView::ExtendedSelection);
54     urlListRequesterGrid->addWidget(urlListBox, 1, 0, 1, 3);
55 
56     urlAddBtn = new QToolButton(this);
57     urlAddBtn->setText("");
58     urlAddBtn->setIcon(Icon("arrow-down"));
59     urlListRequesterGrid->addWidget(urlAddBtn, 0, 1);
60 
61     urlBrowseBtn = new QToolButton(this);
62     urlBrowseBtn->setText("");
63     urlBrowseBtn->setIcon(Icon("folder"));
64     urlListRequesterGrid->addWidget(urlBrowseBtn, 0, 2);
65 
66     // add shell completion
67 
68     completion.setMode(KUrlCompletion::FileCompletion);
69     urlLineEdit->setCompletionObject(&completion);
70 
71     // connection table
72 
73     connect(urlAddBtn, SIGNAL(clicked()), this, SLOT(slotAdd()));
74     connect(urlBrowseBtn, SIGNAL(clicked()), this, SLOT(slotBrowse()));
75     connect(urlLineEdit, SIGNAL(returnPressed(QString)), this, SLOT(slotAdd()));
76     connect(urlListBox, SIGNAL(itemRightClicked(QListWidgetItem*,QPoint)), this,
77             SLOT(slotRightClicked(QListWidgetItem*,QPoint)));
78     connect(urlLineEdit, SIGNAL(textChanged(QString)), this, SIGNAL(changed()));
79 }
80 
slotAdd()81 void KURLListRequester::slotAdd()
82 {
83     QString text = urlLineEdit->text().simplified();
84     if (text.length()) {
85         QString error;
86         emit checkValidity(text, error);
87 
88         if (!error.isNull())
89             KMessageBox::error(this, error);
90         else {
91             urlListBox->addItem(text);
92             urlLineEdit->clear();
93             emit changed();
94         }
95     }
96 }
97 
slotBrowse()98 void KURLListRequester::slotBrowse()
99 {
100     QUrl url;
101     switch (mode) {
102         case RequestFiles:
103             url = QFileDialog::getOpenFileUrl(this);
104             break;
105         case RequestDirs:
106             url = QFileDialog::getExistingDirectoryUrl(this);
107             break;
108     }
109     if (!url.isEmpty())
110         urlLineEdit->setText(url.toDisplayString(QUrl::PreferLocalFile));
111     urlLineEdit->setFocus();
112 }
113 
keyPressEvent(QKeyEvent * e)114 void KURLListRequester::keyPressEvent(QKeyEvent *e)
115 {
116     if (e->key() == Qt::Key_Delete) {
117         if (urlListBox->hasFocus()) {
118             deleteSelectedItems();
119             return;
120         }
121     }
122 
123     QWidget::keyPressEvent(e);
124 }
125 
deleteSelectedItems()126 void KURLListRequester::deleteSelectedItems()
127 {
128     QList<QListWidgetItem *> delList = urlListBox->selectedItems();
129     for (int i = 0; i != delList.count(); i++)
130         delete delList[ i ];
131     emit changed();
132 }
133 
slotRightClicked(QListWidgetItem * item,const QPoint & pos)134 void KURLListRequester::slotRightClicked(QListWidgetItem *item, const QPoint &pos)
135 {
136     if (item == 0)
137         return;
138 
139     QMenu popupMenu(this);
140     QAction * menuAction = popupMenu.addAction(i18n("Delete"));
141 
142     if (menuAction == popupMenu.exec(pos)) {
143         if (item->isSelected())
144             deleteSelectedItems();
145         else {
146             delete item;
147             emit changed();
148         }
149     }
150 }
151 
urlList()152 QList<QUrl> KURLListRequester::urlList()
153 {
154     QList<QUrl> urls;
155 
156     QString text = urlLineEdit->text().simplified();
157     if (!text.isEmpty()) {
158         QString error;
159         emit checkValidity(text, error);
160         if (error.isNull())
161             urls.append(QUrl::fromUserInput(text, QString(), QUrl::AssumeLocalFile));
162     }
163 
164     for (int i = 0; i != urlListBox->count(); i++) {
165         QListWidgetItem *item = urlListBox->item(i);
166 
167         QString text = item->text().simplified();
168 
169         QString error;
170         emit checkValidity(text, error);
171         if (error.isNull())
172             urls.append(QUrl::fromUserInput(text, QString(), QUrl::AssumeLocalFile));
173     }
174 
175     return urls;
176 }
177 
setUrlList(QList<QUrl> urlList)178 void KURLListRequester::setUrlList(QList<QUrl> urlList)
179 {
180     urlLineEdit->clear();
181     urlListBox->clear();
182 
183     QList<QUrl>::iterator it;
184 
185     for (it = urlList.begin(); it != urlList.end(); ++it)
186         urlListBox->addItem(it->toDisplayString(QUrl::PreferLocalFile));
187 
188     emit changed();
189 }
190 
191