/**********************************************************************
Virtual Cache is a program which helps to manage personal finances
Copyright (C) 2009 by Rovinskiy Nikolay
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 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***********************************************************************/
package Controllers.Main;
import Controllers.CardPane.CardPaneController;
import Utils.Card;
import Interfaces.MainWindow;
import Messages.Legend;
import Messages.YesNoCancelMessage;
import Utils.IniHolder;
import Utils.Profile;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JTable;
/**
*
* @author nrovinskiy
*/
public class MainWindowController extends MainWindow
{
private File fleOpened;
public char[] chrPassword;
private Profile prfMain;
private Vector<String> vctReasons;
private String strTitle;
private Savelistener slSave;
private SearchListener search;
public MainWindowController()
{
super();
fleOpened=null;
chrPassword=null;
miExit.addActionListener(new ExitListener(this));
miOpen.addActionListener(new OpenListener(this));
miCreateCard.addActionListener(new NewCardListener(this));
miCreateDatabase.addActionListener(new CreateListener(this));
slSave=new Savelistener(this);
miSave.addActionListener(slSave);
miSaveAs.addActionListener(slSave);
vctReasons=new Vector<String>();
strTitle=this.getTitle();
miClose.addActionListener(new CloseFileListener(this));
miDeleteCard.addActionListener(new DeleteCardListener(this, jtpCards));
miDelete.addActionListener(new DeleteDatabaseListener(this));
miReport.addActionListener(new MkReportListener(this));
miExport.addActionListener(new ExportListener(this));
miImport.addActionListener(new ImoprtListener(this));
miHelp.addActionListener(new LegendListener(this, new File("help.html"), Legend.CONTENT_TYPE_HTML, "Help"));
miLicense.addActionListener(new LegendListener(this, new File("license.txt"), Legend.CONTENT_TYPE_TEXT, "License"));
miAbout.addActionListener(new AboutListener(this));
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new WindowStateWriter());
try
{
this.setLocation(Integer.parseInt(IniHolder.ReadValue("MainX")), Integer.parseInt(IniHolder.ReadValue("MainY")));
}
catch(NumberFormatException ex)
{
this.setLocation(400, 200);
}
search=new SearchListener(this);
miSearch.addActionListener(search);
}
public void setOpenedFile(File file){fleOpened=file;}
public File getOpenedFile(){return fleOpened;}
public void setPassword(char[] password)
{
chrPassword=new char[password.length];
for(int i=0; i<password.length; i++)
chrPassword[i]=password[i];
}
public char[] getPassword(){return chrPassword;}
private void ErasePassword()
{
if(chrPassword==null)
return;
for(int i=0; i<chrPassword.length; i++)
{
chrPassword[i]=(char)0;
}
}
public void LoadCard(Card card, boolean newcard)
{
LoadReasons();
CardPaneController cpcNew=new CardPaneController(this, card);
if((!newcard)||jtpCards.getTabCount()==0)
jtpCards.insertTab(card.getName(), null, cpcNew, card.getName(), 0);
else
jtpCards.insertTab(card.getName(), null, cpcNew, card.getName(), jtpCards.getTabCount());//addTab(card.getName(), cpcNew);
if(!newcard)
jtpCards.setSelectedIndex(0);
else
jtpCards.setSelectedIndex(jtpCards.getComponentCount()-1);
cpcNew=null;
miSearch.setEnabled(true);
miDeleteCard.setEnabled(true);
miExport.setEnabled(true);
miImport.setEnabled(true);
}
public void setProfile(Profile profile)
{
miCreateCard.setEnabled(true);
miClose.setEnabled(true);
miDelete.setEnabled(true);
miReport.setEnabled(true);
miCreateCard.setEnabled(true);
miSave.setEnabled(true);
miSaveAs.setEnabled(true);
this.setTitle(virtualcache.Main.ApplicationName+" - "+profile.getName());
prfMain=profile;
for(int i=0; i<prfMain.getCardNumber(); i++)
{
Enumeration<Card> enCard=profile.getCards();
while(enCard.hasMoreElements())
{
Card crdTemp=enCard.nextElement();
if(crdTemp.getOrdNumber()==i)
{
LoadCard(crdTemp, false);
break;
}
}
enCard=null;
}
//reload Reasons on each card when all cards are loaded
for(int i=0; i<jtpCards.getComponentCount(); i++)
{
((CardPaneController)jtpCards.getComponent(i)).ReloadReasons();
}
}
public Profile getProfile(){return prfMain;}
public Vector<String> getReasons(){return vctReasons;}
public void addReason(String reason)
{
if(!hasReason(reason))
{
vctReasons.add(reason.trim().toLowerCase());
prfMain.addReason(reason);
}
}
public void UpdateCardNumbers(boolean delete)
{
if(delete)
{
for(int i=0; i<jtpCards.getTabCount(); i++)
{
((CardPaneController)jtpCards.getComponent(i)).getCard().setOrdNumber(i);//(jtpCards.getTabCount()-i-1);
}
}
else
{
for(int i=0; i<jtpCards.getTabCount(); i++)
{
((CardPaneController)jtpCards.getComponent(i)).getCard().setOrdNumber(((CardPaneController)jtpCards.getComponent(i)).getCard().getOrdNumber()+1);//(jtpCards.getTabCount()-i-1);
}
}
}
public void DeleteCard(String name)
{
//delete catrd
prfMain.DeleteCard(name);
//update user interface
for(int i=0; i<jtpCards.getTabCount(); i++)
{
if(jtpCards.getTitleAt(i).equals(name))
{
jtpCards.removeTabAt(i);
break;
}
}
vctReasons.clear();
//while(enCards.hasMoreElements())
LoadReasons();
for(int i=0; i<jtpCards.getTabCount(); i++)
((CardPaneController)jtpCards.getComponentAt(i)).ReloadReasons();
UpdateCardNumbers(true);
if(jtpCards.getComponentCount()==0)
{
miDeleteCard.setEnabled(false);
miSearch.setEnabled(false);
miExport.setEnabled(false);
miImport.setEnabled(false);
}
}
public boolean ValidateCloseDatabase()
{
if((prfMain==null)||(!prfMain.isModifyed()))
return true;
else
{
YesNoCancelMessage ynmcMessage=new YesNoCancelMessage(this, virtualcache.Main.ApplicationName, "<html>The file was modifyed. Would you like to save changes before exit?</html>", true);
ynmcMessage.setVisible(true);
if(ynmcMessage.getResult()==YesNoCancelMessage.CANCEL)
return false;
else if(ynmcMessage.getResult()==YesNoCancelMessage.YES)
{
slSave.actionPerformed(new ActionEvent(miSave, 1, "", 1));
}
return true;
}
}
public void CloseDatabase()
{
setOpenedFile(null);
prfMain=null;
ErasePassword();
miCreateCard.setEnabled(false);
miClose.setEnabled(false);
miDelete.setEnabled(false);
miReport.setEnabled(false);
miSave.setEnabled(false);
miSaveAs.setEnabled(false);
miDeleteCard.setEnabled(false);
miSearch.setEnabled(false);
miExport.setEnabled(false);
miImport.setEnabled(false);
this.setTitle(virtualcache.Main.ApplicationName);
jtpCards.removeAll();
vctReasons.clear();
search.reset();
}
public void LoadReasons()
{
vctReasons.clear();
Enumeration<String> enReasons=prfMain.getReasons().keys();
while(enReasons.hasMoreElements())
vctReasons.add(enReasons.nextElement());
}
private boolean hasReason(String reason)
{
for(Iterator<String> i=vctReasons.iterator(); i.hasNext();)
{
String strTemp=i.next();
if(strTemp.trim().toLowerCase().equals(reason.trim().toLowerCase()))
return true;
}
return false;
}
public JTable getCurrentTransactionTable()
{
if((prfMain==null)||(prfMain.getCardNumber()==0))
return null;
return ((CardPaneController)jtpCards.getSelectedComponent()).getTransactionTable();
}
public CardPaneController getSelectedTab()
{
return (CardPaneController)jtpCards.getSelectedComponent();
}
}