MacProject Pro 1.5 interaction spec

This page is docs/behavior.md from the repository, published as written.

What the original application does with menus, shortcuts, tools, mouse and keyboard, so the editor can behave the same and muscle memory carries over. It was read from the application's resources (menus, key tables, window layouts, cursors) and from its code; the menu tables give each item and its command key.

Markers

Marker Meaning
[confirmed] Read directly from a resource, or seen in the running app earlier (file-format.md).
[code] Read from the decompiled code (function addresses given).
[guess] Inferred. Says from what.

Sources

Resource What it holds
MBAR, MENU Menus and items.
mKey The app's own key table for its menu definition (MDEF 262), which carries modifiers.
hmnu, hdlg, STR# Balloon Help.
mntb Command number → menu item, including the "Buzzwords" undo names in MENU 128.
view MacApp window layouts.
CURS, SICN, cicn Cursors and icons.
CODE Decompiled in the segments CDoMouseCommand, CDoKeyCommand, CSchedule, CScheduleCommands, CChartObject, CRes.

1. Menu bar

The menu bar (MBAR 128) is, in order: Apple, File, Edit, Chart, Layout, Task, Analyze, Organize, View. [confirmed] The running app shows this order, with Help (the system Balloon Help menu) at the right. Hierarchical submenus come from MBAR 130.

How shortcuts are encoded [confirmed]

Items whose text changes with context [confirmed]

These come from Balloon Help "compare" records and from STR. Each pair is one menu item whose title flips:

Apple (MENU 1)

# Item Shortcut
1 About MacProject Pro…
2 Help... ⌘? (⌘/)
3 —

File (MENU 2)

# Item Shortcut
1 New ⌘N
2 Open… ⌘O
3 Close ⌘W
4 Close Document ⇧⌘W
5 Save ⌘S
6 Save As… ⇧⌘S
7 Revert to Saved
8 Documents ▸ submenu 21
9 —
10 Import...
11 Export...
12 Exchange ▸ submenu 22
13 Extensions ▸ submenu 25
14 —
15 Page Setup… ⇧⌘P
16 Print Preview...
17 Print… ⌘P
18 —
19 Quit ⌘Q

Edit (MENU 3)

# Item Shortcut
1 Undo ⌘Z
2 —
3 Cut ⌘X
4 Copy ⌘C
5 Paste ⌘V
6 Clear
7 Duplicate ⌘D
8 Select All ⌘A
9 —
10 Publishing ▸ submenu 12
11 —
12 Spelling ▸ submenu 10
13 Find ▸ submenu 20
14 —
15 Preferences...
16 Show Clipboard

Chart (MENU 4)

# Item Shortcut
1 Outline
2 —
3 Schedule Chart
4 Task Timeline
5 Project Table
6 —
7 Resource Timeline
8 Resource Table
9 Resource Histogram
10 Allocation Table
11 —
12 Cash Flow Table
13 Dependency Table
14 Project Overview

Layout (MENU 5)

# Item Shortcut
1 Use Autogrid
2 Clean Up Schedule
3 Schedule Chart Size...
4 Display Attributes... ⇧⌘A
5 —
6 Attributes...
7 Column Setup...
8 Timeline Setup... ⌘U
9 Timeline Bars ▸ submenu 15
10 —
11 Change to Legend
12 Change to Note
13 Show/Hide Notes
14 —
15 Font ▸ submenu 11
16 Size ▸ submenu 13
17 Style ▸ submenu 14
18 Color ▸ submenu 18

Task (MENU 9)

# Item Shortcut
1 Change to Milestone ⌘M
2 Show Task Info... ⌘T
3 Mark Completed ⌘K
4 —
5 Link to Subproject... ⇧⌘L
6 Go to Subproject
7 Go to Supertask
8 Link to Task ...
9 —
10 Attach Document...
11 Attach Note
12 —
13 Lag Time...

Analyze (MENU 6)

