home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2005 June / PCpro_2005_06.ISO / files / opensource / tvbrowser / TvBrowser_1.0.exe / plugins / PrintPlugin.jar / printplugin / ProgramTableIcon.class (.txt) < prev    next >
Encoding:
Java Class File  |  2004-09-19  |  5.0 KB  |  168 lines

  1. package printplugin;
  2.  
  3. import devplugin.Program;
  4. import java.awt.Color;
  5. import java.awt.Component;
  6. import java.awt.FontMetrics;
  7. import java.awt.Graphics;
  8. import java.awt.Graphics2D;
  9. import javax.swing.Icon;
  10.  
  11. public class ProgramTableIcon implements Icon {
  12.    private ProgramItem[][] mProgramItems;
  13.    private int mWidth;
  14.    private int mColumnHeight;
  15.    private int mStartHour;
  16.    private int mEndHour;
  17.    private static final int HEADER_SPACE = 22;
  18.    private double mZoom;
  19.    private String[] mColHeaders;
  20.    private ProgramIconSettings mProgramIconSettings;
  21.  
  22.    public ProgramTableIcon(ColumnModel[] cols, int width, int height, int maxColsPerPage, int startHour, int endHour, ProgramIconSettings programIconSettings) {
  23.       this.mProgramIconSettings = programIconSettings;
  24.       this.mProgramItems = this.createProgramItems(cols);
  25.       this.mWidth = width;
  26.       this.mColumnHeight = height - 22;
  27.       this.mZoom = (double)this.mWidth / (double)(ChannelPageRenderer.COLUMN_WIDTH * maxColsPerPage);
  28.       this.mStartHour = startHour;
  29.       this.mEndHour = endHour;
  30.       this.mColHeaders = new String[cols.length];
  31.  
  32.       for(int i = 0; i < cols.length; ++i) {
  33.          this.mColHeaders[i] = cols[i].getTitle();
  34.       }
  35.  
  36.       this.doLayout();
  37.    }
  38.  
  39.    private ProgramItem[][] createProgramItems(ColumnModel[] cols) {
  40.       ProgramItem[][] items = new ProgramItem[cols.length][];
  41.  
  42.       for(int i = 0; i < items.length; ++i) {
  43.          items[i] = new ProgramItem[cols[i].getProgramCount()];
  44.  
  45.          for(int j = 0; j < items[i].length; ++j) {
  46.             items[i][j] = new ProgramItem(cols[i].getProgramAt(j), this.mProgramIconSettings);
  47.          }
  48.       }
  49.  
  50.       return items;
  51.    }
  52.  
  53.    private int getPreferredPosition(Program prog, boolean nextDay) {
  54.       int time = prog.getHours() * 60 + prog.getMinutes();
  55.       if (nextDay) {
  56.          time += 1440;
  57.       }
  58.  
  59.       time -= this.mStartHour * 60;
  60.       int timerange = (this.mEndHour - this.mStartHour) * 60;
  61.       return time * this.mColumnHeight / timerange;
  62.    }
  63.  
  64.    private void doLayout() {
  65.       int x = 0;
  66.       int y = 0;
  67.       int curHour = -1;
  68.  
  69.       for(int col = 0; col < this.mProgramItems.length; ++col) {
  70.          y = 0;
  71.          boolean nextDay = false;
  72.  
  73.          for(int i = 0; i < this.mProgramItems[col].length; ++i) {
  74.             Program prog = this.mProgramItems[col][i].getProgram();
  75.             if (prog.getHours() < this.mStartHour) {
  76.                nextDay = true;
  77.             }
  78.  
  79.             y = (int)((double)this.getPreferredPosition(prog, nextDay) / this.mZoom);
  80.             this.mProgramItems[col][i].setPos((double)x, (double)y);
  81.          }
  82.  
  83.          int numberOfPrograms = this.mProgramItems[col].length;
  84.          if (numberOfPrograms > 1) {
  85.             ProgramItem item = this.mProgramItems[col][numberOfPrograms - 1];
  86.             y = (int)((double)(this.mColumnHeight - item.getHeight()) / this.mZoom);
  87.             item.setPos((double)x, (double)y);
  88.          }
  89.  
  90.          for(int i = 1; i < this.mProgramItems[col].length; ++i) {
  91.             ProgramItem curItem = this.mProgramItems[col][i];
  92.             ProgramItem prevItem = this.mProgramItems[col][i - 1];
  93.             double minY = prevItem.getY() + (double)prevItem.getHeight();
  94.             if (minY > curItem.getY()) {
  95.                curItem.setPos(curItem.getX(), minY);
  96.             }
  97.          }
  98.  
  99.          ProgramItem lastItem = this.mProgramItems[col][numberOfPrograms - 1];
  100.          if (lastItem.getY() * this.mZoom + (double)lastItem.getHeight() > (double)this.mColumnHeight * 1.1) {
  101.             lastItem.setPos(lastItem.getX(), (double)this.mColumnHeight / this.mZoom - (double)lastItem.getHeight());
  102.  
  103.             for(int i = numberOfPrograms - 2; i > 0; --i) {
  104.                ProgramItem curItem = this.mProgramItems[col][i];
  105.                ProgramItem nextItem = this.mProgramItems[col][i + 1];
  106.                if (!(curItem.getY() + (double)curItem.getHeight() > nextItem.getY())) {
  107.                   break;
  108.                }
  109.  
  110.                curItem.setPos(curItem.getX(), nextItem.getY() - (double)curItem.getHeight());
  111.             }
  112.          }
  113.  
  114.          for(int i = 0; i < this.mProgramItems[col].length - 1; ++i) {
  115.             ProgramItem curItem = this.mProgramItems[col][i];
  116.             ProgramItem nextItem = this.mProgramItems[col][i + 1];
  117.             curItem.setMaximumHeight((int)(nextItem.getY() - curItem.getY()));
  118.          }
  119.  
  120.          x += ChannelPageRenderer.COLUMN_WIDTH;
  121.       }
  122.  
  123.    }
  124.  
  125.    public int getIconHeight() {
  126.       return this.mColumnHeight + 22;
  127.    }
  128.  
  129.    public int getIconWidth() {
  130.       return this.mWidth;
  131.    }
  132.  
  133.    public void paintIcon(Component comp, Graphics graphics, int x, int y) {
  134.       Graphics2D g = (Graphics2D)graphics;
  135.       g.scale(this.mZoom, this.mZoom);
  136.       g.translate((double)x / this.mZoom, (double)(y + 22) / this.mZoom);
  137.       g.setFont(ChannelPageRenderer.COL_HEADER_FONT);
  138.  
  139.       for(int i = 0; i < this.mColHeaders.length; ++i) {
  140.          g.setColor(Color.lightGray);
  141.          g.fillRect(ChannelPageRenderer.COLUMN_WIDTH * i, -22, ChannelPageRenderer.COLUMN_WIDTH, 22);
  142.          g.setColor(Color.black);
  143.          g.drawLine(ChannelPageRenderer.COLUMN_WIDTH * i, -22, ChannelPageRenderer.COLUMN_WIDTH * i, 0);
  144.          FontMetrics metrics = g.getFontMetrics(ChannelPageRenderer.COL_HEADER_FONT);
  145.          int w = metrics.stringWidth(this.mColHeaders[i]);
  146.          int cw = ChannelPageRenderer.COLUMN_WIDTH;
  147.          g.drawString(this.mColHeaders[i], cw * i + (cw - w) / 2, -(22 - ChannelPageRenderer.COL_HEADER_FONT.getSize()) / 2);
  148.       }
  149.  
  150.       g.drawRect(0, -22, (int)((double)this.mWidth / this.mZoom), (int)((double)this.mColumnHeight / this.mZoom) + 22);
  151.       g.drawLine(0, 0, (int)((double)this.mWidth / this.mZoom), 0);
  152.       g.setColor(Color.lightGray);
  153.  
  154.       for(int i = 1; i < this.mProgramItems.length; ++i) {
  155.          g.drawLine(ChannelPageRenderer.COLUMN_WIDTH * i, 0, ChannelPageRenderer.COLUMN_WIDTH * i, (int)((double)this.mColumnHeight / this.mZoom));
  156.       }
  157.  
  158.       for(int i = 0; i < this.mProgramItems.length; ++i) {
  159.          for(int j = 0; j < this.mProgramItems[i].length; ++j) {
  160.             this.mProgramItems[i][j].paint(g);
  161.          }
  162.       }
  163.  
  164.       g.translate((double)(-x) / this.mZoom, (double)(-(y + 22)) / this.mZoom);
  165.       g.scale((double)1.0F / this.mZoom, (double)1.0F / this.mZoom);
  166.    }
  167. }
  168.