Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /***********************************************************************
- * Module: PropertyDialog
- * Author: Goran Todorovic
- * Purpose: Dialog used for changing element properties
- ***********************************************************************/
- package geer.gui.dialogs;
- import geer.app.config.Config;
- import geer.app.config.sLog;
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Container;
- import java.awt.Dimension;
- import java.awt.Font;
- import java.lang.reflect.Method;
- import javax.swing.ComboBoxModel;
- import javax.swing.DefaultComboBoxModel;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JScrollPane;
- import javax.swing.SpinnerNumberModel;
- import javax.swing.SwingConstants;
- import javax.swing.UIManager;
- import javax.swing.border.EmptyBorder;
- import javax.swing.border.LineBorder;
- import javax.swing.event.TableModelEvent;
- import javax.swing.event.TableModelListener;
- import javax.swing.table.TableCellEditor;
- import de.javasoft.swing.JYPropertyTable;
- import de.javasoft.swing.table.ColorComboBoxTableCellEditor;
- import de.javasoft.swing.table.JYComboBoxTableCellEditor;
- import de.javasoft.swing.table.PropertyTableModel;
- import de.javasoft.swing.table.TableSeparator;
- /**
- * PropertyDialog class
- * @author Goran Todorovic
- *
- */
- public class PropertyDialog extends JFrame {
- /**
- * TODO:
- * Implement back-end
- * Fix loading time...sometimes it's slow on opening
- */
- /**
- *
- */
- private static final long serialVersionUID = -6633399800771737715L;
- /**
- * Test label (can be (or must :P) replacted with an actual model (Entity, Attribute...))
- */
- private JLabel testLabel = null;
- public PropertyDialog() {
- super(Config.getInstance().getAppName() + " :: Element properties");
- this.setupPropertyDialog(getContentPane());
- setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
- setSize(400,350);
- setLocationRelativeTo(null);
- setVisible(true);
- }
- /**
- * Setup property table values:
- * @param container - content pane
- */
- private void setupPropertyDialog(final Container container)
- {
- JPanel panel = new JPanel();
- panel.setPreferredSize(new Dimension(400, 50));
- panel.setBackground(Color.WHITE);
- testLabel = new JLabel("TestLabel");
- testLabel.setPreferredSize(new Dimension(200, 40));
- testLabel.setBorder(new EmptyBorder(10,10,10,10));
- testLabel.setOpaque(true);
- testLabel.setBackground(new Color(0xBFFFFF));
- testLabel.setForeground(new Color(0x202020));
- testLabel.setBorder(new LineBorder(Color.ORANGE, 2));
- testLabel.setFont(new Font("Dialog", Font.PLAIN, 20));
- panel.add(testLabel);
- container.add(panel, BorderLayout.NORTH);
- JYPropertyTable table = new JYPropertyTable() {
- /**
- *
- */
- private static final long serialVersionUID = 571816901375361004L;
- // Override installEditors() to support runtime LAF-switch (can be removed if needed)
- @Override
- protected void installEditors() {
- super.installEditors();
- // We use a custom comboBox model to increase usability by readable values (i.e. 2 will be displayed as LEFT)
- setPropertyEditor(HAlignmentComboModel.class, new HAlignmentCellEditor(defaultEditor));
- // Replace default color editor with non-editable editor (means combo text field isn't editable)
- setPropertyEditor(Color.class, new ColorComboBoxTableCellEditor(getDefaultEditor(), false, false, false));
- }
- };
- // Add listener to update testLabel properties
- table.getModel().addTableModelListener(new ModelListener());
- initTable(table);
- // Workaround to avoid border fallback to default scrollpane-border after a LAF switch (Java 1.5/JTable bug)
- // Can be removed if needed
- JScrollPane scrollPane = new JScrollPane(table) {
- /**
- *
- */
- private static final long serialVersionUID = 7462979487368722909L;
- @Override
- public void updateUI() {
- super.updateUI();
- setBorder(UIManager.getBorder("Table.scrollPaneBorder"));
- }
- };
- container.add(scrollPane);
- }
- /**
- * Initial table property values.
- * @param table
- */
- private void initTable(JYPropertyTable table)
- {
- table.addProperty("Text", testLabel.getText());
- table.addProperty("Font", testLabel.getFont());
- table.addSeparator();
- table.addProperty("Foreground", testLabel.getForeground());
- table.addProperty("Background", testLabel.getBackground());
- table.addProperty("Opaque", testLabel.isOpaque());
- LineBorder border = (LineBorder)testLabel.getBorder();
- table.addProperty("BorderColor", border.getLineColor());
- table.addProperty("BorderSize", new SpinnerNumberModel(border.getThickness(), 0, 8, 1));
- table.addSeparator();
- table.addProperty("HorizontalAlignment", new HAlignmentComboModel());
- table.addProperty("PreferredSize", testLabel.getPreferredSize());
- table.addProperty("Visible", testLabel.isVisible());
- }
- /**
- * Internal class - ModelListener
- * @author Goran Todorovic
- *
- */
- private class ModelListener implements TableModelListener {
- public void tableChanged(TableModelEvent evt) {
- if (evt.getColumn() == 0)
- return;
- int row = evt.getFirstRow();
- PropertyTableModel model = (PropertyTableModel)evt.getSource();
- Object val = model.getPropertyValue(row);
- if (val instanceof TableSeparator)
- return;
- // Convert model alignment value to integer
- else if (val instanceof HAlignmentComboModel) {
- HAlignmentComboModel.Alignment align = (HAlignmentComboModel.Alignment)((ComboBoxModel)val).getSelectedItem();
- val = new Integer(align.toInt());
- }
- else if (model.getPropertyKey(row).toString().equals("BorderSize")) {
- int size = (Integer)((SpinnerNumberModel)val).getValue();
- LineBorder border = (LineBorder)testLabel.getBorder();
- testLabel.setBorder(new LineBorder(border.getLineColor(), size));
- return;
- }
- else if (model.getPropertyKey(row).toString().equals("BorderColor")) {
- Color color = (Color)val;
- LineBorder border = (LineBorder)testLabel.getBorder();
- testLabel.setBorder(new LineBorder(color, border.getThickness()));
- return;
- }
- // Veeeery bugged method below xD
- // Set object value via reflection
- /**
- * What we do here:
- * We take key property from the table above and we update testLabel model value based on that property key
- * IMPORTANT: table property key has to be the same as from the object property method
- * Example: testLabel.setText("bla") - property from here is "Text" because we use "set" + model.getPropertyKey(row) below!
- * otherwise something like this happens: sLog: Error on PropertyDialog.java:184, m = public void javax.swing.JLabel.setText(java.lang.String)
- */
- if (val != null) {
- Class<?> clazz = val.getClass();
- if (val instanceof Boolean)
- clazz = boolean.class;
- else if (val instanceof Integer)
- clazz = int.class;
- Method m = null;
- try {
- m = testLabel.getClass().getMethod("set" + model.getPropertyKey(row), clazz);
- sLog.writeConsole("Error on PropertyDialog.java:184, m = " + m.toString());
- m.invoke(testLabel, val);
- } catch (Exception e) {
- sLog.writeConsole("Error on PropertyDialog.java:184, m = " + m.toString());
- sLog.write(e);
- }
- }
- testLabel.revalidate();
- testLabel.repaint();
- }
- }
- /**
- * Internal Horizontal Alignment TableCellEditor Class
- * @author Goran Todorovic
- * Note: In case we decide not to use aligment for text, everything related to this can be deleted!
- *
- */
- static class HAlignmentCellEditor extends JYComboBoxTableCellEditor {
- /**
- *
- */
- private static final long serialVersionUID = 3463536609804222981L;
- public HAlignmentCellEditor(TableCellEditor defaultEditor) {
- super(defaultEditor, false, false);
- editorComponent.setModel(new HAlignmentComboModel());
- }
- }
- /**
- * Internal Horizontal Alignment ComboBox Model Class - has to be public or must implement Cloneable
- * @author Goran Todorovic
- *
- */
- public static class HAlignmentComboModel extends DefaultComboBoxModel {
- /**
- *
- */
- private static final long serialVersionUID = 5341107392291260407L;
- public static enum Alignment {
- LEFT(SwingConstants.LEFT),
- CENTER(SwingConstants.CENTER),
- RIGHT(SwingConstants.RIGHT),
- LEADING(SwingConstants.LEADING),
- TRAILING(SwingConstants.TRAILING);
- private int alignment;
- private Alignment(int alignment) {
- this.alignment = alignment;
- }
- public int toInt() {
- return alignment;
- }
- }
- // Initialize model
- {
- for (Alignment align : Alignment.values())
- super.addElement(align);
- }
- @Override
- public void addElement(Object object) {
- }
- @Override
- public void removeElement(Object object) {
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement