TextViewManager.java :  » Development » TreeView-1.1.4r5 » edu » stanford » genetics » treeview » plugin » dendroview » Java Open Source

Java Open Source » Development » TreeView 1.1.4r5 
TreeView 1.1.4r5 » edu » stanford » genetics » treeview » plugin » dendroview » TextViewManager.java
/* BEGIN_HEADER                                              Java TreeView
 *
 * $Author: alokito $
 * $RCSfile: TextViewManager.java,v $
 * $Revision: 1.3 $
 * $Date: 2008/06/11 01:58:57 $
 * $Name:  $
 *
 * This file is part of Java TreeView
 * Copyright (C) 2001-2003 Alok Saldanha, All Rights Reserved. Modified by Alex Segal 2004/08/13. Modifications Copyright (C) Lawrence Berkeley Lab.
 *
 * This software is provided under the GNU GPL Version 2. In particular,
 *
 * 1) If you modify a source file, make a comment in it containing your name and the date.
 * 2) If you distribute a modified version, you must do it under the GPL 2.
 * 3) Developers are encouraged but not required to notify the Java TreeView maintainers at alok@genome.stanford.edu when they make a useful addition. It would be nice if significant contributions could be merged into the main distribution.
 *
 * A full copy of the license can be found in gpl.txt or online at
 * http://www.gnu.org/licenses/gpl.txt
 *
 * END_HEADER
 */
package edu.stanford.genetics.treeview.plugin.dendroview;

import javax.swing.*;
import java.awt.*;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.util.*;
import edu.stanford.genetics.treeview.*;

/**
 * @author avsegal
 *
 */
public class TextViewManager extends ModelView implements FontSelectable, PropertyChangeListener {

  public TextViewManager(HeaderInfo hI, UrlExtractor uExtractor)
  {
    super();
    this.hI = hI;
    this.uExtractor = uExtractor;
    root = null;
    textViews = new Vector();
    panel = new JPanel();
    panel.setLayout(new GridLayout());
    dividerLocations = new int[hI.getNumNames() - 1];
    firstNotShown = null;
    numShown = 0;
        
    //    could set up headerSummary...
    int GIDIndex = hI.getIndex("GID");
    if (GIDIndex == -1) {
      headerSummary.setIncluded(new int [] {1});
    } else {
      headerSummary.setIncluded(new int [] {2});
    }
    headerSummary.addObserver(this);
    
        
    makeTextViews(hI.getNumNames());
    
    for(int i = 0; i < numViews - 1; i++)
    {
      dividerLocations[i] = 50;
    }
  
    addTextViews(1);
    loadDividerLocations();
    setVisible(true);
  }
  
  /**
   * called when confignode or headerSummary is changed.
   */
  private void loadSelection()
  {    
    if(configRoot == null)
      return;
    
    ConfigNode [] nodes = configRoot.fetch("Selection");
    int [] included;
    if(nodes.length > 0)
    {
      included = new int[nodes.length];
      for(int i = 0; i < nodes.length; i++)
      {
        included[i] = nodes[i].getAttribute("index", -1);
      }
      headerSummary.setIncluded(included);
    }
  }

  /**
   * called when headers to be displayed are changed.
   */
  private void saveSelection()
  {
    if(configRoot == null)
    {
      return;
    }
    configRoot.removeAll("Selection");
    for(int i = 0; i < headerSummary.getIncluded().length; i++)
    {
      configRoot.create("Selection").setAttribute("index", headerSummary.getIncluded()[i], -1);
    }
  }
  
  public void update(Observable ob, Object obj)
  {
    if(ob == headerSummary)
    {
      saveSelection();
      saveDividerLocations();
      //saveDividerLocationsToConfig();
      addTextViews(headerSummary.getIncluded().length);
      loadDividerLocations();
    }
    
    for(int i = 0; i < textViews.size(); i++)
    {
      ((TextView)textViews.get(i)).update(ob, obj);      
    }
  }
  public void updateBuffer(Graphics g)
  {
    paintAll(g);
  }
  
  public void updateBuffer(Image buf) {
    for(int i = 0; i < textViews.size(); i++)
    {
      ((TextView)textViews.get(i)).updateBuffer(buf);      
    }
  }
  
  public String viewName()
  {
    return "TextViewManager";
  }
  
  /**
   * Need to override ModelView.setViewFrame to account for the textviews that are contained.
   *
   */
  public void setViewFrame(ViewFrame m) {
    super.setViewFrame(m);
    for(int i = 0; i < textViews.size(); i++)
      ((TextView)textViews.get(i)).setViewFrame(m);
  }
  public void setHintPanel(MessagePanel h) {
    super.setHintPanel(h);
    for(int i = 0; i < textViews.size(); i++)
      ((TextView)textViews.get(i)).setHintPanel(h);
  }
  public void setStatusPanel(MessagePanel s) {
    super.setStatusPanel(s);
    for(int i = 0; i < textViews.size(); i++)
      ((TextView)textViews.get(i)).setStatusPanel(s);
  }
  
