/* * * Copyright 2014 http://Bither.net * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * / */ package net.bither.viewsystem; import net.bither.Bither; import net.bither.BitherSetting; import net.bither.bitherj.BitherjSettings; import net.bither.bitherj.core.Address; import net.bither.bitherj.core.AddressManager; import net.bither.implbitherj.BlockNotificationCenter; import net.bither.platform.listener.GenericQuitEventListener; import net.bither.platform.listener.GenericQuitResponse; import net.bither.preference.UserPreference; import net.bither.utils.ImageLoader; import net.bither.utils.LocaliserUtils; import net.bither.viewsystem.base.DisplayHint; import net.bither.viewsystem.base.ViewEnum; import net.bither.viewsystem.base.Viewable; import net.bither.viewsystem.components.ScrollBarUIDecorator; import net.bither.viewsystem.froms.MenuBar; import net.bither.viewsystem.froms.SingleWalletForm; import net.bither.viewsystem.panels.WalletListPanel; import net.bither.viewsystem.themes.Themes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.*; import java.awt.*; public class MainFrameUI { private MainFrame frame; private WalletListPanel walletsView; private ViewFactory viewFactory; private JSplitPane splitPane; // private BitherTabbedPane viewTabbedPane; private JPanel headerPanel; private JPanel devidePanel; private net.bither.viewsystem.froms.MenuBar menuBarFrom; private JScrollPane scrollPane; private static final Logger log = LoggerFactory.getLogger(MainFrameUI.class); final private GenericQuitEventListener quitEventListener; public static final GenericQuitResponse bitherFrameQuitResponse = new GenericQuitResponse() { @Override public void cancelQuit() { log.debug("Quit Canceled"); } @Override public void performQuit() { log.debug("Performed Quit"); } }; public MainFrameUI(MainFrame frame, GenericQuitEventListener quitEventListener) { this.frame = frame; this.quitEventListener = quitEventListener; viewFactory = new ViewFactory(); } public JPanel getDevidePanel() { return devidePanel; } public WalletListPanel getWalletsView() { return walletsView; } public ViewFactory getViewFactory() { return viewFactory; } public void initUI(ViewEnum initialView) { Container contentPane = frame.getContentPane(); contentPane.setLayout(new GridBagLayout()); contentPane.setBackground(Themes.currentTheme.detailPanelBackground()); GridBagConstraints constraints = new GridBagConstraints(); GridBagConstraints constraints2 = new GridBagConstraints(); headerPanel = new JPanel(); headerPanel.setOpaque(true); headerPanel.setBackground(Themes.currentTheme.detailPanelBackground()); headerPanel.setLayout(new GridBagLayout()); headerPanel.applyComponentOrientation(ComponentOrientation.getOrientation(LocaliserUtils.getLocale())); menuBarFrom = new MenuBar(); // Set the application icon. ImageIcon imageIcon = ImageLoader.createImageIcon(ImageLoader.BITHER_ICON_FILE); if (imageIcon != null) { frame.setIconImage(imageIcon.getImage()); } constraints2.fill = GridBagConstraints.BOTH; constraints2.gridx = 0; constraints2.gridy = 0; constraints2.gridwidth = 1; constraints2.gridheight = 1; constraints2.weightx = 1000.0; constraints2.weighty = 1.0; constraints2.anchor = GridBagConstraints.LINE_START; headerPanel.add(menuBarFrom.getPanelMain(), constraints2); constraints.fill = GridBagConstraints.BOTH; constraints.gridx = 0; constraints.gridy = 0; constraints.gridwidth = 2; constraints.weightx = 1.0; constraints.weighty = 1.0; constraints.anchor = GridBagConstraints.LINE_START; contentPane.add(headerPanel, constraints); devidePanel = new JPanel(); // fill1.setOpaque(false); Dimension dimension = new Dimension(1000, 1); devidePanel.setPreferredSize(dimension); devidePanel.setMinimumSize(dimension); devidePanel.setMaximumSize(dimension); devidePanel.setBackground(new Color(0xd1d1d1)); constraints.fill = GridBagConstraints.BOTH; constraints.gridx = 0; constraints.gridy = 1; constraints.gridwidth = 0; constraints.weightx = 1.0; constraints.weighty = 1.0; constraints.anchor = GridBagConstraints.CENTER; contentPane.add(devidePanel, constraints); // Create the wallet list panel. walletsView = new WalletListPanel(); BlockNotificationCenter.addBlockChange(walletsView); JPanel viewTabbedPane;//= new JPanel(new BorderLayout()); // Add the transactions tab. if (UserPreference.getInstance().getAppMode() == BitherjSettings.AppMode.COLD) { // JPanel transactionsOutlinePanel = new JPanel(new BorderLayout()); Viewable coldWalletView = viewFactory.getView(ViewEnum.COLD_WALLET_VIEW); viewTabbedPane = coldWalletView.getPanel(); } else { Viewable transactionsView = viewFactory.getView(ViewEnum.TRANSACTIONS_VIEW); viewTabbedPane = transactionsView.getPanel(); } // viewTabbedPane.setBackground(ColorAndFontConstants.BACKGROUND_COLOR); GridBagLayout gridBagLayout = new GridBagLayout(); JPanel rightPanel = new JPanel(gridBagLayout); rightPanel.setOpaque(true); rightPanel.setBackground(Themes.currentTheme.detailPanelBackground()); GridBagConstraints rightContraints = new GridBagConstraints(); rightContraints.fill = GridBagConstraints.BOTH; rightContraints.gridx = 0; rightContraints.gridy = 0; rightContraints.gridwidth = 1; rightContraints.gridheight = 1; rightContraints.weightx = 1.0; rightContraints.weighty = 1.0; rightContraints.anchor = GridBagConstraints.LINE_START; rightContraints.insets = new Insets(0, 5, 0, 0); rightPanel.add(viewTabbedPane, rightContraints); // Create a split pane with the two scroll panes in it. scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrollPane.setViewportView(walletsView); scrollPane.setViewportBorder(BorderFactory.createEmptyBorder()); scrollPane.setBorder(BorderFactory.createEmptyBorder()); scrollPane.getViewport().setBackground(Color.WHITE); scrollPane.getHorizontalScrollBar().setUnitIncrement(BitherSetting.SCROLL_INCREMENT); scrollPane.getVerticalScrollBar().setUnitIncrement(BitherSetting.SCROLL_INCREMENT); scrollPane.getViewport().setOpaque(true); scrollPane.setComponentOrientation(ComponentOrientation.getOrientation(LocaliserUtils.getLocale())); ScrollBarUIDecorator.apply(scrollPane, false); if (ComponentOrientation.LEFT_TO_RIGHT == ComponentOrientation.getOrientation(LocaliserUtils.getLocale())) { splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scrollPane, rightPanel); } else { splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, rightPanel, scrollPane); splitPane.setResizeWeight(1.0); } splitPane.setDividerSize(3); splitPane.setBackground(Themes.currentTheme.text()); splitPane.setBorder( BorderFactory.createMatteBorder( 1, 0, 1, 0, Themes.currentTheme.text() )); splitPane.setOneTouchExpandable(false); splitPane.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, SystemColor.windowBorder)); // splitPane.setBackground(ColorAndFontConstants.BACKGROUND_COLOR); splitPane.setOpaque(true); constraints.fill = GridBagConstraints.BOTH; constraints.gridx = 0; constraints.gridy = 2; constraints.gridwidth = 2; constraints.gridheight = 1; constraints.weightx = 1.0; constraints.weighty = 1000.0; constraints.gridwidth = 1; constraints.anchor = GridBagConstraints.LINE_START; contentPane.add(splitPane, constraints); calculateDividerPosition(); // Cannot get the RTL wallets drawing nicely so switch off adjustment. splitPane.setEnabled(ComponentOrientation.LEFT_TO_RIGHT.equals(ComponentOrientation.getOrientation(LocaliserUtils.getLocale()))); } public void updateHeaderOnSwingThread(final long estimatedBalance) { String titleText = LocaliserUtils.getString("bitherframe_title"); frame.setTitle(titleText); } public void calculateDividerPosition() { int dividerPosition = SingleWalletForm.calculateNormalWidth(walletsView) + BitherSetting.WALLET_WIDTH_DELTA; // if (walletsView.getScrollPane().getVerticalScrollBar().isVisible()) { // dividerPosition += BitherSetting.SCROLL_BAR_DELTA; // } if (walletsView != null && walletsView.getPreferredSize() != null && walletsView.getPreferredSize().width > dividerPosition) { dividerPosition = walletsView.getPreferredSize().width; } if (ComponentOrientation.RIGHT_TO_LEFT == ComponentOrientation.getOrientation(LocaliserUtils.getLocale())) { int width = frame.getWidth(); if (width == 0) { width = (int) frame.getPreferredSize().getWidth(); } dividerPosition = width - dividerPosition; // - WalletListPanel.LEFT_BORDER - WalletListPanel.RIGHT_BORDER - 2; } splitPane.setEnabled(true); splitPane.setDividerLocation(dividerPosition); splitPane.setEnabled(ComponentOrientation.LEFT_TO_RIGHT.equals(ComponentOrientation.getOrientation(LocaliserUtils.getLocale()))); } public void recreateAllViewsOnSwingThread(final boolean initUI, ViewEnum initialView) { // Close down current view. if (Bither.getCoreController().getCurrentView() != ViewEnum.UNKNOWN_VIEW) { frame.navigateAwayFromView(Bither.getCoreController().getCurrentView()); } if (initUI) { Container contentPane = frame.getContentPane(); viewFactory.initialise(); contentPane.removeAll(); initUI(null); try { frame.applyComponentOrientation(ComponentOrientation.getOrientation(LocaliserUtils.getLocale())); } catch (ClassCastException cce) { cce.printStackTrace(); } } //statusBar.refreshOnlineStatusText(); updateHeader(); // Tell the wallets list to display. if (walletsView != null) { walletsView.displayView(DisplayHint.COMPLETE_REDRAW); } } public MenuBar getTickerTablePanel() { return menuBarFrom; } /** * Actually update the UI. * (Called back from the FireDataChangedTimerTask). */ public void fireDataChangedOnSwingThread(DisplayHint displayHint) { updateHeader(); // Update the password related menu items. updateMenuItemsOnWalletChange(); // Tell the wallets list to display. if (walletsView != null) { walletsView.displayView(displayHint); } // Tell the current view to update itself. Viewable currentViewView = viewFactory.getView(Bither.getCoreController().getCurrentView()); if (currentViewView != null) { currentViewView.displayView(displayHint); } } private void updateMenuItemsOnWalletChange() { } public void updateHeader() { if (UserPreference.getInstance().getAppMode() == BitherjSettings.AppMode.COLD) { return; } long finalEstimatedBalance = 0; for (Address address : AddressManager.getInstance().getAllAddresses()) { finalEstimatedBalance = finalEstimatedBalance + address.getBalance(); } if (AddressManager.getInstance().getHdAccount() != null) { finalEstimatedBalance = finalEstimatedBalance + AddressManager.getInstance().getHdAccount().getBalance(); } final long total = finalEstimatedBalance; if (EventQueue.isDispatchThread()) { updateHeaderOnSwingThread(total); } else { SwingUtilities.invokeLater(new Runnable() { public void run() { updateHeaderOnSwingThread(total); } }); } } public void focusableUI() { if (UserPreference.getInstance().getAppMode() == BitherjSettings.AppMode.HOT) { updateHeader(); } calculateDividerPosition(); } //todo Entering for the first time vericalScrollbar errors public void clearScroll() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { scrollPane.getVerticalScrollBar().setValue(0); } }); } }