| Index: chrome/browser/resources/file_manager/js/image_editor/gallery.js
|
| ===================================================================
|
| --- chrome/browser/resources/file_manager/js/image_editor/gallery.js (revision 112157)
|
| +++ chrome/browser/resources/file_manager/js/image_editor/gallery.js (working copy)
|
| @@ -37,6 +37,7 @@
|
| this.onFadeTimeoutBound_ = this.onFadeTimeout_.bind(this);
|
| this.fadeTimeoutId_ = null;
|
| this.mouseOverTool_ = false;
|
| + this.imageChanges_ = 0;
|
|
|
| this.initDom_(shareActions);
|
| }
|
| @@ -96,6 +97,18 @@
|
| this.toolbar_.className = 'toolbar tool dimmable';
|
| this.container_.appendChild(this.toolbar_);
|
|
|
| + var filenameSpacer = doc.createElement('div');
|
| + filenameSpacer.className = 'filename-spacer';
|
| + this.toolbar_.appendChild(filenameSpacer);
|
| +
|
| + this.filenameEdit_ = doc.createElement('input');
|
| + this.filenameEdit_.setAttribute('type', 'text');
|
| + this.filenameEdit_.addEventListener('blur',
|
| + this.updateFilename_.bind(this));
|
| + this.filenameEdit_.addEventListener('keydown',
|
| + this.onFilenameEditKeydown_.bind(this));
|
| + filenameSpacer.appendChild(this.filenameEdit_);
|
| +
|
| this.ribbonSpacer_ = doc.createElement('div');
|
| this.ribbonSpacer_.className = 'ribbon-spacer';
|
| this.toolbar_.appendChild(this.ribbonSpacer_);
|
| @@ -153,6 +166,7 @@
|
| this.displayStringFunction_);
|
|
|
| this.imageView_ = this.editor_.getImageView();
|
| + this.imageView_.addContentCallback(this.onImageContentChanged_.bind(this));
|
|
|
| this.editor_.trackWindow(doc.defaultView);
|
|
|
| @@ -212,11 +226,21 @@
|
| var selectedURL = urls[selectedIndex];
|
| // Initialize the ribbon only after the selected image is fully loaded.
|
| this.metadataProvider_.fetch(selectedURL, function (metadata) {
|
| + // The first change is load, we should not count it.
|
| + self.imageChanges_ = -1;
|
| + self.filenameEdit_.value = ImageUtil.getFileNameFromUrl(selectedURL);
|
| self.editor_.openSession(
|
| selectedIndex, selectedURL, metadata, 0, initRibbon);
|
| });
|
| };
|
|
|
| +Gallery.prototype.onImageContentChanged_ = function() {
|
| + this.imageChanges_++;
|
| + if (this.imageChanges_ == 1)
|
| + this.ribbon_.getSelectedItem().setCopyName();
|
| + this.updateFilename_();
|
| +};
|
| +
|
| Gallery.prototype.saveItem_ = function(item, callback, canvas, modified) {
|
| if (modified) {
|
| item.save(
|
| @@ -227,6 +251,7 @@
|
| };
|
|
|
| Gallery.prototype.saveChanges_ = function(opt_callback) {
|
| + this.imageChanges_ = 0;
|
| this.editor_.requestImage(
|
| this.saveItem_.bind(this, this.ribbon_.getSelectedItem(), opt_callback));
|
| };
|
| @@ -237,6 +262,80 @@
|
| this.saveChanges_(action.execute.bind(action, [url]));
|
| };
|
|
|
| +Gallery.prototype.updateFilename_ = function() {
|
| + var item = this.ribbon_.getSelectedItem();
|
| + if (!item)
|
| + return;
|
| +
|
| + var fullName = item.getCopyName() ||
|
| + ImageUtil.getFullNameFromUrl(item.getUrl());
|
| + this.filenameEdit_.value = ImageUtil.getFileNameFromFullName(fullName);
|
| +};
|
| +
|
| +Gallery.prototype.onFilenameEditKeydown_ = function() {
|
| + switch (event.keyCode) {
|
| + case 27: // Escape
|
| + this.filenameEdit_.blur();
|
| + break;
|
| +
|
| + case 13: // Enter
|
| + if (this.filenameEdit_.value) {
|
| + this.renameItem_(this.ribbon_.getSelectedItem(),
|
| + this.filenameEdit_.value);
|
| + this.filenameEdit_.blur();
|
| + }
|
| + break;
|
| + }
|
| + event.stopPropagation();
|
| +};
|
| +
|
| +Gallery.prototype.renameItem_ = function(item, name) {
|
| + var dir = this.parentDirEntry_;
|
| + var self = this;
|
| + var newName;
|
| +
|
| + if (this.imageChanges_ > 0) {
|
| + // We are editing the file.
|
| + newName = ImageUtil.replaceFileNameInFullName(
|
| + item.getCopyName(), name);
|
| + } else {
|
| + newName = ImageUtil.replaceFileNameInFullName(
|
| + ImageUtil.getFullNameFromUrl(item.getUrl()), name);
|
| + }
|
| +
|
| + function onError() {
|
| + console.log('Rename error: "' +
|
| + ImageUtil.getFullNameFromUrl(item.getUrl()) + '" to "' + name + '"');
|
| + }
|
| +
|
| + function onSuccess(entry) {
|
| + item.setUrl(entry.toURL());
|
| + self.updateFilename_();
|
| + }
|
| +
|
| + function doRename() {
|
| + if (self.imageChanges_ > 0) {
|
| + // User this name in the next save operation.
|
| + item.setCopyName(newName);
|
| + self.updateFilename_();
|
| + } else {
|
| + // Rename file in place.
|
| + dir.getFile(
|
| + ImageUtil.getFullNameFromUrl(item.getUrl()),
|
| + {create: false},
|
| + function(entry) { entry.moveTo(dir, newName, onSuccess, onError); },
|
| + onError);
|
| + }
|
| + }
|
| +
|
| + function onVictimFound(victim) {
|
| + self.editor_.getPrompt().show('file_exists', 3000);
|
| + }
|
| +
|
| + dir.getFile(newName, {create: false, exclusive: false},
|
| + onVictimFound, doRename);
|
| +};
|
| +
|
| Gallery.prototype.onClose_ = function() {
|
| // TODO: handle write errors gracefully (suggest retry or saving elsewhere).
|
| this.saveChanges_(this.closeCallback_);
|
| @@ -247,6 +346,9 @@
|
| };
|
|
|
| Gallery.prototype.openImage = function(id, content, metadata, slide, callback) {
|
| + // The first change is load, we should not count it.
|
| + this.imageChanges_ = -1;
|
| + this.updateFilename_();
|
| this.editor_.openSession(id, content, metadata, slide, callback);
|
| };
|
|
|
| @@ -384,6 +486,9 @@
|
| this.client_ = client;
|
| this.metadataProvider_ = metadataProvider;
|
|
|
| + this.items_ = [];
|
| + this.selectedIndex_ = -1;
|
| +
|
| this.arrowLeft_ = arrowLeft;
|
| this.arrowLeft_.
|
| addEventListener('click', this.selectNext.bind(this, -1, null));
|
| @@ -678,6 +783,7 @@
|
| }
|
|
|
| this.original_ = true;
|
| + this.copyName_ = null;
|
| };
|
|
|
| Ribbon.Item.prototype.getIndex = function () { return this.index_ };
|
| @@ -687,7 +793,10 @@
|
| Ribbon.Item.prototype.isOriginal = function () { return this.original_ };
|
|
|
| Ribbon.Item.prototype.getUrl = function () { return this.url_ };
|
| +Ribbon.Item.prototype.setUrl = function (url) { this.url_ = url };
|
|
|
| +Ribbon.Item.prototype.getCopyName = function () { return this.copyName_ };
|
| +
|
| Ribbon.Item.prototype.isSelected = function() {
|
| return this.boxes_[0].hasAttribute('selected');
|
| };
|
| @@ -725,7 +834,9 @@
|
| }
|
|
|
| var newFile = this.isOriginal();
|
| - var name = this.getCopyName();
|
| + var name = this.copyName_;
|
| + this.original_ = false;
|
| + this.copyName_ = '';
|
|
|
| function onSuccess(url) {
|
| console.log('Saved from gallery', name);
|
| @@ -761,9 +872,9 @@
|
| };
|
|
|
| // TODO: Localize?
|
| -Ribbon.Item.COPY_SIGNATURE = '_Edited_';
|
| +Ribbon.Item.COPY_SIGNATURE = 'Copy of ';
|
|
|
| -Ribbon.Item.prototype.getCopyName = function () {
|
| +Ribbon.Item.prototype.createCopyName_ = function () {
|
| // When saving a modified image we never overwrite the original file (the one
|
| // that existed prior to opening the Gallery. Instead we save to a file named
|
| // <original-name>_Edited_<date-stamp>.<original extension>.
|
| @@ -775,19 +886,16 @@
|
| if (!this.original_)
|
| return name;
|
|
|
| - this.original_ = false;
|
| -
|
| var ext = '';
|
| var index = name.lastIndexOf('.');
|
| if (index != -1) {
|
| ext = name.substr(index);
|
| name = name.substr(0, index);
|
| }
|
| - var signaturePos = name.indexOf(Ribbon.Item.COPY_SIGNATURE);
|
| - if (signaturePos >= 0) {
|
| - // The file is likely to be a copy created during a previous session.
|
| - // Replace the signature instead of appending a new one.
|
| - name = name.substr(0, signaturePos);
|
| +
|
| + if (name.indexOf(Ribbon.Item.COPY_SIGNATURE) == 0) {
|
| + // TODO(dgozman): add a number to form 'Copy (X) of File.jpg'.
|
| + name = name.substr(Ribbon.Item.COPY_SIGNATURE.length);
|
| }
|
|
|
| var mimeType = this.metadata_.mimeType.toLowerCase();
|
| @@ -806,21 +914,15 @@
|
| }
|
| }
|
|
|
| - function twoDigits(n) { return (n < 10 ? '0' : '' ) + n }
|
| + return Ribbon.Item.COPY_SIGNATURE + name + ext;
|
| +};
|
|
|
| - var now = new Date();
|
| -
|
| - // Datestamp the copy with YYYYMMDD_HHMMSS (similar to what many cameras do)
|
| - return name +
|
| - Ribbon.Item.COPY_SIGNATURE +
|
| - now.getFullYear() +
|
| - twoDigits(now.getMonth() + 1) +
|
| - twoDigits(now.getDate()) +
|
| - '_' +
|
| - twoDigits(now.getHours()) +
|
| - twoDigits(now.getMinutes()) +
|
| - twoDigits(now.getSeconds()) +
|
| - ext;
|
| +Ribbon.Item.prototype.setCopyName = function(opt_name) {
|
| + if (opt_name) {
|
| + this.copyName_ = opt_name;
|
| + } else {
|
| + this.copyName_ = this.createCopyName_();
|
| + }
|
| };
|
|
|
| // The url and metadata stored in the item are not valid while the modified
|
|
|