Rearraigned to address issue with Nimble

dev
Armando Rivera 3 years ago
parent 2bab2911bc
commit 6269810b98
  1. 55
      bundle.nim
  2. 44
      cocoa.nim
  3. 20
      cocoa/NSButton.nim
  4. 5
      cocoa/NSCheckbox.nim
  5. 0
      cocoa/NSColordialog.nim
  6. 5
      cocoa/NSCombobox.nim
  7. 5
      cocoa/NSContainer.nim
  8. 5
      cocoa/NSDialog.nim
  9. 82
      cocoa/NSFunctions.nim
  10. 5
      cocoa/NSLabel.nim
  11. 5
      cocoa/NSLine.nim
  12. 5
      cocoa/NSListbox.nim
  13. 11
      cocoa/NSMenu.nim
  14. 5
      cocoa/NSMessagebox.nim
  15. 5
      cocoa/NSOpendialog.nim
  16. 5
      cocoa/NSRadioButton.nim
  17. 5
      cocoa/NSSavedialog.nim
  18. 5
      cocoa/NSSlider.nim
  19. 8
      cocoa/NSTabView.nim
  20. 9
      cocoa/NSTableview.nim
  21. 5
      cocoa/NSTextedit.nim
  22. 5
      cocoa/NSTextfield.nim
  23. 8
      cocoa/NSWindow.nim
  24. 119
      cocoa/col.nim
  25. 6
      cocoa/widgets/bind.m
  26. 34
      cocoa/widgets/button.m
  27. 53
      cocoa/widgets/checkbox.m
  28. 630
      cocoa/widgets/col.h
  29. 47
      cocoa/widgets/colordialog.m
  30. 44
      cocoa/widgets/combobox.m
  31. 17
      cocoa/widgets/container.m
  32. 15
      cocoa/widgets/dialog.m
  33. 183
      cocoa/widgets/functions.m
  34. 14
      cocoa/widgets/label.m
  35. 24
      cocoa/widgets/line.m
  36. 85
      cocoa/widgets/listbox.m
  37. 176
      cocoa/widgets/menu.m
  38. 14
      cocoa/widgets/messagebox.m
  39. 30
      cocoa/widgets/nsslider.m
  40. 43
      cocoa/widgets/opendialog.m
  41. 30
      cocoa/widgets/radiobutton.m
  42. 11
      cocoa/widgets/saneview.m
  43. 48
      cocoa/widgets/savedialog.m
  44. 38
      cocoa/widgets/slider.m
  45. 131
      cocoa/widgets/tableview.m
  46. 42
      cocoa/widgets/tabview.m
  47. 110
      cocoa/widgets/textedit.m
  48. 11
      cocoa/widgets/textfield.m
  49. 117
      cocoa/widgets/window.m

@ -0,0 +1,55 @@
import json, os, plists, times
if paramCount() >= 1:
let fname = paramStr(1)
let dt = now()
let appAuthor = "Armando I. Rivera"
let appName = fname
let iconFile = "appIcon.icns"
let bundleIdentifier = "net.binarymagic." & appName
let appVersion = "0.1"
let appInfo = appVersion & " Created by " & appAuthor & " on " & dt.format("MM-dd-yyyy")
let appCopyRight = "Copyright" & dt.format(" yyyy ") & appAuthor & ". All rights reserved."
let appBundle = appName & ".app"
if fname.len > 0:
var pl = %*
{ "CFBundlePackageType" : "APPL",
"CFBundleInfoDictionaryVersion" : "6.0",
"CFBundleName" : appName,
"CFBundleExecutable" : appName,
"CFBundleIconFile" : iconFile ,
"CFBundleIdentifier" : bundleIdentifier ,
"CFBundleVersion" : appVersion ,
"CFBundleGetInfoString" : appInfo,
"CFBundleShortVersionString" : appVersion ,
"NSHumanReadableCopyright" : appCopyRight ,
"NSPrincipalClass" : "NSApplication" ,
"NSMainNibFile" : "MainMenu"
}
createDir(appBundle & "/Contents/MacOS")
createDir(appBundle & "/Contents/Resources")
createDir(appBundle & "/Contents/Frameworks")
if appName.fileExists:
appName.copyFileWithPermissions(appBundle & "/Contents/MacOS/" & appName)
if iconFile.fileExists:
iconFile.copyFileWithPermissions(appBundle & "/Contents/Resources/" & iconFile)
if "Credits.rtf".fileExists:
"Credits.rtf".copyFileWithPermissions(appBundle & "/Contents/Resources/Credits.rtf")
pl.writePlist(appBundle & "/Contents/Info.plist")
discard execShellCmd("touch " & appBundle)
discard execShellCmd("open " & appBundle)
else:
echo "Usage: bundle <file>"

@ -0,0 +1,44 @@
import Cocoa / [NSButton,
NSCheckbox,
NSColordialog,
NSCombobox,
NSContainer,
NSDialog,
NSFunctions,
NSLabel,
NSLine,
NSListbox,
NSMenu,
NSMessagebox,
NSOpendialog,
NSRadioButton,
NSSavedialog,
NSSlider,
NSTabView,
NSTableview,
NSTextedit,
NSTextfield,
NSWindow
]
export NSButton,
NSCheckbox,
NSColordialog,
NSCombobox,
NSContainer,
NSDialog,
NSFunctions,
NSLabel,
NSLine,
NSListbox,
NSMenu,
NSMessagebox,
NSOpendialog,
NSRadioButton,
NSSavedialog,
NSSlider,
NSTabView,
NSTableview,
NSTextedit,
NSTextfield,
NSWindow

@ -0,0 +1,20 @@
{.compile: "widgets/button.m".}
import NSFunctions
proc newButton*(parent: ID; caption: cstring; left: cint; top: cint; width: cint; height: cint; `func`: ACTION): ID {.cdecl, importc: "createButton".}
## Creates new Button object
##
## Example:
##
## .. code-block::nim
## btn1 = newButton(mainWindow, "Open", width-100, 20, 90, 24, btnClicked)
##
##
## Callback must be in the form:
##
## .. code-block::nim
## proc buttonCB(sender: ID) {.cdecl.} =
## <..code...>
##

@ -0,0 +1,5 @@
{.compile: "widgets/checkbox.m".}
import NSFunctions
proc newCheckBox*(parent: ID, caption: cstring, left, top, width, height:int): ID {.cdecl, importc: "createCheckBox".}

@ -0,0 +1,5 @@
{.compile: "widgets/combobox.m".}
import NSFunctions
proc newComboBox*(parent: ID; left: cint; top: cint; width: cint; height: cint; `callback`: ACTION): ID {.cdecl, importc: "createComboBox".}

@ -0,0 +1,5 @@
{.compile: "widgets/container.m".}
import NSFunctions
proc newContainer*(parent: ID, title: cstring; left: cint; top: cint; width: cint; height: cint): ID {.cdecl, importc: "createBox".}

@ -0,0 +1,5 @@
{.compile: "widgets/dialog.m".}
# import NSFunctions
proc newDialog*(title, message: cstring, height: cint): cint {.cdecl, importc: "createDialog".}

@ -0,0 +1,82 @@
{.compile: "widgets/functions.m".}
{.compile: "widgets/bind.m".}
type
ID* = pointer
ACTION* = proc (a2: ID) {.cdecl.}
# WINDOW STYLES
const
NSWindowStyleMaskBorderless* = 0
NSWindowStyleMaskTitled* = 1 shl 0
NSWindowStyleMaskClosable* = 1 shl 1
NSWindowStyleMaskMiniaturizable* = 1 shl 2
NSWindowStyleMaskResizable* = 1 shl 3
NSWindowStyleMaskUtilityWindow* = 1 shl 4
NSWindowStyleMaskDocModalWindow* = 1 shl 6
NSWindowStyleMaskNonactivatingPanel* = 1 shl 7
NSWindowStyleMaskUnifiedTitleAndToolbar* = 1 shl 12
NSWindowStyleMaskHUDWindow* = 1 shl 13
NSWindowStyleMaskFullScreen* = 1 shl 14
NSWindowStyleMaskFullSizeContentView* = 1 shl 15
# GUI ANCHOR SYSTEM
const
akNone* = 0
akRight* = 1
akWidth* = 2
akLeft* = 4
akBottom* = 8
akHeight* = 16
akFull* = 18
akTop* = 32
# Flags for GUI Anchor System
# akNone No Anchor
# akRight Anchor to Right of Window
# akWidth Anchor to Left and Right (width)
# akLeft Anchor to Left
# akBottom Anchor to Bottom
# akHeight Anchor to Top and Bottom
# akFull Anchor to Left/Right/Top/Bottom
# akTop Anchor to Top
proc Cocoa_Init*() {.cdecl, importc: "Cocoa_Init".}
proc Cocoa_Run*(a2: ID) {.cdecl, importc: "Cocoa_Run".}
proc Cocoa_Quit*(a2: ID) {.cdecl, importc: "Cocoa_Quit".}
proc Cocoa_About*() {.cdecl, importc: "Cocoa_About".}
proc `anchor=`*(widget: ID; value: cint) {.cdecl, importc: "Pin".}
proc `text=`*(widget: ID; txt: cstring) {.cdecl, importc: "SetText".}
proc text*(widget: ID): cstring {.cdecl, importc: "GetText".}
proc value*(widget: ID): cint {.cdecl, importc: "GetValue".}
proc `value=`*(widget: ID; value: cint) {.cdecl, importc: "SetValue".}
proc add*(widget: ID; txt: cstring) {.cdecl, importc: "AddItem".}
proc `action=`*(widget: ID; `func`: ACTION) {.cdecl, importc: "SetAction".}
proc `state=`*(widget: ID; state: bool) {.cdecl, importc: "SetState".}
proc state*(widget: ID): cint {.cdecl, importc: "State".}
proc clear*(widget: ID) {.cdecl, importc: "LB_Clear".}
proc `item=`(widget: ID; pos: cint) {.cdecl, importc: "SetItem".}
proc remove*(widget: ID; pos: cint) {.cdecl, importc: "RemoveItem".}
proc getColor*(panel: ID): cstring {.cdecl, importc: "getColor".}
proc hexColor*(cPanel: ID): cstring {.cdecl, importc: "hexColor".}
proc Notify*(title: cstring; subtitle: cstring; text: cstring) {.cdecl, importc: "Notify".}
proc newSeparator*(parent: ID; x: cint; y: cint; width: cint): ID {.cdecl, importc: "createLine".}
proc link*( widget: ID, widgetIvar: cstring, target: ID, targetIvar: cstring) {.cdecl, importc:"bind".}
proc `tooltip=`*(widget: ID, tip: cstring) {.cdecl, importc: "setToolTip".}

