Commit Graph
339 Commits
Author SHA1 Message Date
David Richardson af4d9dd9b9 AppKit: Implement window zoom and title bar double-click
Implement Cocoa zoom API on CPWindow and enable zoom button for resizable windows. Zoom window on double-click where drag moves it.

* CPWindow.j:
  - Add zoom:, performZoom: and isZoomed, toggling between standard frame and user frame; treat frame within 4 points of standard frame as zoomed.
  - Add windowWillUseStandardFrame:defaultFrame: and windowShouldZoom:toFrame: to CPWindowDelegate; consult window subclass when delegate lacks them.
  - Take default frame from platform window's usable content frame; keep standard frame within minimum and maximum sizes and usable area.
  - Enable performZoom: and zoom: menu items only when window can zoom.

* _CPStandardWindowView.j: Enable zoom button for resizable windows and target window's zoom:.

* _CPWindowView.j: Call performZoom: on double-click where drag moves window.

* CPWindowTest.j: Add tests for zoom toggling, default frame, delegate refusal, maximum size, missing user frame, window subclass standard frame, performZoom: on fixed-size window, menu validation and title bar double-click.

* DropInCompatibilityTest.j: Add test for zoom button enabled only for resizable windows.
2026-11-08 14:17:08 -06:00
David Richardson d55a620223 AppKit: Move platform window decoration from application state into theme variants
Remove incomplete host-platform OS behaviour API and its platform-specific conditionals. Derive window buttons, title, and title bar layout from window view's own theme, and select platform variants through a private function.

* CPApplication.j: Remove setOSBehavior:, OSBehavior, shouldMimicWindows and the simulatesWindows accessors, with the Info.plist keys and user default they read; set the default theme through _CPThemeVariant.

* CPApplication_Constants.j: Remove the OS behaviour constants, dictionary and notification.

* CPCompatibility.j: Add _CPBrowserOperatingSystem, returning the detected host operating system.

* CPTheme.j: Remove CPThemeStateWindowsPlatform; add _CPThemeVariant, returning the base theme.

* CPWindow.j: Remove the _close call to the window view.

* _CPStandardWindowView.j:
  - Remove the OS behaviour observer, _close and _osBehaviorDidChange:.
  - Place the buttons and title from theme values on every layout, with fixed defaults where a theme supplies none.
  - Read title bar and sheet values from the window view's theme instead of the default theme.

* _CPTitleableWindowView.j: Read title-margin at layout time instead of caching it.
2026-11-08 13:51:36 -06:00
David Richardson c062669fb5 AppKit: Replace OS behaviour API with theme-driven window frame layout
Eliminate brittle platform-specific branching and the incomplete host-platform OS behaviour API, replacing them with a unified layout model where window frames, titles, and controls derive entirely from the active theme, with platform variants selected through a private function.

* CPApplication.j:
  - Remove setOSBehavior:, OSBehavior, shouldMimicWindows, and simulatesWindows accessors, along with associated Info.plist keys and user defaults.
  - Set default theme selection through _CPThemeVariant.

* CPApplication_Constants.j: Remove OS behaviour constants, dictionary, and notification.

* CPCompatibility.j: Add _CPBrowserOperatingSystem to return the detected host operating system.

* CPTheme.j: Remove CPThemeStateWindowsPlatform; add _CPThemeVariant to return the base theme.

* CPWindow.j: Remove the _close delegation to the window view.

* _CPStandardWindowView.j:
  - Remove OS behaviour observer, _close, and _osBehaviorDidChange:.
  - Position buttons and title using theme values during layout, applying fallback defaults when theme values are absent.
  - Read title bar and sheet values from the view's active theme rather than the default theme.

* _CPTitleableWindowView.j: Query title-margin dynamically during layout instead of caching.
2026-11-08 13:19:54 -06:00
David Richardson e3ca6cff0c AppKit: Re-theme the window frame on a theme change
* CPWindow.j: Start the theme walk at the window view, so that it reaches the title bar, title, buttons and toolbar as well as the content view, and also reach the shadow view.
2026-11-03 16:10:16 -06:00
daboe01 3ad080b788 Merge remote-tracking branch 'upstream/main' into Aristo3 2026-10-24 22:00:51 +02:00
David Richardson dc074c89dd AppKit: Add CPTextList and list management to CPTextView
AppKit lacked CPTextList and the textLists property on CPParagraphStyle,
preventing rich text from supporting bulleted or numbered lists. Additionally,
CPTextView derived its typing attributes from the character following the
insertion point upon selection changes, causing text appended at the end of a
document (and the Font Panel) to incorrectly revert to default styling.

