/************************************************************************** OmegaT - Computer Assisted Translation (CAT) tool with fuzzy matching, translation memory, keyword search, glossaries, and translation leveraging into updated projects. Copyright (C) 2000-2006 Keith Godfrey and Maxym Mykhalchuk 2009-2013 Alex Buloichik 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.util.ArrayList; import java.util.Collections; import java.util.List; /** * Source text entry represents an individual segment for translation pulled * directly from the input files. There can be many SourceTextEntries having * identical source language strings * * @author Keith Godfrey * @author Alex Buloichik (alex73mail@gmail.com) * @author Aaron Madlon-Kay */ public class SourceTextEntry { private static final ProtectedPart[] EMPTY_PROTECTED_PARTS = new ProtectedPart[0]; /** Storage for full entry's identifiers, including source text. */ private final EntryKey key; /** * String properties from source file. Contents are alternating * key (even index), value (odd index) strings. Should be of even length. */ private final String[] props; /** Translation from source files. */ private final String sourceTranslation; /** Translation from source files is fuzzy. */ private boolean sourceTranslationFuzzy; public enum DUPLICATE { /** There is no entries with the same source. */ NONE, /** There is entries with the same source, and this is first entry. */ FIRST, /** There is entries with the same source, and this is not first entry. */ NEXT }; /** * A list of duplicates of this STE. Will be non-null for the FIRST duplicate, * null for NONE and NEXT STEs. See {@link #getDuplicate()} for full logic. */ List<SourceTextEntry> duplicates; /** * The first duplicate of this STE. Will be null for NONE and FIRST STEs, * non-null for NEXT STEs. See {@link #getDuplicate()} for full logic. */ SourceTextEntry firstInstance; /** Holds the number of this entry in a project. */ private final int m_entryNum; /** * Protected parts(shortcuts) and details of full content (for tooltips). * Read-only info, cat be accessible from any threads. It can't be null. */ private final ProtectedPart[] protectedParts; /** * Creates a new source text entry. * * @param key * entry key * @param entryNum * the number of this entry in a project * @param props * optional entry metadata * @param sourceTranslation * translation from source file * @param shortcuts * tags shortcuts */ public SourceTextEntry(EntryKey key, int entryNum, String[] props, String sourceTranslation, List<ProtectedPart> protectedParts) { this.key = key; m_entryNum = entryNum; this.props = props; this.sourceTranslation = sourceTranslation; if (protectedParts.isEmpty()) { this.protectedParts = EMPTY_PROTECTED_PARTS; } else { // remove empty protected parts for (int i = 0; i < protectedParts.size(); i++) { if (protectedParts.get(i).getTextInSourceSegment().isEmpty()) { protectedParts.remove(i); i--; } } this.protectedParts = protectedParts.toArray(new ProtectedPart[protectedParts.size()]); } this.duplicates = null; this.firstInstance = null; } public EntryKey getKey() { return key; } /** * Returns the source text (shortcut for * <code>getStrEntry().getSrcText()</code>). */ public String getSrcText() { return key.sourceText; } /** * Returns comment of entry if exist in source document. */ public String getComment() { if (SegmentProperties.isEmpty(props)) { return null; } return SegmentProperties.joinValues(props); } public String[] getRawProperties() { return SegmentProperties.copy(props); } /** Returns the number of this entry in a project. */ public int entryNum() { return m_entryNum; } /** If entry with the same source already exist in project. */ public DUPLICATE getDuplicate() { if (firstInstance != null) { return DUPLICATE.NEXT; } return duplicates == null ? DUPLICATE.NONE : DUPLICATE.FIRST; } public int getNumberOfDuplicates() { if (firstInstance != null) { return firstInstance.getNumberOfDuplicates(); } return duplicates == null ? 0 : duplicates.size(); } public List<SourceTextEntry> getDuplicates() { if (firstInstance != null) { List<SourceTextEntry> result = new ArrayList<SourceTextEntry>(firstInstance.getDuplicates()); result.remove(this); result.add(0, firstInstance); return Collections.unmodifiableList(result); } if (duplicates == null) { return Collections.emptyList(); } else { return Collections.unmodifiableList(duplicates); } } public String getSourceTranslation() { return sourceTranslation; } public boolean isSourceTranslationFuzzy() { return sourceTranslationFuzzy; } public void setSourceTranslationFuzzy(boolean sourceTranslationFuzzy) { this.sourceTranslationFuzzy = sourceTranslationFuzzy; } public ProtectedPart[] getProtectedParts() { return protectedParts; } }