Revision 4eaecbac src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java

b/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java
34 34
 */
35 35
package gr.grnet.pithos.web.client;
36 36

  
37
import gr.grnet.pithos.web.client.foldertree.Folder;
38
import gr.grnet.pithos.web.client.rest.PutRequest;
39
import gr.grnet.pithos.web.client.rest.RestException;
40

  
41 37
import com.google.gwt.core.client.GWT;
42 38
import com.google.gwt.core.client.Scheduler;
43 39
import com.google.gwt.dom.client.NativeEvent;
44
import com.google.gwt.event.dom.client.ChangeEvent;
45
import com.google.gwt.event.dom.client.ChangeHandler;
46
import com.google.gwt.event.dom.client.ClickEvent;
47
import com.google.gwt.event.dom.client.ClickHandler;
48
import com.google.gwt.event.dom.client.KeyCodes;
49
import com.google.gwt.event.dom.client.KeyDownEvent;
40
import com.google.gwt.event.dom.client.*;
50 41
import com.google.gwt.http.client.Response;
51 42
import com.google.gwt.i18n.client.DateTimeFormat;
52 43
import com.google.gwt.user.client.Command;
53 44
import com.google.gwt.user.client.Event.NativePreviewEvent;
54
import com.google.gwt.user.client.ui.Anchor;
55
import com.google.gwt.user.client.ui.Button;
56
import com.google.gwt.user.client.ui.DialogBox;
57
import com.google.gwt.user.client.ui.FlexTable;
58
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
59
import com.google.gwt.user.client.ui.Label;
60
import com.google.gwt.user.client.ui.TextBox;
61
import com.google.gwt.user.client.ui.VerticalPanel;
45
import com.google.gwt.user.client.ui.*;
46
import gr.grnet.pithos.web.client.foldertree.Folder;
47
import gr.grnet.pithos.web.client.rest.PutRequest;
48
import gr.grnet.pithos.web.client.rest.RestException;
62 49

  
63 50
/**
64 51
 * The 'Folder properties' dialog box implementation.
......
67 54

  
68 55
    protected Pithos app;
69 56

  
70
	/**
71
	 * The widget that holds the folderName of the folder.
72
	 */
73
	TextBox folderName = new TextBox();
57
    /**
58
     * The widget that holds the folderName of the folder.
59
     */
60
    TextBox folderName = new TextBox();
74 61

  
75
	/**
76
	 * A flag that denotes whether the dialog will be used to create or modify a
77
	 * folder.
78
	 */
79
	private final boolean create;
62
    /**
63
     * A flag that denotes whether the dialog will be used to create or modify a
64
     * folder.
65
     */
66
    private final boolean create;
80 67

  
81
	final Folder folder;
68
    final Folder folder;
82 69

  
83
	final VerticalPanel inner;
70
    final VerticalPanel inner;
84 71

  
85
	/**
86
	 * The widget's constructor.
87
	 */