  private void makeTextViews(int n)
  {
    numViews = n;
    for(int i = 0; i < n; i++)
    {
      textViews.add(new TextView(hI, uExtractor, i));
      ((TextView)textViews.lastElement()).setHeaderSummary(headerSummary);
      headerSummary.addObserver((TextView)textViews.lastElement());
    }
  }
  private void addTextViews(int n)
  {
    JSplitPane temp;
    numShown = n;
    
    if(n <= 0)
    {
      return;
    }
    else if(n == 1)
    {
      root = ((TextView)textViews.get(0)).getComponent();
    }
    else
    {
      root = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
      ((JSplitPane)root).setDividerSize(2);
      ((JSplitPane)root).setBorder(null);
      ((JSplitPane)root).setRightComponent(((TextView)textViews.get(n-1)).getComponent());
      ((JSplitPane)root).setLeftComponent(((TextView)textViews.get(n-2)).getComponent());
      root.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, this);
      
      for(int i = n - 3; i >= 0; i--)
      {
        temp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        temp.setLeftComponent(((TextView)textViews.get(i)).getComponent());
        temp.setRightComponent(root);
        temp.setDividerSize(2);
        temp.setBorder(null);
        temp.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, this);
        root = temp;
      }
    }
    panel.removeAll();
    panel.add(root);
    panel.updateUI();
  }
  
  /**
   * Need to override TextView.setGeneSelection() to account for the textviews that are contained.
   *
   */
  public void setGeneSelection(TreeSelectionI selection)
  {
    for(int i = 0; i < textViews.size(); i++)
    {
      ((TextView)textViews.get(i)).setGeneSelection(selection);
    }
  }
  
  public void setMap(MapContainer zoomYMap)
  {
    for(int i = 0; i < textViews.size(); i++)
    {
      ((TextView)textViews.get(i)).setMap(zoomYMap);
    }
  }
  
  public void bindConfig(ConfigNode configNode)
  {
    configRoot = configNode;
        loadSelection(); // doesn't quite work yet, something more global then this headerSummary needs to be updated.
        ConfigNode [] viewNodes = configRoot.fetch("TextView");
        for (int i = viewNodes.length; i < textViews.size(); i++) {
            configRoot.create("TextView");
        }
        viewNodes = configRoot.fetch("TextView");
    for(int i = 0; i < textViews.size(); i++)
    {
      ((TextView)textViews.get(i)).bindConfig(viewNodes[i]);
    }
    // binding config can change fonts.
    if (textViews.size() > 0) {
      setFont(((TextView)textViews.firstElement()).getFont());
    }
    loadDividerLocationsFromConfig();
    loadDividerLocations();
  }
  
  public String getFace() {
    return getFont().getName();
    }
    public int getPoints() {
    return getFont().getSize();
    }
    public int getStyle() {
        return getFont().getStyle();
    }
    
    public void setFace(String string) {
        for (int i = 0; i < textViews.size(); i++)   {
          ((TextView)textViews.get(i)).setFace(string);
        }  
        if (textViews.size() > 0) {
          setFont(((TextView)textViews.firstElement()).getFont());
        }
        repaint();
    }
    
    public void setPoints(int size) {
        for(int i = 0; i < textViews.size(); i++) {
      ((TextView)textViews.get(i)).setPoints(size);
    }  
    if (textViews.size() > 0) {
      setFont(((TextView)textViews.firstElement()).getFont());
    }
        repaint();
    }
    
    public void setStyle(int style) {
        for(int i = 0; i < textViews.size(); i++) {
      ((TextView)textViews.get(i)).setStyle(style);
    }  
    if (textViews.size() > 0) {
      setFont(((TextView)textViews.firstElement()).getFont());
    }
        repaint();
    }
    
    public void setHeaderSummary(HeaderSummary headerSummary) {
      this.headerSummary = headerSummary;
        for(int i = 0; i < textViews.size(); i++) {
      ((TextView)textViews.get(i)).setHeaderSummary(headerSummary);
    }
  }
  /** Getter for headerSummary */
  public HeaderSummary getHeaderSummary() {
    return headerSummary;
  }
  
  public void saveDividerLocationsToConfig()
  {
    ConfigNode node = null;
    if(configRoot != null)
    {
      node = configRoot.fetchFirst("Dividers");
      if(node == null)
      {
        node = configRoot.create("Dividers");
      }
    }
    else
    {
      return;
    }
    for(int i = 0; i < numViews - 1; i++)
    {
      if(node != null)
      {
        node.setAttribute("Position" + i, dividerLocations[i], -1);
      }
    }
  }
  
  public void saveDividerLocations()
  {
    Component temp = panel.getComponent(0);
        
    for(int i = 0; i < numShown - 1; i++)
    {
      
      dividerLocations[i] = ((JSplitPane)temp).getDividerLocation();
      temp = ((JSplitPane)temp).getRightComponent();
    }
  }
  public void loadDividerLocationsFromConfig()
  {  
    ConfigNode node = null;
    if(configRoot != null)
    {
      node = configRoot.fetchFirst("Dividers");
    }
    else
    {
      return;
    }
    
    for(int i = 0; i < numViews - 1; i++)
    {
      if(node != null)
      {
        dividerLocations[i] = node.getAttribute("Position" + i, 50);
      }
    }
  }
  public void loadDividerLocations()
  {
    ignoreDividerChange = true;
    Component temp = panel.getComponent(0);

    for(int i = 0; i < numShown - 1; i++)
    {
      ((JSplitPane)temp).setDividerLocation(dividerLocations[i]);
      
      temp = ((JSplitPane)temp).getRightComponent();
    }
    ignoreDividerChange = false;
  }
  
  public void propertyChange(PropertyChangeEvent pce)
  {
    if(!ignoreDividerChange && pce.getPropertyName() == JSplitPane.DIVIDER_LOCATION_PROPERTY)
    {
      saveDividerLocations();
      saveDividerLocationsToConfig();
    }
  }
  
  boolean ignoreDividerChange = false;
  UrlExtractor uExtractor;
  JSplitPane last;
  Component root;
  JSplitPane firstNotShown;
  TextView lastView;
  int numViews;
  int numShown;
  HeaderInfo hI;
  Vector textViews;
  ConfigNode configRoot;
  HeaderSummary headerSummary = new HeaderSummary();
  int dividerLocations [];
  
    
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.