# Item Shortcut
1 AutoCalc
2 Calculate Now ⌘=
3 Calculate Using Planned
4 Calculate Using Actual
5 —
6 Consolidate Project Family
7 Get Master Project Dates
8 —
9 Show Calendar Info... ⌘E
10 Duration Scale... ⇧⌘D
11 —
12 Resources... ⌘R
13 Resource Scope...
14 Level Resources ⌘L
15 Unlevel Resources
16 View Leveler Results
17 —
18 Baseline All

Organize (MENU 7)

# Item Shortcut
1 Move to Task Palette ⌘I
2 Move to Schedule Chart ⇧⌘M
3 Make Custom Summary...
4 Make Outline Summary ⇧⌘E
5 —
6 Sort... ⌘J
7 Sort Again ⇧⌘J
8 —
9 Search... ⇧⌘F
10 Search Again ⇧⌘H
11 Show All

View (MENU 8)

# Item Shortcut
1 Show Tool Palette ⌘-
2 Show Task Palette ⌘[
3 Show Cue Card ⌘]
4 —
5 Arrange Charts ▸ submenu 23
6 Fit to Window ⇧⌘R
7 —
8 Perspectives...

Find (MENU 20)

# Item Shortcut
1 Find... ⌘F
2 Go To First ⌘G
3 Find Next ⌘H

Spelling (MENU 10)

# Item Shortcut
1 Check All… ⌘Y
2 Check Selection…
3 —
4 Spell Word… ⇧⌘Y
5 Options…
6 —
7 Install Dictionaries…
8 Edit User Dictionary…

Publishing (MENU 12)

# Item Shortcut
1 Create Publisher...
2 Subscribe To...
3 —
4 Publisher Options...
5 Edition List...
6 —
7 Suspend Edition Updates
8 Show Borders

Size (MENU 13)

# Item Shortcut
1 9 Point
2 10 Point
3 12 Point
4 14 Point
5 18 Point
6 24 Point
7 36 Point
8 —
9 Other… ⇧⌘O

Style (MENU 14)

# Item Shortcut
1 Plain Text ⇧⌘T
2 Bold ⇧⌘B
3 Italic ⇧⌘I
4 Underline ⇧⌘U
5 Outline
6 Shadow
7 Condensed
8 Extended

Shapes (MENU 15)

# Item Shortcut
1 Bar Formats...
2 —

Arrange Charts (MENU 23)

# Item Shortcut
1 Tile Across
2 Tile Down
3 Stack
4 Tile Special
5 —
6 Current Document Only

Exchange (MENU 22)

# Item Shortcut
1 —
2 Exchange Setup...

Shortcut collisions with macOS 27 (for the main session to decide)

