diff options
| author | Simon Rettberg | 2015-08-26 15:51:31 +0200 |
|---|---|---|
| committer | Simon Rettberg | 2015-08-26 15:51:31 +0200 |
| commit | 025699e6fe0abf7266704696231d2e841694d60b (patch) | |
| tree | f6e183a1af4b7f54f6233be957b4c5ee90a6061b /dozentenmodul/src/main/java | |
| parent | [client] LectureImageList Page for Wizard (diff) | |
| download | tutor-module-025699e6fe0abf7266704696231d2e841694d60b.tar.gz tutor-module-025699e6fe0abf7266704696231d2e841694d60b.tar.xz tutor-module-025699e6fe0abf7266704696231d2e841694d60b.zip | |
[client] Simplify ListTable interfaces, add util class for color handling
Diffstat (limited to 'dozentenmodul/src/main/java')
9 files changed, 209 insertions, 141 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/PersonLabel.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/PersonLabel.java index 8299cb35..d4422ca8 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/PersonLabel.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/PersonLabel.java @@ -10,6 +10,7 @@ import javax.swing.JLabel; import javax.swing.UIManager; import org.openslx.bwlp.thrift.iface.UserInfo; +import org.openslx.dozmod.gui.helper.ColorUtil; import org.openslx.dozmod.util.FormatHelper; import org.openslx.dozmod.util.OpenLinks; @@ -24,6 +25,9 @@ public class PersonLabel extends JLabel { private PersonLabelClickEvent callback = defaultCallback; + private static final Color linkColor = ColorUtil.add(UIManager.getColor("Label.foreground"), new Color(0, + 0, .75f), .5f); + public PersonLabel() { this(defaultCallback); } @@ -43,25 +47,6 @@ public class PersonLabel extends JLabel { }); } - private Color linkColor() { - // Create color for links - Color tc = UIManager.getColor("Label.foreground"); - int r = tc.getRed() * tc.getRed(); - int g = tc.getGreen() * tc.getGreen(); - int b = tc.getBlue() * tc.getBlue(); - b += 30000; - double factor = 65025 / b; - if (factor < 1) { - r = (int)((double)r * factor); - g = (int)((double)g * factor); - b = (int)((double)b * factor); - } - r = (int) Math.sqrt(r); - g = (int) Math.sqrt(g); - b = (int) Math.sqrt(b); - return new Color(r, g, b); - } - /** * Set the callback to call when the user clicks this label using the left * mouse button. Only called if a user is set. @@ -91,7 +76,7 @@ public class PersonLabel extends JLabel { } else { setToolTipText("Klicken, um eine Mail an diese Person zu senden"); setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - setForeground(linkColor()); + setForeground(linkColor); } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImagePermissionTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImagePermissionTable.java index 75347950..869e0f1a 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImagePermissionTable.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImagePermissionTable.java @@ -13,15 +13,15 @@ public class ImagePermissionTable extends ListTable<UserImagePermissions> { private static String[] columnNames = { "Benutzer", "Link", "Download", "Bearbeiten", "Admin" }; - private static Class<?>[] columnClasses = { String.class, Boolean.class, Boolean.class, Boolean.class, Boolean.class }; + private static Class<?>[] columnClasses = { String.class, Boolean.class, Boolean.class, Boolean.class, + Boolean.class }; public ImagePermissionTable() { super(columnNames, columnClasses); } @Override - protected Object getValueAtInternal(int rowIndex, int columnIndex) { - UserImagePermissions row = getModelRow(rowIndex); + protected Object getValueAtInternal(UserImagePermissions row, int columnIndex) { if (columnIndex == 0) return FormatHelper.userName(UserCache.find(row.userId)); if (columnIndex == 1) @@ -34,15 +34,18 @@ public class ImagePermissionTable extends ListTable<UserImagePermissions> { return row.permissions.admin; throw new IndexOutOfBoundsException(); } + @Override public boolean isCellEditable(int row, int col) { // TODO actual permission checks return col != 0; } + @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { // aValue must be boolean - if (!(aValue instanceof Boolean)) return; + if (!(aValue instanceof Boolean)) + return; // TODO convert index to model index UserImagePermissions row = getViewRow(rowIndex); if (columnIndex == 1) diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageTable.java index f67fdb31..9db22ed0 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageTable.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageTable.java @@ -1,10 +1,7 @@ package org.openslx.dozmod.gui.control.table; -import java.awt.Component; import java.util.Comparator; -import javax.swing.JTable; - import org.openslx.bwlp.thrift.iface.ImageSummaryRead; import org.openslx.dozmod.thrift.Sorters; import org.openslx.dozmod.thrift.cache.MetaDataCache; @@ -34,8 +31,6 @@ public class ImageTable extends ListTable<ImageSummaryRead> { } }); - this.setDefaultRenderer(Object.class, new ImageTableRenderer()); - // --------- set comparators for different columns ------------------------------ // first column doesn't have to be set, because standard comparator already compares strings // second column, compares the OS getRowSorter().setComparator(1, Sorters.osNameById); @@ -44,13 +39,11 @@ public class ImageTable extends ListTable<ImageSummaryRead> { // fourth and fifth column are both longs (last update and size), use default // sixth column (version id) is string again, doesn't have to be set // seventh column is boolean, use default - // --------- end of comparators ------------------------------------------------- } // return the right value of our image (row) depending on given column @Override - protected Object getValueAtInternal(int rowIndex, int columnIndex) { - ImageSummaryRead row = getModelRow(rowIndex); + protected Object getValueAtInternal(ImageSummaryRead row, int columnIndex) { if (columnIndex == 0) return row.getImageName(); if (columnIndex == 1) @@ -67,32 +60,25 @@ public class ImageTable extends ListTable<ImageSummaryRead> { return row.isTemplate; throw new IndexOutOfBoundsException(); } -} -/** - * This renderer formats the given value to a readable string for the table - * cell, depending on the column - */ -@SuppressWarnings("serial") -class ImageTableRenderer extends TableRenderer { @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, - boolean hasFocus, int row, int column) { - if (value == null) - value = "-"; - // column 0, 5 and 6 don't have to be changed ( already string/ checkbox) - if (column == 1) - value = FormatHelper.osName(MetaDataCache.getOsById((int) value)); - if (column == 2) - value = FormatHelper.userName(UserCache.find((String) value)); - if (column == 3) - value = FormatHelper.shortDate((long) value); - if (column == 4) - value = FormatHelper.bytes((long) value, false); - if (column > 6 || column < 0) + public Object modelValueToDisplayFormat(Object value, int column) { + switch (column) { + case 0: + case 5: + case 6: + return value; + case 1: + return FormatHelper.osName(MetaDataCache.getOsById((int) value)); + case 2: + return FormatHelper.userName(UserCache.find((String) value)); + case 3: + return FormatHelper.shortDate((long) value); + case 4: + return FormatHelper.bytes((long) value, false); + default: throw new IndexOutOfBoundsException(); - - super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - return this; + } } -}
\ No newline at end of file + +} diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageVersionTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageVersionTable.java index a197c65c..2cc507c0 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageVersionTable.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageVersionTable.java @@ -10,27 +10,28 @@ public class ImageVersionTable extends ListTable<ImageVersionDetails> { private final static Logger LOGGER = Logger.getLogger(ImageVersionTable.class); - private static String[] columnNames = { "Datum", "Uploader", "Valid", "Größe", "Id" }; + private static String[] columnNames = { "Datum", "Uploader", "Valid", "Größe", "Id" }; - private static Class<?>[] columnClasses = { String.class, String.class, Boolean.class, String.class, String.class}; + private static Class<?>[] columnClasses = { String.class, String.class, Boolean.class, String.class, + String.class }; public ImageVersionTable() { super(columnNames, columnClasses); } @Override - protected Object getValueAtInternal(int rowIndex, int columnIndex) { - ImageVersionDetails row = getModelRow(rowIndex); + protected Object getValueAtInternal(ImageVersionDetails row, int columnIndex) { if (columnIndex == 0) return FormatHelper.longDate(row.getCreateTime()); if (columnIndex == 1) - return FormatHelper.userName(UserCache.find(row.getUploaderId()));; - if (columnIndex == 2) - return row.isValid; - if (columnIndex == 3) - return FormatHelper.bytes(row.getFileSize(), false); - if (columnIndex == 4) - return row.getVersionId(); - throw new IndexOutOfBoundsException(); + return FormatHelper.userName(UserCache.find(row.getUploaderId())); + ; + if (columnIndex == 2) + return row.isValid; + if (columnIndex == 3) + return FormatHelper.bytes(row.getFileSize(), false); + if (columnIndex == 4) + return row.getVersionId(); + throw new IndexOutOfBoundsException(); } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LecturePermissionTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LecturePermissionTable.java index b30783e8..fe3b800c 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LecturePermissionTable.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LecturePermissionTable.java @@ -17,8 +17,7 @@ public class LecturePermissionTable extends ListTable<UserLecturePermissions> { } @Override - protected Object getValueAtInternal(int rowIndex, int columnIndex) { - UserLecturePermissions row = getModelRow(rowIndex); + protected Object getValueAtInternal(UserLecturePermissions row, int columnIndex) { if (columnIndex == 0) return FormatHelper.userName(UserCache.find(row.userId)); if (columnIndex == 1) diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LectureTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LectureTable.java index a1147567..22771307 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LectureTable.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LectureTable.java @@ -1,11 +1,13 @@ package org.openslx.dozmod.gui.control.table; +import java.awt.Color; import java.awt.Component; import java.awt.Font; -import javax.swing.JTable; +import javax.swing.UIManager; import org.openslx.bwlp.thrift.iface.LectureSummary; +import org.openslx.dozmod.gui.helper.ColorUtil; import org.openslx.dozmod.thrift.Session; import org.openslx.dozmod.thrift.Sorters; import org.openslx.dozmod.thrift.cache.UserCache; @@ -18,21 +20,24 @@ public class LectureTable extends ListTable<LectureSummary> { private static Class<?>[] columnClasses = { String.class, String.class, Long.class, Long.class, Boolean.class, Boolean.class }; + private final Font boldFont; + + private final Color invalidColor; + public LectureTable() { super(columnNames, columnClasses); - this.setDefaultRenderer(Object.class, new LectureTableRenderer(this)); - - // --------- set comparators for different columns ------------------------------ // first column doesn't have to be set, because standard comparator already compares strings // second column compares the owner getRowSorter().setComparator(1, Sorters.userNameById); // third and fourth column are both longs (last update and size), use default comparator - // --------- end of comparators ------------------------------------------------- + boldFont = getFont().deriveFont(Font.BOLD); + Color fg = UIManager.getColor("Table.foreground"); + Color bg = UIManager.getColor("Table.background"); + invalidColor = ColorUtil.blend(fg, bg, .66f); } @Override - protected Object getValueAtInternal(int rowIndex, int columnIndex) { - LectureSummary row = getModelRow(rowIndex); + protected Object getValueAtInternal(LectureSummary row, int columnIndex) { if (columnIndex == 0) return row.getLectureName(); if (columnIndex == 1) @@ -48,52 +53,45 @@ public class LectureTable extends ListTable<LectureSummary> { throw new IndexOutOfBoundsException(); } - /** - * This renderer formats the given value to a readable string for the table - * cell, depending on the column - */ - private static class LectureTableRenderer extends TableRenderer { - - private final Font bold; - - private LectureTableRenderer(JTable table) { - bold = table.getFont().deriveFont(Font.BOLD); + @Override + public void prepareRenderHook(Component component, LectureSummary row, int column, boolean isSelected) { + Color fgOverride = null; + if (Session.getUserId().equals(row.ownerId)) { + component.setFont(boldFont); } - - @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, - boolean hasFocus, int row, int column) { - boolean setBold = false; - switch (column) { - case 0: // Image name - case 4: // isEnabled - case 5: // hasValidImage - break; - case 1: // Owner - String ownerId = (String) value; - value = FormatHelper.userName(UserCache.find(ownerId)); - if (Session.getUserId().equals(ownerId)) { - setBold = true; - } - break; - case 2: // Start time - case 3: // End time - long columnDate = (long) value; - long now = System.currentTimeMillis() / 1000; - value = FormatHelper.shortDate(columnDate); - if ((column == 2 && columnDate > now) || (column == 3 && columnDate < now)) { - setBold = true; - } - break; - default: - throw new IndexOutOfBoundsException(); + long now = System.currentTimeMillis() / 1000; + boolean dateInvalid = ((column == 2 && row.startTime > now) || (column == 3 && row.endTime < now)); + if (column == 2 || column == 3) { + if (dateInvalid) { + fgOverride = Color.RED; } - super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - - if (setBold) { - setFont(bold); + } + if (fgOverride == null) { + if (dateInvalid || !row.isImageVersionUsable) { + component.setForeground(invalidColor); + } else { + component.setForeground(getForeground()); } - return this; + } else { + component.setForeground(Color.RED); } } + + @Override + public Object modelValueToDisplayFormat(Object value, int column) { + switch (column) { + case 0: // Image name + case 4: // isEnabled + case 5: // hasValidImage + return value; + case 1: // Owner + return FormatHelper.userName(UserCache.find((String) value)); + case 2: // Start time + case 3: // End time + return FormatHelper.shortDate((long) value); + default: + throw new IndexOutOfBoundsException(); + } + } + } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ListTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ListTable.java index 741e2b77..bfd8879e 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ListTable.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ListTable.java @@ -11,6 +11,7 @@ import javax.swing.RowSorter; import javax.swing.SortOrder; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableCellRenderer; import javax.swing.table.TableRowSorter; import org.apache.log4j.Logger; @@ -56,7 +57,7 @@ public abstract class ListTable<T> extends JTable { this.createDefaultColumnsFromModel(); this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); this.getTableHeader().setReorderingAllowed(false); - this.setDefaultRenderer(Object.class, new TableRenderer()); + this.setDefaultRenderer(Object.class, new ListTableRenderer()); this.setDefaultRenderer(Boolean.class, getDefaultRenderer(Boolean.class)); this.setDefaultEditor(Boolean.class, getDefaultEditor(Boolean.class)); this.setRowSelectionAllowed(true); @@ -64,7 +65,7 @@ public abstract class ListTable<T> extends JTable { } - protected abstract Object getValueAtInternal(int rowIndex, int columnIndex); + protected abstract Object getValueAtInternal(T item, int columnIndex); public T getModelRow(int rowIndex) { if (rowIndex < 0 || rowIndex >= model.getRowCount()) @@ -135,6 +136,40 @@ public abstract class ListTable<T> extends JTable { } /** + * Called when rendering a column is being prepared. This is a good time to + * change the color or font for the given cell. + * + * @param component The component representing the cell being rendered + * @param row item of the row being rendered + * @param column column index (model-based) of the cell being rendered + * @param isSelected whether the row is currently selected + */ + public void prepareRenderHook(Component component, T row, int column, boolean isSelected) { + // Nothing by default + } + + /** + * Called when the value of the given column needs to be transformed into a + * displayable item. By default this is the identity function, returning the + * value as-is. + * + * @param value Value to render + * @param column Column index (model-based) being rendered + * @return Rendered version of value. This should match the column class + */ + public Object modelValueToDisplayFormat(Object value, int column) { + return value; + } + + @Override + public final Component prepareRenderer(TableCellRenderer renderer, int row, int column) { + Component c = super.prepareRenderer(renderer, row, column); + T item = getViewRow(row); + prepareRenderHook(c, item, convertColumnIndexToModel(column), isRowSelected(row)); + return c; + } + + /** * Model for our table */ private class ListModel extends AbstractTableModel { @@ -184,25 +219,28 @@ public abstract class ListTable<T> extends JTable { @Override public Object getValueAt(int rowIndex, int columnIndex) { - return getValueAtInternal(rowIndex, columnIndex); + T item = getModelRow(rowIndex); + int realColumn = convertColumnIndexToModel(columnIndex); + return getValueAtInternal(item, realColumn); } } -} - -/** - * This renderer simply removes the default dotted border when - * a cell is selected - * - */ -@SuppressWarnings("serial") -class TableRenderer extends DefaultTableCellRenderer { - @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, - boolean hasFocus, int row, int column) { - super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - setBorder(null); - return this; + /** + * This renderer simply removes the default dotted border when + * a cell is selected + * + */ + private class ListTableRenderer extends DefaultTableCellRenderer { + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { + super.getTableCellRendererComponent(table, + modelValueToDisplayFormat(value, convertColumnIndexToModel(column)), isSelected, + hasFocus, row, column); + setBorder(null); + return this; + } } + } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/UserTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/UserTable.java index 99eac35b..447444c2 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/UserTable.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/UserTable.java @@ -13,8 +13,7 @@ public class UserTable extends ListTable<UserInfo> { } @Override - protected Object getValueAtInternal(int rowIndex, int columnIndex) { - UserInfo row = getModelRow(rowIndex); + protected Object getValueAtInternal(UserInfo row, int columnIndex) { if (columnIndex == 0) return FormatHelper.userName(row); if (columnIndex == 1) diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/ColorUtil.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/ColorUtil.java new file mode 100644 index 00000000..6b30a8cd --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/ColorUtil.java @@ -0,0 +1,59 @@ +package org.openslx.dozmod.gui.helper; + +import java.awt.Color; + +public class ColorUtil { + + private static float[] squared(Color color) { + float[] vals = color.getRGBComponents(null); + vals[0] *= vals[0]; + vals[1] *= vals[1]; + vals[2] *= vals[2]; + return vals; + } + + private static Color sqrt(float... floatVals) { + floatVals[0] = (float) Math.sqrt(floatVals[0]); + floatVals[1] = (float) Math.sqrt(floatVals[1]); + floatVals[2] = (float) Math.sqrt(floatVals[2]); + return new Color(floatVals[0], floatVals[1], floatVals[2]); + } + + public static Color blendFast(Color color1, Color color2, float wc1) { + float[] c1 = color1.getColorComponents(null); + float[] c2 = color2.getColorComponents(null); + float wc2 = 1f - wc1; + return new Color(c1[0] * wc1 + c2[0] * wc2, c1[1] * wc1 + c2[1] * wc2, c1[2] * wc1 + c2[2] * wc2); + } + + public static Color blend(Color color1, Color color2, float wc1) { + float[] c1 = squared(color1); + float[] c2 = squared(color2); + float wc2 = 1f - wc1; + return sqrt(c1[0] * wc1 + c2[0] * wc2, c1[1] * wc1 + c2[1] * wc2, c1[2] * wc1 + c2[2] * wc2); + } + + public static Color add(Color color1, Color color2, float wc1) { + float[] c1 = squared(color1); + float[] c2 = squared(color2); + c1[0] += c2[0]; + c1[1] += c2[1]; + c1[2] += c2[2]; + float max = Math.max(Math.max(c1[0], c1[1]), c1[2]); + if (max > 1f) { + c1[0] /= max; + c1[1] /= max; + c1[2] /= max; + } + return sqrt(c1[0], c1[1], c1[2]); + } + + public static float getBrightness(Color color) { + return Color.RGBtoHSB(color.getRed(), color.getBlue(), color.getGreen(), null)[2]; + } + + public static Color contrastColor(Color color) { + return new Color(color.getRed() ^ 0x80, color.getGreen() ^ 0x80, color.getBlue() ^ 0x80); + } + +} |
