/* ******************************************************************************
* Copyright (c) 2006-2015 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.internal;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jface.util.SafeRunnable;
import org.xmind.core.util.FileUtils;
import org.xmind.ui.IEditorHistory;
/**
*
* @author Frank Shaka
* @deprecated
*/
@Deprecated
public class EditorHistory implements IEditorHistory {
private static final String THUMBNAIL_DIR_NAME = "thumbnailHistory"; //$NON-NLS-1$
private static final String PIN = "favor"; //$NON-NLS-1$
protected static final int MAX_SIZE = 100;
private List<URI> inputURIs = new ArrayList<URI>();
private Map<URI, String> inputToInfo = new HashMap<URI, String>();
private ListenerList listeners = new ListenerList();
protected EditorHistory() {
List<String> historyRepository = EditorHistoryPersistenceService.load();
for (String inputAndInfo : historyRepository) {
int index = inputAndInfo
.indexOf(EditorHistoryPersistenceService.VALUE_SEPARATOR);
if (index < 0)
continue;
String input = inputAndInfo.substring(0, index);
String info = inputAndInfo.substring(index
+ EditorHistoryPersistenceService.VALUE_SEPARATOR.length());
try {
URI inputURI = new URI(input);
inputURIs.add(inputURI);
inputToInfo.put(inputURI, info);
} catch (URISyntaxException e) {
}
}
}
public synchronized URI[] getAllInputURIs() {
return inputURIs.toArray(new URI[inputURIs.size()]);
}
public synchronized URI[] getRecentInputURIs(int size) {
size = Math.max(0, Math.min(size, inputURIs.size()));
return inputURIs.subList(0, size).toArray(new URI[size]);
}
public void pin(URI inputURI) {
if (inputURI == null)
return;
boolean isPin = isPin(inputURI);
String info = getInfo(inputURI);
if (!isPin) {
inputToInfo.put(inputURI, appendPinContent(info));
}
add(inputURI);
}
public void unPin(URI inputURI) {
if (inputURI == null)
return;
boolean isPin = isPin(inputURI);
String thumbnail = getThumbnail(inputURI);
if (isPin) {
inputToInfo.put(inputURI, thumbnail);
}
fireChanged();
}
public boolean isPin(URI inputURI) {
boolean isPin = false;
if (inputURI == null)
return isPin;
String info = inputToInfo.get(inputURI);
if (info != null) {
isPin = info.contains(PIN);
}
return isPin;
}
public void add(URI inputURI) {
if (inputURI == null)
return;
remove(inputURI);
inputURIs.add(0, inputURI);
while (inputURIs.size() > MAX_SIZE) {
inputURIs.remove(inputURIs.size() - 1);
}
fireChanged();
}
public String getInfo(URI inputURI) {
if (inputURI == null)
return null;
return inputToInfo.get(inputURI);
}
public String getThumbnail(URI inputURI) {
if (inputURI == null)
return null;
String info = inputToInfo.get(inputURI);
String thumbnail = info;
if (info != null) {
int sepPos = info.indexOf(',');
if (sepPos > 0) {
thumbnail = info.substring(0, sepPos);
}
}
return thumbnail;
}
public void addThumbnail(URI inputURI, String originThumbnailPath) {
if (inputURI == null)
return;
File originThumbnailFile = new File(originThumbnailPath);
if (!originThumbnailFile.exists())
return;
String thumbnailName = UUID.randomUUID().toString()
+ originThumbnailFile.getName();
File thumbnailDir = getThumbnailDir();
if (thumbnailDir == null)
return;
if (!thumbnailDir.exists()) {
thumbnailDir.mkdirs();
}
String thumbnailPath = thumbnailDir.getAbsolutePath() + File.separator
+ thumbnailName;
File thumbnailFile = new File(thumbnailPath);
boolean isPin = isPin(inputURI);
//remove existed thumbnail
removeThumbnail(inputURI);
inputToInfo.put(inputURI,
isPin ? appendPinContent(thumbnailPath) : thumbnailPath);
saveThumbnailFile(originThumbnailFile, thumbnailFile);
while (inputToInfo.values().size() > MAX_SIZE) {
removeThumbnail(inputURI);
}
fireChanged();
}
private String appendPinContent(String source) {
StringBuffer buffer = new StringBuffer();
buffer.append(source);
buffer.append(","); //$NON-NLS-1$
buffer.append(PIN);
return buffer.toString();
}
private File getThumbnailDir() {
IPath basePath = MindMapUIPlugin.getDefault().getStateLocation();
if (basePath == null)
return null;
IPath filePath = basePath.append(THUMBNAIL_DIR_NAME);
return filePath.toFile();
}
private void saveThumbnailFile(File source, File targetFile) {
try {
FileUtils.transfer(new FileInputStream(source),
new FileOutputStream(targetFile), true);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void removeThumbnail(URI inputURI) {
if (inputURI == null)
return;
String existedThumbnail = getThumbnail(inputURI);
if (existedThumbnail == null)
return;
inputToInfo.remove(inputURI);
File existedThumbnailFile = new File(existedThumbnail);
if (existedThumbnailFile.exists())
existedThumbnailFile.delete();
}
public synchronized void remove(URI inputURI) {
if (inputURI == null)
return;
int oldSize = inputURIs.size();
Iterator<URI> iter = inputURIs.iterator();
while (iter.hasNext()) {
URI oldURI = iter.next();
if (inputURI.equals(oldURI)) {
iter.remove();
}
}
if (oldSize != inputURIs.size()) {
fireChanged();
}
}
public synchronized void clear() {
int oldSize = inputURIs.size();
inputURIs.clear();
if (oldSize != inputURIs.size()) {
fireChanged();
}
//REMOVE THUMBNAILS
inputToInfo.clear();
File thumbnailDir = getThumbnailDir();
if (thumbnailDir != null && thumbnailDir.exists()) {
File[] listFiles = thumbnailDir.listFiles();
for (File file : listFiles) {
if (file.exists())
file.delete();
}
}
}
public void addEditorHistoryListener(IEditorHistoryListener listener) {
listeners.add(listener);
}
public void removeEditorHistoryListener(IEditorHistoryListener listener) {
listeners.remove(listener);
}
private void fireChanged() {
for (final Object listener : listeners.getListeners()) {
SafeRunner.run(new SafeRunnable() {
public void run() throws Exception {
((IEditorHistoryListener) listener).editorHistoryChanged();
}
});
}
}
}