@ -0,0 +1,5 @@
{.compile: "widgets/label.m".}
import NSFunctions
proc newLabel*(parent: ID; txt: cstring, left, top, width, height: int): ID {.cdecl, importc: "createLabel".}

@ -0,0 +1,5 @@
{.compile: "widgets/line.m".}
import NSFunctions
proc newLine*(parent: ID, left, top, width: cint): ID {.cdecl, importc: "createLine".}

@ -0,0 +1,5 @@
{.compile: "widgets/listbox.m".}
import NSFunctions
proc newListBox*(parent: ID, left, top, width, height: cint): ID {.cdecl, importc: "createListBox".}

@ -0,0 +1,11 @@
{.compile: "widgets/menu.m".}
import NSFunctions
proc newMenu*(title: cstring): ID {.cdecl, importc: "createMenu".}
proc newMenuItem*(parent: ID, caption, key: cstring, `callback`:ACTION) {.cdecl, importc: "createMenuItem".}
proc newMenuSeparator*(parent: ID) {.cdecl, importc: "createMenuSeparator".}
proc setSystemAction*(widget: ID, title, actionName: cstring) {.cdecl, importc: "setSystemAction".}
proc newFileMenu*() {.cdecl, importc: "createFileMenu".}
proc newEditMenu*() {.cdecl, importc: "createEditMenu".}
proc newFormatMenu*() {.cdecl, importc: "createFormatMenu".}

@ -0,0 +1,5 @@
{.compile: "widgets/messagebox.m".}
# import NSFunctions
proc newMessageBox*(title, message: cstring, height: cint): cint {.cdecl, importc: "createMessageBox".}

@ -0,0 +1,5 @@
{.compile: "widgets/opendialog.m".}
import NSFunctions
proc newOpenDialog*(parent: ID, types: cstring): cstring {.cdecl, importc: "createOpenDialog".}

@ -0,0 +1,5 @@
{.compile: "widgets/radiobutton.m".}
import NSFunctions
proc newRadioButton*(parent: ID, caption: cstring; left: cint; top: cint; width: cint; height: cint; callback: ACTION): ID {.cdecl, importc: "createRadioButton".}

@ -0,0 +1,5 @@
{.compile: "widgets/savedialog.m".}
import NSFunctions
proc newSaveDialog*(parent: ID, title: cstring, types: cstring): cstring {.cdecl, importc: "createSaveDialog".}

@ -0,0 +1,5 @@
{.compile: "widgets/slider.m".}
import NSFunctions
proc newSlider*(parent: ID; left, top, width, height: int, `func`: ACTION): ID {.cdecl, importc: "createSlider".}

@ -0,0 +1,8 @@
{.compile: "widgets/tabview.m".}
import NSFunctions
proc newTabBox*(parent: ID, label: cstring; left: cint; top: cint; width: cint; height: cint): ID {.cdecl, importc: "createTabView".}
proc addTab*(parent: ID, label: cstring) {.cdecl, importc: "addTab".}
proc getTab*(parent: ID, label: cstring): ID {.cdecl, importc: "getTab".}

@ -0,0 +1,9 @@
{.compile: "widgets/tableview.m".}
import NSFunctions
proc newTableview*(parent: ID, left, top, width, height: cint): ID {.cdecl, importc: "createTableView".}
proc addColumn*(parent: ID, name: cstring) {.cdecl, importc: "newTableColumn".}
proc addRow*(parent: ID, person: cstring) {.cdecl, importc: "addRow".}
proc saveTableView*(tview: ID, path: cstring) {.cdecl, importc: "tableviewSaveToFile".}
proc loadTableView*(tview: ID, path: cstring) {.cdecl, importc: "tableviewLoadFromFile".}

@ -0,0 +1,5 @@
{.compile: "widgets/textedit.m".}
import NSFunctions
proc newTextEdit*(parent: ID; txt: cstring, left, top, width, height: int): ID {.cdecl, importc: "createTextEdit".}

@ -0,0 +1,5 @@
{.compile: "widgets/textfield.m".}
import NSFunctions
proc newTextField*(parent: ID; txt: cstring; left: cint; top: cint; width: cint; height: cint): ID {.cdecl, importc: "createTextField".}

@ -0,0 +1,8 @@
{.compile: "widgets/window.m".}
{.compile: "widgets/saneview.m".}
import NSFunctions
{.passL: "-fobjc-arc -framework Cocoa"}
proc newWindow*(title: cstring, width, height: int, style: int): ID {.importc: "createWindow".}

@ -0,0 +1,119 @@
{.pragma: libcol_s, cdecl.}
{.passL: "-fobjc-arc -framework Cocoa -lcol_s"}
type
id* = pointer
ACTION* = proc (a1: id) {.cdecl.}
const
akNone* = 0
akRight* = 1
akWidth* = 2
akLeft* = 4
akBottom* = 8
akHeight* = 16
akFull* = 18
akTop* = 32
proc newWindow*(title: cstring; width: cint; height: cint): id {.cdecl, importc: "createWindow".}
proc Pin(widget: id; value: cint) {.cdecl, importc: "Pin".}
proc Cocoa_Init*() {.cdecl, importc: "Cocoa_Init".}
proc Cocoa_Run*(a2: id) {.cdecl, importc: "Cocoa_Run".}
proc Cocoa_Quit*(a2: id) {.cdecl, importc: "Cocoa_Quit".}
proc Cocoa_About*() {.cdecl, importc: "Cocoa_About".}
proc SetText(widget: id; txt: cstring) {.cdecl, importc: "SetText".}
proc GetText(widget: id): cstring {.cdecl, importc: "GetText".}
proc GetValue(widget: id): cint {.cdecl, importc: "GetValue".}
proc SetValue(widget: id; value: cint) {.cdecl, importc: "SetValue".}
proc AddItem(widget: id; txt: cstring) {.cdecl, importc: "AddItem".}
proc newTextField*(parent: id; txt: cstring; l: cint; t: cint; w: cint; h: cint): id {.cdecl, importc: "createTextField".}
proc newComboBox*(parent: id; l: cint; t: cint; w: cint; h: cint; callback: ACTION): id {.cdecl, importc: "createComboBox".}
proc newButton*(parent: id; caption: cstring; l: cint; t: cint; w: cint; h: cint; `func`: ACTION): id {.cdecl, importc: "createButton".}
proc SetAction(widget: id; `func`: ACTION) {.cdecl, importc: "SetAction".}
proc newCheckBox*(parent: id; caption: cstring; l: cint; t: cint; w: cint; h: cint): id {.cdecl, importc: "createCheckBox".}
proc SetState(widget: id; state: bool) {.cdecl, importc: "SetState".}
proc State(widget: id): cint {.cdecl, importc: "State".}
proc newListBox*(parent: id; l: cint; t: cint; w: cint; h: cint): id {.cdecl, importc: "createListBox".}
proc Clearitems*(widget: id) {.cdecl, importc: "LB_Clear".}
proc SetItem*(widget: id; pos: cint) {.cdecl, importc: "SetItem".}
proc RemoveItem*(widget: id; pos: cint) {.cdecl, importc: "RemoveItem".}
proc newOpenDialog*(parent: id; types: cstring): cstring {.cdecl, importc: "createOpenDialog".}
proc newSaveDialog*(parent: id; title: cstring; types: cstring): cstring {.cdecl, importc: "createSaveDialog".}
proc newDialog*(title: cstring; message: cstring; `type`: cint): cint {.cdecl, importc: "createDialog".}
proc newMessageBox*(title: cstring; message: cstring; `type`: cint): cint {.cdecl, importc: "createMessageBox".}
proc newColorDialog*(): id {.cdecl, importc: "createColorDialog".}
proc getColor*(panel: id): cstring {.cdecl, importc: "getColor".}
proc hexColor*(cPanel: id): cstring {.cdecl, importc: "hexColor".}
proc newLabel*(parent: id; txt: cstring; l: cint; t: cint; w: cint; h: cint): id {.cdecl, importc: "createLabel".}
proc newTextEdit*(parent: id; txt: cstring; l: cint; t: cint; w: cint; h: cint): id {.cdecl, importc: "createTextEdit".}
proc Notify*(title: cstring; subtitle: cstring; text: cstring) {.cdecl, importc: "Notify".}
proc newSeparator*(parent: id; x: cint; y: cint; width: cint): id {.cdecl, importc: "createLine".}
proc newMenu*(Title: cstring): id {.cdecl, importc: "createMenu".}
proc newMenuItem*(parent: id; caption: cstring; key: cstring; callback: ACTION) {.cdecl, importc: "createMenuItem".}
proc newMenuSeparator*(parent: id) {.cdecl, importc: "createMenuSeparator".}
proc newSlider*(parent: id; left: cint; top: cint; width: cint; height: cint; callback: ACTION): id {.cdecl, importc: "createSlider".}
proc `text=`*(widget: id; txt: cstring) =
widget.SetText(txt)
proc `reset`*(widget: id) =
widget.SetText("")
proc `text`*(widget: id): string =
$GetText(widget)
# proc `item`*(widget: id): cstring =
# GetItem(widget)
proc `anchor=`*(widget: id; value: cint) =
widget.Pin(value)
proc `state`*(widget: id): cint =
widget.State()
proc `state=`*(widget: id; val: bool) =
widget.SetState(val)
proc `item=`*(widget: id, val: cstring) =
widget.AddItem(val)
proc `item`*(widget: id): string =
$GetText(widget)
proc action*(widget: id, action:ACTION) =
SetAction(widget, action)
proc value*(widget: id, value: cint) =
SetValue(widget, value)
proc value*(widget: id): cint =
GetValue(widget)
# #endif