88
	public FolderPropertiesDialog(final Pithos app, boolean _create,  Folder selected) {
72
    /**
73
     * The widget's constructor.
74
     */
75
    public FolderPropertiesDialog(final Pithos app, boolean _create, Folder selected) {
89 76
        this.app = app;
90
		Anchor close = new Anchor("close");
91
		close.addStyleName("close");
92
		close.addClickHandler(new ClickHandler() {
93
			
94
			@Override
95
			public void onClick(ClickEvent event) {
96
				hide();
97
			}
98
		});
99

  
100
		setGlassEnabled(true);
101
		setStyleName("pithos-DialogBox");
102

  
103
		// Enable IE selection for the dialog (must disable it upon closing it)
104
		Pithos.enableIESelection();
105

  
106
		create = _create;
107
		
108
		folder = selected;
109

  
110
		// Use this opportunity to set the dialog's caption.
111
		if (create)
112
			setText("Create folder");
113
		else
114
			setText("Folder properties");
115

  
116
		// Outer contains inner and buttons
117
		VerticalPanel outer = new VerticalPanel();
118
		outer.add(close);
119
		// Inner contains generalPanel and permPanel
120
		inner = new VerticalPanel();
121
		inner.addStyleName("inner");
122

  
123
		VerticalPanel generalPanel = new VerticalPanel();
77
        Anchor close = new Anchor("close");
78
        close.addStyleName("close");
79
        close.addClickHandler(new ClickHandler() {
80

  
81
            @Override
82
            public void onClick(ClickEvent event) {
83
                hide();
84
            }
85
        });
86

  
87
        setGlassEnabled(true);
88
        setStyleName("pithos-DialogBox");
89

  
90
        // Enable IE selection for the dialog (must disable it upon closing it)
91
        Pithos.enableIESelection();
92

  
93
        create = _create;
94

  
95
        folder = selected;
96

  
97
        // Use this opportunity to set the dialog's caption.
98
        if(create) {
99
            setText("Create folder");
100
        }
101
        else {
102
            setText("Folder properties");
103
        }
104

  
105
        // Outer contains inner and buttons
106
        VerticalPanel outer = new VerticalPanel();
107
        outer.add(close);
108
        // Inner contains generalPanel and permPanel
109
        inner = new VerticalPanel();
110
        inner.addStyleName("inner");
111

  
112
        VerticalPanel generalPanel = new VerticalPanel();
124 113
        FlexTable generalTable = new FlexTable();
125 114
        generalTable.setText(0, 0, "Name");
126 115
        generalTable.setText(1, 0, "Parent");
127 116
        generalTable.setText(2, 0, "Creator");
128 117
        generalTable.setText(3, 0, "Last modified");
129 118

  
130
		folderName.setText(create ? "" : folder.getName());
119
        folderName.setText(create ? "" : folder.getName());
131 120
        folderName.setReadOnly(folder.isContainer() && !create);
132 121
        generalTable.setWidget(0, 1, folderName);
133 122

  
134 123
        final Label folderNameNote = new Label("Please note that slashes ('/') are not allowed in folder names.", true);
135
		folderNameNote.setVisible(false);
136
		folderNameNote.setStylePrimaryName("gss-readForAllNote");
137
		generalTable.setWidget(0, 2, folderNameNote);
138
		
139
        if (create)
124
        folderNameNote.setVisible(false);
125
        folderNameNote.setStylePrimaryName("gss-readForAllNote");
126
        generalTable.setWidget(0, 2, folderNameNote);
127

  
128
        if(create) {
140 129
            generalTable.setText(1, 1, folder.getName());
141
        else
130
        }
131
        else {
142 132
            generalTable.setText(1, 1, folder.getParent().getName());
143
        if (create)
144
        	generalTable.setText(2, 1, app.getCurrentUserDisplayNameOrID());
145
        else
146
        	generalTable.setText(2, 1, folder.getOwner());
133
        }
134
        if(create) {
135
            generalTable.setText(2, 1, app.getCurrentUserDisplayNameOrID());
136
        }
137
        else {
138
            final String ownerID = folder.getOwnerID();
139
            final String displayName = app.getUserDisplayNameByID(ownerID);
140
            final String ownerDisplayName;
141
            if(displayName == null) {
142
                // FIXME: Get the actual display name and do not use the id
143
                ownerDisplayName = ownerID;
144
            }
145
            else {
146
                ownerDisplayName = displayName;
147
            }
148
            generalTable.setText(2, 1, ownerDisplayName);
149
        }
147 150
        DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a");
148
        if(folder.getLastModified() != null)
151
        if(folder.getLastModified() != null) {
149 152
            generalTable.setText(3, 1, formatter.format(folder.getLastModified()));
153
        }
150 154
        generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");
151 155
        generalTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels");
152 156
        generalTable.getFlexCellFormatter().setStyleName(2, 0, "props-labels");
......
161 165

  
162 166
        outer.add(inner);
163 167

  
164
		// Create the 'Create/Update' button, along with a listener that hides the dialog
165
		// when the button is clicked and quits the application.
166
		String okLabel;
167
		if (create)
168
			okLabel = "Create";
169
		else
170
			okLabel = "Update";
171
		final Button ok = new Button(okLabel, new ClickHandler() {
172
			@Override
173
			public void onClick(ClickEvent event) {
174
				createOrUpdateFolder();
175
				closeDialog();
176
			}
177
		});
178
		ok.addStyleName("button");
179
		outer.add(ok);
168
        // Create the 'Create/Update' button, along with a listener that hides the dialog
169
        // when the button is clicked and quits the application.
170
        String okLabel;
171
        if(create) {
172
            okLabel = "Create";
173
        }
174
        else {
175
            okLabel = "Update";
176
        }
177
        final Button ok = new Button(okLabel, new ClickHandler() {
178
            @Override
179
            public void onClick(ClickEvent event) {
180
                createOrUpdateFolder();
181
                closeDialog();
182
            }
183
        });
184
        ok.addStyleName("button");
185
        outer.add(ok);
180 186
        outer.setCellHorizontalAlignment(inner, HasHorizontalAlignment.ALIGN_CENTER);
181 187

  
182 188
        folderName.addChangeHandler(new ChangeHandler() {
183
			
184
			@Override
185
			public void onChange(ChangeEvent event) {
186
				if(folderName.getText().contains("/")) {
187
					folderNameNote.setVisible(true);
188
					ok.setEnabled(false);
189
				}
190
				else {
191
					folderNameNote.setVisible(false);
192
					ok.setEnabled(true);
193
				}
194
			}
195
		});
189

  
190
            @Override
191
            public void onChange(ChangeEvent event) {
192
                if(folderName.getText().contains("/")) {
193
                    folderNameNote.setVisible(true);
194
                    ok.setEnabled(false);
195
                }
196
                else {
197
                    folderNameNote.setVisible(false);
198
                    ok.setEnabled(true);
199
                }
200
            }
201
        });