* AppKit/CPTextView/CPTextList.j:
  - Implement CPTextList following NSTextList specifications, including standard
    Cocoa marker formats, CPTextListPrependEnclosingMarker, starting item numbers,
    markerForItemNumber:, isOrdered, and keyed archiving.
  - Add rangeOfTextList:atIndex: and itemNumberInTextList:atIndex: category
    extensions to CPAttributedString.

* AppKit/CPTextView/CPParagraphStyle.j:
  - Add textLists and setTextLists: properties with copy and archiving support.
  - Implement paragraph style equality checks based on list identity.

* AppKit/CPTextView/CPTextView.j:
  - Implement setTextList: and the changeTextList: action method (routing marker
    styles via sender tags). Adjacent paragraphs with matching styles join automatically.
  - Implement list item keyboard navigation and editing mechanics: Return generates
    subsequent list items, Return on an empty item terminates list context,
    Tab at item origin nests levels, Shift-Tab promotes levels, and Delete at item
    text origin strips list membership.
  - Automate list item renumbering during live edits, paste operations, and undo/redo cycles.
  - Update Paste Ruler routines to correctly synthesize, strip, and merge list markers.
  - Fix typingAttributes and Font Panel attribute resolution to derive from the
    first selected character or the character immediately preceding the insertion point.

* AppKit/CPKeyBinding.j:
  - Bind Shift-Tab selector to insertBacktab:.

* AppKit/CPWindow/CPWindow.j:
  - Update key event routing to dispatch Shift-Tab to first responders that accept Tab.

* AppKit/AppKit.j:
  - Export CPTextList.

* Tests/AppKit/CPTextListTest.j:
  - Add unit test coverage for marker formatting, archiving, list range queries,
    interactive list editing, Paste Ruler execution, and menu action validation.

* Tests/AppKit/CPTextViewTest.j:
  - Add test coverage verifying typing attributes at trailing insertion points.

* Tests/Manual/TextEditor/Resources/MainMenu.xib, MainMenu.cib:
  - Add Format > List menu structures containing bulleted, numbered, and outline choices.

* Tests/Manual/TextEditor/WORKLIST.md:
  - Mark list interaction testing as completed; log RTF list serialization as an open item.

CPTextView now provides Cocoa-compliant bulleted, numbered, and nested list support.
2026-10-24 11:33:57 -06:00
David Richardson b222ee0320 AppKit: Let an editable text view take the Tab key
CPWindow handled every Tab key press itself and moved to the next key view, so a text view never received Tab and could not insert a tab character.

It now follows Cocoa: an editable text view takes plain Tab and inserts a tab, while Control-Tab, Shift-Tab and Tab in other views still move through the key view loop.

* CPResponder.j: Add _wantsTabKey, which returns NO by default.

* CPTextView/CPTextView.j: Want the Tab key while editable.

* CPWindow/CPWindow.j: Pass plain Tab to a first responder that wants it, and keep the browser from moving its own focus.
2026-10-23 20:20:51 -06:00
David Richardson 66ea130c8d AppKit: Disable Undo and Redo when a text view does not allow undo
A text view handled undo: and redo: and registered its changes even when allowsUndo was NO, so Edit > Undo stayed enabled and did nothing.

Behaviour now follows canonical Cocoa: a text view that does not allow undo registers nothing and passes undo: and redo: on to the window, and Undo and Redo are enabled only when there is a change to undo or redo.

* CPTextView/CPTextView.j: Register changes only when undo is allowed, stop responding to undo: and redo: when it is not, and validate the Undo and Redo items against the undo manager.

* CPWindow/CPWindow.j: Validate the Undo and Redo items against the window's undo manager.

* Tests/AppKit/CPTextViewTest.j: Add tests for responding to undo:, registering changes and validating the Undo item.

* Tests/Manual/TextEditor/DocumentWindowController.j: Add toggleAllowsUndo: and validateMenuItem:, so that undo can be turned on and off for the active document.

* Tests/Manual/TextEditor/Resources/MainMenu.xib, Resources/MainMenu.cib: Add Edit > Allow Undo.

* Tests/Manual/TextEditor/WORKLIST.md: Remove the entry for this gap, record Allow Undo as tested, and add the key equivalent behaviour of disabled menu items for discussion.
2026-10-23 17:20:27 -06:00
David Richardson 055ae6d04e AppKit: List the application's windows in the Windows menu
The Window menu never listed the application's windows, because AppKit had none of Cocoa's Windows menu support.

