Closes #9, "Option for Tabs"
emmanue1
9 years ago
14 | 14 | |
15 | 15 | public void init(Color errorBackgroundColor); |
16 | 16 | |
17 | public boolean isActivated(); | |
18 | ||
17 | 19 | public void loadPreferences(Map<String, String> preferences); |
18 | 20 | |
19 | 21 | public void savePreferences(Map<String, String> preferences); |
285 | 285 | } |
286 | 286 | |
287 | 287 | void onPreferences() { |
288 | preferencesController.show({ checkPreferencesChange(currentPage) }) | |
288 | preferencesController.show({ | |
289 | checkPreferencesChange(currentPage) | |
290 | mainView.preferencesChanged(preferences) | |
291 | }) | |
289 | 292 | } |
290 | 293 | |
291 | 294 | void onCurrentPageChanged(JComponent page) { |
8 | 8 | |
9 | 9 | @Singleton(lazy = true) |
10 | 10 | class PreferencesPanelService { |
11 | final List<PreferencesPanel> providers = ServiceLoader.load(PreferencesPanel).toList() | |
11 | final List<PreferencesPanel> providers = ServiceLoader.load(PreferencesPanel).toList().grep { it.isActivated() } | |
12 | 12 | } |
14 | 14 | import jd.gui.api.feature.FocusedTypeGettable |
15 | 15 | import jd.gui.api.feature.ContentSavable |
16 | 16 | import jd.gui.api.feature.ContentCopyable |
17 | import jd.gui.api.feature.PreferencesChangeListener | |
17 | 18 | import jd.gui.api.feature.SourcesSavable |
18 | 19 | import jd.gui.api.feature.UriGettable |
19 | 20 | import jd.gui.api.feature.UriOpenable |
40 | 41 | import java.awt.event.KeyAdapter |
41 | 42 | import java.awt.event.KeyEvent |
42 | 43 | |
43 | class MainView implements UriOpenable { | |
44 | class MainView implements UriOpenable, PreferencesChangeListener { | |
44 | 45 | SwingBuilder swing |
45 | 46 | History history |
46 | 47 | Closure openFilesClosure |
126 | 127 | } |
127 | 128 | } |
128 | 129 | }) |
130 | mainTabbedPanel.preferencesChanged(configuration.preferences) | |
129 | 131 | findComboBox.editor.editorComponent.addKeyListener(new KeyAdapter() { |
130 | 132 | String lastStr = '' |
131 | 133 | |
317 | 319 | } |
318 | 320 | return success |
319 | 321 | } |
322 | ||
323 | // --- PreferencesChangeListener --- // | |
324 | void preferencesChanged(Map<String, String> preferences) { | |
325 | swing.mainTabbedPanel.preferencesChanged(preferences) | |
326 | } | |
320 | 327 | } |
6 | 6 | |
7 | 7 | import jd.gui.api.feature.PageChangeListener |
8 | 8 | import jd.gui.api.feature.PageChangeable |
9 | import jd.gui.api.feature.PreferencesChangeListener | |
9 | 10 | import jd.gui.api.feature.UriGettable |
10 | 11 | import jd.gui.api.feature.UriOpenable |
11 | 12 | |
40 | 41 | tabbedPane.addChangeListener(new ChangeListener() { |
41 | 42 | void stateChanged(ChangeEvent e) { |
42 | 43 | if (pageChangedListenersEnabled) { |
43 | def page = tabbedPane.selectedComponent?.getClientProperty('currentPage') | |
44 | def subPage = tabbedPane.selectedComponent | |
44 | 45 | |
45 | if (page == null) { | |
46 | page = tabbedPane.selectedComponent | |
47 | } | |
48 | // Fire page changed event | |
49 | for (def listener : pageChangedListeners) { | |
50 | listener.pageChanged(page) | |
46 | if (subPage) { | |
47 | def page = subPage.getClientProperty('currentPage') | |
48 | ||
49 | if (page == null) { | |
50 | page = tabbedPane.selectedComponent | |
51 | } | |
52 | // Fire page changed event | |
53 | for (def listener : pageChangedListeners) { | |
54 | listener.pageChanged(page) | |
55 | } | |
56 | // Update current sub-page preferences | |
57 | if (subPage instanceof PreferencesChangeListener) { | |
58 | subPage.preferencesChanged(preferences) | |
59 | } | |
51 | 60 | } |
52 | 61 | } |
53 | 62 | } |
154 | 163 | listener.pageChanged(page) |
155 | 164 | } |
156 | 165 | } |
166 | ||
167 | // --- PreferencesChangeListener --- // | |
168 | void preferencesChanged(Map<String, String> preferences) { | |
169 | super.preferencesChanged(preferences) | |
170 | ||
171 | // Update current sub-page preferences | |
172 | def subPage = tabbedPane.selectedComponent | |
173 | if (subPage instanceof PreferencesChangeListener) { | |
174 | subPage.preferencesChanged(preferences) | |
175 | } | |
176 | } | |
157 | 177 | } |
4 | 4 | |
5 | 5 | package jd.gui.view.component.panel |
6 | 6 | |
7 | import jd.gui.api.feature.PreferencesChangeListener | |
7 | 8 | import jd.gui.api.feature.UriGettable |
8 | 9 | import jd.gui.service.platform.PlatformService |
9 | 10 | |
28 | 29 | import java.awt.event.MouseEvent |
29 | 30 | import java.awt.event.MouseListener |
30 | 31 | |
31 | class TabbedPanel extends JPanel { | |
32 | class TabbedPanel extends JPanel implements PreferencesChangeListener { | |
32 | 33 | static final ImageIcon closeIcon = new ImageIcon(TabbedPanel.class.classLoader.getResource('images/close.gif')) |
33 | 34 | static final ImageIcon closeActivateIcon = new ImageIcon(TabbedPanel.class.classLoader.getResource('images/close_active.gif')) |
34 | 35 | |
36 | static final String TAB_LAYOUT = 'UITabsPreferencesProvider.singleLineTabs' | |
37 | ||
35 | 38 | JTabbedPane tabbedPane |
39 | Map<String, String> preferences | |
36 | 40 | |
37 | 41 | TabbedPanel() { |
38 | 42 | create() |
83 | 87 | } |
84 | 88 | |
85 | 89 | public <T extends JComponent & UriGettable> void addPage(String title, Icon icon, String tip, T page) { |
90 | // Update preferences | |
91 | if (page instanceof PreferencesChangeListener) { | |
92 | page.preferencesChanged(preferences) | |
93 | } | |
94 | // Add a new tab | |
86 | 95 | JLabel tabCloseButton = new JLabel(closeIcon) |
87 | 96 | tabCloseButton.toolTipText = 'Close this panel' |
88 | 97 | tabCloseButton.addMouseListener(new MouseListener() { |
109 | 118 | int index = tabbedPane.getTabCount() |
110 | 119 | tabbedPane.addTab(title, page) |
111 | 120 | tabbedPane.setTabComponentAt(index, tab) |
112 | tabbedPane.selectedIndex = index | |
113 | ||
121 | // Ensure new page is visible (bug with SCROLL_TAB_LAYOUT) | |
122 | tabbedPane.selectedIndex = 0 | |
123 | tabbedPane.selectedIndex = index | |
124 | ||
114 | 125 | getLayout().show(this, 'tabs') |
115 | 126 | } |
116 | 127 | |
179 | 190 | getLayout().show(this, 'panel') |
180 | 191 | } |
181 | 192 | } |
193 | ||
194 | // --- PreferencesChangeListener --- // | |
195 | void preferencesChanged(Map<String, String> preferences) { | |
196 | // Store preferences | |
197 | this.preferences = preferences | |
198 | // Update layout | |
199 | if ('true'.equals(preferences.get(TAB_LAYOUT))) { | |
200 | tabbedPane.tabLayoutPolicy = JTabbedPane.SCROLL_TAB_LAYOUT | |
201 | } else { | |
202 | tabbedPane.tabLayoutPolicy = JTabbedPane.WRAP_TAB_LAYOUT | |
203 | } | |
204 | // Ensure selected sub-page is visible (bug with SCROLL_TAB_LAYOUT) | |
205 | int index = tabbedPane.selectedIndex | |
206 | if (index != -1) { | |
207 | tabbedPane.selectedIndex = 0 | |
208 | tabbedPane.selectedIndex = index | |
209 | } | |
210 | } | |
182 | 211 | } |
8 | 8 | import jd.gui.api.feature.PageChangeListener |
9 | 9 | import jd.gui.api.feature.PageChangeable |
10 | 10 | import jd.gui.api.feature.PageClosable |
11 | import jd.gui.api.feature.PreferencesChangeListener | |
11 | 12 | import jd.gui.api.feature.TreeNodeExpandable |
12 | 13 | import jd.gui.api.feature.UriGettable |
13 | 14 | import jd.gui.api.model.TreeNodeData |
27 | 28 | import java.awt.* |
28 | 29 | import java.util.List |
29 | 30 | |
30 | class TreeTabbedPanel extends JPanel implements UriGettable, UriOpenable, PageChangeable, PageClosable { | |
31 | class TreeTabbedPanel extends JPanel implements UriGettable, UriOpenable, PageChangeable, PageClosable, PreferencesChangeListener { | |
31 | 32 | API api |
32 | 33 | URI uri |
33 | 34 | Tree tree |
241 | 242 | return false |
242 | 243 | } |
243 | 244 | } |
245 | ||
246 | // --- PreferencesChangeListener --- // | |
247 | void preferencesChanged(Map<String, String> preferences) { | |
248 | tabbedPanel.preferencesChanged(preferences) | |
249 | } | |
244 | 250 | } |
39 | 39 | } |
40 | 40 | |
41 | 41 | jar { |
42 | dependsOn subprojects.tasks['classes'] | |
43 | manifest { | |
44 | attributes 'Main-Class': 'jd.gui.App', 'SplashScreen-Image': 'images/jd_icon_128.png' | |
45 | } | |
42 | dependsOn subprojects.tasks['jar'] | |
43 | ||
46 | 44 | def deps = [] |
47 | 45 | subprojects.each { subproject -> |
48 | 46 | from subproject.sourceSets.main.output.classesDir |
49 | 47 | from subproject.sourceSets.main.output.resourcesDir |
50 | 48 | deps += subproject.configurations.runtime - subproject.configurations.provided |
51 | 49 | } |
52 | from { deps.unique().collect { it.isDirectory() ? it : zipTree(it) } } | |
50 | subprojects.each { subproject -> | |
51 | deps -= subproject.jar.archivePath | |
52 | } | |
53 | deps = deps.unique().collect { it.isDirectory() ? it : zipTree(it) } | |
54 | ||
55 | manifest { | |
56 | attributes 'Main-Class': 'jd.gui.App', 'SplashScreen-Image': 'images/jd_icon_128.png' | |
57 | } | |
58 | from deps | |
59 | exclude 'META-INF/services/jd.gui.spi.*' | |
60 | duplicatesStrategy DuplicatesStrategy.EXCLUDE | |
61 | doFirst { | |
62 | // Create temporary directory | |
63 | def tmpSpiDir = file('build/tmp/spi') | |
64 | tmpSpiDir.deleteDir() | |
65 | tmpSpiDir.mkdirs() | |
66 | // Copy and merge SPI config files | |
67 | subprojects.each { subproject -> | |
68 | def servicesDir = file(subproject.sourceSets.main.output.resourcesDir.path + File.separator + 'META-INF' + File.separator + 'services') | |
69 | if (servicesDir.exists()) { | |
70 | servicesDir.eachFile { source -> | |
71 | def target = file(tmpSpiDir.path + File.separator + source.name) | |
72 | target << source.text | |
73 | } | |
74 | } | |
75 | } | |
76 | // Add to JAR file | |
77 | into('META-INF/services') { | |
78 | from tmpSpiDir | |
79 | } | |
80 | } | |
53 | 81 | } |
54 | 82 | |
55 | 83 | // Windows wrapper configuration to generate "jd-gui.exe" // |
74 | 102 | } |
75 | 103 | } |
76 | 104 | |
77 | // Distribution for OSX // | |
105 | // Distributions for OSX and Windows // | |
78 | 106 | distributions { |
79 | 107 | osx { |
80 | 108 | contents { |
+2
-0
51 | 51 | |
52 | 52 | public void init(Color errorBackgroundColor) {} |
53 | 53 | |
54 | public boolean isActivated() { true } | |
55 | ||
54 | 56 | void loadPreferences(Map<String, String> preferences) { |
55 | 57 | escapeUnicodeCharactersCheckBox.selected = 'true'.equals(preferences.get(ESCAPE_UNICODE_CHARACTERS)) |
56 | 58 | omitThisPrefixCheckBox.selected = 'true'.equals(preferences.get(OMIT_THIS_PREFIX)) |
+2
-0
43 | 43 | |
44 | 44 | public void init(Color errorBackgroundColor) {} |
45 | 45 | |
46 | public boolean isActivated() { true } | |
47 | ||
46 | 48 | void loadPreferences(Map<String, String> preferences) { |
47 | 49 | escapeUnicodeCharactersCheckBox.selected = !'false'.equals(preferences.get(ESCAPE_UNICODE_CHARACTERS)) |
48 | 50 | omitThisPrefixCheckBox.selected = 'true'.equals(preferences.get(OMIT_THIS_PREFIX)) |
+2
-0
43 | 43 | this.errorBackgroundColor = errorBackgroundColor |
44 | 44 | } |
45 | 45 | |
46 | public boolean isActivated() { true } | |
47 | ||
46 | 48 | void loadPreferences(Map<String, String> preferences) { |
47 | 49 | maximumDepthTextField.text = preferences.get(MAXIMUM_DEPTH_KEY) ?: '15' |
48 | 50 | maximumDepthTextField.setCaretPosition(maximumDepthTextField.text.size()) |