home *** CD-ROM | disk | FTP | other *** search
Wrap
package printplugin; import devplugin.Program; import java.awt.Color; import java.awt.Component; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.Icon; public class ProgramTableIcon implements Icon { private ProgramItem[][] mProgramItems; private int mWidth; private int mColumnHeight; private int mStartHour; private int mEndHour; private static final int HEADER_SPACE = 22; private double mZoom; private String[] mColHeaders; private ProgramIconSettings mProgramIconSettings; public ProgramTableIcon(ColumnModel[] cols, int width, int height, int maxColsPerPage, int startHour, int endHour, ProgramIconSettings programIconSettings) { this.mProgramIconSettings = programIconSettings; this.mProgramItems = this.createProgramItems(cols); this.mWidth = width; this.mColumnHeight = height - 22; this.mZoom = (double)this.mWidth / (double)(ChannelPageRenderer.COLUMN_WIDTH * maxColsPerPage); this.mStartHour = startHour; this.mEndHour = endHour; this.mColHeaders = new String[cols.length]; for(int i = 0; i < cols.length; ++i) { this.mColHeaders[i] = cols[i].getTitle(); } this.doLayout(); } private ProgramItem[][] createProgramItems(ColumnModel[] cols) { ProgramItem[][] items = new ProgramItem[cols.length][]; for(int i = 0; i < items.length; ++i) { items[i] = new ProgramItem[cols[i].getProgramCount()]; for(int j = 0; j < items[i].length; ++j) { items[i][j] = new ProgramItem(cols[i].getProgramAt(j), this.mProgramIconSettings); } } return items; } private int getPreferredPosition(Program prog, boolean nextDay) { int time = prog.getHours() * 60 + prog.getMinutes(); if (nextDay) { time += 1440; } time -= this.mStartHour * 60; int timerange = (this.mEndHour - this.mStartHour) * 60; return time * this.mColumnHeight / timerange; } private void doLayout() { int x = 0; int y = 0; int curHour = -1; for(int col = 0; col < this.mProgramItems.length; ++col) { y = 0; boolean nextDay = false; for(int i = 0; i < this.mProgramItems[col].length; ++i) { Program prog = this.mProgramItems[col][i].getProgram(); if (prog.getHours() < this.mStartHour) { nextDay = true; } y = (int)((double)this.getPreferredPosition(prog, nextDay) / this.mZoom); this.mProgramItems[col][i].setPos((double)x, (double)y); } int numberOfPrograms = this.mProgramItems[col].length; if (numberOfPrograms > 1) { ProgramItem item = this.mProgramItems[col][numberOfPrograms - 1]; y = (int)((double)(this.mColumnHeight - item.getHeight()) / this.mZoom); item.setPos((double)x, (double)y); } for(int i = 1; i < this.mProgramItems[col].length; ++i) { ProgramItem curItem = this.mProgramItems[col][i]; ProgramItem prevItem = this.mProgramItems[col][i - 1]; double minY = prevItem.getY() + (double)prevItem.getHeight(); if (minY > curItem.getY()) { curItem.setPos(curItem.getX(), minY); } } ProgramItem lastItem = this.mProgramItems[col][numberOfPrograms - 1]; if (lastItem.getY() * this.mZoom + (double)lastItem.getHeight() > (double)this.mColumnHeight * 1.1) { lastItem.setPos(lastItem.getX(), (double)this.mColumnHeight / this.mZoom - (double)lastItem.getHeight()); for(int i = numberOfPrograms - 2; i > 0; --i) { ProgramItem curItem = this.mProgramItems[col][i]; ProgramItem nextItem = this.mProgramItems[col][i + 1]; if (!(curItem.getY() + (double)curItem.getHeight() > nextItem.getY())) { break; } curItem.setPos(curItem.getX(), nextItem.getY() - (double)curItem.getHeight()); } } for(int i = 0; i < this.mProgramItems[col].length - 1; ++i) { ProgramItem curItem = this.mProgramItems[col][i]; ProgramItem nextItem = this.mProgramItems[col][i + 1]; curItem.setMaximumHeight((int)(nextItem.getY() - curItem.getY())); } x += ChannelPageRenderer.COLUMN_WIDTH; } } public int getIconHeight() { return this.mColumnHeight + 22; } public int getIconWidth() { return this.mWidth; } public void paintIcon(Component comp, Graphics graphics, int x, int y) { Graphics2D g = (Graphics2D)graphics; g.scale(this.mZoom, this.mZoom); g.translate((double)x / this.mZoom, (double)(y + 22) / this.mZoom); g.setFont(ChannelPageRenderer.COL_HEADER_FONT); for(int i = 0; i < this.mColHeaders.length; ++i) { g.setColor(Color.lightGray); g.fillRect(ChannelPageRenderer.COLUMN_WIDTH * i, -22, ChannelPageRenderer.COLUMN_WIDTH, 22); g.setColor(Color.black); g.drawLine(ChannelPageRenderer.COLUMN_WIDTH * i, -22, ChannelPageRenderer.COLUMN_WIDTH * i, 0); FontMetrics metrics = g.getFontMetrics(ChannelPageRenderer.COL_HEADER_FONT); int w = metrics.stringWidth(this.mColHeaders[i]); int cw = ChannelPageRenderer.COLUMN_WIDTH; g.drawString(this.mColHeaders[i], cw * i + (cw - w) / 2, -(22 - ChannelPageRenderer.COL_HEADER_FONT.getSize()) / 2); } g.drawRect(0, -22, (int)((double)this.mWidth / this.mZoom), (int)((double)this.mColumnHeight / this.mZoom) + 22); g.drawLine(0, 0, (int)((double)this.mWidth / this.mZoom), 0); g.setColor(Color.lightGray); for(int i = 1; i < this.mProgramItems.length; ++i) { g.drawLine(ChannelPageRenderer.COLUMN_WIDTH * i, 0, ChannelPageRenderer.COLUMN_WIDTH * i, (int)((double)this.mColumnHeight / this.mZoom)); } for(int i = 0; i < this.mProgramItems.length; ++i) { for(int j = 0; j < this.mProgramItems[i].length; ++j) { this.mProgramItems[i][j].paint(g); } } g.translate((double)(-x) / this.mZoom, (double)(-(y + 22)) / this.mZoom); g.scale((double)1.0F / this.mZoom, (double)1.0F / this.mZoom); } }