* CPApplication.j: Add windowsMenu, setWindowsMenu:, addWindowsItem:title:filename:, changeWindowsItem:title:filename:, removeWindowsItem:, updateWindowsItem: and arrangeInFront:; find the menu named _CPWindowsMenu in the main menu, and list the visible windows when the main menu is set.

* CPWindow/CPWindow.j: Add isExcludedFromWindowsMenu and setExcludedFromWindowsMenu:, and keep the window's item current when the window is ordered in or out, retitled, made main or no longer main, miniaturized, deminiaturized or closed.

* Tests/AppKit/CPApplicationWindowsMenuTest.j: Add tests for listing, retitling, exclusion, the main window check mark, separator handling, file name titles and moving items to another Windows menu.

* Tests/Manual/TextEditor/WORKLIST.md: Remove the entry for this gap, and record the Window menu as tested.
2026-10-23 16:29:46 -06:00
David Richardson 56aa68f832 AppKit: Reflect the toolbar's visibility in the Show Toolbar menu item
The Show Toolbar menu item toggled the toolbar, but CPWindow did not validate it, so its title never changed and it stayed enabled in windows without a toolbar.

* CPWindow/CPWindow.j: Add validateUserInterfaceItem:, which sets the toggleToolbarShown: item's title to Hide Toolbar or Show Toolbar and enables it only when the window has a toolbar.
* Tests/Manual/TextEditor/WORKLIST.md: Remove the entry for this defect, and record the menu item as tested.
2026-10-23 16:12:14 -06:00
David Richardson c1f8c8ceb3 AppKit: Store the window delegate's resize size in the window frame
A window stored the proposed size in its frame before asking its delegate through windowWillResize:toSize:, and gave the delegate's size only to the window view. When the delegate enlarged the size, hit testing used the smaller frame, so the window could no longer be moved or resized.

* CPWindow/CPWindow.j: Ask the delegate before storing the new size, and store the size it returns in the frame.
* CPWindow/_CPWindowView.j: Ask the delegate during a user resize, and move the origin by the delegate's adjustment when resizing from the left or top edge, so that the opposite edge stays in place.
* Tests/Manual/TextEditor/Resources/DocumentWindow.xib: Make the document window's content view resize with the window.
* Tests/Manual/TextEditor/WORKLIST.md: Remove the entry for this defect, record the minimum window size behaviour as tested, and add the content view resizing setting that does not reach the cib.
2026-10-23 15:21:23 -06:00
David Richardson bfbc522721 AppKit: DOM platform window category ungated (Increment B)
- CPWindow.j: the PLATFORM(BROWSER) import gate removed; the
  CPPlatformWindow (DOM) category now loads under both targets
- category _init restructured: DOM setup (window capture, pasteboard,
  registration) behind CPDOMAvailable; CommonJS branch initializes the
  same state as the base class
- SCROLLWHEEL_LINE_PIXELS converted from #define to a file-scope
  variable; its only uses are within this file
- load-time audit: file-scope statements are DOM-free; the single
  typeof-guarded document reference takes its no-DOM branch under Node
- work-in-progress towards complete removal of CPP directives
2026-10-02 11:11:55 -06:00
David Richardson 880f6a3220 AppKit: CPWindow PLATFORM conditional removal
- CPWindow.j: 16 of 17 PLATFORM blocks resolved; purely mechanical
  translation to runtime CPDOMAvailable guards (wrapped or compound),
  one ivar un-gated; one latent no-return bug preserved as-is
