OSDN Git Service

Evernote APIの帯域制限超過時にエラーメッセージを表示するようにした
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / dialog / ShareNotebook.java
1 /*\r
2  * This file is part of NixNote/NeighborNote \r
3  * Copyright 2009 Randy Baumgarte\r
4  * \r
5  * This file may be licensed under the terms of of the\r
6  * GNU General Public License Version 2 (the ``GPL'').\r
7  *\r
8  * Software distributed under the License is distributed\r
9  * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
10  * express or implied. See the GPL for the specific language\r
11  * governing rights and limitations.\r
12  *\r
13  * You should have received a copy of the GPL along with this\r
14  * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
15  * or write to the Free Software Foundation, Inc.,\r
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
17  *\r
18 */\r
19 \r
20 package cx.fbn.nevernote.dialog;\r
21 \r
22 //**********************************************\r
23 //**********************************************\r
24 //* Share a notebook with another user.\r
25 //**********************************************\r
26 //**********************************************\r
27 \r
28 import java.util.ArrayList;\r
29 import java.util.List;\r
30 \r
31 import com.evernote.edam.error.EDAMErrorCode;\r
32 import com.evernote.edam.error.EDAMNotFoundException;\r
33 import com.evernote.edam.error.EDAMSystemException;\r
34 import com.evernote.edam.error.EDAMUserException;\r
35 import com.evernote.edam.type.Notebook;\r
36 import com.evernote.edam.type.SharedNotebook;\r
37 import com.evernote.thrift.TException;\r
38 import com.trolltech.qt.core.QModelIndex;\r
39 import com.trolltech.qt.core.Qt.ItemFlag;\r
40 import com.trolltech.qt.core.Qt.ItemFlags;\r
41 import com.trolltech.qt.gui.QAbstractItemView.SelectionBehavior;\r
42 import com.trolltech.qt.gui.QAbstractItemView.SelectionMode;\r
43 import com.trolltech.qt.gui.QApplication;\r
44 import com.trolltech.qt.gui.QDialog;\r
45 import com.trolltech.qt.gui.QFontMetrics;\r
46 import com.trolltech.qt.gui.QHBoxLayout;\r
47 import com.trolltech.qt.gui.QIcon;\r
48 import com.trolltech.qt.gui.QLabel;\r
49 import com.trolltech.qt.gui.QMessageBox;\r
50 import com.trolltech.qt.gui.QPushButton;\r
51 import com.trolltech.qt.gui.QTableWidget;\r
52 import com.trolltech.qt.gui.QTableWidgetItem;\r
53 import com.trolltech.qt.gui.QVBoxLayout;\r
54 \r
55 import cx.fbn.nevernote.sql.DatabaseConnection;\r
56 import cx.fbn.nevernote.threads.SyncRunner;\r
57 //import org.apache.thrift.TException;\r
58 \r
59 public class ShareNotebook extends QDialog {\r
60         private final QPushButton                               okButton;\r
61         private final QPushButton                               addButton;\r
62         private final QPushButton                               deleteButton;\r
63         private boolean                                                 okClicked;\r
64         public final QTableWidget                               table;\r
65         private final List<SharedNotebook>              notebooks;\r
66         private final DatabaseConnection                conn;\r
67         private final Notebook                                  notebook;\r
68         private final SyncRunner                                syncRunner;\r
69         private final String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
70         \r
71         public ShareNotebook(String guid, DatabaseConnection c, Notebook n,\r
72                                                 SyncRunner s) {\r
73                 setWindowIcon(new QIcon(iconPath+"globe.png"));\r
74                 okClicked = false;\r
75                 conn = c;\r
76                 syncRunner = s;;\r
77                 notebook = n;\r
78                 \r
79                 notebooks = conn.getSharedNotebookTable().getForNotebook(n.getGuid());\r
80                 okButton = new QPushButton();\r
81                 okButton.setText(tr("OK"));\r
82                 okButton.pressed.connect(this, "onClicked()");\r
83                 \r
84                 QHBoxLayout horizontalLayout = new QHBoxLayout();\r
85                 QHBoxLayout buttonLayout = new QHBoxLayout();\r
86                 buttonLayout.addStretch(1);\r
87                 buttonLayout.addWidget(okButton);\r
88                 setWindowTitle(tr("Share Notebook \"") +notebook.getName() + tr("\" With Others"));     \r
89                 \r
90                 table = new QTableWidget(notebooks.size(),3);\r
91                 List<String> headers = new ArrayList<String>();\r
92                 headers.add(tr("Email"));\r
93                 headers.add(tr("Access"));\r
94                 headers.add(tr("Login Required"));\r
95                 table.setHorizontalHeaderLabels(headers);\r
96                 table.verticalHeader().setVisible(false);\r
97                 table.setAlternatingRowColors(true);\r
98                 table.setSelectionBehavior(SelectionBehavior.SelectRows);\r
99                 table.setSelectionMode(SelectionMode.SingleSelection);\r
100                 table.itemSelectionChanged.connect(this, "tableSelection()");\r
101                 horizontalLayout.addWidget(table);\r
102                 \r
103                 \r
104                 addButton = new QPushButton();\r
105                 addButton.setText(tr("Add"));\r
106                 addButton.clicked.connect(this, "addPressed()");\r
107                 \r
108                 deleteButton = new QPushButton();\r
109                 deleteButton.setText(tr("Delete"));\r
110                 deleteButton.setEnabled(false);\r
111                 deleteButton.clicked.connect(this, "deletePressed()");\r
112                 \r
113                 QVBoxLayout editLayout = new QVBoxLayout();\r
114                 editLayout.addWidget(addButton);\r
115                 editLayout.addWidget(deleteButton);\r
116                 \r
117                 QHBoxLayout listLayout = new QHBoxLayout();\r
118                 listLayout.addLayout(horizontalLayout);\r
119                 listLayout.addLayout(editLayout);\r
120                 \r
121                 QVBoxLayout mainLayout = new QVBoxLayout();\r
122                 if (syncRunner.authToken == null) {\r
123                         QLabel msg = new QLabel(tr("You must be connected to make changes."));\r
124                         mainLayout.addWidget(msg);\r
125                 }\r
126                 mainLayout.addLayout(listLayout);\r
127                 mainLayout.addSpacing(1);\r
128                 mainLayout.addLayout(buttonLayout);\r
129                 setLayout(mainLayout);\r
130                 \r
131                 table.setColumnWidth(0, 160);\r
132                 resize(500, 200);\r
133                 load();\r
134                 \r
135                 if (syncRunner.authToken == null) {\r
136                         addButton.setEnabled(false);\r
137                         deleteButton.setEnabled(false);\r
138                 }\r
139                 \r
140         }\r
141         \r
142         @SuppressWarnings("unused")\r
143         private void onClicked() {\r
144                 okClicked = true;\r
145                 close();\r
146         }\r
147         \r
148 \r
149         public boolean okClicked() {\r
150                 return okClicked;\r
151         }\r
152         \r
153         @SuppressWarnings("unused")\r
154         private void itemSelected() {\r
155                 okButton.setEnabled(true);\r
156         }\r
157         \r
158         private void load() {\r
159                 for (int i=0; i<notebooks.size(); i++) {\r
160                         addRow(i, notebooks.get(i).getEmail(), \r
161                                          notebooks.get(i).isNotebookModifiable(),\r
162                                          notebooks.get(i).isRequireLogin());\r
163                 }\r
164         }\r
165 \r
166         private void addRow(int row, String email, boolean mod, boolean login) {\r
167                 QFontMetrics f = QApplication.fontMetrics();\r
168                 int fontHeight = f.height();\r
169 \r
170                 QTableWidgetItem emailWidget = new QTableWidgetItem();\r
171                 emailWidget.setText(email);\r
172                 table.setItem(row, 0, emailWidget);\r
173                 table.setRowHeight(row, fontHeight);\r
174                 emailWidget.setToolTip(email);\r
175                 ItemFlags flags = emailWidget.flags();\r
176                 flags.clear(ItemFlag.ItemIsEditable);\r
177                 emailWidget.setFlags(flags);\r
178 \r
179                 QTableWidgetItem accessWidget = new QTableWidgetItem();\r
180                 if (mod)\r
181                         accessWidget.setText(tr("Modify"));\r
182                 else\r
183                         accessWidget.setText(tr("Read Only"));\r
184                 table.setItem(row, 1,accessWidget);\r
185                 accessWidget.setFlags(flags);\r
186 \r
187                 QTableWidgetItem loginWidget = new QTableWidgetItem();\r
188                 if (login)\r
189                         loginWidget.setText(tr("True"));\r
190                 else\r
191                         loginWidget.setText(tr("False"));\r
192                 table.setItem(row, 2, loginWidget);\r
193                 loginWidget.setFlags(flags);\r
194                 \r
195 \r
196         }\r
197         \r
198         @SuppressWarnings("unused")\r
199         private void tableSelection() {\r
200                 if (syncRunner.authToken != null)\r
201                         deleteButton.setEnabled(true);\r
202         }\r
203         \r
204         \r
205         @SuppressWarnings("unused")\r
206         private void addPressed() {\r
207 \r
208                 \r
209         }\r
210         \r
211         \r
212         @SuppressWarnings("unused")\r
213         private void deletePressed() {\r
214                 QModelIndex index = table.currentIndex();\r
215                 int row = index.row();\r
216                 \r
217                 QTableWidgetItem dirWidget = table.item(row, 0);\r
218                 String value = dirWidget.text();\r
219                 List<SharedNotebook> notebooks = conn.getSharedNotebookTable().getForNotebook(notebook.getGuid());\r
220                 \r
221                 List<Long> ids = new ArrayList<Long>();\r
222                 for (int i=0; i<notebooks.size(); i++) {\r
223                         if (notebooks.get(i).getEmail().equalsIgnoreCase(value)) {\r
224                                 ids.add(notebooks.get(i).getId());\r
225                         }\r
226                 }\r
227                 \r
228                 if (ids.size() > 0) {\r
229                         try {\r
230                                 syncRunner.localNoteStore.expungeSharedNotebooks(syncRunner.authToken, ids);\r
231                         } catch (EDAMUserException e) {\r
232                                 e.printStackTrace();\r
233                         } catch (EDAMNotFoundException e) {\r
234                                 e.printStackTrace();\r
235                         } catch (EDAMSystemException e) {\r
236                                 if (e.getErrorCode() == EDAMErrorCode.RATE_LIMIT_REACHED) {\r
237                                         QMessageBox.warning(this, tr("Rate limit reached"), tr("Rate limit reached.\nRetry your request in " + e.getRateLimitDuration() + " seconds."));\r
238                                 }\r
239                                 e.printStackTrace();\r
240                         } catch (TException e) {\r
241                                 e.printStackTrace();\r
242                         }\r
243                         for (int i=0; i<ids.size(); i++)\r
244                                 conn.getSharedNotebookTable().expungeNotebook(ids.get(i), false);\r
245                 }\r
246                 \r
247                 table.clear();\r
248                 load();\r
249                 if (table.rowCount() == 0) {\r
250                         deleteButton.setEnabled(false);\r
251                 }               \r
252         }\r
253 }\r