Key MacProject Pro macOS convention
⌘H Edit ▸ Find ▸ Find Next Hide app
⌘M Task ▸ Change to Milestone Minimize window
⌘- Show/Hide Tools Palette Zoom out (MacProject zooms with the window's zoom icons)
⌘= Calculate Now Zoom in
⌘[ / ⌘] Task Palette / Cue Card Back / Forward
⌘T Show Task Info Show Fonts
⌘D Duplicate / New … — (same meaning)
⌘E Show Calendar Info Use Selection for Find
⌘L Level Resources —
⌘K Mark Completed —
⌘J Sort… —
⌘R Resources… —
⌘U Timeline Setup Underline
⌘I Move to Task Palette Italic
⌘B — (Bold is ⇧⌘B) Bold
⌘G Find ▸ Go To First Find Next
⌘Y Spelling ▸ Check All —

MacProject uses ⇧⌘ for text styles (⇧⌘B/I/U/T) precisely because ⌘I/⌘U/⌘T are taken. Muscle memory wants ⌘M, ⌘T, ⌘K, ⌘D, ⌘E, ⌘L, ⌘R, ⌘J, ⌘= and ⇧⌘A as listed. Only ⌘H and ⌘M collide with system-wide items, and an app may rebind both by changing its own Hide and Minimize items.

2. Tools palette (View ▸ Show Tools Palette, ⌘-) [confirmed]

The palette (view 9003 "Tool Palette", class TToolPalette) is a floating window of command buttons, not drawing tools: 18 buttons of 21 × 21 px in 3 columns and 6 rows. Each button has a normal and a pressed cicn (12500–12535, named in the resource). The Balloon Help (hdlg 1010 → STR# 27001) says what each button does and when it's available.

Row Left (h 3) Middle (h 26) Right (h 49)
1 (v 2) Outline (outl): makes the Outline active Schedule Chart (pert): makes the Schedule Chart active Task Timeline (tmln)
2 (v 25) Task Info (info): opens Task Info for the selected task; available with a task selected Calendars (cale): opens the Calendar Info window Column Setup (coln): tables only
3 (v 48) Sort (sort): Sort dialog; not in Project Overview Search (sear): Search dialog, to show, hide or select tasks Find (find): Find dialog, to locate a task
4 (v 71) Calculate (calc): recalculates schedule and budget Level Resources (levl) Create Perspective (pers)
5 (v 94) Save (save) Print (prnt) Print Preview (prev)
6 Fit to Window (fitw): toggles with Actual Size Tile Down (tldn) Tile Across (tlac)

Each button is the same command as its menu item:

Button Command Menu item
Task Info 1068 Task ▸ Show Task Info
Calendars 1043 Analyze ▸ Show Calendar Info
Column Setup 1080 Layout ▸ Column Setup
Sort 1058 Organize ▸ Sort
Search 1060 Organize ▸ Search
Find 1055 Edit ▸ Find ▸ Find
Calculate 1038 Analyze ▸ Calculate Now
Level Resources 1046 Analyze ▸ Level Resources
Create Perspective 1064 View ▸ Perspectives
Save 30 File ▸ Save
Print 178 File ▸ Print
Print Preview 194 File ▸ Print Preview
Fit to Window 1023 View ▸ Fit to Window
Tile Down, Tile Across 1123… View ▸ Arrange Charts

[confirmed] for the commands and menu items that Balloon Help names. The ID-to-command pairing is a [guess]: it follows from the ID order matching the menu order.

Other floating windows [confirmed]

These come from Balloon Help (STR# 27000).

3. Window controls

Every chart window, bottom-left [confirmed]

These come from hdlg 1000 → STR# 27000.

Outline window palette (view 1002, TTblOutlinePallete) [confirmed]

Left to right:

The undo names are "Move Left / Move Right / Move Up / Move Down" (commands 1910–1913) and "Drag Item" (1914): rows can be dragged to reorder [confirmed] (by the undo name).

Calendar Info window (⌘E; view 14000) [confirmed]

4. Mouse gestures: Schedule Chart [code]

The Schedule Chart's DoMouseCommand is CDoMouseCommand_3f90 @ 0x81b94.

Modifier flags [guess]

The event record passed in has boolean modifier flags at +5, +6 and +8, and the click count at +0x10 [code]. They map as +5 = ⌘, +6 = ⇧, +8 = ⌥. This is a guess, from:

A second, confirmed point: the code reads the keyboard directly, with GetKeys + BitTst.

Hit testing [code]

CDoMouseCommand_3d38 @ 0x8193c and FUN_000815cc test in this order:

  1. notes in the front layer;
  2. the box whose name is being edited;
  3. dependency lines, within about 5–6 px of the line (part 1);
  4. the other chart objects, by layer.

A chart object's hit test (CChartObject @ 0xf6b00…) returns:

Part Where Note
2 Inside the inner rectangle The name/text area.
1 The border band between the inner and outer rectangles
3–6 The four corner handles Live only when the object is already selected; then a single click resizes.
12 A 12 × 12 icon rectangle Probably a collapsed note or note icon [guess].

Gestures

Gesture Result Evidence
Drag in empty space Draws a new task box: a grey XOR rubber-band rectangle, PenMode 10. On release, a task with exactly that rectangle is created if it's at least 30 × 20 px. A plain click or smaller drag creates nothing and deselects all. Undo "New Task". CScheduleCommands_3e88 → TNewTaskCommand I-method FUN_000ceb84; track/feedback _4028, _4114; DoIt _41bc (size check >0x1d, >0x13) [code]
Hold ⌥ while drawing The rubber band becomes a rounded rectangle (20 × 20 corners) and the result is a milestone. The key is read live during the drag. BitTst 61 in _4028; Main_17b4(0x108) milestone object in _41bc [code]
⇧-drag in empty space Selection rectangle. Objects entirely inside are selected. If ⇧ is still down at release, the selection is extended; otherwise it's replaced. CScheduleCommands_3cd0 → FUN_000d13e8; _6a9c (BitTst 63, then select objects inside) [code]; the ⇧ mapping [guess]
Click inside a task box (part 2) Selects it and puts an insertion point in its name (in-place editing). CScheduleCommands_3da4 → CTextEdit_2e90 [code]
Drag from inside a task box out past its edge (more than 4 px outside) Becomes a dependency drag: a rubber line follows the mouse. Release on another task: a dependency (finish-to-start). Release in empty space: a new task is created there and linked from the first; with ⌥ held it's a milestone. Undo "Dependent Task". CRes_2a60 (PtInRect against the box inset −4; creates command 11002) → CScheduleCommands_435c I-method, DoIt _4970 (BitTst 61, CConstruct_1bc8 new task, CConstruct_09a8 new dependency) [code]
Drag a task's border (part 1) Moves the selected boxes. Undo "Move" (1904). CScheduleCommands_3d0c → FUN_000cfde8 (command 1904) [code]
⌥-click or ⌥-drag on a box (any part) Selects and moves without entering text editing: the interior also moves. the +8 branch in _3f90 sends parts 1, 2 and 12 to Move [code]; ⌥ [guess]
Drag a corner handle of a selected box Resize. Undo "Resize" (1905). CScheduleCommands_3d54 → FUN_000d06a4 [code]
Double-click a task Task Info. CTaskInfo_00f0 [code]
⌘-double-click a supertask Go to Subproject (opens the subproject). the +5 branch; CScheduleCommands_3ed4 → CProjectCommands_06cc [code]; ⌘ [guess]
⌘-double-click an external (linked) task Go to Linked Task. CScheduleCommands_3f14 [code]
Double-click a dependency line Lag Time dialog. CLagDlg_0670 [code]
Double-click a legend Display Attributes dialog. CShowAttributesDlg_0000 (note +0x34) [code]
Double-click note text Edits the note text (sticky/attached notes). CEditCommands_0c5c / CSelectCommands_1fa0 [code]; exact branch [guess]
Click a dependency line Selects it. Then ⌘D = Insert Task puts a new task between the two (Balloon Help). [code] + [confirmed]
Arrow keys (no ⌥) with chart objects selected Nudge 1 px (←→ horizontal, ↑↓ vertical). Undo "Move". CDoKeyCommand_0138: char 0x1C/0x1D/0x1E/0x1F → CScheduleCommands_0580 (dx/dy ±1) [code]
Shift-click a box Adds to or removes from the selection. [guess]: standard MacApp; the selection helper CSchedule_167c is called without deselecting
Autogrid (Layout ▸ Use Autogrid) Snaps moves and new boxes to a 10 px grid. the dependency command rounds positions down to multiples of 10 (_435c) [code]; grid spacing (10, 10) is in dcst +0x208 (NOTES)

Other details:

5. Mouse gestures: Task Timeline [code]

The handler is CDoMouseCommand_6730 @ 0x84334, plus CTimelineCommands.

Gesture Result Evidence
⌥-drag a bar Bar Move: reschedules the task. Undo "Bar Move" (1918). +8 → command 0x77e [code]; ⌥ [guess]
Drag a bar's end handle (part 11) Bar Resize (duration) or Percent Done Changes (dragging the %-done marker). CTimelineCommands_0bb4; commands 1919 and 1920 are both set up in CTimelineCommands +0xbd6 [code]; which handle does which [guess]
⌘-double-click a row Go to Subproject. +5 and click count 2 → CProjectCommands_06cc [code]
Click or double-click a row Select; double-click opens Task Info. CTimelineCommands_1700(…, clickCount) [code]; Task Info [guess]

6. Tables and Outline

Gesture Result Evidence
⌘D New Task, Item, Resource, Allocation or Dependency below the selected row, or at the bottom if nothing is selected. Balloon Help [confirmed]
Drag a column header edge Column Resize. CURS 8200/8203 "Column Resizer"; undo 1901 [confirmed]
Drag a column header Column Move. CURS 8204; undo 1903 [confirmed]
Drag a row edge Row Resize. CURS 8300/8301; undo 1902 [confirmed]
Click a collapsed column Uncollapses it. CURS 8201 "ColUncollapseCursor"; SICN 8402 [confirmed]
Click a toggle cell Toggles a yes/no attribute. CURS 8700 "Toggle cursor", a checkmark; SICN 8700 "Toggle icons" [confirmed]; which cells [guess]: yes/no fields such as Critical
Return in a cell Commits the entry; the default MacApp handling. CDoKeyCommand_0138/GRes_0f18 [code]; moves to the next row [guess]
Tab / ⇧Tab Next / previous cell. [guess]: standard MacApp table behaviour
Typing a resource or calendar name that doesn't exist Asks "Create a new resource '^0'?". An empty name asks "No resource name was entered. Delete the resource/allocation?". STR# 8902 [confirmed]
Resource allocated twice "The resource '^0' can only be allocated to the task once." STR# 8902 [confirmed]
Task IDs "Task IDs must be unique." STR# 8902 [confirmed]

7. Keyboard (outside menus)

8. Task Info window (⌘T, double-click a task)

The window is view 8900, TTaskInfoWindow: a scroller around view 7778 "TaskInfoGuts", or 7777 "SummaryInfoGuts" for summaries. The labels are attribute names filled in at run time, so the resources don't hold them. The field list comes from checking MacProject Pro itself (file-format.md) (2026-10-17) [confirmed]; the grouping comes from the view tree [confirmed]. The guts are three collapsible sections (TTaskInfoExpandView).

Section 1, task. Static label and pop-up, then:

  1. Task Duration (edit) with the unit (Weeks or Days…);
  2. Calendar Name (pop-up MENU 8901);
  3. % Done (edit);
  4. a resource grid, editable cells: Resource, Work, Number, % Effort, Duration;
  5. Leveling Priority (edit), labelled "(100 = Highest, 0 = Do Not Level)";
  6. Outline Number (static).

Section 2, schedule.

Section 3, custom fields. An attribute pop-up plus a value edit.

9. Dialogs worth mirroring [confirmed]

Dialog View Contents
Display Attributes (⇧⌘A) 6000 A sample box labelled "Task Name". "Select a corner, then choose an item to be displayed." The corner slots are in file-format.md.
Duration Scale (⇧⌘D) 18000 Radio buttons Minute, Hour, Day, Week, Month.
Lag Time 22000 See §4.
Link to Task 23000 Projects list, Tasks list, a Link button. "Task '^0' in the document '^1' is the starting task. Select the dependent task." (TEXT 23001)
Preferences 3400–3408 Panels: Document, Critical Path, Resources, Formats, Number Formats, Clean Up, Time (Timeline), Outline.
Timeline Setup (⌘U) 2002 —
Bar Formats 2003, 2004 —
Sort 4002 —
Search 4003, 4004 —
Column Setup 8700 —
Perspectives 4000–4005 —
Print Preview 9152 —