Codebase list jd-gui / 4664332
Closes #9, "Option for Tabs" emmanue1 9 years ago
11 changed file(s) with 121 addition(s) and 20 deletion(s). Raw diff Collapse all Expand all
1414
1515 public void init(Color errorBackgroundColor);
1616
17 public boolean isActivated();
18
1719 public void loadPreferences(Map<String, String> preferences);
1820
1921 public void savePreferences(Map<String, String> preferences);
285285 }
286286
287287 void onPreferences() {
288 preferencesController.show({ checkPreferencesChange(currentPage) })
288 preferencesController.show({
289 checkPreferencesChange(currentPage)
290 mainView.preferencesChanged(preferences)
291 })
289292 }
290293
291294 void onCurrentPageChanged(JComponent page) {
88
99 @Singleton(lazy = true)
1010 class PreferencesPanelService {
11 final List<PreferencesPanel> providers = ServiceLoader.load(PreferencesPanel).toList()
11 final List<PreferencesPanel> providers = ServiceLoader.load(PreferencesPanel).toList().grep { it.isActivated() }
1212 }
1414 import jd.gui.api.feature.FocusedTypeGettable
1515 import jd.gui.api.feature.ContentSavable
1616 import jd.gui.api.feature.ContentCopyable
17 import jd.gui.api.feature.PreferencesChangeListener
1718 import jd.gui.api.feature.SourcesSavable
1819 import jd.gui.api.feature.UriGettable
1920 import jd.gui.api.feature.UriOpenable
4041 import java.awt.event.KeyAdapter
4142 import java.awt.event.KeyEvent
4243
43 class MainView implements UriOpenable {
44 class MainView implements UriOpenable, PreferencesChangeListener {
4445 SwingBuilder swing
4546 History history
4647 Closure openFilesClosure
126127 }
127128 }
128129 })
130 mainTabbedPanel.preferencesChanged(configuration.preferences)
129131 findComboBox.editor.editorComponent.addKeyListener(new KeyAdapter() {
130132 String lastStr = ''
131133
317319 }
318320 return success
319321 }
322
323 // --- PreferencesChangeListener --- //
324 void preferencesChanged(Map<String, String> preferences) {
325 swing.mainTabbedPanel.preferencesChanged(preferences)
326 }
320327 }
66
77 import jd.gui.api.feature.PageChangeListener
88 import jd.gui.api.feature.PageChangeable
9 import jd.gui.api.feature.PreferencesChangeListener
910 import jd.gui.api.feature.UriGettable
1011 import jd.gui.api.feature.UriOpenable
1112
4041 tabbedPane.addChangeListener(new ChangeListener() {
4142 void stateChanged(ChangeEvent e) {
4243 if (pageChangedListenersEnabled) {
43 def page = tabbedPane.selectedComponent?.getClientProperty('currentPage')
44 def subPage = tabbedPane.selectedComponent
4445
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 }
5160 }
5261 }
5362 }
154163 listener.pageChanged(page)
155164 }
156165 }
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 }
157177 }
44
55 package jd.gui.view.component.panel
66
7 import jd.gui.api.feature.PreferencesChangeListener
78 import jd.gui.api.feature.UriGettable
89 import jd.gui.service.platform.PlatformService
910
2829 import java.awt.event.MouseEvent
2930 import java.awt.event.MouseListener
3031
31 class TabbedPanel extends JPanel {
32 class TabbedPanel extends JPanel implements PreferencesChangeListener {
3233 static final ImageIcon closeIcon = new ImageIcon(TabbedPanel.class.classLoader.getResource('images/close.gif'))
3334 static final ImageIcon closeActivateIcon = new ImageIcon(TabbedPanel.class.classLoader.getResource('images/close_active.gif'))
3435
36 static final String TAB_LAYOUT = 'UITabsPreferencesProvider.singleLineTabs'
37
3538 JTabbedPane tabbedPane
39 Map<String, String> preferences
3640
3741 TabbedPanel() {
3842 create()
8387 }
8488
8589 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
8695 JLabel tabCloseButton = new JLabel(closeIcon)
8796 tabCloseButton.toolTipText = 'Close this panel'
8897 tabCloseButton.addMouseListener(new MouseListener() {
109118 int index = tabbedPane.getTabCount()
110119 tabbedPane.addTab(title, page)
111120 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
114125 getLayout().show(this, 'tabs')
115126 }
116127
179190 getLayout().show(this, 'panel')
180191 }
181192 }
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 }
182211 }
88 import jd.gui.api.feature.PageChangeListener
99 import jd.gui.api.feature.PageChangeable
1010 import jd.gui.api.feature.PageClosable
11 import jd.gui.api.feature.PreferencesChangeListener
1112 import jd.gui.api.feature.TreeNodeExpandable
1213 import jd.gui.api.feature.UriGettable
1314 import jd.gui.api.model.TreeNodeData
2728 import java.awt.*
2829 import java.util.List
2930
30 class TreeTabbedPanel extends JPanel implements UriGettable, UriOpenable, PageChangeable, PageClosable {
31 class TreeTabbedPanel extends JPanel implements UriGettable, UriOpenable, PageChangeable, PageClosable, PreferencesChangeListener {
3132 API api
3233 URI uri
3334 Tree tree
241242 return false
242243 }
243244 }
245
246 // --- PreferencesChangeListener --- //
247 void preferencesChanged(Map<String, String> preferences) {
248 tabbedPanel.preferencesChanged(preferences)
249 }
244250 }
3939 }
4040
4141 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
4644 def deps = []
4745 subprojects.each { subproject ->
4846 from subproject.sourceSets.main.output.classesDir
4947 from subproject.sourceSets.main.output.resourcesDir
5048 deps += subproject.configurations.runtime - subproject.configurations.provided
5149 }
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 }
5381 }
5482
5583 // Windows wrapper configuration to generate "jd-gui.exe" //
74102 }
75103 }
76104
77 // Distribution for OSX //
105 // Distributions for OSX and Windows //
78106 distributions {
79107 osx {
80108 contents {
5151
5252 public void init(Color errorBackgroundColor) {}
5353
54 public boolean isActivated() { true }
55
5456 void loadPreferences(Map<String, String> preferences) {
5557 escapeUnicodeCharactersCheckBox.selected = 'true'.equals(preferences.get(ESCAPE_UNICODE_CHARACTERS))
5658 omitThisPrefixCheckBox.selected = 'true'.equals(preferences.get(OMIT_THIS_PREFIX))
4343
4444 public void init(Color errorBackgroundColor) {}
4545
46 public boolean isActivated() { true }
47
4648 void loadPreferences(Map<String, String> preferences) {
4749 escapeUnicodeCharactersCheckBox.selected = !'false'.equals(preferences.get(ESCAPE_UNICODE_CHARACTERS))
4850 omitThisPrefixCheckBox.selected = 'true'.equals(preferences.get(OMIT_THIS_PREFIX))
4343 this.errorBackgroundColor = errorBackgroundColor
4444 }
4545
46 public boolean isActivated() { true }
47
4648 void loadPreferences(Map<String, String> preferences) {
4749 maximumDepthTextField.text = preferences.get(MAXIMUM_DEPTH_KEY) ?: '15'
4850 maximumDepthTextField.setCaretPosition(maximumDepthTextField.text.size())