/* GNU GENERAL PUBLIC LICENSE Copyright (C) 2006 The Lobo Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either verion 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Contact info: lobochief@users.sourceforge.net */ package org.lobobrowser.gui; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.HeadlessException; import java.awt.RenderingHints; import javax.swing.BoxLayout; import javax.swing.JMenu; import javax.swing.JMenuBar; import org.lobobrowser.main.ExtensionManager; import org.lobobrowser.ua.NavigatorFrame; /** * The default window class used by the browser. * * @see WindowFactory */ public class DefaultBrowserWindow extends AbstractBrowserWindow { private static final long serialVersionUID = -2359502974718245509L; private final FramePanel framePanel; private final NavigatorWindowImpl windowContext; public DefaultBrowserWindow(final boolean hasMenuBar, final boolean hasAddressBar, final boolean hasToolBar, final boolean hasStatusBar, final NavigatorWindowImpl windowContext) throws HeadlessException { // Maximise window setExtendedState(getExtendedState() | Frame.MAXIMIZED_BOTH); // TODO: SECURITY: Security needed in this class to prevent removal of all // window components?? this.windowContext = windowContext; this.framePanel = windowContext.getFramePanel(); ExtensionManager.getInstance().initExtensionsWindow(windowContext); final Object componentLock = windowContext.getComponentLock(); if (hasMenuBar) { final JMenuBar menuBar = new JMenuBar(); this.setJMenuBar(menuBar); synchronized (componentLock) { for (final JMenu menu : windowContext.getMenus()) { menuBar.add(menu); } // Collection<JMenuItem> sharedMenuItems = // windowContext.getSharedMenuItems(); // if(sharedMenuItems.size() > 0) { // JMenu extensionsMenu = new JMenu("Extensions"); // menuBar.add(extensionsMenu); // for(JMenuItem menuItem : sharedMenuItems) { // extensionsMenu.add(menuItem); // } // } } } final Container contentPane = this.getContentPane(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); if (hasAddressBar) { final AddressBarPanel abp = new AddressBarPanel(); contentPane.add(abp); synchronized (componentLock) { for (final Component c : windowContext.getAddressBarComponents()) { abp.add(c); } } } if (hasToolBar) { synchronized (componentLock) { for (final Component c : windowContext.getToolBars()) { contentPane.add(c); } } final SharedToolBarPanel stbp = new SharedToolBarPanel(); contentPane.add(stbp); synchronized (componentLock) { for (final Component c : windowContext.getSharedToolbarComponents()) { stbp.add(c); } } } contentPane.add(new FillerComponent(this.framePanel, false)); if (hasStatusBar) { final StatusBarPanel statusBar = new StatusBarPanel(); contentPane.add(statusBar); synchronized (componentLock) { for (final Component c : windowContext.getStatusBarComponents()) { statusBar.add(c); } } } } public NavigatorFrame getTopFrame() { return this.framePanel; } @Override public FramePanel getTopFramePanel() { return this.framePanel; } @Override public WindowCallback getWindowCallback() { return this.windowContext; } // private Image lastDbImage; // private Dimension lastDbSize; // // private Image getDoubleBufferingImage(Dimension size) { // Dimension lastDbSize = this.lastDbSize; // Image newImage = this.lastDbImage; // if(lastDbSize == null || lastDbSize.width != size.width || // lastDbSize.height != size.height) { // newImage = this.createImage(size.width, size.height); // this.lastDbImage = newImage; // this.lastDbSize = size; // } // return newImage; // } @Override public void update(final Graphics g) { if (g instanceof Graphics2D) { final Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } super.update(g); // Rectangle clipBounds = g.getClipBounds(); // Dimension size = this.getSize(); // Image dbi = this.getDoubleBufferingImage(size); // this.paint(dbi.getGraphics()); // g.drawImage(dbi, 0, 0, size.width, size.height, clipBounds.x, // clipBounds.y, clipBounds.width, clipBounds.height, this); } @Override public void setSize(final Dimension d) { unmaximise(); super.setSize(d); } @Override public void setSize(final int width, final int height) { unmaximise(); super.setSize(width, height); } private void unmaximise() { setExtendedState(getExtendedState() & (~Frame.MAXIMIZED_BOTH)); } }