'----------------------------------------------------------------------------------------------------------------------- ' InForm-PE GUI engine for QB64-PE ' Copyright (c) 2024 Samuel Gomes ' Copyright (c) 2023 George McGinn ' Copyright (c) 2022 Fellippe Heitor '----------------------------------------------------------------------------------------------------------------------- OPTION _EXPLICIT $EXEICON:'./resources/InForm.ico' 'Controls: -------------------------------------------------------------------- 'Main form DIM SHARED UiEditor AS LONG DIM SHARED StatusBar AS LONG 'Menus DIM SHARED FileMenu AS LONG, EditMenu AS LONG, ViewMenu AS LONG DIM SHARED InsertMenu AS LONG, AlignMenu AS LONG, OptionsMenu AS LONG DIM SHARED HelpMenu AS LONG, FontSwitchMenu AS LONG 'Frames DIM SHARED Toolbox AS LONG, ColorMixer AS LONG DIM SHARED OpenFrame AS LONG, ZOrdering AS LONG DIM SHARED ControlProperties AS LONG, ControlToggles AS LONG DIM SHARED SetControlBinding AS LONG 'Menu items DIM SHARED FileMenuNew AS LONG, FileMenuOpen AS LONG DIM SHARED FileMenuSave AS LONG, FileMenuSaveAs AS LONG DIM SHARED FileMenuExit AS LONG DIM SHARED FileMenuRecent AS LONG DIM SHARED FileMenuRecent1 AS LONG DIM SHARED FileMenuRecent2 AS LONG DIM SHARED FileMenuRecent3 AS LONG DIM SHARED FileMenuRecent4 AS LONG DIM SHARED FileMenuRecent5 AS LONG DIM SHARED FileMenuRecent6 AS LONG DIM SHARED FileMenuRecent7 AS LONG DIM SHARED FileMenuRecent8 AS LONG DIM SHARED FileMenuRecent9 AS LONG DIM SHARED EditMenuUndo AS LONG, EditMenuRedo AS LONG, EditMenuCut AS LONG DIM SHARED EditMenuCopy AS LONG, EditMenuPaste AS LONG DIM SHARED EditMenuDelete AS LONG, EditMenuSelectAll AS LONG DIM SHARED EditMenuCP437 AS LONG, EditMenuCP1252 AS LONG DIM SHARED EditMenuConvertType AS LONG, EditMenuSetDefaultButton AS LONG DIM SHARED EditMenuRestoreDimensions AS LONG, EditMenuBindControls AS LONG DIM SHARED EditMenuAllowMinMax AS LONG, EditMenuZOrdering AS LONG DIM SHARED ViewMenuPreviewDetach AS LONG DIM SHARED ViewMenuShowPositionAndSize AS LONG DIM SHARED ViewMenuShowInvisibleControls AS LONG DIM SHARED ViewMenuPreview AS LONG, ViewMenuLoadedFonts AS LONG DIM SHARED InsertMenuMenuBar AS LONG, InsertMenuContextMenu AS LONG DIM SHARED InsertMenuMenuItem AS LONG DIM SHARED OptionsMenuSnapLines AS LONG DIM SHARED AlignMenuAlignLeft AS LONG DIM SHARED AlignMenuAlignRight AS LONG DIM SHARED AlignMenuAlignTops AS LONG DIM SHARED AlignMenuAlignBottoms AS LONG DIM SHARED AlignMenuAlignCentersV AS LONG DIM SHARED AlignMenuAlignCentersH AS LONG DIM SHARED AlignMenuAlignCenterV AS LONG DIM SHARED AlignMenuAlignCenterH AS LONG DIM SHARED AlignMenuDistributeV AS LONG DIM SHARED AlignMenuDistributeH AS LONG DIM SHARED OptionsMenuAutoName AS LONG, OptionsMenuSwapButtons AS LONG DIM SHARED HelpMenuHelp AS LONG, HelpMenuAbout AS LONG DIM SHARED FontSwitchMenuSwitch AS LONG 'Toolbox buttons DIM SHARED AddButton AS LONG, AddLabel AS LONG DIM SHARED AddTextBox AS LONG, AddNumericBox AS LONG DIM SHARED AddCheckBox AS LONG, AddRadioButton AS LONG DIM SHARED AddListBox AS LONG, AddDropdownList AS LONG DIM SHARED AddTrackBar AS LONG, AddProgressBar AS LONG DIM SHARED AddPictureBox AS LONG, AddFrame AS LONG DIM SHARED AddToggleSwitch AS LONG 'Control toggles DIM SHARED Stretch AS LONG, HasBorder AS LONG DIM SHARED ShowPercentage AS LONG, PasswordMaskCB AS LONG DIM SHARED WordWrap AS LONG, CanHaveFocus AS LONG DIM SHARED Disabled AS LONG, Transparent AS LONG DIM SHARED Hidden AS LONG, CenteredWindow AS LONG DIM SHARED Resizable AS LONG, AutoScroll AS LONG DIM SHARED AutoSize AS LONG, SizeTB AS LONG DIM SHARED HideTicks AS LONG, AutoPlayGif AS LONG DIM SHARED AddGifExtensionToggle AS LONG 'Open/Save dialog DIM SHARED DialogBG AS LONG, FileNameLB AS LONG DIM SHARED FileNameTextBox AS LONG, PathLB AS LONG DIM SHARED FilesLB AS LONG, FileList AS LONG DIM SHARED PathsLB AS LONG, DirList AS LONG DIM SHARED OpenBT AS LONG, SaveBT AS LONG, CancelBT AS LONG DIM SHARED ShowOnlyFrmbinFilesCB AS LONG, SaveFrmOnlyCB AS LONG 'Z-ordering dialog DIM SHARED ControlList AS LONG, UpBT AS LONG DIM SHARED DownBT AS LONG, CloseZOrderingBT AS LONG 'Set binding dialog DIM SHARED SourceControlLB AS LONG DIM SHARED SourceControlNameLB AS LONG DIM SHARED TargetControlLB AS LONG DIM SHARED TargetControlNameLB AS LONG 'DIM SHARED SwapBT AS LONG DIM SHARED SourcePropertyLB AS LONG DIM SHARED SourcePropertyList AS LONG DIM SHARED TargetPropertyLB AS LONG DIM SHARED TargetPropertyList AS LONG DIM SHARED BindBT AS LONG DIM SHARED CancelBindBT AS LONG 'Properties DIM SHARED TextAlignLB AS LONG, AlignOptions AS LONG DIM SHARED VerticalAlignLB AS LONG, VAlignOptions AS LONG DIM SHARED ColorPropertiesList AS LONG, ColorPreview AS LONG DIM SHARED Red AS LONG, RedValue AS LONG DIM SHARED Green AS LONG, GreenValue AS LONG DIM SHARED Blue AS LONG, BlueValue AS LONG DIM SHARED NameLB AS LONG, CaptionLB AS LONG DIM SHARED TextLB AS LONG, TopLB AS LONG DIM SHARED LeftLB AS LONG, WidthLB AS LONG DIM SHARED HeightLB AS LONG, FontLB AS LONG DIM SHARED TooltipLB AS LONG, ValueLB AS LONG DIM SHARED MinLB AS LONG, MaxLB AS LONG DIM SHARED IntervalLB AS LONG, MinIntervalLB AS LONG DIM SHARED PaddingLeftrightLB AS LONG, NameTB AS LONG DIM SHARED CaptionTB AS LONG, TextTB AS LONG DIM SHARED TopTB AS LONG, LeftTB AS LONG DIM SHARED WidthTB AS LONG, HeightTB AS LONG DIM SHARED FontTB AS LONG, TooltipTB AS LONG DIM SHARED ValueTB AS LONG, MinTB AS LONG DIM SHARED MaxTB AS LONG, IntervalTB AS LONG DIM SHARED MinIntervalTB AS LONG, PaddingTB AS LONG DIM SHARED MaskTB AS LONG, MaskLB AS LONG DIM SHARED BulletOptions AS LONG, BulletOptionsLB AS LONG DIM SHARED BooleanLB AS LONG, BooleanOptions AS LONG DIM SHARED FontListLB AS LONG, FontList AS LONG, FontSizeList DIM SHARED PasteListBT AS LONG, ContextMenuLB AS LONG DIM SHARED ContextMenuControlsList AS LONG DIM SHARED KeyboardComboLB AS LONG, KeyboardComboBT AS LONG '------------------------------------------------------------------------------ 'Other shared variables: DIM SHARED UiPreviewPID AS LONG, TotalSelected AS LONG, FirstSelected AS LONG DIM SHARED PreviewFormID AS LONG, PreviewSelectionRectangle AS INTEGER DIM SHARED PreviewAttached AS _BYTE, AutoNameControls AS _BYTE DIM SHARED LastKeyPress AS DOUBLE DIM SHARED UiEditorTitle$, Edited AS _BYTE, ZOrderingDialogOpen AS _BYTE DIM SHARED OpenDialogOpen AS _BYTE DIM SHARED PropertySent AS _BYTE, RevertEdit AS _BYTE, OldColor AS _UNSIGNED LONG DIM SHARED ColorPreviewWord$, BlinkStatusBar AS SINGLE, StatusBarBackColor AS _UNSIGNED LONG DIM SHARED InstanceHost AS LONG, InstanceClient AS LONG DIM SHARED HostPort AS STRING, Host AS LONG, Client AS LONG DIM SHARED Stream$, FormDataReceived AS _BYTE, LastFormData$ DIM SHARED prevScreenX AS INTEGER, prevScreenY AS INTEGER DIM SHARED UndoPointer AS INTEGER, TotalUndoImages AS INTEGER DIM SHARED totalBytesSent AS _UNSIGNED _INTEGER64 DIM SHARED RecentMenuItem(1 TO 9) AS LONG, RecentListBuilt AS _BYTE DIM SHARED LoadedWithGifExtension AS _BYTE, AddGifExtension AS _BYTE DIM SHARED TotalGifLoaded AS LONG, SetBindingDialogOpen AS _BYTE DIM SHARED InitialControlSet AS STRING DIM SHARED Answer AS LONG TYPE newInputBox ID AS LONG LabelID AS LONG Signal AS INTEGER LastEdited AS SINGLE DataType AS INTEGER Sent AS _BYTE END TYPE CONST DT_Text = 1 CONST DT_Integer = 2 CONST DT_Float = 3 REDIM SHARED PreviewCaptions(0) AS STRING REDIM SHARED PreviewTexts(0) AS STRING REDIM SHARED PreviewMasks(0) AS STRING REDIM SHARED PreviewTips(0) AS STRING REDIM SHARED PreviewFonts(0) AS STRING REDIM SHARED PreviewActualFonts(0) AS STRING REDIM SHARED PreviewControls(0) AS __UI_ControlTYPE REDIM SHARED PreviewParentIDS(0) AS STRING REDIM SHARED PreviewContextMenu(0) AS STRING REDIM SHARED PreviewBoundTo(0) AS STRING REDIM SHARED PreviewBoundProperty(0) AS STRING REDIM SHARED PreviewKeyCombos(0) AS STRING REDIM SHARED PreviewAnimatedGif(0) AS _BYTE REDIM SHARED PreviewAutoPlayGif(0) AS _BYTE REDIM SHARED zOrderIDs(0) AS LONG REDIM SHARED InputBox(1 TO 100) AS newInputBox REDIM SHARED Toggles(1 TO 100) AS LONG REDIM SHARED InputBoxText(1 TO 100) AS STRING DIM SHARED PreviewDefaultButtonID AS LONG DIM SHARED HasFontList AS _BYTE, ShowFontList AS _BYTE DIM SHARED AttemptToShowFontList AS _BYTE, BypassShowFontList AS _BYTE DIM SHARED TotalFontsFound AS LONG REDIM SHARED FontFile(0) AS STRING CONST QB64_DISPLAY = "QB64-PE" DIM SHARED AS STRING QB64_EXE_PATH $IF WIN THEN CONST PathSep$ = "\" CONST QB64_EXE_NAME = "qb64pe.exe" $ELSE CONST PathSep$ = "/" CONST QB64_EXE_NAME = "qb64pe" $END IF UiEditorTitle$ = "InForm Designer" QB64_EXE_PATH = ReadSetting("InForm/InForm.ini", "InForm Settings", "QB64PE path") ' read the compiler path name from the INI IF NOT _FILEEXISTS(QB64_EXE_PATH) THEN ' if the compiler is missing then look for it in obvious places IF _FILEEXISTS("." + PathSep$ + QB64_EXE_NAME) THEN QB64_EXE_PATH = "." + PathSep$ + QB64_EXE_NAME ELSEIF _FILEEXISTS(".." + PathSep$ + QB64_EXE_NAME) THEN QB64_EXE_PATH = ".." + PathSep$ + QB64_EXE_NAME ELSEIF _FILEEXISTS(".." + PathSep$ + "QB64pe" + PathSep$ + QB64_EXE_NAME) THEN QB64_EXE_PATH = ".." + PathSep$ + "QB64pe" + PathSep$ + QB64_EXE_NAME ELSEIF _FILEEXISTS(".." + PathSep$ + "qb64pe" + PathSep$ + QB64_EXE_NAME) THEN QB64_EXE_PATH = ".." + PathSep$ + "qb64pe" + PathSep$ + QB64_EXE_NAME ELSE QB64_EXE_PATH = _SELECTFOLDERDIALOG$("Select QB64-PE directory:") IF _FILEEXISTS(QB64_EXE_PATH + PathSep$ + QB64_EXE_NAME) THEN QB64_EXE_PATH = QB64_EXE_PATH + PathSep$ + QB64_EXE_NAME ELSE _MESSAGEBOX UiEditorTitle$, QB64_DISPLAY + " executable not found.", "error" SYSTEM 1 END IF WriteSetting "InForm/InForm.ini", "InForm Settings", "QB64PE path", QB64_EXE_PATH ' save the complete path name to the INI END IF END IF DIM SHARED CurrentPath$, ThisFileName$ CONST EDITOR_IMAGE_COMMONCONTROLS~%% = 1~%% CONST EDITOR_IMAGE_DISK~%% = 2~%% 'CheckPreviewTimer = _FREETIMER 'ON TIMER(CheckPreviewTimer, .003) CheckPreview $IF WIN THEN DECLARE DYNAMIC LIBRARY "kernel32" FUNCTION OpenProcess& (BYVAL dwDesiredAccess AS LONG, BYVAL bInheritHandle AS LONG, BYVAL dwProcessId AS LONG) FUNCTION CloseHandle& (BYVAL hObject AS LONG) FUNCTION GetExitCodeProcess& (BYVAL hProcess AS LONG, lpExitCode AS LONG) END DECLARE DECLARE DYNAMIC LIBRARY "user32" FUNCTION SetForegroundWindow& (BYVAL hWnd AS LONG) END DECLARE ''Registry routines taken from the Wiki: http://www.qb64.org/wiki/Windows_Libraries#Registered_Fonts ''Code courtesy of Michael Calkins ''winreg.h CONST HKEY_CLASSES_ROOT = &H80000000~& CONST HKEY_CURRENT_USER = &H80000001~& CONST HKEY_LOCAL_MACHINE = &H80000002~& CONST HKEY_USERS = &H80000003~& CONST HKEY_PERFORMANCE_DATA = &H80000004~& CONST HKEY_CURRENT_CONFIG = &H80000005~& CONST HKEY_DYN_DATA = &H80000006~& CONST REG_OPTION_VOLATILE = 1 CONST REG_OPTION_NON_VOLATILE = 0 CONST REG_CREATED_NEW_KEY = 1 CONST REG_OPENED_EXISTING_KEY = 2 ''http://msdn.microsoft.com/en-us/library/ms724884(v=VS.85).aspx CONST REG_NONE = 0 CONST REG_SZ = 1 CONST REG_EXPAND_SZ = 2 CONST REG_BINARY = 3 CONST REG_DWORD_LITTLE_ENDIAN = 4 CONST REG_DWORD = 4 CONST REG_DWORD_BIG_ENDIAN = 5 CONST REG_LINK = 6 CONST REG_MULTI_SZ = 7 CONST REG_RESOURCE_LIST = 8 CONST REG_FULL_RESOURCE_DESCRIPTOR = 9 CONST REG_RESOURCE_REQUIREMENTS_LIST = 10 CONST REG_QWORD_LITTLE_ENDIAN = 11 CONST REG_QWORD = 11 CONST REG_NOTIFY_CHANGE_NAME = 1 CONST REG_NOTIFY_CHANGE_ATTRIBUTES = 2 CONST REG_NOTIFY_CHANGE_LAST_SET = 4 CONST REG_NOTIFY_CHANGE_SECURITY = 8 ''http://msdn.microsoft.com/en-us/library/ms724878(v=VS.85).aspx CONST KEY_ALL_ACCESS = &HF003F& CONST KEY_CREATE_LINK = &H0020& CONST KEY_CREATE_SUB_KEY = &H0004& CONST KEY_ENUMERATE_SUB_KEYS = &H0008& CONST KEY_EXECUTE = &H20019& CONST KEY_NOTIFY = &H0010& CONST KEY_QUERY_VALUE = &H0001& CONST KEY_READ = &H20019& CONST KEY_SET_VALUE = &H0002& CONST KEY_WOW64_32KEY = &H0200& CONST KEY_WOW64_64KEY = &H0100& CONST KEY_WRITE = &H20006& ''winerror.h ''http://msdn.microsoft.com/en-us/library/ms681382(v=VS.85).aspx CONST ERROR_SUCCESS = 0 CONST ERROR_FILE_NOT_FOUND = &H2& CONST ERROR_INVALID_HANDLE = &H6& CONST ERROR_MORE_DATA = &HEA& CONST ERROR_NO_MORE_ITEMS = &H103& DECLARE DYNAMIC LIBRARY "advapi32" FUNCTION RegOpenKeyExA& (BYVAL hKey AS _OFFSET, BYVAL lpSubKey AS _OFFSET, BYVAL ulOptions AS _UNSIGNED LONG, BYVAL samDesired AS _UNSIGNED LONG, BYVAL phkResult AS _OFFSET) FUNCTION RegCloseKey& (BYVAL hKey AS _OFFSET) FUNCTION RegEnumValueA& (BYVAL hKey AS _OFFSET, BYVAL dwIndex AS _UNSIGNED LONG, BYVAL lpValueName AS _OFFSET, BYVAL lpcchValueName AS _OFFSET, BYVAL lpReserved AS _OFFSET, BYVAL lpType AS _OFFSET, BYVAL lpData AS _OFFSET, BYVAL lpcbData AS _OFFSET) END DECLARE $ELSE DECLARE LIBRARY FUNCTION PROCESS_CLOSED& ALIAS kill (BYVAL pid AS INTEGER, BYVAL signal AS INTEGER) END DECLARE $END IF ' This will enable the version info strings in InFormVersion.bi $LET UIEDITOR_BAS = TRUE '$INCLUDE:'extensions/Ini.bi' '$INCLUDE:'InForm.bi' '$INCLUDE:'UiEditor.frm' '$INCLUDE:'InForm.ui' '$INCLUDE:'extensions/Ini.bas' 'Event procedures: --------------------------------------------------------------- SUB __UI_Click (id AS LONG) DIM Answer AS _BYTE, Dummy AS LONG, b$ STATIC LastClick#, LastClickedID AS LONG SendSignal -8 SELECT EVERYCASE id CASE AlignMenuAlignLeft: Dummy = 201 CASE AlignMenuAlignRight: Dummy = 202 CASE AlignMenuAlignTops: Dummy = 203 CASE AlignMenuAlignBottoms: Dummy = 204 CASE AlignMenuAlignCentersV: Dummy = 205 CASE AlignMenuAlignCentersH: Dummy = 206 CASE AlignMenuAlignCenterV: Dummy = 207 CASE AlignMenuAlignCenterH: Dummy = 208 CASE AlignMenuDistributeV: Dummy = 209 CASE AlignMenuDistributeH: Dummy = 210 CASE AlignMenuAlignLeft, AlignMenuAlignRight, AlignMenuAlignTops, AlignMenuAlignBottoms, AlignMenuAlignCentersV, AlignMenuAlignCentersH, AlignMenuAlignCenterV, AlignMenuAlignCenterH, AlignMenuDistributeV, AlignMenuDistributeH b$ = MKI$(0) SendData b$, Dummy CASE OptionsMenuAutoName AutoNameControls = NOT AutoNameControls Control(id).Value = AutoNameControls SaveSettings CASE EditMenuConvertType b$ = MKI$(0) SendData b$, 225 CASE EditMenuSetDefaultButton SendSignal -6 CASE EditMenuRestoreDimensions SendSignal -7 CASE OptionsMenuSwapButtons __UI_MouseButtonsSwap = NOT __UI_MouseButtonsSwap Control(id).Value = __UI_MouseButtonsSwap SaveSettings CASE OptionsMenuSnapLines __UI_SnapLines = NOT __UI_SnapLines Control(id).Value = __UI_SnapLines SaveSettings CASE InsertMenuMenuBar b$ = "NEWCONTROL>" + MKI$(__UI_Type_MenuBar) + "" Send Client, b$ CASE InsertMenuMenuItem b$ = "NEWCONTROL>" + MKI$(__UI_Type_MenuItem) + "" Send Client, b$ CASE InsertMenuContextMenu b$ = "NEWCONTROL>" + MKI$(__UI_Type_ContextMenu) + "" Send Client, b$ CASE ViewMenuPreviewDetach PreviewAttached = NOT PreviewAttached Control(id).Value = PreviewAttached SaveSettings CASE AddButton: Dummy = __UI_Type_Button CASE AddLabel: Dummy = __UI_Type_Label CASE AddTextBox: Dummy = __UI_Type_TextBox CASE AddCheckBox: Dummy = __UI_Type_CheckBox CASE AddRadioButton: Dummy = __UI_Type_RadioButton CASE AddListBox: Dummy = __UI_Type_ListBox CASE AddDropdownList: Dummy = __UI_Type_DropdownList CASE AddTrackBar: Dummy = __UI_Type_TrackBar CASE AddProgressBar: Dummy = __UI_Type_ProgressBar CASE AddPictureBox: Dummy = __UI_Type_PictureBox CASE AddFrame: Dummy = __UI_Type_Frame CASE AddToggleSwitch: Dummy = __UI_Type_ToggleSwitch CASE AddButton, AddLabel, AddTextBox, AddCheckBox, AddRadioButton, AddListBox, AddDropdownList, AddTrackBar, AddProgressBar, AddPictureBox, AddFrame, AddToggleSwitch b$ = "NEWCONTROL>" + MKI$(Dummy) + "" Send Client, b$ CASE AddNumericBox b$ = MKI$(0) SendData b$, 222 CASE Stretch b$ = MKI$(Control(id).Value) SendData b$, 14 CASE HasBorder b$ = MKI$(Control(id).Value) SendData b$, 15 CASE Transparent b$ = MKI$(Control(Transparent).Value) SendData b$, 28 CASE ShowPercentage b$ = MKI$(Control(id).Value) SendData b$, 16 CASE WordWrap b$ = MKI$(Control(id).Value) SendData b$, 17 'Also: disable autosize IF Control(id).Value THEN b$ = MKI$(0) SendData b$, 39 END IF CASE CanHaveFocus b$ = MKI$(Control(id).Value) SendData b$, 18 CASE ColorPreview _CLIPBOARD$ = ColorPreviewWord$ CASE Disabled b$ = MKI$(Control(id).Value) SendData b$, 19 CASE Hidden b$ = MKI$(Control(id).Value) SendData b$, 20 CASE CenteredWindow b$ = MKI$(Control(id).Value) SendData b$, 21 CASE Resizable b$ = MKI$(Control(id).Value) SendData b$, 29 CASE PasswordMaskCB b$ = MKI$(Control(id).Value) SendData b$, 33 CASE AutoScroll b$ = MKI$(Control(id).Value) SendData b$, 38 CASE AutoSize b$ = MKI$(Control(id).Value) SendData b$, 39 CASE HideTicks b$ = MKI$(Control(id).Value) SendData b$, 42 CASE AutoPlayGif b$ = MKI$(Control(id).Value) SendData b$, 44 CASE AddGifExtensionToggle IF Control(AddGifExtensionToggle).Value = FALSE AND TotalGifLoaded > 0 THEN _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, "Removing the GIF extension will load the existing animations as static frames. Proceed?", "yesno", "question", 0) IF Answer = 0 THEN Control(AddGifExtensionToggle).Value = TRUE ELSE b$ = "PAUSEALLGIF>" + "" Send Client, b$ END IF END IF CASE ViewMenuPreview $IF WIN THEN SHELL _DONTWAIT ".\InForm\UiEditorPreview.exe " + HostPort $ELSE SHELL _DONTWAIT "./InForm/UiEditorPreview " + HostPort $END IF CASE ViewMenuLoadedFonts DIM Temp$ Temp$ = "These fonts are currently in use in your form:" + CHR$(10) FOR Dummy = 1 TO UBOUND(PreviewFonts) IF LEN(PreviewFonts(Dummy)) THEN Temp$ = Temp$ + CHR$(10) Temp$ = Temp$ + PreviewFonts(Dummy) END IF NEXT IF LEN(Temp$) THEN MessageBox Temp$, UiEditorTitle$ + " - Loaded fonts", MsgBox_Information ELSE MessageBox "There are no fonts loaded.", UiEditorTitle$, MsgBox_Exclamation END IF CASE FileMenuNew IF Edited THEN _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, "Save the current form?", "yesnocancel", "question", 1) IF Answer = 0 THEN EXIT SUB ELSEIF Answer = 1 THEN SaveForm FALSE, FALSE END IF END IF __UI_Focus = 0 LastFormData$ = "" ThisFileName$ = "" Stream$ = "" FormDataReceived = FALSE AddGifExtension = FALSE Control(AddGifExtensionToggle).Value = FALSE LoadedWithGifExtension = FALSE Edited = FALSE SendSignal -5 CASE FileMenuSave IF LEN(ThisFileName$) THEN SaveForm TRUE, FALSE ELSE GOTO SaveAs END IF CASE FileMenuSaveAs SaveAs: 'Refresh the file list control's contents DIM TotalFiles% IF CurrentPath$ = "" THEN CurrentPath$ = _STARTDIR$ Text(FileList) = idezfilelist$(CurrentPath$, Control(ShowOnlyFrmbinFilesCB).Value + 1, 1, TotalFiles%) Control(FileList).Max = TotalFiles% Control(FileList).LastVisibleItem = 0 'Reset it so it's recalculated Control(DialogBG).Left = 0: Control(DialogBG).Top = 0 Control(OpenFrame).Left = 18: Control(OpenFrame).Top = 40 Caption(OpenFrame) = "Save as" Control(SaveBT).Hidden = FALSE Control(OpenBT).Hidden = TRUE Control(SaveFrmOnlyCB).Hidden = FALSE Control(ShowOnlyFrmbinFilesCB).Hidden = TRUE Control(SaveFrmOnlyCB).Value = FALSE OpenDialogOpen = TRUE Caption(StatusBar) = "Specify the name under which to save the current form..." __UI_Focus = FileNameTextBox IF LEN(ThisFileName$) THEN Text(FileNameTextBox) = ThisFileName$ ELSE Text(FileNameTextBox) = "" END IF IF LEN(Text(FileNameTextBox)) THEN Control(FileNameTextBox).SelectionStart = 0 Control(FileNameTextBox).Cursor = LEN(Text(FileNameTextBox)) Control(FileNameTextBox).TextIsSelected = TRUE END IF __UI_ForceRedraw = TRUE CASE SaveBT SaveFile: IF OpenDialogOpen THEN DIM FileToOpen$, FreeFileNum AS INTEGER FileToOpen$ = CurrentPath$ + PathSep$ + Text(FileNameTextBox) ThisFileName$ = LTRIM$(RTRIM$(Text(FileNameTextBox))) IF ThisFileName$ = "" THEN EXIT SUB IF UCASE$(RIGHT$(ThisFileName$, 4)) <> ".FRM" THEN ThisFileName$ = ThisFileName$ + ".frm" END IF Control(DialogBG).Left = -600: Control(DialogBG).Top = -600 Control(OpenFrame).Left = -600: Control(OpenFrame).Top = -600 Control(FileList).FirstVisibleLine = 1 Control(FileList).InputViewStart = 1 Control(FileList).Value = 0 Control(FileList).LastVisibleItem = 0 'Reset it so it's recalculated Control(DirList).FirstVisibleLine = 1 Control(DirList).InputViewStart = 1 Control(DirList).Value = 0 Control(DirList).LastVisibleItem = 0 'Reset it so it's recalculated OpenDialogOpen = FALSE Caption(StatusBar) = "Ready." __UI_Focus = 0 SaveForm TRUE, Control(SaveFrmOnlyCB).Value END IF CASE HelpMenuAbout MessageBox "InForm GUI engine for QB64-PE\n\nCopyright (c) 2024 Samuel Gomes - @a740g\nCopyright (c) 2023 George McGinn - gbytes58@gmail.com\nCopyright (c) 2022 Fellippe Heitor - @FellippeHeitor\n\n" + UiEditorTitle$ + " v" + __UI_Version + "\n\nhttps://github.com/a740g/InForm-PE", UiEditorTitle$ + " - About", MsgBox_Information CASE HelpMenuHelp MessageBox "Design a form and export the resulting code to generate an event-driven QB64-PE program.", UiEditorTitle$ + " - What's all this?", MsgBox_Information CASE FileMenuExit IF Edited THEN _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, "Save the current form before leaving?", "yesnocancel", "question", 1) IF Answer = 0 THEN EXIT SUB ELSEIF Answer = 1 THEN SaveForm FALSE, FALSE END IF END IF IF _FILEEXISTS("InForm/UiEditorPreview.frmbin") THEN KILL "InForm/UiEditorPreview.frmbin" SYSTEM CASE EditMenuZOrdering 'Fill the list: Caption(StatusBar) = "Editing z-ordering/tab ordering" DIM j AS LONG, i AS LONG STATIC Moving AS _BYTE REDIM _PRESERVE zOrderIDs(1 TO UBOUND(PreviewControls)) AS LONG ReloadZList: ResetList ControlList FOR i = 1 TO UBOUND(PreviewControls) SELECT CASE PreviewControls(i).Type CASE 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 18 j = j + 1 zOrderIDs(j) = i AddItem ControlList, __UI_Type(PreviewControls(i).Type).Name + RTRIM$(PreviewControls(i).Name) END SELECT NEXT IF Moving THEN RETURN Control(DialogBG).Left = 0: Control(DialogBG).Top = 0 Control(ZOrdering).Left = 18: Control(ZOrdering).Top = 40 __UI_Focus = ControlList ZOrderingDialogOpen = TRUE CASE EditMenuBindControls 'Get controls' names and bound properties DIM CurrentSource$ j = 0 FOR i = 1 TO UBOUND(PreviewControls) IF PreviewControls(i).ControlIsSelected THEN j = j + 1 IF j = 1 THEN Caption(SourceControlNameLB) = RTRIM$(PreviewControls(i).Name) CurrentSource$ = PreviewBoundTo(i) IF LEN(PreviewBoundProperty(i)) = 0 THEN Dummy = SelectItem(SourcePropertyList, "Value") ELSE Dummy = SelectItem(SourcePropertyList, PreviewBoundProperty(i)) END IF END IF IF j = 2 THEN Caption(TargetControlNameLB) = RTRIM$(PreviewControls(i).Name) IF LEN(PreviewBoundProperty(i)) = 0 THEN Dummy = SelectItem(TargetPropertyList, "Value") ELSE Dummy = SelectItem(TargetPropertyList, PreviewBoundProperty(i)) END IF EXIT FOR END IF END IF NEXT IF CurrentSource$ = Caption(TargetControlNameLB) THEN Caption(BindBT) = "Rebind" Caption(CancelBindBT) = "Unbind" ELSE Caption(BindBT) = "Bind" Caption(CancelBindBT) = "Cancel" END IF Caption(StatusBar) = "Defining control bindings" Control(DialogBG).Left = 0: Control(DialogBG).Top = 0 Control(SetControlBinding).Left = 83: Control(SetControlBinding).Top = 169 __UI_Focus = SourcePropertyList SetBindingDialogOpen = TRUE 'CASE SwapBT ' SWAP Caption(SourceControlNameLB), Caption(TargetControlNameLB) ' SWAP Control(SourcePropertyList).Value, Control(TargetPropertyList).Value CASE BindBT Control(DialogBG).Left = -600: Control(DialogBG).Top = -600 Control(SetControlBinding).Left = -600: Control(SetControlBinding).Top = -600 SetBindingDialogOpen = FALSE b$ = "BINDCONTROLS>" b$ = b$ + MKL$(LEN(Caption(SourceControlNameLB))) + Caption(SourceControlNameLB) b$ = b$ + MKL$(LEN(Caption(TargetControlNameLB))) + Caption(TargetControlNameLB) b$ = b$ + MKL$(LEN(GetItem(SourcePropertyList, Control(SourcePropertyList).Value))) b$ = b$ + GetItem(SourcePropertyList, Control(SourcePropertyList).Value) b$ = b$ + MKL$(LEN(GetItem(TargetPropertyList, Control(TargetPropertyList).Value))) b$ = b$ + GetItem(TargetPropertyList, Control(TargetPropertyList).Value) b$ = b$ + "" Send Client, b$ CASE CancelBindBT Control(DialogBG).Left = -600: Control(DialogBG).Top = -600 Control(SetControlBinding).Left = -600: Control(SetControlBinding).Top = -600 SetBindingDialogOpen = FALSE IF Caption(CancelBindBT) = "Unbind" THEN b$ = "UNBINDCONTROLS>" b$ = b$ + Caption(SourceControlNameLB) b$ = b$ + "" Send Client, b$ END IF CASE CloseZOrderingBT Caption(StatusBar) = "Ready." Control(DialogBG).Left = -600: Control(DialogBG).Top = -600 Control(ZOrdering).Left = -600: Control(ZOrdering).Top = -600 __UI_Focus = 0 ZOrderingDialogOpen = FALSE CASE UpBT DIM PrevListValue AS LONG PrevListValue = Control(ControlList).Value b$ = MKL$(zOrderIDs(Control(ControlList).Value)) + MKL$(zOrderIDs(Control(ControlList).Value - 1)) SendData b$, 211 _DELAY .1 Moving = TRUE: GOSUB ReloadZList Moving = FALSE Control(ControlList).Value = PrevListValue - 1 __UI_Focus = ControlList __UI_ValueChanged ControlList CASE DownBT PrevListValue = Control(ControlList).Value b$ = MKL$(zOrderIDs(Control(ControlList).Value)) + MKL$(zOrderIDs(Control(ControlList).Value + 1)) SendData b$, 212 _DELAY .1 Moving = TRUE: GOSUB ReloadZList Moving = FALSE Control(ControlList).Value = PrevListValue + 1 __UI_Focus = ControlList __UI_ValueChanged ControlList CASE FileMenuOpen IF Edited THEN _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, "Save the current form?", "yesnocancel", "question", 1) IF Answer = 0 THEN EXIT SUB ELSEIF Answer = 1 THEN SaveForm FALSE, FALSE END IF END IF 'Hide the preview SendSignal -2 'Refresh the file list control's contents IF CurrentPath$ = "" THEN CurrentPath$ = _STARTDIR$ Text(FileList) = idezfilelist$(CurrentPath$, Control(ShowOnlyFrmbinFilesCB).Value + 1, 1, TotalFiles%) Control(FileList).Max = TotalFiles% Control(FileList).LastVisibleItem = 0 'Reset it so it's recalculated Control(DialogBG).Left = 0: Control(DialogBG).Top = 0 Control(OpenFrame).Left = 18: Control(OpenFrame).Top = 40 Caption(OpenFrame) = "Open" Control(SaveBT).Hidden = TRUE Control(OpenBT).Hidden = FALSE Control(SaveFrmOnlyCB).Hidden = TRUE Control(ShowOnlyFrmbinFilesCB).Hidden = FALSE OpenDialogOpen = TRUE Caption(StatusBar) = "Select a form file to load..." __UI_Focus = FileNameTextBox IF LEN(Text(FileNameTextBox)) > 0 THEN Control(FileNameTextBox).SelectionStart = 0 Control(FileNameTextBox).Cursor = LEN(Text(FileNameTextBox)) Control(FileNameTextBox).TextIsSelected = TRUE END IF __UI_ForceRedraw = TRUE CASE CancelBT Text(FileNameTextBox) = "" Control(DialogBG).Left = -600: Control(DialogBG).Top = -600 Control(OpenFrame).Left = -600: Control(OpenFrame).Top = -600 OpenDialogOpen = FALSE Caption(StatusBar) = "Ready." 'Show the preview SendSignal -3 __UI_Focus = 0 __UI_ForceRedraw = TRUE CASE FileMenuRecent1, FileMenuRecent2, FileMenuRecent3, FileMenuRecent4, FileMenuRecent5, FileMenuRecent6, FileMenuRecent7, FileMenuRecent8, FileMenuRecent9 DIM RecentToOpen$ RecentToOpen$ = ToolTip(id) IF _FILEEXISTS(RecentToOpen$) THEN IF INSTR(RecentToOpen$, "/") > 0 OR INSTR(RecentToOpen$, "\") > 0 THEN FOR i = LEN(RecentToOpen$) TO 1 STEP -1 IF ASC(RecentToOpen$, i) = 92 OR ASC(RecentToOpen$, i) = 47 THEN CurrentPath$ = LEFT$(RecentToOpen$, i - 1) RecentToOpen$ = MID$(RecentToOpen$, i + 1) EXIT FOR END IF NEXT END IF IF Edited THEN _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, "Save the current form?", "yesnocancel", "question", 1) IF Answer = 0 THEN EXIT SUB ELSEIF Answer = 1 THEN SaveForm FALSE, FALSE END IF END IF Text(FileNameTextBox) = RecentToOpen$ OpenDialogOpen = TRUE __UI_Click OpenBT ELSE MessageBox "File not found.", UiEditorTitle$, MsgBox_Critical RemoveFromRecentList RecentToOpen$ END IF CASE OpenBT OpenFile: IF OpenDialogOpen THEN FileToOpen$ = CurrentPath$ + PathSep$ + Text(FileNameTextBox) IF _FILEEXISTS(FileToOpen$) THEN LoadedWithGifExtension = FALSE IF _FILEEXISTS(LEFT$(FileToOpen$, LEN(FileToOpen$) - 4) + ".bas") THEN FreeFileNum = FREEFILE OPEN LEFT$(FileToOpen$, LEN(FileToOpen$) - 4) + ".bas" FOR BINARY AS #FreeFileNum b$ = SPACE$(LOF(FreeFileNum)) GET #FreeFileNum, 1, b$ CLOSE #FreeFileNum IF INSTR(b$, CHR$(10) + "'$INCLUDE:'InForm/extensions/GIFPlay.bas'") > 0 THEN LoadedWithGifExtension = TRUE END IF END IF AddToRecentList FileToOpen$ ThisFileName$ = Text(FileNameTextBox) 'Send open command IF LoadedWithGifExtension = FALSE THEN LoadedWithGifExtension = 1 'Set to 1 to check whether a loaded file already had the gif extension Control(AddGifExtensionToggle).Value = FALSE ELSE Control(AddGifExtensionToggle).Value = TRUE END IF AddGifExtension = FALSE b$ = "OPENFILE>" + FileToOpen$ + "" Send Client, b$ SendSignal -4 Control(DialogBG).Left = -600: Control(DialogBG).Top = -600 Control(OpenFrame).Left = -600: Control(OpenFrame).Top = -600 Control(FileList).FirstVisibleLine = 1 Control(FileList).InputViewStart = 1 Control(FileList).Value = 0 Control(FileList).LastVisibleItem = 0 'Reset it so it's recalculated Control(DirList).FirstVisibleLine = 1 Control(DirList).InputViewStart = 1 Control(DirList).Value = 0 Control(DirList).LastVisibleItem = 0 'Reset it so it's recalculated OpenDialogOpen = FALSE Caption(StatusBar) = "Ready." __UI_Focus = 0 Edited = FALSE LastFormData$ = "" Stream$ = "" FormDataReceived = FALSE InitialControlSet = "" ELSE MessageBox "File not found.", UiEditorTitle$, MsgBox_Critical Control(FileList).Value = 0 END IF END IF CASE FileList Text(FileNameTextBox) = GetItem(FileList, Control(FileList).Value) Control(DirList).Value = 0 IF Control(FileList).HoveringVScrollbarButton = 0 AND LastClickedID = id AND TIMER - LastClick# < .3 THEN 'Double click IF LEN(Text(FileNameTextBox)) > 0 THEN IF Caption(OpenFrame) = "Open" THEN GOTO OpenFile ELSE GOTO SaveFile END IF END IF END IF CASE DirList Text(FileNameTextBox) = GetItem(DirList, Control(DirList).Value) Control(FileList).Value = 0 IF LastClickedID = id AND TIMER - LastClick# < .3 THEN 'Double click CurrentPath$ = idezchangepath(CurrentPath$, Text(FileNameTextBox)) Caption(PathLB) = "Path: " + CurrentPath$ Text(DirList) = idezpathlist$(CurrentPath$, TotalFiles%) Control(DirList).Max = TotalFiles% Control(DirList).LastVisibleItem = 0 'Reset it so it's recalculated Control(DirList).Value = 0 GOTO ReloadList END IF CASE ShowOnlyFrmbinFilesCB ReloadList: Text(FileList) = idezfilelist$(CurrentPath$, Control(ShowOnlyFrmbinFilesCB).Value + 1, 1, TotalFiles%) Control(FileList).Max = TotalFiles% Control(FileList).FirstVisibleLine = 1 Control(FileList).InputViewStart = 1 Control(FileList).Value = 0 Control(FileList).LastVisibleItem = 0 'Reset it so it's recalculated CASE EditMenuUndo SendSignal 214 CASE EditMenuRedo SendSignal 215 CASE EditMenuCopy b$ = MKI$(0) SendData b$, 217 CASE EditMenuPaste b$ = MKI$(0) SendData b$, 218 CASE EditMenuCut b$ = MKI$(0) SendData b$, 219 CASE EditMenuDelete b$ = MKI$(0) SendData b$, 220 CASE EditMenuSelectAll b$ = MKI$(0) SendData b$, 221 CASE EditMenuAllowMinMax b$ = MKI$(0) SendData b$, 223 CASE EditMenuCP437 b$ = MKL$(437) SendData b$, 34 'Encoding CASE EditMenuCP1252 b$ = MKL$(1252) SendData b$, 34 'Encoding CASE ViewMenuShowPositionAndSize __UI_ShowPositionAndSize = NOT __UI_ShowPositionAndSize Control(id).Value = __UI_ShowPositionAndSize SaveSettings CASE ViewMenuShowInvisibleControls __UI_ShowInvisibleControls = NOT __UI_ShowInvisibleControls Control(id).Value = __UI_ShowInvisibleControls SaveSettings CASE FontSwitchMenuSwitch, FontLB, FontListLB AttemptToShowFontList = (ShowFontList = FALSE OR BypassShowFontList = TRUE) ShowFontList = NOT ShowFontList IF id <> FontSwitchMenuSwitch THEN __UI_MouseEnter FontLB SaveSettings __UI_ForceRedraw = TRUE CASE PasteListBT DIM Clip$ Clip$ = _CLIPBOARD$ Clip$ = Replace$(Clip$, CHR$(13) + CHR$(10), CHR$(10), 0, 0) Clip$ = Replace$(Clip$, CHR$(10), "\n", 0, 0) IF PreviewControls(FirstSelected).Type = __UI_Type_ListBox OR PreviewControls(FirstSelected).Type = __UI_Type_DropdownList THEN Dummy = TextTB ELSEIF (PreviewControls(FirstSelected).Type = __UI_Type_Label AND PreviewControls(FirstSelected).WordWrap = TRUE) THEN Dummy = CaptionTB END IF Text(Dummy) = Clip$ __UI_Focus = Dummy Control(Dummy).Cursor = LEN(Text(Dummy)) Control(Dummy).TextIsSelected = FALSE CASE KeyboardComboBT __UI_BypassKeyCombos = TRUE Caption(KeyboardComboBT) = CHR$(7) + " hit a key combo... (ESC to clear)" ToolTip(KeyboardComboBT) = "Press a key combination to assign to the selected control" END SELECT LastClickedID = id LastClick# = TIMER IF Caption(StatusBar) = "" THEN Caption(StatusBar) = "Ready." END SUB SUB __UI_MouseEnter (id AS LONG) SELECT CASE id CASE FileMenuNew Caption(StatusBar) = "Creates a new project." CASE FileMenuOpen Caption(StatusBar) = "Loads an existing project from disk." CASE FileMenuExit Caption(StatusBar) = "Exits the editor." CASE FileMenuSave Caption(StatusBar) = "Saves the current project to disk." CASE FileMenuSaveAs Caption(StatusBar) = "Saves a copy of the current project to disk." CASE EditMenuUndo Caption(StatusBar) = "Undoes the last edit." CASE EditMenuRedo Caption(StatusBar) = "Redoes the last undone edit." CASE EditMenuCut Caption(StatusBar) = "Removes the selected controls and copies them to the Clipboard." CASE EditMenuCopy Caption(StatusBar) = "Copies the selected controls to the Clipboard." CASE EditMenuPaste Caption(StatusBar) = "Inserts controls previously cut or copied from the Clipboard." CASE EditMenuDelete Caption(StatusBar) = "Removes the selected controls." CASE EditMenuSelectAll Caption(StatusBar) = "Selects all controls." CASE EditMenuCP437 Caption(StatusBar) = "Applies code page 437 to the current form." CASE EditMenuCP1252 Caption(StatusBar) = "Applies code page 1252 to the current form." CASE EditMenuConvertType Caption(StatusBar) = "Converts this control's type into another similar in functionality." CASE EditMenuSetDefaultButton Caption(StatusBar) = "Makes the currently selected button the default button." CASE EditMenuRestoreDimensions Caption(StatusBar) = "Makes this control have the same dimensions as the loaded image." CASE EditMenuAllowMinMax Caption(StatusBar) = "Enables and validates the .Min and .Max properties for NumericTextBox controls." CASE EditMenuZOrdering Caption(StatusBar) = "Allows you to change tab-order/z-ordering of controls." CASE ViewMenuPreviewDetach Caption(StatusBar) = "Toggles whether the preview form will be moved with the editor." CASE ViewMenuShowPositionAndSize Caption(StatusBar) = "Toggles whether size and position indicators will be shown in the preview." CASE ViewMenuShowInvisibleControls Caption(StatusBar) = "Show or hide invisible controls and binding indicators in the preview dialog." CASE ViewMenuPreview Caption(StatusBar) = "Launches the preview window in case it's been closed accidentaly." CASE ViewMenuLoadedFonts Caption(StatusBar) = "Shows a list of all fonts in use in the current form." CASE InsertMenuMenuBar Caption(StatusBar) = "Inserts a new MenuBar control." CASE InsertMenuMenuItem Caption(StatusBar) = "Inserts a new MenuItem control in the currently selected menu panel." CASE OptionsMenuSnapLines Caption(StatusBar) = "Toggles whether controls edges are automatically snapped to others." CASE OptionsMenuAutoName Caption(StatusBar) = "Automatically sets control names based on caption and type" CASE OptionsMenuSwapButtons Caption(StatusBar) = "Toggles left/right mouse buttons." CASE FontLB, FontListLB Control(FontLB).BackColor = Darken(__UI_DefaultColor(__UI_Type_Form, 2), 90) Control(FontListLB).BackColor = Darken(__UI_DefaultColor(__UI_Type_Form, 2), 90) Caption(FontLB) = "Font (toggle)" Caption(FontListLB) = "Font (toggle)" CASE ELSE IF Control(id).Type = __UI_Type_MenuItem OR Control(id).Type = __UI_Type_MenuBar THEN Caption(StatusBar) = "" END IF END SELECT END SUB SUB __UI_MouseLeave (id AS LONG) SELECT CASE id CASE FontLB, FontListLB Control(FontLB).BackColor = __UI_DefaultColor(__UI_Type_Form, 2) Control(FontListLB).BackColor = __UI_DefaultColor(__UI_Type_Form, 2) Caption(FontLB) = "Font" Caption(FontListLB) = "Font" END SELECT END SUB SUB __UI_FocusIn (id AS LONG) SELECT CASE id CASE NameTB, CaptionTB, TextTB, MaskTB, TopTB, LeftTB, WidthTB, HeightTB, FontTB, TooltipTB, ValueTB, MinTB, MaxTB, IntervalTB, PaddingTB, MinIntervalTB, SizeTB DIM ThisInputBox AS LONG ThisInputBox = GetInputBoxFromID(id) InputBoxText(ThisInputBox) = Text(id) InputBox(ThisInputBox).Sent = FALSE Caption(StatusBar) = "Editing property" CASE FileNameTextBox IF OpenDialogOpen = FALSE THEN __UI_Focus = AddButton CASE ControlList IF OpenDialogOpen THEN __UI_Focus = FileNameTextBox CASE BlueValue IF OpenDialogOpen THEN __UI_Focus = CancelBT CASE CloseZOrderingBT IF ZOrderingDialogOpen = FALSE THEN __UI_Focus = BlueValue CASE AddButton IF ZOrderingDialogOpen THEN __UI_Focus = ControlList CASE CancelBT IF ZOrderingDialogOpen THEN __UI_Focus = CloseZOrderingBT CASE KeyboardComboBT __UI_BypassKeyCombos = TRUE Caption(KeyboardComboBT) = CHR$(7) + " hit a key combo... (ESC to clear)" ToolTip(KeyboardComboBT) = "Press a key combination to assign to the selected control" END SELECT END SUB SUB __UI_FocusOut (id AS LONG) SELECT CASE id CASE NameTB, CaptionTB, TextTB, MaskTB, TopTB, LeftTB, WidthTB, HeightTB, FontTB, TooltipTB, ValueTB, MinTB, MaxTB, IntervalTB, PaddingTB, MinIntervalTB, SizeTB ConfirmEdits id CASE KeyboardComboBT __UI_BypassKeyCombos = FALSE Caption(KeyboardComboBT) = "Click to assign" END SELECT END SUB SUB __UI_MouseDown (id AS LONG) SELECT CASE id CASE Red, Green, Blue Caption(StatusBar) = "Color picker active. Release to apply the new values..." SELECT CASE Control(ColorPropertiesList).Value CASE 1 OldColor = PreviewControls(FirstSelected).ForeColor IF OldColor = 0 THEN OldColor = PreviewControls(PreviewFormID).ForeColor IF OldColor = 0 THEN OldColor = __UI_DefaultColor(__UI_Type_Form, 1) CASE 2 OldColor = PreviewControls(FirstSelected).BackColor IF OldColor = 0 THEN OldColor = PreviewControls(PreviewFormID).BackColor IF OldColor = 0 THEN OldColor = __UI_DefaultColor(__UI_Type_Form, 2) CASE 3 OldColor = PreviewControls(FirstSelected).SelectedForeColor IF OldColor = 0 THEN OldColor = PreviewControls(PreviewFormID).SelectedForeColor IF OldColor = 0 THEN OldColor = __UI_DefaultColor(__UI_Type_Form, 3) CASE 4 OldColor = PreviewControls(FirstSelected).SelectedBackColor IF OldColor = 0 THEN OldColor = PreviewControls(PreviewFormID).SelectedBackColor IF OldColor = 0 THEN OldColor = __UI_DefaultColor(__UI_Type_Form, 4) CASE 5 OldColor = PreviewControls(FirstSelected).BorderColor IF OldColor = 0 THEN OldColor = PreviewControls(PreviewFormID).BorderColor IF OldColor = 0 THEN OldColor = __UI_DefaultColor(__UI_Type_Form, 5) END SELECT END SELECT END SUB SUB __UI_MouseUp (id AS LONG) SELECT CASE id CASE Red, Green, Blue 'Compose a new color and send it to the preview SendNewRGB Caption(StatusBar) = "Color changed." END SELECT END SUB SUB AddToRecentList (FileName$) DIM i AS LONG, j AS LONG, b$ 'Check if this FileName$ is already in the list; if so, delete it. FOR i = 1 TO 9 b$ = ReadSetting("InForm/InForm.ini", "Recent Projects", STR$(i)) IF b$ = FileName$ THEN FOR j = i + 1 TO 9 b$ = ReadSetting("InForm/InForm.ini", "Recent Projects", STR$(j)) WriteSetting "InForm/InForm.ini", "Recent Projects", STR$(j - 1), b$ NEXT EXIT FOR END IF NEXT 'Make room for FileName$ by shifting existing list by one; '1 is the most recent, 9 is the oldest; FOR i = 8 TO 1 STEP -1 b$ = ReadSetting("InForm/InForm.ini", "Recent Projects", STR$(i)) WriteSetting "InForm/InForm.ini", "Recent Projects", STR$(i + 1), b$ NEXT WriteSetting "InForm/InForm.ini", "Recent Projects", "1", FileName$ RecentListBuilt = FALSE END SUB SUB RemoveFromRecentList (FileName$) DIM i AS LONG, j AS LONG, b$ 'Check if this FileName$ is already in the list; if so, delete it. FOR i = 1 TO 9 b$ = ReadSetting("InForm/InForm.ini", "Recent Projects", STR$(i)) IF b$ = FileName$ THEN FOR j = i + 1 TO 9 b$ = ReadSetting("InForm/InForm.ini", "Recent Projects", STR$(j)) WriteSetting "InForm/InForm.ini", "Recent Projects", STR$(j - 1), b$ NEXT WriteSetting "InForm/InForm.ini", "Recent Projects", "9", "" EXIT FOR END IF NEXT RecentListBuilt = FALSE END SUB SUB SendNewRGB DIM b$, NewColor AS _UNSIGNED LONG NewColor = _RGB32(Control(Red).Value, Control(Green).Value, Control(Blue).Value) b$ = _MK$(_UNSIGNED LONG, NewColor) SendData b$, Control(ColorPropertiesList).Value + 22 END SUB FUNCTION PropertyFullySelected%% (id AS LONG) PropertyFullySelected%% = Control(id).TextIsSelected AND _ Control(id).SelectionStart = 0 AND _ Control(id).Cursor = LEN(Text(id)) END FUNCTION SUB SelectPropertyFully (id AS LONG) Control(id).TextIsSelected = TRUE Control(id).SelectionStart = 0 Control(id).Cursor = LEN(Text(id)) END SUB SUB SelectFontInList (FontSetup$) DIM i AS LONG, thisFile$, thisSize% IF FontSetup$ = "" THEN EXIT SUB thisFile$ = UCASE$(LEFT$(FontSetup$, INSTR(FontSetup$, ",") - 1)) thisSize% = VAL(MID$(FontSetup$, INSTR(FontSetup$, ",") + 1)) ResetList FontSizeList FOR i = 8 TO 120 AddItem FontSizeList, LTRIM$(STR$(i)) NEXT i = SelectItem(FontSizeList, LTRIM$(STR$(thisSize%))) IF LEN(thisFile$) > 0 THEN FOR i = 1 TO UBOUND(FontFile) IF UCASE$(RIGHT$(FontFile(i), LEN(thisFile$))) = thisFile$ THEN Control(FontList).Value = i BypassShowFontList = FALSE AttemptToShowFontList = FALSE EXIT SUB END IF NEXT ELSE IF thisSize% > 8 THEN thisSize% = 16 ELSE thisSize% = 8 ResetList FontSizeList AddItem FontSizeList, "8" AddItem FontSizeList, "16" i = SelectItem(FontSizeList, LTRIM$(STR$(thisSize%))) Control(FontList).Value = 1 'Built-in VGA font BypassShowFontList = FALSE AttemptToShowFontList = FALSE EXIT SUB END IF 'If this line is reached, the currently open form 'uses a non-system font. In that case we must 'disable the list. BypassShowFontList = TRUE IF AttemptToShowFontList THEN AttemptToShowFontList = FALSE _DELAY 0.2: i = _MESSAGEBOX(UiEditorTitle$, "The current font isn't a system font.\nReset this control to the built-in font?", "yesno", "question", 1) IF i = 1 THEN thisFile$ = ",16" thisFile$ = MKL$(LEN(thisFile$)) + thisFile$ SendData thisFile$, 8 BypassShowFontList = FALSE ShowFontList = TRUE END IF END IF END SUB SUB LoseFocus IF __UI_TotalActiveMenus > 0 THEN __UI_CloseAllMenus IF __UI_ActiveDropdownList > 0 THEN __UI_DestroyControl Control(__UI_ActiveDropdownList) IF __UI_Focus > 0 THEN __UI_FocusOut __UI_Focus __UI_Focus = 0 __UI_ForceRedraw = TRUE END SUB SUB __UI_BeforeUpdateDisplay DIM b$ DIM i AS LONG, j AS LONG, Answer AS _BYTE DIM incomingData$, Signal$ DIM thisData$, thisCommand$ STATIC OriginalImageWidth AS INTEGER, OriginalImageHeight AS INTEGER STATIC PrevFirstSelected AS LONG, PreviewHasMenuActive AS INTEGER STATIC ThisControlTurnsInto AS INTEGER STATIC LastChange AS SINGLE IF TIMER - BlinkStatusBar < 1 THEN IF TIMER - LastChange > .2 THEN IF Control(StatusBar).BackColor = StatusBarBackColor THEN Control(StatusBar).BackColor = _RGB32(222, 194, 127) ELSE Control(StatusBar).BackColor = StatusBarBackColor END IF Control(StatusBar).Redraw = TRUE LastChange = TIMER END IF ELSE Control(StatusBar).BackColor = StatusBarBackColor Control(StatusBar).Redraw = TRUE END IF IF __UI_BypassKeyCombos THEN 'Blink KeyCombo button IF TIMER - LastChange > .4 THEN IF Control(KeyboardComboBT).ForeColor = __UI_DefaultColor(__UI_Type_Button, 1) THEN Control(KeyboardComboBT).ForeColor = _RGB32(255, 0, 0) ELSE Control(KeyboardComboBT).ForeColor = __UI_DefaultColor(__UI_Type_Button, 1) END IF Control(KeyboardComboBT).Redraw = TRUE LastChange = TIMER END IF ELSE Control(KeyboardComboBT).ForeColor = __UI_DefaultColor(__UI_Type_Button, 1) Control(KeyboardComboBT).Redraw = TRUE END IF IF OpenDialogOpen THEN IF LEN(RTRIM$(LTRIM$(Text(FileNameTextBox)))) = 0 THEN Control(OpenBT).Disabled = TRUE Control(SaveBT).Disabled = TRUE ELSE Control(OpenBT).Disabled = FALSE Control(SaveBT).Disabled = FALSE END IF END IF IF RecentListBuilt = FALSE THEN 'Build list of recent projects RecentListBuilt = TRUE FOR i = 1 TO 9 b$ = ReadSetting("InForm/InForm.ini", "Recent Projects", STR$(i)) IF LEN(b$) THEN ToolTip(RecentMenuItem(i)) = b$ IF INSTR(b$, PathSep$) > 0 THEN FOR j = LEN(b$) TO 1 STEP -1 IF MID$(b$, j, 1) = PathSep$ THEN SetCaption RecentMenuItem(i), "&" + LTRIM$(STR$(i)) + " " + MID$(b$, j + 1) EXIT FOR END IF NEXT ELSE SetCaption RecentMenuItem(i), "&" + LTRIM$(STR$(i)) + " " + b$ END IF Control(RecentMenuItem(i)).Disabled = FALSE Control(RecentMenuItem(i)).Hidden = FALSE ELSE IF i = 1 THEN SetCaption RecentMenuItem(i), "No recent projects" ToolTip(RecentMenuItem(i)) = "" Control(RecentMenuItem(i)).Disabled = TRUE ELSE Control(RecentMenuItem(i)).Hidden = TRUE END IF END IF NEXT END IF IF __UI_Focus = 0 THEN IF Caption(StatusBar) = "" THEN Caption(StatusBar) = "Ready." END IF IF __UI_MouseDownOnID = Red OR __UI_MouseDownOnID = Green OR __UI_MouseDownOnID = Blue OR _ __UI_PreviousMouseDownOnID = Red OR __UI_PreviousMouseDownOnID = Green OR __UI_PreviousMouseDownOnID = Blue THEN SELECT CASE __UI_MouseDownOnID + __UI_PreviousMouseDownOnID CASE Red Text(RedValue) = LTRIM$(STR$(FIX(Control(Red).Value))) CASE Green Text(GreenValue) = LTRIM$(STR$(FIX(Control(Green).Value))) CASE Blue Text(BlueValue) = LTRIM$(STR$(FIX(Control(Blue).Value))) END SELECT 'Compose a new color and preview it DIM NewColor AS _UNSIGNED LONG NewColor = _RGB32(Control(Red).Value, Control(Green).Value, Control(Blue).Value) QuickColorPreview NewColor END IF 'Check if another instance was launched and is passing 'parameters: STATIC BringToFront AS _BYTE, InstanceStream$ IF InstanceClient THEN IF BringToFront = FALSE THEN $IF WIN THEN i = SetForegroundWindow&(_WINDOWHANDLE) $END IF BringToFront = TRUE END IF GET #InstanceClient, , incomingData$ InstanceStream$ = InstanceStream$ + incomingData$ IF INSTR(InstanceStream$, "") THEN IF LEFT$(InstanceStream$, 12) = "NEWINSTANCE>" THEN InstanceStream$ = MID$(InstanceStream$, 13) InstanceStream$ = LEFT$(InstanceStream$, INSTR(InstanceStream$, "") - 1) IF _FILEEXISTS(InstanceStream$) THEN LoadNewInstanceForm: IF INSTR(InstanceStream$, "/") > 0 OR INSTR(InstanceStream$, "\") > 0 THEN FOR i = LEN(InstanceStream$) TO 1 STEP -1 IF ASC(InstanceStream$, i) = 92 OR ASC(InstanceStream$, i) = 47 THEN CurrentPath$ = LEFT$(InstanceStream$, i - 1) InstanceStream$ = MID$(InstanceStream$, i + 1) EXIT FOR END IF NEXT END IF IF Edited THEN _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, "Save the current form?", "yesnocancel", "question", 1) IF Answer = 0 THEN CLOSE InstanceClient InstanceClient = 0 EXIT SUB ELSEIF Answer = 1 THEN SaveForm FALSE, FALSE END IF END IF Text(FileNameTextBox) = InstanceStream$ OpenDialogOpen = TRUE __UI_Click OpenBT END IF END IF CLOSE InstanceClient InstanceClient = 0 END IF ELSE InstanceClient = _OPENCONNECTION(InstanceHost) BringToFront = FALSE InstanceStream$ = "" END IF 'Check if a form file was dropped onto the Editor for loading FOR i = 1 TO _TOTALDROPPEDFILES IF _FILEEXISTS(_DROPPEDFILE(i)) THEN InstanceStream$ = _DROPPEDFILE(i) _FINISHDROP GOTO LoadNewInstanceForm END IF NEXT CheckPreview GET #Client, , incomingData$ Stream$ = Stream$ + incomingData$ 'STATIC bytesIn~&&, refreshes~& 'refreshes~& = refreshes~& + 1 'bytesIn~&& = bytesIn~&& + LEN(incomingData$) 'Caption(StatusBar) = "Received:" + STR$(bytesIn~&&) + " bytes | Sent:" + STR$(totalBytesSent) + " bytes" $IF WIN THEN IF PreviewAttached THEN IF prevScreenX <> _SCREENX OR prevScreenY <> _SCREENY THEN prevScreenX = _SCREENX prevScreenY = _SCREENY b$ = "WINDOWPOSITION>" + MKI$(_SCREENX) + MKI$(_SCREENY) + "" Send Client, b$ END IF ELSE IF prevScreenX <> -32001 OR prevScreenY <> -32001 THEN prevScreenX = -32001 prevScreenY = -32001 b$ = "WINDOWPOSITION>" + MKI$(-32001) + MKI$(-32001) + "" Send Client, b$ END IF END IF $ELSE IF PreviewAttached = True THEN PreviewAttached = False SaveSettings END IF Control(ViewMenuPreviewDetach).Disabled = True Control(ViewMenuPreviewDetach).Value = False $END IF STATIC prevAutoName AS _BYTE, prevMouseSwap AS _BYTE STATIC prevShowPos AS _BYTE, prevSnapLines AS _BYTE STATIC prevShowInvisible AS _BYTE, SignalsFirstSent AS _BYTE IF prevAutoName <> AutoNameControls OR SignalsFirstSent = FALSE THEN prevAutoName = AutoNameControls b$ = "AUTONAME>" + MKI$(AutoNameControls) + "" Send Client, b$ END IF IF prevMouseSwap <> __UI_MouseButtonsSwap OR SignalsFirstSent = FALSE THEN prevMouseSwap = __UI_MouseButtonsSwap b$ = "MOUSESWAP>" + MKI$(__UI_MouseButtonsSwap) + "" Send Client, b$ END IF IF prevShowPos <> __UI_ShowPositionAndSize OR SignalsFirstSent = FALSE THEN prevShowPos = __UI_ShowPositionAndSize b$ = "SHOWPOSSIZE>" + MKI$(__UI_ShowPositionAndSize) + "" Send Client, b$ END IF IF prevShowInvisible <> __UI_ShowInvisibleControls OR SignalsFirstSent = FALSE THEN prevShowInvisible = __UI_ShowInvisibleControls b$ = "SHOWINVISIBLECONTROLS>" + MKI$(__UI_ShowInvisibleControls) + "" Send Client, b$ END IF IF prevSnapLines <> __UI_SnapLines OR SignalsFirstSent = FALSE THEN prevSnapLines = __UI_SnapLines b$ = "SNAPLINES>" + MKI$(__UI_SnapLines) + "" Send Client, b$ END IF SignalsFirstSent = TRUE DO WHILE INSTR(Stream$, "") > 0 thisData$ = LEFT$(Stream$, INSTR(Stream$, "") - 1) Stream$ = MID$(Stream$, INSTR(Stream$, "") + 5) thisCommand$ = LEFT$(thisData$, INSTR(thisData$, ">") - 1) thisData$ = MID$(thisData$, LEN(thisCommand$) + 2) SELECT CASE UCASE$(thisCommand$) CASE "TOTALSELECTEDCONTROLS" TotalSelected = CVL(thisData$) IF SetBindingDialogOpen THEN Caption(CancelBindBT) = "Cancel" __UI_Click CancelBindBT END IF CASE "FORMID" PreviewFormID = CVL(thisData$) CASE "FIRSTSELECTED" FirstSelected = CVL(thisData$) IF SetBindingDialogOpen THEN Caption(CancelBindBT) = "Cancel" __UI_Click CancelBindBT END IF CASE "DEFAULTBUTTONID" PreviewDefaultButtonID = CVL(thisData$) CASE "SHOWINVISIBLECONTROLS" __UI_ShowInvisibleControls = CVI(thisData$) Control(ViewMenuShowInvisibleControls).Value = __UI_ShowInvisibleControls CASE "CONTROLRENAMED" IF LEN(InitialControlSet) THEN DIM insertionPoint AS LONG, endPoint insertionPoint = INSTR(InitialControlSet, CHR$(10) + LEFT$(thisData$, INSTR(thisData$, CHR$(10)))) IF insertionPoint THEN endPoint = INSTR(insertionPoint + 1, InitialControlSet, CHR$(10)) InitialControlSet = LEFT$(InitialControlSet, endPoint - 1) + CHR$(11) + MID$(thisData$, INSTR(thisData$, CHR$(10)) + 1) + MID$(InitialControlSet, endPoint) ELSE 'not found... maybe renamed previously in this session? insertionPoint = INSTR(InitialControlSet, CHR$(11) + LEFT$(thisData$, INSTR(thisData$, CHR$(10)) - 1) + CHR$(10)) IF insertionPoint THEN insertionPoint = INSTR(insertionPoint, InitialControlSet, CHR$(11)) endPoint = INSTR(insertionPoint + 1, InitialControlSet, CHR$(10)) InitialControlSet = LEFT$(InitialControlSet, insertionPoint) + MID$(thisData$, INSTR(thisData$, CHR$(10)) + 1) + MID$(InitialControlSet, endPoint) END IF END IF END IF CASE "SHOWBINDCONTROLDIALOG" __UI_Click EditMenuBindControls CASE "ORIGINALIMAGEWIDTH" OriginalImageWidth = CVI(thisData$) CASE "ORIGINALIMAGEHEIGHT" OriginalImageHeight = CVI(thisData$) CASE "TURNSINTO" ThisControlTurnsInto = CVI(thisData$) CASE "SELECTIONRECTANGLE" PreviewSelectionRectangle = CVI(thisData$) LoseFocus CASE "MENUPANELACTIVE" PreviewHasMenuActive = CVI(thisData$) CASE "SIGNAL" Signal$ = Signal$ + thisData$ CASE "FORMDATA" LastFormData$ = thisData$ LoadPreview IF NOT FormDataReceived THEN FormDataReceived = TRUE ELSE Edited = TRUE IF __UI_Focus > 0 THEN IF PropertySent THEN PropertySent = FALSE ELSE LoseFocus END IF END IF CASE "UNDOPOINTER" UndoPointer = CVI(thisData$) CASE "TOTALUNDOIMAGES" TotalUndoImages = CVI(thisData$) END SELECT LOOP IF NOT FormDataReceived THEN EXIT SUB IF InitialControlSet = "" THEN InitialControlSet = CHR$(1) FOR i = 1 TO UBOUND(PreviewControls) IF PreviewControls(i).ID > 0 AND PreviewControls(i).Type <> __UI_Type_Font AND PreviewControls(i).Type <> __UI_Type_MenuPanel THEN InitialControlSet = InitialControlSet + CHR$(10) + RTRIM$(PreviewControls(i).Name) + CHR$(10) END IF NEXT END IF Control(EditMenuRestoreDimensions).Disabled = TRUE SetCaption EditMenuRestoreDimensions, "Restore &image dimensions" IF TotalSelected = 1 AND PreviewControls(FirstSelected).Type = __UI_Type_PictureBox AND OriginalImageWidth > 0 AND OriginalImageHeight > 0 THEN IF PreviewControls(FirstSelected).Height - (PreviewControls(FirstSelected).BorderSize * ABS(PreviewControls(FirstSelected).HasBorder)) <> OriginalImageHeight OR _ PreviewControls(FirstSelected).Width - (PreviewControls(FirstSelected).BorderSize * ABS(PreviewControls(FirstSelected).HasBorder)) <> OriginalImageWidth THEN Control(EditMenuRestoreDimensions).Disabled = FALSE SetCaption EditMenuRestoreDimensions, "Restore &image dimensions (" + LTRIM$(STR$(OriginalImageWidth)) + "x" + LTRIM$(STR$(OriginalImageHeight)) + ")" END IF END IF IF ThisControlTurnsInto > 0 THEN Control(EditMenuConvertType).Disabled = FALSE SetCaption EditMenuConvertType, "Co&nvert to " + RTRIM$(__UI_Type(ThisControlTurnsInto).Name) ELSEIF ThisControlTurnsInto = -1 THEN 'Offer to turn text to numeric-only TextBox Control(EditMenuConvertType).Disabled = FALSE SetCaption EditMenuConvertType, "Co&nvert to NumericTextBox" ELSEIF ThisControlTurnsInto = -2 THEN 'Offer to turn numeric-only to text TextBox Control(EditMenuConvertType).Disabled = FALSE SetCaption EditMenuConvertType, "Co&nvert to TextBox" ELSE Control(EditMenuConvertType).Disabled = TRUE SetCaption EditMenuConvertType, "Co&nvert type" END IF DO WHILE LEN(Signal$) 'signals -1 and -3 deprecated for now b$ = LEFT$(Signal$, 2) Signal$ = MID$(Signal$, 3) IF CVI(b$) = -2 THEN 'User attempted to right-click a control but the preview 'form is smaller than the menu panel. In such case the "Align" 'menu is shown in the editor. IF ZOrderingDialogOpen THEN __UI_Click CloseZOrderingBT __UI_ActivateMenu Control(AlignMenu), FALSE __UI_ForceRedraw = TRUE ELSEIF CVI(b$) = -4 THEN 'User attempted to load an icon file that couldn't be previewed MessageBox "Icon couldn't be previewed. Make sure it's a valid icon file.", UiEditorTitle$, MsgBox_Exclamation ELSEIF CVI(b$) = -5 THEN 'Context menu was successfully shown on the preview IF __UI_TotalActiveMenus > 0 THEN __UI_CloseAllMenus __UI_Focus = 0 __UI_ForceRedraw = TRUE ELSEIF CVI(b$) = -6 THEN 'User attempted to load an invalid icon file MessageBox "Only .ico files are accepted.", UiEditorTitle$, MsgBox_Exclamation ELSEIF CVI(b$) = -7 THEN 'A new empty form has just been created or a file has just finished loading from disk Edited = FALSE ELSEIF CVI(b$) = -9 THEN 'User attempted to close the preview form __UI_Click FileMenuNew EXIT SUB END IF LOOP IF PrevFirstSelected <> FirstSelected THEN LoseFocus PrevFirstSelected = FirstSelected __UI_ForceRedraw = TRUE IF ZOrderingDialogOpen AND FirstSelected <> PreviewFormID THEN FOR j = 1 TO UBOUND(zOrderIDs) IF zOrderIDs(j) = FirstSelected THEN Control(ControlList).Value = j: __UI_ValueChanged ControlList: EXIT FOR NEXT END IF END IF IF LEN(ThisFileName$) THEN Caption(__UI_FormID) = UiEditorTitle$ + " - " + ThisFileName$ ELSE IF LEN(RTRIM$(__UI_TrimAt0$(PreviewControls(PreviewFormID).Name))) > 0 THEN Caption(__UI_FormID) = UiEditorTitle$ + " - Untitled.frm" END IF END IF IF Edited THEN IF RIGHT$(Caption(__UI_FormID), 1) <> "*" THEN Caption(__UI_FormID) = Caption(__UI_FormID) + "*" END IF 'Ctrl+Z? Ctrl+Y? Control(EditMenuUndo).Disabled = TRUE Control(EditMenuRedo).Disabled = TRUE IF UndoPointer > 0 THEN Control(EditMenuUndo).Disabled = FALSE IF UndoPointer < TotalUndoImages THEN Control(EditMenuRedo).Disabled = FALSE IF (__UI_KeyHit = ASC("z") OR __UI_KeyHit = ASC("Z")) AND __UI_CtrlIsDown THEN SendSignal 214 ELSEIF (__UI_KeyHit = ASC("y") OR __UI_KeyHit = ASC("Y")) AND __UI_CtrlIsDown THEN SendSignal 215 END IF 'Make ZOrdering menu enabled/disabled according to control list Control(EditMenuZOrdering).Disabled = TRUE FOR i = 1 TO UBOUND(PreviewControls) SELECT CASE PreviewControls(i).Type CASE 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 18 j = j + 1 IF j > 1 THEN Control(EditMenuZOrdering).Disabled = FALSE EXIT FOR END IF END SELECT NEXT Control(EditMenuCP1252).Value = FALSE Control(EditMenuCP437).Value = FALSE Control(FontSwitchMenuSwitch).Value = ShowFontList IF BypassShowFontList THEN Control(FontSwitchMenuSwitch).Disabled = TRUE ELSE Control(FontSwitchMenuSwitch).Disabled = FALSE END IF SELECT CASE PreviewControls(PreviewFormID).Encoding CASE 0, 437 Control(EditMenuCP437).Value = TRUE CASE 1252 Control(EditMenuCP1252).Value = TRUE END SELECT IF PreviewHasMenuActive THEN Control(InsertMenuMenuItem).Disabled = FALSE ELSE Control(InsertMenuMenuItem).Disabled = TRUE END IF Control(EditMenuSetDefaultButton).Disabled = TRUE Control(EditMenuSetDefaultButton).Value = FALSE Control(EditMenuBindControls).Disabled = TRUE Control(EditMenuAllowMinMax).Disabled = TRUE Control(EditMenuAllowMinMax).Value = FALSE IF INSTR(LCASE$(PreviewControls(PreviewFormID).Name), "form") = 0 THEN Caption(ControlProperties) = "Control properties (Form):" ELSE Caption(ControlProperties) = "Control properties:" END IF Caption(AlignMenuAlignCenterV) = "Center Vertically (group)" Caption(AlignMenuAlignCenterH) = "Center Horizontally (group)-" Control(EditMenuPaste).Disabled = TRUE IF LEFT$(_CLIPBOARD$, LEN(__UI_ClipboardCheck$)) = __UI_ClipboardCheck$ THEN Control(EditMenuPaste).Disabled = FALSE END IF IF TotalSelected = 0 THEN FirstSelected = PreviewFormID Control(EditMenuCut).Disabled = TRUE Control(EditMenuCopy).Disabled = TRUE Control(EditMenuDelete).Disabled = TRUE Control(AlignMenuAlignLeft).Disabled = TRUE Control(AlignMenuAlignRight).Disabled = TRUE Control(AlignMenuAlignTops).Disabled = TRUE Control(AlignMenuAlignBottoms).Disabled = TRUE Control(AlignMenuAlignCenterV).Disabled = TRUE Control(AlignMenuAlignCenterH).Disabled = TRUE Control(AlignMenuAlignCentersV).Disabled = TRUE Control(AlignMenuAlignCentersH).Disabled = TRUE Control(AlignMenuDistributeV).Disabled = TRUE Control(AlignMenuDistributeH).Disabled = TRUE ELSEIF TotalSelected = 1 THEN IF FirstSelected > 0 AND FirstSelected <= UBOUND(PreviewControls) THEN Control(EditMenuCut).Disabled = FALSE Control(EditMenuCopy).Disabled = FALSE Control(EditMenuDelete).Disabled = FALSE IF INSTR(LCASE$(PreviewControls(FirstSelected).Name), LCASE$(RTRIM$(__UI_Type(PreviewControls(FirstSelected).Type).Name))) = 0 THEN Caption(ControlProperties) = "Control properties (Type = " + RTRIM$(__UI_Type(PreviewControls(FirstSelected).Type).Name) + "):" ELSE Caption(ControlProperties) = "Control properties:" END IF Control(AlignMenuAlignLeft).Disabled = TRUE Control(AlignMenuAlignRight).Disabled = TRUE Control(AlignMenuAlignTops).Disabled = TRUE Control(AlignMenuAlignBottoms).Disabled = TRUE IF PreviewControls(FirstSelected).Type <> __UI_Type_MenuBar AND PreviewControls(FirstSelected).Type <> __UI_Type_MenuItem THEN Control(AlignMenuAlignCenterV).Disabled = FALSE Control(AlignMenuAlignCenterH).Disabled = FALSE Caption(AlignMenuAlignCenterV) = "Center Vertically" Caption(AlignMenuAlignCenterH) = "Center Horizontally-" ELSE Control(AlignMenuAlignCenterV).Disabled = TRUE Control(AlignMenuAlignCenterH).Disabled = TRUE END IF Control(AlignMenuAlignCentersV).Disabled = TRUE Control(AlignMenuAlignCentersH).Disabled = TRUE Control(AlignMenuDistributeV).Disabled = TRUE Control(AlignMenuDistributeH).Disabled = TRUE IF PreviewControls(FirstSelected).Type = __UI_Type_Button THEN Control(EditMenuSetDefaultButton).Disabled = FALSE IF PreviewDefaultButtonID <> FirstSelected THEN Control(EditMenuSetDefaultButton).Value = FALSE ELSE Control(EditMenuSetDefaultButton).Value = TRUE END IF ELSEIF PreviewControls(FirstSelected).Type = __UI_Type_TextBox THEN IF PreviewControls(FirstSelected).NumericOnly = TRUE THEN Control(EditMenuAllowMinMax).Disabled = FALSE Control(EditMenuAllowMinMax).Value = FALSE IF INSTR(PreviewControls(FirstSelected).Name, "NumericTextBox") = 0 THEN Caption(ControlProperties) = "Control properties (Type = NumericTextBox):" ELSEIF PreviewControls(FirstSelected).NumericOnly = __UI_NumericWithBounds THEN Control(EditMenuAllowMinMax).Disabled = FALSE Control(EditMenuAllowMinMax).Value = TRUE IF INSTR(PreviewControls(FirstSelected).Name, "NumericTextBox") = 0 THEN Caption(ControlProperties) = "Control properties (Type = NumericTextBox):" END IF END IF END IF ELSEIF TotalSelected = 2 THEN Control(EditMenuBindControls).Disabled = FALSE Caption(ControlProperties) = "Control properties: (multiple selection)" Control(EditMenuCut).Disabled = FALSE Control(EditMenuCopy).Disabled = FALSE Control(EditMenuDelete).Disabled = FALSE Control(AlignMenuAlignLeft).Disabled = FALSE Control(AlignMenuAlignRight).Disabled = FALSE Control(AlignMenuAlignTops).Disabled = FALSE Control(AlignMenuAlignBottoms).Disabled = FALSE Control(AlignMenuAlignCenterV).Disabled = FALSE Control(AlignMenuAlignCenterH).Disabled = FALSE Control(AlignMenuAlignCentersV).Disabled = FALSE Control(AlignMenuAlignCentersH).Disabled = FALSE Control(AlignMenuDistributeV).Disabled = TRUE Control(AlignMenuDistributeH).Disabled = TRUE ELSE SetCaption ControlProperties, "Control properties: (multiple selection)" Control(EditMenuCut).Disabled = FALSE Control(EditMenuCopy).Disabled = FALSE Control(EditMenuDelete).Disabled = FALSE Control(AlignMenuAlignLeft).Disabled = FALSE Control(AlignMenuAlignRight).Disabled = FALSE Control(AlignMenuAlignTops).Disabled = FALSE Control(AlignMenuAlignBottoms).Disabled = FALSE Control(AlignMenuAlignCenterV).Disabled = FALSE Control(AlignMenuAlignCenterH).Disabled = FALSE Control(AlignMenuAlignCentersV).Disabled = FALSE Control(AlignMenuAlignCentersH).Disabled = FALSE Control(AlignMenuDistributeV).Disabled = FALSE Control(AlignMenuDistributeH).Disabled = FALSE END IF IF FirstSelected = 0 THEN FirstSelected = PreviewFormID FOR i = 1 TO UBOUND(InputBox) Control(InputBox(i).ID).Disabled = FALSE Control(InputBox(i).ID).Hidden = FALSE Control(InputBox(i).LabelID).Hidden = FALSE IF __UI_Focus = InputBox(i).ID THEN Control(InputBox(i).ID).Height = 22 Control(InputBox(i).ID).BorderColor = _RGB32(0, 0, 0) Control(InputBox(i).ID).BorderSize = 2 ELSE Control(InputBox(i).ID).Height = 23 Control(InputBox(i).ID).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) Control(InputBox(i).ID).BorderSize = 1 END IF NEXT Control(FontSizeList).Hidden = TRUE FOR i = 1 TO UBOUND(Toggles) Control(Toggles(i)).Disabled = TRUE Control(Toggles(i)).Hidden = FALSE NEXT DIM ShadeOfGreen AS _UNSIGNED LONG, ShadeOfRed AS _UNSIGNED LONG ShadeOfGreen = _RGB32(28, 150, 50) ShadeOfRed = _RGB32(233, 44, 0) CONST PropertyUpdateDelay = .1 IF FirstSelected > 0 THEN DIM ThisInputBox AS LONG ThisInputBox = GetInputBoxFromID(__UI_Focus) IF __UI_Focus <> NameTB OR (__UI_Focus = NameTB AND RevertEdit = TRUE) THEN Text(NameTB) = RTRIM$(PreviewControls(FirstSelected).Name) IF (__UI_Focus = NameTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = NameTB THEN IF PropertyFullySelected(NameTB) THEN IF Text(NameTB) = RTRIM$(PreviewControls(FirstSelected).Name) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> CaptionTB OR (__UI_Focus = CaptionTB AND RevertEdit = TRUE) THEN Text(CaptionTB) = Replace(__UI_TrimAt0$(PreviewCaptions(FirstSelected)), CHR$(10), "\n", FALSE, 0) IF (__UI_Focus = CaptionTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = CaptionTB THEN IF PropertyFullySelected(CaptionTB) THEN IF Text(CaptionTB) = Replace(__UI_TrimAt0$(PreviewCaptions(FirstSelected)), CHR$(10), "\n", FALSE, 0) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> TextTB OR (__UI_Focus = TextTB AND RevertEdit = TRUE) THEN IF PreviewControls(FirstSelected).Type = __UI_Type_ListBox OR PreviewControls(FirstSelected).Type = __UI_Type_DropdownList THEN Text(TextTB) = Replace(PreviewTexts(FirstSelected), CHR$(10), "\n", FALSE, 0) ELSE Text(TextTB) = PreviewTexts(FirstSelected) IF LEN(PreviewMasks(FirstSelected)) > 0 AND PreviewControls(FirstSelected).Type = __UI_Type_TextBox THEN Mask(TextTB) = PreviewMasks(FirstSelected) ELSE Mask(TextTB) = "" END IF END IF IF (__UI_Focus = TextTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = TextTB THEN Control(TextTB).NumericOnly = PreviewControls(FirstSelected).NumericOnly IF PropertyFullySelected(TextTB) THEN IF ((PreviewControls(FirstSelected).Type = __UI_Type_ListBox OR PreviewControls(FirstSelected).Type = __UI_Type_DropdownList) AND Text(TextTB) = Replace(PreviewTexts(FirstSelected), CHR$(13), "\n", False, 0)) OR _ ((PreviewControls(FirstSelected).Type <> __UI_Type_ListBox AND PreviewControls(FirstSelected).Type <> __UI_Type_DropdownList) AND Text(TextTB) = PreviewTexts(FirstSelected)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> MaskTB OR (__UI_Focus = MaskTB AND RevertEdit = TRUE) THEN Text(MaskTB) = PreviewMasks(FirstSelected) IF (__UI_Focus = MaskTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = MaskTB THEN IF PropertyFullySelected(MaskTB) THEN IF Text(MaskTB) = PreviewMasks(FirstSelected) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> TopTB OR (__UI_Focus = TopTB AND RevertEdit = TRUE) THEN Text(TopTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Top)) IF (__UI_Focus = TopTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = TopTB THEN IF PropertyFullySelected(TopTB) THEN IF Text(TopTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Top)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> LeftTB OR (__UI_Focus = LeftTB AND RevertEdit = TRUE) THEN Text(LeftTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Left)) IF (__UI_Focus = LeftTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = LeftTB THEN IF PropertyFullySelected(LeftTB) THEN IF Text(LeftTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Left)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> WidthTB OR (__UI_Focus = WidthTB AND RevertEdit = TRUE) THEN Text(WidthTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Width)) IF (__UI_Focus = WidthTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = WidthTB THEN IF PropertyFullySelected(WidthTB) THEN IF Text(WidthTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Width)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> HeightTB OR (__UI_Focus = HeightTB AND RevertEdit = TRUE) THEN Text(HeightTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Height)) IF (__UI_Focus = HeightTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = HeightTB THEN IF PropertyFullySelected(HeightTB) THEN IF Text(HeightTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Height)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> FontTB OR (__UI_Focus = FontTB AND RevertEdit = TRUE) THEN IF LEN(PreviewFonts(FirstSelected)) > 0 THEN Text(FontTB) = PreviewFonts(FirstSelected) ELSE Text(FontTB) = PreviewFonts(PreviewFormID) END IF IF (__UI_Focus = FontTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = FontTB THEN IF PropertyFullySelected(FontTB) THEN IF Text(FontTB) = PreviewFonts(FirstSelected) OR Text(FontTB) = PreviewFonts(PreviewFormID) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF LEN(PreviewFonts(FirstSelected)) > 0 THEN SelectFontInList PreviewActualFonts(FirstSelected) ELSE SelectFontInList PreviewActualFonts(PreviewFormID) END IF IF __UI_Focus <> TooltipTB OR (__UI_Focus = TooltipTB AND RevertEdit = TRUE) THEN Text(TooltipTB) = Replace(PreviewTips(FirstSelected), CHR$(10), "\n", FALSE, 0) IF (__UI_Focus = TooltipTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = TooltipTB THEN IF PropertyFullySelected(FontTB) THEN IF Text(TooltipTB) = Replace(PreviewTips(FirstSelected), CHR$(10), "\n", FALSE, 0) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> ValueTB OR (__UI_Focus = ValueTB AND RevertEdit = TRUE) THEN Text(ValueTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Value)) IF (__UI_Focus = ValueTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = ValueTB THEN IF PropertyFullySelected(ValueTB) THEN IF Text(ValueTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Value)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> MinTB OR (__UI_Focus = MinTB AND RevertEdit = TRUE) THEN Text(MinTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Min)) IF (__UI_Focus = MinTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = MinTB THEN IF PropertyFullySelected(MinTB) THEN IF Text(MinTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Min)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> MaxTB OR (__UI_Focus = MaxTB AND RevertEdit = TRUE) THEN Text(MaxTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Max)) IF (__UI_Focus = MaxTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = MaxTB THEN IF PropertyFullySelected(MaxTB) THEN IF Text(MaxTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Max)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> IntervalTB OR (__UI_Focus = IntervalTB AND RevertEdit = TRUE) THEN Text(IntervalTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Interval)) IF (__UI_Focus = IntervalTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = IntervalTB THEN IF PropertyFullySelected(IntervalTB) THEN IF Text(IntervalTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Interval)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> MinIntervalTB OR (__UI_Focus = MinIntervalTB AND RevertEdit = TRUE) THEN Text(MinIntervalTB) = LTRIM$(STR$(PreviewControls(FirstSelected).MinInterval)) ELSEIF __UI_Focus = MinIntervalTB THEN IF PropertyFullySelected(MinIntervalTB) THEN IF Text(MinIntervalTB) = LTRIM$(STR$(PreviewControls(FirstSelected).MinInterval)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> PaddingTB OR (__UI_Focus = PaddingTB AND RevertEdit = TRUE) THEN Text(PaddingTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Padding)) IF (__UI_Focus = PaddingTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = PaddingTB THEN IF PropertyFullySelected(PaddingTB) THEN IF Text(PaddingTB) = LTRIM$(STR$(PreviewControls(FirstSelected).Padding)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF IF __UI_Focus <> SizeTB OR (__UI_Focus = SizeTB AND RevertEdit = TRUE) THEN Text(SizeTB) = LTRIM$(STR$(PreviewControls(FirstSelected).BorderSize)) IF (__UI_Focus = SizeTB AND RevertEdit = TRUE) THEN RevertEdit = FALSE: SelectPropertyFully __UI_Focus ELSEIF __UI_Focus = SizeTB THEN IF PropertyFullySelected(SizeTB) THEN IF Text(SizeTB) = LTRIM$(STR$(PreviewControls(FirstSelected).BorderSize)) THEN Control(__UI_Focus).BorderColor = ShadeOfGreen ELSE IF TIMER - InputBox(ThisInputBox).LastEdited < PropertyUpdateDelay THEN Control(__UI_Focus).BorderColor = __UI_DefaultColor(__UI_Type_TextBox, 5) ELSE Control(__UI_Focus).BorderColor = ShadeOfRed END IF END IF END IF END IF END IF Control(TextTB).Max = 0 Control(TextTB).Min = 0 IF PreviewControls(FirstSelected).Type = __UI_Type_TextBox AND __UI_Focus = TextTB THEN Control(TextTB).Max = PreviewControls(FirstSelected).Max Control(TextTB).Min = PreviewControls(FirstSelected).Min END IF 'Update checkboxes: Control(Stretch).Value = PreviewControls(FirstSelected).Stretch Control(HasBorder).Value = PreviewControls(FirstSelected).HasBorder Caption(HasBorder) = "Has border" Control(ShowPercentage).Value = PreviewControls(FirstSelected).ShowPercentage Control(WordWrap).Value = PreviewControls(FirstSelected).WordWrap Control(CanHaveFocus).Value = PreviewControls(FirstSelected).CanHaveFocus Control(Disabled).Value = PreviewControls(FirstSelected).Disabled Control(Hidden).Value = PreviewControls(FirstSelected).Hidden Control(CenteredWindow).Value = PreviewControls(FirstSelected).CenteredWindow Control(PasswordMaskCB).Value = PreviewControls(FirstSelected).PasswordField Control(BooleanOptions).Value = ABS(PreviewControls(FirstSelected).Value <> 0) + 1 Control(AlignOptions).Value = PreviewControls(FirstSelected).Align + 1 Control(VAlignOptions).Value = PreviewControls(FirstSelected).VAlign + 1 Control(BulletOptions).Value = PreviewControls(FirstSelected).BulletStyle + 1 Control(Transparent).Value = PreviewControls(FirstSelected).BackStyle Control(Resizable).Value = PreviewControls(FirstSelected).CanResize Control(AutoScroll).Value = PreviewControls(FirstSelected).AutoScroll Control(AutoSize).Value = PreviewControls(FirstSelected).AutoSize Control(HideTicks).Value = (PreviewControls(FirstSelected).Height = __UI_Type(__UI_Type_TrackBar).MinimumHeight) Control(AutoPlayGif).Value = PreviewAutoPlayGif(FirstSelected) IF LEN(PreviewContextMenu(FirstSelected)) THEN DIM ItemFound AS _BYTE ItemFound = SelectItem(ContextMenuControlsList, PreviewContextMenu(FirstSelected)) ELSE Control(ContextMenuControlsList).Value = 1 END IF IF __UI_BypassKeyCombos = FALSE THEN IF TotalSelected = 1 AND LEN(PreviewKeyCombos(FirstSelected)) THEN Caption(KeyboardComboBT) = PreviewKeyCombos(FirstSelected) ELSE Caption(KeyboardComboBT) = "Click to assign" END IF END IF STATIC ShowInvalidValueWarning AS _BYTE IF Control(__UI_Focus).BorderColor = ShadeOfRed THEN IF ShowInvalidValueWarning = FALSE THEN ShowInvalidValueWarning = TRUE Caption(StatusBar) = "Invalid value; ESC for previous or adjusted value" BlinkStatusBar = TIMER END IF ELSE ShowInvalidValueWarning = FALSE END IF 'Disable properties that don't apply Control(AlignOptions).Disabled = TRUE Control(BooleanOptions).Disabled = TRUE Control(VAlignOptions).Disabled = TRUE Control(BulletOptions).Disabled = TRUE Caption(TextLB) = "Text" Caption(ValueLB) = "Value" Caption(MaxLB) = "Max" Control(SizeTB).Disabled = TRUE Control(SizeTB).Hidden = TRUE IF TotalSelected > 0 THEN SELECT EVERYCASE PreviewControls(FirstSelected).Type CASE __UI_Type_ToggleSwitch Control(CanHaveFocus).Disabled = FALSE Control(Disabled).Disabled = FALSE Control(Hidden).Disabled = FALSE Control(CaptionTB).Disabled = TRUE Control(BooleanOptions).Disabled = FALSE Control(TextTB).Disabled = TRUE Control(FontTB).Disabled = TRUE Control(FontList).Disabled = TRUE Control(MinTB).Disabled = TRUE Control(MaxTB).Disabled = TRUE Control(IntervalTB).Disabled = TRUE Control(MinIntervalTB).Disabled = TRUE Control(PaddingTB).Disabled = TRUE Control(BulletOptions).Disabled = TRUE CASE __UI_Type_MenuBar, __UI_Type_MenuItem Control(Disabled).Disabled = FALSE Control(Hidden).Disabled = FALSE CASE __UI_Type_MenuBar 'Check if this is the last menu bar item so that Align options can be enabled FOR i = UBOUND(PreviewControls) TO 1 STEP -1 IF PreviewControls(i).ID > 0 AND PreviewControls(i).Type = __UI_Type_MenuBar THEN EXIT FOR END IF NEXT IF i = FirstSelected THEN Control(AlignOptions).Disabled = FALSE END IF FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE NameTB, CaptionTB, TooltipTB, AlignOptions Control(InputBox(i).ID).Disabled = FALSE CASE ELSE Control(InputBox(i).ID).Disabled = TRUE END SELECT NEXT CASE __UI_Type_ContextMenu FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE NameTB Control(InputBox(i).ID).Disabled = FALSE CASE ELSE Control(InputBox(i).ID).Disabled = TRUE END SELECT NEXT CASE __UI_Type_MenuItem FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE NameTB, CaptionTB, TextTB, TooltipTB, BulletOptions, BooleanOptions, KeyboardComboBT Control(InputBox(i).ID).Disabled = FALSE CASE ELSE Control(InputBox(i).ID).Disabled = TRUE END SELECT NEXT CASE __UI_Type_PictureBox Caption(TextLB) = "Image file" Control(AlignOptions).Disabled = FALSE Control(VAlignOptions).Disabled = FALSE Control(Stretch).Disabled = FALSE Control(Transparent).Disabled = FALSE IF PreviewAnimatedGif(FirstSelected) THEN Control(AutoPlayGif).Disabled = FALSE END IF FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE NameTB, TextTB, TopTB, LeftTB, WidthTB, HeightTB, TooltipTB, AlignOptions, VAlignOptions Control(InputBox(i).ID).Disabled = FALSE CASE ELSE Control(InputBox(i).ID).Disabled = TRUE END SELECT NEXT CASE __UI_Type_Label Control(Transparent).Disabled = FALSE Control(AutoSize).Disabled = FALSE FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE NameTB, CaptionTB, TopTB, LeftTB, WidthTB, HeightTB, FontTB, TooltipTB, PaddingTB, AlignOptions, VAlignOptions, FontList Control(InputBox(i).ID).Disabled = FALSE CASE ELSE Control(InputBox(i).ID).Disabled = TRUE END SELECT NEXT CASE __UI_Type_Frame Control(Transparent).Disabled = TRUE FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE NameTB, CaptionTB, TopTB, LeftTB, WidthTB, HeightTB, FontTB, TooltipTB, FontList Control(InputBox(i).ID).Disabled = FALSE CASE ELSE Control(InputBox(i).ID).Disabled = TRUE END SELECT NEXT CASE __UI_Type_TextBox STATIC PreviousNumericState AS _BYTE Control(Transparent).Disabled = FALSE Control(PasswordMaskCB).Disabled = (PreviewControls(FirstSelected).NumericOnly <> FALSE) IF PreviousNumericState <> PreviewControls(FirstSelected).NumericOnly THEN PreviousNumericState = PreviewControls(FirstSelected).NumericOnly __UI_ForceRedraw = TRUE END IF IF PreviewControls(FirstSelected).NumericOnly = TRUE THEN FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE ValueTB, MinTB, MaxTB, MaskTB, IntervalTB, PaddingTB, AlignOptions, VAlignOptions, MinIntervalTB, BulletOptions, BooleanOptions, KeyboardComboBT Control(InputBox(i).ID).Disabled = TRUE CASE ELSE Control(InputBox(i).ID).Disabled = FALSE END SELECT NEXT ELSEIF PreviewControls(FirstSelected).NumericOnly = __UI_NumericWithBounds THEN FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE ValueTB, MaskTB, IntervalTB, PaddingTB, AlignOptions, VAlignOptions, MinIntervalTB, BulletOptions, BooleanOptions, KeyboardComboBT Control(InputBox(i).ID).Disabled = TRUE CASE ELSE Control(InputBox(i).ID).Disabled = FALSE END SELECT NEXT ELSE Caption(MaxLB) = "Max length" FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE ValueTB, MinTB, IntervalTB, PaddingTB, AlignOptions, VAlignOptions, MinIntervalTB, BulletOptions, BooleanOptions, KeyboardComboBT Control(InputBox(i).ID).Disabled = TRUE CASE ELSE Control(InputBox(i).ID).Disabled = FALSE END SELECT NEXT END IF CASE __UI_Type_Button, __UI_Type_MenuItem Caption(TextLB) = "Image file" CASE __UI_Type_Button FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE ValueTB, MinTB, MaxTB, IntervalTB, PaddingTB, MaskTB, AlignOptions, VAlignOptions, MinIntervalTB, BulletOptions, BooleanOptions Control(InputBox(i).ID).Disabled = TRUE CASE ELSE Control(InputBox(i).ID).Disabled = FALSE END SELECT NEXT CASE __UI_Type_CheckBox, __UI_Type_RadioButton Control(Transparent).Disabled = FALSE FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE TextTB, MinTB, MaxTB, IntervalTB, PaddingTB, MaskTB, AlignOptions, VAlignOptions, MinIntervalTB, BulletOptions, ValueTB Control(InputBox(i).ID).Disabled = TRUE CASE ELSE Control(InputBox(i).ID).Disabled = FALSE END SELECT NEXT CASE __UI_Type_ToggleSwitch Control(Transparent).Disabled = TRUE FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE WidthTB, HeightTB, TextTB, MinTB, MaxTB, IntervalTB, PaddingTB, MaskTB, AlignOptions, VAlignOptions, MinIntervalTB, BulletOptions, ValueTB, FontTB, FontList Control(InputBox(i).ID).Disabled = TRUE CASE ELSE Control(InputBox(i).ID).Disabled = FALSE END SELECT NEXT CASE __UI_Type_ProgressBar FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE TextTB, IntervalTB, PaddingTB, MaskTB, AlignOptions, VAlignOptions, MinIntervalTB, BulletOptions, BooleanOptions, KeyboardComboBT Control(InputBox(i).ID).Disabled = TRUE CASE ELSE Control(InputBox(i).ID).Disabled = FALSE END SELECT NEXT CASE __UI_Type_TrackBar Control(HideTicks).Disabled = FALSE FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE CaptionTB, TextTB, FontTB, PaddingTB, MaskTB, AlignOptions, VAlignOptions, BulletOptions, BooleanOptions, FontList, KeyboardComboBT Control(InputBox(i).ID).Disabled = TRUE CASE ELSE Control(InputBox(i).ID).Disabled = FALSE END SELECT NEXT CASE __UI_Type_ListBox, __UI_Type_DropdownList Caption(TextLB) = "List items" Caption(ValueLB) = "Selected item" Control(Transparent).Disabled = FALSE FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE CaptionTB, MinTB, MaxTB, IntervalTB, PaddingTB, MaskTB, AlignOptions, VAlignOptions, MinIntervalTB, BulletOptions, BooleanOptions, KeyboardComboBT Control(InputBox(i).ID).Disabled = TRUE CASE ELSE Control(InputBox(i).ID).Disabled = FALSE END SELECT NEXT CASE __UI_Type_ListBox Control(AutoScroll).Disabled = FALSE CASE __UI_Type_Frame, __UI_Type_Label, __UI_Type_TextBox, __UI_Type_ListBox, __UI_Type_DropdownList, __UI_Type_PictureBox Control(HasBorder).Disabled = FALSE CASE __UI_Type_ProgressBar Control(ShowPercentage).Disabled = FALSE CASE __UI_Type_Label Control(WordWrap).Disabled = FALSE CASE __UI_Type_Button, __UI_Type_CheckBox, __UI_Type_RadioButton, __UI_Type_TextBox, __UI_Type_ListBox, __UI_Type_DropdownList, __UI_Type_TrackBar Control(CanHaveFocus).Disabled = FALSE CASE __UI_Type_Button, __UI_Type_CheckBox, __UI_Type_RadioButton, __UI_Type_TextBox, __UI_Type_ListBox, __UI_Type_DropdownList, __UI_Type_TrackBar, __UI_Type_Label, __UI_Type_ProgressBar Control(Disabled).Disabled = FALSE CASE __UI_Type_Frame, __UI_Type_Button, __UI_Type_CheckBox, __UI_Type_RadioButton, __UI_Type_TextBox, __UI_Type_ListBox, __UI_Type_DropdownList, __UI_Type_TrackBar, __UI_Type_Label, __UI_Type_ProgressBar, __UI_Type_PictureBox Control(Hidden).Disabled = FALSE CASE __UI_Type_Label Control(AlignOptions).Disabled = FALSE Control(VAlignOptions).Disabled = FALSE END SELECT ELSE 'Properties relative to the form Control(CenteredWindow).Disabled = FALSE Control(Resizable).Disabled = FALSE Control(AddGifExtensionToggle).Disabled = FALSE Caption(TextLB) = "Icon file" FOR i = 1 TO UBOUND(InputBox) SELECT CASE InputBox(i).ID CASE NameTB, CaptionTB, TextTB, WidthTB, HeightTB, FontTB, FontList Control(InputBox(i).ID).Disabled = FALSE CASE ELSE Control(InputBox(i).ID).Disabled = TRUE END SELECT NEXT END IF IF TotalSelected > 1 THEN Control(NameTB).Disabled = TRUE IF HasFontList AND (ShowFontList = TRUE AND BypassShowFontList = FALSE) THEN Control(FontTB).Disabled = TRUE ELSE Control(FontList).Disabled = TRUE END IF IF PreviewControls(FirstSelected).Type = __UI_Type_ContextMenu OR _ PreviewControls(FirstSelected).Type = __UI_Type_MenuBar OR _ PreviewControls(FirstSelected).Type = __UI_Type_MenuItem THEN Control(ContextMenuControlsList).Disabled = TRUE ELSE Control(ContextMenuControlsList).Disabled = FALSE END IF DIM LastTopForInputBox AS INTEGER LastTopForInputBox = -12 CONST TopIncrementForInputBox = 22 FOR i = 1 TO UBOUND(InputBox) 'Exception for SizeTB: IF InputBox(i).ID = SizeTB THEN _CONTINUE IF Control(InputBox(i).ID).Disabled THEN Control(InputBox(i).ID).Hidden = TRUE Control(InputBox(i).LabelID).Hidden = TRUE ELSE LastTopForInputBox = LastTopForInputBox + TopIncrementForInputBox Control(InputBox(i).ID).Top = LastTopForInputBox Control(InputBox(i).LabelID).Top = LastTopForInputBox END IF NEXT LastTopForInputBox = -12 FOR i = 1 TO UBOUND(Toggles) IF Control(Toggles(i)).Disabled THEN Control(Toggles(i)).Hidden = TRUE ELSE LastTopForInputBox = LastTopForInputBox + TopIncrementForInputBox Control(Toggles(i)).Top = LastTopForInputBox END IF NEXT 'Custom cases Control(AutoPlayGif).Disabled = NOT Control(AddGifExtensionToggle).Value Control(AutoSize).Disabled = Control(WordWrap).Value IF Control(HasBorder).Value = TRUE AND PreviewControls(FirstSelected).Type <> __UI_Type_Frame THEN Control(SizeTB).Disabled = FALSE Control(SizeTB).Hidden = FALSE Control(SizeTB).Height = 22 Control(SizeTB).Top = Control(HasBorder).Top Caption(HasBorder) = "Has border Size" END IF Control(FontSizeList).Disabled = Control(FontList).Disabled Control(FontSizeList).Hidden = Control(FontList).Hidden Control(FontSizeList).Top = Control(FontList).Top Control(PasteListBT).Hidden = TRUE IF PreviewControls(FirstSelected).Type = __UI_Type_ListBox OR PreviewControls(FirstSelected).Type = __UI_Type_DropdownList THEN IF INSTR(_CLIPBOARD$, CHR$(10)) THEN Control(PasteListBT).Top = Control(TextTB).Top Control(PasteListBT).Hidden = FALSE END IF ELSEIF (PreviewControls(FirstSelected).Type = __UI_Type_Label AND PreviewControls(FirstSelected).WordWrap = TRUE) THEN IF INSTR(_CLIPBOARD$, CHR$(10)) THEN Control(PasteListBT).Top = Control(CaptionTB).Top Control(PasteListBT).Hidden = FALSE END IF END IF 'Update the color mixer DIM ThisColor AS _UNSIGNED LONG, ThisBackColor AS _UNSIGNED LONG SELECT EVERYCASE Control(ColorPropertiesList).Value CASE 0 Control(ColorPropertiesList).Value = 1 CASE IS > 5 Control(ColorPropertiesList).Value = 5 CASE 1, 2 'ForeColor, BackColor ThisColor = PreviewControls(FirstSelected).ForeColor IF ThisColor = 0 THEN ThisColor = PreviewControls(PreviewFormID).ForeColor IF ThisColor = 0 THEN ThisColor = __UI_DefaultColor(__UI_Type_Form, 1) ThisBackColor = PreviewControls(FirstSelected).BackColor IF ThisBackColor = 0 THEN ThisBackColor = PreviewControls(PreviewFormID).BackColor IF ThisBackColor = 0 THEN ThisBackColor = __UI_DefaultColor(__UI_Type_Form, 2) CASE 3, 4 'SelectedForeColor, SelectedBackColor ThisColor = PreviewControls(FirstSelected).SelectedForeColor IF ThisColor = 0 THEN ThisColor = PreviewControls(PreviewFormID).SelectedForeColor IF ThisColor = 0 THEN ThisColor = __UI_DefaultColor(__UI_Type_Form, 3) ThisBackColor = PreviewControls(FirstSelected).SelectedBackColor IF ThisBackColor = 0 THEN ThisBackColor = PreviewControls(PreviewFormID).SelectedBackColor IF ThisBackColor = 0 THEN ThisBackColor = __UI_DefaultColor(__UI_Type_Form, 4) CASE 5 'BorderColor ThisColor = PreviewControls(FirstSelected).BorderColor IF ThisColor = 0 THEN ThisColor = PreviewControls(PreviewFormID).BorderColor IF ThisColor = 0 THEN ThisColor = __UI_DefaultColor(__UI_Type_Form, 5) ThisBackColor = PreviewControls(FirstSelected).BackColor IF ThisBackColor = 0 THEN ThisBackColor = PreviewControls(PreviewFormID).BackColor IF ThisBackColor = 0 THEN ThisBackColor = __UI_DefaultColor(__UI_Type_Form, 2) CASE 1, 3, 5 IF __UI_Focus <> Red AND __UI_Focus <> RedValue THEN Control(Red).Value = _RED32(ThisColor) Text(RedValue) = LTRIM$(STR$(Control(Red).Value)) END IF IF __UI_Focus <> Green AND __UI_Focus <> GreenValue THEN Control(Green).Value = _GREEN32(ThisColor) Text(GreenValue) = LTRIM$(STR$(Control(Green).Value)) END IF IF __UI_Focus <> Blue AND __UI_Focus <> BlueValue THEN Control(Blue).Value = _BLUE32(ThisColor) Text(BlueValue) = LTRIM$(STR$(Control(Blue).Value)) END IF CASE 2, 4 IF __UI_Focus <> Red AND __UI_Focus <> RedValue THEN Control(Red).Value = _RED32(ThisBackColor) Text(RedValue) = LTRIM$(STR$(Control(Red).Value)) END IF IF __UI_Focus <> Green AND __UI_Focus <> GreenValue THEN Control(Green).Value = _GREEN32(ThisBackColor) Text(GreenValue) = LTRIM$(STR$(Control(Green).Value)) END IF IF __UI_Focus <> Blue AND __UI_Focus <> BlueValue THEN Control(Blue).Value = _BLUE32(ThisBackColor) Text(BlueValue) = LTRIM$(STR$(Control(Blue).Value)) END IF END SELECT IF Control(ColorPreview).HelperCanvas = 0 THEN Control(ColorPreview).HelperCanvas = _NEWIMAGE(Control(ColorPreview).Width, Control(ColorPreview).Height, 32) END IF STATIC PrevPreviewForeColor AS _UNSIGNED LONG, PrevPreviewBackColor AS _UNSIGNED LONG STATIC PrevColorPropertiesListValue AS _BYTE IF PrevPreviewForeColor <> ThisColor OR PrevPreviewBackColor <> ThisBackColor OR PrevColorPropertiesListValue <> Control(ColorPropertiesList).Value THEN PrevPreviewForeColor = ThisColor PrevPreviewBackColor = ThisBackColor PrevColorPropertiesListValue = Control(ColorPropertiesList).Value UpdateColorPreview Control(ColorPropertiesList).Value, ThisColor, ThisBackColor END IF END SUB SUB __UI_BeforeUnload DIM Answer AS _BYTE IF Edited THEN _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, "Save the current form before leaving?", "yesnocancel", "question", 1) IF Answer = 0 THEN __UI_UnloadSignal = FALSE ELSEIF Answer = 1 THEN IF ThisFileName$ = "" THEN ThisFileName$ = "untitled" END IF SaveForm FALSE, FALSE END IF END IF SaveSettings END SUB SUB SaveSettings DIM value$ IF _DIREXISTS("InForm") = 0 THEN EXIT SUB IF PreviewAttached THEN value$ = "True" ELSE value$ = "False" WriteSetting "InForm/InForm.ini", "InForm Settings", "Keep preview window attached", value$ IF AutoNameControls THEN value$ = "True" ELSE value$ = "False" WriteSetting "InForm/InForm.ini", "InForm Settings", "Auto-name controls", value$ IF __UI_SnapLines THEN value$ = "True" ELSE value$ = "False" WriteSetting "InForm/InForm.ini", "InForm Settings", "Snap to edges", value$ IF __UI_ShowPositionAndSize THEN value$ = "True" ELSE value$ = "False" WriteSetting "InForm/InForm.ini", "InForm Settings", "Show position and size", value$ IF __UI_ShowInvisibleControls THEN value$ = "True" ELSE value$ = "False" WriteSetting "InForm/InForm.ini", "InForm Settings", "Show invisible controls", value$ IF ShowFontList THEN value$ = "True" ELSE value$ = "False" WriteSetting "InForm/InForm.ini", "InForm Settings", "Show font list", value$ $IF WIN THEN $ELSE IF __UI_MouseButtonsSwap THEN value$ = "True" ELSE value$ = "False" WriteSetting "InForm/InForm.ini", "InForm Settings", "Swap mouse buttons", value$ $END IF END SUB SUB __UI_BeforeInit __UI_KeepScreenHidden = TRUE __UI_EditorMode = TRUE END SUB SUB __UI_FormResized END SUB SUB Handshake 'Handshake: each module sends the other their PID: DIM b$ Stream$ = "" 'clear buffer b$ = "EDITORPID>" + MKL$(__UI_GetPID) + "" Send Client, b$ $IF WIN THEN CONST TIMEOUT = 10 $ELSE CONST TIMEOUT = 120 $END IF DIM start!, incomingData$, thisData$ start! = TIMER DO incomingData$ = "" GET #Client, , incomingData$ Stream$ = Stream$ + incomingData$ IF INSTR(Stream$, "") THEN thisData$ = LEFT$(Stream$, INSTR(Stream$, "") - 1) Stream$ = MID$(Stream$, LEN(thisData$) + 6) IF LEFT$(thisData$, 11) = "PREVIEWPID>" THEN UiPreviewPID = CVL(MID$(thisData$, 12)) END IF EXIT DO END IF LOOP UNTIL TIMER - start! > TIMEOUT IF UiPreviewPID = 0 THEN MessageBox "UiEditorPreview component not found or failed to load.", UiEditorTitle$, MsgBox_Critical SYSTEM END IF END SUB SUB __UI_OnLoad DIM i AS LONG, b$ DIM prevDest AS LONG b$ = "Starting..." GOSUB ShowMessage 'Load splash image: DIM tempIcon AS LONG tempIcon = _LOADIMAGE("InForm/resources/Application-icon-128.png", 32) GOSUB ShowMessage b$ = "Opening communication port (click 'unblock' if your Operating System asks)..." GOSUB ShowMessage DIM HostAttempts AS INTEGER DO HostAttempts = HostAttempts + 1 InstanceHost = _OPENHOST("TCP/IP:60680") '60680 = #ED08, as the functionality was implemented in Beta 8 of the EDitor ;-) LOOP UNTIL InstanceHost <> 0 OR HostAttempts > 1000 IF InstanceHost = 0 THEN 'There is probably another instance of InForm Designer running. '(i) attempt to communicate and pass parameters and '(ii) bring it to the front. HostAttempts = 0 DO HostAttempts = HostAttempts + 1 Host = _OPENCLIENT("TCP/IP:60680:localhost") LOOP UNTIL Host <> 0 OR HostAttempts > 1000 IF Host THEN b$ = "NEWINSTANCE>" + COMMAND$ + "" Send Host, b$ _DELAY 1 CLOSE Host END IF SYSTEM END IF _SCREENSHOW _ICON RANDOMIZE TIMER HostAttempts = 0 DO HostAttempts = HostAttempts + 1 HostPort = LTRIM$(STR$(INT(RND * 5000 + 60000))) Host = _OPENHOST("TCP/IP:" + HostPort) LOOP UNTIL Host <> 0 OR HostAttempts > 1000 IF Host = 0 THEN MessageBox "Unable to open communication port.", UiEditorTitle$, MsgBox_Critical SYSTEM END IF PreviewAttached = TRUE AutoNameControls = TRUE __UI_ShowPositionAndSize = TRUE __UI_ShowInvisibleControls = TRUE __UI_SnapLines = TRUE i = RegisterKeyCombo("ctrl+n", FileMenuNew) i = RegisterKeyCombo("ctrl+o", FileMenuOpen) i = RegisterKeyCombo("ctrl+s", FileMenuSave) i = RegisterKeyCombo("ctrl+z", EditMenuUndo) i = RegisterKeyCombo("ctrl+y", EditMenuRedo) i = RegisterKeyCombo("f1", HelpMenuHelp) DIM FileToOpen$, FreeFileNum AS INTEGER b$ = "Reading settings..." GOSUB ShowMessage IF _DIREXISTS("InForm") = 0 THEN MKDIR "InForm" DIM value$ value$ = ReadSetting("InForm/InForm.ini", "InForm Settings", "Keep preview window attached") IF LEN(value$) THEN PreviewAttached = (value$ = "True") ELSE WriteSetting "InForm/InForm.ini", "InForm Settings", "Keep preview window attached", "True" PreviewAttached = TRUE END IF value$ = ReadSetting("InForm/InForm.ini", "InForm Settings", "Auto-name controls") IF LEN(value$) THEN AutoNameControls = (value$ = "True") ELSE WriteSetting "InForm/InForm.ini", "InForm Settings", "Auto-name controls", "True" AutoNameControls = TRUE END IF value$ = ReadSetting("InForm/InForm.ini", "InForm Settings", "Snap to edges") IF LEN(value$) THEN __UI_SnapLines = (value$ = "True") ELSE WriteSetting "InForm/InForm.ini", "InForm Settings", "Snap to edges", "True" __UI_SnapLines = TRUE END IF value$ = ReadSetting("InForm/InForm.ini", "InForm Settings", "Show position and size") IF LEN(value$) THEN __UI_ShowPositionAndSize = (value$ = "True") ELSE WriteSetting "InForm/InForm.ini", "InForm Settings", "Show position and size", "True" __UI_ShowPositionAndSize = TRUE END IF value$ = ReadSetting("InForm/InForm.ini", "InForm Settings", "Show invisible controls") IF LEN(value$) THEN __UI_ShowInvisibleControls = (value$ = "True") ELSE WriteSetting "InForm/InForm.ini", "InForm Settings", "Show invisible controls", "True" __UI_ShowInvisibleControls = TRUE END IF value$ = ReadSetting("InForm/InForm.ini", "InForm Settings", "Show font list") IF LEN(value$) THEN ShowFontList = (value$ = "True") ELSE WriteSetting "InForm/InForm.ini", "InForm Settings", "Show font list", "True" ShowFontList = TRUE END IF $IF WIN THEN $ELSE value$ = ReadSetting("InForm/InForm.ini", "InForm Settings", "Swap mouse buttons") __UI_MouseButtonsSwap = (value$ = "True") Control(OptionsMenuSwapButtons).Value = __UI_MouseButtonsSwap $END IF Control(ViewMenuPreviewDetach).Value = PreviewAttached Control(OptionsMenuAutoName).Value = AutoNameControls Control(OptionsMenuSnapLines).Value = __UI_SnapLines Control(ViewMenuShowPositionAndSize).Value = __UI_ShowPositionAndSize Control(ViewMenuShowInvisibleControls).Value = __UI_ShowInvisibleControls IF _FILEEXISTS("InForm/UiEditorPreview.frmbin") THEN KILL "InForm/UiEditorPreview.frmbin" b$ = "Parsing command line..." GOSUB ShowMessage IF _FILEEXISTS(COMMAND$) THEN SELECT CASE LCASE$(RIGHT$(COMMAND$, 4)) CASE ".bas" 'Does this .bas $include a .frm? FreeFileNum = FREEFILE DIM uB$ OPEN COMMAND$ FOR BINARY AS #FreeFileNum b$ = SPACE$(LOF(FreeFileNum)) GET #FreeFileNum, 1, b$ SEEK #FreeFileNum, 1 IF INSTR(b$, CHR$(10) + "'$INCLUDE:'InForm/extensions/GIFPlay.bas'") > 0 THEN LoadedWithGifExtension = TRUE END IF DO IF EOF(FreeFileNum) THEN EXIT DO LINE INPUT #FreeFileNum, b$ b$ = LTRIM$(RTRIM$(b$)) uB$ = UCASE$(b$) IF (LEFT$(b$, 1) = "'" OR LEFT$(uB$, 4) = "REM ") AND INSTR(uB$, "$INCLUDE") > 0 THEN DIM FirstMark AS INTEGER, SecondMark AS INTEGER FirstMark = INSTR(INSTR(uB$, "$INCLUDE") + 8, uB$, "'") IF FirstMark > 0 THEN SecondMark = INSTR(FirstMark + 1, uB$, "'") IF SecondMark > 0 THEN uB$ = MID$(uB$, FirstMark + 1, SecondMark - FirstMark - 1) IF RIGHT$(uB$, 4) = ".FRM" THEN FileToOpen$ = MID$(b$, FirstMark + 1, SecondMark - FirstMark - 1) IF INSTR(COMMAND$, "/") > 0 OR INSTR(COMMAND$, "\") > 0 THEN FOR i = LEN(COMMAND$) TO 1 STEP -1 IF ASC(COMMAND$, i) = 92 OR ASC(COMMAND$, i) = 47 THEN FileToOpen$ = LEFT$(COMMAND$, i - 1) + PathSep$ + FileToOpen$ EXIT FOR END IF NEXT END IF EXIT DO END IF END IF END IF END IF LOOP CLOSE #FreeFileNum CASE ELSE IF LCASE$(RIGHT$(COMMAND$, 7)) = ".frmbin" OR LCASE$(RIGHT$(COMMAND$, 4)) = ".frm" THEN FileToOpen$ = COMMAND$ IF _FILEEXISTS(LEFT$(FileToOpen$, LEN(FileToOpen$) - 4) + ".bas") THEN FreeFileNum = FREEFILE OPEN LEFT$(FileToOpen$, LEN(FileToOpen$) - 4) + ".bas" FOR BINARY AS #FreeFileNum b$ = SPACE$(LOF(FreeFileNum)) GET #FreeFileNum, 1, b$ CLOSE #FreeFileNum IF INSTR(b$, CHR$(10) + "'$INCLUDE:'InForm/extensions/GIFPlay.bas'") > 0 THEN LoadedWithGifExtension = TRUE END IF END IF END IF END SELECT IF LEN(FileToOpen$) > 0 THEN IF INSTR(FileToOpen$, "/") > 0 OR INSTR(FileToOpen$, "\") > 0 THEN FOR i = LEN(FileToOpen$) TO 1 STEP -1 IF ASC(FileToOpen$, i) = 92 OR ASC(FileToOpen$, i) = 47 THEN CurrentPath$ = LEFT$(FileToOpen$, i - 1) ThisFileName$ = MID$(FileToOpen$, i + 1) EXIT FOR END IF NEXT ELSE ThisFileName$ = FileToOpen$ END IF FreeFileNum = FREEFILE OPEN FileToOpen$ FOR BINARY AS #FreeFileNum b$ = SPACE$(LOF(FreeFileNum)) GET #FreeFileNum, 1, b$ CLOSE #FreeFileNum OPEN "InForm/UiEditorPreview.frmbin" FOR BINARY AS #FreeFileNum PUT #FreeFileNum, 1, b$ CLOSE #FreeFileNum IF LoadedWithGifExtension = FALSE THEN LoadedWithGifExtension = 1 'Query whether this file contains the gif extension Control(AddGifExtensionToggle).Value = FALSE ELSE Control(AddGifExtensionToggle).Value = TRUE END IF AddToRecentList FileToOpen$ END IF END IF b$ = "Checking Preview component..." GOSUB ShowMessage $IF WIN THEN IF _FILEEXISTS("InForm/UiEditorPreview.exe") = 0 THEN GOTO UiEditorPreviewNotFound $ELSE IF _FILEEXISTS("InForm/UiEditorPreview") = 0 THEN GOTO UiEditorPreviewNotFound $END IF b$ = "Reading directory..." GOSUB ShowMessage 'Fill "open dialog" listboxes: '------------------------------------------------- DIM TotalFiles% IF CurrentPath$ = "" THEN CurrentPath$ = _STARTDIR$ Text(FileList) = idezfilelist$(CurrentPath$, 0, 1, TotalFiles%) Control(FileList).Max = TotalFiles% Control(FileList).LastVisibleItem = 0 'Reset it so it's recalculated Text(DirList) = idezpathlist$(CurrentPath$, TotalFiles%) Control(DirList).Max = TotalFiles% Control(DirList).LastVisibleItem = 0 'Reset it so it's recalculated Caption(PathLB) = "Path: " + CurrentPath$ '------------------------------------------------- 'Load font list b$ = "Loading font list..." GOSUB ShowMessage LoadFontList 'Assign InputBox IDs: i = 0 i = i + 1: InputBox(i).ID = NameTB: InputBox(i).LabelID = NameLB: InputBox(i).Signal = 1: InputBox(i).DataType = DT_Text i = i + 1: InputBox(i).ID = CaptionTB: InputBox(i).LabelID = CaptionLB: InputBox(i).Signal = 2: InputBox(i).DataType = DT_Text i = i + 1: InputBox(i).ID = TextTB: InputBox(i).LabelID = TextLB: InputBox(i).Signal = 3: InputBox(i).DataType = DT_Text i = i + 1: InputBox(i).ID = MaskTB: InputBox(i).LabelID = MaskLB: InputBox(i).Signal = 35: InputBox(i).DataType = DT_Text i = i + 1: InputBox(i).ID = TopTB: InputBox(i).LabelID = TopLB: InputBox(i).Signal = 4: InputBox(i).DataType = DT_Integer i = i + 1: InputBox(i).ID = LeftTB: InputBox(i).LabelID = LeftLB: InputBox(i).Signal = 5: InputBox(i).DataType = DT_Integer i = i + 1: InputBox(i).ID = WidthTB: InputBox(i).LabelID = WidthLB: InputBox(i).Signal = 6: InputBox(i).DataType = DT_Integer i = i + 1: InputBox(i).ID = HeightTB: InputBox(i).LabelID = HeightLB: InputBox(i).Signal = 7: InputBox(i).DataType = DT_Integer i = i + 1: InputBox(i).ID = FontTB: InputBox(i).LabelID = FontLB: InputBox(i).Signal = 8: InputBox(i).DataType = DT_Text i = i + 1: InputBox(i).ID = FontList: InputBox(i).LabelID = FontListLB: InputBox(i).Signal = 8: InputBox(i).DataType = DT_Text i = i + 1: InputBox(i).ID = TooltipTB: InputBox(i).LabelID = TooltipLB: InputBox(i).Signal = 9: InputBox(i).DataType = DT_Text i = i + 1: InputBox(i).ID = ValueTB: InputBox(i).LabelID = ValueLB: InputBox(i).Signal = 10: InputBox(i).DataType = DT_Float i = i + 1: InputBox(i).ID = BooleanOptions: InputBox(i).LabelID = BooleanLB: InputBox(i).Signal = 10: InputBox(i).DataType = DT_Float i = i + 1: InputBox(i).ID = MinTB: InputBox(i).LabelID = MinLB: InputBox(i).Signal = 11: InputBox(i).DataType = DT_Float i = i + 1: InputBox(i).ID = MaxTB: InputBox(i).LabelID = MaxLB: InputBox(i).Signal = 12: InputBox(i).DataType = DT_Float i = i + 1: InputBox(i).ID = IntervalTB: InputBox(i).LabelID = IntervalLB: InputBox(i).Signal = 13: InputBox(i).DataType = DT_Float i = i + 1: InputBox(i).ID = MinIntervalTB: InputBox(i).LabelID = MinIntervalLB: InputBox(i).Signal = 36: InputBox(i).DataType = DT_Float i = i + 1: InputBox(i).ID = PaddingTB: InputBox(i).LabelID = PaddingLeftrightLB: InputBox(i).Signal = 31: InputBox(i).DataType = DT_Integer i = i + 1: InputBox(i).ID = AlignOptions: InputBox(i).LabelID = TextAlignLB i = i + 1: InputBox(i).ID = VAlignOptions: InputBox(i).LabelID = VerticalAlignLB i = i + 1: InputBox(i).ID = BulletOptions: InputBox(i).LabelID = BulletOptionsLB i = i + 1: InputBox(i).ID = SizeTB: InputBox(i).Signal = 40: InputBox(i).DataType = DT_Integer i = i + 1: InputBox(i).ID = ContextMenuControlsList: InputBox(i).LabelID = ContextMenuLB: InputBox(i).DataType = DT_Text i = i + 1: InputBox(i).ID = KeyboardComboBT: InputBox(i).LabelID = KeyboardComboLB: InputBox(i).DataType = DT_Text REDIM _PRESERVE InputBox(1 TO i) AS newInputBox REDIM InputBoxText(1 TO i) AS STRING 'Assign Toggles IDs: i = 0 i = i + 1: Toggles(i) = Stretch i = i + 1: Toggles(i) = HasBorder i = i + 1: Toggles(i) = ShowPercentage i = i + 1: Toggles(i) = PasswordMaskCB i = i + 1: Toggles(i) = WordWrap i = i + 1: Toggles(i) = CanHaveFocus i = i + 1: Toggles(i) = Disabled i = i + 1: Toggles(i) = Transparent i = i + 1: Toggles(i) = Hidden i = i + 1: Toggles(i) = CenteredWindow i = i + 1: Toggles(i) = Resizable i = i + 1: Toggles(i) = AutoScroll i = i + 1: Toggles(i) = AutoSize i = i + 1: Toggles(i) = HideTicks i = i + 1: Toggles(i) = AutoPlayGif i = i + 1: Toggles(i) = AddGifExtensionToggle REDIM _PRESERVE Toggles(1 TO i) AS LONG ToolTip(FontTB) = "Multiple fonts can be specified by separating them with a question mark (?)." + CHR$(10) + "The first font that can be found/loaded is used." ToolTip(FontList) = "System fonts may not be available in all computers. To specify a local font file, right-click 'Font' to the left of this list and disable 'Show system fonts list'." ToolTip(ColorPreview) = "Click to copy the current color's hex value to the clipboard." ToolTip(KeyboardComboBT) = "Click to assign a key combination to the selected control" StatusBarBackColor = Darken(__UI_DefaultColor(__UI_Type_Form, 2), 90) Control(StatusBar).BackColor = StatusBarBackColor FOR i = 1 TO 9 RecentMenuItem(i) = __UI_GetID("FileMenuRecent" + LTRIM$(STR$(i))) NEXT b$ = "Loading images..." GOSUB ShowMessage 'Load toolbox images: DIM CommControls AS LONG CommControls = LoadEditorImage(EDITOR_IMAGE_COMMONCONTROLS) __UI_ClearColor CommControls, 0, 0 i = 0 Control(AddButton).HelperCanvas = _NEWIMAGE(16, 16, 32) i = i + 1: _PUTIMAGE (0, 0), CommControls, Control(AddButton).HelperCanvas, (0, i * 16 - 16)-STEP(15, 15) Control(AddLabel).HelperCanvas = _NEWIMAGE(16, 16, 32) i = i + 1: _PUTIMAGE (0, 0), CommControls, Control(AddLabel).HelperCanvas, (0, i * 16 - 16)-STEP(15, 15) Control(AddTextBox).HelperCanvas = _NEWIMAGE(16, 16, 32) i = i + 1: _PUTIMAGE (0, 0), CommControls, Control(AddTextBox).HelperCanvas, (0, i * 16 - 16)-STEP(15, 15) Control(AddCheckBox).HelperCanvas = _NEWIMAGE(16, 16, 32) i = i + 1: _PUTIMAGE (0, 0), CommControls, Control(AddCheckBox).HelperCanvas, (0, i * 16 - 16)-STEP(15, 15) Control(AddRadioButton).HelperCanvas = _NEWIMAGE(16, 16, 32) i = i + 1: _PUTIMAGE (0, 0), CommControls, Control(AddRadioButton).HelperCanvas, (0, i * 16 - 16)-STEP(15, 15) Control(AddListBox).HelperCanvas = _NEWIMAGE(16, 16, 32) i = i + 1: _PUTIMAGE (0, 0), CommControls, Control(AddListBox).HelperCanvas, (0, i * 16 - 16)-STEP(15, 15) Control(AddDropdownList).HelperCanvas = _NEWIMAGE(16, 16, 32) i = i + 1: _PUTIMAGE (0, 0), CommControls, Control(AddDropdownList).HelperCanvas, (0, i * 16 - 16)-STEP(15, 15) Control(AddTrackBar).HelperCanvas = _NEWIMAGE(16, 16, 32) i = i + 1: _PUTIMAGE (0, 0), CommControls, Control(AddTrackBar).HelperCanvas, (0, i * 16 - 16)-STEP(15, 15) Control(AddProgressBar).HelperCanvas = _NEWIMAGE(16, 16, 32) i = i + 1: _PUTIMAGE (0, 0), CommControls, Control(AddProgressBar).HelperCanvas, (0, i * 16 - 16)-STEP(15, 15) Control(AddPictureBox).HelperCanvas = _NEWIMAGE(16, 16, 32) i = i + 1: _PUTIMAGE (0, 0), CommControls, Control(AddPictureBox).HelperCanvas, (0, i * 16 - 16)-STEP(15, 15) Control(AddFrame).HelperCanvas = _NEWIMAGE(16, 16, 32) i = i + 1: _PUTIMAGE (0, 0), CommControls, Control(AddFrame).HelperCanvas, (0, i * 16 - 16)-STEP(15, 15) 'Draw ToggleSwitch icon prevDest = _DEST Control(AddToggleSwitch).HelperCanvas = _NEWIMAGE(16, 16, 32) _DEST Control(AddToggleSwitch).HelperCanvas LINE (2, 4)-(13, 11), _RGB32(0, 128, 255), BF LINE (2, 4)-(13, 11), _RGB32(170, 170, 170), B LINE (8, 6)-(11, 9), _RGB32(255, 255, 255), BF 'Draw AddNumericBox icon Control(AddNumericBox).HelperCanvas = _NEWIMAGE(16, 16, 32) _DEST Control(AddNumericBox).HelperCanvas _FONT 8 LINE (1, 3)-(15, 13), _RGB32(255, 255, 255), BF LINE (1, 3)-(15, 13), _RGB32(132, 165, 189), B COLOR _RGB32(55, 55, 55), _RGBA32(0, 0, 0, 0) __UI_PrintString 5, 3, "#" 'Draw PasteListBT icon Control(PasteListBT).HelperCanvas = _NEWIMAGE(17, 17, 32) _DEST Control(PasteListBT).HelperCanvas _FONT 16 FOR i = 4 TO 15 STEP 4 LINE (3, i)-STEP(_WIDTH - 6, 1), _RGB32(122, 122, 122), BF NEXT 'Import Align menu icons from InForm.ui Control(AlignMenuAlignLeft).HelperCanvas = Control(__UI_GetID("__UI_PreviewMenuAlignLeft")).HelperCanvas Control(AlignMenuAlignRight).HelperCanvas = Control(__UI_GetID("__UI_PreviewMenuAlignRight")).HelperCanvas Control(AlignMenuAlignTops).HelperCanvas = Control(__UI_GetID("__UI_PreviewMenuAlignTops")).HelperCanvas Control(AlignMenuAlignBottoms).HelperCanvas = Control(__UI_GetID("__UI_PreviewMenuAlignBottoms")).HelperCanvas Control(AlignMenuAlignCentersV).HelperCanvas = Control(__UI_GetID("__UI_PreviewMenuAlignCentersV")).HelperCanvas Control(AlignMenuAlignCentersH).HelperCanvas = Control(__UI_GetID("__UI_PreviewMenuAlignCentersH")).HelperCanvas _DEST prevDest Control(FileMenuSave).HelperCanvas = LoadEditorImage(EDITOR_IMAGE_DISK) _FREEIMAGE CommControls b$ = "Launching Preview component..." GOSUB ShowMessage $IF WIN THEN SHELL _DONTWAIT ".\InForm\UiEditorPreview.exe " + HostPort $ELSE Shell _DontWait "./InForm/UiEditorPreview " + HostPort $END IF b$ = "Connecting to preview component..." GOSUB ShowMessage DO Client = _OPENCONNECTION(Host) IF Client THEN EXIT DO IF _EXIT THEN SYSTEM 'Can't force user to wait... _DISPLAY _LIMIT 15 LOOP b$ = "Connected! Handshaking..." GOSUB ShowMessage Handshake __UI_RefreshMenuBar __UI_ForceRedraw = TRUE _FREEIMAGE tempIcon _ACCEPTFILEDROP EXIT SUB UiEditorPreviewNotFound: MessageBox "UiEditorPreview component not found or failed to load.", UiEditorTitle$, MsgBox_Critical SYSTEM ShowMessage: DIM PreserveDestMessage AS LONG PreserveDestMessage = _DEST _DEST 0 _FONT Control(__UI_FormID).Font IF tempIcon < -1 THEN CLS , _RGB32(255, 255, 255) _PUTIMAGE (_WIDTH / 2 - _WIDTH(tempIcon) / 2, _HEIGHT / 2 - _HEIGHT(tempIcon) / 2), tempIcon COLOR __UI_DefaultColor(__UI_Type_Form, 1), _RGBA32(0, 0, 0, 0) __UI_PrintString _WIDTH \ 2 - _PRINTWIDTH(b$) \ 2, _HEIGHT / 2 + _HEIGHT(tempIcon) / 2 + _FONTHEIGHT, b$ _DISPLAY ELSE CLS , __UI_DefaultColor(__UI_Type_Form, 2) COLOR __UI_DefaultColor(__UI_Type_Form, 1), _RGBA32(0, 0, 0, 0) __UI_PrintString _WIDTH \ 2 - _PRINTWIDTH(b$) \ 2, _HEIGHT \ 2 - _FONTHEIGHT \ 2, b$ END IF _DISPLAY _DEST PreserveDestMessage RETURN END SUB SUB __UI_KeyPress (id AS LONG) DIM i AS LONG LastKeyPress = TIMER SELECT EVERYCASE id CASE RedValue, GreenValue, BlueValue DIM TempID AS LONG IF __UI_KeyHit = 18432 THEN IF VAL(Text(id)) < 255 THEN Text(id) = LTRIM$(STR$(VAL(Text(id)) + 1)) END IF SelectPropertyFully id TempID = __UI_GetID(LEFT$(UCASE$(RTRIM$(Control(id).Name)), LEN(UCASE$(RTRIM$(Control(id).Name))) - 5)) Control(TempID).Value = VAL(Text(id)) SendNewRGB ELSEIF __UI_KeyHit = 20480 THEN IF VAL(Text(id)) > 0 THEN Text(id) = LTRIM$(STR$(VAL(Text(id)) - 1)) END IF SelectPropertyFully id TempID = __UI_GetID(LEFT$(UCASE$(RTRIM$(Control(id).Name)), LEN(UCASE$(RTRIM$(Control(id).Name))) - 5)) Control(TempID).Value = VAL(Text(id)) SendNewRGB ELSEIF __UI_KeyHit = 13 THEN TempID = __UI_GetID(LEFT$(UCASE$(RTRIM$(Control(id).Name)), LEN(UCASE$(RTRIM$(Control(id).Name))) - 5)) Control(TempID).Value = VAL(Text(id)) SendNewRGB SelectPropertyFully id END IF Caption(StatusBar) = "Color changed." CASE FileNameTextBox IF OpenDialogOpen THEN IF __UI_KeyHit = 27 THEN __UI_KeyHit = 0 __UI_Click CancelBT ELSEIF __UI_KeyHit = 13 THEN __UI_KeyHit = 0 IF Caption(OpenFrame) = "Open" THEN __UI_Click OpenBT ELSE __UI_Click SaveBT END IF ELSEIF __UI_KeyHit = 18432 OR __UI_KeyHit = 20480 THEN IF Control(FileList).Max > 0 THEN __UI_Focus = FileList ELSE IF Control(FileList).Max > 0 THEN SELECT CASE __UI_KeyHit CASE 48 TO 57, 65 TO 90, 97 TO 122 'Alphanumeric IF Caption(OpenFrame) = "Open" THEN __UI_ListBoxSearchItem Control(FileList) END IF END SELECT END IF END IF END IF CASE FileList, DirList, CancelBT, OpenBT, SaveBT, ShowOnlyFrmbinFilesCB, SaveFrmOnlyCB IF __UI_KeyHit = 27 THEN __UI_Click CancelBT END IF CASE FileList IF __UI_KeyHit = 13 THEN __UI_KeyHit = 0 IF Caption(OpenFrame) = "Open" THEN __UI_Click OpenBT ELSE __UI_Click SaveBT END IF END IF CASE ControlList, UpBT, DownBT, CloseZOrderingBT IF __UI_KeyHit = 27 THEN __UI_Click CloseZOrderingBT END IF CASE NameTB, CaptionTB, TextTB, MaskTB, TopTB, LeftTB, WidthTB, HeightTB, FontTB, TooltipTB, ValueTB, MinTB, MaxTB, IntervalTB, PaddingTB, MinIntervalTB, SizeTB IF __UI_KeyHit = 13 THEN 'Send the preview the new property value ConfirmEdits id ELSEIF __UI_KeyHit = 32 THEN IF id = NameTB THEN __UI_KeyHit = 0 Caption(StatusBar) = "Control names cannot contain spaces" BlinkStatusBar = TIMER ELSE InputBox(GetInputBoxFromID(id)).Sent = FALSE Send Client, "LOCKCONTROLS>" END IF ELSEIF __UI_KeyHit = 27 THEN RevertEdit = TRUE Caption(StatusBar) = "Previous property value restored." ELSE InputBox(GetInputBoxFromID(id)).Sent = FALSE Send Client, "LOCKCONTROLS>" END IF CASE KeyboardComboBT DIM Combo$ IF __UI_CtrlIsDown THEN Combo$ = "Ctrl+" IF __UI_ShiftIsDown THEN Combo$ = Combo$ + "Shift+" SELECT CASE __UI_KeyHit CASE 27 __UI_Focus = 0 __UI_BypassKeyCombos = FALSE ToolTip(KeyboardComboBT) = "Click to assign a key combination to the selected control" SendData MKI$(0), 43 __UI_ForceRedraw = TRUE CASE __UI_FKey(1), __UI_FKey(2), __UI_FKey(3), __UI_FKey(4), __UI_FKey(5), __UI_FKey(6), _ __UI_FKey(7), __UI_FKey(8), __UI_FKey(9), __UI_FKey(10), __UI_FKey(11), __UI_FKey(12) FOR i = 1 TO 12 IF __UI_FKey(i) = __UI_KeyHit THEN Combo$ = Combo$ + "F" + LTRIM$(STR$(i)) SendData MKI$(LEN(Combo$)) + Combo$, 43 __UI_Focus = 0 __UI_BypassKeyCombos = FALSE ToolTip(KeyboardComboBT) = "Click to assign a key combination to the selected control" __UI_ForceRedraw = TRUE EXIT FOR END IF NEXT CASE 65 TO 90, 97 TO 122 'Alphanumeric Combo$ = Combo$ + UCASE$(CHR$(__UI_KeyHit)) IF INSTR(Combo$, "Ctrl+") > 0 THEN SendData MKI$(LEN(Combo$)) + Combo$, 43 __UI_Focus = 0 __UI_BypassKeyCombos = FALSE ToolTip(KeyboardComboBT) = "Click to assign a key combination to the selected control" __UI_ForceRedraw = TRUE END IF END SELECT END SELECT END SUB SUB ConfirmEdits (id AS LONG) DIM b$, TempValue AS LONG IF InputBoxText(GetInputBoxFromID(id)) <> Text(id) AND _ InputBox(GetInputBoxFromID(id)).Sent = False THEN SELECT CASE InputBox(GetInputBoxFromID(id)).DataType CASE DT_Text b$ = MKL$(LEN(Text(id))) + Text(id) CASE DT_Integer b$ = MKI$(VAL(Text(id))) CASE DT_Float b$ = _MK$(_FLOAT, VAL(Text(id))) END SELECT TempValue = GetPropertySignal(id) SendData b$, TempValue PropertySent = TRUE Text(id) = RestoreCHR(Text(id)) SelectPropertyFully id InputBoxText(GetInputBoxFromID(id)) = Text(id) InputBox(GetInputBoxFromID(id)).LastEdited = TIMER InputBox(GetInputBoxFromID(id)).Sent = TRUE Caption(StatusBar) = "Ready." END IF END SUB FUNCTION GetPropertySignal& (id AS LONG) DIM i AS LONG FOR i = 1 TO UBOUND(InputBox) IF InputBox(i).ID = id THEN GetPropertySignal& = InputBox(i).Signal: EXIT FUNCTION NEXT END FUNCTION FUNCTION GetInputBoxFromID& (id AS LONG) DIM i AS LONG FOR i = 1 TO UBOUND(InputBox) IF InputBox(i).ID = id THEN GetInputBoxFromID& = i: EXIT FUNCTION NEXT END FUNCTION SUB __UI_TextChanged (id AS LONG) SELECT CASE id CASE RedValue, GreenValue, BlueValue DIM TempID AS LONG TempID = __UI_GetID(LEFT$(UCASE$(RTRIM$(Control(id).Name)), LEN(UCASE$(RTRIM$(Control(id).Name))) - 5)) Control(TempID).Value = VAL(Text(id)) CASE FileNameTextBox PreselectFile END SELECT END SUB SUB __UI_ValueChanged (id AS LONG) IF __UI_StateHasChanged THEN EXIT SUB 'skip values changed programmatically DIM b$, i AS LONG SELECT EVERYCASE id CASE AlignOptions IF __UI_Focus <> id THEN EXIT SUB b$ = MKI$(Control(AlignOptions).Value - 1) SendData b$, 22 PropertySent = TRUE CASE VAlignOptions IF __UI_Focus <> id THEN EXIT SUB b$ = MKI$(Control(VAlignOptions).Value - 1) SendData b$, 32 PropertySent = TRUE CASE BulletOptions IF __UI_Focus <> id THEN EXIT SUB b$ = MKI$(Control(BulletOptions).Value - 1) SendData b$, 37 PropertySent = TRUE CASE BooleanOptions b$ = _MK$(_FLOAT, -(Control(BooleanOptions).Value - 1)) SendData b$, GetPropertySignal(BooleanOptions) PropertySent = TRUE CASE ContextMenuControlsList i = Control(ContextMenuControlsList).Value IF i > 1 THEN b$ = GetItem(ContextMenuControlsList, i) b$ = MKI$(LEN(b$)) + b$ ELSE b$ = MKI$(0) END IF SendData b$, 41 CASE FontList, FontSizeList b$ = FontFile(Control(FontList).Value) + "," + GetItem$(FontSizeList, Control(FontSizeList).Value) b$ = MKL$(LEN(b$)) + b$ SendData b$, 8 PropertySent = TRUE CASE Red Text(RedValue) = LTRIM$(STR$(Control(Red).Value)) CASE Green Text(GreenValue) = LTRIM$(STR$(Control(Green).Value)) CASE Blue Text(BlueValue) = LTRIM$(STR$(Control(Blue).Value)) CASE ControlList Control(UpBT).Disabled = FALSE Control(DownBT).Disabled = FALSE IF Control(ControlList).Value = 1 THEN Control(UpBT).Disabled = TRUE ELSEIF Control(ControlList).Value = 0 THEN Control(UpBT).Disabled = TRUE Control(DownBT).Disabled = TRUE ELSEIF Control(ControlList).Value = Control(ControlList).Max THEN Control(DownBT).Disabled = TRUE END IF IF Control(ControlList).Value > 0 THEN b$ = MKL$(zOrderIDs(Control(ControlList).Value)) ELSE b$ = MKL$(0) END IF SendData b$, 213 CASE FileList Text(FileNameTextBox) = GetItem(FileList, Control(FileList).Value) CASE NameTB, CaptionTB, TextTB, MaskTB, TopTB, LeftTB, WidthTB, HeightTB, FontTB, TooltipTB, ValueTB, MinTB, MaxTB, IntervalTB, PaddingTB, MinIntervalTB, SizeTB Send Client, "LOCKCONTROLS>" END SELECT END SUB SUB PreselectFile DIM b$ b$ = GetItem(FileList, Control(FileList).Value) IF LCASE$(Text(FileNameTextBox)) = LCASE$(LEFT$(b$, LEN(Text(FileNameTextBox)))) THEN Text(FileNameTextBox) = Text(FileNameTextBox) + MID$(b$, LEN(Text(FileNameTextBox)) + 1) Control(FileNameTextBox).TextIsSelected = TRUE Control(FileNameTextBox).SelectionStart = LEN(Text(FileNameTextBox)) END IF END SUB '--------------------------------------------------------------------------------- ' Use this to store editor images and bitmaps ' Take care not to call multiple times for the same image as it will create a new _IMAGE everytime it is called! FUNCTION LoadEditorImage& (id AS _UNSIGNED _BYTE) SELECT CASE id CASE EDITOR_IMAGE_COMMONCONTROLS CONST SIZE_COMMONCONTROLS_BMP_11386~& = 11386~& CONST COMP_COMMONCONTROLS_BMP_11386%% = -1%% CONST DATA_COMMONCONTROLS_BMP_11386 = _ "eNpy8q3SYQC0W4UwsgJJdC5nRo4ceciRSCwSiRw7knO4wyKRyLZIkjNILBLZsi0S90e+q7x0SF96tj/MbvJ/NluZl6KYflVV3UWnKP8R/FtwEfxX" + _ "8I/Tv07/PH0ksD9rvCG/Tr/wWXRdC6VadIp6t22578alD8Fn8haoPxdfuD/1f239Oj25mjDZ6UD9zvow3+1hPnvr/Xy8/n8VO6D/SnRljjq9oc4E" + _ "aURU6RW1oEos4ovFmShvZ7j8Vis0gmpu8BhL5EOBWOW4tSmuTbLhViXIkht9bfzqjnGZ0C8D/dRzKz6qzUckPi6N8O4JinuGR54yB8tHXz3I1U8j" + _ "ekTr5JH1BW4qQ54laKuSkGtTamJ8YmgKqK62PjS11IJyapjDQ+ob+w5D15I7tI3Ed/klnuvi+DDUUgcKyU2PA8w8kvscFQbVoE6uG39sa4iAPuqS" + _ "3EHqKB4Z5l6hyFPWbAYFTB1G1aJy+JMin/JcDH10jeRkZmDRgJkgSQDzIOjFRcsztnzanjxXQk8a0V3jmk/Qw0AfkhP7w/LF9vjWxxPxw6CcgKwV" + _ "P/nMPLTwpdccvsIHInyNcQXKEcxDEoIZOua/h28McyCkFu7HMnY74/v7gcUINL8Xl68HRT1Tt5i7lucyCqQ/COlTQr4XgvwffBpFUbyDjbssCw4K" + _ "OdYP7cxkSE0KEWqx7fuU9itx+bG+ITaxfY5p2/e0f8dPTIJEx9uzwHsO8XOTCXL7nNN234f4xhgclXVdyf3s+f3g+0B13dvcxjS4dte3fDSaXLRz" + _ "i2t7Rdf3h/iMqxXvhGZsUNcNdgr5ddPiCWBZV2itaa/PpwDUol7ZDp/xGF+T33AflFIh7cVfnfhH68/mDOmUUTd1eYgf9ZH4iKh5Dk11gP+Dsasx" + _ "qsrq+pBNvrwLyXPm3Ec9d+1mWz51mL9xOQPTh8/nfw68+Hzn6FHti8/cJ+ZAWNurn3H9HPj/JGtHC2sfrd/LI1Q/5Yvrd/af9hecP/uoziPB9R3N" + _ "fdwr5NyFM02bj1Ed4ZO7QWzvPAP2/+d+p/5G94dT8wGbfFUhJE7Ps39oO/077elf9/7oW9oH+5dceXa+n2rX/WPje/qd+sn16w/eP3iuwLp4+mD9" + _ "Xh6h+ilfW797f/2R87d3oF//J/v/u2EeO/RtzTuubyvae3hmHnk/Dm0JLc8ifCc238tzkNvVd+pXYvSEvn585IP+9SRnbOdiat8H172ut+RMLTzR" + _ "K5TucFM3qFlhdXxJLd5+dNyjnuvWdUWnhdvfEHU3XNoLfVhh/k2RuXzu87Is5Ep8ZFOOdM6QjAnoR/JwhOtdflvdMUn8ZV2JfumRa/ExZeQrrehX" + _ "hOfSlNmr+sld6WMRHwPz6EzH/fDr9/df9oB12Dy4H7YmQtv+CJ3/PA1bHpZLP2NX8/9QD+l52PpvsrnMovu24PtD/d88uM+yt2693xXuTCOI9tje" + _ "+fvfXnAW8+ILj9gjr+K7vSaCqIsOx18tX7j2G472xrc9T66HPfFtz29x/TzC8e23x7XOt+fmEYpP7otvz80jGN/Y+B/dATY+nz+ITx+BPIhgfMHv" + _ "8rDxv7T/f+b/4+LPf4fEm/+8Gda3KfbZn3/9NcF3bv1+/DDfr/9o/HD9lIP1++LGp4TrP8j/+vM/JH/R/P+DaZoQxzecz2dE0ZW2+7/bx9fL5SMf" + _ "/M/hbmjqitzo6vr2UT7ueOS5tf34j3senh3nmeuyNEESx0iTGJfLeePL/wE+QY6TI3MOxPagmhr3LHXzwVlAnzvP4nI+U0sd5Cfx7dg8WRaoiseR" + _ "ur0cLJf1v9NTVcUzd+s+nIPthW8NPfWcaar0hDI5/U5z9pnHbuM2jxjj0GPWhpis/sgex4EcPfaosgvmecJqZ7Sdmj4kD+bkzIi7tOGMuLIWgfuf" + _ "e8/4tl23CFd8MLaA70TANcDGc/Vz+x/kL6sT33IC84Pri1yBjU++J6H5YV1Zxxafsn9+YA7iY4sfEJfn8pmzjX+Yb30wdnO/wegJR2URjvQ8+7gt" + _ "Eph5v491MWht/8o3QC157Ph2qNnzeiL30/gfg472/w==" LoadEditorImage = _LOADIMAGE(Base64_LoadResourceString(DATA_COMMONCONTROLS_BMP_11386, SIZE_COMMONCONTROLS_BMP_11386, COMP_COMMONCONTROLS_BMP_11386), 32, "memory") CASE EDITOR_IMAGE_DISK CONST SIZE_DISK_BMP_1146~& = 1146~& CONST COMP_DISK_BMP_1146%% = -1%% CONST DATA_DISK_BMP_1146 = _ "eNpy8q1iYQCDKiDOAWIBKGZkUGBgZsAF/kMQjEMG4OHhERMXF/cDMu2B2IEIbA90qrOokJAHkM2urqISAqTvx0RF/u/v7v7f1d7+v7ujAxcGy9tY" + _ "Wf7kZGW5paKg4AAgixwC64iDMJ5jbbtx8mxtbLO27V5q81j3Xtu2bTxbcW7Vvv06/dft4Rv/ZhYmk6mAePe61as/1odDkbDfx9cE/EwUf8sjP2K+" + _ "LhTkHRYzsjMzm+mb2CSJiYY0jishHsTzDeEwQl4Pwj7vv6K6F7WBAFw2q5CZno6ObdpALBar0zmumHisWbmSrw344Xc5EXC7/pfLhTDtsL9/h6yM" + _ "tEjXjh0gEok0P/nVy5bxYY8HXrsNPoed5PjlSVS3sx2W169B94Ve3boxPiud8VhL92tov4/m/DT/j9iuIPG2t2+Qm5UV6durJ+TEcwYD4+fNmsW/" + _ "ff4Mb5/90PN/9OwpzC9f4t716zDqdUJCTDS7LxOLixUSCaQiEU91mAx6aNUq8jrQfwJHOXmkkNJSONaTJCcJUlEyoqOjNUqZuFgll0EhlfBUQ15O" + _ "NkaPHIHB1VWoLC9HVUUF8+WlJWwPzYEkyCVixmuVyuJUkwF9u3fh58yahQP792PZ0qU4dPAgTh4/juPHjuHY0aM4dfIkpk+bBnpXGHXaiFatRDzx" + _ "6ZyhODcrA9G9e/BLFy/G3r172cz+fftw4fx5nDl9munSxYuYP28e62WlpUTSTEaI4uM1edkZRaWF+VCKE/llSxYzrlvLljh44ADjz/7BL5w/Hy2j" + _ "ooTCvJxIXlYG+/4VhYVlw4dUQ54Y83H71q24e+eOQDeE+/fvCw6HQzCbzYL5/XvB6XQKmzdtYr3K0uIvxQW5kMtFGsrbjBw6+FF+BofdO3cIwYAf" + _ "d27dgtfjQU04jHAoiGAggMaGeuzavh2K6GhMHDMS40YNA6fX64iP+rqAgAABV0dHL193d+2e9nbj9atWGbc31RpXFOcZ1xYXGzeUlhrVVhQbJ8fF" + _ "GXq5uOgG+/v4hgb5h3t6evIBAK70LyE=" LoadEditorImage = _LOADIMAGE(Base64_LoadResourceString(DATA_DISK_BMP_1146, SIZE_DISK_BMP_1146, COMP_DISK_BMP_1146), 32, "memory") CASE ELSE ERROR 51 END SELECT END FUNCTION FUNCTION ReadSequential$ (Txt$, Bytes%) ReadSequential$ = LEFT$(Txt$, Bytes%) Txt$ = MID$(Txt$, Bytes% + 1) END FUNCTION SUB LoadPreview DIM b$, __UI_EOF AS _BYTE, Answer AS _BYTE DIM NewType AS INTEGER, NewWidth AS INTEGER, NewHeight AS INTEGER DIM NewLeft AS INTEGER, NewTop AS INTEGER, NewName AS STRING DIM NewParentID AS STRING, FloatValue AS _FLOAT, Dummy AS LONG DIM FormData$ STATIC PrevTotalGifLoaded AS LONG TIMER(__UI_EventsTimer) OFF TIMER(__UI_RefreshTimer) OFF FormData$ = LastFormData$ AddGifExtension = FALSE TotalGifLoaded = 0 IF LoadedWithGifExtension = 1 THEN PrevTotalGifLoaded = 0 b$ = ReadSequential$(FormData$, 4) REDIM PreviewCaptions(0 TO CVL(b$)) AS STRING REDIM PreviewTexts(0 TO CVL(b$)) AS STRING REDIM PreviewMasks(0 TO CVL(b$)) AS STRING REDIM PreviewTips(0 TO CVL(b$)) AS STRING REDIM PreviewFonts(0 TO CVL(b$)) AS STRING REDIM PreviewActualFonts(0 TO CVL(b$)) AS STRING REDIM PreviewControls(0 TO CVL(b$)) AS __UI_ControlTYPE REDIM PreviewParentIDS(0 TO CVL(b$)) AS STRING REDIM PreviewContextMenu(0 TO CVL(b$)) AS STRING REDIM PreviewBoundTo(0 TO CVL(b$)) AS STRING REDIM PreviewBoundProperty(0 TO CVL(b$)) AS STRING REDIM PreviewKeyCombos(0 TO CVL(b$)) AS STRING REDIM PreviewAnimatedGif(0 TO CVL(b$)) AS _BYTE REDIM PreviewAutoPlayGif(0 TO CVL(b$)) AS _BYTE ResetList ContextMenuControlsList AddItem ContextMenuControlsList, "(none)" b$ = ReadSequential$(FormData$, 2) IF CVI(b$) <> -1 THEN GOTO LoadError DO b$ = ReadSequential$(FormData$, 4) Dummy = CVL(b$) IF Dummy <= 0 OR Dummy > UBOUND(PreviewControls) THEN EXIT DO 'Corrupted exchange file. b$ = ReadSequential$(FormData$, 2) NewType = CVI(b$) b$ = ReadSequential$(FormData$, 2) b$ = ReadSequential$(FormData$, CVI(b$)) NewName = b$ b$ = ReadSequential$(FormData$, 2) NewWidth = CVI(b$) b$ = ReadSequential$(FormData$, 2) NewHeight = CVI(b$) b$ = ReadSequential$(FormData$, 2) NewLeft = CVI(b$) b$ = ReadSequential$(FormData$, 2) NewTop = CVI(b$) b$ = ReadSequential$(FormData$, 2) IF CVI(b$) > 0 THEN NewParentID = ReadSequential$(FormData$, CVI(b$)) ELSE NewParentID = "" END IF IF NewType = __UI_Type_ContextMenu THEN AddItem ContextMenuControlsList, NewName END IF PreviewControls(Dummy).ID = Dummy PreviewParentIDS(Dummy) = RTRIM$(NewParentID) PreviewControls(Dummy).Type = NewType PreviewControls(Dummy).Name = NewName PreviewControls(Dummy).Width = NewWidth PreviewControls(Dummy).Height = NewHeight PreviewControls(Dummy).Left = NewLeft PreviewControls(Dummy).Top = NewTop DO 'read properties b$ = ReadSequential$(FormData$, 2) SELECT CASE CVI(b$) CASE -2 'Caption b$ = ReadSequential$(FormData$, 4) b$ = ReadSequential$(FormData$, CVL(b$)) PreviewCaptions(Dummy) = b$ CASE -3 'Text b$ = ReadSequential$(FormData$, 4) b$ = ReadSequential$(FormData$, CVL(b$)) PreviewTexts(Dummy) = b$ CASE -4 'Stretch PreviewControls(Dummy).Stretch = TRUE CASE -5 'Font DIM FontSetup$ DIM NewFontSize$ b$ = ReadSequential$(FormData$, 2) FontSetup$ = ReadSequential$(FormData$, CVI(b$)) PreviewFonts(Dummy) = FontSetup$ NewFontSize$ = MID$(FontSetup$, INSTR(FontSetup$, ",")) b$ = ReadSequential$(FormData$, 2) FontSetup$ = ReadSequential$(FormData$, CVI(b$)) PreviewActualFonts(Dummy) = FontSetup$ + NewFontSize$ CASE -6 'ForeColor b$ = ReadSequential$(FormData$, 4) PreviewControls(Dummy).ForeColor = _CV(_UNSIGNED LONG, b$) CASE -7 'BackColor b$ = ReadSequential$(FormData$, 4) PreviewControls(Dummy).BackColor = _CV(_UNSIGNED LONG, b$) CASE -8 'SelectedForeColor b$ = ReadSequential$(FormData$, 4) PreviewControls(Dummy).SelectedForeColor = _CV(_UNSIGNED LONG, b$) CASE -9 'SelectedBackColor b$ = ReadSequential$(FormData$, 4) PreviewControls(Dummy).SelectedBackColor = _CV(_UNSIGNED LONG, b$) CASE -10 'BorderColor b$ = ReadSequential$(FormData$, 4) PreviewControls(Dummy).BorderColor = _CV(_UNSIGNED LONG, b$) CASE -11 PreviewControls(Dummy).BackStyle = __UI_Transparent CASE -12 PreviewControls(Dummy).HasBorder = TRUE CASE -13 b$ = ReadSequential$(FormData$, 1) PreviewControls(Dummy).Align = _CV(_BYTE, b$) CASE -14 b$ = ReadSequential$(FormData$, LEN(FloatValue)) PreviewControls(Dummy).Value = _CV(_FLOAT, b$) CASE -15 b$ = ReadSequential$(FormData$, LEN(FloatValue)) PreviewControls(Dummy).Min = _CV(_FLOAT, b$) CASE -16 b$ = ReadSequential$(FormData$, LEN(FloatValue)) PreviewControls(Dummy).Max = _CV(_FLOAT, b$) CASE -19 PreviewControls(Dummy).ShowPercentage = TRUE CASE -20 PreviewControls(Dummy).CanHaveFocus = TRUE CASE -21 PreviewControls(Dummy).Disabled = TRUE CASE -22 PreviewControls(Dummy).Hidden = TRUE CASE -23 PreviewControls(Dummy).CenteredWindow = TRUE CASE -24 'Tips b$ = ReadSequential$(FormData$, 4) b$ = ReadSequential$(FormData$, CVL(b$)) PreviewTips(Dummy) = b$ CASE -25 'ContextMenu b$ = ReadSequential$(FormData$, 2) b$ = ReadSequential$(FormData$, CVI(b$)) PreviewContextMenu(Dummy) = b$ CASE -26 b$ = ReadSequential$(FormData$, LEN(FloatValue)) PreviewControls(Dummy).Interval = _CV(_FLOAT, b$) CASE -27 PreviewControls(Dummy).WordWrap = TRUE CASE -29 PreviewControls(Dummy).CanResize = TRUE CASE -31 b$ = ReadSequential$(FormData$, 2) PreviewControls(Dummy).Padding = CVI(b$) CASE -32 b$ = ReadSequential$(FormData$, 1) PreviewControls(Dummy).VAlign = _CV(_BYTE, b$) CASE -33 PreviewControls(Dummy).PasswordField = TRUE CASE -34 b$ = ReadSequential$(FormData$, 4) PreviewControls(Dummy).Encoding = CVL(b$) CASE -35 PreviewDefaultButtonID = Dummy CASE -36 'Mask b$ = ReadSequential$(FormData$, 4) b$ = ReadSequential$(FormData$, CVL(b$)) PreviewMasks(Dummy) = b$ CASE -37 b$ = ReadSequential$(FormData$, LEN(FloatValue)) PreviewControls(Dummy).MinInterval = _CV(_FLOAT, b$) CASE -38 PreviewControls(Dummy).NumericOnly = TRUE CASE -39 PreviewControls(Dummy).NumericOnly = __UI_NumericWithBounds CASE -40 PreviewControls(Dummy).BulletStyle = __UI_Bullet CASE -41 PreviewControls(Dummy).AutoScroll = TRUE CASE -42 PreviewControls(Dummy).AutoSize = TRUE CASE -43 b$ = ReadSequential$(FormData$, 2) PreviewControls(Dummy).BorderSize = CVI(b$) CASE -44 'Key combo b$ = ReadSequential$(FormData$, 2) b$ = ReadSequential$(FormData$, CVI(b$)) PreviewKeyCombos(Dummy) = b$ CASE -45 'Animated Gif PreviewAnimatedGif(Dummy) = TRUE TotalGifLoaded = TotalGifLoaded + 1 AddGifExtension = TRUE IF LoadedWithGifExtension = 1 THEN LoadedWithGifExtension = TRUE Control(AddGifExtensionToggle).Value = TRUE END IF CASE -46 'Auto-play Gif PreviewAutoPlayGif(Dummy) = TRUE CASE -47 'ControlIsSelected PreviewControls(Dummy).ControlIsSelected = TRUE CASE -48 'BoundTo b$ = ReadSequential$(FormData$, 2) b$ = ReadSequential$(FormData$, CVI(b$)) PreviewBoundTo(Dummy) = b$ b$ = ReadSequential$(FormData$, 2) b$ = ReadSequential$(FormData$, CVI(b$)) PreviewBoundProperty(Dummy) = b$ CASE -1 'new control EXIT DO CASE -1024 __UI_EOF = TRUE EXIT DO CASE ELSE EXIT DO END SELECT LOOP LOOP UNTIL __UI_EOF LoadError: TIMER(__UI_EventsTimer) ON TIMER(__UI_RefreshTimer) ON IF LoadedWithGifExtension = 1 THEN LoadedWithGifExtension = FALSE IF PrevTotalGifLoaded <> TotalGifLoaded THEN IF PrevTotalGifLoaded = 0 AND LoadedWithGifExtension = FALSE THEN _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, "You loaded an animated GIF file.\nDo you want to include the GIF extension?", "yesno", "question", 1) IF Answer = 1 THEN Control(AddGifExtensionToggle).Value = TRUE ELSE b$ = "PAUSEALLGIF>" + "" Send Client, b$ Control(AddGifExtensionToggle).Value = FALSE END IF END IF PrevTotalGifLoaded = TotalGifLoaded END IF END SUB SUB SendData (b$, Property AS INTEGER) 'IF PreviewSelectionRectangle THEN EXIT SUB b$ = "PROPERTY>" + MKI$(Property) + b$ + "" Send Client, b$ END SUB SUB Send (channel AS LONG, b$) totalBytesSent = totalBytesSent + LEN(b$) PUT #channel, , b$ END SUB SUB SendSignal (Value AS INTEGER) DIM b$ b$ = "SIGNAL>" + MKI$(Value) + "" Send Client, b$ END SUB SUB UpdateColorPreview (Attribute AS _BYTE, ForeColor AS _UNSIGNED LONG, BackColor AS _UNSIGNED LONG) _DEST Control(ColorPreview).HelperCanvas _FONT Control(ColorPreview).Font IF Attribute = 5 THEN CLS , BackColor LINE (20, 20)-STEP(_WIDTH - 41, _HEIGHT - 41), ForeColor, B LINE (21, 21)-STEP(_WIDTH - 43, _HEIGHT - 43), ForeColor, B ColorPreviewWord$ = "#" + MID$(HEX$(ForeColor), 3) COLOR ForeColor, BackColor __UI_PrintString _WIDTH \ 2 - _PRINTWIDTH(ColorPreviewWord$) \ 2, _HEIGHT \ 2 - _FONTHEIGHT \ 2, ColorPreviewWord$ ELSE CLS , BackColor COLOR ForeColor, BackColor SELECT CASE Attribute CASE 1, 3 ColorPreviewWord$ = "FG: #" + MID$(HEX$(ForeColor), 3) CASE 2, 4 ColorPreviewWord$ = "BG: #" + MID$(HEX$(BackColor), 3) END SELECT __UI_PrintString _WIDTH \ 2 - _PRINTWIDTH(ColorPreviewWord$) \ 2, _HEIGHT \ 2 - _FONTHEIGHT \ 2, ColorPreviewWord$ ColorPreviewWord$ = MID$(ColorPreviewWord$, 5) END IF _DEST 0 Control(ColorPreview).Redraw = TRUE 'Force update END SUB SUB QuickColorPreview (ThisColor AS _UNSIGNED LONG) _DEST Control(ColorPreview).HelperCanvas CLS , __UI_DefaultColor(__UI_Type_Form, 2) LINE (0, 0)-STEP(_WIDTH, _HEIGHT / 2), ThisColor, BF LINE (0, _HEIGHT / 2)-STEP(_WIDTH, _HEIGHT / 2), OldColor, BF _DEST 0 Control(ColorPreview).Redraw = TRUE 'Force update END SUB SUB CheckPreview 'Check if the preview window is still alive DIM b$ IF OpenDialogOpen THEN EXIT SUB $IF WIN THEN DIM hnd&, b&, c&, ExitCode& IF UiPreviewPID > 0 THEN hnd& = OpenProcess(&H400, 0, UiPreviewPID) b& = GetExitCodeProcess(hnd&, ExitCode&) c& = CloseHandle(hnd&) IF b& = 1 AND ExitCode& = 259 THEN 'Preview is active. Control(ViewMenuPreview).Disabled = TRUE ELSE 'Preview was closed. TIMER(__UI_EventsTimer) OFF __UI_WaitMessage = "Reloading preview window..." UiPreviewPID = 0 __UI_ProcessInputTimer = 0 'Make the "Please wait" message show up immediataly CLOSE Client Client = 0 __UI_UpdateDisplay SHELL _DONTWAIT ".\InForm\UiEditorPreview.exe " + HostPort DO Client = _OPENCONNECTION(Host) IF Client THEN EXIT DO IF _EXIT THEN SYSTEM 'Can't force user to wait... _DISPLAY _LIMIT 15 LOOP Handshake IF LEN(LastFormData$) THEN b$ = "RESTORECRASH>" + LastFormData$ + "" Send Client, b$ prevScreenX = -1 prevScreenY = -1 UndoPointer = 0 TotalUndoImages = 0 END IF TIMER(__UI_EventsTimer) ON END IF END IF $ELSE IF UiPreviewPID > 0 THEN IF PROCESS_CLOSED(UiPreviewPID, 0) THEN 'Preview was closed. TIMER(__UI_EventsTimer) OFF Control(ViewMenuPreview).Disabled = False __UI_WaitMessage = "Reloading preview window..." UiPreviewPID = 0 __UI_ProcessInputTimer = 0 'Make the "Please wait" message show up immediataly CLOSE Client Client = 0 __UI_UpdateDisplay SHELL _DONTWAIT "./InForm/UiEditorPreview " + HostPort DO Client = _OPENCONNECTION(Host) IF Client THEN EXIT DO IF _EXIT THEN SYSTEM 'Can't force user to wait... _DISPLAY _LIMIT 15 LOOP Handshake IF LEN(LastFormData$) THEN b$ = "RESTORECRASH>" + LastFormData$ + "" Send Client, b$ prevScreenX = -1 prevScreenY = -1 UndoPointer = 0 TotalUndoImages = 0 END IF TIMER(__UI_EventsTimer) ON ELSE 'Preview is active. Control(ViewMenuPreview).Disabled = True END IF END IF $END IF END SUB SUB SaveForm (ExitToQB64 AS _BYTE, SaveOnlyFrm AS _BYTE) DIM BaseOutputFileName AS STRING, j AS LONG DIM TextFileNum AS INTEGER, Answer AS _BYTE, b$, i AS LONG DIM a$, FontSetup$, FindSep AS INTEGER, NewFontFile AS STRING DIM Dummy AS LONG, BackupFile$ DIM PreserveBackup AS _BYTE, BackupCode$ DIM tempThisFileName$ tempThisFileName$ = ThisFileName$ IF UCASE$(RIGHT$(tempThisFileName$, 4)) = ".FRM" OR UCASE$(RIGHT$(tempThisFileName$, 4)) = ".BAS" THEN tempThisFileName$ = LEFT$(tempThisFileName$, LEN(tempThisFileName$) - 4) END IF BaseOutputFileName = CurrentPath$ + PathSep$ + tempThisFileName$ IF (_FILEEXISTS(BaseOutputFileName + ".bas") AND SaveOnlyFrm = FALSE) AND _FILEEXISTS(BaseOutputFileName + ".frm") THEN b$ = "These files will be overwritten:" + CHR$(10) + " " b$ = b$ + tempThisFileName$ + ".bas" + CHR$(10) + " " b$ = b$ + tempThisFileName$ + ".frm" + CHR$(10) b$ = b$ + "Proceed?" ELSEIF (_FILEEXISTS(BaseOutputFileName + ".bas") AND SaveOnlyFrm = FALSE) AND _FILEEXISTS(BaseOutputFileName + ".frm") = 0 THEN b$ = "'" + tempThisFileName$ + ".bas" + "' will be overwritten." + CHR$(10) b$ = b$ + "Proceed?" ELSEIF _FILEEXISTS(BaseOutputFileName + ".frm") THEN b$ = "'" + tempThisFileName$ + ".frm" + "' will be overwritten." + CHR$(10) b$ = b$ + "Proceed?" END IF IF LEN(b$) > 0 THEN _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, b$, "yesno", "question", 0) IF Answer = 0 THEN EXIT SUB END IF AddGifExtension = Control(AddGifExtensionToggle).Value IF (AddGifExtension OR Control(AddGifExtensionToggle).Value) AND LoadedWithGifExtension = FALSE AND TotalGifLoaded = 0 THEN _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, "Are you sure you want to include the GIF extension?\n(no animated GIFs have been added to this form)", "yesno", "question", 0) AddGifExtension = (Answer = 1) END IF AddToRecentList BaseOutputFileName + ".frm" 'Backup existing files FOR i = 1 TO 2 IF i = 1 THEN IF SaveOnlyFrm THEN _CONTINUE ELSE BackupFile$ = BaseOutputFileName + ".bas" END IF END IF IF i = 2 THEN BackupFile$ = BaseOutputFileName + ".frm" IF _FILEEXISTS(BackupFile$) THEN TextFileNum = FREEFILE OPEN BackupFile$ FOR BINARY AS #TextFileNum b$ = SPACE$(LOF(TextFileNum)) GET #TextFileNum, 1, b$ CLOSE #TextFileNum TextFileNum = FREEFILE OPEN BackupFile$ + "-backup" FOR OUTPUT AS #TextFileNum: CLOSE #TextFileNum OPEN BackupFile$ + "-backup" FOR BINARY AS #TextFileNum PUT #TextFileNum, 1, b$ CLOSE #TextFileNum IF i = 1 THEN BackupCode$ = Replace$(b$, CHR$(13) + CHR$(10), CHR$(10), 0, 0) PreserveBackup = TRUE END IF END IF NEXT '.FRM file TextFileNum = FREEFILE OPEN BaseOutputFileName + ".frm" FOR OUTPUT AS #TextFileNum PRINT #TextFileNum, "': This form was generated by" PRINT #TextFileNum, "': InForm GUI engine for QB64-PE - v"; __UI_Version PRINT #TextFileNum, "': Fellippe Heitor, (2016 - 2022) - @FellippeHeitor" PRINT #TextFileNum, "': Samuel Gomes, (2023 - 2024) - @a740g" PRINT #TextFileNum, "': https://github.com/a740g/InForm-PE" PRINT #TextFileNum, "'-----------------------------------------------------------" PRINT #TextFileNum, "SUB __UI_LoadForm" PRINT #TextFileNum, IF LEN(PreviewTexts(PreviewFormID)) > 0 THEN PRINT #TextFileNum, " $EXEICON:'" + PreviewTexts(PreviewFormID) + "'" END IF IF PreviewControls(PreviewFormID).CanResize THEN PRINT #TextFileNum, " $RESIZE:ON" END IF PRINT #TextFileNum, " DIM __UI_NewID AS LONG, __UI_RegisterResult AS LONG" PRINT #TextFileNum, 'First pass is for the main form and containers (frames and menubars). 'Second pass is for the rest of controls. 'Controls named __UI_+anything are ignored, as they are automatically created. DIM ThisPass AS _BYTE, AddContextMenuToForm AS STRING FOR ThisPass = 1 TO 2 FOR i = 1 TO UBOUND(PreviewControls) IF PreviewControls(i).ID > 0 AND PreviewControls(i).Type <> __UI_Type_MenuPanel AND PreviewControls(i).Type <> __UI_Type_Font AND LEN(RTRIM$(PreviewControls(i).Name)) > 0 THEN IF UCASE$(LEFT$(PreviewControls(i).Name, 5)) = "__UI_" THEN GOTO EndOfThisPass 'Internal controls a$ = " __UI_NewID = __UI_NewControl(" SELECT CASE PreviewControls(i).Type CASE __UI_Type_Form: a$ = a$ + "__UI_Type_Form, ": IF ThisPass = 2 THEN GOTO EndOfThisPass CASE __UI_Type_Frame: a$ = a$ + "__UI_Type_Frame, ": IF ThisPass = 2 THEN GOTO EndOfThisPass CASE __UI_Type_Button: a$ = a$ + "__UI_Type_Button, ": IF ThisPass = 1 THEN GOTO EndOfThisPass CASE __UI_Type_Label: a$ = a$ + "__UI_Type_Label, ": IF ThisPass = 1 THEN GOTO EndOfThisPass CASE __UI_Type_CheckBox: a$ = a$ + "__UI_Type_CheckBox, ": IF ThisPass = 1 THEN GOTO EndOfThisPass CASE __UI_Type_RadioButton: a$ = a$ + "__UI_Type_RadioButton, ": IF ThisPass = 1 THEN GOTO EndOfThisPass CASE __UI_Type_TextBox: a$ = a$ + "__UI_Type_TextBox, ": IF ThisPass = 1 THEN GOTO EndOfThisPass CASE __UI_Type_ProgressBar: a$ = a$ + "__UI_Type_ProgressBar, ": IF ThisPass = 1 THEN GOTO EndOfThisPass CASE __UI_Type_ListBox: a$ = a$ + "__UI_Type_ListBox, ": IF ThisPass = 1 THEN GOTO EndOfThisPass CASE __UI_Type_DropdownList: a$ = a$ + "__UI_Type_DropdownList, ": IF ThisPass = 1 THEN GOTO EndOfThisPass CASE __UI_Type_MenuBar: a$ = a$ + "__UI_Type_MenuBar, ": IF ThisPass = 2 THEN GOTO EndOfThisPass CASE __UI_Type_MenuItem: a$ = a$ + "__UI_Type_MenuItem, ": IF ThisPass = 1 THEN GOTO EndOfThisPass CASE __UI_Type_PictureBox: a$ = a$ + "__UI_Type_PictureBox, ": IF ThisPass = 1 THEN GOTO EndOfThisPass CASE __UI_Type_TrackBar: a$ = a$ + "__UI_Type_TrackBar, ": IF ThisPass = 1 THEN GOTO EndOfThisPass CASE __UI_Type_ContextMenu: a$ = a$ + "__UI_Type_ContextMenu, ": IF ThisPass = 2 THEN GOTO EndOfThisPass CASE __UI_Type_ToggleSwitch: a$ = a$ + "__UI_Type_ToggleSwitch, ": IF ThisPass = 1 THEN GOTO EndOfThisPass END SELECT a$ = a$ + CHR$(34) + RTRIM$(PreviewControls(i).Name) + CHR$(34) + "," a$ = a$ + STR$(PreviewControls(i).Width) + "," a$ = a$ + STR$(PreviewControls(i).Height) + "," a$ = a$ + STR$(PreviewControls(i).Left) + "," a$ = a$ + STR$(PreviewControls(i).Top) + "," IF LEN(PreviewParentIDS(i)) > 0 THEN a$ = a$ + " __UI_GetID(" + CHR$(34) + PreviewParentIDS(i) + CHR$(34) + "))" ELSE a$ = a$ + " 0)" END IF PRINT #TextFileNum, a$ PRINT #TextFileNum, " __UI_RegisterResult = 0" IF PreviewControls(i).Type = __UI_Type_ContextMenu THEN PRINT #TextFileNum, IF LEN(AddContextMenuToForm) > 0 AND RTRIM$(PreviewControls(i).Name) = AddContextMenuToForm THEN PRINT #TextFileNum, " Control(__UI_FormID).ContextMenuID = __UI_GetID(" + CHR$(34) + AddContextMenuToForm + CHR$(34) + ")" PRINT #TextFileNum, AddContextMenuToForm = "" END IF _CONTINUE END IF IF PreviewDefaultButtonID = i THEN PRINT #TextFileNum, " __UI_DefaultButtonID = __UI_NewID" END IF IF LEN(PreviewCaptions(i)) > 0 THEN SELECT CASE PreviewControls(i).Type CASE __UI_Type_Form, __UI_Type_Frame, __UI_Type_Button, _ __UI_Type_Label, __UI_Type_CheckBox, __UI_Type_RadioButton, _ __UI_Type_TextBox, __UI_Type_ProgressBar, __UI_Type_MenuBar, _ __UI_Type_MenuItem a$ = " SetCaption __UI_NewID, " + SpecialCharsToEscapeCode$(PreviewCaptions(i)) PRINT #TextFileNum, a$ END SELECT END IF IF LEN(PreviewTips(i)) > 0 THEN a$ = " ToolTip(__UI_NewID) = " + SpecialCharsToEscapeCode$(PreviewTips(i)) PRINT #TextFileNum, a$ END IF IF LEN(PreviewTexts(i)) > 0 THEN SELECT CASE PreviewControls(i).Type CASE __UI_Type_ListBox, __UI_Type_DropdownList DIM TempCaption$, TempText$, ThisItem% DIM findLF& TempText$ = PreviewTexts(i) ThisItem% = 0 DO WHILE LEN(TempText$) ThisItem% = ThisItem% + 1 findLF& = INSTR(TempText$, CHR$(10)) IF findLF& THEN TempCaption$ = LEFT$(TempText$, findLF& - 1) TempText$ = MID$(TempText$, findLF& + 1) ELSE TempCaption$ = TempText$ TempText$ = "" END IF a$ = " AddItem __UI_NewID, " + CHR$(34) + TempCaption$ + CHR$(34) PRINT #TextFileNum, a$ LOOP CASE __UI_Type_PictureBox, __UI_Type_Button, __UI_Type_MenuItem IF AddGifExtension AND PreviewAnimatedGif(i) THEN a$ = " __UI_RegisterResult = GIF_LoadFromFile(__UI_NewID, " + CHR$(34) + PreviewTexts(i) + CHR$(34) + ")" ELSE a$ = " LoadImage Control(__UI_NewID), " + CHR$(34) + PreviewTexts(i) + CHR$(34) END IF PRINT #TextFileNum, a$ IF AddGifExtension AND PreviewAutoPlayGif(i) THEN a$ = " IF __UI_RegisterResult THEN GIF_Play __UI_NewID" PRINT #TextFileNum, a$ END IF CASE ELSE IF PreviewControls(i).Type = __UI_Type_TextBox AND PreviewControls(i).NumericOnly <> 0 THEN 'skip saving Text() for NumericTextBox controls ELSE a$ = " Text(__UI_NewID) = " + SpecialCharsToEscapeCode$(PreviewTexts(i)) PRINT #TextFileNum, a$ END IF END SELECT END IF IF LEN(PreviewMasks(i)) > 0 THEN a$ = " Mask(__UI_NewID) = " + SpecialCharsToEscapeCode$(PreviewMasks(i)) PRINT #TextFileNum, a$ END IF IF PreviewControls(i).TransparentColor > 0 THEN PRINT #TextFileNum, " __UI_ClearColor Control(__UI_NewID).HelperCanvas, " + LTRIM$(STR$(PreviewControls(i).TransparentColor)) + ", -1" END IF IF PreviewControls(i).Stretch = TRUE THEN PRINT #TextFileNum, " Control(__UI_NewID).Stretch = True" END IF 'Fonts IF LEN(PreviewFonts(i)) > 0 THEN FontSetup$ = PreviewFonts(i) 'Parse FontSetup$ into Font variables FindSep = INSTR(FontSetup$, ",") NewFontFile = LEFT$(FontSetup$, FindSep - 1) FontSetup$ = MID$(FontSetup$, FindSep + 1) FontSetup$ = "SetFont(" + CHR$(34) + NewFontFile + CHR$(34) + ", " + FontSetup$ + ")" PRINT #TextFileNum, " Control(__UI_NewID).Font = " + FontSetup$ END IF 'Colors are saved only if they differ from the theme's defaults IF PreviewControls(i).ForeColor > 0 AND PreviewControls(i).ForeColor <> __UI_DefaultColor(PreviewControls(i).Type, 1) THEN PRINT #TextFileNum, " Control(__UI_NewID).ForeColor = _RGB32(" + LTRIM$(STR$(_RED32(PreviewControls(i).ForeColor))) + ", " + LTRIM$(STR$(_GREEN32(PreviewControls(i).ForeColor))) + ", " + LTRIM$(STR$(_BLUE32(PreviewControls(i).ForeColor))) + ")" END IF IF PreviewControls(i).BackColor > 0 AND PreviewControls(i).BackColor <> __UI_DefaultColor(PreviewControls(i).Type, 2) THEN PRINT #TextFileNum, " Control(__UI_NewID).BackColor = _RGB32(" + LTRIM$(STR$(_RED32(PreviewControls(i).BackColor))) + ", " + LTRIM$(STR$(_GREEN32(PreviewControls(i).BackColor))) + ", " + LTRIM$(STR$(_BLUE32(PreviewControls(i).BackColor))) + ")" END IF IF PreviewControls(i).SelectedForeColor > 0 AND PreviewControls(i).SelectedForeColor <> __UI_DefaultColor(PreviewControls(i).Type, 3) THEN PRINT #TextFileNum, " Control(__UI_NewID).SelectedForeColor = _RGB32(" + LTRIM$(STR$(_RED32(PreviewControls(i).SelectedForeColor))) + ", " + LTRIM$(STR$(_GREEN32(PreviewControls(i).SelectedForeColor))) + ", " + LTRIM$(STR$(_BLUE32(PreviewControls(i).SelectedForeColor))) + ")" END IF IF PreviewControls(i).SelectedBackColor > 0 AND PreviewControls(i).SelectedBackColor <> __UI_DefaultColor(PreviewControls(i).Type, 4) THEN PRINT #TextFileNum, " Control(__UI_NewID).SelectedBackColor = _RGB32(" + LTRIM$(STR$(_RED32(PreviewControls(i).SelectedBackColor))) + ", " + LTRIM$(STR$(_GREEN32(PreviewControls(i).SelectedBackColor))) + ", " + LTRIM$(STR$(_BLUE32(PreviewControls(i).SelectedBackColor))) + ")" END IF IF PreviewControls(i).BorderColor > 0 AND PreviewControls(i).BorderColor <> __UI_DefaultColor(PreviewControls(i).Type, 5) THEN PRINT #TextFileNum, " Control(__UI_NewID).BorderColor = _RGB32(" + LTRIM$(STR$(_RED32(PreviewControls(i).BorderColor))) + ", " + LTRIM$(STR$(_GREEN32(PreviewControls(i).BorderColor))) + ", " + LTRIM$(STR$(_BLUE32(PreviewControls(i).BorderColor))) + ")" END IF IF PreviewControls(i).BackStyle = __UI_Transparent THEN PRINT #TextFileNum, " Control(__UI_NewID).BackStyle = __UI_Transparent" END IF IF PreviewControls(i).HasBorder THEN PRINT #TextFileNum, " Control(__UI_NewID).HasBorder = True" ELSE PRINT #TextFileNum, " Control(__UI_NewID).HasBorder = False" END IF IF PreviewControls(i).Align = __UI_Center THEN PRINT #TextFileNum, " Control(__UI_NewID).Align = __UI_Center" ELSEIF PreviewControls(i).Align = __UI_Right THEN PRINT #TextFileNum, " Control(__UI_NewID).Align = __UI_Right" END IF IF PreviewControls(i).VAlign = __UI_Middle THEN PRINT #TextFileNum, " Control(__UI_NewID).VAlign = __UI_Middle" ELSEIF PreviewControls(i).VAlign = __UI_Bottom THEN PRINT #TextFileNum, " Control(__UI_NewID).VAlign = __UI_Bottom" END IF IF PreviewControls(i).PasswordField = TRUE AND PreviewControls(i).Type = __UI_Type_TextBox THEN PRINT #TextFileNum, " Control(__UI_NewID).PasswordField = True" END IF IF PreviewControls(i).Value <> 0 THEN PRINT #TextFileNum, " Control(__UI_NewID).Value = " + LTRIM$(STR$(PreviewControls(i).Value)) END IF IF PreviewControls(i).Min <> 0 THEN PRINT #TextFileNum, " Control(__UI_NewID).Min = " + LTRIM$(STR$(PreviewControls(i).Min)) END IF IF PreviewControls(i).Max <> 0 THEN IF PreviewControls(i).Type <> __UI_Type_ListBox AND _ PreviewControls(i).Type <> __UI_Type_DropdownList THEN PRINT #TextFileNum, " Control(__UI_NewID).Max = " + LTRIM$(STR$(PreviewControls(i).Max)) END IF END IF IF PreviewControls(i).ShowPercentage THEN PRINT #TextFileNum, " Control(__UI_NewID).ShowPercentage = True" END IF IF PreviewControls(i).CanHaveFocus THEN PRINT #TextFileNum, " Control(__UI_NewID).CanHaveFocus = True" END IF IF PreviewControls(i).Disabled THEN PRINT #TextFileNum, " Control(__UI_NewID).Disabled = True" END IF IF PreviewControls(i).Hidden THEN PRINT #TextFileNum, " Control(__UI_NewID).Hidden = True" END IF IF PreviewControls(i).CenteredWindow THEN PRINT #TextFileNum, " Control(__UI_NewID).CenteredWindow = True" END IF IF LEN(PreviewContextMenu(i)) THEN IF PreviewControls(i).Type = __UI_Type_Form THEN AddContextMenuToForm = PreviewContextMenu(i) ELSE PRINT #TextFileNum, " Control(__UI_NewID).ContextMenuID = __UI_GetID(" + CHR$(34) + PreviewContextMenu(i) + CHR$(34) + ")" END IF END IF IF LEN(PreviewKeyCombos(i)) THEN PRINT #TextFileNum, " __UI_RegisterResult = RegisterKeyCombo(" + CHR$(34) + PreviewKeyCombos(i) + CHR$(34) + ", __UI_NewID)" END IF IF PreviewControls(i).Interval THEN PRINT #TextFileNum, " Control(__UI_NewID).Interval = " + LTRIM$(STR$(PreviewControls(i).Interval)) END IF IF PreviewControls(i).MinInterval THEN PRINT #TextFileNum, " Control(__UI_NewID).MinInterval = " + LTRIM$(STR$(PreviewControls(i).MinInterval)) END IF IF PreviewControls(i).WordWrap THEN PRINT #TextFileNum, " Control(__UI_NewID).WordWrap = True" END IF IF PreviewControls(i).CanResize AND PreviewControls(i).Type = __UI_Type_Form THEN PRINT #TextFileNum, " Control(__UI_NewID).CanResize = True" END IF IF PreviewControls(i).Padding > 0 THEN PRINT #TextFileNum, " Control(__UI_NewID).Padding = " + LTRIM$(STR$(PreviewControls(i).Padding)) END IF IF PreviewControls(i).BorderSize > 0 THEN PRINT #TextFileNum, " Control(__UI_NewID).BorderSize = " + LTRIM$(STR$(PreviewControls(i).BorderSize)) END IF IF PreviewControls(i).Encoding > 0 THEN PRINT #TextFileNum, " Control(__UI_NewID).Encoding = " + LTRIM$(STR$(PreviewControls(i).Encoding)) END IF IF PreviewControls(i).NumericOnly = TRUE THEN PRINT #TextFileNum, " Control(__UI_NewID).NumericOnly = True" ELSEIF PreviewControls(i).NumericOnly = __UI_NumericWithBounds THEN PRINT #TextFileNum, " Control(__UI_NewID).NumericOnly = __UI_NumericWithBounds" END IF IF PreviewControls(i).BulletStyle > 0 THEN SELECT CASE PreviewControls(i).BulletStyle CASE __UI_Bullet PRINT #TextFileNum, " Control(__UI_NewID).BulletStyle = __UI_Bullet" END SELECT END IF IF PreviewControls(i).AutoScroll THEN PRINT #TextFileNum, " Control(__UI_NewID).AutoScroll = True" END IF IF PreviewControls(i).AutoSize THEN PRINT #TextFileNum, " Control(__UI_NewID).AutoSize = True" END IF PRINT #TextFileNum, END IF EndOfThisPass: NEXT NEXT ThisPass 'Save control bindings DIM BindingsSection AS _BYTE DIM BindingDone(0 TO UBOUND(PreviewControls)) AS _BYTE FOR i = 1 TO UBOUND(PreviewControls) IF LEN(PreviewBoundTo(i)) > 0 AND BindingDone(i) = FALSE THEN IF BindingsSection = FALSE THEN PRINT #TextFileNum, " 'Control bindings:" BindingsSection = TRUE END IF BindingDone(i) = TRUE PRINT #TextFileNum, " __UI_Bind __UI_GetID(" + CHR$(34); PRINT #TextFileNum, RTRIM$(__UI_TrimAt0$(PreviewControls(i).Name)) + CHR$(34) + "), "; PRINT #TextFileNum, "__UI_GetID(" + CHR$(34); PRINT #TextFileNum, PreviewBoundTo(i) + CHR$(34) + "), "; PRINT #TextFileNum, CHR$(34) + PreviewBoundProperty(i) + CHR$(34) + ", "; FOR j = 1 TO UBOUND(PreviewControls) IF PreviewBoundTo(j) = RTRIM$(__UI_TrimAt0$(PreviewControls(i).Name)) THEN BindingDone(j) = TRUE PRINT #TextFileNum, CHR$(34) + PreviewBoundProperty(j) + CHR$(34) EXIT FOR END IF NEXT END IF NEXT PRINT #TextFileNum, "END SUB" PRINT #TextFileNum, PRINT #TextFileNum, "SUB __UI_AssignIDs" FOR i = 1 TO UBOUND(PreviewControls) IF PreviewControls(i).ID > 0 AND PreviewControls(i).Type <> __UI_Type_Font AND PreviewControls(i).Type <> __UI_Type_MenuPanel THEN PRINT #TextFileNum, " " + RTRIM$(__UI_TrimAt0$(PreviewControls(i).Name)) + " = __UI_GetID(" + CHR$(34) + RTRIM$(__UI_TrimAt0$(PreviewControls(i).Name)) + CHR$(34) + ")" END IF NEXT PRINT #TextFileNum, "END SUB" CLOSE #TextFileNum '.BAS file IF NOT SaveOnlyFrm THEN IF PreserveBackup THEN DIM insertionPoint AS LONG, endPoint AS LONG, firstCASE AS LONG DIM insertionPoint2 AS LONG, endPoint2 AS LONG DIM temp$, thisBlock$, addedItems$, indenting AS LONG DIM checkConditionResult AS _BYTE, controlToRemove$, found AS _BYTE DIM charSep$ charSep$ = " =<>+-/\^:;,*()'" + CHR$(10) 'Check which controls got removed/renamed since this form was loaded IF LEN(InitialControlSet) THEN insertionPoint2 = INSTR(InitialControlSet, CHR$(10)) DO endPoint2 = INSTR(insertionPoint2 + 1, InitialControlSet, CHR$(10)) thisBlock$ = MID$(InitialControlSet, insertionPoint2 + 1, endPoint2 - insertionPoint2 - 1) temp$ = thisBlock$ controlToRemove$ = "" IF INSTR(temp$, CHR$(11)) THEN 'control was in the initial state but got renamed controlToRemove$ = LEFT$(temp$, INSTR(temp$, CHR$(11)) - 1) temp$ = MID$(temp$, INSTR(temp$, CHR$(11)) + 1) ELSE controlToRemove$ = temp$ END IF found = FALSE FOR i = 1 TO UBOUND(PreviewControls) IF PreviewControls(i).ID > 0 AND PreviewControls(i).Type <> __UI_Type_Font AND PreviewControls(i).Type <> __UI_Type_MenuPanel THEN IF LCASE$(RTRIM$(PreviewControls(i).Name)) = LCASE$(temp$) THEN found = TRUE EXIT FOR END IF END IF NEXT IF found THEN IF INSTR(thisBlock$, CHR$(11)) THEN 'controlToRemove$ was in the initial state but got renamed to temp$ insertionPoint = INSTR(BackupCode$, controlToRemove$) DO WHILE insertionPoint > 0 found = TRUE IF OutsideQuotes(BackupCode$, insertionPoint) THEN a$ = MID$(BackupCode$, insertionPoint - 1, 1) b$ = MID$(BackupCode$, insertionPoint + LEN(controlToRemove$), 1) IF LEN(a$) > 0 AND INSTR(charSep$, a$) = 0 THEN found = FALSE IF LEN(b$) > 0 AND INSTR(charSep$, b$) = 0 THEN found = FALSE IF found THEN BackupCode$ = LEFT$(BackupCode$, insertionPoint - 1) + temp$ + MID$(BackupCode$, insertionPoint + LEN(controlToRemove$)) END IF END IF insertionPoint = INSTR(insertionPoint + 1, BackupCode$, controlToRemove$) LOOP END IF ELSE 'comment next controlToRemove$ occurrences, since the control no longer exists insertionPoint = INSTR(BackupCode$, controlToRemove$) DO WHILE insertionPoint > 0 found = TRUE COLOR 8: PRINT insertionPoint, MID$(BackupCode$, insertionPoint, 30) IF OutsideQuotes(BackupCode$, insertionPoint) THEN a$ = MID$(BackupCode$, insertionPoint - 1, 1) b$ = MID$(BackupCode$, insertionPoint + LEN(controlToRemove$), 1) IF LEN(a$) > 0 AND INSTR(charSep$, a$) = 0 THEN found = FALSE IF LEN(b$) > 0 AND INSTR(charSep$, b$) = 0 THEN found = FALSE IF found THEN endPoint = INSTR(insertionPoint, BackupCode$, CHR$(10)) IF endPoint = 0 THEN endPoint = LEN(BackupCode$) temp$ = " '<-- " + CHR$(34) + controlToRemove$ + CHR$(34) + " deleted from Form on " + DATE$ BackupCode$ = LEFT$(BackupCode$, endPoint - 1) + temp$ + MID$(BackupCode$, endPoint) COLOR 14: PRINT insertionPoint, MID$(BackupCode$, insertionPoint, 30) END IF END IF SLEEP insertionPoint = INSTR(insertionPoint + 1, BackupCode$, controlToRemove$) LOOP END IF insertionPoint2 = endPoint2 + 1 LOOP WHILE insertionPoint2 < LEN(InitialControlSet) END IF 'Find insertion points in BackupCode$ for eventual new controls '1- Controls' IDs addedItems$ = "" FOR i = 1 TO UBOUND(PreviewControls) IF PreviewControls(i).ID > 0 AND PreviewControls(i).Type <> __UI_Type_Font AND PreviewControls(i).Type <> __UI_Type_MenuPanel THEN temp$ = "DIM SHARED " + RTRIM$(__UI_TrimAt0$(PreviewControls(i).Name)) + " AS LONG" IF INSTR(BackupCode$, temp$) = 0 THEN addedItems$ = addedItems$ + temp$ + CHR$(10) END IF END IF NEXT insertionPoint = INSTR(BackupCode$, "DIM SHARED ") IF LEN(addedItems$) THEN BackupCode$ = LEFT$(BackupCode$, insertionPoint - 1) + addedItems$ + MID$(BackupCode$, insertionPoint) END IF '2- Remove "control deleted" comments, if any has been readded. FOR i = 1 TO UBOUND(PreviewControls) IF PreviewControls(i).ID > 0 AND PreviewControls(i).Type <> __UI_Type_Font AND PreviewControls(i).Type <> __UI_Type_MenuPanel THEN temp$ = " '<-- " + CHR$(34) + RTRIM$(__UI_TrimAt0$(PreviewControls(i).Name)) + CHR$(34) + " deleted from Form on" insertionPoint = INSTR(BackupCode$, temp$) DO WHILE insertionPoint > 0 endPoint = INSTR(insertionPoint, BackupCode$, CHR$(10)) BackupCode$ = LEFT$(BackupCode$, insertionPoint - 1) + MID$(BackupCode$, endPoint) insertionPoint = INSTR(BackupCode$, temp$) LOOP END IF NEXT '3- Even procedures FOR i = 4 TO 13 SELECT EVERYCASE i CASE 4: temp$ = "SUB __UI_Click (id AS LONG)" CASE 5: temp$ = "SUB __UI_MouseEnter (id AS LONG)" CASE 6: temp$ = "SUB __UI_MouseLeave (id AS LONG)" CASE 7: temp$ = "SUB __UI_FocusIn (id AS LONG)" CASE 8: temp$ = "SUB __UI_FocusOut (id AS LONG)" CASE 9: temp$ = "SUB __UI_MouseDown (id AS LONG)" CASE 10: temp$ = "SUB __UI_MouseUp (id AS LONG)" CASE 11: temp$ = "SUB __UI_KeyPress (id AS LONG)" CASE 12: temp$ = "SUB __UI_TextChanged (id AS LONG)" CASE 13: temp$ = "SUB __UI_ValueChanged (id AS LONG)" CASE 4 TO 13 insertionPoint = INSTR(BackupCode$, temp$) endPoint = INSTR(insertionPoint, BackupCode$, "END SUB" + CHR$(10)) + 8 thisBlock$ = MID$(BackupCode$, insertionPoint, endPoint - insertionPoint) IF INSTR(thisBlock$, "SELECT CASE id") THEN firstCASE = INSTR(thisBlock$, " CASE ") IF firstCASE THEN firstCASE = _INSTRREV(firstCASE, thisBlock$, CHR$(10)) indenting = INSTR(firstCASE, thisBlock$, "CASE ") - firstCASE - 1 ELSE indenting = 8 firstCASE = _INSTRREV(INSTR(thisBlock$, "END SELECT"), thisBlock$, CHR$(10)) END IF addedItems$ = "" FOR Dummy = 1 TO UBOUND(PreviewControls) GOSUB checkCondition IF checkConditionResult THEN IF INSTR(thisBlock$, " CASE " + RTRIM$(PreviewControls(Dummy).Name) + CHR$(10)) = 0 AND INSTR(thisBlock$, " CASE " + RTRIM$(PreviewControls(Dummy).Name) + " '<-- " + CHR$(34) + RTRIM$(PreviewControls(Dummy).Name) + CHR$(34) + " deleted from Form on ") = 0 THEN addedItems$ = addedItems$ + SPACE$(indenting) + "CASE " + RTRIM$(PreviewControls(Dummy).Name) + CHR$(10) + CHR$(10) ELSEIF INSTR(thisBlock$, " CASE " + RTRIM$(PreviewControls(Dummy).Name) + " '<-- " + CHR$(34) + RTRIM$(PreviewControls(Dummy).Name) + CHR$(34) + " deleted from Form on ") > 0 THEN thisBlock$ = LEFT$(thisBlock$, INSTR(thisBlock$, " CASE " + RTRIM$(PreviewControls(Dummy).Name) + " '<-- " + CHR$(34)) + 5 + LEN(RTRIM$(PreviewControls(Dummy).Name))) + MID$(thisBlock$, INSTR(INSTR(thisBlock$, " CASE " + RTRIM$(PreviewControls(Dummy).Name) + " '<-- " + CHR$(34) + RTRIM$(PreviewControls(Dummy).Name) + CHR$(34) + " deleted from Form on "), thisBlock$, CHR$(10))) END IF END IF NEXT IF LEN(addedItems$) THEN thisBlock$ = LEFT$(thisBlock$, firstCASE) + addedItems$ + MID$(thisBlock$, firstCASE + 1) END IF BackupCode$ = LEFT$(BackupCode$, insertionPoint - 1) + thisBlock$ + MID$(BackupCode$, endPoint) END IF END SELECT NEXT OPEN BaseOutputFileName + ".bas" FOR OUTPUT AS #TextFileNum: CLOSE #TextFileNum OPEN BaseOutputFileName + ".bas" FOR BINARY AS #TextFileNum PUT #TextFileNum, , BackupCode$ ELSE OPEN BaseOutputFileName + ".bas" FOR OUTPUT AS #TextFileNum PRINT #TextFileNum, "': This program uses" PRINT #TextFileNum, "': InForm GUI engine for QB64-PE - v"; __UI_Version PRINT #TextFileNum, "': Fellippe Heitor, (2016 - 2022) - @FellippeHeitor" PRINT #TextFileNum, "': Samuel Gomes, (2023 - 2024) - @a740g" PRINT #TextFileNum, "': https://github.com/a740g/InForm-PE" PRINT #TextFileNum, "'-----------------------------------------------------------" PRINT #TextFileNum, PRINT #TextFileNum, "': Controls' IDs: ------------------------------------------------------------------" FOR i = 1 TO UBOUND(PreviewControls) IF PreviewControls(i).ID > 0 AND PreviewControls(i).Type <> __UI_Type_Font AND PreviewControls(i).Type <> __UI_Type_MenuPanel THEN PRINT #TextFileNum, "DIM SHARED " + RTRIM$(__UI_TrimAt0$(PreviewControls(i).Name)) + " AS LONG" END IF NEXT PRINT #TextFileNum, PRINT #TextFileNum, "': External modules: ---------------------------------------------------------------" IF AddGifExtension THEN PRINT #TextFileNum, "'$INCLUDE:'InForm/extensions/GIFPlay.bi'" END IF PRINT #TextFileNum, "'$INCLUDE:'InForm\InForm.bi'" PRINT #TextFileNum, "'$INCLUDE:'InForm\xp.uitheme'" PRINT #TextFileNum, "'$INCLUDE:'" + MID$(BaseOutputFileName, LEN(CurrentPath$) + 2) + ".frm'" IF AddGifExtension THEN PRINT #TextFileNum, "'$INCLUDE:'InForm/extensions/GIFPlay.bas'" END IF PRINT #TextFileNum, PRINT #TextFileNum, "': Event procedures: ---------------------------------------------------------------" FOR i = 0 TO 14 SELECT EVERYCASE i CASE 0: PRINT #TextFileNum, "SUB __UI_BeforeInit" CASE 1: PRINT #TextFileNum, "SUB __UI_OnLoad" CASE 2 PRINT #TextFileNum, "SUB __UI_BeforeUpdateDisplay" PRINT #TextFileNum, " 'This event occurs at approximately 60 frames per second." PRINT #TextFileNum, " 'You can change the update frequency by calling SetFrameRate DesiredRate%" CASE 3 PRINT #TextFileNum, "SUB __UI_BeforeUnload" PRINT #TextFileNum, " 'If you set __UI_UnloadSignal = False here you can" PRINT #TextFileNum, " 'cancel the user's request to close." CASE 4: PRINT #TextFileNum, "SUB __UI_Click (id AS LONG)" CASE 5: PRINT #TextFileNum, "SUB __UI_MouseEnter (id AS LONG)" CASE 6: PRINT #TextFileNum, "SUB __UI_MouseLeave (id AS LONG)" CASE 7: PRINT #TextFileNum, "SUB __UI_FocusIn (id AS LONG)" CASE 8 PRINT #TextFileNum, "SUB __UI_FocusOut (id AS LONG)" PRINT #TextFileNum, " 'This event occurs right before a control loses focus." PRINT #TextFileNum, " 'To prevent a control from losing focus, set __UI_KeepFocus = True below." CASE 9: PRINT #TextFileNum, "SUB __UI_MouseDown (id AS LONG)" CASE 10: PRINT #TextFileNum, "SUB __UI_MouseUp (id AS LONG)" CASE 11 PRINT #TextFileNum, "SUB __UI_KeyPress (id AS LONG)" PRINT #TextFileNum, " 'When this event is fired, __UI_KeyHit will contain the code of the key hit." PRINT #TextFileNum, " 'You can change it and even cancel it by making it = 0" CASE 12: PRINT #TextFileNum, "SUB __UI_TextChanged (id AS LONG)" CASE 13: PRINT #TextFileNum, "SUB __UI_ValueChanged (id AS LONG)" CASE 14: PRINT #TextFileNum, "SUB __UI_FormResized" CASE 0, 3, 14 PRINT #TextFileNum, CASE 1 IF PreviewDefaultButtonID > 0 THEN PRINT #TextFileNum, " __UI_DefaultButtonID = " + RTRIM$(__UI_TrimAt0$(PreviewControls(PreviewDefaultButtonID).Name)) ELSE PRINT #TextFileNum, END IF CASE 2 IF AddGifExtension = TRUE AND TotalGifLoaded > 0 THEN PRINT #TextFileNum, PRINT #TextFileNum, " 'The lines below ensure your GIFs will display properly;" PRINT #TextFileNum, " 'Please refer to the documentation in 'docs/GIFPlay.md'" FOR Dummy = 1 TO UBOUND(PreviewControls) IF PreviewAnimatedGif(Dummy) THEN PRINT #TextFileNum, " GIF_Draw " + RTRIM$(PreviewControls(Dummy).Name) END IF NEXT ELSE PRINT #TextFileNum, END IF CASE 4 TO 6, 9, 10 'All controls except for Menu panels, and internal context menus PRINT #TextFileNum, " SELECT CASE id" FOR Dummy = 1 TO UBOUND(PreviewControls) IF PreviewControls(Dummy).ID > 0 AND PreviewControls(Dummy).Type <> __UI_Type_Font AND PreviewControls(Dummy).Type <> __UI_Type_ContextMenu THEN PRINT #TextFileNum, " CASE " + RTRIM$(PreviewControls(Dummy).Name) PRINT #TextFileNum, END IF NEXT PRINT #TextFileNum, " END SELECT" CASE 7, 8, 11 'Controls that can have focus only PRINT #TextFileNum, " SELECT CASE id" FOR Dummy = 1 TO UBOUND(PreviewControls) IF PreviewControls(Dummy).ID > 0 AND PreviewControls(Dummy).CanHaveFocus THEN PRINT #TextFileNum, " CASE " + RTRIM$(PreviewControls(Dummy).Name) PRINT #TextFileNum, END IF NEXT PRINT #TextFileNum, " END SELECT" CASE 12 'Text boxes PRINT #TextFileNum, " SELECT CASE id" FOR Dummy = 1 TO UBOUND(PreviewControls) IF PreviewControls(Dummy).ID > 0 AND (PreviewControls(Dummy).Type = __UI_Type_TextBox) THEN PRINT #TextFileNum, " CASE " + RTRIM$(PreviewControls(Dummy).Name) PRINT #TextFileNum, END IF NEXT PRINT #TextFileNum, " END SELECT" CASE 13 'Dropdown list, List box, Track bar, ToggleSwitch, CheckBox PRINT #TextFileNum, " SELECT CASE id" FOR Dummy = 1 TO UBOUND(PreviewControls) IF PreviewControls(Dummy).ID > 0 AND (PreviewControls(Dummy).Type = __UI_Type_ListBox OR PreviewControls(Dummy).Type = __UI_Type_DropdownList OR PreviewControls(Dummy).Type = __UI_Type_TrackBar OR PreviewControls(Dummy).Type = __UI_Type_ToggleSwitch OR PreviewControls(Dummy).Type = __UI_Type_CheckBox OR PreviewControls(Dummy).Type = __UI_Type_RadioButton) THEN PRINT #TextFileNum, " CASE " + RTRIM$(PreviewControls(Dummy).Name) PRINT #TextFileNum, END IF NEXT PRINT #TextFileNum, " END SELECT" END SELECT PRINT #TextFileNum, "END SUB" PRINT #TextFileNum, NEXT END IF PRINT #TextFileNum, "'$INCLUDE:'InForm/InForm.ui'" CLOSE #TextFileNum END IF AddToRecentList BaseOutputFileName + ".frm" b$ = "Exporting successful. Files output:" + CHR$(10) IF NOT SaveOnlyFrm THEN b$ = b$ + " " + MID$(BaseOutputFileName, LEN(CurrentPath$) + 2) + ".bas" + CHR$(10) b$ = b$ + " " + MID$(BaseOutputFileName, LEN(CurrentPath$) + 2) + ".frm" IF ExitToQB64 AND NOT SaveOnlyFrm THEN IF _FILEEXISTS(QB64_EXE_PATH) THEN b$ = b$ + CHR$(10) + CHR$(10) + "Exit to " + QB64_DISPLAY + "?" _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, b$, "yesno", "question", 0) IF Answer = 0 THEN Edited = FALSE: EXIT SUB IF _FILEEXISTS("InForm/UiEditorPreview.frmbin") THEN KILL "InForm/UiEditorPreview.frmbin" SHELL _DONTWAIT QB64_EXE_PATH + " " + QuotedFilename$(BaseOutputFileName + ".bas") SYSTEM ELSE b$ = b$ + CHR$(10) + CHR$(10) + "Close the editor?" _DELAY 0.2: Answer = _MESSAGEBOX(UiEditorTitle$, b$, "yesno", "question", 0) IF Answer = 0 THEN Edited = FALSE: EXIT SUB END IF ELSE MessageBox b$, UiEditorTitle$, MsgBox_Information Edited = FALSE END IF EXIT SUB checkCondition: checkConditionResult = FALSE SELECT CASE i CASE 4 TO 6, 9, 10 'All controls except for Menu panels, and internal context menus IF PreviewControls(Dummy).ID > 0 AND PreviewControls(Dummy).Type <> __UI_Type_Font AND PreviewControls(Dummy).Type <> __UI_Type_ContextMenu THEN checkConditionResult = TRUE END IF CASE 7, 8, 11 'Controls that can have focus only IF PreviewControls(Dummy).ID > 0 AND PreviewControls(Dummy).CanHaveFocus THEN checkConditionResult = TRUE END IF CASE 12 'Text boxes IF PreviewControls(Dummy).ID > 0 AND (PreviewControls(Dummy).Type = __UI_Type_TextBox) THEN checkConditionResult = TRUE END IF CASE 13 'Dropdown list, List box, Track bar, ToggleSwitch, CheckBox IF PreviewControls(Dummy).ID > 0 AND (PreviewControls(Dummy).Type = __UI_Type_ListBox OR PreviewControls(Dummy).Type = __UI_Type_DropdownList OR PreviewControls(Dummy).Type = __UI_Type_TrackBar OR PreviewControls(Dummy).Type = __UI_Type_ToggleSwitch OR PreviewControls(Dummy).Type = __UI_Type_CheckBox OR PreviewControls(Dummy).Type = __UI_Type_RadioButton) THEN checkConditionResult = TRUE END IF END SELECT RETURN END SUB $IF WIN THEN SUB LoadFontList DIM hKey AS _OFFSET DIM Ky AS _OFFSET DIM SubKey AS STRING DIM Value AS STRING DIM bData AS STRING DIM dwType AS _UNSIGNED LONG DIM numBytes AS _UNSIGNED LONG DIM numTchars AS _UNSIGNED LONG DIM l AS LONG DIM dwIndex AS _UNSIGNED LONG hKey = hKey 'no warnings on my watch Ky = HKEY_LOCAL_MACHINE SubKey = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" + CHR$(0) Value = SPACE$(261) 'ANSI Value name limit 260 chars + 1 null bData = SPACE$(&H7FFF) 'arbitrary HasFontList = TRUE AddItem FontList, "Built-in VGA font" TotalFontsFound = 1 l = RegOpenKeyExA(Ky, _OFFSET(SubKey), 0, KEY_READ, _OFFSET(hKey)) IF l THEN 'HasFontList = False EXIT SUB ELSE dwIndex = 0 DO numBytes = LEN(bData) numTchars = LEN(Value) l = RegEnumValueA(hKey, dwIndex, _OFFSET(Value), _OFFSET(numTchars), 0, _OFFSET(dwType), _OFFSET(bData), _OFFSET(numBytes)) IF l THEN IF l <> ERROR_NO_MORE_ITEMS THEN 'HasFontList = False EXIT SUB END IF EXIT DO ELSE IF UCASE$(RIGHT$(formatData(dwType, numBytes, bData), 4)) = ".TTF" OR UCASE$(RIGHT$(formatData(dwType, numBytes, bData), 4)) = ".OTF" THEN TotalFontsFound = TotalFontsFound + 1 IF TotalFontsFound > UBOUND(FontFile) THEN REDIM _PRESERVE FontFile(TotalFontsFound) AS STRING END IF DIM tempName$ tempName$ = LEFT$(Value, numTchars) IF RIGHT$(tempName$, 11) = " (TrueType)" THEN tempName$ = LEFT$(tempName$, LEN(tempName$) - 11) END IF AddItem FontList, tempName$ FontFile(TotalFontsFound) = formatData(dwType, numBytes, bData) END IF END IF dwIndex = dwIndex + 1 LOOP l = RegCloseKey(hKey) END IF FOR l = 8 TO 120 AddItem FontSizeList, LTRIM$(STR$(l)) NEXT END SUB FUNCTION whatType$ (dwType AS _UNSIGNED LONG) SELECT CASE dwType CASE REG_SZ: whatType = "REG_SZ" CASE REG_EXPAND_SZ: whatType = "REG_EXPAND_SZ" CASE REG_BINARY: whatType = "REG_BINARY" CASE REG_DWORD: whatType = "REG_DWORD" CASE REG_DWORD_BIG_ENDIAN: whatType = "REG_DWORD_BIG_ENDIAN" CASE REG_LINK: whatType = "REG_LINK" CASE REG_MULTI_SZ: whatType = "REG_MULTI_SZ" CASE REG_RESOURCE_LIST: whatType = "REG_RESOURCE_LIST" CASE REG_FULL_RESOURCE_DESCRIPTOR: whatType = "REG_FULL_RESOURCE_DESCRIPTOR" CASE REG_RESOURCE_REQUIREMENTS_LIST: whatType = "REG_RESOURCE_REQUIREMENTS_LIST" CASE REG_QWORD: whatType = "REG_QWORD" CASE ELSE: whatType = "unknown" END SELECT END FUNCTION FUNCTION whatKey$ (hKey AS _OFFSET) hKey = hKey 'the lengths I'll go not to have warnings.... SELECT CASE hKey CASE HKEY_CLASSES_ROOT: whatKey = "HKEY_CLASSES_ROOT" CASE HKEY_CURRENT_USER: whatKey = "HKEY_CURRENT_USER" CASE HKEY_LOCAL_MACHINE: whatKey = "HKEY_LOCAL_MACHINE" CASE HKEY_USERS: whatKey = "HKEY_USERS" CASE HKEY_PERFORMANCE_DATA: whatKey = "HKEY_PERFORMANCE_DATA" CASE HKEY_CURRENT_CONFIG: whatKey = "HKEY_CURRENT_CONFIG" CASE HKEY_DYN_DATA: whatKey = "HKEY_DYN_DATA" END SELECT END FUNCTION FUNCTION formatData$ (dwType AS _UNSIGNED LONG, numBytes AS _UNSIGNED LONG, bData AS STRING) DIM t AS STRING DIM ul AS _UNSIGNED LONG DIM b AS _UNSIGNED _BYTE SELECT CASE dwType CASE REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ formatData = LEFT$(bData, numBytes - 1) CASE REG_DWORD t = LCASE$(HEX$(CVL(LEFT$(bData, 4)))) formatData = "0x" + STRING$(8 - LEN(t), &H30) + t CASE ELSE IF numBytes THEN b = ASC(LEFT$(bData, 1)) IF b < &H10 THEN t = t + "0" + LCASE$(HEX$(b)) ELSE t = t + LCASE$(HEX$(b)) END IF END IF FOR ul = 2 TO numBytes b = ASC(MID$(bData, ul, 1)) IF b < &H10 THEN t = t + " 0" + LCASE$(HEX$(b)) ELSE t = t + " " + LCASE$(HEX$(b)) END IF NEXT formatData = t END SELECT END FUNCTION $ELSE SUB LoadFontList DIM TotalFiles%, FontPath$, i AS LONG, ThisFont$, depth%, x AS INTEGER FontPath$ = "/usr/share/fonts" depth% = 2 IF INSTR(_OS$, "MAC") > 0 THEN FontPath$ = "/Library/Fonts" depth% = 1 END IF Text(FontList) = idezfilelist$(FontPath$, 1, depth%, TotalFiles%) Control(FontList).Max = TotalFiles% Control(FontList).LastVisibleItem = 0 'Reset it so it's recalculated TotalFontsFound = TotalFiles% FOR i = TotalFiles% TO 1 STEP -1 ThisFont$ = GetItem(FontList, i) IF UCASE$(RIGHT$(ThisFont$, 4)) = ".TTF" OR UCASE$(RIGHT$(ThisFont$, 4)) = ".TTC" OR UCASE$(RIGHT$(ThisFont$, 4)) = ".OTF" THEN 'Valid font ELSE RemoveItem FontList, i TotalFontsFound = TotalFontsFound - 1 END IF NEXT TotalFontsFound = TotalFontsFound + 1 Text(FontList) = "Built-in VGA font" + CHR$(10) + Text(FontList) Control(FontList).Max = TotalFontsFound REDIM FontFile(TotalFontsFound) AS STRING IF INSTR(_OS$, "MAC") = 0 THEN FontPath$ = "" ELSE FontPath$ = FontPath$ + "/" FOR i = 3 TO TotalFontsFound ThisFont$ = GetItem(FontList, i) FontFile(i) = FontPath$ + GetItem(FontList, i) ThisFont$ = LEFT$(ThisFont$, LEN(ThisFont$) - 4) 'Remove extension from list FOR x = LEN(ThisFont$) TO 1 STEP -1 IF ASC(ThisFont$, x) = 47 THEN '"/" ThisFont$ = MID$(ThisFont$, x + 1) EXIT FOR END IF NEXT ReplaceItem FontList, i, ThisFont$ NEXT FOR i = 8 TO 120 AddItem FontSizeList, LTRIM$(STR$(i)) NEXT HasFontList = True END SUB $END IF 'FUNCTION idezfilelist$ and idezpathlist$ (and helper functions) were 'adapted from ide_methods.bas (QB64): FUNCTION idezfilelist$ (path$, method, depth%, TotalFound AS INTEGER) 'method0=*.frm and *.frmbin, method1=*.* DIM sep AS STRING * 1, filelist$, a$, dummy% sep = CHR$(10) TotalFound = 0 dummy% = depth% $IF WIN THEN OPEN "opendlgfiles.dat" FOR OUTPUT AS #150: CLOSE #150 IF method = 0 THEN SHELL _HIDE "dir /b /ON /A-D " + QuotedFilename$(path$) + "\*.frm >opendlgfiles.dat" IF method = 1 THEN SHELL _HIDE "dir /b /ON /A-D " + QuotedFilename$(path$) + "\*.* >opendlgfiles.dat" filelist$ = "" OPEN "opendlgfiles.dat" FOR INPUT AS #150 DO UNTIL EOF(150) LINE INPUT #150, a$ IF LEN(a$) THEN 'skip blank entries IF filelist$ = "" THEN filelist$ = a$ ELSE filelist$ = filelist$ + sep + a$ TotalFound = TotalFound + 1 END IF LOOP CLOSE #150 KILL "opendlgfiles.dat" idezfilelist$ = filelist$ EXIT FUNCTION $ELSE filelist$ = "" DIM i AS INTEGER, x AS INTEGER, a2$ FOR i = 1 TO 2 - method OPEN "opendlgfiles.dat" FOR OUTPUT AS #150: CLOSE #150 IF method = 0 THEN IF i = 1 THEN SHELL _HIDE "find " + QuotedFilename$(path$) + " -maxdepth " + LTRIM$(STR$(depth%)) + " -type f -name " + CHR$(34) + "*.frm*" + CHR$(34) + " >opendlgfiles.dat" IF i = 2 THEN SHELL _HIDE "find " + QuotedFilename$(path$) + " -maxdepth " + LTRIM$(STR$(depth%)) + " -type f -name " + CHR$(34) + "*.FRM*" + CHR$(34) + " >opendlgfiles.dat" END IF IF method = 1 THEN IF i = 1 THEN SHELL _HIDE "find " + QuotedFilename$(path$) + " -maxdepth " + LTRIM$(STR$(depth%)) + " -type f -name " + CHR$(34) + "*" + CHR$(34) + " >opendlgfiles.dat" END IF OPEN "opendlgfiles.dat" FOR INPUT AS #150 DO UNTIL EOF(150) LINE INPUT #150, a$ IF LEN(a$) = 0 THEN EXIT DO IF depth% = 1 THEN FOR x = LEN(a$) TO 1 STEP -1 a2$ = MID$(a$, x, 1) IF a2$ = "/" THEN a$ = RIGHT$(a$, LEN(a$) - x) EXIT FOR END IF NEXT END IF IF filelist$ = "" THEN filelist$ = a$ ELSE filelist$ = filelist$ + sep + a$ TotalFound = TotalFound + 1 LOOP CLOSE #150 NEXT KILL "opendlgfiles.dat" idezfilelist$ = filelist$ EXIT FUNCTION $END IF END FUNCTION FUNCTION idezpathlist$ (path$, TotalFound%) DIM sep AS STRING * 1, a$, pathlist$, c AS INTEGER, x AS INTEGER, b$ DIM i AS INTEGER sep = CHR$(10) TotalFound% = 0 $IF WIN THEN OPEN "opendlgfiles.dat" FOR OUTPUT AS #150: CLOSE #150 a$ = "": IF RIGHT$(path$, 1) = ":" THEN a$ = "\" 'use a \ after a drive letter SHELL _HIDE "dir /b /ON /AD " + QuotedFilename$(path$ + a$) + " >opendlgfiles.dat" pathlist$ = "" OPEN "opendlgfiles.dat" FOR INPUT AS #150 DO UNTIL EOF(150) LINE INPUT #150, a$ IF pathlist$ = "" THEN pathlist$ = a$ ELSE pathlist$ = pathlist$ + sep + a$ TotalFound% = TotalFound% + 1 LOOP CLOSE #150 KILL "opendlgfiles.dat" 'count instances of / or \ c = 0 FOR x = 1 TO LEN(path$) b$ = MID$(path$, x, 1) IF b$ = PathSep$ THEN c = c + 1 NEXT IF c >= 1 THEN IF LEN(pathlist$) THEN pathlist$ = ".." + sep + pathlist$ ELSE pathlist$ = ".." TotalFound% = TotalFound% + 1 END IF 'add drive paths FOR i = 0 TO 25 IF LEN(pathlist$) THEN pathlist$ = pathlist$ + sep pathlist$ = pathlist$ + CHR$(65 + i) + ":" TotalFound% = TotalFound% + 1 NEXT idezpathlist$ = pathlist$ EXIT FUNCTION $ELSE pathlist$ = "" DIM a2$ OPEN "opendlgfiles.dat" FOR OUTPUT AS #150: CLOSE #150 SHELL _HIDE "find " + QuotedFilename$(path$) + " -maxdepth 1 -mindepth 1 -type d >opendlgfiles.dat" OPEN "opendlgfiles.dat" FOR INPUT AS #150 DO UNTIL EOF(150) LINE INPUT #150, a$ IF LEN(a$) = 0 THEN EXIT DO FOR x = LEN(a$) TO 1 STEP -1 a2$ = MID$(a$, x, 1) IF a2$ = "/" THEN a$ = RIGHT$(a$, LEN(a$) - x) EXIT FOR END IF NEXT IF pathlist$ = "" THEN pathlist$ = a$ ELSE pathlist$ = pathlist$ + sep + a$ TotalFound% = TotalFound% + 1 LOOP CLOSE #150 KILL "opendlgfiles.dat" IF path$ <> "/" THEN a$ = ".." IF pathlist$ = "" THEN pathlist$ = a$ ELSE pathlist$ = a$ + sep + pathlist$ TotalFound% = TotalFound% + 1 END IF idezpathlist$ = pathlist$ EXIT FUNCTION $END IF END FUNCTION FUNCTION idezchangepath$ (path$, newpath$) DIM x AS INTEGER, a$ idezchangepath$ = path$ 'default (for unsuccessful cases) $IF WIN THEN 'go back a path IF newpath$ = ".." THEN FOR x = LEN(path$) TO 1 STEP -1 a$ = MID$(path$, x, 1) IF a$ = "\" THEN idezchangepath$ = LEFT$(path$, x - 1) EXIT FOR END IF NEXT EXIT FUNCTION END IF 'change drive IF LEN(newpath$) = 2 AND RIGHT$(newpath$, 1) = ":" THEN idezchangepath$ = newpath$ EXIT FUNCTION END IF idezchangepath$ = path$ + "\" + newpath$ EXIT FUNCTION $ELSE 'go back a path IF newpath$ = ".." THEN FOR x = LEN(path$) TO 1 STEP -1 a$ = MID$(path$, x, 1) IF a$ = "/" THEN idezchangepath$ = LEFT$(path$, x - 1) IF x = 1 THEN idezchangepath$ = "/" 'root path cannot be "" EXIT FOR END IF NEXT EXIT FUNCTION END IF IF path$ = "/" THEN idezchangepath$ = "/" + newpath$ ELSE idezchangepath$ = path$ + "/" + newpath$ EXIT FUNCTION $END IF END FUNCTION FUNCTION QuotedFilename$ (f$) $IF WIN THEN QuotedFilename$ = CHR$(34) + f$ + CHR$(34) $ELSE QuotedFilename$ = "'" + f$ + "'" $END IF END FUNCTION '--------------------------------------------------------------------------------- FUNCTION SpecialCharsToEscapeCode$ (Text$) DIM i AS LONG, Temp$ Temp$ = CHR$(34) FOR i = 1 TO LEN(Text$) IF ASC(Text$, i) < 32 OR ASC(Text$, i) = 34 OR ASC(Text$, i) = 92 THEN Temp$ = Temp$ + "\" + LTRIM$(STR$(ASC(Text$, i))) + ";" ELSE Temp$ = Temp$ + MID$(Text$, i, 1) END IF NEXT SpecialCharsToEscapeCode$ = Temp$ + CHR$(34) END FUNCTION '--------------------------------------------------------------------------------- FUNCTION OutsideQuotes%% (text$, position AS LONG) DIM quote%% DIM start AS LONG DIM i AS LONG start = _INSTRREV(position, text$, CHR$(10)) + 1 quote%% = FALSE FOR i = start TO position IF ASC(text$, i) = 34 THEN quote%% = NOT quote%% IF ASC(text$, i) = 10 THEN EXIT FOR NEXT OutsideQuotes%% = NOT quote%% END FUNCTION