Comparar commits

...

77 Commits

Autor SHA1 Mensagem Data
Nathan Sobo f06c3402c3 WIP: Transfer foreground/background color into shadow DOM
Refs #4086
2014-11-11 16:59:36 -07:00
Nathan Sobo e3d70ebad0 💄 2014-11-11 16:58:38 -07:00
Nathan Sobo e238292075 Remove WorkspaceElement::handleWindowFocus
We were getting stack traces in specs when the window got focused caused
by this subscription never getting disposed. We investigated, and can’t
find a case where removing this causes any issues.

Tested:
* Loading/reloading empty window
* Loading/reloading window with pane splits
* Opening/closing dev tools
* Switching focus between atom windows
* Switching focus between applications

Signed-off-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
2014-11-11 16:24:02 -07:00
Nathan Sobo 9fd52f600e Dispose of WorkspaceElement subscriptions when detached
Signed-off-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
2014-11-11 16:24:02 -07:00
Nathan Sobo c75e692269 Don’t add undefined context menus when activating package resources
Signed-off-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
2014-11-11 16:24:02 -07:00
Nathan Sobo 6770570f13 Don't call Grim.deprecate for undefined context menus
This preserves the original behavior, in which passing undefined to
atom.contextMenu.add was a no-op that returned a no-op disposable.

Signed-off-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
2014-11-11 16:24:02 -07:00
Nathan Sobo 9875b069bc Merge pull request #4152 from atom/ns-highlight-region-classes
Add private API for adding classes to highlight regions for backward compatibility
2014-11-11 15:20:47 -07:00
Ben Ogle 58892be6f7 Use proper verbiage for the docs 2014-11-11 11:24:46 -08:00
Ben Ogle 2aaa025d72 Add deprecated getMoveNextWordBoundaryBufferPosition
Closes #4151
2014-11-11 11:24:10 -08:00
Max Brunsfeld 1474aa2116 Merge pull request #4148 from atom/mb-cut-line
Cut whole lines when no text is selected
2014-11-11 11:13:51 -08:00
Nathan Sobo 2de8046f99 Add deprecatedRegionClass option to highlight decorations
This adds a class to each of the contained regions so we can make
existing bundled packages backward-compatible with themes.

Signed-off-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
2014-11-11 12:11:26 -07:00
Nathan Sobo a58af721f1 Assign highlight decoration React keys based on decoration id instead of class
@benogle: I think this should be fine now that we assign id’s, right?

Signed-off-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
2014-11-11 12:11:26 -07:00
Kevin Sawicki 3a0bce0618 ⬆️ settings-view@0.159 2014-11-11 10:57:54 -08:00
Kevin Sawicki 658dc8e9c3 Merge pull request #4141 from atom/ks-file-encoding-config
Default buffer encoding to core.fileEncoding config
2014-11-11 10:07:53 -08:00
Max Brunsfeld 7a87c22c7d Cut/copy whole lines when no text is selected
Closes #3643
2014-11-11 10:02:17 -08:00
Kevin Sawicki e36eaa56cb Add windows1252 2014-11-11 09:47:34 -08:00
Kevin Sawicki 84a74d68cf Remove windows1250 duplicate 2014-11-11 09:47:34 -08:00
Kevin Sawicki 5946590a66 Add spec for default file encoding 2014-11-11 09:47:34 -08:00
Kevin Sawicki 268a3649b6 Use core.fileEncoding as default buffer encoding 2014-11-11 09:47:34 -08:00
Kevin Sawicki 3e67766d1a Add core.fileEncoding config schema 2014-11-11 09:47:34 -08:00
Kevin Sawicki 1038684014 Prepare 0.146 2014-11-11 09:47:07 -08:00
Kevin Sawicki 43acb99f86 ⬆️ encoding-selector@0.7 2014-11-11 09:02:19 -08:00
Nathan Sobo 8dccc8e07c Merge pull request #4143 from atom/ns-fix-scrollbar-regression
Always re-render scrollbars after themes load/reload
2014-11-10 19:50:13 -07:00
Max Brunsfeld 3c800b00f5 Always re-render scrollbars after themes load/reload
Signed-off-by: Nathan Sobo <nathan@github.com>
2014-11-10 17:59:41 -08:00
Kevin Sawicki cb0f531b9a ⬆️ find-and-replace@0.146 2014-11-10 16:55:50 -08:00
Kevin Sawicki 5e61c7b38a ⬆️ symbols-view@0.68 2014-11-10 15:53:19 -08:00
Nathan Sobo 57f85e1720 Add regression coverage for “hidden pane item after dragging” bug #4112
Refs bad0504e1d
2014-11-10 15:55:21 -07:00
Kevin Sawicki f4ced3b078 Autoscroll when selecting the entire line
Closes #4032
2014-11-10 14:51:03 -08:00
Ben Ogle 9553c46030 Override the default styling of .highlight in the editor.
Closes #4136
2014-11-10 14:34:50 -08:00
Kevin Sawicki 14e73e0c63 pane -> Pane 2014-11-10 14:31:21 -08:00
Ben Ogle 5c5c6e77fd Move method to be with similar methods in the docs. 2014-11-10 14:18:35 -08:00
Ben Ogle e9678a15f1 Add more docs for getPrev/NextWordBoundary methods 2014-11-10 14:18:15 -08:00
Ben Ogle f0135adb62 Fix method name 2014-11-10 14:17:48 -08:00
Ben Ogle 58fe92a41b Merge pull request #4135 from atom/bo-tab-reorder
Tab reorder
2014-11-10 14:00:45 -08:00
Kevin Sawicki 5689fbf7cc Suggest keyring dependencies
apm now gracefully fails without them being installed and they
are only used for publishing and starring packages.
2014-11-10 13:35:48 -08:00
Ben Ogle af052c79a7 nof 2014-11-10 13:32:58 -08:00
Kevin Sawicki f431bb6396 Add more complete list of Debian dependencies
This list was taken from the webupd8 .deb file

