You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SwingManager.java 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /*
  2. * Copyright (c) 2006-2015 DMDirc Developers
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy
  5. * of this software and associated documentation files (the "Software"), to deal
  6. * in the Software without restriction, including without limitation the rights
  7. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. * copies of the Software, and to permit persons to whom the Software is
  9. * furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  20. * SOFTWARE.
  21. */
  22. package com.dmdirc.addons.ui_swing;
  23. import com.dmdirc.addons.ui_swing.components.menubar.MenuBar;
  24. import com.dmdirc.addons.ui_swing.components.statusbar.FeedbackNag;
  25. import com.dmdirc.addons.ui_swing.components.statusbar.SwingStatusBar;
  26. import com.dmdirc.addons.ui_swing.dialogs.url.URLDialogFactory;
  27. import com.dmdirc.addons.ui_swing.events.SwingEventBus;
  28. import com.dmdirc.addons.ui_swing.framemanager.ctrltab.CtrlTabWindowManager;
  29. import com.dmdirc.addons.ui_swing.framemanager.tree.TreeFrameManagerProvider;
  30. import com.dmdirc.addons.ui_swing.wizard.firstrun.FirstRunWizardExecutor;
  31. import com.dmdirc.events.ClientInfoRequestEvent;
  32. import com.dmdirc.events.ClientPrefsOpenedEvent;
  33. import com.dmdirc.events.FeedbackNagEvent;
  34. import com.dmdirc.events.FirstRunEvent;
  35. import com.dmdirc.events.UnknownURLEvent;
  36. import com.dmdirc.interfaces.EventBus;
  37. import com.dmdirc.plugins.PluginDomain;
  38. import com.dmdirc.plugins.PluginInfo;
  39. import com.dmdirc.ui.WindowManager;
  40. import com.dmdirc.ui.core.about.InfoItem;
  41. import java.awt.Window;
  42. import javax.inject.Inject;
  43. import javax.inject.Provider;
  44. import javax.inject.Singleton;
  45. import javax.swing.UIManager;
  46. import net.miginfocom.layout.LayoutUtil;
  47. import net.engio.mbassy.listener.Handler;
  48. /**
  49. * Manages swing components and dependencies.
  50. */
  51. @Singleton
  52. public class SwingManager {
  53. /** The window factory in use. */
  54. private final Provider<SwingWindowFactory> windowFactory;
  55. private final Provider<MenuBar> menuBar;
  56. /** The status bar in use. */
  57. private final Provider<SwingStatusBar> statusBar;
  58. /** The window manager to listen on for events. */
  59. private final WindowManager windowManager;
  60. private final CtrlTabWindowManager ctrlTabManager;
  61. /** Provider of first run executors. */
  62. private final Provider<FirstRunWizardExecutor> firstRunExecutor;
  63. /** Provider of feedback nags. */
  64. private final Provider<FeedbackNag> feedbackNagProvider;
  65. /** Factory to use to create URL dialogs. */
  66. private final URLDialogFactory urlDialogFactory;
  67. /** Link handler for swing links. */
  68. private final SwingLinkHandler linkHandler;
  69. /** Bus to listen on for events. */
  70. private final EventBus eventBus;
  71. /** The event bus for this plugin. */
  72. private final SwingEventBus swingEventBus;
  73. /** The provider to use to create tree-based frame managers. */
  74. private final TreeFrameManagerProvider treeProvider;
  75. /** The provider to use to create new main frames. */
  76. private final Provider<MainFrame> mainFrameProvider;
  77. /** Swing window manager. */
  78. private final Provider<SwingWindowManager> swingWindowManager;
  79. /** The main frame of the Swing UI. */
  80. private MainFrame mainFrame;
  81. /** Swing UI initialiser. */
  82. private final SwingUIInitialiser uiInitialiser;
  83. private final PluginInfo pluginInfo;
  84. private final String domain;
  85. /**
  86. * Creates a new instance of {@link SwingManager}.
  87. *
  88. * @param windowFactory The window factory in use.
  89. * @param windowManager The window manager to listen on for events.
  90. * @param mainFrameProvider The provider to use for the main frame.
  91. * @param menuBar The menu bar to use for the main frame.
  92. * @param statusBar The status bar to use in the main frame.
  93. * @param ctrlTabManager The window manager that handles ctrl+tab behaviour.
  94. * @param firstRunExecutor A provider of first run executors.
  95. * @param feedbackNagProvider Provider of feedback nags.
  96. * @param urlDialogFactory Factory to use to create URL dialogs.
  97. * @param linkHandler The handler to use when users click links.
  98. * @param eventBus The bus to listen on for events.
  99. * @param swingEventBus The swing event bus to listen on for swing events.
  100. * @param treeProvider Provider to use for tree-based frame managers.
  101. * @param swingWindowManager Swing window manager
  102. * @param uiInitialiser Initialiser to set system/swing settings.
  103. */
  104. @Inject
  105. public SwingManager(
  106. final Provider<SwingWindowFactory> windowFactory,
  107. final WindowManager windowManager,
  108. final Provider<MainFrame> mainFrameProvider,
  109. final Provider<MenuBar> menuBar,
  110. final Provider<SwingStatusBar> statusBar,
  111. final CtrlTabWindowManager ctrlTabManager,
  112. final Provider<FirstRunWizardExecutor> firstRunExecutor,
  113. final Provider<FeedbackNag> feedbackNagProvider,
  114. final URLDialogFactory urlDialogFactory,
  115. final SwingLinkHandler linkHandler,
  116. final EventBus eventBus,
  117. final SwingEventBus swingEventBus,
  118. final TreeFrameManagerProvider treeProvider,
  119. final Provider<SwingWindowManager> swingWindowManager,
  120. final SwingUIInitialiser uiInitialiser,
  121. @PluginDomain(SwingController.class) final PluginInfo pluginInfo,
  122. @PluginDomain(SwingController.class) final String domain) {
  123. this.windowFactory = windowFactory;
  124. this.windowManager = windowManager;
  125. this.menuBar = menuBar;
  126. this.statusBar = statusBar;
  127. this.mainFrameProvider = mainFrameProvider;
  128. this.ctrlTabManager = ctrlTabManager;
  129. this.firstRunExecutor = firstRunExecutor;
  130. this.feedbackNagProvider = feedbackNagProvider;
  131. this.urlDialogFactory = urlDialogFactory;
  132. this.linkHandler = linkHandler;
  133. this.eventBus = eventBus;
  134. this.swingEventBus = swingEventBus;
  135. this.treeProvider = treeProvider;
  136. this.swingWindowManager = swingWindowManager;
  137. this.uiInitialiser = uiInitialiser;
  138. this.pluginInfo = pluginInfo;
  139. this.domain = domain;
  140. }
  141. /**
  142. * Handles loading of the UI.
  143. */
  144. public void load() {
  145. UIUtilities.invokeLater(() -> {
  146. uiInitialiser.load();
  147. this.mainFrame = mainFrameProvider.get();
  148. mainFrame.setMenuBar(menuBar.get());
  149. mainFrame.setWindowManager(ctrlTabManager);
  150. mainFrame.setStatusBar(statusBar.get());
  151. mainFrame.initComponents();
  152. swingEventBus.subscribe(mainFrame);
  153. swingEventBus.subscribe(ctrlTabManager);
  154. windowManager.addListenerAndSync(windowFactory.get());
  155. eventBus.subscribe(statusBar.get());
  156. eventBus.subscribe(this);
  157. eventBus.subscribe(mainFrame);
  158. eventBus.subscribe(linkHandler);
  159. mainFrame.setVisible(true);
  160. });
  161. }
  162. /**
  163. * Handles unloading of the UI.
  164. */
  165. public void unload() {
  166. UIUtilities.invokeLater(() -> {
  167. swingWindowManager.get().getTopLevelWindows().forEach(Window::dispose);
  168. windowManager.removeListener(windowFactory.get());
  169. windowFactory.get().dispose();
  170. swingEventBus.unsubscribe(mainFrame);
  171. swingEventBus.unsubscribe(ctrlTabManager);
  172. mainFrame.dispose();
  173. eventBus.unsubscribe(statusBar.get());
  174. eventBus.unsubscribe(this);
  175. eventBus.unsubscribe(mainFrame);
  176. eventBus.unsubscribe(linkHandler);
  177. uiInitialiser.unload();
  178. });
  179. }
  180. /**
  181. * Retrieves the main frame.
  182. *
  183. * @return A main frame instance.
  184. *
  185. * @deprecated Should be injected.
  186. */
  187. @Deprecated
  188. public MainFrame getMainFrame() {
  189. return mainFrame;
  190. }
  191. public TreeFrameManagerProvider getTreeProvider() {
  192. return treeProvider;
  193. }
  194. @Handler
  195. public void showFirstRunWizard(final FirstRunEvent event) {
  196. if (!event.isHandled()) {
  197. firstRunExecutor.get().showWizardAndWait();
  198. event.setHandled(true);
  199. }
  200. }
  201. @Handler
  202. public void showURLDialog(final UnknownURLEvent event) {
  203. if (!event.isHandled()) {
  204. event.setHandled(true);
  205. UIUtilities.invokeLater(() -> urlDialogFactory.getURLDialog(event.getURI()).display());
  206. }
  207. }
  208. @Handler
  209. public void showFeedbackNag(final FeedbackNagEvent event) {
  210. UIUtilities.invokeLater(feedbackNagProvider::get);
  211. }
  212. @Handler
  213. public void showConfig(final ClientPrefsOpenedEvent event) {
  214. event.getModel().getCategory("GUI").addSubCategory(
  215. new SwingPreferencesModel(pluginInfo, domain, event.getModel().getConfigManager(),
  216. event.getModel().getIdentity()).getSwingUICategory());
  217. }
  218. @Handler
  219. public void handleInfoRequest(final ClientInfoRequestEvent event) {
  220. event.addInfoItem(InfoItem.create("Swing UI Version",
  221. pluginInfo.getMetaData().getVersion().toString()),
  222. InfoItem.create("Look and Feel", UIManager.getLookAndFeel().getName()),
  223. InfoItem.create("MiG Layout Version", LayoutUtil.getVersion())
  224. );
  225. }
  226. }