Skip to content
This repository was archived by the owner on Sep 6, 2021. It is now read-only.

Commit 7c3c5c9

Browse files
author
Marcel Gerber
committed
Merge remote-tracking branch 'upstream/master' into unused-vars
Conflicts: src/search/FindReplace.js src/utils/ViewUtils.js
2 parents 07db97c + b526784 commit 7c3c5c9

File tree

8 files changed

+318
-105
lines changed

8 files changed

+318
-105
lines changed

src/editor/EditorManager.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,8 @@ define(function (require, exports, module) {
177177
* @param {?File} file - current file (can be null)
178178
*/
179179
function _handlecurrentFileChange(e, file) {
180-
var doc = file ? DocumentManager.getOpenDocumentForPath(file.fullPath) : null;
181-
_notifyActiveEditorChanged(doc ? doc._masterEditor : null);
180+
var doc = file && DocumentManager.getOpenDocumentForPath(file.fullPath);
181+
_notifyActiveEditorChanged(doc && doc._masterEditor);
182182
}
183183

184184
/**
@@ -209,7 +209,7 @@ define(function (require, exports, module) {
209209
return editor;
210210
}
211211

212-
/**
212+
/**
213213
* @private
214214
* Finds an inline widget provider from the given list that can offer a widget for the current cursor
215215
* position, and once the widget has been created inserts it into the editor.
@@ -553,9 +553,10 @@ define(function (require, exports, module) {
553553

554554
// show the view
555555
pane.showView(document._masterEditor);
556+
556557
// give it focus
557558
document._masterEditor.focus();
558-
559+
559560
if (createdNewEditor) {
560561
_restoreEditorViewState(document._masterEditor);
561562
}

src/editor/ImageViewer.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ define(function (require, exports, module) {
5151
*/
5252
function ImageView(file, $container) {
5353
this.file = file;
54-
this.$el = $(Mustache.render(ImageViewTemplate, {fullPath: file.fullPath}));
54+
this.$el = $(Mustache.render(ImageViewTemplate, {fullPath: file.fullPath,
55+
now: new Date().valueOf()}));
5556

5657
$container.append(this.$el);
5758

@@ -393,15 +394,18 @@ define(function (require, exports, module) {
393394
*/
394395
ImageView.prototype.refresh = function () {
395396
var noCacheUrl = this.$imagePreview.attr("src"),
396-
now = new Date().valueOf();
397+
now = new Date().valueOf(),
398+
index = noCacheUrl.indexOf("?");
397399

398-
// Append a #<time-stamp> fragement to the URL
399-
// to force a reload of the image
400-
if (noCacheUrl.indexOf("#") > 0) {
401-
noCacheUrl = noCacheUrl.replace(/#\d+/, "#" + now);
402-
} else {
403-
noCacheUrl = noCacheUrl + "#" + now;
400+
// strip the old param off
401+
if (index > 0) {
402+
noCacheUrl = noCacheUrl.slice(0, index);
404403
}
404+
405+
// add a new param which will force chrome to
406+
// re-read the image from disk
407+
noCacheUrl = noCacheUrl + "?ver=" + now;
408+
405409

406410
// Update the DOM node with the src URL
407411
this.$imagePreview.attr("src", noCacheUrl);

src/htmlContent/image-view.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
</div>
77
<div class="image">
88
<div class="image-scale"></div>
9-
<img class="image-preview" src="file:///{{fullPath}}">
9+
<img class="image-preview" src="file:///{{fullPath}}?ver={{now}}">
1010
<div class="image-tip">
1111
<table class="tip-container">
1212
<tr>

src/utils/Async.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,11 +337,16 @@ define(function (require, exports, module) {
337337
* @param {boolean=} failOnReject Whether to reject or not if one of the promises has been rejected.
338338
* @param {number=} timeout Number of milliseconds to wait until rejecting the promise
339339
*
340-
* @return {$.Promise} Promise which will be completed once al the
340+
* @return {$.Promise} A Promise which will be resolved once all dependent promises are resolved.
341+
* It is resolved with an array of results from the successfully resolved dependent promises.
342+
* The resulting array may not be in the same order or contain as many items as there were
343+
* promises to wait on and it will contain 'undefined' entries for those promises that resolve
344+
* without a result.
341345
*
342346
*/
343347
function waitForAll(promises, failOnReject, timeout) {
344348
var masterDeferred = new $.Deferred(),
349+
results = [],
345350
count = 0,
346351
sawRejects = false;
347352

@@ -362,13 +367,16 @@ define(function (require, exports, module) {
362367
.fail(function (err) {
363368
sawRejects = true;
364369
})
370+
.done(function (result) {
371+
results.push(result);
372+
})
365373
.always(function () {
366374
count++;
367375
if (count === promises.length) {
368376
if (failOnReject && sawRejects) {
369377
masterDeferred.reject();
370378
} else {
371-
masterDeferred.resolve();
379+
masterDeferred.resolve(results);
372380
}
373381
}
374382
});

src/utils/Resizer.js

Lines changed: 91 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,29 @@ define(function (require, exports, module) {
101101
}
102102
}
103103

104+
/**
105+
* Removes the resizability of an element if it's resizable
106+
* @param {DOMNode} element Html element in which to remove sizing
107+
*/
108+
function removeSizable(element) {
109+
var removeSizableFunc = $(element).data("removeSizable");
110+
if (removeSizableFunc) {
111+
removeSizableFunc.apply(element);
112+
}
113+
}
114+
115+
/**
116+
* Updates the sizing div by resyncing to the sizing edge of the element
117+
* Call this method after manually changing the size of the element
118+
* @param {DOMNode} element Html element whose sizer should be resynchronized
119+
*/
120+
function resyncSizer(element) {
121+
var resyncSizerFunc = $(element).data("resyncSizer");
122+
if (resyncSizerFunc) {
123+
resyncSizerFunc.apply(element);
124+
}
125+
}
126+
104127
/**
105128
* Returns the visibility state of a resizable element.
106129
* @param {DOMNode} element Html element to toggle
@@ -144,9 +167,10 @@ define(function (require, exports, module) {
144167
* the resizable element's size (useful for siblings laid out to the right of
145168
* the element). Must lie in element's parent's subtree.
146169
* @param {?boolean} createdByWorkspaceManager For internal use only
170+
* @param {?boolean} usePercentages Maintain the size of the element as a percentage of its parent
171+
* the default is to maintain the size of the element in pixels
147172
*/
148-
function makeResizable(element, direction, position, minSize, collapsible, forceLeft, createdByWorkspaceManager) {
149-
173+
function makeResizable(element, direction, position, minSize, collapsible, forceLeft, createdByWorkspaceManager, usePercentages) {
150174
var $resizer = $('<div class="' + direction + '-resizer"></div>'),
151175
$element = $(element),
152176
$parent = $element.parent(),
@@ -157,7 +181,40 @@ define(function (require, exports, module) {
157181
animationRequest = null,
158182
directionProperty = direction === DIRECTION_HORIZONTAL ? "clientX" : "clientY",
159183
directionIncrement = (position === POSITION_TOP || position === POSITION_LEFT) ? 1 : -1,
160-
elementSizeFunction = direction === DIRECTION_HORIZONTAL ? $element.width : $element.height,
184+
parentSizeFunction = direction === DIRECTION_HORIZONTAL ? $parent.innerWidth : $parent.innerHeight,
185+
186+
elementSizeFunction = function (newSize) {
187+
if (!newSize) {
188+
// calling the function as a getter
189+
if (direction === DIRECTION_HORIZONTAL) {
190+
return this.width();
191+
} else {
192+
return this.height();
193+
}
194+
} else if (!usePercentages) {
195+
if (direction === DIRECTION_HORIZONTAL) {
196+
return this.width(newSize);
197+
} else {
198+
return this.height(newSize);
199+
}
200+
} else {
201+
// calling the function as a setter
202+
var parentSize = parentSizeFunction.apply($parent),
203+
percentage,
204+
prop;
205+
206+
if (direction === DIRECTION_HORIZONTAL) {
207+
prop = "width";
208+
} else {
209+
prop = "height";
210+
}
211+
percentage = newSize / parentSize;
212+
this.css(prop, (percentage * 100) + "%");
213+
214+
return this; // chainable
215+
}
216+
},
217+
161218
resizerCSSPosition = direction === DIRECTION_HORIZONTAL ? "left" : "top",
162219
contentSizeFunction = direction === DIRECTION_HORIZONTAL ? $resizableElement.width : $resizableElement.height;
163220

@@ -197,6 +254,30 @@ define(function (require, exports, module) {
197254
}
198255
}
199256

257+
// If the resizer is positioned right or bottom of the panel, we need to listen to
258+
// reposition it if the element size changes externally
259+
function repositionResizer(elementSize) {
260+
var resizerPosition = elementSize || 1;
261+
if (position === POSITION_RIGHT || position === POSITION_BOTTOM) {
262+
$resizer.css(resizerCSSPosition, resizerPosition);
263+
}
264+
}
265+
266+
$element.data("removeSizable", function () {
267+
$resizer.off(".resizer");
268+
269+
$element.removeData("show");
270+
$element.removeData("hide");
271+
$element.removeData("resyncSizer");
272+
$element.removeData("removeSizable");
273+
274+
$resizer.remove();
275+
});
276+
277+
$element.data("resyncSizer", function () {
278+
repositionResizer(elementSizeFunction.apply($element));
279+
});
280+
200281
$element.data("show", function () {
201282
var elementOffset = $element.offset(),
202283
elementSize = elementSizeFunction.apply($element) || elementPrefs.size,
@@ -247,16 +328,8 @@ define(function (require, exports, module) {
247328
PreferencesManager.setViewState(elementID, elementPrefs, null, isResizing);
248329
});
249330

250-
// If the resizer is positioned right or bottom of the panel, we need to listen to
251-
// reposition it if the element size changes externally
252-
function repositionResizer(elementSize) {
253-
var resizerPosition = elementSize || 1;
254-
if (position === POSITION_RIGHT || position === POSITION_BOTTOM) {
255-
$resizer.css(resizerCSSPosition, resizerPosition);
256-
}
257-
}
258-
259-
$resizer.on("mousedown", function (e) {
331+
332+
$resizer.on("mousedown.resizer", function (e) {
260333
var $resizeShield = $("<div class='resizing-container " + direction + "-resizing' />"),
261334
startPosition = e[directionProperty],
262335
startSize = $element.is(":visible") ? elementSizeFunction.apply($element) : 0,
@@ -408,7 +481,7 @@ define(function (require, exports, module) {
408481
}
409482
}
410483
}
411-
484+
412485
// Scan DOM for horz-resizable and vert-resizable classes and make them resizable
413486
AppInit.htmlReady(function () {
414487
var minSize = DEFAULT_MIN_SIZE;
@@ -465,6 +538,8 @@ define(function (require, exports, module) {
465538
PreferencesManager.convertPreferences(module, {"panelState": "user"}, true, _isPanelPreferences);
466539

467540
exports.makeResizable = makeResizable;
541+
exports.removeSizable = removeSizable;
542+
exports.resyncSizer = resyncSizer;
468543
exports.toggle = toggle;
469544
exports.show = show;
470545
exports.hide = hide;
@@ -475,4 +550,6 @@ define(function (require, exports, module) {
475550
exports.DIRECTION_HORIZONTAL = DIRECTION_HORIZONTAL;
476551
exports.POSITION_TOP = POSITION_TOP;
477552
exports.POSITION_RIGHT = POSITION_RIGHT;
553+
exports.POSITION_BOTTOM = POSITION_BOTTOM;
554+
exports.POSITION_LEFT = POSITION_LEFT;
478555
});

src/utils/ViewUtils.js

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,7 @@ define(function (require, exports, module) {
184184
*/
185185
function sidebarList($scrollerElement, selectedClassName, leafClassName) {
186186
var $listElement = $scrollerElement.find("ul"),
187-
$selectionMarker,
188-
$selectionTriangle,
189-
$sidebar = $("#sidebar"),
190-
showTriangle = true;
187+
$selectionMarker;
191188

192189
// build selectionMarker and position absolute within the scroller
193190
$selectionMarker = $(window.document.createElement("div")).addClass("sidebar-selection");
@@ -198,56 +195,22 @@ define(function (require, exports, module) {
198195

199196
// use relative postioning for clipping the selectionMarker within the scrollElement
200197
$scrollerElement.css("position", "relative");
201-
202-
// build selectionTriangle and position fixed to the window
203-
$selectionTriangle = $(window.document.createElement("div")).addClass("sidebar-selection-triangle");
204-
205-
$scrollerElement.append($selectionTriangle);
198+
206199

207200
selectedClassName = "." + (selectedClassName || "selected");
208201

209-
var updateSelectionTriangle = function () {
210-
var selectionMarkerHeight = $selectionMarker.height(),
211-
selectionMarkerOffset = $selectionMarker.offset(), // offset relative to *document*
212-
scrollerOffset = $scrollerElement.offset(),
213-
triangleHeight = $selectionTriangle.outerHeight(),
214-
scrollerTop = scrollerOffset.top,
215-
scrollerBottom = scrollerTop + $scrollerElement.outerHeight(),
216-
triangleTop = selectionMarkerOffset.top;
217-
218-
$selectionTriangle.css("top", triangleTop);
219-
$selectionTriangle.css("left", $sidebar.width() - $selectionTriangle.outerWidth());
220-
toggleClass($selectionTriangle, "triangle-visible", showTriangle);
221-
222-
var triangleClipOffsetYBy = Math.floor((selectionMarkerHeight - triangleHeight) / 2),
223-
triangleBottom = triangleTop + triangleHeight + triangleClipOffsetYBy;
224-
225-
if (triangleTop < scrollerTop || triangleBottom > scrollerBottom) {
226-
$selectionTriangle.css("clip", "rect(" + Math.max(scrollerTop - triangleTop - triangleClipOffsetYBy, 0) + "px, auto, " +
227-
(triangleHeight - Math.max(triangleBottom - scrollerBottom, 0)) + "px, auto)");
228-
} else {
229-
$selectionTriangle.css("clip", "");
230-
}
231-
};
232202

233203
var hideSelectionMarker = function (event) {
234-
$selectionTriangle.addClass("forced-hidden");
235204
$selectionMarker.addClass("forced-hidden");
236205
};
237206

238207
var updateSelectionMarker = function (event, reveal) {
239208
// find the selected list item
240209
var $listItem = $listElement.find(selectedClassName).closest("li");
241210

242-
if (leafClassName) {
243-
showTriangle = $listItem.hasClass(leafClassName);
244-
}
245-
246-
$selectionTriangle.removeClass("forced-hidden");
247211
$selectionMarker.removeClass("forced-hidden");
248212

249213
// always hide selection visuals first to force layout (issue #719)
250-
$selectionTriangle.hide();
251214
$selectionMarker.hide();
252215

253216
if ($listItem.length === 1) {
@@ -261,9 +224,6 @@ define(function (require, exports, module) {
261224
$selectionMarker.css("top", selectionMarkerTop);
262225
$selectionMarker.show();
263226

264-
updateSelectionTriangle();
265-
$selectionTriangle.show();
266-
267227
// fully scroll to the selectionMarker if it's not initially in the viewport
268228
var scrollerElement = $scrollerElement.get(0),
269229
scrollerHeight = scrollerElement.clientHeight,
@@ -283,15 +243,10 @@ define(function (require, exports, module) {
283243
};
284244

285245
$listElement.on("selectionChanged", updateSelectionMarker);
286-
$scrollerElement.on("scroll", updateSelectionTriangle);
287-
$scrollerElement.on("selectionRedraw", updateSelectionTriangle);
288246
$scrollerElement.on("selectionHide", hideSelectionMarker);
289247

290248
// update immediately
291249
updateSelectionMarker();
292-
293-
// update clipping when the window resizes
294-
_resizeHandlers.push(updateSelectionTriangle);
295250
}
296251

297252
/**

0 commit comments

Comments
 (0)