- The PLATFORM(BROWSER) import gate remains, out of scope for this change
- work-in-progress towards complete removal of CPP directives
2026-08-21 15:24:54 -06:00
daboe01 69c8c3d0a2 Merge remote-tracking branch 'upstream/main' into Aristo3 2026-07-25 19:26:39 +02:00
David Richardson 1a9a42ff54 Replace #pragma mark with // MARK:
Replace objc directive with native Javascript version // MARK: to facilitate elimination of preproccsing pass.
2026-07-21 15:15:53 -06:00
daboe01 d64966594d Merge remote-tracking branch 'upstream/main' into Aristo3 2026-05-30 15:12:50 +02:00
daboe01 3b1c1c0886 fixed: tab could not be entered using the keyboard 2026-05-29 22:08:00 +02:00
daboe01 3a4b8fe947 Merge remote-tracking branch 'upstream/main' into Aristo3 2026-02-22 16:30:50 +01:00
daboe01 802c644d94 Fixed: CPWindow setContentView: overlapping the toolbar 2026-02-22 14:54:46 +01:00
daboe01 aba4c865e4 performance optimisation 2026-02-12 22:05:57 +01:00
daboe01 9709ca8b52 new: ThemingAdditions and HUD autosetter 2026-02-12 18:18:25 +01:00
daboe01 d3cc6c29c9 Merge branch 'main' into Aristo3 2024-05-24 16:07:32 +02:00
Martin Carlberg a1e178d0d7 Merge remote-tracking branch 'origin/narwhal' 2024-05-24 12:18:28 +02:00
daboe01 f642330306 new: support for releasedWhenClosed in CPWindow 2023-12-23 19:08:38 +01:00
daboe01 a7a080f416 Merge branch 'pl_2918' into Aristo3 2022-03-23 06:57:54 +01:00
Martin Carlberg edfba15d6f Merge branch 'master' into node 2022-03-21 15:55:08 +01:00
daboe01 1ef49ef290 formatting 2022-01-23 13:42:12 +01:00
daboe01 76d52e07d4 fixed: freeze when clicking during sheet animation
previously, the app froze when clicking somewhere during sheet open/close animations.
these adversarial clicks are simply ignored by this PR
2022-01-23 13:39:33 +01:00
Alfred Wärnsäter 2ecea40fdc lots of Node fixes 2021-08-19 10:56:13 +02:00
Didier Korthoudt 39738b9ded Merge branch 'master' into 010-CPApplicationOSBehavior 2020-10-10 18:27:45 +02:00
Didier Korthoudt 78b3887e4a New: CSS shadow, new theme parameters and Aristo3 CSS theme ready for CPWindow (#2927) 2020-10-09 14:29:10 +02:00
Didier Korthoudt 67a0098c7a CPApplicationOSBehavior 2020-08-28 17:21:41 +02:00
Didier Korthoudt e7d5afe90e New: Added dynamic attributes set for CSS based themes (#2701) 2020-04-06 13:10:34 +02:00
Martin Carlberg 7dc77ed609 Fixed: Make sure we handle undefined when testing for nil values (#2862) 2020-01-31 13:43:58 +01:00
Martin Carlberg 50519776e0 Fixed: Update Tracking areas only once when doing setFrame: (#2879)
This speed improvement is very notable when resizing a browser window of altering the size of split views.
The fix uses a variable on the window to control when to update the tracking areas.
If the view is not connected to a window the tracking areas will not be updated as they will
be when added to a window.
2020-01-06 12:32:35 +01:00
Alexandre Wilhelm 0db0d744da Merge pull request #2784 from daboe01/fixed-wrong-return-type-in-isMovable
fixed: wrong return type in isMovable
2019-02-06 16:57:21 -08:00
daboe01 ae50fde4e1 fixed: wrong return type of isMiniaturized 2018-10-14 16:49:49 +02:00
daboe01 401461f1f0 fixed: wrong return type in isMovable 2018-10-14 13:36:53 +02:00
daboe01 a178d43b01 Fixed: return key was not swallowed by textview but triggered the default button. (#2598) 2018-08-20 12:52:53 +02:00
daboe01 ef2152beea FIXED: click to key window in the background did not bring it forward (take 2) (#2705) 2018-08-20 12:48:58 +02:00
daboe01 e6475c1a9e Fixed: setMinSize: had no effect in platform windows (#2609) 2018-08-20 12:47:29 +02:00
daboe01 e7eff3e585 Fixed: attached sheets were not put to front after calls to makeKeyAndOrderFront: in code (#2606) 2018-08-20 11:34:21 +02:00
daboe01 ad756a5b86 fixed: some mouse events were not propagated when sheets are open (#2603)
* fixed: mouse dragged was not propagated to parent window when sheet was opened

* better detection for attached sheet
2018-05-29 07:17:41 +02:00
cacaodev 93b12eb14f Revert "FIXED: click to key window in the background did not bring it forward" (#2702)
Fixes #2700
2018-05-06 14:07:25 +02:00
cacaodev 0404ac0395 Merge pull request #2602 from daboe01/issue2545
FIXED: click to key window in the background did not bring it forward
2018-04-12 09:11:57 +02:00
daboe01 f961625f03 fixed: some events were not propagated to the bridge window 2018-04-11 18:30:47 +02:00
daniel 15c3a6eae4 Formatting: add missing semi-colons to CPWindow.j 2018-04-04 09:38:43 -07:00
daboe01 df462774aa refactured front detection logic to own method _isFrontmostWindow
fixes travis error
2018-03-20 14:25:42 +01:00
daboe01 488541f26e fixed: click to key window in the background did not bring it forward 2018-03-18 21:45:25 +01:00
cacaodev 35808e7bde FIXED: uninitialized ivar 2017-06-02 11:15:23 +02:00