/*
RecentFileMenu.java - menu to store and display recently used files.
Copyright (C) 2005 Hugues Johnson
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 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 program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.domainmath.gui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.LineNumberReader;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
/**
* A menu used to store and display recently used files.
* Saves entries in a file called "[user.dir]/[name passed to constructor].recent".
* @author Hugues Johnson
*/
public abstract class RecentFileMenu extends JMenu{
private String pathToSavedFile; //where to save the items in this menu
private int itemCount; //how many items in the menu
private String[] recentEntries; //the recent file entries
private final static String defaultText="__R_e_C_e_N_t__:_?"; //colon & question mark are not allowed as a file name in any OS that I'm aware of
/**
* Create a new instance of RecentFileMenu.
* @param name The name of this menu, not displayed but used to store the list of recently used file names.
* @param count The number of recent files to store.
*/
public RecentFileMenu(String name,int count){
super();
this.setText("Recent");
this.setMnemonic('R');
this.itemCount=count;
//initialize default entries
this.recentEntries=new String[count];
for(int index=0;index<this.itemCount;index++){
this.recentEntries[index]=defaultText;
}
//figure out the name of the recent file
this.pathToSavedFile=System.getProperty("user.dir");
if((this.pathToSavedFile==null)||(this.pathToSavedFile.length()<=0)){
this.pathToSavedFile=name+".recent"; //probably unreachable
} else if(this.pathToSavedFile.endsWith(File.separator)){
this.pathToSavedFile=this.pathToSavedFile+name+".recent";
} else{
this.pathToSavedFile=this.pathToSavedFile+File.separator+name+".recent";
}
//load the recent entries if they exist
File recentFile=new File(this.pathToSavedFile);
if(recentFile.exists()){
try{
LineNumberReader reader=new LineNumberReader(new FileReader(this.pathToSavedFile));
while(reader.ready()){
this.addEntry(reader.readLine(),false);
}
} catch(Exception x){
}
} else{ //disable
this.setEnabled(false);
}
}
/**
* Adds a new entry to the menu. Moves everything "down" one row.
* @param filePath The new path to add.
*/
public void addEntry(String filePath){
this.addEntry(filePath,true);
}
/**
* Adds a new entry to the menu. Moves everything "down" one row.
* @param filePath The new path to add.
* @param updateFile Whether to update the saved file, only false when called from constructor.
*/
private void addEntry(String filePath,boolean updateFile){
//check if this is disabled
if(!this.isEnabled()){
this.setEnabled(true);
}
//clear the existing items
this.removeAll();
//move everything down one slot
int count=this.itemCount-1;
for(int index=count;index>0;index--){
//check for duplicate entry
if(!this.recentEntries[index-1].equalsIgnoreCase(filePath)){
this.recentEntries[index]=new StringBuilder(this.recentEntries[index-1]).toString();
}
}
//add the new item, check if it's not alredy the first item
if(!this.recentEntries[0].equalsIgnoreCase(filePath)){
this.recentEntries[0]=new StringBuilder(filePath).toString();
}
//add items back to the menu
for(int index=0;index<this.itemCount;index++){
JMenuItem menuItem=new JMenuItem();
menuItem.setText(this.recentEntries[index]);
if(this.recentEntries[index].equals(defaultText)){
menuItem.setVisible(false);
} else{
menuItem.setVisible(true);
menuItem.setToolTipText(this.recentEntries[index]);
menuItem.setActionCommand(this.recentEntries[index]);
menuItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent actionEvent){
onSelectFile(actionEvent.getActionCommand(),actionEvent);
}
});
}
this.add(menuItem);
}
//update the file
if(updateFile){
try{
try (FileWriter writer = new FileWriter(new File(this.pathToSavedFile))) {
int topIndex=this.itemCount-1;
for(int index=topIndex;index>=0;index--){
if(!this.recentEntries[index].equals(defaultText)){
writer.write(this.recentEntries[index]);
writer.write("\n");
}
}
writer.flush();
}
} catch(Exception x){
}
}
}
/**
* Event that fires when a recent file is selected from the menu. Override this when implementing.
* @param filePath The file that was selected.
*/
public abstract void onSelectFile(String filePath,ActionEvent action_event);
}