/*
* Copyright (C) 2011-2014 GeoForge Project
*
* This program 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 3 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.geoforge.guillc.frame;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.logging.Logger;
import javax.help.HelpBroker;
import javax.swing.JFrame;
import javax.swing.JPopupMenu;
import javax.swing.WindowConstants;
import org.geoforge.guihlp.GfrCSH;
import org.geoforge.guillc.border.GfrBorderHelpOnThis;
import org.geoforge.guillc.checkboxmenuitem.GfrCmiAlrFullScreen_NOT_YET_IN_USE;
import org.geoforge.guillc.optionpane.GfrOptionPaneAbs;
import org.geoforge.guillc.panel.GfrPnl;
import org.geoforge.guillc.panel.GfrPnlStatusBarMain;
import org.geoforge.io.handler.IGfrHandlerUnserializedObject;
import org.geoforge.java.enumeration.GfrEnuSystemPropertiesKeys;
import org.geoforge.lang.handler.IGfrHandlerLifeCycleObject;
import org.geoforge.lang.handler.IGfrHandlerTransitoryObject;
import org.geoforge.java.util.logging.filehandler.FileHandlerLogger;
/**
*
* @author bantchao
*
* email: bantchao_AT_gmail.com
* ... please remove "_AT_" from the above string to get the right email address
*
*/
abstract public class GfrFrmAbs extends JFrame implements
Printable,
IGfrHandlerLifeCycleObject,
IGfrHandlerTransitoryObject,
IGfrHandlerUnserializedObject,
ActionListener
{
// ----
// begin: instantiate logger for this class
final static private Logger _LOGGER_ = Logger.getLogger(GfrFrmAbs.class.getName());
static
{
GfrFrmAbs._LOGGER_.addHandler(FileHandlerLogger.s_getInstance());
}
// end: instantiate logger for this class
// ----
// ---
// beg transient stuff
transient private Image _img_ = null;
// end transient stuff
protected GfrPnl _pnlContentPane = null; // destroy never called !!!!!!!!!!!!!
abstract protected void _setBoundsFirstRun();
protected GfrFrmAbs(
String strNameIcon)
{
super(System.getProperty(GfrEnuSystemPropertiesKeys.NAME_LONG_APPLI.getLabel()));
this._strNameIcon = strNameIcon;
// ---
this._pnlContentPane = new GfrPnl(new BorderLayout());
this._pnlContentPane.init();
super.setContentPane(this._pnlContentPane);
GfrBorderHelpOnThis.s_set(this._pnlContentPane);
// ---
super.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
}
public boolean doPrint()
{
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(this);
boolean blnOk = true;
if (job.printDialog())
{
try
{
job.print();
setCursor(Cursor.getDefaultCursor());
}
catch(Exception exc)
{
setCursor(Cursor.getDefaultCursor());
exc.printStackTrace();
GfrFrmAbs._LOGGER_.warning(exc.getMessage());
GfrOptionPaneAbs.s_showDialogWarning(this, exc.getMessage());
blnOk = false;
}
}
else
setCursor(Cursor.getDefaultCursor());
return blnOk;
}
@Override
public int print(Graphics g, PageFormat pft, int intPageIndex)
{
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.black);
Dimension d = this.getSize();
double dblPanelW = d.getWidth();
double dblPanelH = d.getHeight();
double dblPageW = pft.getImageableWidth();
double dblPageH = pft.getImageableHeight();
double dblScale = dblPageW / dblPanelW;
int intPageNb = (int) Math.ceil(dblScale * dblPanelH / dblPageH);
if (intPageIndex >= intPageNb)
return Printable.NO_SUCH_PAGE;
g2.translate(pft.getImageableX(), pft.getImageableY());
g2.translate(0f, -intPageIndex*dblPageH);
g2.scale(dblScale, dblScale);
this.paint(g2);
return Printable.PAGE_EXISTS;
}
static public JFrame s_getFrameOwnerTrickForActionController(Component cmp)
{
JFrame frm = s_getFrameOwner(cmp);
JFrame frmMain = s_getFrameOwner(GfrPnlStatusBarMain.s_getInstance());
if (frm == frmMain)
return frm;
return null;
}
static public JFrame s_getFrameOwner(Component cmp)
{
while (cmp != null)
{
if (cmp instanceof JFrame)
return (JFrame) cmp;
if (cmp instanceof JPopupMenu)
{
JPopupMenu pop = (JPopupMenu) cmp;
cmp = pop.getInvoker();
}
cmp = cmp.getParent();
}
return null;
}
@Override
public void setIconImage(Image img)
{
this._img_ = img;
super.setIconImage(this._img_);
}
@Override
public void releaseTransient() throws Exception
{
super.setIconImage(null);
}
// memo: hidden source call
private void writeObject(ObjectOutputStream out) throws IOException
{
out.defaultWriteObject();
}
@Override
public boolean init()
{
try
{
loadTransient();
}
catch (Exception exc)
{
exc.printStackTrace();
GfrFrmAbs._LOGGER_.severe(exc.getMessage());
GfrOptionPaneAbs.s_showDialogError(this, exc.getMessage());
return false;
}
return true;
}
@Override
public void pack()
{
/*if (this._dimPreferred_ == null)
{
this._dimPreferred_ = super.getPreferredSize();
}*/
super.pack();
}
private void _setFullScreen(boolean bln)
{
/*
super.dispose();
if (bln)
{
this._rec_ = super.getBounds();
super.setUndecorated(true);
super.setExtendedState(Frame.MAXIMIZED_BOTH);
super.setVisible(true);
return;
}
if (this._dimPreferred_ == null)
{
System.err.println("this._dimPreferred == null, aborting");
super.setVisible(true);
return;
}
super.setUndecorated(false);
super.setExtendedState(GfrFrmMain.NORMAL);
super.setBounds(this._rec_);
super.setPreferredSize(this._dimPreferred_);
super.setVisible(true);
*/
}
@Override
public void actionPerformed(ActionEvent evt)
{
if (evt.getSource() instanceof GfrCmiAlrFullScreen_NOT_YET_IN_USE)
{
GfrCmiAlrFullScreen_NOT_YET_IN_USE mim = (GfrCmiAlrFullScreen_NOT_YET_IN_USE) evt.getSource();
if (mim.getState())
{
// full screen
//System.out.println("full screen");
this._setFullScreen(true);
return;
}
// normal screen
//System.out.println("normal screen");
this._setFullScreen(false);
return;
}
// dev coding error
String str = "Uncaught action: " + evt.getSource().getClass().toString();
GfrFrmAbs._LOGGER_.severe(str);
GfrOptionPaneAbs.s_showDialogError(this, str);
}
// should be a static call, once a time
public void setEnabledHelpKey(HelpBroker hbr)
{
try
{
// F1 key
String strKey = "_app_welcome_";
if (hbr != null)
hbr.enableHelpKey(this.getRootPane(), strKey, (javax.help.HelpSet) null);
GfrCSH.setHelpIDString(this, strKey);
}
catch(Exception exc)
{
exc.printStackTrace();
String str = exc.getMessage();
GfrFrmAbs._LOGGER_.severe(str);
GfrOptionPaneAbs.s_showDialogError(this, str);
return;
}
}
//*/
//private Dimension _dimPreferred_ = null;
//private Rectangle _rec_ = null;
protected String _strNameIcon = null;
//protected String _strKindBackgroundIcon = "";
@Override
public void loadUnserializedObject() throws Exception
{
this.loadTransient();
for (int i=0; i<super.getComponentCount(); i++)
{
Component cmpCur = super.getComponent(i);
if (cmpCur instanceof IGfrHandlerUnserializedObject)
{
IGfrHandlerUnserializedObject serCur = (IGfrHandlerUnserializedObject) cmpCur;
serCur.loadUnserializedObject();
}
}
}
@Override
public void releaseUnserializedObject() throws Exception
{
this.releaseTransient();
for (int i=0; i<super.getComponentCount(); i++)
{
Component cmpCur = super.getComponent(i);
if (cmpCur instanceof IGfrHandlerUnserializedObject)
{
IGfrHandlerUnserializedObject serCur = (IGfrHandlerUnserializedObject) cmpCur;
serCur.releaseUnserializedObject();
}
}
}
}