/* $Id: LastRecentlyUsedMenuList.java 17842 2010-01-12 19:21:22Z linus $ ***************************************************************************** * Copyright (c) 2009 Contributors - see below * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * tfmorris ***************************************************************************** * * Some portions of this file was previously release using the BSD License: */ // Copyright (c) 2003-2007 The Regents of the University of California. All // Rights Reserved. Permission to use, copy, modify, and distribute this // software and its documentation without fee, and without a written // agreement is hereby granted, provided that the above copyright notice // and this paragraph appear in all copies. This software program and // documentation are copyrighted by The Regents of the University of // California. The software program and documentation are supplied "AS // IS", without any accompanying services from The Regents. The Regents // does not warrant that the operation of the program will be // uninterrupted or error-free. The end-user understands that the program // was developed for research purposes and is advised not to rely // exclusively on the program for any reason. IN NO EVENT SHALL THE // UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, // SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, // ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF // THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF // SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE // PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF // CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, // UPDATES, ENHANCEMENTS, OR MODIFICATIONS. package org.argouml.ui.cmd; import javax.swing.JMenu; import javax.swing.JMenuItem; import org.argouml.application.api.Argo; import org.argouml.configuration.Configuration; import org.argouml.configuration.ConfigurationKey; import org.argouml.uml.ui.ActionReopenProject; import java.io.File; // TODO: This class is part of a dependency cycle with ProjectBrowser and // GenericArgoMenuBar, but should be fixed if project open/close is moved // out of ProjectBrowser. /** * Menu extension for last recently used files menu.<p> * * functionality: * it is created with a link to the (file-)menu, * if it is created it is reading its content from config information * the add entry method adds a specific filename to the list, ensures that it * bubbles at top of list if it is already member of list * typically called by SaveFile method * LRU is added at the specific position at creation time * and all entries are going to be inserted or deletied * * @author Frank Jelinek * @since 9. November 2003 (0.15.2) */ public class LastRecentlyUsedMenuList { /** * Default value for maxcount if there is no configuration. */ private static final int MAX_COUNT_DEFAULT = 4; /** * Menu where the list is bound to. */ private JMenu fileMenu; /** * Recent loaded count. */ private int lruCount; /** * Maxcount read from configuration. */ private int maxCount = MAX_COUNT_DEFAULT; /** * Index where the menu entries should be inserted * -1 to be sure (adds at end). */ private int menuIndex = -1; /** * Menuitems actually created and added to menu. */ private JMenuItem[] menuItems; /** * Array of conf keys for accessing the stored entries. */ private ConfigurationKey[] confKeys; /** * Adds the eventhandler to the menu and renames the entry. * * @param filename the text for the entry * @param addAt the location * @return the menuitem */ private JMenuItem addEventHandler(String filename, int addAt) { // the text is used by the event handler for opening the project File f = new File(filename); //JMenuItem item = _fileMenu.add(new ActionReopenProject(filename)); JMenuItem item = fileMenu.insert(new ActionReopenProject(filename), addAt); // set maximum length of menu entry String entryName = f.getName(); if (entryName.length() > 40) { entryName = entryName.substring(0, 40) + "..."; } // text is short, tooltip is long item.setText(entryName); item.setToolTipText(filename); return item; } /** * Creates a new instance of LastRecentlyUsedMenuList with respect * to the menu where the lru is bound to. * * @param filemenu at this menu the lru is bound after last entry * it is added with a separator * */ public LastRecentlyUsedMenuList(JMenu filemenu) { String newName; int i; // holds file menu fileMenu = filemenu; lruCount = 0; menuIndex = filemenu.getItemCount(); // init from config // read number, write result as new default and prepare keys maxCount = Configuration.getInteger(Argo.KEY_NUMBER_LAST_RECENT_USED, MAX_COUNT_DEFAULT); Configuration.setInteger(Argo.KEY_NUMBER_LAST_RECENT_USED, maxCount); confKeys = new ConfigurationKey[maxCount]; menuItems = new JMenuItem[maxCount]; // create all nessessary configuration keys for lru for (i = 0; i < maxCount; i++) { confKeys[i] = Configuration.makeKey("project", "mostrecent", "filelist".concat(Integer.toString(i))); } // read existing file names from configuration i = 0; boolean readOK = true; while (i < maxCount && readOK) { newName = Configuration.getString(confKeys[i], ""); if (newName.length() > 0) { menuItems[i] = addEventHandler(newName, menuIndex + i); i++; } else { readOK = false; // empty entry stops reading --> last line! } } // this is the recent count lruCount = i; } /** * Adds a new entry to lru list and removes the last one if * if it increases maxCount. * * @param filename name of link which is to be used to represent * _and_ reopen the file */ public void addEntry(String filename) { // get already existing names from menu actions // real file names, not action names ! String[] tempNames = new String[maxCount]; for (int i = 0; i < lruCount; i++) { ActionReopenProject action = (ActionReopenProject) menuItems[i].getAction(); tempNames[i] = action.getFilename(); } // delete all existing entries for (int i = 0; i < lruCount; i++) { fileMenu.remove(menuItems[i]); } // add new entry as first entry menuItems[0] = addEventHandler(filename, menuIndex); // add other existing entries, but filter the just added one int i, j; i = 0; j = 1; while (i < lruCount && j < maxCount) { if (!(tempNames[i].equals(filename))) { menuItems[j] = addEventHandler(tempNames[i], menuIndex + j); j++; } i++; } // save count lruCount = j; // and store configuration props for (int k = 0; k < lruCount; k++) { ActionReopenProject action = (ActionReopenProject) menuItems[k].getAction(); Configuration.setString(confKeys[k], action.getFilename()); } } }