@ -0,0 +1,6 @@
#import <Cocoa/Cocoa.h>
void bind( id widget, const char * widgetIvar, id target, const char *targetIvar) {
[widget bind: [NSString stringWithUTF8String: widgetIvar] toObject: target withKeyPath:[NSString stringWithUTF8String: targetIvar] options:nil];
}

@ -0,0 +1,34 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
@implementation CocoaButton
@synthesize buttonAction;
- (void) click:(id)sender {
buttonAction(sender);
}
@end
id createButton(id parent, const char* caption, int l, int t, int w, int h, ACTION func){
CocoaButton *widget = [[[CocoaButton alloc] initWithFrame:NSMakeRect( l, t, w, h )] autorelease];
[widget setButtonType:NSMomentaryPushInButton];
[widget setBezelStyle: NSRoundedBezelStyle];
[widget setTitle: [NSString stringWithUTF8String:caption]];
[widget setTarget: widget];
// [widget setAutoresizingMask: NSViewMinXMargin ];
if (func) {
[widget setButtonAction:func];
[widget setAction: @selector(click:)];
}
addToParent(parent, widget);
return widget;
}

@ -0,0 +1,53 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
@interface CocoaCheckbox : NSButton
{
int state;
}
@property int state;
- (void) click:(id)sender;
@end
@implementation CocoaCheckbox
@synthesize state;
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setButtonType:NSSwitchButton];
[self setBezelStyle: 0];
[self setTarget: self];
[self setAction: @selector(click:)];
}
return self;
}
- (void) click:(id)sender {
self.state = [self intValue];
}
@end
id createCheckBox(id parent, const char* caption, int l, int t, int w, int h){
id self = [[[CocoaCheckbox alloc] initWithFrame:NSMakeRect( l, t, w, h )] autorelease];
[self setTitle: [NSString stringWithUTF8String:caption]];
addToParent(parent, self);
return self;
}
void SetState(id widget, bool state) {
if (state == TRUE) {
[widget setState: NSOnState];
}else{
[widget setState: NSOffState];
}
}
int State(id widget) {
return [widget state];
}

