
net.sourceforge.squirrel_sql.client.gui.mainframe.MainFrame Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of squirrel-sql Show documentation
Show all versions of squirrel-sql Show documentation
This is the jar that contains the main application classes which are very specific to
SQuirreLSQL.
package net.sourceforge.squirrel_sql.client.gui.mainframe;
/*
* Copyright (C) 2001-2004 Colin Bell
* [email protected]
*
* Modifications Copyright (C) 2003-2004 Jason Height
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.Version;
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DialogWidget;
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DockWidget;
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.*;
import net.sourceforge.squirrel_sql.client.preferences.SquirrelPreferences;
import net.sourceforge.squirrel_sql.client.resources.SquirrelResources;
import net.sourceforge.squirrel_sql.client.session.MessagePanel;
import net.sourceforge.squirrel_sql.fw.datasetviewer.IMainFrame;
import net.sourceforge.squirrel_sql.fw.gui.Dialogs;
import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.prefs.Preferences;
@SuppressWarnings("serial")
public class MainFrame extends JFrame implements IMainFrame //BaseMDIParentFrame
{
public interface IMenuIDs extends MainFrameMenuBar.IMenuIDs
{
// Empty body.
}
/** Logger for this class. */
private final ILogger s_log = LoggerController.createLogger(MainFrame.class);
/** Internationalized strings for this class. */
private static final StringManager s_stringMgr =
StringManagerFactory.getStringManager(MainFrame.class);
/** Application API. */
private final IApplication _app;
// private AliasesListInternalFrame _aliasesListWindow;
// private DriversListInternalFrame _driversListWindow;
/** Toolbar at top of window. */
private MainFrameToolBar _toolBar;
/** Status bar at bottom of window. */
private MainFrameStatusBar _statusBar;
/** Message panel at bottom of window. */
// JASON: Should be part of status bar?
private MessagePanel _msgPnl;
/** If true then status bar is visible. */
private boolean _statusBarVisible = false;
private IDesktopContainer _desktop;
private static final String PREFS_KEY_MESSAGEPANEL_HEIGHT = "squirrelSql_msgPanel_height";
private boolean m_hasBeenVisible;
private JSplitPane _splitPn;
/**
* Ctor.
*
* @param app Application API.
*
* @throws IllegalArgumentException
* Thrown if null IApplication
* passed.
*/
public MainFrame(IApplication app)
{
super(Version.getVersion());
if (app == null)
{
throw new IllegalArgumentException("Null IApplication passed");
}
_app = app;
_desktop = DesktopContainerFactory.createDesktopContainer(_app);
createUserInterface();
preferencesHaveChanged(null); // Initial load of prefs.
_app.getSquirrelPreferences().addPropertyChangeListener(new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent evt)
{
synchronized (MainFrame.this)
{
preferencesHaveChanged(evt);
}
}
});
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
IDesktopContainer comp = getDesktopContainer();
comp.setPreferredSize(comp.getRequiredSize());
comp.revalidate();
}
});
}
// ...
public void dispose()
{
boolean shouldDispose = true;
if (!_app.shutdown())
{
String msg = s_stringMgr.getString("MainFrame.errorOnClose");
shouldDispose = Dialogs.showYesNo(_app.getMainFrame(), msg);
}
if (shouldDispose)
{
closeAllToolWindows();
super.dispose();
System.exit(0);
}
}
public void pack()
{
// Don't call super. Packing this frame causes problems.
}
public IApplication getApplication()
{
return _app;
}
public IDesktopContainer getDesktopContainer()
{
return _desktop;
}
public void addWidget(DialogWidget widget)
{
_desktop.addWidget(widget);
}
public void addWidget(DockWidget widget)
{
_desktop.addWidget(widget);
}
public void addWidget(TabWidget widget)
{
_desktop.addWidget(widget);
}
public JMenu getSessionMenu()
{
return ((MainFrameMenuBar) getJMenuBar()).getSessionMenu();
}
public void addToMenu(int menuId, JMenu menu)
{
if (menu == null)
{
throw new IllegalArgumentException("Null JMenu passed");
}
((MainFrameMenuBar)getJMenuBar()).addToMenu(menuId, menu);
}
public void addToMenu(int menuId, Action action)
{
if (action == null)
{
throw new IllegalArgumentException("Null BaseAction passed");
}
((MainFrameMenuBar)getJMenuBar()).addToMenu(menuId, action);
}
/**
* Add component to the status bar.
*
* @param comp Component to add.
*
* @throws IllegalArgumentException
* Thrown if null JComponent passed.
*/
public void addToStatusBar(JComponent comp)
{
if (comp == null)
{
throw new IllegalArgumentException("JComponent == null");
}
_statusBar.addJComponent(comp);
}
/**
* Remove component to the main frames status bar.
*
* @param comp Component to remove.
*/
public void removeFromStatusBar(JComponent comp)
{
if (comp == null)
{
throw new IllegalArgumentException("JComponent == null");
}
_statusBar.remove(comp);
}
public MessagePanel getMessagePanel()
{
return _msgPnl;
}
private void preferencesHaveChanged(PropertyChangeEvent evt)
{
String propName = evt != null ? evt.getPropertyName() : null;
final SquirrelPreferences prefs = _app.getSquirrelPreferences();
if (propName == null
|| propName.equals(
SquirrelPreferences.IPropertyNames.SHOW_CONTENTS_WHEN_DRAGGING))
{
if (prefs.getShowContentsWhenDragging())
{
getDesktopContainer().putClientProperty("JDesktopPane.dragMode", null);
}
else
{
getDesktopContainer().putClientProperty("JDesktopPane.dragMode", "outline");
}
}
if (propName == null
|| propName.equals(SquirrelPreferences.IPropertyNames.SHOW_MAIN_STATUS_BAR))
{
final boolean show = prefs.getShowMainStatusBar();
if (!show && _statusBarVisible)
{
getContentPane().remove(_statusBar);
_statusBarVisible = false;
}
else if (show && !_statusBarVisible)
{
getContentPane().add(_statusBar, BorderLayout.SOUTH);
_statusBarVisible = true;
}
}
if (propName == null
|| propName.equals(SquirrelPreferences.IPropertyNames.SHOW_MAIN_TOOL_BAR))
{
final boolean show = prefs.getShowMainToolBar();
if (!show && _toolBar != null)
{
getContentPane().remove(_toolBar);
_toolBar = null;
}
else if (show && _toolBar == null)
{
_toolBar = new MainFrameToolBar(_app);
getContentPane().add(_toolBar, BorderLayout.NORTH);
}
}
}
private void closeAllToolWindows()
{
IWidget[] frames =
WidgetUtils.getOpenToolWindows(getDesktopContainer().getAllWidgets());
for (int i = 0; i < frames.length; ++i)
{
frames[i].dispose();
}
}
private void createUserInterface()
{
setVisible(false);
setDefaultCloseOperation(MainFrame.DO_NOTHING_ON_CLOSE);
final SquirrelResources rsrc = _app.getResources();
getDesktopContainer().setDesktopManager(new SquirrelDesktopManager(_app));
final Container content = getContentPane();
content.setLayout(new BorderLayout());
final JScrollPane sp = new JScrollPane(getDesktopContainer().getComponent());
sp.setBorder(BorderFactory.createEmptyBorder());
_msgPnl = new MessagePanel()
{
public void setSize(int width, int height)
{
super.setSize(width, height);
if(0 < width && 0 < height)
{
// The call here is the result of a desperate fight
// to find a place where the components in the split
// had not height = 0. If someone knows a better way
// please tell me I'll apreciate any advice.
// [email protected]
resizeSplitOnStartup();
}
}
};
_msgPnl.setName(MessagePanel.class.toString());
_msgPnl.setEditable(false);
_splitPn = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
_splitPn.add(sp);
_splitPn.add(new JScrollPane(_msgPnl));
_splitPn.setResizeWeight(1);
//i18n[MainFrame.saveSize=Save size]
String key = s_stringMgr.getString("MainFrame.saveSize");
Action splitDividerLocAction = new AbstractAction(key)
{
public void actionPerformed(ActionEvent e)
{
int msgPanelHeight = _splitPn.getBottomComponent().getSize().height;
Preferences.userRoot().putInt(PREFS_KEY_MESSAGEPANEL_HEIGHT, msgPanelHeight);
}
};
_msgPnl.addToMessagePanelPopup(splitDividerLocAction);
//i18n[MainFrame.restoreSize=Restore saved size]
key = s_stringMgr.getString("MainFrame.restoreSize");
Action setSplitDividerLocAction = new AbstractAction(key)
{
public void actionPerformed(ActionEvent e)
{
int prefMsgPanelHeight = Preferences.userRoot().getInt(PREFS_KEY_MESSAGEPANEL_HEIGHT, -1);
if(-1 != prefMsgPanelHeight)
{
int divLoc = getDividerLocation(prefMsgPanelHeight, _splitPn);
_splitPn.setDividerLocation(divLoc);
}
}
};
_msgPnl.addToMessagePanelPopup(setSplitDividerLocAction);
content.add(_splitPn, BorderLayout.CENTER);
_statusBar = new MainFrameStatusBar(_app);
final Font fn = _app.getFontInfoStore().getStatusBarFontInfo().createFont();
_statusBar.setFont(fn);
setJMenuBar(new MainFrameMenuBar(_app, getDesktopContainer(), _app.getActionCollection()));
setupFromPreferences();
final ImageIcon icon = rsrc.getIcon(SquirrelResources.IImageNames.APPLICATION_ICON);
if (icon != null)
{
setIconImage(icon.getImage());
}
else
{
s_log.error("Missing icon for mainframe");
}
// On Win 2000 & XP mnemonics are normally hidden. To make them
// visible you press the alt key. Under the Windows L&F pressing
// alt may not work. This code is a workaround. See bug report
// 4736093 for more information.
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_ALT, Event.ALT_MASK, false),
"repaint");
validate();
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
dispose();
}
});
}
public void resizeSplitOnStartup()
{
if(false == m_hasBeenVisible)
{
m_hasBeenVisible = true;
final int prefMsgPanelHeight = Preferences.userRoot().getInt(PREFS_KEY_MESSAGEPANEL_HEIGHT, -1);
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
if (-1 == prefMsgPanelHeight)
{
int divLoc = getDividerLocation(50, _splitPn);
_splitPn.setDividerLocation(divLoc);
}
else
{
int divLoc = getDividerLocation(prefMsgPanelHeight, _splitPn);
_splitPn.setDividerLocation(divLoc);
}
}
});
}
}
private int getDividerLocation(int wantedBottomComponentHeight, JSplitPane splitPn)
{
int splitBarSize =
splitPn.getSize().height -
splitPn.getBottomComponent().getSize().height -
splitPn.getTopComponent().getSize().height - 1;
int divLoc = splitPn.getSize().height - wantedBottomComponentHeight - splitBarSize;
return divLoc;
}
private void setupFromPreferences()
{
final SquirrelPreferences prefs = _app.getSquirrelPreferences();
MainFrameWindowState ws = prefs.getMainFrameWindowState();
// Position window to where it was when last closed. If this is not
// on the screen, move it back on to the screen.
setBounds(ws.getBounds().createRectangle());
if (!GUIUtils.isWithinParent(this))
{
setLocation(new Point(10, 10));
}
setExtendedState(ws.getFrameExtendedState());
}
public JMenu getWindowsMenu()
{
return ((MainFrameMenuBar)getJMenuBar()).getWindowsMenu();
}
public void setEnabledAliasesMenu(boolean b)
{
MainFrameMenuBar mainFrameMenuBar = (MainFrameMenuBar) getJMenuBar();
mainFrameMenuBar.setEnabledAliasesMenu(b);
}
public void setEnabledDriversMenu(boolean b)
{
MainFrameMenuBar mainFrameMenuBar = (MainFrameMenuBar) getJMenuBar();
mainFrameMenuBar.setEnabledDriversMenu(b);
}
public void addToToolBar(Action act)
{
_toolBar.add(act);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy