main.ss
#lang scheme/gui

;; ##################################################################################
;; # ============================================================================== #
;; # MrEd Designer - main.ss                                                        #
;; # http://mred-designer.origo.ethz.ch                                             #
;; # Copyright (C) Lozi Jean-Pierre, 2004 - mailto:jean-pierre@lozi.org             #
;; # Copyright (C) Peter Ivanyi, 2007                                               #
;; # Copyright (C) Laurent Orseau, 2010                                             #
;; # ============================================================================== #
;; #                                                                                #
;; # This program is free software; you can redistribute it and/or                  #
;; # modify it under the terms of the GNU General Public License                    #
;; # as published by the Free Software Foundation; either version 2                 #
;; # of the License, or (at your option) any later version.                         #
;; #                                                                                #
;; # This program is distributed in the hope that it will be useful,                #
;; # but WITHOUT ANY WARRANTY; without even the implied warranty of                 #
;; # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                  #
;; # GNU General Public License for more details.                                   #
;; #                                                                                #
;; # You should have received a copy of the GNU General Public License              #
;; # along with this program; if not, write to the Free Software                    #
;; # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.    #
;; #                                                                                #
;; ##################################################################################

; See project-manager.ss to build a package.

; TODO (see also TODO.txt):
; - widgets: popup menu (?), message-box, put-file, get-file, get-color-from-user,
;   get-font-from-user, get-text-from-user, get-choices from user, ...
;   panel:vertical-dragable (+horiz), hierarchy-list,
; - move-one-up, move-one-down in hierarchy (not really needed thanks to Copy/Cut/Paste ?)
; - #f or number for fields like x, min-width, etc.
; - Copy/paste w/o children ?
; - Plugins can add menu items ?
;   e.g., the Project plugin adds Save, Load to the menu bar !
;   Then, it should be specific to the project!
; - show/hide for widgets ?
; - project images are relative to project file (not if project not saved)?!
; - a "load template from file" button? (+ save)
;   In the "Quick Templates" choice% appear the global templates (the one in the
;   "templates" directory) + the templates that are in the same directory as the
;   opened project?
; - templates can be used as plugins : add a button in the correct box (Templates ?)
;   if there is an associated image, use it
; - The widget-class (gen-code-class) should be optionable
; - "Del" shortcut for "Delete" button
; - generate Stub Controller code ? printf of the method name
; - in template-load.ss: generalize the require of plugin preview classes
;   instead of an ad-hoc scheme
; - return to default value: completely rewrite the default property!
; this is useful for updating from an old style
; - prop:range with a slider% for integers between 2 values
; - check ids duplicates when the user changes them!
; - integrate board.ss (matrix +canvas) as a plugin


; General renamings to do:
; - for-each-send -> for-each/send (?)
; - map-send -> map/send (although : append-map)
; - code-gen-class -> widget-code-class (?)
; - mred-id -> med-id (?)
; - prop:... -> ??
; - code-write -> constructor-code ?

(require "mred-plugin.ss"
         "property-frame.ss"
         "toolbox-frame.ss"
         "hierarchy-frame.ss"
         "mreddesigner-misc.ss"
         "controller.ss"
         "templates.ss"
         )

; Modify the current directory to be the same as this file directory:
(require scheme/runtime-path)
(define-runtime-path here-directory (build-path 'same))
(current-directory here-directory)


(set-debug #f)

; Load the widget plugins:
(load-mred-widget-plugins)

; Load the templates:
(make-template-dict)

(make-toolbox-frame
 #:exit-application-callback controller-exit-application
 #:plugin-button-callback    controller-create-mred-id
 #:generate-code-callback    controller-generate-code
 #:generate-code-to-console-callback controller-generate-code-to-console
 #:new-project-callback      controller-new-project
 #:load-project-callback     controller-load-project
 #:save-project-callback     controller-save-project
 #:close-project-callback    controller-close-project
 #:add-template-callback     controller-load-template
 #:save-template-callback    controller-save-template
 #:replace-template-callback controller-replace-current-template
 #:delete-template-callback  controller-delete-template
 #:show-properties-callback  controller-show-property-frame
 #:show-hierarchy-callback   controller-show-hierarchy-frame
 #:cut-callback   controller-cut
 #:copy-callback  controller-copy
 #:paste-callback controller-paste
 )
(make-property-frame 
 toolbox-frame
 #:update-callback controller-replace-current-widget
 )
(make-hierarchy-frame 
 toolbox-frame
 #:on-select-callback controller-select-mred-id
 #:delete-callback    controller-delete-mred-id
 #:move-up-callback   controller-move-up
 #:move-down-callback controller-move-down
 #:cut-callback   controller-cut
 #:copy-callback  controller-copy
 #:paste-callback controller-paste
 #:show/hide-callback controller-show/hide
 )

;(define project-plugin (get-widget-plugin 'project))
(controller-new-project)

(show-toolbox-frame)
(show-property-frame)
(show-hierarchy-frame)