001: /*
002: *
003: * JMoney - A Personal Finance Manager
004: * Copyright (c) 2007 Nigel Westbury <westbury@users.sf.net>
005: *
006: *
007: * This program is free software; you can redistribute it and/or modify
008: * it under the terms of the GNU General Public License as published by
009: * the Free Software Foundation; either version 2 of the License, or
010: * (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
020: *
021: */
022:
023: package net.sf.jmoney.entrytable;
024:
025: import java.util.Collection;
026:
027: import org.eclipse.swt.graphics.GC;
028: import org.eclipse.swt.widgets.Composite;
029: import org.eclipse.swt.widgets.Control;
030:
031: public abstract class Block<T, R> {
032: /**
033: * marginLeft specifies the number of pixels of horizontal margin
034: * that will be placed along the left edge of the layout.
035: *
036: * The default value is 1.
037: */
038: public static final int marginLeft = 1;
039:
040: /**
041: * marginRight specifies the number of pixels of horizontal margin
042: * that will be placed along the right edge of the layout.
043: *
044: * The default value is 1.
045: */
046: public static final int marginRight = 1;
047:
048: /**
049: * horizontalSpacing specifies the number of pixels between the right
050: * edge of one cell and the left edge of its neighboring cell to
051: * the right.
052: *
053: * The default value is 1.
054: */
055: public static final int horizontalSpacing = 1;
056:
057: protected int minimumWidth;
058: protected int weight;
059:
060: protected int width;
061:
062: public abstract void createHeaderControls(Composite parent,
063: T entryData);
064:
065: public abstract Collection<CellBlock<? super T, ? super R>> buildCellList();
066:
067: abstract void layout(int width);
068:
069: abstract void positionControls(int x, int y, int verticalSpacing,
070: Control[] controls, T entryData, boolean flushCache);
071:
072: /**
073: * Calculate the height of this block. Because variable height rows are
074: * supported, the height may vary from row to row and thus depends on the
075: * controls in the row.
076: *
077: * This method assumes that the contained controls have all been set to
078: * their correct size. This method does not resize controls. Therefore this
079: * method should only be called after <code>positionControls</code> has
080: * been called.
081: *
082: * @param controls
083: * a list of controls in a row
084: * @return the height of this block
085: */
086: abstract int getHeight(int verticalSpacing, Control[] controls);
087:
088: /**
089: * Paints the lines between the controls.
090: *
091: * This method assumes that the contained controls have all been set to
092: * their correct size. Therefore this method should only be called after
093: * <code>positionControls</code> has been called.
094: *
095: * @param controls
096: * a list of controls in a row
097: */
098: abstract void paintRowLines(GC gc, int x, int y,
099: int verticalSpacing, Control[] controls, T entryData);
100:
101: /**
102: * Given a width, calculate the preferred height.
103: *
104: * @param width
105: * @param verticalSpacing
106: * @param controls
107: * a list of controls in a row
108: * @param changed
109: * <code>true</code> if the control's contents have changed,
110: * and <code>false</code> otherwise
111: * @return the preferred height
112: */
113: abstract int getHeightForGivenWidth(int width, int verticalSpacing,
114: Control[] controls, boolean changed);
115:
116: /**
117: * This method must be called after construction of the root block.
118: * It traverses over the sub-blocks and sets the indexes of any
119: * cell blocks it finds. These indexes will match the index of the
120: * cell block in the array returned by <code>buildCellList</code>.
121: *
122: * @param startIndex 0 if the root block, appropriate value for sub-blocks
123: * @return the number of cell blocks in this block, this value being the
124: * amount by which the caller must increment startIndex before passing
125: * it on to the next child block
126: */
127: abstract public int initIndexes(int startIndex);
128: }
|