IMPORT dworks.widgets ' d/Write-ish import example W10. ' ' The application is deliberately target-blind. The Mac-native preview is a ' developer-kit run of this same WINDOW/GFX source, not a Mac-only widget set. CLASS WorksWriteSample PUBLIC: Width AS INTEGER Height AS INTEGER Compact AS INTEGER Focus AS INTEGER PreviousButtons AS INTEGER Pressed AS INTEGER Theme AS WorksTheme Metrics AS WorksMetrics Event AS WorksLocalEvent Chrome AS WorksPanel Heading AS WorksLabel Title AS WorksTextField Save AS WorksButton Wrap AS WorksToggle DECLARE CONSTRUCTOR () DECLARE SUB Layout () DECLARE SUB Paint () DECLARE SUB PaintCompact () DECLARE SUB SetFocus (NextFocus AS INTEGER) DECLARE SUB AdvanceFocus () DECLARE SUB ActivateFocus () DECLARE SUB HandleKey (K AS INTEGER) DECLARE SUB HandlePointer (PX AS INTEGER, PY AS INTEGER, Buttons AS INTEGER) END CLASS DIM SHARED App AS WorksWriteSample CONSTRUCTOR WorksWriteSample () DIM Theme AS WorksTheme DIM Chrome AS WorksPanel DIM Heading AS WorksLabel DIM Title AS WorksTextField DIM Save AS WorksButton DIM Wrap AS WorksToggle THIS.Theme = NEW WorksTheme() THIS.Metrics = NEW WorksMetrics() THIS.Event = NEW WorksLocalEvent() THIS.Chrome = NEW WorksPanel("d/Write") THIS.Heading = NEW WorksLabel("New document") THIS.Title = NEW WorksTextField("document-title", "Untitled") THIS.Save = NEW WorksButton("save", "Save") THIS.Wrap = NEW WorksToggle("wrap", "Wrap text") Theme = THIS.Theme Chrome = THIS.Chrome Heading = THIS.Heading Title = THIS.Title Save = THIS.Save Wrap = THIS.Wrap Chrome.ApplyTheme Theme Heading.ApplyTheme Theme Title.ApplyTheme Theme Save.ApplyTheme Theme Wrap.ApplyTheme Theme THIS.Focus = 1 END CONSTRUCTOR SUB WorksWriteSample.Layout () DIM Left AS INTEGER DIM Wide AS INTEGER DIM Tall AS INTEGER DIM Metrics AS WorksMetrics DIM Chrome AS WorksPanel DIM Heading AS WorksLabel DIM Title AS WorksTextField DIM Save AS WorksButton DIM Wrap AS WorksToggle Metrics = THIS.Metrics Chrome = THIS.Chrome Heading = THIS.Heading Title = THIS.Title Save = THIS.Save Wrap = THIS.Wrap IF THIS.Width < 1 THEN THIS.Width = 1 IF THIS.Height < 1 THEN THIS.Height = 1 THIS.Compact = 0 IF THIS.Width < 240 OR THIS.Height < 150 THEN THIS.Compact = -1 IF THIS.Compact <> 0 THEN EXIT SUB Left = Metrics.Margin Wide = THIS.Width - Metrics.Margin * 2 IF Wide < 1 THEN Wide = 1 Tall = THIS.Height Chrome.SetBounds 0, 0, THIS.Width, Tall ' Ui Chrome has a 16px line box. Start the heading below the panel caption ' and leave a real gap before the field rather than overlapping both labels. Heading.SetBounds Left, Metrics.Margin + 16, Wide, 16 Title.SetBounds Left, Metrics.Margin + 36, Wide, Metrics.ControlHeight Wrap.SetBounds Left, Metrics.Margin + 36 + Metrics.ControlHeight + Metrics.Gap, Wide, 18 Save.SetBounds Left, Metrics.Margin + 36 + Metrics.ControlHeight + Metrics.Gap + 28, 74, Metrics.ControlHeight END SUB SUB WorksWriteSample.PaintCompact () DIM Theme AS WorksTheme Theme = THIS.Theme INTENT GFX.BEGIN_FRAME() INTENT GFX.FILL_RECT(0, 0, THIS.Width, THIS.Height, Theme.Canvas) IF THIS.Width > 2 AND THIS.Height > 2 THEN INTENT GFX.FILL_RECT(1, 1, THIS.Width - 2, THIS.Height - 2, Theme.Panel) END IF IF THIS.Width >= 96 AND THIS.Height >= 18 THEN INTENT GFX.SET_CLIP(0, 0, THIS.Width, THIS.Height) INTENT GFX.DRAW_TEXT(4, 4, "d/Write compact", 1, Theme.Paper, Theme.Panel) INTENT GFX.RESET_CLIP() END IF INTENT GFX.PRESENT() END SUB SUB WorksWriteSample.Paint () DIM Theme AS WorksTheme DIM Metrics AS WorksMetrics DIM Event AS WorksLocalEvent DIM Chrome AS WorksPanel DIM Heading AS WorksLabel DIM Title AS WorksTextField DIM Save AS WorksButton DIM Wrap AS WorksToggle DIM StatusY AS INTEGER Theme = THIS.Theme Metrics = THIS.Metrics Event = THIS.Event Chrome = THIS.Chrome Heading = THIS.Heading Title = THIS.Title Save = THIS.Save Wrap = THIS.Wrap IF THIS.Compact <> 0 THEN THIS.PaintCompact EXIT SUB END IF StatusY = THIS.Height - 18 IF StatusY < 1 THEN StatusY = 1 INTENT GFX.BEGIN_FRAME() INTENT GFX.FILL_RECT(0, 0, THIS.Width, THIS.Height, Theme.Canvas) Chrome.Paint Heading.Paint Title.Paint Wrap.Paint Save.Paint INTENT GFX.SET_CLIP(0, StatusY, THIS.Width, THIS.Height - StatusY) INTENT GFX.FILL_RECT(0, StatusY, THIS.Width, THIS.Height - StatusY, Theme.Canvas) IF LEN(Event.Note) = 0 THEN INTENT GFX.DRAW_TEXT(Metrics.Margin, StatusY + 5, "Tab moves focus. Enter saves. ASCII title input.", 2, Theme.Paper, Theme.Canvas) ELSE INTENT GFX.DRAW_TEXT(Metrics.Margin, StatusY + 5, Event.Kind + ": " + Event.Note, 2, Theme.Paper, Theme.Canvas) END IF INTENT GFX.RESET_CLIP() INTENT GFX.PRESENT() END SUB SUB WorksWriteSample.SetFocus (NextFocus AS INTEGER) THIS.Focus = NextFocus THIS.Title.Focused = 0 THIS.Wrap.Focused = 0 THIS.Save.Focused = 0 IF THIS.Focus = 1 THEN THIS.Title.Focused = -1 IF THIS.Focus = 2 THEN THIS.Wrap.Focused = -1 IF THIS.Focus = 3 THEN THIS.Save.Focused = -1 END SUB SUB WorksWriteSample.AdvanceFocus () THIS.Focus = THIS.Focus + 1 IF THIS.Focus > 3 THEN THIS.Focus = 1 THIS.SetFocus THIS.Focus END SUB SUB WorksWriteSample.ActivateFocus () DIM Event AS WorksLocalEvent DIM Save AS WorksButton DIM Wrap AS WorksToggle Event = THIS.Event Save = THIS.Save Wrap = THIS.Wrap IF THIS.Focus = 2 THEN Wrap.Flip Event IF THIS.Focus = 3 THEN Save.Activate Event END SUB SUB WorksWriteSample.HandleKey (K AS INTEGER) DIM Event AS WorksLocalEvent DIM Title AS WorksTextField Event = THIS.Event Title = THIS.Title IF THIS.Compact <> 0 THEN EXIT SUB IF K = 9 THEN THIS.AdvanceFocus ELSEIF K = 13 THEN THIS.ActivateFocus ELSEIF THIS.Focus = 1 THEN Title.AcceptKey K Title.PublishText Event END IF END SUB SUB WorksWriteSample.HandlePointer (PX AS INTEGER, PY AS INTEGER, Buttons AS INTEGER) DIM Event AS WorksLocalEvent DIM Title AS WorksTextField DIM Save AS WorksButton DIM Wrap AS WorksToggle Event = THIS.Event Title = THIS.Title Save = THIS.Save Wrap = THIS.Wrap IF THIS.Compact <> 0 THEN THIS.Pressed = 0 THIS.PreviousButtons = Buttons EXIT SUB END IF IF Buttons <> 0 AND THIS.PreviousButtons = 0 THEN THIS.Pressed = 0 ' Current D/BASIC imported-instance FUNCTION dispatch is not yet a safe ' event-reducer boundary. Controllers own their public widget bounds ' until that OOP lowering is integrated; no widget internals leak here. IF PX >= Title.X AND PX < Title.X + Title.Width AND PY >= Title.Y AND PY < Title.Y + Title.Height THEN THIS.Pressed = 1 IF PX >= Wrap.X AND PX < Wrap.X + Wrap.Width AND PY >= Wrap.Y AND PY < Wrap.Y + Wrap.Height THEN THIS.Pressed = 2 IF PX >= Save.X AND PX < Save.X + Save.Width AND PY >= Save.Y AND PY < Save.Y + Save.Height THEN THIS.Pressed = 3 IF THIS.Pressed = 1 THEN THIS.SetFocus 1 Title.PlaceCaret PX END IF IF THIS.Pressed = 2 THEN THIS.SetFocus 2 Wrap.Down = -1 END IF IF THIS.Pressed = 3 THEN THIS.SetFocus 3 Save.Down = -1 END IF END IF IF Buttons = 0 AND THIS.PreviousButtons <> 0 THEN IF THIS.Pressed = 2 AND PX >= Wrap.X AND PX < Wrap.X + Wrap.Width AND PY >= Wrap.Y AND PY < Wrap.Y + Wrap.Height THEN Wrap.Flip Event IF THIS.Pressed = 3 AND PX >= Save.X AND PX < Save.X + Save.Width AND PY >= Save.Y AND PY < Save.Y + Save.Height THEN Save.Activate Event Wrap.Down = 0 Save.Down = 0 THIS.Pressed = 0 END IF THIS.PreviousButtons = Buttons END SUB WINDOW SUB OPEN() App = NEW WorksWriteSample() App.Width = 320 App.Height = 192 App.Layout App.SetFocus 1 SERVICE SET_TITLE("d/Write import example") END SUB WINDOW SUB DRAW() App.Paint END SUB WINDOW SUB RESIZE(W AS INTEGER, H AS INTEGER) App.Width = W App.Height = H App.Layout SERVICE INVALIDATE() END SUB WINDOW SUB CLOSE() App = NOTHING END SUB ON KEY SUB (K AS INTEGER) App.HandleKey K SERVICE INVALIDATE() END SUB ON POINTER SUB (X AS INTEGER, Y AS INTEGER, B AS INTEGER) App.HandlePointer X, Y, B SERVICE INVALIDATE() END SUB