/************************************************************************** OmegaT - Computer Assisted Translation (CAT) tool with fuzzy matching, translation memory, keyword search, glossaries, and translation leveraging into updated projects. Copyright (C) 2014 Briac Pilpre 2015 Aaron Madlon-Kay Home page: http://www.omegat.org/ Support center: http://groups.yahoo.com/group/OmegaT/ This file is part of OmegaT. OmegaT 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. OmegaT 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 org.omegat.core.data; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import java.util.Properties; import java.util.logging.Logger; import org.omegat.core.Core; import org.omegat.core.data.IProject.FileInfo; import org.omegat.gui.editor.IEditor; import org.omegat.util.Log; import org.omegat.util.OConsts; /** * @author Briac Pilpre * @author Aaron Madlon-Kay */ public class LastSegmentManager { private static final Logger LOGGER = Logger.getLogger(LastSegmentManager.class.getName()); private static final String LAST_ENTRY_SRC = "LAST_ENTRY_SRC"; private static final String LAST_ENTRY_FILE = "LAST_ENTRY_FILE"; private static final String LAST_ENTRY_NUMBER = "LAST_ENTRY_NUMBER"; private static File getLastEntryFile() { return new File(Core.getProject().getProjectProperties().getProjectInternal(), OConsts.LAST_ENTRY_NUMBER); } /** * Save current entry position for repositioning on reload (RFE#35). This * method is called from RealProject during saveProject(boolean) */ public static void saveLastSegment() { Properties prop = new Properties(); IEditor editor = Core.getEditor(); int lastEntryNumber = editor.getCurrentEntryNumber(); String currentFile = editor.getCurrentFile(); if (currentFile == null) { // Project has no files, no need to save. return; } SourceTextEntry ste = editor.getCurrentEntry(); if (ste == null) { return; } prop.put(LAST_ENTRY_SRC, ste.getSrcText()); prop.put(LAST_ENTRY_NUMBER, Integer.toString(lastEntryNumber, 10)); prop.put(LAST_ENTRY_FILE, currentFile); FileOutputStream fos = null; try { fos = new FileOutputStream(getLastEntryFile()); prop.store(fos, null); } catch (Exception e) { Log.logDebug(LOGGER, "Could not write the last entry number: {0}", e.getMessage()); } finally { if (fos != null) { try { fos.close(); } catch (IOException ex) { Log.log(ex); } } } } /** * Read the user's last-visited segment number from persistent storage. The * segment number is the user-visible number that starts with 1. * * @return The segment number (starts from 1) */ public static int getLastSegmentNumber() { File lastEntryFile = getLastEntryFile(); if (!lastEntryFile.exists()) { return 1; } Properties prop = new Properties(); try { prop.load(new FileInputStream(lastEntryFile)); } catch (IOException e) { Log.logDebug(LOGGER, "Could not load last segment info", e.getMessage()); return 1; } Core.getMainWindow().showStatusMessageRB("MW_JUMPING_LAST_ENTRY"); int lastEntryNumber = 1; try { String lastEntry = prop.getProperty(LAST_ENTRY_NUMBER, "1"); lastEntryNumber = Integer.parseInt(lastEntry, 10); } catch (Exception e) { Log.logDebug(LOGGER, "Cannot jump to last entry #" + lastEntryNumber + ":" + e.getMessage()); } Log.logDebug(LOGGER, "Jumping to last entry #" + lastEntryNumber + "."); List<SourceTextEntry> allEntries = Core.getProject().getAllEntries(); if (allEntries.size() < lastEntryNumber) { Log.logDebug(LOGGER, "Not enough segments to jump to " + lastEntryNumber); Core.getMainWindow().showStatusMessageRB(null); return 1; } SourceTextEntry propEntry = allEntries.get(lastEntryNumber - 1); String lastFile = prop.getProperty(LAST_ENTRY_FILE, ""); String lastSrc = prop.getProperty(LAST_ENTRY_SRC, ""); // Best case scenario, segment matches src (if it doesn't match // filename, it's still okay) if (propEntry.getSrcText().equals(lastSrc)) { // gotoEntry(propEntry.entryNum(), editor); Core.getMainWindow().showStatusMessageRB(null); return propEntry.entryNum(); } // Check to see if the source and file match Log.logDebug(LOGGER, "Last entry #" + lastEntryNumber + " mismatch (file \"" + lastFile + "\", src \"" + lastSrc + "\")"); int fileIndex = fileIndex(lastFile); if (fileIndex == -1) { Log.logDebug(LOGGER, "File \"" + lastFile + "\" is not in the project anymore."); Core.getMainWindow().showStatusMessageRB(null); return 1; } // We landed in the right file, just not the right segment List<SourceTextEntry> fileEntries = Core.getProject().getProjectFiles().get(fileIndex).entries; for (SourceTextEntry entry : fileEntries) { if (entry.getSrcText().equals(lastSrc)) { Log.logDebug(LOGGER, "Found a matching entry in the right file."); return entry.entryNum(); } } // Things look bad, nothing in the matching file. Look in all the // project or quit ? for (SourceTextEntry entry : allEntries) { if (entry.getSrcText().equals(lastSrc)) { Log.logDebug(LOGGER, "Found a matching entry in the wrong file."); return entry.entryNum(); } } Core.getMainWindow().showStatusMessageRB(null); return 1; } /** * Get the project index given its name, returns -1 if the file is not found */ private static int fileIndex(String filename) { int fileIndex = 0; for (FileInfo file : Core.getProject().getProjectFiles()) { if (file.filePath.equals(filename)) { return fileIndex; } fileIndex++; } return -1; } }