@ -0,0 +1,630 @@
#import <Cocoa/Cocoa.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef void* id;
#define NSSTR(txt) [NSString stringWithUTF8String:txt]
#define BeginMenu dispatch_async(dispatch_get_main_queue(), ^{
#define EndMenu });
#ifndef NSWindowStyleMaskTitled
#define NSWindowStyleMaskTitled NSTitledWindowMask
#endif
#ifndef NSWindowStyleMaskClosable
#define NSWindowStyleMaskClosable NSClosableWindowMask
#endif
#ifndef NSWindowStyleMaskMiniaturizable
#define NSWindowStyleMaskMiniaturizable NSMiniaturizableWindowMask
#endif
#ifndef NSWindowStyleMaskResizable
#define NSWindowStyleMaskResizable NSResizableWindowMask
#endif
#ifndef NSAlertStyleWarning
#define NSAlertStyleWarning NSWarningAlertStyle
#endif
#ifndef NSTextAlignmentLeft
#define NSTextAlignmentLeft NSLeftTextAlignment
#endif
#ifndef NSAlertStyleWarning
#define NSAlertStyleWarning NSWarningAlertStyle
#endif
#ifndef NSEventTypeKeyDown
#define NSEventTypeKeyDown NSKeyDown
#endif
#ifndef NSEventModifierFlagCommand
#define NSEventModifierFlagCommand NSCommandKeyMask
#endif
#ifndef NSEventModifierFlagOption
#define NSEventModifierFlagOption NSAlternateKeyMask
#endif
typedef void(*ACTION)(id);
/**
Used by Internal Callback System
to route callback to user provided
subroutine
Subroutine must not return value
Ex:
void Example(void);
*/
typedef void(*EVENT_ACTION)(id, const char*);
enum {
akNone,
akRight,
akWidth,
akLeft = 4,
akBottom = 8,
akHeight = 16,
akFull = 18,
akTop = 32
};
/**
Flags for Widget Anchor System
akNone No Anchor
akRight Anchor to Right of Window
akWidth Anchor to Left and Right (width)
akLeft Anchor to Left
akBottom Anchor to Bottom
akHeight Anchor to Top and Bottom
akTop Anchor to Top
*/
@interface SaneView : NSClipView
- (BOOL)isFlipped;
@end
@interface CocoaWindow : NSWindow <NSApplicationDelegate,NSUserNotificationCenterDelegate,NSWindowDelegate, NSTextFieldDelegate>
{
// NOT USED
}
- (void)applicationDidFinishLaunching: (NSNotification *)notification;
- (BOOL)applicationShouldTerminateAfterLastWindowClosed: (NSNotification *)notification;
- (id) initFormWithTitle:(NSString*)title width:(NSInteger)width height:(NSInteger)height windowStyle: (NSWindowStyleMask) style;
- (void)createApplicationMenu;
@end
@interface awColorPanel: NSColorPanel {
NSColor* theColor;
NSModalSession modalSession;
}
@property (copy) NSColor* theColor;
- (void)colorUpdate:(NSColorPanel*)colorPanel;
-(void)changeColor:(id)sender;
- (const char *) hexColor;
@end
@interface CocoaListBox : NSScrollView <NSTableViewDataSource, NSTableViewDelegate>
{
NSTableView *tbl;
NSTableColumn *tblc;
NSMutableArray *db;
int cnt;
}
@property (retain) NSTableView *tbl;
@property (retain) NSMutableArray *db;
- (id)initWithFrame:(NSRect)frame;
- (void)doubleclicked:(id)sender;
- (void)selected:(id)sender;
@end
@interface CocoaTableView : NSScrollView <NSTableViewDataSource, NSTableViewDelegate>
{
NSTableView *tbl;
NSTableColumn *tblc;
NSTableColumn *tbld;
NSMutableArray *db;
NSMutableDictionary *dict;
int cnt;
}
@property (retain) NSTableView *tbl;
@property (retain) NSMutableArray *db;
@property (retain) NSMutableDictionary *dict;
- (id)initWithFrame:(NSRect)frame;
- (void)doubleclicked:(id)sender;
- (void)selected:(id)sender;
@end
@interface CocoaButton: NSButton{
ACTION buttonAction;
EVENT_ACTION eventAction;
}
@property ACTION buttonAction;
@property EVENT_ACTION eventAction;
- (void) click:(id)sender;
- (void)mouseEntered:(NSEvent *)theEvent;
- (void)mouseExited:(NSEvent *)theEvent;
@end
@interface RadioButton: NSButton{
ACTION buttonAction;
}
@property ACTION buttonAction;
- (void) click:(id)sender;
@end
@interface CocoaComboBox : NSComboBox {
// NSInteger currentItem;
ACTION comboCallBack;
}
@property ACTION comboCallBack;
@property NSInteger currentItem;
- (id)initWithFrame:(NSRect)frame;
/* notification responders */
- (void)comboBoxSelectionDidChange:(NSNotification *)notification;
@end
@interface CocoaTextEdit : NSScrollView <NSTextViewDelegate,NSMenuDelegate>
{
NSTextView *widget;
}
@property (retain) NSTextView *widget;
- (id)initWithFrame:(NSRect)frame;
@end
@interface CocoaMenu : NSMenu <NSMenuDelegate>
{
ACTION menuAction;
}
@property (retain) NSMenu *menu;
@property ACTION menuAction;
- (void) CreateMenu: (NSString*) Title;
- (void) AddItem: (NSString*)Title withShortcut: (NSString*)key andCallback: (ACTION) callback;
// - (void) click:(id)sender;
- (void) SetAction: (id) widget Callback: (ACTION) func;
- (void)addSeparator;
//- (void) click:(id)sender;
@end
@interface CocoaMenuItem : NSMenuItem
{
ACTION menuItemAction;
}
@property ACTION menuItemAction;
- (void) click:(id)sender;
@end
@interface CocoaSlider: NSSlider
{
int Value;
ACTION sliderAction;
}
@property int Value;
@property ACTION sliderAction;
- (IBAction)onChanged:(id)sender;
- (id) initWithFrame:(NSRect)rect callBack:(ACTION)func;
@end
id createWindow(const char* title, int width, int height, NSWindowStyleMask style);
/**
\brief Creates Main Window
parameters:
String: Title of Window,
INT: Width of Window,
INT: Height of Window
Returns:
Pointer: Created Window
*/
void Pin(id widget, NSInteger value);
/**
\brief Specifies how child widget responds to resize of Parent
parameters:
Pointer: Widget
INT: Anchor point (see Enum above)
Returns:
None
*/
void Cocoa_Init();
/**
\brief Initializes Cocoa GUI
parameters:
None
Returns:
None
*/
void Cocoa_Run();
/**
\brief Passes control over to Cocoa Runtime
parameters:
None
Returns:
None
*/
void Cocoa_Quit();
/**
\brief Terminates Cocoa Runtime
parameters:
None
Returns:
None
*/
void Cocoa_About();
/**
\brief Displays Cocoa About Dialog
parameters:
None
Returns:
None
Note:
Utilizes information contained in Application Bundle's Info.plist
*/
void SetText(id widget, const char* txt);
/**
\brief Sets Widget Text
parameters:
Pointer: Target Widget
Text to set
Returns:
None
*/
const char* GetText(id widget);
/**
\brief Retrives Text from Widget
parameters:
Pointer: Target Widget
Returns:
String: from Widget
*/
int GetValue(id widget);
/**
\brief Retrieves INT value from Widget
parameters:
Pointer: Target Widget
Returns:
integer: from Widget
*/
void SetValue(id widget, int value);
/**
\brief Sets INT value for Widget
parameters:
Pointer: Target Widget
INT: Value to set
*/
void AddItem(id widget, const char* txt );
/**
\brief Adds TEXT Item to ComboBox/ListBox
parameters:
Pointer: Target Widget
String: Text to Add
Returns:
None
*/
// char* GetItem(id widget);
/**
\brief Retrieves Selected Text from ComboBox/ListBox
parameters:
Pointer: Target Widget
Returns:
String: Text of Selected Item
*/
id createTextField(id parent,const char* txt,int l, int t, int w, int h);
/**
\brief Creates TextField (TextBox/TextEntry) Widget
parameters:
Pointer: Parent Widget,
String: Default Text to Display,
INT: Left Position in Parent,
INT: Top Position in Parent,
INT: Width of Widget,
INT: Height of Widget
Returns:
Pointer: Created TextField
*/
id createComboBox(id parent,int l, int t, int w, int h, ACTION callback);
/**
\brief Creates ComboBox Widget
parameters:
Pointer: Parent Widget,
INT: Left Position in Parent,
INT: Top Position in Parent,
INT: Width of Widget,
INT: Height of Widget,
ACTION: Callback Function or NULL
Returns:
Pointer: Created ComboBox
*/
id createButton(id parent, const char* caption, int l, int t, int w, int h, ACTION func);
/**
\brief Creates Button Widget
parameters:
Pointer: Parent Widget,
String: Button Caption,
INT: Left Position in Parent,
INT: Top Position in Parent,
INT: Width of Widget,
INT: Height of Widget,
ACTION: Callback Function or NULL
Returns:
Pointer to Created Button
*/
void SetAction(id widget, SEL func);
id createCheckBox(id parent, const char* caption, int l, int t, int w, int h);
/**
\brief Creates CheckBox Widget
parameters:
Pointer: Parent Widget,
String: CheckBox Caption,
INT: Left Position in Parent,
INT: Top Position in Parent,
INT: Width of Widget,
INT: Height of Widget,
ACTION: Callback Function or NULL
Returns:
Pointer to Created TextField
*/
void SetState(id widget, bool state);
/**
\brief Sets State of CheckBox Widget (Checked/Unchecked)
parameters:
Pointer: Parent Widget,
BOOL: State (True for on, False for off)
Returns:
None
*/
int State(id widget);
/**
\brief Retrieves State of Checkbox (On[True], Off[False])
parameters:
Pointer: Checkbox Widget,
Returns:
BOOL: State [True/False]
*/
id createRadioButton(id parent, const char* caption, int l, int t, int w, int h, ACTION func);
/**
\brief Creates RadioButton Widget
parameters:
Pointer: Parent Widget,
String: Button Caption,
INT: Left Position in Parent,
INT: Top Position in Parent,
INT: Width of Widget,
INT: Height of Widget,
ACTION: Callback Function or NULL
Returns:
Pointer to Created RadioButton
*/
id createListBox(id parent,int l, int t, int w, int h);
/**
\brief Creates ListBox Widget
parameters:
Pointer: Parent Widget,
INT: Left Position in Parent,
INT: Top Position in Parent,
INT: Width of Widget,
INT: Height of Widget
Returns:
Pointer: Created ListBox Widget
*/
void LB_Clear(id widget);
void SetItem(id widget, int pos);
void RemoveItem(id widget, int pos);
char* createOpenDialog( id parent, const char *types);
/**
\brief Displays OpenFile Dialog Widget
parameters:
Pointer: Parent Widget,
String: File Types Filter, separated by ":"
Returns:
String: Path to Selected File, or Blank String
Example:
char *fName = OpenDialog(mywin,"txt:c:h");
*/
char* createSaveDialog(id parent, const char* title, const char *types);
/**
\brief Displays SaveFile Dialog Widget
parameters:
Pointer: Parent Widget,
String: Dialog Title,
String: File Types Filter, separated by ":"
Returns:
String: Path to Selected File, or Blank String
Example:
char *fName = SaveDialog(mywin,"txt:c:h");
*/
int createDialog(const char *title, const char *message, int type);
int createMessageBox(const char *title, const char *message, int type);
/**
\brief Displays MessageBox Dialog Widget
parameters:
String: Dialog Title,
String: Message to Display,
INT: Type of Dialog(?)
Returns:
INT: Value corresponding to OK or Cancel
Example:
char *fName = SaveDialog(mywin,"txt:c:h");
*/
id createColorDialog();
id getColor(id panel);
void setColor(id target, id source);
const char* hexColor(id cPanel);
id createLabel(id parent, const char* txt, int l, int t, int w, int h);
/**
\brief Creates Label Widget
parameters:
Pointer: Parent Widget,
String: Caption of Label,
INT: Left Position in Parent,
INT: Top Position in Parent,
INT: Width of Widget,
INT: Height of Widget
Returns:
Pointer: Label Widget
*/
id createTextEdit(id parent, const char* txt, int l, int t, int w, int h);
/**
\brief Creates TextEdit Widget
parameters:
Pointer: Parent Widget,
String: Default Text,
INT: Left Position in Parent,
INT: Top Position in Parent,
INT: Width of Widget,
INT: Height of Widget
Returns:
Pointer: Label Widget
*/
void Notify(const char *title, const char * subtitle, const char *text);
/**
\brief Sends Notification to macOS Notification System
parameters:
String: Title of Notification,
String: Subtitle of Notification,
String: Message to Display
Returns:
None
*/
id createLine(id parent, int x, int y, int width);
id createMenu(const char * Title);
void createMenuItem(id parent, const char *caption, const char *key, ACTION callback);
void createMenuSeparator(id parent);
id createSlider(id parent, int left, int top, int width, int height, ACTION callback);
void addToParent(id parent, id child);
id createBox(id parent, const char* title, int x, int y, int width, int height);
id createRadioButton(id parent, const char* caption, int l, int t, int w, int h, ACTION func);
id createTabView(id parent, const char *label, int x, int y, int width, int height);
void addTab(id parent, const char *name);
id getTab(id parent, const char *name);
void eventAction(id widget, EVENT_ACTION callback);
#ifdef __cplusplus
}
#endif
// #endif

