/
githubmirror
/
brackets
Обзор
Документация
Войти
/
githubmirror
/
brackets
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
release-1.9-prerelease
src/command/DefaultMenus.js
378 строк
16 KB
Mansimar Kaur
Disabled context menu items for unsaved files (#12806)
01 мар 2017, 22:05
01 мар 2017, 22:05
f4f40d8
Код
Авторство
О чём код?
/* * Copyright (c) 2013 - present Adobe Systems Incorporated. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * */ /** * Initializes the default brackets menu items. */ define(function (require, exports, module) { "use strict"; var AppInit = require("utils/AppInit"), Commands = require("command/Commands"), Menus = require("command/Menus"), Strings = require("strings"), MainViewManager = require("view/MainViewManager"), CommandManager = require("command/CommandManager"); /** * Disables menu items present in items if enabled is true. * enabled is true if file is saved and present on user system. * @param {boolean} enabled * @param {array} items */ function _setContextMenuItemsVisible(enabled, items) { items.forEach(function (item) { CommandManager.get(item).setEnabled(enabled); }); } /** * Checks if file saved and present on system and * disables menu items accordingly */ function _setMenuItemsVisible() { var file = MainViewManager.getCurrentlyViewedFile(MainViewManager.ACTIVE_PANE); if (file) { file.exists(function (err, isPresent) { if (err) { return err; } _setContextMenuItemsVisible(isPresent, [Commands.FILE_RENAME, Commands.NAVIGATE_SHOW_IN_FILE_TREE, Commands.NAVIGATE_SHOW_IN_OS]); }); } } AppInit.htmlReady(function () { /* * File menu */ var menu; menu = Menus.addMenu(Strings.FILE_MENU, Menus.AppMenuBar.FILE_MENU); menu.addMenuItem(Commands.FILE_NEW_UNTITLED); menu.addMenuItem(Commands.FILE_OPEN); menu.addMenuItem(Commands.FILE_OPEN_FOLDER); menu.addMenuItem(Commands.FILE_CLOSE); menu.addMenuItem(Commands.FILE_CLOSE_ALL); menu.addMenuDivider(); menu.addMenuItem(Commands.FILE_SAVE); menu.addMenuItem(Commands.FILE_SAVE_ALL); menu.addMenuItem(Commands.FILE_SAVE_AS); menu.addMenuDivider(); menu.addMenuItem(Commands.FILE_LIVE_FILE_PREVIEW); menu.addMenuItem(Commands.TOGGLE_LIVE_PREVIEW_MB_MODE); menu.addMenuItem(Commands.FILE_PROJECT_SETTINGS); menu.addMenuDivider(); menu.addMenuItem(Commands.FILE_EXTENSION_MANAGER); // suppress redundant quit menu item on mac if (brackets.platform !== "mac" || !brackets.nativeMenus) { menu.addMenuDivider(); menu.addMenuItem(Commands.FILE_QUIT); } /* * Edit menu */ menu = Menus.addMenu(Strings.EDIT_MENU, Menus.AppMenuBar.EDIT_MENU); menu.addMenuItem(Commands.EDIT_UNDO); menu.addMenuItem(Commands.EDIT_REDO); menu.addMenuDivider(); if (brackets.nativeMenus) { // Native-only - can't programmatically trigger clipboard actions from JS menus menu.addMenuItem(Commands.EDIT_CUT); menu.addMenuItem(Commands.EDIT_COPY); menu.addMenuItem(Commands.EDIT_PASTE); menu.addMenuDivider(); } menu.addMenuItem(Commands.EDIT_SELECT_ALL); menu.addMenuItem(Commands.EDIT_SELECT_LINE); menu.addMenuItem(Commands.EDIT_SPLIT_SEL_INTO_LINES); menu.addMenuItem(Commands.EDIT_ADD_CUR_TO_PREV_LINE); menu.addMenuItem(Commands.EDIT_ADD_CUR_TO_NEXT_LINE); menu.addMenuDivider(); menu.addMenuItem(Commands.EDIT_INDENT); menu.addMenuItem(Commands.EDIT_UNINDENT); menu.addMenuItem(Commands.EDIT_DUPLICATE); menu.addMenuItem(Commands.EDIT_DELETE_LINES); menu.addMenuItem(Commands.EDIT_LINE_UP); menu.addMenuItem(Commands.EDIT_LINE_DOWN); menu.addMenuDivider(); menu.addMenuItem(Commands.EDIT_LINE_COMMENT); menu.addMenuItem(Commands.EDIT_BLOCK_COMMENT); menu.addMenuDivider(); menu.addMenuItem(Commands.SHOW_CODE_HINTS); menu.addMenuDivider(); menu.addMenuItem(Commands.TOGGLE_CLOSE_BRACKETS); /* * Find menu */ menu = Menus.addMenu(Strings.FIND_MENU, Menus.AppMenuBar.FIND_MENU); menu.addMenuItem(Commands.CMD_FIND); menu.addMenuItem(Commands.CMD_FIND_NEXT); menu.addMenuItem(Commands.CMD_FIND_PREVIOUS); menu.addMenuItem(Commands.CMD_FIND_ALL_AND_SELECT); menu.addMenuItem(Commands.CMD_ADD_NEXT_MATCH); menu.addMenuItem(Commands.CMD_SKIP_CURRENT_MATCH); menu.addMenuDivider(); menu.addMenuItem(Commands.CMD_FIND_IN_FILES); menu.addMenuDivider(); menu.addMenuItem(Commands.CMD_REPLACE); menu.addMenuItem(Commands.CMD_REPLACE_IN_FILES); /* * View menu */ menu = Menus.addMenu(Strings.VIEW_MENU, Menus.AppMenuBar.VIEW_MENU); menu.addMenuItem(Commands.CMD_THEMES_OPEN_SETTINGS); menu.addMenuDivider(); menu.addMenuItem(Commands.CMD_SPLITVIEW_NONE); menu.addMenuItem(Commands.CMD_SPLITVIEW_VERTICAL); menu.addMenuItem(Commands.CMD_SPLITVIEW_HORIZONTAL); menu.addMenuDivider(); menu.addMenuItem(Commands.VIEW_HIDE_SIDEBAR); menu.addMenuDivider(); menu.addMenuItem(Commands.VIEW_INCREASE_FONT_SIZE); menu.addMenuItem(Commands.VIEW_DECREASE_FONT_SIZE); menu.addMenuItem(Commands.VIEW_RESTORE_FONT_SIZE); menu.addMenuDivider(); menu.addMenuItem(Commands.TOGGLE_ACTIVE_LINE); menu.addMenuItem(Commands.TOGGLE_LINE_NUMBERS); menu.addMenuItem(Commands.TOGGLE_WORD_WRAP); menu.addMenuDivider(); menu.addMenuItem(Commands.FILE_LIVE_HIGHLIGHT); menu.addMenuDivider(); menu.addMenuItem(Commands.VIEW_TOGGLE_INSPECTION); /* * Navigate menu */ menu = Menus.addMenu(Strings.NAVIGATE_MENU, Menus.AppMenuBar.NAVIGATE_MENU); menu.addMenuItem(Commands.NAVIGATE_QUICK_OPEN); menu.addMenuItem(Commands.NAVIGATE_GOTO_LINE); menu.addMenuItem(Commands.NAVIGATE_GOTO_DEFINITION); menu.addMenuItem(Commands.NAVIGATE_JUMPTO_DEFINITION); menu.addMenuItem(Commands.NAVIGATE_GOTO_FIRST_PROBLEM); menu.addMenuDivider(); menu.addMenuItem(Commands.NAVIGATE_NEXT_DOC); menu.addMenuItem(Commands.NAVIGATE_PREV_DOC); menu.addMenuItem(Commands.NAVIGATE_NEXT_DOC_LIST_ORDER); menu.addMenuItem(Commands.NAVIGATE_PREV_DOC_LIST_ORDER); menu.addMenuDivider(); menu.addMenuItem(Commands.NAVIGATE_SHOW_IN_FILE_TREE); menu.addMenuDivider(); menu.addMenuItem(Commands.TOGGLE_QUICK_EDIT); menu.addMenuItem(Commands.QUICK_EDIT_PREV_MATCH); menu.addMenuItem(Commands.QUICK_EDIT_NEXT_MATCH); menu.addMenuItem(Commands.CSS_QUICK_EDIT_NEW_RULE); menu.addMenuDivider(); menu.addMenuItem(Commands.TOGGLE_QUICK_DOCS); /* * Help menu */ menu = Menus.addMenu(Strings.HELP_MENU, Menus.AppMenuBar.HELP_MENU); menu.addMenuItem(Commands.HELP_CHECK_FOR_UPDATE); menu.addMenuDivider(); if (brackets.config.how_to_use_url) { menu.addMenuItem(Commands.HELP_HOW_TO_USE_BRACKETS); } if (brackets.config.support_url) { menu.addMenuItem(Commands.HELP_SUPPORT); } if (brackets.config.suggest_feature_url) { menu.addMenuItem(Commands.HELP_SUGGEST); } if (brackets.config.release_notes_url) { menu.addMenuItem(Commands.HELP_RELEASE_NOTES); } if (brackets.config.get_involved_url) { menu.addMenuItem(Commands.HELP_GET_INVOLVED); } menu.addMenuDivider(); menu.addMenuItem(Commands.HELP_SHOW_EXT_FOLDER); var hasAboutItem = (brackets.platform !== "mac" || !brackets.nativeMenus); // Add final divider only if we have a homepage URL or twitter URL or about item if (hasAboutItem || brackets.config.homepage_url || brackets.config.twitter_url) { menu.addMenuDivider(); } if (brackets.config.homepage_url) { menu.addMenuItem(Commands.HELP_HOMEPAGE); } if (brackets.config.twitter_url) { menu.addMenuItem(Commands.HELP_TWITTER); } // supress redundant about menu item in mac shell if (hasAboutItem) { menu.addMenuItem(Commands.HELP_ABOUT); } /* * Context Menus */ // WorkingSet context menu - Unlike most context menus, we can't attach // listeners here because the DOM nodes for each pane's working set are // created dynamically. Each WorkingSetView attaches its own listeners. var workingset_cmenu = Menus.registerContextMenu(Menus.ContextMenuIds.WORKING_SET_CONTEXT_MENU); workingset_cmenu.addMenuItem(Commands.FILE_SAVE); workingset_cmenu.addMenuItem(Commands.FILE_SAVE_AS); workingset_cmenu.addMenuItem(Commands.FILE_RENAME); workingset_cmenu.addMenuItem(Commands.NAVIGATE_SHOW_IN_FILE_TREE); workingset_cmenu.addMenuItem(Commands.NAVIGATE_SHOW_IN_OS); workingset_cmenu.addMenuDivider(); workingset_cmenu.addMenuItem(Commands.CMD_FIND_IN_SUBTREE); workingset_cmenu.addMenuItem(Commands.CMD_REPLACE_IN_SUBTREE); workingset_cmenu.addMenuDivider(); workingset_cmenu.addMenuItem(Commands.FILE_CLOSE); var workingset_configuration_menu = Menus.registerContextMenu(Menus.ContextMenuIds.WORKING_SET_CONFIG_MENU); workingset_configuration_menu.addMenuItem(Commands.CMD_WORKINGSET_SORT_BY_ADDED); workingset_configuration_menu.addMenuItem(Commands.CMD_WORKINGSET_SORT_BY_NAME); workingset_configuration_menu.addMenuItem(Commands.CMD_WORKINGSET_SORT_BY_TYPE); workingset_configuration_menu.addMenuDivider(); workingset_configuration_menu.addMenuItem(Commands.CMD_WORKING_SORT_TOGGLE_AUTO); var splitview_menu = Menus.registerContextMenu(Menus.ContextMenuIds.SPLITVIEW_MENU); splitview_menu.addMenuItem(Commands.CMD_SPLITVIEW_NONE); splitview_menu.addMenuItem(Commands.CMD_SPLITVIEW_VERTICAL); splitview_menu.addMenuItem(Commands.CMD_SPLITVIEW_HORIZONTAL); var project_cmenu = Menus.registerContextMenu(Menus.ContextMenuIds.PROJECT_MENU); project_cmenu.addMenuItem(Commands.FILE_NEW); project_cmenu.addMenuItem(Commands.FILE_NEW_FOLDER); project_cmenu.addMenuItem(Commands.FILE_RENAME); project_cmenu.addMenuItem(Commands.FILE_DELETE); project_cmenu.addMenuItem(Commands.NAVIGATE_SHOW_IN_OS); project_cmenu.addMenuDivider(); project_cmenu.addMenuItem(Commands.CMD_FIND_IN_SUBTREE); project_cmenu.addMenuItem(Commands.CMD_REPLACE_IN_SUBTREE); project_cmenu.addMenuDivider(); project_cmenu.addMenuItem(Commands.FILE_REFRESH); var editor_cmenu = Menus.registerContextMenu(Menus.ContextMenuIds.EDITOR_MENU); // editor_cmenu.addMenuItem(Commands.NAVIGATE_JUMPTO_DEFINITION); editor_cmenu.addMenuItem(Commands.TOGGLE_QUICK_EDIT); editor_cmenu.addMenuItem(Commands.TOGGLE_QUICK_DOCS); editor_cmenu.addMenuDivider(); editor_cmenu.addMenuItem(Commands.EDIT_CUT); editor_cmenu.addMenuItem(Commands.EDIT_COPY); editor_cmenu.addMenuItem(Commands.EDIT_PASTE); editor_cmenu.addMenuDivider(); editor_cmenu.addMenuItem(Commands.EDIT_SELECT_ALL); var inline_editor_cmenu = Menus.registerContextMenu(Menus.ContextMenuIds.INLINE_EDITOR_MENU); inline_editor_cmenu.addMenuItem(Commands.TOGGLE_QUICK_EDIT); inline_editor_cmenu.addMenuItem(Commands.EDIT_SELECT_ALL); inline_editor_cmenu.addMenuDivider(); inline_editor_cmenu.addMenuItem(Commands.QUICK_EDIT_PREV_MATCH); inline_editor_cmenu.addMenuItem(Commands.QUICK_EDIT_NEXT_MATCH); /** * Context menu for code editors (both full-size and inline) * Auto selects the word the user clicks if the click does not occur over * an existing selection */ $("#editor-holder").on("contextmenu", function (e) { require(["editor/EditorManager"], function (EditorManager) { if ($(e.target).parents(".CodeMirror-gutter").length !== 0) { return; } // Note: on mousedown before this event, CodeMirror automatically checks mouse pos, and // if not clicking on a selection moves the cursor to click location. When triggered // from keyboard, no pre-processing occurs and the cursor/selection is left as is. var editor = EditorManager.getFocusedEditor(), inlineWidget = EditorManager.getFocusedInlineWidget(); if (editor) { //if (!editor.hasSelection()) { // Prevent menu from overlapping text by moving it down a little // Temporarily backout this change for now to help mitigate issue #1111, // which only happens if mouse is not over context menu. Better fix // requires change to bootstrap, which is too risky for now. //e.pageY += 6; //} // Inline text editors have a different context menu (safe to assume it's not some other // type of inline widget since we already know an Editor has focus) if (inlineWidget) { inline_editor_cmenu.open(e); } else { editor_cmenu.open(e); } } }); }); /** * Context menu for folder tree */ $("#project-files-container").on("contextmenu", function (e) { project_cmenu.open(e); }); // Dropdown menu for workspace sorting Menus.ContextMenu.assignContextMenuToSelector(".working-set-option-btn", workingset_configuration_menu); // Dropdown menu for view splitting Menus.ContextMenu.assignContextMenuToSelector(".working-set-splitview-btn", splitview_menu); // Prevent the browser context menu since Brackets creates a custom context menu $(window).contextmenu(function (e) { e.preventDefault(); }); /* * General menu event processing */ // Prevent clicks on top level menus and menu items from taking focus $(window.document).on("mousedown", ".dropdown", function (e) { e.preventDefault(); }); // Switch menus when the mouse enters an adjacent menu // Only open the menu if another one has already been opened // by clicking $(window.document).on("mouseenter", "#titlebar .dropdown", function (e) { var open = $(this).siblings(".open"); if (open.length > 0) { open.removeClass("open"); $(this).addClass("open"); } }); // Check the visibility of context menu items before opening the context menu. // 'Rename', 'Show in file tree' and 'Show in explorer' items will be disabled for files that have not yet been saved to disk. Menus.getContextMenu(Menus.ContextMenuIds.WORKING_SET_CONTEXT_MENU).on("beforeContextMenuOpen", _setMenuItemsVisible); Menus.getContextMenu(Menus.ContextMenuIds.PROJECT_MENU).on("beforeContextMenuOpen", _setMenuItemsVisible); }); });