diff --git a/platform/commonUI/browse/bundle.json b/platform/commonUI/browse/bundle.json index 8fed67e5e7..dcf1ba9a38 100644 --- a/platform/commonUI/browse/bundle.json +++ b/platform/commonUI/browse/bundle.json @@ -121,6 +121,12 @@ "depends": [ "typeService", "dialogService", "creationService", "policyService" ] } ], + "runs": [ + { + "implementation": "windowing/WindowTitler.js", + "depends": [ "navigationService", "$rootScope", "$document" ] + } + ], "licenses": [ { "name": "screenfull.js", diff --git a/platform/commonUI/browse/src/BrowseController.js b/platform/commonUI/browse/src/BrowseController.js index 15e979ae40..e2c2484e1b 100644 --- a/platform/commonUI/browse/src/BrowseController.js +++ b/platform/commonUI/browse/src/BrowseController.js @@ -46,6 +46,7 @@ define( function setNavigation(domainObject) { $scope.navigatedObject = domainObject; $scope.treeModel.selectedObject = domainObject; + navigationService.setNavigation(domainObject); } // Load the root object, put it in the scope. diff --git a/platform/commonUI/browse/src/navigation/NavigationService.js b/platform/commonUI/browse/src/navigation/NavigationService.js index 642c5f1bc4..c8c76857b8 100644 --- a/platform/commonUI/browse/src/navigation/NavigationService.js +++ b/platform/commonUI/browse/src/navigation/NavigationService.js @@ -45,10 +45,12 @@ define( // Setter for navigation; invokes callbacks function setNavigation(value) { - navigated = value; - callbacks.forEach(function (callback) { - callback(value); - }); + if (navigated !== value) { + navigated = value; + callbacks.forEach(function (callback) { + callback(value); + }); + } } // Adds a callback diff --git a/platform/commonUI/browse/src/windowing/WindowTitler.js b/platform/commonUI/browse/src/windowing/WindowTitler.js new file mode 100644 index 0000000000..9db65e5b0e --- /dev/null +++ b/platform/commonUI/browse/src/windowing/WindowTitler.js @@ -0,0 +1,52 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +define( + [], + function () { + "use strict"; + + /** + * Updates the title of the current window to reflect the name + * of the currently navigated-to domain object. + * @constructor + */ + function WindowTitler(navigationService, $rootScope, $document) { + // Look up name of the navigated domain object... + function getNavigatedObjectName() { + var navigatedObject = navigationService.getNavigation(); + return navigatedObject && navigatedObject.getModel().name; + } + + // Set the window title... + function setTitle(name) { + $document[0].title = name; + } + + // Watch the former, and invoke the latter + $rootScope.$watch(getNavigatedObjectName, setTitle); + } + + return WindowTitler; + } +); \ No newline at end of file diff --git a/platform/commonUI/browse/test/navigation/NavigationServiceSpec.js b/platform/commonUI/browse/test/navigation/NavigationServiceSpec.js index 212419ca17..6d7f3fd20d 100644 --- a/platform/commonUI/browse/test/navigation/NavigationServiceSpec.js +++ b/platform/commonUI/browse/test/navigation/NavigationServiceSpec.js @@ -62,6 +62,16 @@ define( expect(callback).toHaveBeenCalledWith(testObject); }); + it("does not notify listeners when no changes occur", function () { + var testObject = { someKey: 42 }, + callback = jasmine.createSpy("callback"); + + navigationService.addListener(callback); + navigationService.setNavigation(testObject); + navigationService.setNavigation(testObject); + expect(callback.calls.length).toEqual(1); + }); + it("stops notifying listeners after removal", function () { var testObject = { someKey: 42 }, callback = jasmine.createSpy("callback"); diff --git a/platform/commonUI/browse/test/suite.json b/platform/commonUI/browse/test/suite.json index 2c74311faa..21d76dae05 100644 --- a/platform/commonUI/browse/test/suite.json +++ b/platform/commonUI/browse/test/suite.json @@ -8,5 +8,6 @@ "creation/LocatorController", "navigation/NavigateAction", "navigation/NavigationService", - "windowing/FullscreenAction" + "windowing/FullscreenAction", + "windowing/WindowTitler" ] \ No newline at end of file diff --git a/platform/commonUI/browse/test/windowing/WindowTitlerSpec.js b/platform/commonUI/browse/test/windowing/WindowTitlerSpec.js new file mode 100644 index 0000000000..d9c71a86dd --- /dev/null +++ b/platform/commonUI/browse/test/windowing/WindowTitlerSpec.js @@ -0,0 +1,80 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * WindowTitlerSpec. Created by vwoeltje on 11/6/14. + */ +define( + ["../../src/windowing/WindowTitler"], + function (WindowTitler) { + "use strict"; + + describe("The window titler", function () { + var mockNavigationService, + mockRootScope, + mockDocument, + mockDomainObject, + titler; + + beforeEach(function () { + mockNavigationService = jasmine.createSpyObj( + 'navigationService', + [ 'getNavigation' ] + ); + mockRootScope = jasmine.createSpyObj( + '$rootScope', + [ '$watch' ] + ); + mockDomainObject = jasmine.createSpyObj( + 'domainObject', + ['getModel'] + ); + mockDocument = [{}]; + + mockDomainObject.getModel.andReturn({ name: 'Test name' }); + mockNavigationService.getNavigation.andReturn(mockDomainObject); + + titler = new WindowTitler( + mockNavigationService, + mockRootScope, + mockDocument + ); + }); + + it("listens for changes to the name of the navigated object", function () { + expect(mockRootScope.$watch).toHaveBeenCalledWith( + jasmine.any(Function), + jasmine.any(Function) + ); + expect(mockRootScope.$watch.mostRecentCall.args[0]()) + .toEqual('Test name'); + }); + + it("sets the title to the name of the navigated object", function () { + mockRootScope.$watch.mostRecentCall.args[1]("Some name"); + expect(mockDocument[0].title).toEqual("Some name"); + }); + + }); + } +); \ No newline at end of file