All Downloads are FREE. Search and download functionalities are using the official Maven repository.

kr.dogfoot.hwplib.tool.objectfinder.fieldform.FieldFormFinder Maven / Gradle / Ivy

package kr.dogfoot.hwplib.tool.objectfinder.fieldform;

import kr.dogfoot.hwplib.object.HWPFile;
import kr.dogfoot.hwplib.object.bodytext.ParagraphListInterface;
import kr.dogfoot.hwplib.object.bodytext.Section;
import kr.dogfoot.hwplib.object.bodytext.control.Control;
import kr.dogfoot.hwplib.object.bodytext.control.ControlField;
import kr.dogfoot.hwplib.object.bodytext.control.ControlType;
import kr.dogfoot.hwplib.object.bodytext.paragraph.Paragraph;
import kr.dogfoot.hwplib.object.bodytext.paragraph.text.HWPChar;

import java.util.ArrayList;

public class FieldFormFinder {
    public static Result findAll(HWPFile hwpFile) {
        return find(hwpFile, new Option(null, false, true, true, true, true));
    }

    public static Result find(HWPFile hwpFile, Option option) {
        Result result = new Result();

        for (Section section : hwpFile.getBodyText().getSectionList()) {
            try {
                findInParagraphList(section, result, option);
            } catch (StopFindException e) {
                break;
            }
        }

        return result;
    }

    public static void findInParagraphList(ParagraphListInterface paragraphList, Result result, Option option) throws StopFindException {
        StopFindException exception = null;

        if (option.nameToFind() != null && option.onlyFirst() && result.added()) {
            throw new StopFindException();
        }

        if (option.findField()) {
            ArrayList resultInParagraphList = new ArrayList<>();
            try {
                getFieldStartPosition(paragraphList, resultInParagraphList, option);
            } catch (StopFindException e) {
                exception = e;
            }
            for (FieldData fieldData : resultInParagraphList) {
                getFieldEndPosition(paragraphList, fieldData);
            }
            result.addAllFieldData(resultInParagraphList);
        }

        if (exception != null) {
            throw exception;
        }

        for (Paragraph paragraph : paragraphList) {
            if (paragraph.getControlList() != null) {
                ForControl.findInControlList(paragraph.getControlList(), result, option);
            }
        }
    }


    private static void getFieldStartPosition(ParagraphListInterface paragraphList, ArrayList result, Option option) throws StopFindException {
        int paraCount = paragraphList.getParagraphCount();
        for (int paraIndex = 0; paraIndex < paraCount; paraIndex++) {
            findStartingField(paragraphList, paraIndex, result, option);
        }
    }

    private static void findStartingField(ParagraphListInterface paragraphList, int paraIndex, ArrayList results, Option option) throws StopFindException {
        Paragraph p = paragraphList.getParagraph(paraIndex);
        if (p.getControlList() == null) {
            return;
        }

        int ctrlCount = p.getControlList().size();
        for (int ctrlIndex = 0; ctrlIndex < ctrlCount; ctrlIndex++) {
            Control c = p.getControlList().get(ctrlIndex);
            if (c.isField()) {
                ControlField field = (ControlField) c;
                if (option.nameToFind() != null) {
                    if (option.nameToFind().equals(field.getName())) {
                        addStartingField(paragraphList, paraIndex, results, p, ctrlIndex, field);
                        if (option.onlyFirst()) {
                            throw new StopFindException();
                        }
                    }
                } else {
                    addStartingField(paragraphList, paraIndex, results, p, ctrlIndex, field);
                }
            }
        }
    }

    private static void addStartingField(ParagraphListInterface paragraphList, int paraIndex, ArrayList results, Paragraph p, int ctrlIndex, ControlField field) {
        FieldData fieldData = new FieldData(field.getName(),
                (field.getType() == ControlType.FIELD_CLICKHERE) ? FieldType.ClickHere : FieldType.ETC,
                paragraphList);
        fieldData.setStartPosition(paraIndex, p.getText().getCharIndexFromExtendCharIndex(ctrlIndex));

        results.add(fieldData);
    }

    private static void getFieldEndPosition(ParagraphListInterface paragraphList, FieldData fieldData) {
        int depth = 0;
        int paraCount = paragraphList.getParagraphCount();
        for (int paraIndex = fieldData.getStartParaIndex(); paraIndex < paraCount; paraIndex++) {
            Paragraph p = paragraphList.getParagraph(paraIndex);
            if (p.getText() != null) {
                int startIndex = (paraIndex == fieldData.getStartParaIndex()) ? fieldData.getStartCharIndex() + 1 : 0;
                int charCount = p.getText().getCharList().size();
                for (int charIndex = startIndex; charIndex < charCount; charIndex++) {
                    HWPChar hwpChar = p.getText().getCharList().get(charIndex);
                    if (hwpChar.getCode() == 0x3/*field start*/) {
                        depth++;
                    } else if (hwpChar.getCode() == 0x4/*field end*/) {
                        if (depth == 0) {
                            fieldData.setEndPosition(paraIndex, charIndex);
                            return;
                        } else {
                            depth--;
                        }
                    }
                }
            }
        }
    }

    public static class Result {
        private ArrayList fieldDataList;
        private ArrayList formDataList;
        private boolean added;

        public Result() {
            fieldDataList = new ArrayList<>();
            formDataList = new ArrayList<>();
            added = false;
        }

        public void addFieldData(FieldData fieldData) {
            fieldDataList.add(fieldData);
            if (fieldData != null) {
                added = true;
            }
        }

        public void addAllFieldData(ArrayList fieldDataList) {
            this.fieldDataList.addAll(fieldDataList);
            if (fieldDataList.size() > 0) {
                added = true;
            }
        }

        public ArrayList getFieldDataList() {
            return fieldDataList;
        }

        public void addFormData(FormData formData) {
            formDataList.add(formData);
            if (formData != null) {
                added = true;
            }
        }

        public ArrayList getFormDataList() {
            return formDataList;
        }

        public boolean added() {
            return added;
        }
    }

    public static class Option {
        private String nameToFind;
        private boolean onlyFirst;

        private boolean findField;
        private boolean findGso;
        private boolean findCell;
        private boolean findForm;

        public Option(String nameToFind, boolean onlyFirst, boolean findField, boolean findGso, boolean findCell, boolean findForm) {
            this.nameToFind = nameToFind;
            this.onlyFirst = onlyFirst;
            this.findField = findField;
            this.findGso = findGso;
            this.findCell = findCell;
            this.findForm = findForm;
        }

        public String nameToFind() {
            return nameToFind;
        }

        public void nameToFind(String nameToFind) {
            this.nameToFind = nameToFind;
        }

        public boolean onlyFirst() {
            return onlyFirst;
        }

        public void onlyFirst(boolean onlyFirst) {
            this.onlyFirst = onlyFirst;
        }

        public boolean findField() {
            return findField;
        }

        public void findField(boolean findField) {
            this.findField = findField;
        }

        public boolean findGso() {
            return findGso;
        }

        public void findGso(boolean findGso) {
            this.findGso = findGso;
        }

        public boolean findCell() {
            return findCell;
        }

        public void findCell(boolean findCell) {
            this.findCell = findCell;
        }

        public boolean findForm() {
            return findForm;
        }

        public void findForm(boolean findForm) {
            this.findForm = findForm;
        }
    }

    public static class StopFindException extends Exception {
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy