/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.util; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.filesystems.impl.FileAnyImpl; public class PositionHolder { static String POSITION_HOLDER_ID = "positionHolder"; //$NON-NLS-1$ public static PositionHolder getPosition(XModelObject object, String attribute) { String id = (attribute == null) ? POSITION_HOLDER_ID : POSITION_HOLDER_ID + "." + attribute; //$NON-NLS-1$ PositionHolder h = (PositionHolder)object.getObject(id); if(h == null) { h = new PositionHolder(object, attribute); object.setObject(id, h); } return h; } private XModelObject object; private String attribute; private FileAnyImpl file = null; private long fileTimeStamp = -1; private int start; private int end; private int line; private PositionHolder(XModelObject object, String attribute) { this.object = object; this.attribute = attribute; } public void update() { if(!object.isActive()) { if(file == null) return; else file = null; } else if(file == null) { XModelObject f = object; while(f != null && f.getFileType() != XModelObject.FILE) f = f.getParent(); if(f instanceof FileAnyImpl) file = (FileAnyImpl)f; } if(file == null) { fileTimeStamp = -1; start = -1; end = -1; line = -1; return; } long ts = (file == null) ? -1 : file.getTimeStamp(); if(ts == fileTimeStamp) return; fileTimeStamp = ts; String text = file.getAsText(); PositionSearcher searcher = new PositionSearcher(); searcher.init(text, object, attribute); searcher.execute(); start = searcher.getStartPosition(); end = searcher.getEndPosition(); line = computeLine(text, start); } private int computeLine(String text, int pos) { if(pos < 0) return -1; int line = 1; boolean q = false; for (int i = 0; i < text.length() && i < pos; i++) { char ch = text.charAt(i); if(ch == '\n' || q) line++; q = (ch == '\r'); } return line; } public int getLine() { return line; } public int getStart() { return start; } public int getEnd() { return end; } }