Closes #4114
2014-11-10 13:32:20 -08:00
Ben Ogle e21cc17a7b Add tab-moving key bindings for windows 2014-11-10 13:31:18 -08:00
Ben Ogle 1247e40e88 Add tab-moving key bindings for mac 2014-11-10 13:31:12 -08:00
Ben Ogle 6159209d49 moveItemTo* -> moveItem* 2014-11-10 13:28:15 -08:00
Kevin Sawicki d8263a1fcd ⬆️ apm@0.111 2014-11-10 13:21:23 -08:00
Ardeshir Javaherchi 5e3b88f42d Add another test for moveItemToLeft 2014-11-10 11:25:17 -08:00
Ardeshir Javaherchi a0e4d8b582 Add test for reordering tabs in linux 2014-11-10 11:25:17 -08:00
Ardeshir Javaherchi ff80545285 🐧 Add keymap implementation to reorder tabs in linux 2014-11-10 11:25:16 -08:00
Ben Ogle 3462d99675 Upgrade atom-dark-syntax 2014-11-10 11:16:34 -08:00
Kevin Sawicki 11ec0c579d ⬆️ language-css@0.23 2014-11-10 11:04:11 -08:00
Kevin Sawicki 0de9f54e3c ⬆️ apm@0.110 2014-11-10 11:04:11 -08:00
Ben Ogle 75e499004d Merge pull request #4119 from je-allard/master
🐛 load the bootstrap style for thumbnails
2014-11-10 10:34:38 -08:00
Nathan Sobo 11a817c442 :arrow_up settings-view to revert previous change 2014-11-10 11:16:29 -07:00
Nathan Sobo 8db843a57c ⬆️ settings-view to fix styling 2014-11-10 11:07:11 -07:00
Nathan Sobo 08dd51a12f Merge pull request #4121 from atom/mb-inline-commands-in-palette
Include inline commands in the command palette
2014-11-10 10:25:36 -07:00
Nathan Sobo 3f869ec191 Merge pull request #4105 from atom/ld-doc-update
Remove obsolete jQuery reference in documentation
2014-11-10 10:18:42 -07:00
Nathan Sobo 0fba8ba402 Subscribe to ‘window:open-path’ as a command 2014-11-10 10:10:53 -07:00
Nathan Sobo 7756f4b945 Don’t run ‘beforeunload’ listeners through atom.commands 2014-11-10 10:10:53 -07:00
Nathan Sobo 832e7113f7 Include all inline commands on the bubble path in ::findCommands 2014-11-10 10:10:52 -07:00
Nathan Sobo aa46e3d26f Add atom-pane commands via atom.commands again 2014-11-10 10:10:52 -07:00
Nathan Sobo d48719ab1c Ignore jQuery and duplicates in CommandRegistry::findCommands
Now that jQuery has been patched to add inline listeners and inline
listeners are reported from findCommands, there’s no reason to include
commands based on $.fn.events. Also, we need to ensure the same command
doesn’t get added to the list twice since it could get added by both
inline and selector-based listeners.
2014-11-10 10:09:24 -07:00
Max Brunsfeld 0c40a1ef92 Include inline commands in command palette 2014-11-10 10:09:24 -07:00
Nathan Sobo bad0504e1d Attach active pane item view before showing/hiding
Fixes #4112
2014-11-10 10:06:12 -07:00
Nathan Sobo 01fdd83c6c ⬆️ markdown-preview to fix exception when modifying w/ splits 2014-11-10 08:22:13 -07:00
Nathan Sobo 0a92b6b681 Add Workspace::paneForItem 2014-11-10 08:20:59 -07:00
Nathan Sobo 167467339a Merge pull request #4129 from atom/ns-fix-pane-close
Prompt to save modified items when closing a pane via pane:close
2014-11-10 08:17:56 -07:00
Nathan Sobo efd3329c50 Prompt to save modified items when closing a pane via pane:close
Fixes #4094
2014-11-10 07:55:37 -07:00
Jeremy Allard a140787252 🐛 load the bootstrap style for thumbnails 2014-11-09 01:40:49 -05:00
Lee Dohm d09c4010f6 Remove obsolete jQuery reference
Noticed that "soon" is now
2014-11-07 22:23:12 -08:00
Kevin Sawicki e2f1a245b0 💄 2014-11-07 20:54:03 -08:00
Kevin Sawicki 682045ef16 Prepare 0.145 2014-11-07 20:26:29 -08:00
Kevin Sawicki dc6e825edd ⬆️ encoding-selector@0.6 2014-11-07 19:57:23 -08:00
Nathan Sobo 481e444ffe Reassign context to undefined because CoffeeScript needs a var keyword
Fixes #4100
2014-11-07 18:00:38 -07:00
Nathan Sobo 5193fa698f Merge pull request #4103 from atom/ns-fix-active-pane-deserialization
Make deserialization of the active pane more tolerant and add assertions to catch invalid states
2014-11-07 16:00:40 -07:00
Nathan Sobo b8d2bd6c30 Disallow activation of panes that aren't in the PaneContainer
Signed-off-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
2014-11-07 15:46:47 -07:00
Nathan Sobo 33fde29acb Disallow activation of destroyed panes
Signed-off-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
2014-11-07 15:45:21 -07:00
Nathan Sobo 6934b83acc Fall back to first pane if activePaneId is invalid
When deserializing PaneContainer.

Fixes #4069

Signed-off-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
2014-11-07 15:44:59 -07:00
Nathan Sobo 330988ad16 Merge pull request #4101 from atom/mb-fix-styles
Fix user stylesheet regression due to shadow DOM PR
2014-11-07 14:56:26 -07:00
Nathan Sobo 058ef0a5a8 Fix autocomplete specs 2014-11-07 14:43:02 -07:00
Max Brunsfeld 003c101f14 W/o shadow-dom, don't add global atom-styles element for text editor
Signed-off-by: Nathan Sobo <nathan@github.com>
2014-11-07 13:05:46 -08:00
Max Brunsfeld 98d602628a Render all stylesheets in atom-styles elements without contexts
Signed-off-by: Nathan Sobo <nathan@github.com>
2014-11-07 12:56:32 -08:00
42 arquivos alterados com 485 adições e 161 exclusões
+1 -1
Ver Arquivo
@@ -6,6 +6,6 @@
"url": "https://github.com/atom/atom.git"
},
"dependencies": {
"atom-package-manager": "0.109.0"
"atom-package-manager": "0.111.0"
}
}
+2
Ver Arquivo
@@ -29,6 +29,8 @@
'ctrl-alt-cmd-l': 'window:reload'
'alt-cmd-i': 'window:toggle-dev-tools'
'cmd-alt-ctrl-p': 'window:run-package-specs'
'ctrl-shift-left': 'pane:move-item-left'
'ctrl-shift-right': 'pane:move-item-right'
# Sublime Parity
'cmd-,': 'application:show-settings'
+2
Ver Arquivo
@@ -12,6 +12,8 @@
'ctrl-alt-s': 'application:run-all-specs'
'ctrl-alt-o': 'application:open-dev'
'ctrl-shift-o': 'application:open-folder'
'ctrl-shift-pageup': 'pane:move-item-left'
'ctrl-shift-pagedown': 'pane:move-item-right'
'F11': 'window:toggle-full-screen'
# Sublime Parity
+2
Ver Arquivo
@@ -16,6 +16,8 @@
'ctrl-alt-s': 'application:run-all-specs'
'ctrl-alt-o': 'application:open-dev'
'ctrl-shift-o': 'application:open-folder'
'ctrl-shift-left': 'pane:move-item-left'
'ctrl-shift-right': 'pane:move-item-right'
'F11': 'window:toggle-full-screen'
# Sublime Parity
+1 -1
Ver Arquivo
@@ -109,7 +109,7 @@
{ label: 'Focus Pane On Left', command: 'window:focus-pane-on-left' }
{ label: 'Focus Pane On Right', command: 'window:focus-pane-on-right' }
{ type: 'separator' }
{ label: 'Close pane', command: 'pane:close' }
{ label: 'Close Pane', command: 'pane:close' }
]
}
{
+9 -9
Ver Arquivo
@@ -1,7 +1,7 @@
{
{
"name": "atom",
"productName": "Atom",
"version": "0.144.0",
"version": "0.146.0",
"description": "A hackable text editor for the 21st Century.",
"main": "./src/browser/main.js",
"repository": {
@@ -64,7 +64,7 @@
"vm-compatibility-layer": "0.1.0"
},
"packageDependencies": {
"atom-dark-syntax": "0.20.0",
"atom-dark-syntax": "0.21.0",
"atom-dark-ui": "0.35.0",
"atom-light-syntax": "0.21.0",
"atom-light-ui": "0.30.0",
@@ -82,9 +82,9 @@
"command-palette": "0.27.0",
"deprecation-cop": "0.11.0",
"dev-live-reload": "0.35.0",
"encoding-selector": "0.5.0",
"encoding-selector": "0.7.0",
"exception-reporting": "0.20.0",
"find-and-replace": "0.145.0",
"find-and-replace": "0.146.0",
"fuzzy-finder": "0.60.0",
"git-diff": "0.43.0",
"go-to-line": "0.26.0",
@@ -93,17 +93,17 @@
"incompatible-packages": "0.10.0",
"keybinding-resolver": "0.20.0",
"link": "0.26.0",
"markdown-preview": "0.109.0",
"markdown-preview": "0.110.0",
"metrics": "0.38.0",
"open-on-github": "0.30.0",
"package-generator": "0.32.0",
"release-notes": "0.36.0",
"settings-view": "0.156.0",
"settings-view": "0.159.0",
"snippets": "0.56.0",
"spell-check": "0.43.0",
"status-bar": "0.46.0",
"styleguide": "0.30.0",
"symbols-view": "0.67.0",
"symbols-view": "0.68.0",
"tabs": "0.55.0",
"timecop": "0.23.0",
"tree-view": "0.132.0",
@@ -113,7 +113,7 @@
"wrap-guide": "0.23.0",
"language-c": "0.30.0",
"language-coffee-script": "0.37.0",
"language-css": "0.22.0",
"language-css": "0.23.0",
"language-gfm": "0.53.0",
"language-git": "0.9.0",
"language-go": "0.19.0",
+2 -1
Ver Arquivo
@@ -1,6 +1,7 @@
Package: <%= name %>
Version: <%= version %>
Depends: python (>= 2.6), libc6
Depends: gconf2, gconf-service, libgtk2.0-0, libudev0 | libudev1, libgcrypt11, libnotify4, libxtst6, libnss3, python, gvfs-bin, xdg-utils
Suggests: libgnome-keyring0, gir1.2-gnomekeyring-1.0
Section: <%= section %>
Priority: optional
Architecture: <%= arch %>
+9 -1
Ver Arquivo
@@ -1,4 +1,5 @@
CommandRegistry = require '../src/command-registry'
_ = require 'underscore-plus'
describe "CommandRegistry", ->
[registry, parent, child, grandchild] = []
@@ -154,8 +155,15 @@ describe "CommandRegistry", ->
registry.add '.grandchild', 'namespace:command-3', ->
registry.add '.grandchild.no-match', 'namespace:command-4', ->
expect(registry.findCommands(target: grandchild)[0..2]).toEqual [
registry.add grandchild, 'namespace:inline-command-1', ->
registry.add child, 'namespace:inline-command-2', ->
commands = registry.findCommands(target: grandchild)
nonJqueryCommands = _.reject commands, (cmd) -> cmd.jQuery
expect(nonJqueryCommands).toEqual [
{name: 'namespace:inline-command-1', displayName: 'Namespace: Inline Command 1'}
{name: 'namespace:command-3', displayName: 'Namespace: Command 3'}
{name: 'namespace:inline-command-2', displayName: 'Namespace: Inline Command 2'}
{name: 'namespace:command-2', displayName: 'Namespace: Command 2'}
{name: 'namespace:command-1', displayName: 'Namespace: Command 1'}
]
+25 -4
Ver Arquivo
@@ -294,16 +294,18 @@ describe "PackageManager", ->
it "loads all stylesheets from the stylesheets directory", ->
one = require.resolve("./fixtures/packages/package-with-stylesheets/stylesheets/1.css")
two = require.resolve("./fixtures/packages/package-with-stylesheets/stylesheets/2.less")
three = require.resolve("./fixtures/packages/package-with-stylesheets/stylesheets/3.css")
three = require.resolve("./fixtures/packages/package-with-stylesheets/stylesheets/3.test-context.css")
four = require.resolve("./fixtures/packages/package-with-stylesheets/stylesheets/4.css")
one = atom.themes.stringToId(one)
two = atom.themes.stringToId(two)
three = atom.themes.stringToId(three)
four = atom.themes.stringToId(four)
expect(atom.themes.stylesheetElementForId(one)).toBeNull()
expect(atom.themes.stylesheetElementForId(two)).toBeNull()
expect(atom.themes.stylesheetElementForId(three)).toBeNull()
expect(atom.themes.stylesheetElementForId(four)).toBeNull()
waitsForPromise ->
atom.packages.activatePackage("package-with-stylesheets")
@@ -312,6 +314,7 @@ describe "PackageManager", ->
expect(atom.themes.stylesheetElementForId(one)).not.toBeNull()
expect(atom.themes.stylesheetElementForId(two)).not.toBeNull()
expect(atom.themes.stylesheetElementForId(three)).not.toBeNull()
expect(atom.themes.stylesheetElementForId(four)).not.toBeNull()
expect($('#jasmine-content').css('font-size')).toBe '3px'
it "assigns the stylesheet's context based on the filename", ->
@@ -319,8 +322,26 @@ describe "PackageManager", ->
atom.packages.activatePackage("package-with-stylesheets")
runs ->
element = atom.styles.getStyleElements().find (element) -> element.context is 'test-context'
expect(element).toBeDefined()
count = 0
for styleElement in atom.styles.getStyleElements()
if styleElement.sourcePath.match /1.css/
expect(styleElement.context).toBe undefined
count++
if styleElement.sourcePath.match /2.less/
expect(styleElement.context).toBe undefined
count++
if styleElement.sourcePath.match /3.test-context.css/
expect(styleElement.context).toBe 'test-context'
count++
if styleElement.sourcePath.match /4.css/
expect(styleElement.context).toBe undefined
count++
expect(count).toBe 4
describe "grammar loading", ->
it "loads the package's grammars", ->
+7
Ver Arquivo
@@ -33,6 +33,13 @@ describe "PaneContainer", ->
[pane1B, pane2B, pane3B] = containerB.getPanes()
expect(containerB.getActivePane()).toBe pane3B
it "makes the first pane active if no pane exists for the activePaneId", ->
pane3A.activate()
state = containerA.serialize()
state.activePaneId = -22
containerB = atom.deserializers.deserialize(state)
expect(containerB.getActivePane()).toBe containerB.getPanes()[0]
it "does not allow the root pane to be destroyed", ->
container = new PaneContainer
container.getRoot().destroy()
+49
Ver Arquivo
@@ -146,6 +146,24 @@ describe "Pane", ->
pane.activateNextItem()
expect(pane.getActiveItem()).toBe item1
describe "::moveItemRight() and ::moveItemLeft()", ->
it "moves the active item to the right and left, without looping around at either end", ->
pane = new Pane(items: [new Item("A"), new Item("B"), new Item("C")])
[item1, item2, item3] = pane.getItems()
pane.activateItemAtIndex(0)
expect(pane.getActiveItem()).toBe item1
pane.moveItemLeft()
expect(pane.getItems()).toEqual [item1, item2, item3]
pane.moveItemRight()
expect(pane.getItems()).toEqual [item2, item1, item3]
pane.moveItemLeft()
expect(pane.getItems()).toEqual [item1, item2, item3]
pane.activateItemAtIndex(2)
expect(pane.getActiveItem()).toBe item3
pane.moveItemRight()
expect(pane.getItems()).toEqual [item1, item2, item3]
describe "::activateItemAtIndex(index)", ->
it "activates the item at the given index", ->
pane = new Pane(items: [new Item("A"), new Item("B"), new Item("C")])
@@ -565,6 +583,37 @@ describe "Pane", ->
expect(pane1.isActive()).toBe false
expect(pane2.isActive()).toBe true
describe "::close()", ->
it "prompts to save unsaved items before destroying the pane", ->
pane = new Pane(items: [new Item("A"), new Item("B")])
[item1, item2] = pane.getItems()
item1.shouldPromptToSave = -> true
item1.getUri = -> "/test/path"
item1.save = jasmine.createSpy("save")
spyOn(atom, 'confirm').andReturn(0)
pane.close()
expect(atom.confirm).toHaveBeenCalled()
expect(item1.save).toHaveBeenCalled()
expect(pane.isDestroyed()).toBe true
it "does not destroy the pane if cancel is called", ->
pane = new Pane(items: [new Item("A"), new Item("B")])
[item1, item2] = pane.getItems()
item1.shouldPromptToSave = -> true
item1.getUri = -> "/test/path"
item1.save = jasmine.createSpy("save")
spyOn(atom, 'confirm').andReturn(1)
pane.close()
expect(atom.confirm).toHaveBeenCalled()
expect(item1.save).not.toHaveBeenCalled()
expect(pane.isDestroyed()).toBe false
describe "::destroy()", ->
[container, pane1, pane2] = []
+3
Ver Arquivo
@@ -144,12 +144,15 @@ describe "PaneView", ->
describe "when an item is moved to another pane", ->
it "detaches the item's view rather than removing it", ->
container.attachToDom()
expect(view1.is(':visible')).toBe true
paneModel2 = paneModel.splitRight()
view1.data('preservative', 1234)
paneModel.moveItemToPane(view1, paneModel2, 1)
expect(view1.data('preservative')).toBe 1234
paneModel2.activateItemAtIndex(1)
expect(view1.data('preservative')).toBe 1234
expect(view1.is(':visible')).toBe true
describe "when the title of the active item changes", ->
describe 'when there is no onDidChangeTitle method', ->
+3 -2
Ver Arquivo
@@ -59,8 +59,9 @@ describe "StylesElement", ->
atom.styles.addStyleSheet("a {color: red;}", context: 'test-context')
atom.styles.addStyleSheet("a {color: green;}")
expect(element.children.length).toBe initialChildCount + 1
expect(element.children[initialChildCount].textContent).toBe "a {color: green;}"
expect(element.children.length).toBe initialChildCount + 2
expect(element.children[initialChildCount].textContent).toBe "a {color: red;}"
expect(element.children[initialChildCount + 1].textContent).toBe "a {color: green;}"
element.setAttribute('context', 'test-context')
+7
Ver Arquivo
@@ -1131,6 +1131,13 @@ describe "TextEditorComponent", ->
regions = componentNode.querySelectorAll('.test-highlight .region')
expect(regions.length).toBe 2
it "renders classes on the regions directly if 'deprecatedRegionClass' option is defined", ->
decoration = editor.decorateMarker(marker, type: 'highlight', class: 'test-highlight', deprecatedRegionClass: 'test-highlight-region')
nextAnimationFrame()
regions = componentNode.querySelectorAll('.test-highlight .region.test-highlight-region')
expect(regions.length).toBe 2
describe "when flashing a decoration via Decoration::flash()", ->
highlightNode = null
beforeEach ->
+54 -3
Ver Arquivo
@@ -40,9 +40,6 @@ describe "TextEditorElement", ->
expect(blurCalled).toBe true
describe "when the editor.useShadowDOM config option is false", ->
afterEach ->
document.head.querySelector('atom-styles[context="atom-text-editor"]').remove()
it "proxies focus/blur events to/from the hidden input", ->
atom.config.set('editor.useShadowDOM', false)
@@ -59,3 +56,57 @@ describe "TextEditorElement", ->
document.body.focus()
expect(blurCalled).toBe true
describe "style transfer", ->
beforeEach ->
waitsForPromise -> atom.themes.activateThemes()
afterEach ->
atom.themes.deactivateThemes()
ffit "transfers the foreground and background colors into the shadow DOM", ->
runs ->
element = new TextEditorElement()
jasmineContent.appendChild(element)
initialBackgroundColor = getComputedStyle(element.shadowRoot.querySelector('.editor')).backgroundColor
atom.styles.addStyleSheet """
atom-text-editor { background: red; }
"""
newBackgroundColor = getComputedStyle(element.shadowRoot.querySelector('.editor')).backgroundColor
expect(newBackgroundColor).not.toBe initialBackgroundColor
describe "when the themes finish loading with the shadow DOM disabled (regressios)", ->
[themeReloadCallback, initialThemeLoadComplete, element] = []
beforeEach ->
themeReloadCallback = null
initialThemeLoadComplete = false
spyOn(atom.themes, 'isInitialLoadComplete').andCallFake ->
initialThemeLoadComplete
spyOn(atom.themes, 'onDidReloadAll').andCallFake (fn) ->
themeReloadCallback = fn
atom.config.set("editor.useShadowDOM", false)
element = new TextEditorElement()
element.style.height = '200px'
element.getModel().setText [0..20].join("\n")
it "re-renders the scrollbar", ->
jasmineContent.appendChild(element)
atom.styles.addStyleSheet """
::-webkit-scrollbar {
width: 8px;
}
"""
initialThemeLoadComplete = true
themeReloadCallback()
verticalScrollbarNode = element.querySelector(".vertical-scrollbar")
scrollbarWidth = verticalScrollbarNode.offsetWidth - verticalScrollbarNode.clientWidth
expect(scrollbarWidth).toEqual(8)
+48 -1
Ver Arquivo
@@ -98,12 +98,13 @@ describe "TextEditor", ->
expect(editor2.isFoldedAtBufferRow(4)).not.toBe editor.isFoldedAtBufferRow(4)
describe "config defaults", ->
it "uses the `editor.tabLength`, `editor.softWrap`, and `editor.softTabs` config values", ->
it "uses the `editor.tabLength`, `editor.softWrap`, and `editor.softTabs`, and `core.fileEncoding` config values", ->
editor1 = null
editor2 = null
atom.config.set('editor.tabLength', 4)
atom.config.set('editor.softWrap', true)
atom.config.set('editor.softTabs', false)
atom.config.set('core.fileEncoding', 'utf16le')
waitsForPromise ->
atom.workspace.open('a').then (o) -> editor1 = o
@@ -112,10 +113,12 @@ describe "TextEditor", ->
expect(editor1.getTabLength()).toBe 4
expect(editor1.isSoftWrapped()).toBe true
expect(editor1.getSoftTabs()).toBe false
expect(editor1.getEncoding()).toBe 'utf16le'
atom.config.set('editor.tabLength', 8)
atom.config.set('editor.softWrap', false)
atom.config.set('editor.softTabs', true)
atom.config.set('core.fileEncoding', 'macroman')
waitsForPromise ->
atom.workspace.open('b').then (o) -> editor2 = o
@@ -124,6 +127,7 @@ describe "TextEditor", ->
expect(editor2.getTabLength()).toBe 8
expect(editor2.isSoftWrapped()).toBe false
expect(editor2.getSoftTabs()).toBe true
expect(editor2.getEncoding()).toBe 'macroman'
describe "title", ->
describe ".getTitle()", ->
@@ -1158,6 +1162,21 @@ describe "TextEditor", ->
editor.selectLinesContainingCursors()
expect(editor.getSelectedBufferRange()).toEqual [[0,0], [2,0]]
it "autoscrolls to the selection", ->
editor.manageScrollPosition = true
editor.setLineHeightInPixels(10)
editor.setDefaultCharWidth(10)
editor.setHeight(50)
editor.setWidth(50)
editor.setHorizontalScrollbarHeight(0)
editor.setCursorScreenPosition([5, 6])
editor.scrollToTop()
expect(editor.getScrollTop()).toBe 0
editor.selectLinesContainingCursors()
expect(editor.getScrollBottom()).toBe (7 + editor.getVerticalScrollMargin()) * 10
describe ".selectToBeginningOfWord()", ->
it "selects text from cusor position to beginning of word", ->
editor.setCursorScreenPosition [0,13]
@@ -2469,6 +2488,22 @@ describe "TextEditor", ->
expect(clipboard.readText()).toBe 'quicksort\nsort'
describe "when no text is selected", ->
beforeEach ->
editor.setSelectedBufferRanges([[1, 0], [1, 0]])
editor.addCursorAtBufferPosition([5, 0])
it "cuts the lines on which there are cursors", ->
editor.cutSelectedText()
expect(buffer.getLineCount()).toBe(11)
expect(buffer.lineForRow(1)).toBe(" if (items.length <= 1) return items;")
expect(buffer.lineForRow(4)).toBe(" current < pivot ? left.push(current) : right.push(current);")
expect(atom.clipboard.readWithMetadata().metadata.selections).toEqual([
"var quicksort = function () {\n"
" current = items.shift();\n"
])
describe ".cutToEndOfLine()", ->
describe "when soft wrap is on", ->
it "cuts up to the end of the line", ->
@@ -2513,6 +2548,18 @@ describe "TextEditor", ->
'items'
])
describe "when no text is selected", ->
beforeEach ->
editor.setSelectedBufferRanges([[1, 0], [1, 0]])
editor.addCursorAtBufferPosition([5, 0])
it "copies the lines on which there are cursors", ->
editor.copySelectedText()
expect(atom.clipboard.readWithMetadata().metadata.selections).toEqual([
"var quicksort = function () {\n"
" current = items.shift();\n"
])
describe ".pasteText()", ->
it "pastes text into the buffer", ->
atom.clipboard.write('first')
+2 -2
Ver Arquivo
@@ -92,7 +92,7 @@ describe "ThemeManager", ->
runs ->
reloadHandler.reset()
expect($('style[group=theme]')).toHaveLength 1
expect($('style[group=theme]')).toHaveLength 2
expect($('style[group=theme]:eq(0)').attr('source-path')).toMatch /atom-dark-ui/
atom.config.set('core.themes', ['atom-light-ui', 'atom-dark-ui'])
@@ -111,7 +111,7 @@ describe "ThemeManager", ->
runs ->
reloadHandler.reset()
expect($('style[group=theme]')).toHaveLength 1
expect($('style[group=theme]')).toHaveLength 2
# atom-dark-ui has an directory path, the syntax one doesn't
atom.config.set('core.themes', ['theme-with-index-less', 'atom-dark-ui'])
+14 -15
Ver Arquivo
@@ -35,9 +35,7 @@ SpecificityCache = {}
# ```coffee
# atom.commands.add 'atom-text-editor',
# 'user:insert-date': (event) ->
# editor = $(this).view().getModel()
# # soon the above above line will be:
# # editor = @getModel()
# editor = @getModel()
# editor.insertText(new Date().toLocaleString())
# ```
module.exports =
@@ -130,25 +128,26 @@ class CommandRegistry
# * `jQuery` Present if the command was registered with the legacy
# `$::command` method.
findCommands: ({target}) ->
commandNames = new Set
commands = []
currentTarget = target
loop
for name, listeners of @inlineListenersByCommandName
if listeners.has(currentTarget) and not commandNames.has(name)
commandNames.add(name)
commands.push({name, displayName: _.humanizeEventName(name)})
for commandName, listeners of @selectorBasedListenersByCommandName
for listener in listeners
if currentTarget.webkitMatchesSelector?(listener.selector)
commands.push
name: commandName
displayName: _.humanizeEventName(commandName)
unless commandNames.has(commandName)
commandNames.add(commandName)
commands.push
name: commandName
displayName: _.humanizeEventName(commandName)
break if currentTarget is @rootNode
currentTarget = currentTarget.parentNode
break unless currentTarget?
for name, displayName of $(target).events() when displayName
commands.push({name, displayName, jQuery: true})
for name, displayName of $(window).events() when displayName
commands.push({name, displayName, jQuery: true})
break if currentTarget is window
currentTarget = currentTarget.parentNode ? window
commands
+41
Ver Arquivo
@@ -35,6 +35,47 @@ module.exports =
destroyEmptyPanes:
type: 'boolean'
default: true
fileEncoding:
description: 'Default character set encoding to use when reading and writing files.'
type: 'string'
default: 'utf8'
enum: [
'cp437',
'eucjp',
'euckr',
'gbk',
'iso88591',
'iso885910',
'iso885913',
'iso885914',
'iso885915',
'iso885916',
'iso88592',
'iso88593',
'iso88594',
'iso88595',
'iso88596',
'iso88597',
'iso88597',
'iso88598',
'koi8r',
'koi8u',
'macroman',
'shiftjis',
'utf16be',
'utf16le',
'utf8',
'windows1250',
'windows1251',
'windows1252',
'windows1253',
'windows1254',
'windows1255',
'windows1256',
'windows1257',
'windows1258',
'windows866'
]
editor:
type: 'object'
+2 -2
Ver Arquivo
@@ -76,8 +76,8 @@ class ContextMenuManager
# * `event` The click event that deployed the context menu.
add: (itemsBySelector) ->
# Detect deprecated file path as first argument
unless typeof itemsBySelector is 'object'
Grim.deprecate("ContextMenuManage::add has changed to take a single object as its argument. Please consult the documentation.")
if itemsBySelector? and typeof itemsBySelector isnt 'object'
Grim.deprecate("ContextMenuManager::add has changed to take a single object as its argument. Please consult the documentation.")
itemsBySelector = arguments[1]
devMode = arguments[2]?.devMode
+56 -44
Ver Arquivo
@@ -392,7 +392,7 @@ class Cursor extends Model
# Public: Moves the cursor to the next word boundary.
moveToNextWordBoundary: ->
if position = @getMoveNextWordBoundaryBufferPosition()
if position = @getNextWordBoundaryBufferPosition()
@setBufferPosition(position)
# Public: Moves the cursor to the beginning of the buffer line, skipping all
@@ -420,6 +420,61 @@ class Cursor extends Model
Section: Local Positions and Ranges
###
# Public: Returns buffer position of previous word boundary. It might be on
# the current word, or the previous word.
#
# * `options` (optional) {Object} with the following keys:
# * `wordRegex` A {RegExp} indicating what constitutes a "word"
# (default: {::wordRegExp})
getPreviousWordBoundaryBufferPosition: (options = {}) ->
currentBufferPosition = @getBufferPosition()
previousNonBlankRow = @editor.buffer.previousNonBlankRow(currentBufferPosition.row)
scanRange = [[previousNonBlankRow, 0], currentBufferPosition]
beginningOfWordPosition = null
@editor.backwardsScanInBufferRange (options.wordRegex ? @wordRegExp()), scanRange, ({range, stop}) ->
if range.start.row < currentBufferPosition.row and currentBufferPosition.column > 0
# force it to stop at the beginning of each line
beginningOfWordPosition = new Point(currentBufferPosition.row, 0)
else if range.end.isLessThan(currentBufferPosition)
beginningOfWordPosition = range.end
else
beginningOfWordPosition = range.start
if not beginningOfWordPosition?.isEqual(currentBufferPosition)
stop()
beginningOfWordPosition or currentBufferPosition
# Public: Returns buffer position of the next word boundary. It might be on
# the current word, or the previous word.
#
# * `options` (optional) {Object} with the following keys:
# * `wordRegex` A {RegExp} indicating what constitutes a "word"
# (default: {::wordRegExp})
getNextWordBoundaryBufferPosition: (options = {}) ->
currentBufferPosition = @getBufferPosition()
scanRange = [currentBufferPosition, @editor.getEofBufferPosition()]
endOfWordPosition = null
@editor.scanInBufferRange (options.wordRegex ? @wordRegExp()), scanRange, ({range, stop}) ->
if range.start.row > currentBufferPosition.row
# force it to stop at the beginning of each line
endOfWordPosition = new Point(range.start.row, 0)
else if range.start.isGreaterThan(currentBufferPosition)
endOfWordPosition = range.start
else
endOfWordPosition = range.end
if not endOfWordPosition?.isEqual(currentBufferPosition)
stop()
endOfWordPosition or currentBufferPosition
getMoveNextWordBoundaryBufferPosition: (options) ->
deprecate 'Use `::getNextWordBoundaryBufferPosition(options)` instead'
@getNextWordBoundaryBufferPosition(options)
# Public: Retrieves the buffer position of where the current word starts.
#
# * `options` (optional) An {Object} with the following keys:
@@ -452,49 +507,6 @@ class Cursor extends Model
else
currentBufferPosition
# Public: Retrieves buffer position of previous word boundary. It might be on
# the current word, or the previous word.
getPreviousWordBoundaryBufferPosition: (options = {}) ->
currentBufferPosition = @getBufferPosition()
previousNonBlankRow = @editor.buffer.previousNonBlankRow(currentBufferPosition.row)
scanRange = [[previousNonBlankRow, 0], currentBufferPosition]
beginningOfWordPosition = null
@editor.backwardsScanInBufferRange (options.wordRegex ? @wordRegExp()), scanRange, ({range, stop}) ->
if range.start.row < currentBufferPosition.row and currentBufferPosition.column > 0
# force it to stop at the beginning of each line
beginningOfWordPosition = new Point(currentBufferPosition.row, 0)
else if range.end.isLessThan(currentBufferPosition)
beginningOfWordPosition = range.end
else
beginningOfWordPosition = range.start
if not beginningOfWordPosition?.isEqual(currentBufferPosition)
stop()
beginningOfWordPosition or currentBufferPosition
# Public: Retrieves buffer position of the next word boundary. It might be on
# the current word, or the previous word.
getMoveNextWordBoundaryBufferPosition: (options = {}) ->
currentBufferPosition = @getBufferPosition()
scanRange = [currentBufferPosition, @editor.getEofBufferPosition()]
endOfWordPosition = null
@editor.scanInBufferRange (options.wordRegex ? @wordRegExp()), scanRange, ({range, stop}) ->
if range.start.row > currentBufferPosition.row
# force it to stop at the beginning of each line
endOfWordPosition = new Point(range.start.row, 0)
else if range.start.isGreaterThan(currentBufferPosition)
endOfWordPosition = range.start
else
endOfWordPosition = range.end
if not endOfWordPosition?.isEqual(currentBufferPosition)
stop()
endOfWordPosition or currentBufferPosition
# Public: Retrieves the buffer position of where the current word ends.
#
# * `options` (optional) {Object} with the following keys:
+16 -9
Ver Arquivo
@@ -14,9 +14,9 @@ HighlightComponent = React.createClass
div {className},
if endPixelPosition.top is startPixelPosition.top
@renderSingleLineRegions()
@renderSingleLineRegions(decoration.deprecatedRegionClass)
else
@renderMultiLineRegions()
@renderMultiLineRegions(decoration.deprecatedRegionClass)
componentDidMount: ->
{editor, decoration} = @props
@@ -41,25 +41,32 @@ HighlightComponent = React.createClass
removeFlashClass = -> node.classList.remove(flash.class)
@flashTimeoutId = setTimeout(removeFlashClass, flash.duration)
renderSingleLineRegions: ->
renderSingleLineRegions: (regionClass) ->
{startPixelPosition, endPixelPosition, lineHeightInPixels} = @props
className = 'region'
className += " #{regionClass}" if regionClass?
[
div className: 'region', key: 0, style:
div className: className, key: 0, style:
top: startPixelPosition.top
height: lineHeightInPixels
left: startPixelPosition.left
width: endPixelPosition.left - startPixelPosition.left
]
renderMultiLineRegions: ->
renderMultiLineRegions: (regionClass) ->
{startPixelPosition, endPixelPosition, lineHeightInPixels} = @props
className = 'region'
className += " #{regionClass}" if regionClass?
regions = []
index = 0
# First row, extending from selection start to the right side of screen
regions.push(
div className: 'region', key: index++, style:
div className: className, key: index++, style:
top: startPixelPosition.top
left: startPixelPosition.left
height: lineHeightInPixels
@@ -69,7 +76,7 @@ HighlightComponent = React.createClass
# Middle rows, extending from left side to right side of screen
if endPixelPosition.top - startPixelPosition.top > lineHeightInPixels
regions.push(
div className: 'region', key: index++, style:
div className: className, key: index++, style:
top: startPixelPosition.top + lineHeightInPixels
height: endPixelPosition.top - startPixelPosition.top - lineHeightInPixels
left: 0
@@ -78,7 +85,7 @@ HighlightComponent = React.createClass
# Last row, extending from left side of screen to selection end
regions.push(
div className: 'region', key: index, style:
div className: className, key: index, style:
top: endPixelPosition.top
height: lineHeightInPixels
left: 0
@@ -88,4 +95,4 @@ HighlightComponent = React.createClass
regions
shouldComponentUpdate: (newProps) ->
not isEqualForProperties(newProps, @props, 'startPixelPosition', 'endPixelPosition', 'lineHeightInPixels')
not isEqualForProperties(newProps, @props, 'startPixelPosition', 'endPixelPosition', 'lineHeightInPixels', 'decoration')
+1 -1
Ver Arquivo
@@ -17,7 +17,7 @@ HighlightsComponent = React.createClass
highlightComponents = []
for markerId, {startPixelPosition, endPixelPosition, decorations} of highlightDecorations
for decoration in decorations
highlightComponents.push(HighlightComponent({editor, key: "#{markerId}-#{decoration.class}", startPixelPosition, endPixelPosition, decoration, lineHeightInPixels}))
highlightComponents.push(HighlightComponent({editor, key: "#{markerId}-#{decoration.id}", startPixelPosition, endPixelPosition, decoration, lineHeightInPixels}))
highlightComponents
+4 -3
Ver Arquivo
@@ -176,7 +176,6 @@ class Package
activateStylesheets: ->
return if @stylesheetsActivated
group = @getStylesheetType()
@stylesheetDisposables = new CompositeDisposable
for [sourcePath, source] in @stylesheets
@@ -184,6 +183,8 @@ class Package
context = match[1]
else if @metadata.theme is 'syntax'
context = 'atom-text-editor'
else
context = undefined
@stylesheetDisposables.add(atom.styles.addStyleSheet(source, {sourcePath, group, context}))
@stylesheetsActivated = true
@@ -191,8 +192,8 @@ class Package
activateResources: ->
@activationDisposables = new CompositeDisposable
@activationDisposables.add(atom.keymaps.add(keymapPath, map)) for [keymapPath, map] in @keymaps
@activationDisposables.add(atom.contextMenu.add(map['context-menu'])) for [menuPath, map] in @menus
@activationDisposables.add(atom.menu.add(map.menu)) for [menuPath, map] in @menus when map.menu
@activationDisposables.add(atom.contextMenu.add(map['context-menu'])) for [menuPath, map] in @menus when map['context-menu']?
@activationDisposables.add(atom.menu.add(map['menu'])) for [menuPath, map] in @menus when map['menu']?
unless @grammarsActivated
grammar.activate() for grammar in @grammars
+8
Ver Arquivo
@@ -40,6 +40,8 @@ class PaneContainer extends Model
@registerViewProviders()
@setRoot(params?.root ? new Pane)
@setActivePane(@getPanes()[0]) unless @getActivePane()
@destroyEmptyPanes() if params?.destroyEmptyPanes
@monitorActivePaneItem()
@@ -137,6 +139,9 @@ class PaneContainer extends Model
setActivePane: (activePane) ->
if activePane isnt @activePane
unless activePane in @getPanes()
throw new Error("Setting active pane that is not present in pane container")
@activePane = activePane
@emitter.emit 'did-change-active-pane', @activePane
@activePane
@@ -147,6 +152,9 @@ class PaneContainer extends Model
paneForUri: (uri) ->
find @getPanes(), (pane) -> pane.itemForUri(uri)?
paneForItem: (item) ->
@getPanes().find (pane) -> item in pane.getItems()
saveAll: ->
pane.saveItems() for pane in @getPanes()
+26 -30
Ver Arquivo
@@ -43,32 +43,6 @@ class PaneElement extends HTMLElement
createSpacePenShim: ->
@__spacePenView = new PaneView(this)
addCommands = (handlersByName) =>
for name, handler of handlersByName
do (handler) =>
@__spacePenView.command name, => handler.apply(this, arguments)
addCommands(
'pane:save-items': -> @getModel().saveItems()
'pane:show-next-item': -> @getModel().activateNextItem()
'pane:show-previous-item': -> @getModel().activatePreviousItem()
'pane:show-item-1': -> @getModel().activateItemAtIndex(0)
'pane:show-item-2': -> @getModel().activateItemAtIndex(1)
'pane:show-item-3': -> @getModel().activateItemAtIndex(2)
'pane:show-item-4': -> @getModel().activateItemAtIndex(3)
'pane:show-item-5': -> @getModel().activateItemAtIndex(4)
'pane:show-item-6': -> @getModel().activateItemAtIndex(5)
'pane:show-item-7': -> @getModel().activateItemAtIndex(6)
'pane:show-item-8': -> @getModel().activateItemAtIndex(7)
'pane:show-item-9': -> @getModel().activateItemAtIndex(8)
'pane:split-left': -> @getModel().splitLeft(copyActiveItem: true)
'pane:split-right': -> @getModel().splitRight(copyActiveItem: true)
'pane:split-up': -> @getModel().splitUp(copyActiveItem: true)
'pane:split-down': -> @getModel().splitDown(copyActiveItem: true)
'pane:close': -> @getModel().destroy()
'pane:close-other-items': -> @getModel().destroyInactiveItems()
)
getModel: -> @model
setModel: (@model) ->
@@ -94,16 +68,16 @@ class PaneElement extends HTMLElement
hasFocus = @hasFocus()
itemView = @model.getView(item)
unless @itemViews.contains(itemView)
@itemViews.appendChild(itemView)
callAttachHooks(itemView)
for child in @itemViews.children
if child is itemView
@showItemView(child) if @attached
else
@hideItemView(child)
unless @itemViews.contains(itemView)
@itemViews.appendChild(itemView)
callAttachHooks(itemView)
itemView.focus() if hasFocus
showItemView: (itemView) ->
@@ -132,4 +106,26 @@ class PaneElement extends HTMLElement
hasFocus: ->
this is document.activeElement or @contains(document.activeElement)
atom.commands.add 'atom-pane',
'pane:save-items': -> @getModel().saveItems()
'pane:show-next-item': -> @getModel().activateNextItem()
'pane:show-previous-item': -> @getModel().activatePreviousItem()
'pane:show-item-1': -> @getModel().activateItemAtIndex(0)
'pane:show-item-2': -> @getModel().activateItemAtIndex(1)
'pane:show-item-3': -> @getModel().activateItemAtIndex(2)
'pane:show-item-4': -> @getModel().activateItemAtIndex(3)
'pane:show-item-5': -> @getModel().activateItemAtIndex(4)
'pane:show-item-6': -> @getModel().activateItemAtIndex(5)
'pane:show-item-7': -> @getModel().activateItemAtIndex(6)
'pane:show-item-8': -> @getModel().activateItemAtIndex(7)
'pane:show-item-9': -> @getModel().activateItemAtIndex(8)
'pane:move-item-right': -> @getModel().moveItemRight()
'pane:move-item-left': -> @getModel().moveItemLeft()
'pane:split-left': -> @getModel().splitLeft(copyActiveItem: true)
'pane:split-right': -> @getModel().splitRight(copyActiveItem: true)
'pane:split-up': -> @getModel().splitUp(copyActiveItem: true)
'pane:split-down': -> @getModel().splitDown(copyActiveItem: true)
'pane:close': -> @getModel().close()
'pane:close-other-items': -> @getModel().destroyInactiveItems()
module.exports = PaneElement = document.registerElement 'atom-pane', prototype: PaneElement.prototype
+22
Ver Arquivo
@@ -289,6 +289,18 @@ class Pane extends Model
else
@activateItemAtIndex(@items.length - 1)
# Public: Move the active tab to the right.
moveItemRight: ->
index = @getActiveItemIndex()
rightItemIndex = index + 1
@moveItem(@getActiveItem(), rightItemIndex) unless rightItemIndex > @items.length - 1
# Public: Move the active tab to the left
moveItemLeft: ->
index = @getActiveItemIndex()
leftItemIndex = index - 1
@moveItem(@getActiveItem(), leftItemIndex) unless leftItemIndex < 0
# Public: Get the index of the active item.
#
# Returns a {Number}.
@@ -502,6 +514,8 @@ class Pane extends Model
# Public: Makes this pane the *active* pane, causing it to gain focus.
activate: ->
throw new Error("Pane has been destroyed") if @isDestroyed()
@container?.setActivePane(this)
@emit 'activated'
@emitter.emit 'did-activate'
@@ -606,3 +620,11 @@ class Pane extends Model
rightmostSibling
else
@splitRight()
close: ->
@destroy() if @confirmClose()
confirmClose: ->
for item in @getItems()
return false unless @promptToSaveItem(item)
true
+2
Ver Arquivo
@@ -323,6 +323,7 @@ class Project extends Model
# Still needed when deserializing a tokenized buffer
buildBufferSync: (absoluteFilePath) ->
buffer = new TextBuffer({filePath: absoluteFilePath})
buffer.setEncoding(atom.config.get('core.fileEncoding'))
@addBuffer(buffer)
buffer.loadSync()
buffer
@@ -338,6 +339,7 @@ class Project extends Model
throw new Error("Atom can only handle files < 2MB for now.")
buffer = new TextBuffer({filePath: absoluteFilePath})
buffer.setEncoding(atom.config.get('core.fileEncoding'))
@addBuffer(buffer)
buffer.load()
.then((buffer) -> buffer)
+1 -1
Ver Arquivo
@@ -322,7 +322,7 @@ class Selection extends Model
# * `row` The line {Number} to select (default: the row of the cursor).
selectLine: (row=@cursor.getBufferPosition().row) ->
range = @editor.bufferRangeForBufferRow(row, includeNewline: true)
@setBufferRange(@getBufferRange().union(range))
@setBufferRange(@getBufferRange().union(range), autoscroll: true)
@linewise = true
@wordwise = false
@initialScreenRange = @getScreenRange()
+1 -1
Ver Arquivo
@@ -20,7 +20,7 @@ NativeEventNames.add(nativeEvent) for nativeEvent in ["blur", "focus", "focusin"
"focusout", "load", "resize", "scroll", "unload", "click", "dblclick", "mousedown",
"mouseup", "mousemove", "mouseover", "mouseout", "mouseenter", "mouseleave", "change",
"select", "submit", "keydown", "keypress", "keyup", "error", "contextmenu", "textInput",
"textinput"]
"textinput", "beforeunload"]
JQueryTrigger = jQuery.fn.trigger
jQuery.fn.trigger = (eventName, data) ->
+6 -3
Ver Arquivo
@@ -45,7 +45,7 @@ class StylesElement extends HTMLElement
@styleElementAdded(styleElement) for styleElement in atom.styles.getStyleElements()
styleElementAdded: (styleElement) ->
return unless styleElement.context is @context
return unless @styleElementMatchesContext(styleElement)
styleElementClone = styleElement.cloneNode(true)
styleElementClone.context = styleElement.context
@@ -62,17 +62,20 @@ class StylesElement extends HTMLElement
@emitter.emit 'did-add-style-element', styleElementClone
styleElementRemoved: (styleElement) ->
return unless styleElement.context is @context
return unless @styleElementMatchesContext(styleElement)
styleElementClone = @styleElementClonesByOriginalElement.get(styleElement) ? styleElement
styleElementClone.remove()
@emitter.emit 'did-remove-style-element', styleElementClone
styleElementUpdated: (styleElement) ->
return unless styleElement.context is @context
return unless @styleElementMatchesContext(styleElement)
styleElementClone = @styleElementClonesByOriginalElement.get(styleElement)
styleElementClone.textContent = styleElement.textContent
@emitter.emit 'did-update-style-element', styleElementClone
styleElementMatchesContext: (styleElement) ->
not @context? or styleElement.context is @context
module.exports = StylesElement = document.registerElement 'atom-styles', prototype: StylesElement.prototype
+8 -2
Ver Arquivo
@@ -182,7 +182,7 @@ TextEditorComponent = React.createClass
@subscribe stylesElement.onDidUpdateStyleElement @onStylesheetsChanged
@subscribe stylesElement.onDidRemoveStyleElement @onStylesheetsChanged
unless atom.themes.isInitialLoadComplete()
@subscribe atom.themes.onDidReloadAll @onStylesheetsChanged
@subscribe atom.themes.onDidReloadAll @onAllThemesLoaded
@subscribe scrollbarStyle.changes, @refreshScrollbars
@domPollingIntervalId = setInterval(@pollDOM, @domPollingInterval)
@@ -627,8 +627,14 @@ TextEditorComponent = React.createClass
onStylesheetsChanged: (styleElement) ->
return unless @performedInitialMeasurement
return unless atom.themes.isInitialLoadComplete()
@refreshScrollbars() if not styleElement.sheet? or @containsScrollbarSelector(styleElement.sheet)
@handleStylingChange()
onAllThemesLoaded: ->
@refreshScrollbars()
@handleStylingChange()
handleStylingChange: ->
@sampleFontStyling()
@sampleBackgroundColors()
@remeasureCharacterWidths()
+30 -11
Ver Arquivo
@@ -6,8 +6,6 @@ TextEditor = require './text-editor'
TextEditorComponent = require './text-editor-component'
TextEditorView = null
GlobalStylesElement = null
class TextEditorElement extends HTMLElement
model: null
componentDescriptor: null
@@ -16,7 +14,6 @@ class TextEditorElement extends HTMLElement
focusOnAttach: false
createdCallback: ->
@subscriptions =
@initializeContent()
@createSpacePenShim()
@addEventListener 'focus', @focused.bind(this)
@@ -38,19 +35,18 @@ class TextEditorElement extends HTMLElement
@shadowRoot.appendChild(@stylesElement)
@shadowRoot.appendChild(@rootElement)
else
unless GlobalStylesElement?
GlobalStylesElement = document.createElement('atom-styles')
GlobalStylesElement.setAttribute('context', 'atom-text-editor')
GlobalStylesElement.initialize()
document.head.appendChild(GlobalStylesElement)
@stylesElement = GlobalStylesElement
if atom.themes.isInitialLoadComplete()
@observeGlobalStyles()
else
loadSubscription = atom.themes.onDidReloadAll(@observeGlobalStyles.bind(this))
else
@stylesElement = document.head.querySelector('atom-styles')
@rootElement = this
@rootElement.classList.add('editor', 'editor-colors')
createSpacePenShim: ->
TextEditorView ?= require './text-editor-view'
@__spacePenView = new TextEditorView(this)
@@ -61,6 +57,29 @@ class TextEditorElement extends HTMLElement
@component.checkForVisibilityChange()
@focus() if @focusOnAttach
observeGlobalStyles: ->
globalStyles = document.head.querySelector('atom-styles')
globalStyles.onDidAddStyleElement(@transferComputedStyles.bind(this))
@transferComputedStyles()
transferComputedStyles: ->
unless @hostOverrideStyleElement?
@hostOverrideStyleElement = document.createElement('style')
@shadowRoot.insertBefore(@hostOverrideStyleElement, @stylesElement.nextSibling)
{color, backgroundColor} = getComputedStyle(this)
@hostOverrideStyleElement.textContent = """
.editor-colors {
background-color: #{backgroundColor};
color: #{color};
}
.cursor {
border-color: #{color};
}
"""
setModel: (model) ->
throw new Error("Model already assigned on TextEditorElement") if @model?
return if model.isDestroyed()
+2
Ver Arquivo
@@ -2463,6 +2463,7 @@ class TextEditor extends Model
copySelectedText: ->
maintainClipboard = false
for selection in @getSelections()
selection.selectLine() if selection.isEmpty()
selection.copy(maintainClipboard)
maintainClipboard = true
@@ -2470,6 +2471,7 @@ class TextEditor extends Model
cutSelectedText: ->
maintainClipboard = false
@mutateSelectedText (selection) ->
selection.selectLine() if selection.isEmpty()
selection.cut(maintainClipboard)
maintainClipboard = true
+1 -1
Ver Arquivo
@@ -28,7 +28,7 @@ class WindowEventHandler
@subscribe $(window), 'blur', -> document.body.classList.add('is-blurred')
@subscribe $(window), 'window:open-path', (event, {pathToOpen, initialLine, initialColumn}) ->
@subscribeToCommand $(window), 'window:open-path', (event, {pathToOpen, initialLine, initialColumn}) ->
unless atom.project?.getPath()
if fs.existsSync(pathToOpen) or fs.existsSync(path.dirname(pathToOpen))
atom.project?.setPath(pathToOpen)
+1 -7
Ver Arquivo
@@ -23,6 +23,7 @@ class WorkspaceElement extends HTMLElement
@focus()
detachedCallback: ->
@subscriptions.dispose()
@model.destroy()
initializeGlobalTextEditorStyleSheet: ->
@@ -66,11 +67,7 @@ class WorkspaceElement extends HTMLElement
setModel: (@model) ->
@paneContainer = atom.views.getView(@model.paneContainer)
@verticalAxis.appendChild(@paneContainer)
@addEventListener 'focus', @handleFocus.bind(this)
handleWindowFocus = @handleWindowFocus.bind(this)
window.addEventListener 'focus', handleWindowFocus
@subscriptions.add(new Disposable -> window.removeEventListener 'focus', handleWindowFocus)
@panelContainers =
top: @model.panelContainers.top.getView()
@@ -106,9 +103,6 @@ class WorkspaceElement extends HTMLElement
handleFocus: (event) ->
@model.getActivePane().activate()
handleWindowFocus: (event) ->
@handleFocus(event) if document.activeElement is document.body
focusPaneViewAbove: -> @paneContainer.focusPaneViewAbove()
focusPaneViewBelow: -> @paneContainer.focusPaneViewBelow()
+9 -1
Ver Arquivo
@@ -552,7 +552,7 @@ class Workspace extends Model
activatePreviousPane: ->
@paneContainer.activatePreviousPane()
# Extended: Get the first pane {Pane} with an item for the given URI.
# Extended: Get the first {Pane} with an item for the given URI.
#
# * `uri` {String} uri
#
@@ -560,6 +560,14 @@ class Workspace extends Model
paneForUri: (uri) ->
@paneContainer.paneForUri(uri)
# Extended: Get the {Pane} containing the given item.
#
# * `item` Item the returned pane contains.
#
# Returns a {Pane} or `undefined` if no pane exists for the given item.
paneForItem: (item) ->
@paneContainer.paneForItem(item)
# Destroy (close) the active pane.
destroyActivePane: ->
@activePane?.destroy()
+1
Ver Arquivo
@@ -22,6 +22,7 @@
@import "../node_modules/bootstrap/less/badges.less";
@import "../node_modules/bootstrap/less/alerts.less";
@import "../node_modules/bootstrap/less/list-group.less";
@import "../node_modules/bootstrap/less/thumbnails.less";
// Components w/ JavaScript
@import "../node_modules/bootstrap/less/tooltip.less";
+6
Ver Arquivo
@@ -11,3 +11,9 @@ atom-text-editor.mini {
line-height: @component-line-height;
max-height: @component-line-height + 2; // +2 for borders
}
// TODO: remove this when the shadow DOM is the default
atom-text-editor .highlight {
background: none;
padding: 0;
}
+1 -5
Ver Arquivo
@@ -222,6 +222,7 @@
.overlayer {
z-index: 2;
position: absolute;
width: 100%;
}
.line {
@@ -243,11 +244,6 @@
width: 1px;
}
.highlight {
background: none;
padding: 0;
}
.highlight .region,
.selection .region {
position: absolute;