AdventureDemoEx.java
上传用户:zhengdagz
上传日期:2014-03-06
资源大小:1956k
文件大小:14k
源码类别:

xml/soap/webservice

开发平台:

Java

  1. /*
  2.  * $Id: AdventureDemoEx.java,v 1.4 2005/07/01 15:53:16 kleopatra Exp $
  3.  *
  4.  * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
  5.  * Santa Clara, California 95054, U.S.A. All rights reserved.
  6.  */
  7. package org.jdesktop.demo.adventure;
  8. import java.awt.BorderLayout;
  9. import java.awt.Window;
  10. import javax.swing.BorderFactory;
  11. import javax.swing.JComponent;
  12. import javax.swing.JFormattedTextField;
  13. import javax.swing.JLabel;
  14. import javax.swing.JScrollPane;
  15. import javax.swing.JSplitPane;
  16. import javax.swing.JTextArea;
  17. import javax.swing.JTextField;
  18. import javax.swing.SwingUtilities;
  19. import javax.swing.UIManager;
  20. import javax.swing.plaf.basic.BasicSplitPaneUI;
  21. import org.jdesktop.binding.DataModel;
  22. import org.jdesktop.binding.metadata.MetaData;
  23. import org.jdesktop.binding.swingx.BindingFactory;
  24. import org.jdesktop.binding.swingx.BindingHandler;
  25. import org.jdesktop.binding.swingx.DirectListBinding;
  26. import org.jdesktop.binding.swingx.DirectTableBinding;
  27. import org.jdesktop.binding.swingx.table.ColumnFactoryExt;
  28. import org.jdesktop.dataset.DataRelation;
  29. import org.jdesktop.dataset.DataRelationTable;
  30. import org.jdesktop.dataset.DataSet;
  31. import org.jdesktop.dataset.adapter.DataModelAdapter;
  32. import org.jdesktop.dataset.adapter.SelectionModelAdapter;
  33. import org.jdesktop.dataset.adapter.TabularDataModelAdapter;
  34. import org.jdesktop.demo.DemoPanel;
  35. import org.jdesktop.demo.MainWindow;
  36. import org.jdesktop.demo.swingx.common.MarginHighlighter;
  37. import org.jdesktop.swingx.JXImagePanel;
  38. import org.jdesktop.swingx.JXList;
  39. import org.jdesktop.swingx.JXPanel;
  40. import org.jdesktop.swingx.JXTable;
  41. import org.jdesktop.swingx.JXTitledPanel;
  42. import org.jdesktop.swingx.border.DropShadowBorder;
  43. import org.jdesktop.swingx.decorator.Highlighter;
  44. import org.jdesktop.swingx.decorator.HighlighterPipeline;
  45. import org.jdesktop.swingx.table.ColumnFactory;
  46. import com.jgoodies.forms.builder.PanelBuilder;
  47. import com.jgoodies.forms.factories.Borders;
  48. import com.jgoodies.forms.layout.CellConstraints;
  49. import com.jgoodies.forms.layout.FormLayout;
  50. /**
  51.  * A modified version of the Adventure Demo.
  52.  * 
  53.  * Demonstrates ui-building in three phases
  54.  * 
  55.  * <ul>
  56.  * <li> create and configure components
  57.  * <li> build up the screen
  58.  * <li> load and bind the data to components
  59.  * </ul>
  60.  * 
  61.  * Note that data-related component configuration is left to the  
  62.  * binding phase - it's done by modifying the MetaData of the DataModel.
  63.  * 
  64.  *
  65.  * @author Richard Bair
  66.  * @author Jeanette Winzenburg
  67.  */
  68. public class AdventureDemoEx extends DemoPanel {
  69. /**
  70.  * Comment for <code>serialVersionUID</code>
  71.  */
  72. private static final long serialVersionUID = 3544670668122894901L;
  73.     private DropShadowBorder dsb = new DropShadowBorder(UIManager.getColor("Control"), 0, 8, .5f, 12, false, true, true, true);
  74. private DataSet ds;
  75.     private JTextField nameTF;
  76.     private JTextField locationTF;
  77.     private JFormattedTextField priceTF;
  78.     private JTextArea descriptionTA;
  79.     private JXImagePanel imagePanel;
  80.     private JXList navigator;
  81.     private JTextField catNameTF;
  82.     private JXTable activitiesTBL;
  83.     private JLabel nameLabel;
  84.     private JLabel locationLabel;
  85.     private JLabel priceLabel;
  86.     private JLabel descriptionLabel;
  87.   
  88.     /** Creates new form Adventure Demo */
  89.     public AdventureDemoEx() {
  90.         setName("Adventure Demo 2.3");
  91.         
  92.         //init the gui components
  93.         initComponents();
  94.         configureComponents();
  95.         // build the screen
  96.         build();
  97.         // model, load and bind the data
  98.         bind(); 
  99.     }
  100.     private void bind() {
  101.         preBind();
  102.         // initialize the binding infrastructure
  103.         BindingFactory factory = BindingFactory.getInstance();
  104.         BindingHandler bindings = new BindingHandler();
  105.         bindings.setAutoCommit(true);
  106.         
  107.         // bind packageDetails
  108.         DataModelAdapter packageModel = new DataModelAdapter(ds.getTable("package").getSelector("current"));
  109.         customizeMetaData(packageModel, false);
  110.         bindings.add(factory.createBinding(locationTF, packageModel, "location"));
  111.         bindings.add(factory.createMetaBinding(locationLabel, packageModel, "location"));
  112.         bindings.add(factory.createBinding(priceTF, packageModel, "price"));
  113.         bindings.add(factory.createMetaBinding(priceLabel, packageModel, "price"));
  114.         bindings.add(factory.createBinding(nameTF, packageModel, "name"));
  115.         bindings.add(factory.createMetaBinding(nameLabel, packageModel, "name"));
  116.         bindings.add(factory.createBinding(descriptionTA, packageModel, "description"));
  117.         bindings.add(factory.createMetaBinding(descriptionLabel, packageModel, "description"));
  118. //        bindings.add(new ImagePanelBinding(imagePanel, packageModel, "imageuri"));
  119.         // bind package list and selection of current details
  120.         TabularDataModelAdapter navModel = new TabularDataModelAdapter(ds.getTable("package"));
  121.         SelectionModelAdapter sm = new SelectionModelAdapter(ds.getTable("package").getSelector("current"));
  122.         bindings.add(new DirectListBinding(navigator, navModel, "name", sm));
  123.         // bind category table and details
  124.         // PENDING: category? why doesnt it work?
  125. //        DataModelAdapter categoryDetailModel = new DataModelAdapter(ds.getTable("categoryDetail").getSelector("current"));
  126. //        bindings.add(factory.createBinding(catNameTF, categoryDetailModel, "name"));
  127.         TabularDataModelAdapter activitiesDetailModel = new TabularDataModelAdapter(ds.getTable("activitiesDetail"));
  128.         customizeMetaData(activitiesDetailModel, true);
  129.         bindings.add(new DirectTableBinding(activitiesTBL, activitiesDetailModel, new String[]{"name", "description", "price"}));
  130.         postBind();
  131.     }
  132.  
  133.     private void customizeMetaData(DataModel packageModel, boolean isActivitiesModel) {
  134.         // dumb label setting ... real world apps would f.i. read
  135.         // them from a localized resource file
  136.         String[] fieldNames = packageModel.getFieldNames();
  137.         for (int i = 0; i < fieldNames.length; i++) {
  138.             MetaData metaData = packageModel.getMetaData(fieldNames[i]);
  139.             String label = fieldNames[i].substring(1);
  140.             String capital = fieldNames[i].substring(0, 1).toUpperCase();
  141.             metaData.setLabel(capital + label);
  142.         }
  143.         if (isActivitiesModel) {
  144.             // layout hints for default column width
  145.             MetaData metaData = packageModel.getMetaData("description");
  146.             metaData.setDisplayWidth(64);
  147.             MetaData priceMeta = packageModel.getMetaData("price");
  148.             // JW: hack - elementClass should be set by the TabularDataModelAdapter
  149.             priceMeta.setElementClass(Number.class);
  150.             priceMeta.setDisplayWidth(8);
  151.         }
  152.   
  153.     }
  154.     private void preBind() {
  155.         // model and load the data
  156.         createDataSet();
  157.         // JW: enable enhanced table column configuration
  158.         // this is temporary - should be automatically loaded 
  159.         ColumnFactory.setInstance(new ColumnFactoryExt());
  160.     }
  161.     private void postBind() {
  162.         // JW: Hack - changing the selector value leads to firing tableStructureChanged
  163.         // so we turn auto-creation of tables off once they are bound
  164.         activitiesTBL.setAutoCreateColumnsFromModel(false);
  165.     }
  166.     private void configureComponents() {
  167.         activitiesTBL.setShowHorizontalLines(false);
  168.         activitiesTBL.setBorder(BorderFactory.createEmptyBorder());
  169.         activitiesTBL.setVisibleRowCount(6);
  170.         // fiddling the content inset
  171.         navigator.setBorder(listBorder);
  172.         navigator.setHighlighters(new HighlighterPipeline(new Highlighter[] { new MarginHighlighter(marginBorder)}));
  173.         descriptionTA.setLineWrap(true);
  174.         descriptionTA.setWrapStyleWord(true);
  175.     }
  176.     
  177.     public void addNotify() {
  178.         super.addNotify();
  179.         // JW: quickhack - need to pack to configure JXTable... hmmm
  180.         // this is veery dirty - forget it quickly
  181.         Window window = SwingUtilities.windowForComponent(this);
  182.         window.pack();
  183.     }
  184.     
  185.     private void initComponents() {
  186.         navigator = new JXList();
  187.         activitiesTBL = new JXTable();
  188.         imagePanel = new JXImagePanel();
  189.         nameTF = new JTextField();
  190.         locationTF = new JTextField();
  191.         priceTF = new JFormattedTextField();
  192.         catNameTF = new JTextField();
  193.         descriptionTA = new JTextArea();
  194.    }
  195.  
  196.     
  197.     private void build() {
  198.         JXTitledPanel navigatorPanel = new JXTitledPanel();
  199.         build(navigatorPanel, navigator, true, "Packages");
  200.         JXTitledPanel detailPanel = new JXTitledPanel();
  201.         build(detailPanel, null, true, "Package Details");
  202.         detailPanel.getContentContainer().add(buildPackageDetails());
  203.         JXTitledPanel activitiesPanel = new JXTitledPanel();
  204.         build(activitiesPanel, activitiesTBL, true, "Activities");
  205.         
  206.         JSplitPane detailsSP = createSplitPane(350, JSplitPane.VERTICAL_SPLIT);
  207.         detailsSP.setLeftComponent(detailPanel);
  208.         detailsSP.setRightComponent(activitiesPanel);
  209.         
  210.         JSplitPane mainSP = createSplitPane(240, JSplitPane.HORIZONTAL_SPLIT);
  211.         mainSP.setLeftComponent(navigatorPanel);
  212.         mainSP.setRightComponent(detailsSP);
  213.         setLayout(new BorderLayout());
  214.         
  215.         setBorder(Borders.TABBED_DIALOG_BORDER);
  216.         add(mainSP);
  217.     }
  218.     private JSplitPane createSplitPane(int dividerLocation, int orientation) {
  219.         JSplitPane splitPane = new JSplitPane(orientation);
  220.         splitPane.setDividerLocation(dividerLocation);
  221.         splitPane.setBorder(null);
  222.       ((BasicSplitPaneUI)splitPane.getUI()).getDivider().setBorder(BorderFactory.createEmptyBorder());
  223.         return splitPane;
  224.     }
  225.     
  226.     private void build(JXTitledPanel container, JComponent component, boolean opaque, String title) {
  227.         container.getContentContainer().setLayout(new BorderLayout());
  228.         container.setBorder(dsb);
  229.         container.setTitle(title);
  230.         if (component != null) {
  231.             component = buildScrollPane(component, opaque);
  232.             container.getContentContainer().add(component);
  233.         }
  234.     }
  235.     private JScrollPane buildScrollPane(JComponent component, boolean opaque) {
  236.       JScrollPane scrollPane = new JScrollPane(component);
  237.       scrollPane.setBorder(null);
  238.       scrollPane.setOpaque(opaque);
  239.       scrollPane.getViewport().setOpaque(opaque);
  240.       component.setOpaque(opaque);
  241.       return scrollPane;
  242.     }
  243.     private JComponent buildPackageDetails() {
  244. //        COLUMN SPECS:
  245. //            r:d:n, l:3dluX:n, f:max(p;100dluX):g
  246. //            ROW SPECS:   
  247. //            c:d:n, t:4dluY:n, c:d:n, t:4dluY:n, c:d:n, t:4dluY:n, c:d:n, c:0px:g
  248. //
  249. //            COLUMN GROUPS:  {}
  250. //            ROW GROUPS:     {}
  251. //
  252. //            COMPONENT CONSTRAINTS
  253. //            ( 1,  1,  1,  1, "d=r, d=c"); javax.swing.JLabel      "name"; name=nameLabel
  254. //            ( 3,  1,  1,  1, "d=f, d=c"); javax.swing.JTextField; name=name
  255. //            ( 1,  3,  1,  1, "d=r, d=c"); javax.swing.JLabel      "location"; name=locationLabel
  256. //            ( 3,  3,  1,  1, "d=f, d=c"); javax.swing.JTextField; name=location
  257. //            ( 1,  5,  1,  1, "d=r, d=c"); javax.swing.JLabel      "price"; name=priceLabel
  258. //            ( 3,  5,  1,  1, "d=f, d=c"); javax.swing.JTextField; name=price
  259. //            ( 1,  7,  1,  1, "d=r, d=c"); javax.swing.JLabel      "description"; name=descriptionLabel
  260. //            ( 3,  7,  1,  2, "d=f, d=f"); javax.swing.JScrollPane; name=description
  261.         JXPanel details = new JXPanel();
  262.         FormLayout formLayout = new FormLayout(
  263.                 "r:d:n, l:3dlu:n, f:max(p;100dlu):g", // columns
  264.                 "c:d:n, t:4dlu:n, c:d:n, t:4dlu:n, c:d:n, t:4dlu:n, c:d:n, c:0px:g");  // rows
  265.         PanelBuilder builder = new PanelBuilder(details, formLayout);
  266.         builder.setDefaultDialogBorder();
  267.         CellConstraints cl = new CellConstraints();
  268.         CellConstraints cc = new CellConstraints();
  269.         // JW PENDING: 
  270.         // label creation should be moved to initComponents - too lazy to do so for now
  271.         nameLabel = builder.addLabel("", cl.xywh(1, 1, 1, 1), nameTF, cc.xywh(3, 1, 1, 1));
  272.         locationLabel = builder.addLabel("", cl.xywh(1, 3, 1, 1), locationTF, cc.xywh(3, 3, 1, 1));
  273.         priceLabel = builder.addLabel("", cl.xywh(1, 5, 1, 1), priceTF, cc.xywh(3, 5, 1, 1));
  274.         descriptionLabel = builder.addLabel("", cl.xywh(1, 7, 1, 1), new JScrollPane(descriptionTA), cc.xywh(3, 7, 1, 2));
  275.         return details;
  276.     }
  277.      
  278.     private void createDataSet() {
  279.      ds = DataSet.createFromSchema(getClass().getResourceAsStream("resources/dataset.xsd"));
  280.         DataRelation packageToCategory = ds.createRelation();
  281.      packageToCategory.setName("packageToCategory");
  282.      packageToCategory.setParentColumn(ds.getTable("package").getColumn("catid"));
  283.      packageToCategory.setChildColumn(ds.getTable("category").getColumn("catid"));
  284.     
  285.      DataRelation packageToActivityList = ds.createRelation();
  286.      packageToActivityList.setName("packageToActivityList");
  287.      packageToActivityList.setParentColumn(ds.getTable("package").getColumn("packageid"));
  288.      packageToActivityList.setChildColumn(ds.getTable("activityList").getColumn("packageid"));
  289.         
  290.         DataRelationTable activityListDetails = ds.createRelationTable();
  291.         activityListDetails.setName("activityListDetails");
  292.         activityListDetails.setRelation(packageToActivityList);
  293.         activityListDetails.setParentSelector(ds.getTable("package").getSelector("current"));
  294.         
  295.         DataRelation activityListToActivity = ds.createRelation();
  296.         activityListToActivity.setName("activityListToActivity");
  297.         activityListToActivity.setParentColumn(ds.getTable("activityList").getColumn("activityid"));
  298.         activityListToActivity.setChildColumn(ds.getTable("activity").getColumn("activityid"));
  299.         
  300.         DataRelationTable categoryDetail = ds.createRelationTable();
  301.         categoryDetail.setName("categoryDetail");
  302.         categoryDetail.setRelation(packageToCategory);
  303.         categoryDetail.setParentSelector(ds.getTable("package").getSelector("current"));
  304.         
  305.         DataRelationTable activitiesDetail = ds.createRelationTable();
  306.         activitiesDetail.setName("activitiesDetail");
  307.         activitiesDetail.setRelation(activityListToActivity);
  308.         activitiesDetail.setParentTable(ds.getTable("activityListDetails"));
  309.         ds.readXml(getClass().getResourceAsStream("resources/dataset.xml"));
  310.     }
  311.     public static void main(String[] args) {
  312.        MainWindow.main(new String[]{"-d", "org.jdesktop.demo.adventure.AdventureDemoEx"});
  313.         //new AdventureDemo().setVisible(true);
  314.     }
  315. }