196 202

  
197 203
        setWidget(outer);
198
	}
199

  
200
	@Override
201
	public void center() {
202
		super.center();
203
		folderName.setFocus(true);
204
	}
205

  
206
	@Override
207
	protected void onPreviewNativeEvent(NativePreviewEvent preview) {
208
		super.onPreviewNativeEvent(preview);
209

  
210
		NativeEvent evt = preview.getNativeEvent();
211
		if (evt.getType().equals(KeyDownEvent.getType().getName()))
212
			// Use the popup's key preview hooks to close the dialog when either
213
			// enter or escape is pressed.
214
			switch (evt.getKeyCode()) {
215
				case KeyCodes.KEY_ENTER:
216
					createOrUpdateFolder();
204
    }
205

  
206
    @Override
207
    public void center() {
208
        super.center();
209
        folderName.setFocus(true);
210
    }
211

  
212
    @Override
213
    protected void onPreviewNativeEvent(NativePreviewEvent preview) {
214
        super.onPreviewNativeEvent(preview);
215

  
216
        NativeEvent evt = preview.getNativeEvent();
217
        if(evt.getType().equals(KeyDownEvent.getType().getName()))
218
        // Use the popup's key preview hooks to close the dialog when either
219
        // enter or escape is pressed.
220
        {
221
            switch(evt.getKeyCode()) {
222
                case KeyCodes.KEY_ENTER:
223
                    createOrUpdateFolder();
224
                    closeDialog();
225
                    break;
226
                case KeyCodes.KEY_ESCAPE:
217 227
                    closeDialog();
218
					break;
219
				case KeyCodes.KEY_ESCAPE:
220
					closeDialog();
221
					break;
222
			}
223
	}
224

  
225

  
226
	/**
227
	 * Enables IE selection prevention and hides the dialog
228
	 * (we disable the prevention on creation of the dialog)
229
	 */
230
	public void closeDialog() {
231
		Pithos.preventIESelection();
232
		hide();
233
	}
234

  
235
	/**
236
	 * Generate an RPC request to create a new folder.
237
	 */
238
	private void createFolder() {
239
		String name = folderName.getText().trim();
240
		if (name.length() == 0)
241
			return;
228
                    break;
229
            }
230
        }
231
    }
232

  
233

  
234
    /**
235
     * Enables IE selection prevention and hides the dialog
236
     * (we disable the prevention on creation of the dialog)
237
     */
238
    public void closeDialog() {
239
        Pithos.preventIESelection();
240
        hide();
241
    }
242

  
243
    /**
244
     * Generate an RPC request to create a new folder.
245
     */
