/*
* 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.ActionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.logging.Logger;
import javax.help.HelpBroker;
import javax.swing.*;
import org.geoforge.guihlp.handler.IGfrHandlerSetEnabledTrueHelpOnThisSection;
import org.geoforge.guillc.handler.IGfrHandlerCloseSpace;
import org.geoforge.guillc.handler.IGfrHandlerOpenSpaceAny;
import org.geoforge.guillc.handler.IGfrHandlerOpenSpaceAppProject;
import org.geoforge.guillc.menubar.GfrMbrSpcAppAbs;
import org.geoforge.guillc.panel.GfrPnlStatusBarMain;
import org.geoforge.guillc.tabbedpane.GfrTabSpcAppAbs;
import org.geoforge.guillc.tabbedpane.GfrTabSpcAppClsPrjAbs;
import org.geoforge.guillc.toolbar.GfrTbrHlpMainSpcAppAbs;
import org.geoforge.io.handler.IGfrHandlerUnserializedObject;
import org.geoforge.io.serial.GfrSerializeFrameMainSpaceProject;
import org.geoforge.io.serial.GfrSerializeFrameMainSpaceRoot;
import org.geoforge.io.serial.GfrSerializeFrameMainSpaceWork;
import org.geoforge.lang.handler.IGfrHandlerLifeCycleObject;
import org.geoforge.java.enumeration.GfrEnuSystemPropertiesKeys;
import org.geoforge.lang.util.GfrResBundleLang;
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 GfrFrmMainAppAbs extends GfrFrmAbs implements
IGfrHandlerSetEnabledTrueHelpOnThisSection
{
final static private int _F_INT_WIDTH_PREF_ = 1200;
final static private int _F_INT_HEIGT_PREF_ = 800;
// ----
// begin: instantiate logger for this class
final static private Logger _LOGGER_ = Logger.getLogger(GfrFrmMainAppAbs.class.getName());
static
{
GfrFrmMainAppAbs._LOGGER_.addHandler(FileHandlerLogger.s_getInstance());
}
// end: instantiate logger for this class
// ----
protected GfrMbrSpcAppAbs _mbrSpcRoot = null;
protected GfrTbrHlpMainSpcAppAbs _tbrSpcRoot = null;
protected GfrTabSpcAppAbs _tpnSpcRoot = null;
protected GfrMbrSpcAppAbs _mbrSpcClsWork = null;
protected GfrTbrHlpMainSpcAppAbs _tbrSpcClsWork = null;
protected GfrTabSpcAppAbs _tpnSpcClsWork = null;
protected GfrMbrSpcAppAbs _mbrSpcClsPrjWwdMan = null;
protected GfrTbrHlpMainSpcAppAbs _tbrSpcClsPrjWwdMan = null;
protected GfrTabSpcAppAbs _tpnSpcClsPrjWwdMan = null;
protected GfrMbrSpcAppAbs _mbrSpcClsPrjWwdSel = null;
protected GfrTbrHlpMainSpcAppAbs _tbrSpcClsPrjWwdSel = null;
protected GfrTabSpcAppAbs _tpnSpcClsPrjWwdSel = null;
protected GfrMbrSpcAppAbs _mbrSpcClsPrjRun = null;
protected GfrTbrHlpMainSpcAppAbs _tbrSpcClsPrjRun = null;
protected GfrTabSpcAppAbs _tpnSpcClsPrjRun = null;
protected ArrayList<IGfrHandlerLifeCycleObject> _altObjComponentChildren = null;
protected GfrFrmMainAppAbs() throws Exception
{
super(
"THIS" // strIconAppli
);
this._altObjComponentChildren = new ArrayList<IGfrHandlerLifeCycleObject>();
}
@Override
public void loadUnserializedObject() throws Exception
{
this.loadTransient();
for (int i=0; i<this._altObjComponentChildren.size(); i++)
{
IGfrHandlerLifeCycleObject obj = this._altObjComponentChildren.get(i);
if (obj instanceof IGfrHandlerUnserializedObject)
{
((IGfrHandlerUnserializedObject) obj).loadUnserializedObject();
}
}
}
@Override
public void releaseUnserializedObject() throws Exception
{
this.releaseTransient();
for (int i=0; i<this._altObjComponentChildren.size(); i++)
{
IGfrHandlerLifeCycleObject obj = this._altObjComponentChildren.get(i);
if (obj instanceof IGfrHandlerUnserializedObject)
{
((IGfrHandlerUnserializedObject) obj).releaseUnserializedObject();
}
}
}
public void setEnabledHelpGettingStarted(HelpBroker hbr)
{
for (int i=0; i<this._altObjComponentChildren.size(); i++)
{
IGfrHandlerLifeCycleObject obj = this._altObjComponentChildren.get(i);
if (obj instanceof GfrMbrSpcAppAbs)
{
((GfrMbrSpcAppAbs) obj).setEnabledHelpGettingStarted(hbr);
}
}
}
public void closeSpaceRoot() throws Exception
{
Rectangle rec = super.getBounds();
GfrSerializeFrameMainSpaceRoot.s_writeBounds(rec);
}
public void closeSpaceWork() throws Exception
{
Rectangle rec = super.getBounds();
GfrSerializeFrameMainSpaceWork.s_writeBounds(rec);
((IGfrHandlerCloseSpace) this._tpnSpcClsWork).closeSpace();
}
public void closeSpaceProject() throws Exception
{
Rectangle rec = super.getBounds();
GfrSerializeFrameMainSpaceProject.s_writeBounds(rec);
((IGfrHandlerCloseSpace) this._tbrSpcClsPrjWwdMan).closeSpace();
((IGfrHandlerCloseSpace) this._tbrSpcClsPrjWwdSel).closeSpace();
((IGfrHandlerCloseSpace) this._tbrSpcClsPrjRun).closeSpace();
((IGfrHandlerCloseSpace) this._tpnSpcClsPrjWwdMan).closeSpace();
((IGfrHandlerCloseSpace) this._tpnSpcClsPrjWwdSel).closeSpace();
((IGfrHandlerCloseSpace) this._tpnSpcClsPrjRun).closeSpace();
}
public void openSpaceProject(
ActionListener alrControllerSpcPrj,
ActionListener alrControllerPrsMan,
ActionListener alrControllerPrsSel,
ActionListener alrControllerPrsRun) throws Exception
{
_setBoundsSpaceProject();
((IGfrHandlerOpenSpaceAny) this._tbrSpcClsPrjWwdMan).openSpaceAny(alrControllerSpcPrj);
((IGfrHandlerOpenSpaceAny) this._tbrSpcClsPrjWwdSel).openSpaceAny(alrControllerSpcPrj);
((IGfrHandlerOpenSpaceAny) this._tbrSpcClsPrjRun).openSpaceAny(alrControllerSpcPrj);
((IGfrHandlerOpenSpaceAppProject) this._tpnSpcClsPrjWwdMan).openSpaceApplicationProject(alrControllerSpcPrj, alrControllerPrsMan);
((IGfrHandlerOpenSpaceAppProject) this._tpnSpcClsPrjWwdSel).openSpaceApplicationProject(alrControllerSpcPrj, alrControllerPrsSel);
((IGfrHandlerOpenSpaceAppProject) this._tpnSpcClsPrjRun).openSpaceApplicationProject(alrControllerSpcPrj, alrControllerPrsRun);
}
@Override
public boolean init()
{
if (! super.init())
return false;
for (int i=0; i<this._altObjComponentChildren.size(); i++)
{
IGfrHandlerLifeCycleObject obj = this._altObjComponentChildren.get(i);
if (! obj.init())
return false;
}
this._pnlContentPane.add(GfrPnlStatusBarMain.s_getInstance(), BorderLayout.SOUTH);
return true;
}
public void setEnabledTabsContents(boolean bln)
{
for (int i=0; i<this._altObjComponentChildren.size(); i++)
{
IGfrHandlerLifeCycleObject obj = this._altObjComponentChildren.get(i);
if (obj instanceof GfrTabSpcAppClsPrjAbs)
{
((GfrTabSpcAppClsPrjAbs) obj).setEnabled(bln);
}
}
}
public void openSpaceWork(
String strPathAbsSpaceWork,
ActionListener alrControllerSpcWrk) throws Exception // workspace
{
_setBoundsSpaceWork();
((IGfrHandlerOpenSpaceAny) this._tpnSpcClsWork).openSpaceAny(alrControllerSpcWrk);
_setSpace_(
GfrResBundleLang.s_getInstance().getValue("word.workspace"),
strPathAbsSpaceWork,
this._mbrSpcClsWork,
this._tbrSpcClsWork,
this._tpnSpcClsWork);
String strTitle = super.getTitle();
strTitle += " - ";
strTitle += "\"";
strTitle += strPathAbsSpaceWork;
strTitle += "\"";
super.setTitle(strTitle);
}
public void openSpaceRoot() throws Exception
{
_setBoundsSpaceRoot();
_setSpace_(
GfrResBundleLang.s_getInstance().getValue("word.desktop"),
"_void_",
this._mbrSpcRoot,
this._tbrSpcRoot,
this._tpnSpcRoot);
}
public void switchPerspectiveProject(String strNameSpaceProject,
String strKindPersp) throws Exception
{
GfrMbrSpcAppAbs mbr = null;
GfrTbrHlpMainSpcAppAbs tbr = null;
GfrTabSpcAppAbs tab = null;
if (strKindPersp.compareTo(GfrResBundleLang.s_getInstance().getValue("verb.manage").toLowerCase()) == 0)
{
mbr = this._mbrSpcClsPrjWwdMan;
tbr = this._tbrSpcClsPrjWwdMan;
tab = this._tpnSpcClsPrjWwdMan;
}
else if (strKindPersp.compareTo(GfrResBundleLang.s_getInstance().getValue("verb.select").toLowerCase()) == 0)
{
mbr = this._mbrSpcClsPrjWwdSel;
tbr = this._tbrSpcClsPrjWwdSel;
tab = this._tpnSpcClsPrjWwdSel;
}
else if (strKindPersp.compareTo(GfrResBundleLang.s_getInstance().getValue("verb.run").toLowerCase()) == 0)
{
mbr = this._mbrSpcClsPrjRun;
tbr = this._tbrSpcClsPrjRun;
tab = this._tpnSpcClsPrjRun;
}
else
{
String str = "uncaught strKindPersp:" + strKindPersp;
GfrFrmMainAppAbs._LOGGER_.severe(str);
throw new Exception(str);
}
// ----
_setSpace_(
GfrResBundleLang.s_getInstance().getValue("word.project"),
strNameSpaceProject,
mbr,
tbr,
tab);
// ----
// do job
String strTitle = super.getTitle();
strTitle += " - ";
strTitle += "\"";
strTitle += strNameSpaceProject;
strTitle += "\"";
strTitle += " - ";
strTitle += strKindPersp;
super.setTitle(strTitle);
}
@Override
public void setEnabledTrueHelpOnThisSection(HelpBroker hbr)
{
for (int i=0; i<this._altObjComponentChildren.size(); i++)
{
IGfrHandlerLifeCycleObject obj = this._altObjComponentChildren.get(i);
if (obj instanceof IGfrHandlerSetEnabledTrueHelpOnThisSection)
{
((IGfrHandlerSetEnabledTrueHelpOnThisSection) obj).setEnabledTrueHelpOnThisSection(hbr);
}
}
}
@Override
public void destroy()
{
try
{
Rectangle rec = super.getBounds();
String strTypeDisplay = GfrPnlStatusBarMain.s_getInstance().getTypeDisplay();
if (strTypeDisplay.compareTo(GfrResBundleLang.s_getInstance().getValue("word.desktop")) == 0)
{
GfrSerializeFrameMainSpaceRoot.s_writeBounds(rec);
}
else if (strTypeDisplay.compareTo(GfrResBundleLang.s_getInstance().getValue("word.workspace")) == 0)
{
GfrSerializeFrameMainSpaceWork.s_writeBounds(rec);
}
else if (strTypeDisplay.compareTo(GfrResBundleLang.s_getInstance().getValue("word.project")) == 0)
{
GfrSerializeFrameMainSpaceProject.s_writeBounds(rec);
}
else
{
GfrFrmMainAppAbs._LOGGER_.severe("Uncaught strTypeDisplay: " + strTypeDisplay);
}
//Rectangle rec = super.getBounds();
//TO_REMOVE_GfrSerializeFrameMain.s_writeBounds(rec);
}
catch(Exception exc)
{
exc.printStackTrace();
}
for (int i = 0; i < this._altObjComponentChildren.size(); i++)
{
IGfrHandlerLifeCycleObject obj = this._altObjComponentChildren.get(i);
if (obj == null)
continue;
obj.destroy();
obj = null;
}
this._altObjComponentChildren.clear();
this._altObjComponentChildren = null;
super.dispose();
}
// ---
private void _setBoundsSpaceRoot() throws Exception
{
Object objRectangle = GfrSerializeFrameMainSpaceRoot.s_readBounds();
if (objRectangle == null) // first run
{
_setBoundsFirstRun();
return;
}
if (! (objRectangle instanceof Rectangle))
throw new Exception("! (objRectangle instanceof Rectangle)");
Rectangle recBounds = (Rectangle) objRectangle;
super.setBounds(recBounds);
super.setPreferredSize(new Dimension(recBounds.width, recBounds.height));
super.setSize(recBounds.width, recBounds.height);
}
private void _setBoundsSpaceWork() throws Exception
{
Object objRectangle = GfrSerializeFrameMainSpaceWork.s_readBounds();
if (objRectangle == null) // first run
{
_setBoundsSpaceRoot();
return;
}
if (! (objRectangle instanceof Rectangle))
throw new Exception("! (objRectangle instanceof Rectangle)");
Rectangle recBounds = (Rectangle) objRectangle;
super.setBounds(recBounds);
super.setPreferredSize(new Dimension(recBounds.width, recBounds.height));
super.setSize(recBounds.width, recBounds.height);
}
private void _setBoundsSpaceProject() throws Exception
{
Object objRectangle = GfrSerializeFrameMainSpaceProject.s_readBounds();
if (objRectangle == null) // first run
{
_setBoundsSpaceWork();
return;
}
if (! (objRectangle instanceof Rectangle))
throw new Exception("! (objRectangle instanceof Rectangle)");
Rectangle recBounds = (Rectangle) objRectangle;
super.setBounds(recBounds);
super.setPreferredSize(new Dimension(recBounds.width, recBounds.height));
super.setSize(recBounds.width, recBounds.height);
}
@Override
protected void _setBoundsFirstRun()
{
Toolkit tlk = Toolkit.getDefaultToolkit();
Dimension dimScreen = tlk.getScreenSize();
int intWScreen = dimScreen.width;
int intHScreen = dimScreen.height;
//System.out.println("intWScreen=" + intWScreen);
//System.out.println("intHScreen=" + intHScreen);
intWScreen -= 5; // NOT YET TESTED
intHScreen -= 5; // NOT YET TESTED
int intW = GfrFrmMainAppAbs._F_INT_WIDTH_PREF_;
int intH = GfrFrmMainAppAbs._F_INT_HEIGT_PREF_;
if (intW > intWScreen)
intW = intWScreen;
if (intH > intHScreen)
intH = intHScreen;
super.setPreferredSize(new Dimension(intW, intH));
super.setSize(intW, intH);
}
// ---
private void _setSpace_(
String strTypeDisplay, // to be remove
String strValueDisplay, // to be remove
JMenuBar mbr,
JToolBar tbr,
JTabbedPane tabContents)
{
GfrPnlStatusBarMain.s_getInstance().setTypeDisplay(strTypeDisplay);
GfrPnlStatusBarMain.s_getInstance().setValueDisplay(strValueDisplay);
JMenuBar mbrPrev = super.getJMenuBar();
if (mbrPrev != null)
super.remove(mbrPrev);
super.setJMenuBar(mbr);
//Component[] cmps = super.getContentPane().getComponents();
Component[] cmps = this._pnlContentPane.getComponents();
// removing toolbar and contents
for (int i=0; i<cmps.length; i++)
{
if (cmps[i] instanceof GfrPnlStatusBarMain)
continue;
//super.getContentPane().remove(cmps[i]);
this._pnlContentPane.remove(cmps[i]);
}
this._pnlContentPane.add(tbr, BorderLayout.NORTH);
this._pnlContentPane.add((Component) tabContents, BorderLayout.CENTER);
String strTitle = System.getProperty(GfrEnuSystemPropertiesKeys.NAME_LONG_APPLI.getLabel());
if (strTypeDisplay != null) // TODO: first letter in upperCase
{
strTitle += " - ";
strTitle += strTypeDisplay;
}
super.setTitle(strTitle);
JComponent cmp = (JComponent) this._pnlContentPane;
cmp.revalidate();
if (cmp.isVisible())
cmp.repaint();
}
// memo: hidden source call, please don't remove this method!
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
// our "pseudo-constructor"
in.defaultReadObject();
// now we are a "live" object again, so let's run rebuild and start
}
}