@ -0,0 +1,47 @@
#import <Cocoa/Cocoa.h>
#include "col.h"
@implementation awColorPanel
@synthesize theColor;
- (void)colorUpdate:(awColorPanel*)colorPanel{
theColor = colorPanel.color;
// printf("%s\n",[self hexColor]);
}
- (const char *) hexColor {
NSString* hexString = [NSString stringWithFormat:@"%02X%02X%02X",
(int) (theColor.redComponent * 0xFF),
(int) (theColor.greenComponent * 0xFF),
(int) (theColor.blueComponent * 0xFF)];
return [hexString UTF8String];
}
@end
id createColorDialog() {
NSColorPanel *cp = [awColorPanel sharedColorPanel];
[cp setTarget:cp];
[cp setAction:@selector(colorUpdate:)];
// [NSApp runModalForWindow: cp];
[cp makeKeyAndOrderFront:nil];
return cp;
}
const char* hexColor(awColorPanel* cPanel) {
return [cPanel hexColor];
}
id getColor(id panel) {
return theColor;
}
void setColor(id target, id source) {
[target setBackgroundColor: [source color]];
}

@ -0,0 +1,44 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
@implementation CocoaComboBox
@synthesize currentItem;
@synthesize comboCallBack;
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setEditable: NO];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(comboBoxSelectionDidChange:)
name:NSComboBoxSelectionDidChangeNotification
object:self];
}
return self;
}
- (void)comboBoxSelectionDidChange:(NSNotification *)notification {
// [self setCurrentItem: [self indexOfSelectedItem]];
self.currentItem = [self indexOfSelectedItem];
if (self.comboCallBack != NULL) comboCallBack(self);
}
@end
id createComboBox(id parent,int l, int t, int w, int h, ACTION callback){
id widget = [[[CocoaComboBox alloc] initWithFrame:NSMakeRect( l, t, w, h )] autorelease];
if (callback) {
[widget setComboCallBack:callback];
// [widget setAction: @selector(click:)];
}
addToParent(parent, widget);
return widget;
}

@ -0,0 +1,17 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
id createBox(id parent, const char* title, int x, int y, int width, int height) {
id widget = [[[NSBox alloc] initWithFrame: NSMakeRect(x, y, width, height)] autorelease];
[widget setTitle: [NSString stringWithUTF8String: title]];
// Do we need to create a contentView???
id sv = [[[SaneView alloc] initWithFrame: NSZeroRect] autorelease];
[sv setBackgroundColor: [NSColor windowBackgroundColor]];
[widget setContentView: sv];
[widget setBorderType: NSLineBorder];
addToParent(parent, widget);
return widget;
}

@ -0,0 +1,15 @@
#import <Cocoa/Cocoa.h>
#include "col.h"
int createDialog(const char *title, const char *message, int type) {
NSAlert *alert = [[NSAlert new] autorelease];
[alert addButtonWithTitle:@"Continue"];
[alert addButtonWithTitle:@"Cancel"];
[alert setMessageText:[NSString stringWithUTF8String:title] ];
[alert setInformativeText:[NSString stringWithUTF8String:message] ];
[alert setAlertStyle:NSAlertStyleWarning];
return [alert runModal];
}

@ -0,0 +1,183 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
void Pin(id widget, NSInteger value) {
[(NSView*)widget setAutoresizingMask: value];
}
void SetText(id widget, const char* txt){
NSString *widgetClass = [[widget class] description];
if ([widgetClass isEqualToString:@"CocoaTextEdit"])
{
[[widget documentView] setString: [NSString stringWithUTF8String: txt]];
[widget setNeedsDisplay: YES];
}else if ([widgetClass isEqualToString:@"CocoaWindow"]) {
[widget setTitle: [NSString stringWithUTF8String: txt]];
}else{
[widget setStringValue:[NSString stringWithUTF8String:txt]];
}
}
void AddItem(id widget, const char* txt ){
NSString *widgetClass = [[widget class] description];
/* ListBox */
if ([widgetClass isEqualToString:@"CocoaListBox"] || [widgetClass isEqualToString:@"CocoaTableView"])
{
[[widget db] addObject: [NSString stringWithUTF8String: txt]];
[[widget tbl] reloadData];
}else{
/* ComboBox */
[widget addItemWithObjectValue:[NSString stringWithUTF8String:txt]];
}
}
const char* GetText(id widget) {
NSString *widgetClass = [[widget class] description];
/* ListBox */
if ([widgetClass isEqualToString:@"CocoaListBox"]) {
NSInteger row = [[widget tbl] selectedRow];
// NSString *dbValue = [[widget db]objectAtIndex:row];
// return strdup([dbValue UTF8String]);
return [[[widget db]objectAtIndex:row] UTF8String];
/* TextEdit */
}else if ([widgetClass isEqualToString:@"CocoaTextEdit"]) {
if ( [[[widget documentView] string] length] > 0) {
return [[[widget documentView] string] UTF8String];
}else{
return @"".UTF8String;
}
// const char* str = [[[widget textStorage] string] UTF8String];
// if (strlen(str)>0) {
// return strdup(str);
// }else{
// return strdup("");
// }
/* ComboBox */
}else if ([widgetClass isEqualToString: @"CocoaComboBox"]) {
return [[widget objectValueOfSelectedItem] UTF8String];
/* RadioButton, Box */
}else if ([widgetClass isEqualToString: @"RadioButton"] || [widgetClass isEqualToString: @"NSBox"]) {
return [[widget title] UTF8String];
}else{
/* Everything Else */
return [[widget stringValue] UTF8String];
}
}
int GetValue(id widget) {
NSString *widgetClass = [[widget class] description];
/* Slider */
if ([widgetClass isEqualToString: @"CocoaSlider"]) {
return [widget Value];
}
return 0;
}
void SetValue(id widget, int value) {
NSString *widgetClass = [[widget class] description];
/* Slider */
if ([widgetClass isEqualToString: @"CocoaSlider"]) {
[widget setIntValue:value];
}
}
void SetItem(id widget, int pos) {
NSString *widgetClass = [[widget class] description];
if ([widgetClass isEqualToString:@"CocoaListbox"]) {
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:pos];
[widget selectRowIndexes: indexSet byExtendingSelection:NO];
}else if ([widgetClass isEqualToString:@"CocoaComboBox"]) {
[widget selectItemAtIndex:pos];
[widget setObjectValue:[widget objectValueOfSelectedItem]];
}
}
void RemoveItem(id widget, int index) {
NSString *widgetClass = [[widget class] description];
if ([widgetClass isEqualToString:@"CocoaListBox"]) {
[[widget db]removeObjectAtIndex: index];
[[widget tbl] reloadData];
}else if ([widgetClass isEqualToString:@"CocoaComboBox"]) {
[widget removeItemAtIndex: index];
}
}
void LB_Clear(id widget) {
[[widget db] removeAllObjects];
[[widget tbl] reloadData];
}
void Cocoa_Init() {
[NSApplication sharedApplication];
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
}
void Cocoa_Run() {
// NSApplicationMain(0,0);
// [NSApp setDelegate:mainWin];
[NSApp activateIgnoringOtherApps:YES];
[NSApp run];
}
void Cocoa_Quit() {
[NSApp performSelector:@selector(terminate:) withObject:nil afterDelay:0.0];
}
void Cocoa_About() {
[NSApp performSelector:@selector(orderFrontStandardAboutPanel:) withObject:nil afterDelay:0.0];
}
void Notify(const char *title, const char * subtitle, const char *text) {
if (strlen(title)>0 && strlen(text)>0) {
NSUserNotificationCenter *nc = NSUserNotificationCenter.defaultUserNotificationCenter;
NSUserNotification *note = NSUserNotification.new;
note.title = [NSString stringWithUTF8String:title];
note.subtitle = [NSString stringWithUTF8String:subtitle];
note.informativeText = [NSString stringWithUTF8String:text];
note.soundName = NSUserNotificationDefaultSoundName;
[nc deliverNotification:note];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
}
}
void addToParent(id parent, id child) {
NSString *widgetClass = [[parent class] description];
if ([widgetClass isEqualToString:@"NSTabViewItem"]) {
[[parent view] addSubview: child];
} else {
[[parent contentView] addSubview: child];
}
}
void setToolTip(id widget, const char *tooltip) {
[widget setToolTip: [NSString stringWithUTF8String: tooltip]];
}
void eventAction(id widget, EVENT_ACTION callback) {
[widget setEventAction: callback];
}
void setSystemAction(id widget, const char *Title, const char *actionName) {
SEL selector = NSSelectorFromString(NSSTR(actionName));
id menuItem = [widget itemWithTitle: NSSTR(Title)];
NSLog(@"%d",[menuItem respondsToSelector: selector]);
if (selector) {
[menuItem setAction: @selector(selector)];
}
}

@ -0,0 +1,14 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
id createLabel(id parent, const char* txt, int l, int t, int w, int h){
NSTextField *widget = [[[NSTextField alloc] initWithFrame:NSMakeRect( l, t, w, h )] autorelease];
[widget setStringValue:[NSString stringWithUTF8String:txt]];
[widget setEditable: NO];
[widget setAlignment: NSTextAlignmentLeft];
[widget setDrawsBackground: NO];
[widget setBordered: NO];
addToParent(parent, widget);
return widget;
}

@ -0,0 +1,24 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
id createLine(id parent, int x, int y, int width) {
NSBox *widget = [[[NSBox alloc] initWithFrame:NSMakeRect(x,y,width,1)] autorelease];
widget.boxType = NSBoxSeparator;
addToParent(parent, widget);
return widget;
}
// create a horizontally oriented separator
// NSBox *horizontalSeparator=[[NSBox alloc] initWithFrame:NSMakeRect(15.0,250.0,250.0,1.0)];
// [horizontalSeparator setBoxType:NSBoxSeparator];
// create a vertically oriented separator
// NSBox *verticalSeparator=[[NSBox alloc] initWithFrame:NSMakeRect(250.0,15.0,1.0,250.0)];
// [verticalSeparator setBoxType:NSBoxSeparator];

@ -0,0 +1,85 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
@implementation CocoaListBox
@synthesize tbl;
@synthesize db;
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
db = [NSMutableArray new];
if (self) {
tblc = [[NSTableColumn alloc] initWithIdentifier: @"Name"];
[tblc setEditable: NO];
tbl = [[NSTableView alloc] initWithFrame: NSMakeRect(5,40,335,185)];
[tbl setGridStyleMask: NSTableViewGridNone];
[tbl setAllowsColumnSelection: NO];
[tbl setAllowsColumnReordering: NO];
[tbl setAllowsEmptySelection: NO];
[tbl setAllowsMultipleSelection: NO];
[tbl setColumnAutoresizingStyle: NSTableViewUniformColumnAutoresizingStyle];
[tbl addTableColumn: tblc];
[tbl setDataSource: self];
[tbl setDelegate: self];
[tbl setTarget:self];
[tbl setDoubleAction:@selector(doubleclicked:)];
// [tbl setAction:@selector(selected:)];
[tbl setHeaderView:nil];
[self setHasHorizontalScroller: NO];
[self setHasVerticalScroller: YES];
[self setDocumentView: tbl];
// [self setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable];
[tblc setResizingMask: NSTableColumnAutoresizingMask];
[tblc setWidth:10000];
[tbl reloadData];
cnt = 0;
}
return self;
}
- (void)doubleclicked:(id)sender
{
// int rowIndex = [sender selectedRow];
}
- (void)selected:(id)sender
{
// [tbl selectRowIndexes:[NSIndexSet indexSetWithIndex:item->row] byExtendingSelection:NO];
}
-(void)tableViewSelectionDidChange:(NSNotification *)notification
{
NSInteger row = [tbl selectedRow];
}
- (long)numberOfRowsInTableView:(NSTableView *)aTableView
{
return db.count;
}
-(id)tableView:(NSTableView *)tableView
objectValueForTableColumn:(NSTableColumn *)tableColumn
row:(NSInteger)row
{
return self.db[row];
}
@end
id createListBox(id parent,int l, int t, int w, int h){
id self = [[[CocoaListBox alloc] initWithFrame:NSMakeRect( l, t, w, h )] autorelease];
addToParent(parent, self);
return self;
}

@ -0,0 +1,176 @@
#import "col.h"
@implementation CocoaMenuItem
@synthesize menuItemAction;
- (void) click:(id)sender {
menuItemAction(sender);
}
@end
@implementation CocoaMenu
@synthesize menu;
@synthesize menuAction;
- (void) CreateMenu: (NSString*) Title {
NSMenuItem *newMenuItem = [[NSMenuItem alloc] initWithTitle:Title action:NULL keyEquivalent:@""];
self.menu = [[NSMenu alloc] initWithTitle:Title];
[newMenuItem setSubmenu:self.menu];
[[[NSApplication sharedApplication] mainMenu] addItem: newMenuItem];
}
- (void) AddItem: (NSString*)Title withShortcut: (NSString*)key andCallback: (ACTION) callback {
CocoaMenuItem *item = [[[CocoaMenuItem alloc] init] autorelease];
[item setTitle:Title];
[item setTarget:item];
[item setKeyEquivalent: key];
[item setIdentifier: Title];
if (callback != NULL) {
[item setMenuItemAction: callback];
[item setAction: @selector(click:)];
}
[self.menu addItem: item];
}
- (void)addSeparator {
[self.menu addItem: [NSMenuItem separatorItem]];
}
- (void) SetAction: (id) widget Callback: (ACTION) func {
[widget setMenuAction:func];
}
- (id) createFileMenu {
NSMenuItem *newMenuItem = [[NSMenuItem alloc] initWithTitle:@"File" action:NULL keyEquivalent:@""];
NSMenu *fileMenu = [[NSMenu alloc] initWithTitle:@"File"];
id newMenu =[[[NSMenuItem alloc] initWithTitle:@"New"
action:@selector(newDocument:)
keyEquivalent:@"n"]
autorelease];
[fileMenu addItem:newMenu];
[newMenuItem setSubmenu: fileMenu];
[[[NSApplication sharedApplication] mainMenu] addItem: newMenuItem];
}
- (id) createEditMenu {
NSString *appName = [[NSProcessInfo processInfo] processName];
NSMenuItem *newMenuItem = [[NSMenuItem alloc] initWithTitle:@"Edit" action:NULL keyEquivalent:@""];
NSMenu *editMenu = [[NSMenu alloc] initWithTitle:@"Edit"];
id undoMenu =[[[NSMenuItem alloc] initWithTitle:@"Undo"
action:@selector(undo:)
keyEquivalent:@"z"]
autorelease];
[editMenu addItem:undoMenu];
// ;
id redoMenu =[[[NSMenuItem alloc] initWithTitle:@"Redo"
action:@selector(redo:)
keyEquivalent:@"Z"]
autorelease];
[editMenu addItem:redoMenu];
[editMenu addItem: [NSMenuItem separatorItem]];
id cutMenu =[[[NSMenuItem alloc] initWithTitle:@"Cut"
action:@selector(cut:)
keyEquivalent:@"x"]
autorelease];
[editMenu addItem:cutMenu];
id copyMenu =[[[NSMenuItem alloc] initWithTitle:@"Copy"
action:@selector(copy:)
keyEquivalent:@"c"]
autorelease];
[editMenu addItem:copyMenu];
id pasteMenu =[[[NSMenuItem alloc] initWithTitle:@"Paste"
action:@selector(paste:)
keyEquivalent:@"v"]
autorelease];
[editMenu addItem:pasteMenu];
id pasteAndMatchMenu =[[[NSMenuItem alloc] initWithTitle:@"Paste and Match Style"
action:@selector(pastAsPlainText:)
keyEquivalent:@""]
autorelease];
[editMenu addItem:pasteAndMatchMenu];
id selectAllMenu =[[[NSMenuItem alloc] initWithTitle:@"Select All"
action:@selector(selectAll:)
keyEquivalent:@"a"]
autorelease];
[editMenu addItem:selectAllMenu];
// [newMenuItem setSubmenu: selectAllMenu];
// [editMenu addItem: [NSMenuItem separatorItem]];
[newMenuItem setSubmenu: editMenu];
[[[NSApplication sharedApplication] mainMenu] addItem: newMenuItem];
}
- (id) createFormatMenu{
NSFontManager *fontManager = [NSFontManager sharedFontManager];
[fontManager setDelegate: self];
NSMenu *fontMenu = [fontManager fontMenu:YES];
// [[[NSApplication sharedApplication] mainMenu] addItem: fontManager];
NSMenuItem *newMenuItem = [[NSMenuItem alloc] initWithTitle:@"Format" action:NULL keyEquivalent:@""];
NSMenu *blah = [[NSMenu alloc] initWithTitle: @"Format"];
[newMenuItem setSubmenu: blah];
[newMenuItem setSubmenu: fontMenu];
[[[NSApplication sharedApplication] mainMenu] addItem: newMenuItem];
}
@end
id createMenu(const char * Title) {
id widget = [CocoaMenu new];
[widget CreateMenu: NSSTR(Title)];
return widget;
}
void createMenuItem(id parent, const char *caption, const char *key, ACTION callback) {
[parent AddItem: NSSTR(caption) withShortcut: NSSTR(key) andCallback: callback];
}
void createMenuSeparator(id parent){
[parent addSeparator];
}
id createFileMenu() {
id widget = [CocoaMenu new];
[widget createFileMenu];
return widget;
}
id createFormatMenu() {
id widget = [CocoaMenu new];
[widget createFormatMenu];
return widget;
}
id createEditMenu() {
id widget = [CocoaMenu new];
[widget createEditMenu];
return widget;
}

@ -0,0 +1,14 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
int createMessageBox(const char *title, const char *message, int type) {
NSAlert *alert = [[NSAlert new] autorelease];
[alert addButtonWithTitle:@"Ok"];
[alert setMessageText:[NSString stringWithUTF8String:title] ];
[alert setInformativeText:[NSString stringWithUTF8String:message] ];
[alert setAlertStyle:NSAlertStyleWarning];
return [alert runModal];
}

@ -0,0 +1,30 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
@implementation CocoaSlider
{
}
@synthesize Value;
@synthesize sliderAction;
- (IBAction)onChanged:(id)sender{
self.Value = [sender intValue];
sliderAction(sender);
}
- (id) initWithFrame:(NSRect)rect callBack:(ACTION)func {
self = [super initWithFrame: rect];
[self setMinValue:0];
[self setMaxValue:100];
[self setAllowsTickMarkValuesOnly:NO];
[self setNumberOfTickMarks:0];
[self setTickMarkPosition:1];
[self setTarget:self];
if (func != NULL) {
[self setSliderAction: func];
[self setAction: @selector(onChanged:)];
}
return self;
}
@end

@ -0,0 +1,43 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
char* createOpenDialog( id parent, const char *types) {
NSOpenPanel* widget = [NSOpenPanel openPanel];
// Enable the selection of files in the dialog.
[widget setCanChooseFiles:YES];
widget.showsResizeIndicator = YES;
widget.showsHiddenFiles = NO;
widget.canCreateDirectories = YES;
// Change "Open" dialog button to "Select"
[widget setPrompt:@"Select"];
// Set FileTypes
if ( strlen(types) > 0 ) {
NSString *fileTypes = [NSString stringWithUTF8String:types];
NSArray *fTypes = [fileTypes componentsSeparatedByString:@":"];
[widget setAllowedFileTypes:fTypes];
}
// if ( [widget runModal] == NSModalResponseOK ) {
// NSString* path = [[widget URL] path];
// return strdup([path UTF8String]);
// }
[widget beginSheetModalForWindow:parent completionHandler:^(NSInteger result) {
[NSApp stopModalWithCode:result];
}];
if ([NSApp runModalForWindow:parent] == NSFileHandlingPanelOKButton) {
NSString* path = [[widget URL] path];
return strdup([path UTF8String]);
}
return strdup("");
}

@ -0,0 +1,30 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
@implementation RadioButton
@synthesize buttonAction;
- (void) click:(id)sender {
buttonAction(sender);
}
@end
id createRadioButton(id parent, const char* caption, int l, int t, int w, int h, ACTION func){
NSButton *self = [[[RadioButton alloc] initWithFrame:NSMakeRect( l, t, w, h )] autorelease];
[self setButtonType: NSButtonTypeRadio];
[self setBezelStyle: 0];
[self setTitle: [NSString stringWithUTF8String:caption]];
[self setTarget: self];
if (func) {
[self setButtonAction:func];
[self setAction: @selector(click:)];
}
addToParent(parent, self);
return self;
}

@ -0,0 +1,11 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
@implementation SaneView
- (BOOL)isFlipped
{
return YES;
}
@end

@ -0,0 +1,48 @@
#include <Cocoa/Cocoa.h>
#import "col.h"
char* createSaveDialog(id parent, const char* title, const char* types) {
NSString* path = @"";
NSSavePanel *widget = [NSSavePanel savePanel];
if (strlen(title)>0) {
widget.title = [NSString stringWithUTF8String: title];
}else{
widget.title = @"Save File";
}
// Set FileTypes
if ( strlen(types) > 0 ) {
NSString *fileTypes = [NSString stringWithUTF8String:types];
NSArray *fTypes = [fileTypes componentsSeparatedByString:@":"];
[widget setAllowedFileTypes:fTypes];
}
widget.showsResizeIndicator = YES;
widget.showsHiddenFiles = NO;
widget.canCreateDirectories = YES;
widget.allowsOtherFileTypes = YES;
// if ( [widget runModal] == NSModalResponseOK ) {
// path = [[widget URL] path];
// }
[widget beginSheetModalForWindow:parent completionHandler:^(NSInteger result) {
[NSApp stopModalWithCode:result];
}];
if ([NSApp runModalForWindow:parent] == NSFileHandlingPanelOKButton) {
NSString* path = [[widget URL] path];
return strdup([path UTF8String]);
}
return strdup([path UTF8String]);
}

@ -0,0 +1,38 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
@implementation CocoaSlider
{
}
@synthesize Value;
@synthesize sliderAction;
- (IBAction)onChanged:(id)sender{
self.Value = [sender intValue];
sliderAction(sender);
}
- (id) initWithFrame:(NSRect)rect callBack:(ACTION)callback {
self = [super initWithFrame: rect];
[self setMinValue:0];
[self setMaxValue:100];
[self setAllowsTickMarkValuesOnly:NO];
[self setNumberOfTickMarks:0];
[self setTickMarkPosition:1];
[self setTarget:self];
[self setContinuous: YES];
if (callback != NULL) {
[self setSliderAction: callback];
[self setAction: @selector(onChanged:)];
}
return self;
}
@end
id createSlider(id parent, int left, int top, int width, int height, ACTION callback) {
id widget = [[CocoaSlider alloc] initWithFrame:NSMakeRect(left, top, width, height) callBack:callback];
addToParent(parent, widget);
return widget;
}

@ -0,0 +1,131 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
#ifndef NSSTR
#define NSSTR(txt) [NSString stringWithUTF8String:txt]
#endif
@implementation CocoaTableView
@synthesize tbl;
@synthesize db;
@synthesize dict;
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
db = [NSMutableArray new];
dict = [NSMutableDictionary new];
if (self) {
tbl = [[NSTableView alloc] initWithFrame: NSMakeRect(5,40,335,185)];
[tbl setGridStyleMask: NSTableViewGridNone];
[tbl setUsesAlternatingRowBackgroundColors: YES];
[tbl setAllowsColumnSelection: YES];
[tbl setAllowsColumnReordering: YES];
[tbl setAllowsEmptySelection: NO];
[tbl setAllowsMultipleSelection: NO];
[tbl setColumnAutoresizingStyle: NSTableViewUniformColumnAutoresizingStyle];
[tbl setDataSource: self];
[tbl setDelegate: self];
[tbl setTarget:self];
[tbl setDoubleAction:@selector(doubleclicked:)];
[self setHasHorizontalScroller: YES];
[self setHasVerticalScroller: YES];
[self setDocumentView: tbl];
[self setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable];
[tbl reloadData];
cnt = 0;
}
return self;
}
- (void)doubleclicked:(id)sender
{
// int rowIndex = [sender selectedRow];
}
- (void)selected:(id)sender
{
// [tbl selectRowIndexes:[NSIndexSet indexSetWithIndex:item->row] byExtendingSelection:NO];
}
-(void)tableViewSelectionDidChange:(NSNotification *)notification
{
NSInteger row = [tbl selectedRow];
}
- (long)numberOfRowsInTableView:(NSTableView *)aTableView
{
return db.count;
// return dict.count;
}
-(id)tableView:(NSTableView *)tableView
objectValueForTableColumn:(NSTableColumn *)tableColumn
row:(NSInteger)row
{
// NSString *columnIdentifier = [tableColumn identifier];
return [self.db[row] valueForKey: [tableColumn identifier]];
// return [self.dict valueForKey: [tableColumn identifier]];
}
@end
id createTableView(id parent,int l, int t, int w, int h){
id self = [[[CocoaTableView alloc] initWithFrame:NSMakeRect( l, t, w, h )] autorelease];
addToParent(parent, self);
return self;
}
void addRow(id parent, const char *person) {
NSArray *tmpArray = [NSSTR(person) componentsSeparatedByString: @"|"];
NSMutableDictionary *myDic = [NSMutableDictionary new];
NSArray *columns = [[parent tbl] tableColumns];
for (int i = 0; i < tmpArray.count; i++) {
NSString *ident = [[parent tbl] tableColumns][i].identifier;
[myDic setObject: tmpArray[i] forKey: ident];
}
[[parent db] addObject: myDic];
[[parent tbl] reloadData];
}
void newTableColumn(id parent, const char *name) {
NSString *title = [NSString stringWithUTF8String: name];
id tCol = [[NSTableColumn alloc] initWithIdentifier: [title lowercaseString]];
[tCol setMinWidth: 200];
[tCol setTitle: title];
[[parent tbl] addTableColumn: tCol];
}
void tableviewSaveToFile(id tview, const char *path) {
[[tview db] writeToFile: NSSTR(path) atomically:YES];
}
void tableviewLoadFromFile(id tview, const char *path) {
NSArray *fileArrary = [NSArray arrayWithContentsOfFile: NSSTR(path)];
[[tview db] removeAllObjects];
for (NSMutableDictionary *x in fileArrary) {
[[tview db] addObject: x];
}
[[tview tbl] reloadData];
}

