gvcsfx 0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,59 @@
1
+ # Copyright (C) 2020 Chris Liaw <chrisliaw@antrapol.com>
2
+ # Author: Chris Liaw <chrisliaw@antrapol.com>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+
18
+
19
+ module GvcsFx
20
+ module Listener
21
+
22
+ Event = {
23
+ workspace_added: :workspace_added,
24
+ workspace_selection_changed: :workspace_selection_changed
25
+ }
26
+
27
+ def register(event, proctal)
28
+ if not is_event_listed?(event)
29
+ event_listeners[event] = []
30
+ end
31
+
32
+ event_listeners[event] << proctal
33
+ end
34
+
35
+ def deregister(event,proctal)
36
+ event_listeners[event].delete(proctal)
37
+ end
38
+
39
+ def raise_event(event, opts = { })
40
+ event_listeners[event].each do |hdl|
41
+ hdl.call(opts)
42
+ end
43
+ end
44
+
45
+ private
46
+ def event_listeners
47
+ if @eventListener.nil?
48
+ @eventListener = { }
49
+ end
50
+
51
+ @eventListener
52
+ end
53
+
54
+ def is_event_listed?(evt)
55
+ event_listeners.keys.include?(evt)
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,191 @@
1
+ # Copyright (C) 2020 Chris Liaw <chrisliaw@antrapol.com>
2
+ # Author: Chris Liaw <chrisliaw@antrapol.com>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+
18
+ require 'toolrack'
19
+
20
+ require 'gvcs'
21
+ require 'git_cli'
22
+
23
+ require_relative 'fx_alert'
24
+
25
+ require_relative "workspace"
26
+ require_relative "tab_state"
27
+ require_relative "tab_files"
28
+ require_relative "tab_branches"
29
+ require_relative "tab_tags"
30
+ require_relative "tab_repos"
31
+ require_relative "tab_logs"
32
+ require_relative "tab_ignore_rules"
33
+
34
+ require_relative "listener"
35
+ require_relative "notification"
36
+ require_relative "event_handler"
37
+
38
+ require_relative '../lib/log_helper'
39
+
40
+ require_relative 'add_workspace_controller'
41
+ require_relative 'stash_select_controller'
42
+
43
+ module GvcsFx
44
+ class MainWinController
45
+ include JRubyFX::Controller
46
+ fxml "main.fxml"
47
+
48
+ include Antrapol::ToolRack::ExceptionUtils
49
+ include GvcsFx::LogHelper
50
+ include GvcsFx::FxAlert
51
+
52
+ include GvcsFx::Workspace
53
+ include GvcsFx::TabState
54
+ include GvcsFx::TabFiles
55
+ include GvcsFx::TabBranches
56
+ include GvcsFx::TabTags
57
+ include GvcsFx::TabRepos
58
+ include GvcsFx::TabLogs
59
+ include GvcsFx::TabIgnoreRules
60
+
61
+ include GvcsFx::Listener
62
+ include GvcsFx::EventHandler
63
+
64
+ include GvcsFx::Notification
65
+
66
+
67
+ def initialize
68
+
69
+ @lblVersion.text = "v#{GvcsFx::VERSION}"
70
+
71
+ # sequence here is important
72
+ install_handler
73
+ init_tblWorkspace
74
+ init_tab_state
75
+ init_tab_logs
76
+ init_tab_ignore_rules
77
+
78
+ init_tab_repos
79
+ init_tab_branches
80
+ init_tab_tags
81
+
82
+ # hide the other not yet completed tab
83
+ @tabPnlDetails.tabs.remove(@tabWsFiles)
84
+ @tabPnlDetails.tabs.remove(@tabWsConflict)
85
+ @tabPnlDetails.tabs.remove(@tabWsAction)
86
+ @tabPnlDetails.tabs.remove(@tabWsConfig)
87
+
88
+ show_landing
89
+ end
90
+
91
+ def winclose
92
+ @butClose.scene.window.close
93
+ #p @butClose.scene.window
94
+ #@butClose.scene.window.hide
95
+ end
96
+
97
+ def main_stage
98
+ if @mstage.nil?
99
+ @mstage = @butClose.scene.window
100
+ end
101
+ @mstage
102
+ end
103
+
104
+ def workspace_tab_changed(evt)
105
+ #p evt.methods.sort
106
+ #p evt.source
107
+ ##p evt.source.methods.sort
108
+ #p evt.source.text
109
+ #p evt.target
110
+ ##p evt.target.methods.sort
111
+ #p evt.target.text
112
+
113
+ javafx.application.Platform.run_later do
114
+
115
+ # only update whatever tab that is visible right now
116
+ if evt.target.text == "State"
117
+ refresh_tab_state
118
+ elsif evt.target.text == "Logs"
119
+ refresh_tab_logs
120
+ elsif evt.target.text == "Ignore Rules"
121
+ refresh_tab_ignore_rules
122
+ elsif evt.target.text == "Branches"
123
+ refresh_tab_branches
124
+ elsif evt.target.text == "Tags"
125
+ refresh_tab_tags
126
+ elsif evt.target.text == "Repository"
127
+ refresh_tab_repos
128
+ end
129
+
130
+ reset_gmsg
131
+ end
132
+ end
133
+
134
+ # refresh the whole bottom tabs
135
+ def refresh_details
136
+
137
+ currTab = @tabPnlDetails.selection_model.selected_item
138
+ case currTab.text
139
+ when "State"
140
+ refresh_tab_state
141
+ when "Logs"
142
+ refresh_tab_logs
143
+ when "Ignore Rules"
144
+ refresh_tab_ignore_rules
145
+ when "Branches"
146
+ refresh_tab_branches
147
+ when "Tags"
148
+ refresh_tab_tags
149
+ when "Repository"
150
+ refresh_tab_repos
151
+ end
152
+
153
+ reset_gmsg
154
+
155
+ # refresh state
156
+ # refresh branch
157
+ # refresh tags
158
+ # refresh log
159
+ # refresh files
160
+ # refresh repos
161
+ end
162
+
163
+ def rescue_exception(&block)
164
+ begin
165
+ yield
166
+ rescue Exception => ex
167
+ raise GvcsFxException, ex
168
+ end
169
+ end
170
+
171
+ def inside_jar?
172
+ File.dirname(__FILE__)[0..3] == "uri:"
173
+ end
174
+
175
+ def show_content_win(stageTitle, dlgTitle, content, parent = nil)
176
+
177
+ javafx.application.Platform.run_later do
178
+ stage = javafx.stage.Stage.new
179
+ stage.title = stageTitle
180
+ stage.initModality(javafx.stage.Modality::WINDOW_MODAL)
181
+ stage.initOwner(parent) if not parent.nil?
182
+ dlg = ShowTextController.load_into(stage)
183
+ dlg.set_title(dlgTitle)
184
+ dlg.set_content(content)
185
+ stage.showAndWait
186
+ end # run_later
187
+
188
+ end
189
+
190
+ end
191
+ end
@@ -0,0 +1,113 @@
1
+ # Copyright (C) 2020 Chris Liaw <chrisliaw@antrapol.com>
2
+ # Author: Chris Liaw <chrisliaw@antrapol.com>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+
18
+ module GvcsFx
19
+ module Notification
20
+
21
+ def prompt_error(str, title = "GVCS Error", stage = main_stage)
22
+ set_err_gmsg(str)
23
+ fx_alert_error(str, title, stage)
24
+ log_error(str)
25
+ end
26
+ def prompt_info(str, title = "GVCS Info", stage = main_stage)
27
+ set_info_gmsg(str)
28
+ fx_alert_info(str, title, stage)
29
+ end
30
+ def prompt_warn(str, title = "GVCS Warning", stage = main_stage)
31
+ set_warn_gmsg(str)
32
+ fx_alert_warn(str, title, stage)
33
+ log_warn(str)
34
+ end
35
+
36
+ def reset_gmsg
37
+ @imgGmsg.image = nil
38
+ @lblGlobalMsg.text = ""
39
+ end
40
+
41
+ def set_success_gmsg(str)
42
+ set_gmsg(str, :success)
43
+ end
44
+ def set_info_gmsg(str)
45
+ set_gmsg(str, :info)
46
+ end
47
+ def set_err_gmsg(str)
48
+ set_gmsg(str,:err)
49
+ end
50
+ def set_warn_gmsg(str)
51
+ set_gmsg(str, :warn)
52
+ end
53
+
54
+ private
55
+ def set_gmsg(str, type = :info)
56
+ case type
57
+ when :err
58
+ @imgGmsg.setImage(load_image(:err))
59
+ when :warn
60
+ @imgGmsg.setImage(load_image(:warn))
61
+ when :success
62
+ @imgGmsg.setImage(load_image(:success))
63
+ else
64
+ @imgGmsg.setImage(load_image(:info))
65
+ end
66
+ @lblGlobalMsg.text = str
67
+
68
+ end # set_gmsg
69
+
70
+ def load_image(type)
71
+ case type
72
+ when :err
73
+ if @errImg.nil?
74
+ if inside_jar?
75
+ @errImg = javafx.scene.image.Image.new(java.lang.Object.new.java_class.resource("/gvcsfx/res/cross.png").to_s)
76
+ else
77
+ @errImg = javafx.scene.image.Image.new("res/cross.png")
78
+ end
79
+ end
80
+ @errImg
81
+ when :warn
82
+ if @warnImg.nil?
83
+ if inside_jar?
84
+ @warnImg = javafx.scene.image.Image.new(java.lang.Object.new.java_class.resource("/gvcsfx/res/warn.png").to_s)
85
+ else
86
+ @warnImg = javafx.scene.image.Image.new("res/warn.png")
87
+ end
88
+ end
89
+ @warnImg
90
+ when :success
91
+ if @sucImg.nil?
92
+ if inside_jar?
93
+ @sucImg = javafx.scene.image.Image.new(java.lang.Object.new.java_class.resource("/gvcsfx/res/tick.png").to_s)
94
+ else
95
+ @sucImg = javafx.scene.image.Image.new("res/tick.png")
96
+ end
97
+ end
98
+ @sucImg
99
+ else
100
+ if @infoImg.nil?
101
+ if inside_jar?
102
+ @infoImg = javafx.scene.image.Image.new(java.lang.Object.new.java_class.resource("/gvcsfx/res/world.png").to_s)
103
+ else
104
+ @infoImg = javafx.scene.image.Image.new("res/world.png")
105
+ end
106
+ end
107
+ @infoImg
108
+ end
109
+ end # load_image
110
+
111
+
112
+ end
113
+ end
@@ -0,0 +1,38 @@
1
+ # Copyright (C) 2020 Chris Liaw <chrisliaw@antrapol.com>
2
+ # Author: Chris Liaw <chrisliaw@antrapol.com>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+
18
+
19
+
20
+ module GvcsFx
21
+ class ShowTextController
22
+ include JRubyFX::Controller
23
+ fxml "show_text.fxml"
24
+
25
+ def set_title(str)
26
+ @lblHeader.text = str
27
+ end
28
+
29
+ def set_content(cnt)
30
+ @txtContent.text = cnt
31
+ end
32
+
33
+ def win_close
34
+ @butClose.scene.window.close
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,86 @@
1
+ # Copyright (C) 2020 Chris Liaw <chrisliaw@antrapol.com>
2
+ # Author: Chris Liaw <chrisliaw@antrapol.com>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+
18
+ require_relative 'fx_alert'
19
+
20
+ module GvcsFx
21
+
22
+ class CmbOption
23
+ attr_accessor :key, :string
24
+ def initialize(key, str)
25
+ @key = key
26
+ @string = str
27
+ end
28
+
29
+ def to_s
30
+ "#{@key} - #{@string}"
31
+ end
32
+ end
33
+
34
+
35
+ class StashSelectController
36
+ include JRubyFX::Controller
37
+ include Antrapol::ToolRack::ExceptionUtils
38
+ include GvcsFx::FxAlert
39
+
40
+ fxml "stash_select.fxml"
41
+
42
+ attr_reader :result
43
+
44
+ def initialize
45
+ @result = []
46
+ end
47
+
48
+ def options=(val)
49
+ if not_empty?(val)
50
+ if val.is_a?(Array)
51
+ @cmbOptions.items.add_all(val)
52
+ elsif val.is_a?(Hash)
53
+ dat = []
54
+ val.each do |k,v|
55
+ dat << CmbOption.new(k,v[1].strip)
56
+ end
57
+ @cmbOptions.items.add_all(dat)
58
+ else
59
+ @cmbOptions.items.add(val)
60
+ end
61
+ end
62
+ end
63
+
64
+ def win_close(evt)
65
+ @result << false
66
+ @butCancel.scene.window.close
67
+ end
68
+
69
+ def butOk_onAction(evt)
70
+ br = @txtNewBranch.text
71
+ sel = @cmbOptions.selection_model.selected_item
72
+ if not_empty?(br) and not_empty?(sel)
73
+ @result << true
74
+ @result << sel
75
+ @result << br
76
+
77
+ @butCancel.scene.window.close
78
+ elsif is_empty?(sel)
79
+ fx_alert_error("Stash selection cannot be empty. Please try again", "Empty Stash Selection", @butCancel.scene.window)
80
+ elsif is_empty?(br)
81
+ fx_alert_error("Branch name cannot be empty. Please try again", "Empty Branch Name", @butCancel.scene.window)
82
+ end
83
+ end
84
+
85
+ end
86
+ end