ruby_on_skis 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.textile +88 -0
- data/Rakefile +67 -0
- data/VERSION +1 -0
- data/bin/init.rb +18 -0
- data/bin/pinit.rb +27 -0
- data/config/environment.rb +189 -0
- data/config/gemconfigure.rb +24 -0
- data/config/requires.yml +15 -0
- data/data/lorem.txt +101 -0
- data/fixtures/messages.yml +7 -0
- data/images/ruby_on_skis.ico +0 -0
- data/lib/extensions/string/truncate.rb +16 -0
- data/lib/models/message.rb +11 -0
- data/lib/wx/app/app_frame.rb +56 -0
- data/lib/wx/app/message_panel.rb +98 -0
- data/lib/wx/app/taskbar_icon.rb +26 -0
- data/lib/wx/app.xrc +1 -0
- data/lib/wx/base/appframebase.rb +46 -0
- data/lib/wx/base/messagepanelbase.rb +45 -0
- data/lib/wx/helpers/app_helper.rb +86 -0
- data/migrate/20081128200300_init.rb +14 -0
- data/package/config.yml +29 -0
- data/package/installer.nsi +185 -0
- data/ruby_on_skis.fbp +742 -0
- data/script/console +11 -0
- data/spec/config/environment_spec.rb +53 -0
- data/spec/extensions/string/truncate_spec.rb +23 -0
- data/spec/models/message_spec.rb +43 -0
- data/spec/spec.opts +7 -0
- data/spec/spec_helper.rb +21 -0
- data/tasks/database.rake +20 -0
- data/tasks/mswin.rake +62 -0
- data/tasks/osx.rake +73 -0
- data/tasks/package_lib.rake +130 -0
- metadata +99 -0
@@ -0,0 +1,98 @@
|
|
1
|
+
# MesagePanelBase will be defined by the XRC generated from
|
2
|
+
# wxFormBuilder. Use the "Subclass" property in wxFB for the
|
3
|
+
# panel to define it.
|
4
|
+
class MessagePanel < MessagePanelBase
|
5
|
+
include AppHelper
|
6
|
+
include Wx
|
7
|
+
|
8
|
+
NAME_COL = 0
|
9
|
+
DELETE_COL = 1
|
10
|
+
|
11
|
+
attr_reader :top_window, :editor, :messages, :message_names, :delete
|
12
|
+
|
13
|
+
def initialize(parent)
|
14
|
+
super(parent)
|
15
|
+
|
16
|
+
@top_window = get_app.get_top_window
|
17
|
+
|
18
|
+
# wxFormBuilder does not support all widgets. Here is an example of how to
|
19
|
+
# include an unsupported widget. Just define a small wxStaticLine in wxFB, then
|
20
|
+
# use that as the 'handle' to add the widget to the staticline's container.
|
21
|
+
|
22
|
+
@editor = StyledTextCtrl.new(self, :style => SUNKEN_BORDER, :border => 10)
|
23
|
+
editor.set_wrap_mode 1
|
24
|
+
editor.set_margin_width 1, 30
|
25
|
+
editor.set_margin_type 1,1 # Line numbers
|
26
|
+
editor.set_zoom(5) if Environment.mswin?
|
27
|
+
staticline.get_containing_sizer.add(editor,1,EXPAND)
|
28
|
+
|
29
|
+
evt_button add_button, :on_add_button
|
30
|
+
evt_button delete_button, :on_delete_button
|
31
|
+
evt_grid_cell_left_click :on_grid_cell_left_click
|
32
|
+
evt_grid_cell_left_dclick { | evt | evt.veto }
|
33
|
+
|
34
|
+
init_grid
|
35
|
+
end
|
36
|
+
|
37
|
+
def delete_col?(column)
|
38
|
+
column == DELETE_COL
|
39
|
+
end
|
40
|
+
|
41
|
+
def on_grid_cell_left_click(evt)
|
42
|
+
return unless delete_col?(evt.get_col)
|
43
|
+
if record_grid.get_cell_value(evt.get_row, DELETE_COL) == "1"
|
44
|
+
record_grid.set_cell_value(evt.get_row, DELETE_COL, "0")
|
45
|
+
delete.delete(evt.get_row)
|
46
|
+
else
|
47
|
+
record_grid.set_cell_value(evt.get_row, DELETE_COL, "1")
|
48
|
+
delete << evt.get_row
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def on_add_button
|
53
|
+
Message.create!(:name => name_text_ctrl.get_value, :content => editor.get_text)
|
54
|
+
record_grid.append_rows(1)
|
55
|
+
load_grid
|
56
|
+
rescue ActiveRecord::ActiveRecordError => e
|
57
|
+
error_alert(e.to_s)
|
58
|
+
end
|
59
|
+
|
60
|
+
def on_delete_button
|
61
|
+
delete.each do | index |
|
62
|
+
messages[index].destroy
|
63
|
+
record_grid.delete_rows(0,1)
|
64
|
+
end
|
65
|
+
load_grid
|
66
|
+
rescue ActiveRecord::ActiveRecordError => e
|
67
|
+
error_alert(e.to_s)
|
68
|
+
end
|
69
|
+
|
70
|
+
def init_grid
|
71
|
+
@delete = []
|
72
|
+
|
73
|
+
record_grid.create_grid(Message.count, 2 )
|
74
|
+
record_grid.set_col_label_value(NAME_COL, "Name")
|
75
|
+
record_grid.set_col_label_value(DELETE_COL, "Delete?")
|
76
|
+
record_grid.set_col_format_bool(DELETE_COL)
|
77
|
+
record_grid.set_default_cell_alignment(-1, ALIGN_CENTRE)
|
78
|
+
|
79
|
+
load_grid
|
80
|
+
end
|
81
|
+
|
82
|
+
def load_grid
|
83
|
+
@messages = Message.ordered_by_name
|
84
|
+
@message_names = Message.names
|
85
|
+
delete.clear
|
86
|
+
record_grid.clear_grid
|
87
|
+
|
88
|
+
message_names.each_with_index do | name, i |
|
89
|
+
record_grid.set_cell_value(i, NAME_COL, name.truncate(40))
|
90
|
+
record_grid.set_read_only(i, NAME_COL)
|
91
|
+
|
92
|
+
record_grid.set_cell_alignment(i, DELETE_COL, ALIGN_CENTRE, ALIGN_TOP)
|
93
|
+
end
|
94
|
+
|
95
|
+
record_grid.auto_size
|
96
|
+
record_grid.get_containing_sizer.layout
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class MyTaskBarIcon < Wx::TaskBarIcon
|
2
|
+
include AppHelper
|
3
|
+
TBMENU_RESTORE = 6000
|
4
|
+
TBMENU_CLOSE = 6001
|
5
|
+
TBMENU_CHANGE = 6002
|
6
|
+
TBMENU_REMOVE = 6003
|
7
|
+
|
8
|
+
def initialize(frame)
|
9
|
+
super()
|
10
|
+
|
11
|
+
@frame = frame
|
12
|
+
|
13
|
+
# starting image
|
14
|
+
icon = make_icon("#{Environment.app_name.underscore}.ico")
|
15
|
+
set_icon(icon, "#{Environment.app_name}")
|
16
|
+
@image_index = 1
|
17
|
+
|
18
|
+
# events
|
19
|
+
evt_taskbar_left_dclick {|evt| on_taskbar_activate(evt) }
|
20
|
+
|
21
|
+
evt_menu(TBMENU_RESTORE) {|evt| on_taskbar_activate(evt) }
|
22
|
+
evt_menu(TBMENU_CLOSE) { @frame.close }
|
23
|
+
evt_menu(TBMENU_CHANGE) {|evt| on_taskbar_change(evt) }
|
24
|
+
evt_menu(TBMENU_REMOVE) { remove_icon }
|
25
|
+
end
|
26
|
+
end
|
data/lib/wx/app.xrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
# This class was automatically generated from XRC source. It is not
|
3
|
+
# recommended that this file is edited directly; instead, inherit from
|
4
|
+
# this class and extend its behaviour there.
|
5
|
+
#
|
6
|
+
# Source file: /Volumes/Projects/ruby_on_skis/lib/wx/app.xrc
|
7
|
+
# Generated at: Sun Apr 19 10:53:44 -0500 2009
|
8
|
+
|
9
|
+
class AppFrameBase < Wx::Frame
|
10
|
+
|
11
|
+
attr_reader :notebook, :menubar, :file_menu, :quit_menu_item,
|
12
|
+
:help_menu, :open, :status_bar
|
13
|
+
|
14
|
+
def initialize(parent = nil)
|
15
|
+
super()
|
16
|
+
xml = Wx::XmlResource.get
|
17
|
+
xml.flags = 2 # Wx::XRC_NO_SUBCLASSING
|
18
|
+
xml.init_all_handlers
|
19
|
+
xml.load(File.dirname(__FILE__) + '/../app.xrc')
|
20
|
+
xml.load_frame_subclass(self, parent, "AppFrame")
|
21
|
+
|
22
|
+
finder = lambda do | x |
|
23
|
+
int_id = Wx::xrcid(x)
|
24
|
+
begin
|
25
|
+
Wx::Window.find_window_by_id(int_id, self) || int_id
|
26
|
+
# Temporary hack to work around regression in 1.9.2; remove
|
27
|
+
# begin/rescue clause in later versions
|
28
|
+
rescue RuntimeError
|
29
|
+
int_id
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
@notebook = finder.call("notebook")
|
34
|
+
@menubar = finder.call("menubar")
|
35
|
+
@file_menu = finder.call("file_menu")
|
36
|
+
@quit_menu_item = finder.call("quit_menu_item")
|
37
|
+
@help_menu = finder.call("help_menu")
|
38
|
+
@open = finder.call("Open")
|
39
|
+
@status_bar = finder.call("status_bar")
|
40
|
+
if self.class.method_defined? "on_init"
|
41
|
+
self.on_init()
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
|
2
|
+
# This class was automatically generated from XRC source. It is not
|
3
|
+
# recommended that this file is edited directly; instead, inherit from
|
4
|
+
# this class and extend its behaviour there.
|
5
|
+
#
|
6
|
+
# Source file: /Volumes/Projects/ruby_on_skis/lib/wx/app.xrc
|
7
|
+
# Generated at: Sun Apr 19 10:53:44 -0500 2009
|
8
|
+
|
9
|
+
class MessagePanelBase < Wx::Panel
|
10
|
+
|
11
|
+
attr_reader :name_label, :name_text_ctrl, :add_button, :staticline,
|
12
|
+
:record_grid, :delete_button
|
13
|
+
|
14
|
+
def initialize(parent = nil)
|
15
|
+
super()
|
16
|
+
xml = Wx::XmlResource.get
|
17
|
+
xml.flags = 2 # Wx::XRC_NO_SUBCLASSING
|
18
|
+
xml.init_all_handlers
|
19
|
+
xml.load(File.dirname(__FILE__) + '/../app.xrc')
|
20
|
+
xml.load_panel_subclass(self, parent, "MessagePanel")
|
21
|
+
|
22
|
+
finder = lambda do | x |
|
23
|
+
int_id = Wx::xrcid(x)
|
24
|
+
begin
|
25
|
+
Wx::Window.find_window_by_id(int_id, self) || int_id
|
26
|
+
# Temporary hack to work around regression in 1.9.2; remove
|
27
|
+
# begin/rescue clause in later versions
|
28
|
+
rescue RuntimeError
|
29
|
+
int_id
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
@name_label = finder.call("name_label")
|
34
|
+
@name_text_ctrl = finder.call("name_text_ctrl")
|
35
|
+
@add_button = finder.call("add_button")
|
36
|
+
@staticline = finder.call("staticline")
|
37
|
+
@record_grid = finder.call("record_grid")
|
38
|
+
@delete_button = finder.call("delete_button")
|
39
|
+
if self.class.method_defined? "on_init"
|
40
|
+
self.on_init()
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module AppHelper
|
2
|
+
include Wx
|
3
|
+
|
4
|
+
def error_alert(message)
|
5
|
+
alert(message, "Error")
|
6
|
+
end
|
7
|
+
|
8
|
+
def success_alert(message)
|
9
|
+
alert(message, "Success")
|
10
|
+
end
|
11
|
+
|
12
|
+
def alert(message, title)
|
13
|
+
@top_window ||= get_app.get_top_window
|
14
|
+
alert = MessageDialog.new(@top_window, message, title, OK )
|
15
|
+
alert.show_modal
|
16
|
+
end
|
17
|
+
|
18
|
+
def confirm(message)
|
19
|
+
confirm = Wx::MessageDialog.new(parent, message, "Confirm")
|
20
|
+
confirm.show_modal == ID_OK
|
21
|
+
end
|
22
|
+
|
23
|
+
def new_id
|
24
|
+
@int ||= 1000
|
25
|
+
@int +=1
|
26
|
+
end
|
27
|
+
|
28
|
+
def make_icon(imgname)
|
29
|
+
# Different platforms have different requirements for the
|
30
|
+
# taskbar icon size
|
31
|
+
filename = "#{Environment.app_root}/images/#{imgname}"
|
32
|
+
img = Wx::Image.new(filename)
|
33
|
+
if Wx::PLATFORM == "WXMSW"
|
34
|
+
img = img.scale(16, 16)
|
35
|
+
elsif Wx::PLATFORM == "WXGTK"
|
36
|
+
img = img.scale(22, 22)
|
37
|
+
elsif Wx::PLATFORM == "WXMAC"
|
38
|
+
# img = img.scale(16, 16)
|
39
|
+
end
|
40
|
+
# WXMAC can be any size up to 128x128, so don't scale
|
41
|
+
icon = Wx::Icon.new
|
42
|
+
icon.copy_from_bitmap(Wx::Bitmap.new(img))
|
43
|
+
return icon
|
44
|
+
end
|
45
|
+
|
46
|
+
def status_bar_reset(message="")
|
47
|
+
status_bar_update(message)
|
48
|
+
get_status_bar.set_background_colour NULL_COLOUR
|
49
|
+
end
|
50
|
+
|
51
|
+
def status_bar_success(message)
|
52
|
+
status_bar_update(message)
|
53
|
+
get_status_bar.set_background_colour GREEN
|
54
|
+
end
|
55
|
+
|
56
|
+
def status_bar_warning(message)
|
57
|
+
status_bar_update(message)
|
58
|
+
get_status_bar.set_background_colour YELLOW
|
59
|
+
end
|
60
|
+
|
61
|
+
def status_bar_error(message)
|
62
|
+
status_bar_update(message)
|
63
|
+
get_status_bar.set_background_colour RED
|
64
|
+
end
|
65
|
+
|
66
|
+
def status_bar_update(message)
|
67
|
+
get_status_bar.status_text = message
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_status_bar
|
71
|
+
@status_bar ||= get_app.get_top_window.status_bar
|
72
|
+
end
|
73
|
+
|
74
|
+
def open_command(target)
|
75
|
+
open_command = if Environment.darwin?
|
76
|
+
"open"
|
77
|
+
elsif Environment.mswin?
|
78
|
+
"start"
|
79
|
+
else
|
80
|
+
raise "No open command defined for #{RUBY_PLATFORM}"
|
81
|
+
end
|
82
|
+
Thread.new do
|
83
|
+
system("#{open_command} #{target}")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/package/config.yml
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# The directories you want to include for all platforms are placed in the [:common][:include_dirs] section.
|
2
|
+
# The files that you want to include for all platforms are placen in the [:common][:include_files] section.
|
3
|
+
# The same idea works for the platform-specific sections. The introspection process to find the files/libraries
|
4
|
+
# necessary only works for executable code, so you will have to use these sections to include files that
|
5
|
+
# the introspection process does not bring in.
|
6
|
+
---
|
7
|
+
:common:
|
8
|
+
# Be aware that you will need to reference these directories in the installer.nsi file as well.
|
9
|
+
:include_dirs:
|
10
|
+
- images
|
11
|
+
- config
|
12
|
+
- migrate
|
13
|
+
:include_files:
|
14
|
+
- /lib/wx/app.xrc
|
15
|
+
i686-darwin9:
|
16
|
+
:include_files:
|
17
|
+
- :source: /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/locale/en.yml
|
18
|
+
:target: /lib/active_record/locale
|
19
|
+
- :source: /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/locale/en.yml
|
20
|
+
:target: /lib/active_support/locale
|
21
|
+
i386-mswin32:
|
22
|
+
# This key doesn't actually get pulled into the package, it is merely to point to the NSIS executable,
|
23
|
+
# to configure that for the package:mswin Rake task.
|
24
|
+
:makensis: C:/Program Files/NSIS/makensis.exe
|
25
|
+
:include_files:
|
26
|
+
- :source: C:/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/locale/en.yml
|
27
|
+
:target: /lib/active_record/locale
|
28
|
+
- :source: C:/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/locale/en.yml
|
29
|
+
:target: /lib/active_support/locale
|
@@ -0,0 +1,185 @@
|
|
1
|
+
!addincludedir $SMPROGRAMS\NSIS\Include
|
2
|
+
|
3
|
+
; Use the Modern UI
|
4
|
+
!include "MUI.nsh"
|
5
|
+
|
6
|
+
; The name of the installer
|
7
|
+
Name "${APP_NAME}"
|
8
|
+
|
9
|
+
; The file to write
|
10
|
+
OutFile "${APP_NAME_DOWNCASE}-install-${VERSION}.exe"
|
11
|
+
|
12
|
+
; The default installation directory
|
13
|
+
InstallDir $PROGRAMFILES\${APP_NAME}
|
14
|
+
|
15
|
+
; Registry key to check for directory (so if you install again, it will
|
16
|
+
; overwrite the old one automatically)
|
17
|
+
InstallDirRegKey HKLM "Software\NSIS_${APP_NAME}" "Install_Dir"
|
18
|
+
SetCompressor zlib
|
19
|
+
|
20
|
+
VIProductVersion ${VERSIONEXTRA}
|
21
|
+
|
22
|
+
VIAddVersionKey FileVersion ${VERSION}
|
23
|
+
VIAddVersionKey FileDescription "${APP_NAME} installer"
|
24
|
+
VIAddVersionKey LegalCopyright "Private - No Copying"
|
25
|
+
VIAddVersionKey ProductName ${APP_NAME}
|
26
|
+
|
27
|
+
BrandingText "${APP_NAME} ${VERSION} Installer"
|
28
|
+
|
29
|
+
;Interface Settings
|
30
|
+
|
31
|
+
!define MUI_ABORTWARNING
|
32
|
+
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico"
|
33
|
+
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\orange-uninstall.ico"
|
34
|
+
!define MUI_HEADERIMAGE 1
|
35
|
+
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\orange.bmp"
|
36
|
+
!define MUI_HEADERIMAGE_UNBITMAP "${NSISDIR}\Contrib\Graphics\Header\orange-uninstall.bmp"
|
37
|
+
; Pages
|
38
|
+
|
39
|
+
!insertmacro MUI_PAGE_COMPONENTS
|
40
|
+
!insertmacro MUI_PAGE_DIRECTORY
|
41
|
+
!insertmacro MUI_PAGE_INSTFILES
|
42
|
+
|
43
|
+
!insertmacro MUI_UNPAGE_CONFIRM
|
44
|
+
!insertmacro MUI_UNPAGE_INSTFILES
|
45
|
+
|
46
|
+
!insertmacro MUI_LANGUAGE "English"
|
47
|
+
;--------------------------------
|
48
|
+
|
49
|
+
; The stuff to install
|
50
|
+
Section "${APP_NAME}" SecCore
|
51
|
+
SectionIn RO
|
52
|
+
|
53
|
+
; Set output path to the installation directory.
|
54
|
+
SetOutPath $INSTDIR
|
55
|
+
|
56
|
+
; Put all the build files there
|
57
|
+
; File /r build\*.*
|
58
|
+
File /r ${BUILD_DIR}\*.*
|
59
|
+
; And the standard ruby script
|
60
|
+
;File /r mswin-init.rb
|
61
|
+
|
62
|
+
; Write the installation path into the registry
|
63
|
+
WriteRegStr HKLM SOFTWARE\NSIS_${APP_NAME} "Install_Dir" "$INSTDIR"
|
64
|
+
|
65
|
+
; back up old value of ${APP_DOC_EXTENSION}
|
66
|
+
!define Index "Line${__LINE__}"
|
67
|
+
ReadRegStr $1 HKCR "${APP_DOC_EXTENSION}" ""
|
68
|
+
StrCmp $1 "" "${Index}-NoBackup"
|
69
|
+
StrCmp $1 "${APP_NAME}" "${Index}-NoBackup"
|
70
|
+
WriteRegStr HKCR "${APP_DOC_EXTENSION}" "backup_val" $1
|
71
|
+
"${Index}-NoBackup:"
|
72
|
+
|
73
|
+
WriteRegStr HKCR "${APP_DOC_EXTENSION}" "" "${APP_NAME}"
|
74
|
+
ReadRegStr $0 HKCR "${APP_NAME}" ""
|
75
|
+
StrCmp $0 "" 0 "${Index}-Skip"
|
76
|
+
|
77
|
+
WriteRegStr HKCR "${APP_NAME}" "" "${APP_NAME}"
|
78
|
+
"${Index}-Skip:"
|
79
|
+
WriteRegStr HKCR "${APP_NAME}\shell" "" "open"
|
80
|
+
WriteRegStr HKCR "${APP_NAME}\DefaultIcon" "" "$INSTDIR\share\icons\project.ico"
|
81
|
+
WriteRegStr HKCR "${APP_NAME}\shell\open\command" "" '$INSTDIR\${APP_NAME_DOWNCASE}.exe "%1"'
|
82
|
+
!undef Index
|
83
|
+
|
84
|
+
; Write the uninstall keys for Windows
|
85
|
+
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "DisplayName" "NSIS ${APP_NAME}"
|
86
|
+
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "UninstallString" '"$INSTDIR\uninstall.exe"'
|
87
|
+
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "NoModify" 1
|
88
|
+
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "NoRepair" 1
|
89
|
+
WriteUninstaller "uninstall.exe"
|
90
|
+
|
91
|
+
SectionEnd
|
92
|
+
|
93
|
+
LangString DESC_SecCore ${LANG_ENGLISH} "${APP_NAME} software (required)"
|
94
|
+
|
95
|
+
; Optional section (can be disabled by the user)
|
96
|
+
Section "Start Menu Shortcuts" SecShortcuts
|
97
|
+
|
98
|
+
SetOutPath "$INSTDIR\bin"
|
99
|
+
CreateDirectory "$SMPROGRAMS\${APP_NAME}"
|
100
|
+
CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" "$INSTDIR\bin\${APP_NAME_DOWNCASE}.exe" "pinit.rb" "$INSTDIR\images\${APP_NAME_DOWNCASE}.ico" 0
|
101
|
+
CreateShortCut "$INSTDIR\${APP_NAME}.lnk" "$SYSDIR\wscript.exe" "run.vbs" "$INSTDIR\images\${APP_NAME_DOWNCASE}.ico" 0
|
102
|
+
SetOutPath $INSTDIR
|
103
|
+
CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME} Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\images\${APP_NAME_DOWNCASE}.ico" 0
|
104
|
+
|
105
|
+
SectionEnd
|
106
|
+
|
107
|
+
LangString DESC_SecShortcuts ${LANG_ENGLISH} "Add shortcuts to ${APP_NAME} to the Windows start menu (recommended)"
|
108
|
+
|
109
|
+
; Optional section (can be disabled by the user)
|
110
|
+
Section "Quicklaunch Shortcut" SecQShortcut
|
111
|
+
|
112
|
+
SetOutPath "$INSTDIR\bin"
|
113
|
+
; CreateDirectory "$SMPROGRAMS\${APP_NAME}"
|
114
|
+
CreateShortCut "$QUICKLAUNCH\${APP_NAME}.lnk" "$INSTDIR\bin\${APP_NAME_DOWNCASE}.exe" "pinit.rb" "$INSTDIR\images\${APP_NAME_DOWNCASE}.ico" 0
|
115
|
+
|
116
|
+
SectionEnd
|
117
|
+
|
118
|
+
LangString DESC_SecQShortcut ${LANG_ENGLISH} "Add Quicklaunch shortcut to ${APP_NAME} (recommended)"
|
119
|
+
|
120
|
+
;Section "Help and Documentation" SecHelpfiles
|
121
|
+
|
122
|
+
; Set output path to the installation directory.
|
123
|
+
; SetOutPath $INSTDIR
|
124
|
+
;File "doc\wefthelp.chm"
|
125
|
+
;File "doc\wefthelp.pdf"
|
126
|
+
;SectionEnd
|
127
|
+
; LangString DESC_SecHelpfiles ${LANG_ENGLISH} "Install the ${APP_NAME} help file and documentation (recommended)"
|
128
|
+
|
129
|
+
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
130
|
+
!insertmacro MUI_DESCRIPTION_TEXT ${SecCore} $(DESC_SecCore)
|
131
|
+
!insertmacro MUI_DESCRIPTION_TEXT ${SecShortcuts} $(DESC_SecShortcuts)
|
132
|
+
!insertmacro MUI_DESCRIPTION_TEXT ${SecQShortcut} $(DESC_SecQShortcut)
|
133
|
+
;!insertmacro MUI_DESCRIPTION_TEXT ${SecHelpfiles} $(DESC_SecHelpfiles)
|
134
|
+
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
135
|
+
|
136
|
+
; Uninstaller
|
137
|
+
|
138
|
+
Section "Uninstall"
|
139
|
+
|
140
|
+
; Remove registry keys
|
141
|
+
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}"
|
142
|
+
DeleteRegKey HKLM SOFTWARE\NSIS_${APP_NAME}
|
143
|
+
|
144
|
+
; Delete the installed files
|
145
|
+
; RMDir /r "$INSTDIR\share"
|
146
|
+
RMDir /r "$INSTDIR\lib"
|
147
|
+
RMDir /r "$INSTDIR\bin"
|
148
|
+
RMDir /r "$INSTDIR\config"
|
149
|
+
RMDir /r "$INSTDIR\images"
|
150
|
+
RMDir /r "$INSTDIR\migrate"
|
151
|
+
; RMDir /r "$INSTDIR\doc"
|
152
|
+
; Delete "$INSTDIR\*.dll"
|
153
|
+
Delete "$INSTDIR\*.lnk"
|
154
|
+
; Delete "$INSTDIR\${APP_NAME_DOWNCASE}*"
|
155
|
+
Delete "$INSTDIR\uninstall.exe"
|
156
|
+
RMDir $INSTDIR
|
157
|
+
|
158
|
+
; Remove shortcuts, if any
|
159
|
+
Delete "$SMPROGRAMS\${APP_NAME}\*.*"
|
160
|
+
Delete "$SMPROGRAMS\${APP_NAME}\*.*"
|
161
|
+
Delete "$QUICKLAUNCH\${APP_NAME}.lnk"
|
162
|
+
|
163
|
+
; Remove directories used
|
164
|
+
RMDir "$SMPROGRAMS\${APP_NAME}"
|
165
|
+
RMDir "$SMPROGRAMS\${APP_NAME}"
|
166
|
+
|
167
|
+
|
168
|
+
;start of restore script
|
169
|
+
!define Index "Line${__LINE__}"
|
170
|
+
ReadRegStr $1 HKCR "${APP_DOC_EXTENSION}" ""
|
171
|
+
StrCmp $1 "${APP_NAME}" 0 "${Index}-NoOwn" ; only do this if we own it
|
172
|
+
ReadRegStr $1 HKCR "${APP_DOC_EXTENSION}" "backup_val"
|
173
|
+
StrCmp $1 "" 0 "${Index}-Restore" ; if backup="" then delete the whole key
|
174
|
+
DeleteRegKey HKCR "${APP_DOC_EXTENSION}"
|
175
|
+
Goto "${Index}-NoOwn"
|
176
|
+
"${Index}-Restore:"
|
177
|
+
WriteRegStr HKCR "${APP_DOC_EXTENSION}" "" $1
|
178
|
+
DeleteRegValue HKCR "${APP_DOC_EXTENSION}" "backup_val"
|
179
|
+
|
180
|
+
DeleteRegKey HKCR "${APP_NAME}" ;Delete key with association settings
|
181
|
+
|
182
|
+
"${Index}-NoOwn:"
|
183
|
+
!undef Index
|
184
|
+
|
185
|
+
SectionEnd
|