/*
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License");  you may not use this file except in 
 * compliance with the License.  You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
 * the specific language governing rights and limitations under the License.
 *
 * The Original Code is Protege-2000.
 *
 * The Initial Developer of the Original Code is Stanford University. Portions
 * created by Stanford University are Copyright (C) 2007.  All Rights Reserved.
 *
 * Protege was developed by Stanford Medical Informatics
 * (http://www.smi.stanford.edu) at the Stanford University School of Medicine
 * with support from the National Library of Medicine, the National Science
 * Foundation, and the Defense Advanced Research Projects Agency.  Current
 * information about Protege can be obtained at http://protege.stanford.edu.
 *
 */

package edu.stanford.smi.protege.ui;

import java.util.Comparator;

import edu.stanford.smi.protege.model.Frame;
import edu.stanford.smi.protege.util.LazyTreeNode;

/**
 * Special comparator for Parent-Child tree (class-subclass tree), in which 
 * the system frames have a lower value than the user frames.
 * Assumes that the user objects are frames.
 *
 */
public class ParentChildNodeComparator implements Comparator {
	private static final char SPECIAL_NAME_CHAR = ':';
	
    public int compare(Object o1, Object o2) {
        if (o1 instanceof LazyTreeNode) {
            o1 = ((LazyTreeNode) o1).getUserObject();
        }
        if (o2 instanceof LazyTreeNode) {
            o2 = ((LazyTreeNode) o2).getUserObject();
        }
        
        Frame f1 = (Frame) o1;
        Frame f2 = (Frame) o2;
        
        int result;
        String t1 = f1.getBrowserText();
        String t2 = f2.getBrowserText();
        if (isSpecialName(t1)) {
            result = isSpecialName(t2) ? compareStrings(t1, t2) : -1;
        } else if (isSpecialName(t2)) {
            result = +1;
        } else {
            result = compareStrings(t1, t2);
        }
        return result;
    };
    
    private static boolean isSpecialName(String s) {
        return s.length() > 0 && s.charAt(0) == SPECIAL_NAME_CHAR;
    }
    
    private static int compareStrings(String s1, String s2) {
        int result = s1.compareToIgnoreCase(s2);
        if (result == 0) {
            result = s1.compareTo(s2);
        }
        return result;
    }
   
}
