⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hgrid.java

📁 客户端浏览医学图像的jsp源代码。可用于临床工作站。
💻 JAVA
字号:
/*
 * hGrid.java
 *
 * 98-11-19 TM created
 * Copyright (c) 1995-2000 by the Hypersonic SQL Group. All rights reserved. 
 *
 * @see http://hsql.oron.ch/Grid/index.html
 *
 * Modified by Takahiro Katoji(mailto:katoco@mars.elcom.nitech.ac.jp)
 */

package dicomviewer;

import java.awt.*;
import java.util.Vector;

public class hGrid extends Panel {
  // drawing
  Dimension dMinimum;
  Font fFont;
  FontMetrics fMetrics;
  Graphics gImage;
  Image iImage;
  // height / width
  int iWidth,iHeight;
  int iRowHeadWidth=0,iRowHeight,iFirstRow;
  int iGridWidth,iGridHeight;
  int iX,iY;
  // data
  String sColHead[];
  Vector vData,vRowHead;
  int iColWidth[];
  int iColCount,iRowCount;
  // scrolling
  Scrollbar sbHoriz,sbVert;
  int iSbWidth,iSbHeight;
  boolean bDrag;
  int iXDrag,iColDrag;
  // editing
  TextField tEdit;
  boolean bEditing;
  int iSelectRow,iSelectColumn;
  Component cCallback;
  int iEditX,iEditY,iEditWidth;
  public hGrid() {
    super();
    fFont=new Font("Dialog",Font.PLAIN,12);
    iSelectRow=-1;
    setLayout(null);
    sbHoriz=new Scrollbar(Scrollbar.HORIZONTAL);
    add(sbHoriz);
    sbVert=new Scrollbar(Scrollbar.VERTICAL);
    add(sbVert);
    tEdit=new TextField();
    add(tEdit);
  }
  public void setMinimumSize(Dimension d) {
    dMinimum=d;
  }
  public void setCallback(Component c) {
    cCallback=c;
  }
  public void setBounds(int x,int y,int w,int h) {
    super.setBounds(x,y,w,h);
    iSbHeight=sbHoriz.getPreferredSize().height;
    iSbWidth=sbVert.getPreferredSize().width;
    iHeight=h-iSbHeight;
    iWidth=w-iSbWidth;
    sbHoriz.setBounds(0,iHeight,iWidth,iSbHeight);
    sbVert.setBounds(iWidth,0,iSbWidth,iHeight);
    adjustScroll();
    iImage=null;
    showText();
    repaint();
  }
  public void setHead(String head[]) {
    vData=new Vector();
    vRowHead=new Vector();
    iColCount=head.length;
    sColHead=new String[iColCount];
    iColWidth=new int[iColCount];
    for(int i=0;i<iColCount;i++) {
      sColHead[i]=head[i];
      iColWidth[i]=100;
    }
    iRowCount=0;
  }
  public void addRow(String head,String data[]) {
    vRowHead.addElement(head);
    if(data.length!=iColCount) return;
    String row[]=new String[iColCount];
    for(int i=0;i<iColCount;i++) {
      row[i]=data[i];
    }    
    vData.addElement(row);
    iRowCount++;
    adjustScroll();
    repaint();
  }
  public void addRow(String data[]) {
    //addRow("r"+iRowCount,data);
    addRow("",data);
  }
  public void removeRows() {
    if(!vData.isEmpty()) {
      vData.removeAllElements();
      iRowCount=0;
      adjustScroll();
      repaint();
    }
  }
  private void adjustScroll() {
    if(iRowHeight==0) return;
    int w=0;
    for(int i=0;i<iColCount;i++) {
      w+=iColWidth[i];
    }
    iGridWidth=w;
    iGridHeight=iRowHeight*(iRowCount+1);
    sbHoriz.setValues(iX,iWidth,0,iGridWidth+iRowHeadWidth);
    int v=iY/iRowHeight,h=iHeight/iRowHeight;
    sbVert.setValues(v,h,0,iRowCount+1);
    iX=sbHoriz.getValue();
    iY=iRowHeight*sbVert.getValue();
  }
  public boolean handleEvent(Event e) {
    switch (e.id) {
    case Event.SCROLL_LINE_UP:
    case Event.SCROLL_LINE_DOWN:
    case Event.SCROLL_PAGE_UP:
    case Event.SCROLL_PAGE_DOWN:
    case Event.SCROLL_ABSOLUTE:
      iX=sbHoriz.getValue();
      iY=iRowHeight*sbVert.getValue();
      repaint();
      return true;
    } 
    return super.handleEvent(e);
  }
  public void paint(Graphics g) {
    if(g==null) return;
    if(iWidth<=0 || iHeight<=0) return;
    g.setColor(Color.lightGray);
    g.fillRect(iWidth,iHeight,iSbWidth,iSbHeight);
    if(iImage==null) {
      iImage=createImage(iWidth,iHeight);
      gImage=iImage.getGraphics();
      if(fMetrics==null) {
        fMetrics=gImage.getFontMetrics();
      }
    }
    gImage.setFont(fFont);
    if(iRowHeight==0) {
      iRowHeight=fMetrics.getHeight()+2;
      for(int i=0;i<iColCount;i++) {
        calcAutoWidth(i);
      }
      adjustScroll();
    }
    gImage.setColor(Color.white);
    gImage.fillRect(0,0,iWidth,iHeight);
    gImage.setColor(Color.darkGray);
    gImage.drawLine(0,iRowHeight,iWidth,iRowHeight);
    int x=-iX+iRowHeadWidth;
    for(int i=0;i<iColCount;i++) {
      int w=iColWidth[i];
      gImage.setColor(Color.lightGray);
      gImage.fillRect(x+1,0,w-2,iRowHeight);
      gImage.setColor(Color.black);
      gImage.drawString(sColHead[i],x+2,iRowHeight-5);
      gImage.setColor(Color.darkGray);
      gImage.drawLine(x+w-1,0,x+w-1,iRowHeight-1);
      gImage.setColor(Color.white);
      gImage.drawLine(x+w,0,x+w,iRowHeight-1);
      x+=w;
    }
    gImage.setColor(Color.lightGray);
    gImage.fillRect(0,0,iRowHeadWidth+1,iRowHeight);
    gImage.fillRect(x+1,0,iWidth-x,iRowHeight);
    gImage.drawLine(0,0,0,iRowHeight-1);
    int y=iRowHeight+1-iY;
    int j=0;
    while(y<iRowHeight+1) {
      j++;
      y+=iRowHeight;
    }
    iFirstRow=j;
    y=iRowHeight+1;
    for(;y<iHeight && j<iRowCount;j++,y+=iRowHeight) {
      x=-iX+iRowHeadWidth;
      for(int i=0;i<iColCount;i++) {
        int w=iColWidth[i];
        Color b=Color.white,t=Color.black;
        if(iSelectRow==j) {
          b=Color.black;
          t=Color.white;
        }
        gImage.setColor(b);
        gImage.fillRect(x,y,w-1,iRowHeight-1);
        gImage.setColor(t);
        gImage.drawString(getDisplay(i,j),x+2,y+iRowHeight-5);
        gImage.setColor(Color.lightGray);
        gImage.drawLine(x+w-1,y,x+w-1,y+iRowHeight-1);
        gImage.drawLine(x,y+iRowHeight-1,
        x+w-1,y+iRowHeight-1);
        x+=w;
      }
      gImage.setColor(Color.white);
      gImage.fillRect(x,y,iWidth-x,iRowHeight-1);
      if(iRowHeadWidth!=0) {
        gImage.setColor(Color.lightGray);
        gImage.fillRect(0,y,iRowHeadWidth,iRowHeight-1);
        gImage.setColor(Color.black);
        String s=(String)vRowHead.elementAt(j);
        gImage.drawString(s,2,y+iRowHeight-5);
        gImage.setColor(Color.darkGray);
        gImage.drawLine(0,y+iRowHeight-1,iRowHeadWidth-1,y+iRowHeight-1);
        gImage.drawLine(iRowHeadWidth-1,y,iRowHeadWidth-1,y+iRowHeight-1);
        gImage.setColor(Color.white);
        gImage.drawLine(0,y,iRowHeadWidth-2,y);
      }
    }
    g.drawImage(iImage,0,0,this);
    showText();
  }
  public void update(Graphics g) {
    paint(g);
  }
  public boolean keyDown(Event evt,int key) {
    int r=iSelectRow,c=iSelectColumn;
    if(r<0 || r>=iRowCount) return false;
    switch(key) {
    case 9: // Tab
      if((evt.modifiers & Event.SHIFT_MASK)!=0) c--;
      else c++;
      if(c<0) c=0; if(c>=iColCount) c=iColCount-1;
      select(r,c);
      return true;
    case 1004: // Up
      if(r>0) {
        select(r-1,c);
      }
      return true;
    case 1005: // Down
    case 10: // Enter
      if(r<iRowCount-1) {
        select(r+1,c);
      }
      return true;
    case 27: // ESC
      iSelectRow=-1;
      select(r,c);
      repaint();
      return true;
    }
    return false;
  }
  public boolean mouseMove(Event e,int x,int y) {
    if(y<=iRowHeight) {
      int xb=x;
      x=x+iX-iGridWidth-iRowHeadWidth;
      int i=iColCount-1;
      for(;i>=0;i--) {
        if(x>-7 && x<7) break;
        x+=iColWidth[i];        
      }
      if(i>=0) {
        if(!bDrag) {
          this.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
          bDrag=true;
          iXDrag=xb-iColWidth[i];
          iColDrag=i;
        }
        return true;
      }
    }
    return mouseExit(e,x,y);
  }
  public boolean mouseDrag(Event e,int x,int y) {
    if(bDrag && x<iWidth) {
      int w=x-iXDrag;
      if(w<0) w=0;
      iColWidth[iColDrag]=w;
      adjustScroll();
      repaint();
    }
    return true;
  }
  public boolean mouseExit(Event e,int x,int y) {
    if(bDrag) {
      this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
      bDrag=false;
    }
    return true;
  }
  public boolean mouseDown(Event e,int x,int y) {
    if(iRowHeight==0 || x>iWidth || y>iHeight) return true;
    x+=iX-iRowHeadWidth;
    int col=0;
    for(int i=0;i<iColCount;i++) {
      int w=iColWidth[i];
      if(x>=0 && x<=w) {
        col=i;
        break;
      }
      x-=w;
    }
    if(y>iRowHeight) {
      int r=(y/iRowHeight)-1+iFirstRow;
      if(r>=0 && r<iRowCount) {
        select(r,col);
        if(cCallback!=null) {
          Event v=new Event(
          cCallback,Event.ACTION_EVENT,""+iSelectRow);
          cCallback.action(v,""+iSelectRow);
        }
      }
    } else if(!bDrag) {
      sort(col);
    }
    return true;
  }
  public Dimension getPreferredSize() {
    return getMinimumSize();
  }
  public Dimension getgetPreferredSize() {
    return getMinimumSize();
  }
  public Dimension getgetMinimumSize() {
    return getMinimumSize();
  }
  public Dimension getMinimumSize() {
    return dMinimum;
  }
  private void calcAutoWidth(int i) {
    int w=10;
    iRowHeadWidth=0;
    w=Math.max(w,fMetrics.stringWidth(sColHead[i]));
    for(int j=0;j<iRowCount;j++) {
      String s[]=(String[])(vData.elementAt(j));
      w=Math.max(w,fMetrics.stringWidth(s[i]));
      String h=(String)(vRowHead.elementAt(j));
      iRowHeadWidth=Math.max(iRowHeadWidth,
      fMetrics.stringWidth(h)+6);
    }
    iColWidth[i]=w+6;
  }
  public void sort(int c) {
    select(-1,0);
    int n=iRowCount;
    int i=1;
    while(i<n && get(c,i-1).compareTo(get(c,i))<=0) i++;
    if(i==n) return;    
    for(i=(n>>1)-1;i>0;i--) siftup(i,n-1,c);
    for(i=n-1;i>0;i--) {
      siftup(0,i,c);
      String s[]=(String[])vData.elementAt(0);
      vData.setElementAt(vData.elementAt(i),0);
      vData.setElementAt(s,i);
    }
  }
  private void siftup(int i,int n,int c) {
    Object v=vData.elementAt(i);
    String s=get(c,i);
    int l=i,j=i+i+1;
    for(;j<n;i=j,j=(i=j)+j+1) {
      if(get(c,j).compareTo(get(c,j+1))<0) j++;
      vData.setElementAt(vData.elementAt(j),i);
    }
    if(j==n) {
      vData.setElementAt(vData.elementAt(j),i);
      i=j;
    }
    for(j=i-1>>1;j>=l && get(c,j).compareTo(s)<1;j=(i=j)-1>>1) {
      vData.setElementAt(vData.elementAt(j),i);
    }
    vData.setElementAt(v,i);
  }
  private void select(int r,int c) {
    if(iSelectRow>=0 && iSelectRow<iRowCount) {
      set(iSelectColumn,iSelectRow,tEdit.getText());
    }
    iSelectRow=r;
    iSelectColumn=c;
    if(r<0 || r>=iRowCount || c<0 || c>=iColCount) {
      iSelectRow=-1;
      iSelectColumn=0;
    }
    tEdit.setVisible(false);
    bEditing=false;
    if(iSelectRow>=0) {
      while(iSelectRow<iFirstRow && iFirstRow>0) {
        iFirstRow--;
        iY-=iRowHeight;
      }
      while(iSelectRow>(iFirstRow-2+(iHeight/iRowHeight)) 
      && iFirstRow<iRowCount-1) {
        iFirstRow++;
        iY+=iRowHeight;
      }
      calcEditPos();
      if(iEditX>iWidth) {
        iX+=iEditX-iWidth;
        calcEditPos();
      }
      if(iEditX+iEditWidth>iWidth) {
        iX+=iEditX+iEditWidth-iWidth;
        calcEditPos();
      }
      if(iEditX<iRowHeadWidth) {
        iX+=iEditX-iRowHeadWidth;
        calcEditPos();
      }
      tEdit.setText(get(iSelectColumn,iSelectRow));
      adjustScroll();
    }
    repaint();
  }
  private void calcEditPos() {
    int x=-iX;
    for(int i=0;i<iSelectColumn;i++) {
      int w=iColWidth[i];
      x+=w;
    }
    iEditY=(iSelectRow-iFirstRow+1)*iRowHeight;
    int w=0;
    if(iColWidth!=null) w=iColWidth[iSelectColumn];
    iEditX=x+iRowHeadWidth;
    iEditWidth=w;
  }
  private void showText() {
    calcEditPos();
    int x=iEditX,y=iEditY,w=iEditWidth;
    w=Math.min(w,iWidth-x);
    if(x<0) {
      w+=x;
      x=0;
    }
    if(iSelectRow>=0 && w>0 && y>=iRowHeight 
    && y<(iHeight-iRowHeight)) {
      tEdit.setBounds(x,y,w,iRowHeight);
      if(!bEditing) {
        tEdit.setVisible(true);
        tEdit.requestFocus();
        tEdit.selectAll();
        bEditing=true;
      }
    } else {
      if(bEditing) {
        tEdit.setVisible(false);
        bEditing=false;
      }
    }
  }
  private String getDisplay(int x,int y) {
    return (((String[])(vData.elementAt(y)))[x]);
  }
  private String get(int x,int y) {
    return (((String[])(vData.elementAt(y)))[x]);
  }
  private void set(int x,int y,String s) {
    String r[]=(String[])vData.elementAt(y);
    r[x]=s;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -