/* * MRUList.java * * Copyright (C) 2009-12 by RStudio, Inc. * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ package org.rstudio.studio.client.workbench; import org.rstudio.core.client.DuplicateHelper; import org.rstudio.core.client.command.AppCommand; import org.rstudio.core.client.command.AppMenuItem; import org.rstudio.core.client.command.CommandHandler; import org.rstudio.core.client.widget.OperationWithInput; import org.rstudio.studio.client.workbench.events.ListChangedEvent; import org.rstudio.studio.client.workbench.events.ListChangedHandler; import java.util.*; public class MRUList { public MRUList(WorkbenchList mruList, AppCommand[] mruCmds, AppCommand clearCommand, boolean hideClearOnEmpty, boolean includeExt, OperationWithInput<String> operation) { clearCommand_ = clearCommand; mruList_ = mruList; mruCmds_ = mruCmds; hideClearOnEmpty_ = hideClearOnEmpty; includeExt_ = includeExt; operation_ = operation; for (int i = 0; i < mruCmds_.length; i++) bindCommand(i); clearCommand_.addHandler(new CommandHandler() { public void onCommand(AppCommand command) { clear(); } }); mruList_.addListChangedHandler(new ListChangedHandler() { @Override public void onListChanged(ListChangedEvent event) { mruEntries_.clear(); mruEntries_.addAll(event.getList()); updateCommands(); } }); } private void bindCommand(final int i) { mruCmds_[i].addHandler(new CommandHandler() { public void onCommand(AppCommand command) { if (i < mruEntries_.size()) operation_.execute(mruEntries_.get(i)); } }); } public void add(String entry) { assert entry.indexOf("\n") < 0; mruList_.prepend(entry); } public void remove(String entry) { mruList_.remove(entry); } public void clear() { mruList_.clear(); } protected ArrayList<String> generateLabels( ArrayList<String> entries, boolean includeExt) { return DuplicateHelper.getPathLabels(entries, includeExt); } public String getQualifiedLabel(String mruEntry) { // make a copy of the existing mru entries and prepend the specified // entry if it doesn't exist. we need to do this because at startup // the most recently loaded project may not be in the list yet @SuppressWarnings("unchecked") ArrayList<String> mruEntries = (ArrayList<String>)mruEntries_.clone(); if (!mruEntries.contains(mruEntry)) mruEntries.add(mruEntry); // save the index of the entry int index = mruEntries.indexOf(mruEntry); // transform paths for (int i=0; i<mruEntries.size(); i++) mruEntries.set(i, transformMruEntryPath(mruEntries.get(i))); // generate labels mruEntries = generateLabels(mruEntries, includeExt_); // return the label return mruEntries.get(index); } private void updateCommands() { while (mruEntries_.size() > mruCmds_.length) mruEntries_.remove(mruEntries_.size() - 1); clearCommand_.setEnabled(mruEntries_.size() > 0); if (hideClearOnEmpty_) clearCommand_.setVisible(clearCommand_.isEnabled()); manageCommands(mruEntries_, mruCmds_); } protected void manageCommands(List<String> entries, AppCommand[] commands) { // optionally transform paths ArrayList<String> transformed = new ArrayList<String>(); for (String entry : entries) transformed.add(transformMruEntryPath(entry)); // generate labels ArrayList<String> labels = generateLabels(transformed, includeExt_); for (int i = 0; i < commands.length; i++) { if (i >= entries.size()) commands[i].setVisible(false); else { commands[i].setVisible(true); commands[i].setMenuLabel( AppMenuItem.escapeMnemonics(labels.get(i))); commands[i].setDesc(entries.get(i)); } } } protected String transformMruEntryPath(String entryPath) { return entryPath; } protected ArrayList<String> getMruEntries() { return mruEntries_; } protected AppCommand[] getMruCommands() { return mruCmds_; } private final ArrayList<String> mruEntries_ = new ArrayList<String>(); private final AppCommand[] mruCmds_; private final AppCommand clearCommand_; private final WorkbenchList mruList_; private final boolean hideClearOnEmpty_; private final boolean includeExt_; private final OperationWithInput<String> operation_; }