@ -0,0 +1,42 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
id createTabView(id parent, const char *label, int x, int y, int width, int height) {
NSString *str = [NSString stringWithUTF8String:label];
NSArray *items = [str componentsSeparatedByString: @"|"];
id *widget = [[[NSTabView alloc] initWithFrame:NSMakeRect(x,y,width,height)] autorelease];
for(NSString *x in items) {
id sv = [[[SaneView alloc] initWithFrame: NSZeroRect] autorelease];
[sv setBackgroundColor: [NSColor windowBackgroundColor]];
id *tabwidget = [[[NSTabViewItem alloc] initWithIdentifier: x ] autorelease];
[tabwidget setLabel: x];
[tabwidget setView: sv];
[widget addTabViewItem: tabwidget];
}
[[parent contentView] addSubview:widget];
return widget;
}
void addTab(id parent, const char *name) {
NSString *str = [NSString stringWithUTF8String:name];
NSArray *items = [str componentsSeparatedByString: @"|"];
for(NSString *x in items){
id *widget = [[[NSTabViewItem alloc] initWithIdentifier: x ] autorelease];
[widget setLabel: x];
[parent addTabViewItem: widget];
}
}
id getTab(id parent, const char *name) {
NSString *str = [NSString stringWithUTF8String:name];
NSInteger index = [parent indexOfTabViewItemWithIdentifier: str];
// NSLog(@"%@", [[parent tabViewItemAtIndex: index] view]);
return [parent tabViewItemAtIndex: index];
}

@ -0,0 +1,110 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
@implementation CocoaTextEdit
@synthesize widget;
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.widget = [[[NSTextView alloc] initWithFrame:frame] autorelease];
[[self.widget textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)];
[[self.widget textContainer] setWidthTracksTextView:NO];
[self.widget setHorizontallyResizable:YES];
[self.widget setTextContainerInset:NSMakeSize(2.0,2.0)];
[self.widget setAllowsUndo: YES];
[self setHasHorizontalScroller: YES];
[self setHasVerticalScroller: YES];
[self.widget setFont: [NSFont userFontOfSize:13.0]];
[self.widget setDelegate:self];
[self.widget becomeFirstResponder];
// [self.widget setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable];
[self setDocumentView: widget];
}
return self;
}
- (BOOL)performKeyEquivalent:(NSEvent *)theEvent
{
if (([theEvent type] == NSEventTypeKeyDown) && ([theEvent modifierFlags] & NSEventModifierFlagCommand)) {
NSResponder * responder = [[self window] firstResponder];
if ((responder != nil) && [responder isKindOfClass:[NSTextView class]]) {
NSTextView * textView = (NSTextView *)responder;
NSRange range = [textView selectedRange];
bool bHasSelectedTexts = (range.length > 0);
// NSLog(@"Keycod: %hu", [theEvent keyCode]);
unsigned short keyCode = [theEvent keyCode];
bool bHandled = false;
//6 Z, 7 X, 8 C, 9 V
if (keyCode == 6 ) {
if ([[textView undoManager] canUndo])
{
[[textView undoManager] undo];
bHandled = true;
}
}
else if (keyCode == 7 && bHasSelectedTexts) {
[textView cut:self];
bHandled = true;
}
else if (keyCode== 8 && bHasSelectedTexts) {
[textView copy:self];
bHandled = true;
}
else if (keyCode == 9) {
[textView paste:self];
bHandled = true;
}
if (bHandled)
return YES;
}
}
// }else if (([theEvent type] == NSEventTypeKeyDown) && ([theEvent modifierFlags] & NSEventModifierFlagCommand & NSEventModifierFlagShift)) {
// NSResponder * responder = [[self window] firstResponder];
// if ((responder != nil) && [responder isKindOfClass:[NSTextView class]]) {
// NSTextView * textView = (NSTextView *)responder;
// NSRange range = [textView selectedRange];
// bool bHasSelectedTexts = (range.length > 0);
// unsigned short keyCode = [theEvent keyCode];
// bool bHandled = false;
// if (keyCode == 6) {
// if ([[textView undoManager] canRedo])
// {
// [[textView undoManager] redo];
// bHandled = true;
// }
// }
// if (bHandled)
// return YES;
// }
// }
return NO;
}
@end
id createTextEdit(id parent, const char* txt, int l, int t, int w, int h) {
CocoaTextEdit *widget = [[[CocoaTextEdit alloc] initWithFrame:NSMakeRect( l, t, w, h )] autorelease];
if (strlen(txt)>0) {
NSString *str = [NSString stringWithUTF8String:txt];
[[widget documentView] setString:str];
}
addToParent(parent, widget);
return widget;
}

@ -0,0 +1,11 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
id createTextField(id parent, const char* txt, int l, int t, int w, int h){
NSTextField *widget = [[[NSTextField alloc] initWithFrame:NSMakeRect( l, t, w, h )] autorelease];
[widget setStringValue:[NSString stringWithUTF8String:txt]];
// [widget setAutoresizingMask: NSViewWidthSizable];
addToParent(parent, widget);
return widget;
}

@ -0,0 +1,117 @@
#import <Cocoa/Cocoa.h>
#import "col.h"
@implementation CocoaWindow : NSWindow
NSMenuItem* item;
NSMenu* subMenu;
-(id) initFormWithTitle:(NSString*)title width:(NSInteger)width height:(NSInteger)height windowStyle: (NSWindowStyleMask) style
{
self = [super initWithContentRect: NSMakeRect(0, 0, width, height)
styleMask: style //(NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskResizable)
// styleMask: (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)
backing: NSBackingStoreBuffered
defer: NO];
if (self) {
SaneView *sv;
sv = [[SaneView alloc] initWithFrame: [[self contentView] frame]];
[self setContentView:sv];
[sv setBackgroundColor: [NSColor windowBackgroundColor]];
[self setTitle: title];
[self center];
[self setMinSize: NSMakeSize(width,height)];
[self setInitialFirstResponder: nil];
[self setAutorecalculatesKeyViewLoop: YES];
[self makeKeyAndOrderFront:nil];
[self createApplicationMenu];
}
return self;
}
- (void)createApplicationMenu {
// Create MenuBar
id menubar = [[NSMenu new] autorelease];
id appMenuItem = [[NSMenuItem new] autorelease];
[menubar addItem:appMenuItem];
[NSApp setMainMenu:menubar];
// Create Application Menu
id appMenu = [[NSMenu new] autorelease];
id appName = [[NSProcessInfo processInfo] processName];
// About Menu
id aboutMenu =[[[NSMenuItem alloc] initWithTitle:[@"About " stringByAppendingString:appName]
action:@selector(orderFrontStandardAboutPanel:)
keyEquivalent:@""]
autorelease];
[appMenu addItem:aboutMenu];
// Preferences Menu
id prefMenu = [[[NSMenuItem alloc] initWithTitle:@"Preferences…"
action:NULL keyEquivalent:@","]
autorelease];
[prefMenu setTarget:self];
[appMenu addItem:prefMenu];
[appMenu addItem:[NSMenuItem separatorItem]];
// Show/Hide Menu
id hideMenuItem = [[[NSMenuItem alloc] initWithTitle:[@"Hide " stringByAppendingString:appName]
action:@selector(hide:)
keyEquivalent:@"h"]
autorelease];
[appMenu addItem:hideMenuItem];
id hideOthersMenuItem = [[[NSMenuItem alloc] initWithTitle:@"Hide Others"
action:@selector(hideOtherApplications:)
keyEquivalent:@"h"]
autorelease];
[hideOthersMenuItem setKeyEquivalentModifierMask:(NSEventModifierFlagOption | NSEventModifierFlagCommand)];
[appMenu addItem:hideOthersMenuItem];
id showMenuItem = [[[NSMenuItem alloc] initWithTitle:@"Show All"
action:@selector(unhideAllApplications:)
keyEquivalent:@""]
autorelease];
[appMenu addItem:showMenuItem];
[appMenu addItem:[NSMenuItem separatorItem]];
// Quit Menu
id quitMenuItem=[[[NSMenuItem alloc] initWithTitle:@"Quit"
action:@selector(terminate:)
keyEquivalent:@"q"]
autorelease];
[appMenu addItem:quitMenuItem];
[appMenuItem setSubmenu:appMenu];
}
- (void)applicationDidFinishLaunching: (NSNotification *)notification
{
[[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self];
}
- (BOOL)applicationShouldTerminateAfterLastWindowClosed: (NSNotification *)notification
{
return YES;
}
- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification
{
return YES;
}
@end
id createWindow(const char* title, int width, int height, NSWindowStyleMask style) {
return [[[CocoaWindow alloc] initFormWithTitle:[NSString stringWithUTF8String:title] width: width height: height windowStyle: style] autorelease];
}
Loading…
Cancel
Save