246
    private void createFolder() {
247
        String name = folderName.getText().trim();
248
        if(name.length() == 0) {
249
            return;
250
        }
242 251
        String path = folder.getUri() + "/" + name;
243
        PutRequest createFolder = new PutRequest(app.getApiPath(), folder.getOwner(), path) {
252
        PutRequest createFolder = new PutRequest(app.getApiPath(), folder.getOwnerID(), path) {
244 253
            @Override
245 254
            public void onSuccess(Resource result) {
246 255
                app.updateFolder(folder, true, new Command() {
247
					
248
					@Override
249
					public void execute() {
250
						app.updateStatistics();
251
					}
252
				}, true);
256

  
257
                    @Override
258
                    public void execute() {
259
                        app.updateStatistics();
260
                    }
261
                }, true);
253 262
            }
254 263

  
255 264
            @Override
256 265
            public void onError(Throwable t) {
257
				GWT.log("", t);
258
				app.setError(t);
259
				if (t instanceof RestException) {
260
					app.displayError("Unable to create folder:" + ((RestException) t).getHttpStatusText());
261
				}
262
				else
263
					app.displayError("System error creating folder:" + t.getMessage());
266
                GWT.log("", t);
267
                app.setError(t);
268
                if(t instanceof RestException) {
269
                    app.displayError("Unable to create folder:" + ((RestException) t).getHttpStatusText());
270
                }
271
                else {
272
                    app.displayError("System error creating folder:" + t.getMessage());
273
                }
264 274
            }
265 275

  
266
			@Override
267
			protected void onUnauthorized(Response response) {
268
				app.sessionExpired();
269
			}
270
       };
276
            @Override
277
            protected void onUnauthorized(Response response) {
278
                app.sessionExpired();
279
            }
280
        };
271 281
        createFolder.setHeader("X-Auth-Token", app.getUserToken());
272 282
        createFolder.setHeader("Accept", "*/*");
273 283
        createFolder.setHeader("Content-Length", "0");
274 284
        createFolder.setHeader("Content-Type", "application/directory");
275 285
        Scheduler.get().scheduleDeferred(createFolder);
276
	}
277

  
278
	/**
279
	 * Upon closing the dialog by clicking OK or pressing ENTER this method does
280
	 * the actual work of modifying folder properties or creating a new Folder
281
	 * depending on the value of the create field
282
	 */
283
	protected void createOrUpdateFolder() {
284
		if (create)
285
			createFolder();
286
		else
287
			updateFolder();
288

  
289
	}
290

  
291
	private void updateFolder() {
286
    }
287

  
288
    /**
289
     * Upon closing the dialog by clicking OK or pressing ENTER this method does
290
     * the actual work of modifying folder properties or creating a new Folder
291
     * depending on the value of the create field
292
     */
293
    protected void createOrUpdateFolder() {
294
        if(create) {
295
            createFolder();
296
        }
297
        else {
298
            updateFolder();
299
        }
300

  
301
    }
302

  
303
    private void updateFolder() {
292 304
        final String newName = folderName.getText().trim();
293
        if (newName.length() == 0)
294
        	return;
295
        if (!folder.isContainer() && !folder.getName().equals(newName)) {
305
        if(newName.length() == 0) {
306
            return;
307
        }
308
        if(!folder.isContainer() && !folder.getName().equals(newName)) {
296 309
            final String path = folder.getParent().getUri() + "/" + newName;
297
            app.copyFolder(folder, folder.getOwner(), path, true, new Command() {
298
				
299
				@Override
300
				public void execute() {
310
            app.copyFolder(folder, folder.getOwnerID(), path, true, new Command() {
311

  
312
                @Override
313
                public void execute() {
301 314
                    app.updateFolder(folder.getParent(), false, new Command() {
302
            			
303
            			@Override
304
            			public void execute() {
305
            				app.updateMySharedRoot();
306
            			}
307
            		}, true);
308
				}
309
			});
315

  
316
                        @Override
317
                        public void execute() {
318
                            app.updateMySharedRoot();
319
                        }
320
                    }, true);
321
                }
322
            });
310 323
        }
311
        else
324
        else {
312 325
            app.updateFolder(folder.getParent(), false, new Command() {
313
    			
314
    			@Override
315
    			public void execute() {
316
    				app.updateMySharedRoot();
317
    			}
318
    		}, true);
319
	}
326

  
327
                @Override
328
                public void execute() {
329
                    app.updateMySharedRoot();
330
                }
331
            }, true);
332
        }
333
    }
320 334
}

Also available in: Unified diff