You can subscribe to this list here.
| 2004 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
(37) |
Jun
(141) |
Jul
(111) |
Aug
(91) |
Sep
(79) |
Oct
(151) |
Nov
(161) |
Dec
(93) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2005 |
Jan
(40) |
Feb
(60) |
Mar
(43) |
Apr
(90) |
May
(31) |
Jun
(114) |
Jul
(35) |
Aug
(112) |
Sep
(305) |
Oct
(151) |
Nov
(122) |
Dec
(103) |
| 2006 |
Jan
(65) |
Feb
(57) |
Mar
(475) |
Apr
(276) |
May
(482) |
Jun
(134) |
Jul
(127) |
Aug
(188) |
Sep
(271) |
Oct
(220) |
Nov
(74) |
Dec
(41) |
| 2007 |
Jan
(121) |
Feb
(50) |
Mar
(36) |
Apr
(11) |
May
(31) |
Jun
(12) |
Jul
(73) |
Aug
(41) |
Sep
(59) |
Oct
(33) |
Nov
(60) |
Dec
(111) |
| 2008 |
Jan
(139) |
Feb
(49) |
Mar
(87) |
Apr
(43) |
May
(10) |
Jun
(25) |
Jul
(114) |
Aug
(17) |
Sep
(25) |
Oct
(199) |
Nov
(94) |
Dec
(45) |
| 2009 |
Jan
(36) |
Feb
(14) |
Mar
(29) |
Apr
(32) |
May
(49) |
Jun
(18) |
Jul
(68) |
Aug
(34) |
Sep
(34) |
Oct
(11) |
Nov
(10) |
Dec
(14) |
| 2010 |
Jan
(35) |
Feb
(12) |
Mar
(23) |
Apr
(17) |
May
(4) |
Jun
(1) |
Jul
(4) |
Aug
|
Sep
(2) |
Oct
|
Nov
(10) |
Dec
|
| 2011 |
Jan
(3) |
Feb
|
Mar
|
Apr
|
May
(3) |
Jun
|
Jul
(3) |
Aug
(1) |
Sep
|
Oct
|
Nov
(1) |
Dec
(1) |
| 2012 |
Jan
(2) |
Feb
(1) |
Mar
(8) |
Apr
(3) |
May
|
Jun
|
Jul
(4) |
Aug
(3) |
Sep
(2) |
Oct
|
Nov
|
Dec
|
| 2013 |
Jan
(1) |
Feb
(1) |
Mar
(1) |
Apr
(3) |
May
(4) |
Jun
(3) |
Jul
(8) |
Aug
|
Sep
(1) |
Oct
(1) |
Nov
(3) |
Dec
(4) |
| 2014 |
Jan
(2) |
Feb
(2) |
Mar
(3) |
Apr
(1) |
May
(5) |
Jun
(1) |
Jul
(13) |
Aug
(2) |
Sep
(2) |
Oct
|
Nov
|
Dec
|
| 2015 |
Jan
(1) |
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2017 |
Jan
|
Feb
(1) |
Mar
|
Apr
(1) |
May
(1) |
Jun
|
Jul
(1) |
Aug
(4) |
Sep
(1) |
Oct
|
Nov
|
Dec
|
| 2018 |
Jan
|
Feb
|
Mar
(15) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
| 2019 |
Jan
|
Feb
|
Mar
(3) |
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
| 2020 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(6) |
Oct
|
Nov
|
Dec
|
| 2021 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2022 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2024 |
Jan
|
Feb
(1) |
Mar
(2) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2025 |
Jan
(1) |
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
(1) |
Oct
|
Nov
|
Dec
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:28:18
|
[ http://jira.springframework.org/browse/RCP-553?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-553:
-----------------------------
Priority: Minor (was: Major)
Fix Version/s: 1.x
> Adding shortcuts to BigDecimalTextField
> ---------------------------------------
>
> Key: RCP-553
> URL: http://jira.springframework.org/browse/RCP-553
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Helper Classes
> Affects Versions: 1.0.0
> Reporter: Benoit Xhenseval
> Priority: Minor
> Fix For: 1.x
>
> Attachments: BigDecimalTextField.java.patch
>
>
> We would like to be able to add shortcuts, like "3m" meaning 3 millions, 2k = 2,000. Typically a shortcut for hundred, thousand, millions, billions (for SocGen J ).
> Unfortunately, BigDecimalTextField is explicitly instantiated in several places, making it impossible to extend.
> We have a patch that works fine for us and it should work internationally as the shortcut may vary from one language to the other.
> One needs to add the shortcut characters in a messages.properties file:
> BigDecimalTextField.shortcut.hundred=h
> BigDecimalTextField.shortcut.thousand=k
> BigDecimalTextField.shortcut.million=m
> BigDecimalTextField.shortcut.billion=b
> ...
> So if you type 3k in the field, it will immediately be replaced by 3000.
> If you do not have those entries in the messages.properties, it won't use shortcuts so it is transparent if you do not want it.
> I hope that the patch will be accepted so that we can use SpringRC straight out of the box...
> Many thanks
> Benoit
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:28:18
|
[ http://jira.springframework.org/browse/RCP-556?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-556:
-----------------------------
Fix Version/s: 1.x
> I18l Support for class RequiredIfTrue
> -------------------------------------
>
> Key: RCP-556
> URL: http://jira.springframework.org/browse/RCP-556
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Helper Classes
> Affects Versions: 1.0.1
> Reporter: Fritz Richter
> Fix For: 1.x
>
>
> The class RequiredIfTrue needs support for I18l, so I can use the validation messages in other languages than english.
> The default toString method delivers the message in a static way.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:28:18
|
[ http://jira.springframework.org/browse/RCP-557?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-557:
-----------------------------
Fix Version/s: 1.0.2
> Enhancement for NachoCalendarDateFieldBinder
> --------------------------------------------
>
> Key: RCP-557
> URL: http://jira.springframework.org/browse/RCP-557
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Binding System
> Affects Versions: 1.0.0
> Reporter: Andreas Kuhtz
> Priority: Minor
> Fix For: 1.0.2
>
> Attachments: NachoCalendarDateFieldBinder.patch, showcase-nacho-calendar-sample-patch.diff
>
>
> The NachoCalendar has more properties that should be configurable from the binder. The attached patch exposes more property keys.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:26:26
|
[ http://jira.springframework.org/browse/RCP-564?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-564:
-----------------------------
Fix Version/s: 1.x
> Integration of MyDoggy 1.5 into SpringRC 1.0.0
> ----------------------------------------------
>
> Key: RCP-564
> URL: http://jira.springframework.org/browse/RCP-564
> Project: Spring Framework Rich Client Project
> Issue Type: New Feature
> Components: Application Framework
> Environment: All
> Reporter: Peter Karich
> Fix For: 1.x
>
> Original Estimate: 0.12d
> Remaining Estimate: 0.12d
>
> Integrate MyDoggy as a non GPL docking framework.
> Related Jira: RCP-561
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:26:25
|
[ http://jira.springframework.org/browse/RCP-567?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-567:
-----------------------------
Description:
The provided TableFormBuilder is only useful for very simple forms. I was able to create a form builder that extends AbstractFormBuilder and uses the jGoodies DefaultFormBuilder for layout. The main advantage of the jGoodies form builder is the ability to override the default layout's column span and orientation in a cell on a control by control basis. It is also nice to be able to specify the column and row definitions each in one (long) string. The builder also allowed me to create a complex form that also resized sensibly (which was a major priority).
Here is my form builder. It has the provisions to create the complex form in the attached screen shot. The functionality it provides was catered to my needs and therefore I'd expect it to be changed as necessary to be general and follow common guidelines. The "add" methods create labels for the new controls and the "cell" methods only perform layout. Column spans can be overridden by either specifying a column span value other than 1 and by using CellConstraints. The use of CellConstraints also provides the means to override cell alignment for the control being layed out. For convenience the column span value can be specified to "extend to the last column". The builder will automatically commit the row when the column span is specified as such.
One minor downside to this implementation is that gap column and row sizes must be specified. This impl does allow defining different gaps. The builder could easy insert the gap values into the row spec, but my form requires specifying the column gaps since they are not regularly placed.
[code]
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.mobileworkforce.maui.app.MauiApplication;
import org.springframework.richclient.form.binding.Binding;
import org.springframework.richclient.form.binding.BindingFactory;
import org.springframework.richclient.form.builder.AbstractFormBuilder;
import org.springframework.richclient.form.builder.FormComponentInterceptor;
import org.springframework.util.Assert;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.CellConstraints.Alignment;
public class MauiFormBuilder extends AbstractFormBuilder {
public static final int COL_SPAN_ALL = 0;
protected FormLayout layout;
protected DefaultFormBuilder builder;
protected CellConstraints cc = new CellConstraints();
protected FormComponentInterceptor interceptor;
private String formName = null;
protected MauiFormBuilder(BindingFactory bindingFactory, String colSpec, String rowSpec) {
super(bindingFactory);
layout = new FormLayout(colSpec, rowSpec);
builder = new DefaultFormBuilder(layout);
interceptor = getFormComponentInterceptor();
}
public JPanel getForm() {
return builder.getPanel();
}
public void setFormPropertyName(String name) {
formName = name;
}
public JComponent[] add(Binding binding, int colSpan, int rowSpan) {
Assert.notNull(binding, "binding is null");
Assert.isTrue(getFormModel() == binding.getFormModel(),
"Binding's form model must match FormBuilder's form model");
JComponent component = binding.getControl();
processComponent(binding.getProperty(), component);
final JLabel label = createLabelFor(binding.getProperty(), component);
builder.append(label);
boolean newRow = false;
if (colSpan == COL_SPAN_ALL) {
colSpan = builder.getColumnCount() - builder.getColumn() + 1;
newRow = true;
}
builder.setRowSpan(rowSpan);
builder.append(component, colSpan);
builder.setRowSpan(1);
if (newRow) {
row();
}
return new JComponent[] { label, component };
}
public JComponent[] add(Binding binding, int colSpan) {
return add(binding, colSpan, 1);
}
public JComponent[] add(String fieldName) {
return add(fieldName, 1);
}
public JComponent[] add(String fieldName, int colSpan) {
return add(createDefaultBinding(fieldName), colSpan);
}
public JComponent cellWithLabel(String labelProperty, JComponent component, int colSpan) {
boolean newRow = false;
if (colSpan == COL_SPAN_ALL) {
colSpan = builder.getColumnCount() - builder.getColumn() + 1 - 2;
newRow = true;
}
processComponent(labelProperty, component);
final JLabel label = createLabelFor(labelProperty, component);
builder.append(label);
builder.append(component, colSpan);
if (newRow) {
row();
}
return label;
}
public MauiFormBuilder cell(JComponent component) {
builder.append(component);
return this;
}
public MauiFormBuilder cell(JComponent component, int colSpan) {
return cell(component, cc.xyw(1, 1, colSpan));
}
public MauiFormBuilder cell(String fieldName, JComponent component, int colSpan) {
processComponent(fieldName, component);
return cell(component, cc.xyw(1, 1, colSpan));
}
public MauiFormBuilder cell(JComponent component, int colSpan, int rowSpan) {
return cell(component, cc.xywh(1, 1, colSpan, rowSpan));
}
public MauiFormBuilder cell(String fieldName, JComponent component, int colSpan, int rowSpan) {
processComponent(fieldName, component);
return cell(component, cc.xywh(1, 1, colSpan, rowSpan));
}
public MauiFormBuilder cell(JComponent component, CellConstraints c) {
c.gridX = builder.getColumn();
c.gridY = builder.getRow();
boolean newRow = false;
if (c.gridWidth == COL_SPAN_ALL) {
c.gridWidth = builder.getColumnCount() - builder.getColumn() + 1;
newRow = true;
}
builder.add(component, c);
if (newRow) {
row();
} else {
builder.nextColumn(c.gridWidth);
}
return this;
}
public MauiFormBuilder cell(String fieldName, JComponent component, CellConstraints c) {
processComponent(fieldName, component);
return cell(component, c);
}
public void row() {
builder.nextLine(2);
}
public void setColumn(int column) {
builder.setColumn(column);
}
public CellConstraints cellConstraints(int colSpan, int rowSpan, Alignment colAlign, Alignment rowAlign) {
return cc.xywh(1, 1, colSpan, rowSpan, colAlign, rowAlign);
}
public CellConstraints cellConstraints(int colSpan, Alignment colAlign, Alignment rowAlign) {
return cc.xywh(1, 1, colSpan, 1, colAlign, rowAlign);
}
public CellConstraints cellConstraints(int colSpan, Alignment colAlign) {
return cc.xywh(1, 1, colSpan, 1, colAlign, CellConstraints.DEFAULT);
}
public void processComponent(String fieldName, JComponent component) {
if (interceptor != null) {
interceptor.processComponent(fieldName, component);
}
if (formName != null) {
String property = formName + "." + fieldName + ".caption";
String tooltip = MauiApplication.getMessage(property);
if (tooltip != null) {
component.setToolTipText(tooltip);
}
}
}
public JLabel createLabel(String fieldName) {
return createLabelFor(fieldName, null);
}
public JButton createButton(String fieldName) {
JButton button = getComponentFactory().createButton("");
getFormModel().getFieldFace(fieldName).configure(button);
processComponent(fieldName, button);
return button;
}
}
[/code]
The following is the code to create the attached complex form. I also used formLayoutMaker to visually create the form's layout.
[code]
public JPanel createFormControl() {
FormModel formModel = getFormModel();
//columns 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
String colSpec = "right:30dlu,3dlu,5dlu,100dlu,3dlu,right:50dlu,3dlu,10dlu,10dlu,50dlu,3dlu,right:30dlu,3dlu,10dlu,3dlu,right:65dlu,3dlu,10dlu,3dlu,right:40dlu,3dlu,right:min(10dlu;pref):grow,3dlu,max(50dlu;pref)";
//rows 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
String rowSpec = "pref,3dlu,pref,3dlu,pref,3dlu,pref,3dlu,pref,3dlu,150dlu:grow,3dlu,pref,3dlu,fill:40dlu,3dlu,pref,3dlu,pref,3dlu,pref";
MauiFormBuilder builder = new MauiFormBuilder(getBindingFactory(), colSpec, rowSpec);
mfgImage = new JPanel();
cmdClear = builder.createButton("cmdClear");
cmdDelete = builder.createButton("cmdDelete");
cmdSubmit = builder.createButton("cmdSubmit");
cmdSave = builder.createButton("cmdSave");
cmdCancel = builder.createButton("cmdCancel");
lblSignature = builder.createLabel("capture");
lblNotes = builder.createLabel("note");
//1
builder.cell(mfgImage, 5, 3);
cboMfg = new ManufacturerComboBox();
MauiComboBoxBinding cbBinding = new MauiComboBoxBinding(formModel, "order.manufacturer", cboMfg);
builder.add(cbBinding, 7);
cboShowCustOf = new SalesRepComboBox();
cbBinding = new MauiComboBoxBinding(formModel, "order.showCustomersOfSalesRep", cboShowCustOf);
builder.cellWithLabel("showCustOf", cboShowCustOf, MauiFormBuilder.COL_SPAN_ALL);
//3
builder.setColumn(6);
cboCustomer = new CustomerComboBox(order.getShowCustomersOfSalesRep());
//this keeps the control size to a minimum - otherwise the form is very wide because the control sizes to fit its data (long)
Dimension d = cboCustomer.getPreferredSize();
d.width = 300;
cboCustomer.setPreferredSize(d);
cbBinding = new MauiComboBoxBinding(formModel, "order.customer", cboCustomer);
builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
//5
builder.setColumn(6);
cboShipTo = new LocationComboBox(order.getCustomer());
cbBinding = new MauiComboBoxBinding(formModel, "order.shipToLocation", cboShipTo);
builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
//7
builder.setColumn(6);
txtPO = (JTextField) builder.add("order.purchaseOrderNumber", 7)[1];
SalesRepresentative defaultSalesRep = getCustomerManufacturerSalesRep(order.getCustomer());
cboSalesRep = new SalesRepComboBox(order.getCustomer(), defaultSalesRep);
cbBinding = new MauiComboBoxBinding(formModel, "order.salesRepresentative", cboSalesRep);
builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
//9
builder.setColumn(6);
cboSurgeon = new SurgeonComboBox();
builder.add(new ComboBoxBinding(cboSurgeon, formModel, "order.surgeonName"), 3);
txtPatient = (JTextField) builder.add("order.patientName", 5)[1];
builder.add("order.surgeryDate", MauiFormBuilder.COL_SPAN_ALL);
//11
LineItemsBinding lib = new LineItemsBinding(formModel, "genericLineItems");
builder.cell(lib.getControl(), MauiFormBuilder.COL_SPAN_ALL);
//13
builder.cell(lblSignature, builder.cellConstraints(2, CellConstraints.LEFT, CellConstraints.BOTTOM));
builder.setColumn(12);
builder.cell(lblNotes, builder.cellConstraints(1, CellConstraints.LEFT, CellConstraints.BOTTOM));
builder.setColumn(24);
builder.cell(cmdDelete);
builder.row();
//15
SignatureBinding sb = new SignatureBinding(formModel, "capture");
capture = (Capture)sb.getControl();
builder.cell("capture", capture, 10, 3);
builder.setColumn(12);
JComponent notesCtrl = createNotesBinding(formModel, builder);
builder.cell(notesCtrl, MauiFormBuilder.COL_SPAN_ALL);
//17
builder.setColumn(16);
ToggleButtonBinding tb = new ToggleButtonBinding(new JCheckBox(), formModel, "sendEmailFax");
builder.cell("sendEmailFax", tb.getControl(), builder.cellConstraints(6, CellConstraints.RIGHT));
builder.setColumn(24);
builder.cell(cmdSubmit);
builder.row();
//19
cboTitle = createTitleCombo();
builder.add(new ComboBoxBinding(cboTitle, formModel, "title"), 6);
builder.cell(cmdClear);
builder.setColumn(24);
builder.cell(cmdSave);
builder.row();
//21
cboName = createNameCombo();
builder.add(new ComboBoxBinding(cboName, formModel, "printedName"), 6);
builder.setColumn(24);
builder.cell(cmdCancel);
return builder.getForm();
}
[/code]
was:
The provided TableFormBuilder is only useful for very simple forms. I was able to create a form builder that extends AbstractFormBuilder and uses the jGoodies DefaultFormBuilder for layout. The main advantage of the jGoodies form builder is the ability to override the default layout's column span and orientation in a cell on a control by control basis. It is also nice to be able to specify the column and row definitions each in one (long) string. The builder also allowed me to create a complex form that also resized sensibly (which was a major priority).
Here is my form builder. It has the provisions to create the complex form in the attached screen shot. The functionality it provides was catered to my needs and therefore I'd expect it to be changed as necessary to be general and follow common guidelines. The "add" methods create labels for the new controls and the "cell" methods only perform layout. Column spans can be overridden by either specifying a column span value other than 1 and by using CellConstraints. The use of CellConstraints also provides the means to override cell alignment for the control being layed out. For convenience the column span value can be specified to "extend to the last column". The builder will automatically commit the row when the column span is specified as such.
One minor downside to this implementation is that gap column and row sizes must be specified. This impl does allow defining different gaps. The builder could easy insert the gap values into the row spec, but my form requires specifying the column gaps since they are not regularly placed.
[code]
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.mobileworkforce.maui.app.MauiApplication;
import org.springframework.richclient.form.binding.Binding;
import org.springframework.richclient.form.binding.BindingFactory;
import org.springframework.richclient.form.builder.AbstractFormBuilder;
import org.springframework.richclient.form.builder.FormComponentInterceptor;
import org.springframework.util.Assert;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.CellConstraints.Alignment;
public class MauiFormBuilder extends AbstractFormBuilder {
public static final int COL_SPAN_ALL = 0;
protected FormLayout layout;
protected DefaultFormBuilder builder;
protected CellConstraints cc = new CellConstraints();
protected FormComponentInterceptor interceptor;
private String formName = null;
protected MauiFormBuilder(BindingFactory bindingFactory, String colSpec, String rowSpec) {
super(bindingFactory);
layout = new FormLayout(colSpec, rowSpec);
builder = new DefaultFormBuilder(layout);
interceptor = getFormComponentInterceptor();
}
public JPanel getForm() {
return builder.getPanel();
}
public void setFormPropertyName(String name) {
formName = name;
}
public JComponent[] add(Binding binding, int colSpan, int rowSpan) {
Assert.notNull(binding, "binding is null");
Assert.isTrue(getFormModel() == binding.getFormModel(),
"Binding's form model must match FormBuilder's form model");
JComponent component = binding.getControl();
processComponent(binding.getProperty(), component);
final JLabel label = createLabelFor(binding.getProperty(), component);
builder.append(label);
boolean newRow = false;
if (colSpan == COL_SPAN_ALL) {
colSpan = builder.getColumnCount() - builder.getColumn() + 1;
newRow = true;
}
builder.setRowSpan(rowSpan);
builder.append(component, colSpan);
builder.setRowSpan(1);
if (newRow) {
row();
}
return new JComponent[] { label, component };
}
public JComponent[] add(Binding binding, int colSpan) {
return add(binding, colSpan, 1);
}
public JComponent[] add(String fieldName) {
return add(fieldName, 1);
}
public JComponent[] add(String fieldName, int colSpan) {
return add(createDefaultBinding(fieldName), colSpan);
}
public JComponent cellWithLabel(String labelProperty, JComponent component, int colSpan) {
boolean newRow = false;
if (colSpan == COL_SPAN_ALL) {
colSpan = builder.getColumnCount() - builder.getColumn() + 1 - 2;
newRow = true;
}
processComponent(labelProperty, component);
final JLabel label = createLabelFor(labelProperty, component);
builder.append(label);
builder.append(component, colSpan);
if (newRow) {
row();
}
return label;
}
public MauiFormBuilder cell(JComponent component) {
builder.append(component);
return this;
}
public MauiFormBuilder cell(JComponent component, int colSpan) {
return cell(component, cc.xyw(1, 1, colSpan));
}
public MauiFormBuilder cell(String fieldName, JComponent component, int colSpan) {
processComponent(fieldName, component);
return cell(component, cc.xyw(1, 1, colSpan));
}
public MauiFormBuilder cell(JComponent component, int colSpan, int rowSpan) {
return cell(component, cc.xywh(1, 1, colSpan, rowSpan));
}
public MauiFormBuilder cell(String fieldName, JComponent component, int colSpan, int rowSpan) {
processComponent(fieldName, component);
return cell(component, cc.xywh(1, 1, colSpan, rowSpan));
}
public MauiFormBuilder cell(JComponent component, CellConstraints c) {
c.gridX = builder.getColumn();
c.gridY = builder.getRow();
boolean newRow = false;
if (c.gridWidth == COL_SPAN_ALL) {
c.gridWidth = builder.getColumnCount() - builder.getColumn() + 1;
newRow = true;
}
builder.add(component, c);
if (newRow) {
row();
} else {
builder.nextColumn(c.gridWidth);
}
return this;
}
public MauiFormBuilder cell(String fieldName, JComponent component, CellConstraints c) {
processComponent(fieldName, component);
return cell(component, c);
}
public void row() {
builder.nextLine(2);
}
public void setColumn(int column) {
builder.setColumn(column);
}
public CellConstraints cellConstraints(int colSpan, int rowSpan, Alignment colAlign, Alignment rowAlign) {
return cc.xywh(1, 1, colSpan, rowSpan, colAlign, rowAlign);
}
public CellConstraints cellConstraints(int colSpan, Alignment colAlign, Alignment rowAlign) {
return cc.xywh(1, 1, colSpan, 1, colAlign, rowAlign);
}
public CellConstraints cellConstraints(int colSpan, Alignment colAlign) {
return cc.xywh(1, 1, colSpan, 1, colAlign, CellConstraints.DEFAULT);
}
public void processComponent(String fieldName, JComponent component) {
if (interceptor != null) {
interceptor.processComponent(fieldName, component);
}
if (formName != null) {
String property = formName + "." + fieldName + ".caption";
String tooltip = MauiApplication.getMessage(property);
if (tooltip != null) {
component.setToolTipText(tooltip);
}
}
}
public JLabel createLabel(String fieldName) {
return createLabelFor(fieldName, null);
}
public JButton createButton(String fieldName) {
JButton button = getComponentFactory().createButton("");
getFormModel().getFieldFace(fieldName).configure(button);
processComponent(fieldName, button);
return button;
}
}
[/code]
The following is the code to create the attached complex form. I also used formLayoutMaker to visually create the form's layout.
[code]
public JPanel createFormControl() {
FormModel formModel = getFormModel();
//columns 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
String colSpec = "right:30dlu,3dlu,5dlu,100dlu,3dlu,right:50dlu,3dlu,10dlu,10dlu,50dlu,3dlu,right:30dlu,3dlu,10dlu,3dlu,right:65dlu,3dlu,10dlu,3dlu,right:40dlu,3dlu,right:min(10dlu;pref):grow,3dlu,max(50dlu;pref)";
//rows 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
String rowSpec = "pref,3dlu,pref,3dlu,pref,3dlu,pref,3dlu,pref,3dlu,150dlu:grow,3dlu,pref,3dlu,fill:40dlu,3dlu,pref,3dlu,pref,3dlu,pref";
MauiFormBuilder builder = new MauiFormBuilder(getBindingFactory(), colSpec, rowSpec);
mfgImage = new JPanel();
cmdClear = builder.createButton("cmdClear");
cmdDelete = builder.createButton("cmdDelete");
cmdSubmit = builder.createButton("cmdSubmit");
cmdSave = builder.createButton("cmdSave");
cmdCancel = builder.createButton("cmdCancel");
lblSignature = builder.createLabel("capture");
lblNotes = builder.createLabel("note");
//1
builder.cell(mfgImage, 5, 3);
cboMfg = new ManufacturerComboBox();
MauiComboBoxBinding cbBinding = new MauiComboBoxBinding(formModel, "order.manufacturer", cboMfg);
builder.add(cbBinding, 7);
cboShowCustOf = new SalesRepComboBox();
cbBinding = new MauiComboBoxBinding(formModel, "order.showCustomersOfSalesRep", cboShowCustOf);
builder.cellWithLabel("showCustOf", cboShowCustOf, MauiFormBuilder.COL_SPAN_ALL);
//3
builder.setColumn(6);
cboCustomer = new CustomerComboBox(order.getShowCustomersOfSalesRep());
//this keeps the control size to a minimum - otherwise the form is very wide because the control sizes to fit its data (long)
Dimension d = cboCustomer.getPreferredSize();
d.width = 300;
cboCustomer.setPreferredSize(d);
cbBinding = new MauiComboBoxBinding(formModel, "order.customer", cboCustomer);
builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
//5
builder.setColumn(6);
cboShipTo = new LocationComboBox(order.getCustomer());
cbBinding = new MauiComboBoxBinding(formModel, "order.shipToLocation", cboShipTo);
builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
//7
builder.setColumn(6);
txtPO = (JTextField) builder.add("order.purchaseOrderNumber", 7)[1];
SalesRepresentative defaultSalesRep = getCustomerManufacturerSalesRep(order.getCustomer());
cboSalesRep = new SalesRepComboBox(order.getCustomer(), defaultSalesRep);
cbBinding = new MauiComboBoxBinding(formModel, "order.salesRepresentative", cboSalesRep);
builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
//9
builder.setColumn(6);
cboSurgeon = new SurgeonComboBox();
builder.add(new ComboBoxBinding(cboSurgeon, formModel, "order.surgeonName"), 3);
txtPatient = (JTextField) builder.add("order.patientName", 5)[1];
builder.add("order.surgeryDate", MauiFormBuilder.COL_SPAN_ALL);
//11
LineItemsBinding lib = new LineItemsBinding(formModel, "genericLineItems");
builder.cell(lib.getControl(), MauiFormBuilder.COL_SPAN_ALL);
//13
builder.cell(lblSignature, builder.cellConstraints(2, CellConstraints.LEFT, CellConstraints.BOTTOM));
builder.setColumn(12);
builder.cell(lblNotes, builder.cellConstraints(1, CellConstraints.LEFT, CellConstraints.BOTTOM));
builder.setColumn(24);
builder.cell(cmdDelete);
builder.row();
//15
SignatureBinding sb = new SignatureBinding(formModel, "capture");
capture = (Capture)sb.getControl();
builder.cell("capture", capture, 10, 3);
builder.setColumn(12);
JComponent notesCtrl = createNotesBinding(formModel, builder);
builder.cell(notesCtrl, MauiFormBuilder.COL_SPAN_ALL);
//17
builder.setColumn(16);
ToggleButtonBinding tb = new ToggleButtonBinding(new JCheckBox(), formModel, "sendEmailFax");
builder.cell("sendEmailFax", tb.getControl(), builder.cellConstraints(6, CellConstraints.RIGHT));
builder.setColumn(24);
builder.cell(cmdSubmit);
builder.row();
//19
cboTitle = createTitleCombo();
builder.add(new ComboBoxBinding(cboTitle, formModel, "title"), 6);
builder.cell(cmdClear);
builder.setColumn(24);
builder.cell(cmdSave);
builder.row();
//21
cboName = createNameCombo();
builder.add(new ComboBoxBinding(cboName, formModel, "printedName"), 6);
builder.setColumn(24);
builder.cell(cmdCancel);
return builder.getForm();
}
[/code]
Fix Version/s: 1.0.2
> New form builder for creating complex forms.
> --------------------------------------------
>
> Key: RCP-567
> URL: http://jira.springframework.org/browse/RCP-567
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Dialog System
> Affects Versions: 1.0.0
> Environment: Windwos XP
> Reporter: Brad Maupin
> Fix For: 1.0.2
>
> Attachments: orderform.jpg
>
>
> The provided TableFormBuilder is only useful for very simple forms. I was able to create a form builder that extends AbstractFormBuilder and uses the jGoodies DefaultFormBuilder for layout. The main advantage of the jGoodies form builder is the ability to override the default layout's column span and orientation in a cell on a control by control basis. It is also nice to be able to specify the column and row definitions each in one (long) string. The builder also allowed me to create a complex form that also resized sensibly (which was a major priority).
> Here is my form builder. It has the provisions to create the complex form in the attached screen shot. The functionality it provides was catered to my needs and therefore I'd expect it to be changed as necessary to be general and follow common guidelines. The "add" methods create labels for the new controls and the "cell" methods only perform layout. Column spans can be overridden by either specifying a column span value other than 1 and by using CellConstraints. The use of CellConstraints also provides the means to override cell alignment for the control being layed out. For convenience the column span value can be specified to "extend to the last column". The builder will automatically commit the row when the column span is specified as such.
> One minor downside to this implementation is that gap column and row sizes must be specified. This impl does allow defining different gaps. The builder could easy insert the gap values into the row spec, but my form requires specifying the column gaps since they are not regularly placed.
> [code]
> import javax.swing.JButton;
> import javax.swing.JComponent;
> import javax.swing.JLabel;
> import javax.swing.JPanel;
> import net.mobileworkforce.maui.app.MauiApplication;
> import org.springframework.richclient.form.binding.Binding;
> import org.springframework.richclient.form.binding.BindingFactory;
> import org.springframework.richclient.form.builder.AbstractFormBuilder;
> import org.springframework.richclient.form.builder.FormComponentInterceptor;
> import org.springframework.util.Assert;
> import com.jgoodies.forms.builder.DefaultFormBuilder;
> import com.jgoodies.forms.layout.CellConstraints;
> import com.jgoodies.forms.layout.FormLayout;
> import com.jgoodies.forms.layout.CellConstraints.Alignment;
> public class MauiFormBuilder extends AbstractFormBuilder {
>
> public static final int COL_SPAN_ALL = 0;
> protected FormLayout layout;
> protected DefaultFormBuilder builder;
> protected CellConstraints cc = new CellConstraints();
> protected FormComponentInterceptor interceptor;
> private String formName = null;
> protected MauiFormBuilder(BindingFactory bindingFactory, String colSpec, String rowSpec) {
> super(bindingFactory);
> layout = new FormLayout(colSpec, rowSpec);
> builder = new DefaultFormBuilder(layout);
> interceptor = getFormComponentInterceptor();
> }
> public JPanel getForm() {
> return builder.getPanel();
> }
>
> public void setFormPropertyName(String name) {
> formName = name;
> }
>
> public JComponent[] add(Binding binding, int colSpan, int rowSpan) {
> Assert.notNull(binding, "binding is null");
> Assert.isTrue(getFormModel() == binding.getFormModel(),
> "Binding's form model must match FormBuilder's form model");
> JComponent component = binding.getControl();
> processComponent(binding.getProperty(), component);
> final JLabel label = createLabelFor(binding.getProperty(), component);
> builder.append(label);
> boolean newRow = false;
> if (colSpan == COL_SPAN_ALL) {
> colSpan = builder.getColumnCount() - builder.getColumn() + 1;
> newRow = true;
> }
> builder.setRowSpan(rowSpan);
> builder.append(component, colSpan);
> builder.setRowSpan(1);
> if (newRow) {
> row();
> }
> return new JComponent[] { label, component };
> }
> public JComponent[] add(Binding binding, int colSpan) {
> return add(binding, colSpan, 1);
> }
>
> public JComponent[] add(String fieldName) {
> return add(fieldName, 1);
> }
> public JComponent[] add(String fieldName, int colSpan) {
> return add(createDefaultBinding(fieldName), colSpan);
> }
>
> public JComponent cellWithLabel(String labelProperty, JComponent component, int colSpan) {
> boolean newRow = false;
> if (colSpan == COL_SPAN_ALL) {
> colSpan = builder.getColumnCount() - builder.getColumn() + 1 - 2;
> newRow = true;
> }
> processComponent(labelProperty, component);
> final JLabel label = createLabelFor(labelProperty, component);
> builder.append(label);
> builder.append(component, colSpan);
> if (newRow) {
> row();
> }
> return label;
> }
>
> public MauiFormBuilder cell(JComponent component) {
> builder.append(component);
> return this;
> }
>
> public MauiFormBuilder cell(JComponent component, int colSpan) {
> return cell(component, cc.xyw(1, 1, colSpan));
> }
> public MauiFormBuilder cell(String fieldName, JComponent component, int colSpan) {
> processComponent(fieldName, component);
> return cell(component, cc.xyw(1, 1, colSpan));
> }
> public MauiFormBuilder cell(JComponent component, int colSpan, int rowSpan) {
> return cell(component, cc.xywh(1, 1, colSpan, rowSpan));
> }
>
> public MauiFormBuilder cell(String fieldName, JComponent component, int colSpan, int rowSpan) {
> processComponent(fieldName, component);
> return cell(component, cc.xywh(1, 1, colSpan, rowSpan));
> }
>
> public MauiFormBuilder cell(JComponent component, CellConstraints c) {
> c.gridX = builder.getColumn();
> c.gridY = builder.getRow();
> boolean newRow = false;
> if (c.gridWidth == COL_SPAN_ALL) {
> c.gridWidth = builder.getColumnCount() - builder.getColumn() + 1;
> newRow = true;
> }
> builder.add(component, c);
> if (newRow) {
> row();
> } else {
> builder.nextColumn(c.gridWidth);
> }
> return this;
> }
>
> public MauiFormBuilder cell(String fieldName, JComponent component, CellConstraints c) {
> processComponent(fieldName, component);
> return cell(component, c);
> }
>
> public void row() {
> builder.nextLine(2);
> }
>
> public void setColumn(int column) {
> builder.setColumn(column);
> }
>
> public CellConstraints cellConstraints(int colSpan, int rowSpan, Alignment colAlign, Alignment rowAlign) {
> return cc.xywh(1, 1, colSpan, rowSpan, colAlign, rowAlign);
> }
> public CellConstraints cellConstraints(int colSpan, Alignment colAlign, Alignment rowAlign) {
> return cc.xywh(1, 1, colSpan, 1, colAlign, rowAlign);
> }
> public CellConstraints cellConstraints(int colSpan, Alignment colAlign) {
> return cc.xywh(1, 1, colSpan, 1, colAlign, CellConstraints.DEFAULT);
> }
> public void processComponent(String fieldName, JComponent component) {
> if (interceptor != null) {
> interceptor.processComponent(fieldName, component);
> }
> if (formName != null) {
> String property = formName + "." + fieldName + ".caption";
> String tooltip = MauiApplication.getMessage(property);
> if (tooltip != null) {
> component.setToolTipText(tooltip);
> }
> }
> }
>
> public JLabel createLabel(String fieldName) {
> return createLabelFor(fieldName, null);
> }
>
> public JButton createButton(String fieldName) {
> JButton button = getComponentFactory().createButton("");
> getFormModel().getFieldFace(fieldName).configure(button);
> processComponent(fieldName, button);
> return button;
> }
>
> }
> [/code]
> The following is the code to create the attached complex form. I also used formLayoutMaker to visually create the form's layout.
> [code]
> public JPanel createFormControl() {
> FormModel formModel = getFormModel();
>
> //columns 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
> String colSpec = "right:30dlu,3dlu,5dlu,100dlu,3dlu,right:50dlu,3dlu,10dlu,10dlu,50dlu,3dlu,right:30dlu,3dlu,10dlu,3dlu,right:65dlu,3dlu,10dlu,3dlu,right:40dlu,3dlu,right:min(10dlu;pref):grow,3dlu,max(50dlu;pref)";
> //rows 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
> String rowSpec = "pref,3dlu,pref,3dlu,pref,3dlu,pref,3dlu,pref,3dlu,150dlu:grow,3dlu,pref,3dlu,fill:40dlu,3dlu,pref,3dlu,pref,3dlu,pref";
> MauiFormBuilder builder = new MauiFormBuilder(getBindingFactory(), colSpec, rowSpec);
>
> mfgImage = new JPanel();
> cmdClear = builder.createButton("cmdClear");
> cmdDelete = builder.createButton("cmdDelete");
> cmdSubmit = builder.createButton("cmdSubmit");
> cmdSave = builder.createButton("cmdSave");
> cmdCancel = builder.createButton("cmdCancel");
> lblSignature = builder.createLabel("capture");
> lblNotes = builder.createLabel("note");
>
> //1
> builder.cell(mfgImage, 5, 3);
> cboMfg = new ManufacturerComboBox();
> MauiComboBoxBinding cbBinding = new MauiComboBoxBinding(formModel, "order.manufacturer", cboMfg);
> builder.add(cbBinding, 7);
> cboShowCustOf = new SalesRepComboBox();
> cbBinding = new MauiComboBoxBinding(formModel, "order.showCustomersOfSalesRep", cboShowCustOf);
> builder.cellWithLabel("showCustOf", cboShowCustOf, MauiFormBuilder.COL_SPAN_ALL);
>
> //3
> builder.setColumn(6);
> cboCustomer = new CustomerComboBox(order.getShowCustomersOfSalesRep());
> //this keeps the control size to a minimum - otherwise the form is very wide because the control sizes to fit its data (long)
> Dimension d = cboCustomer.getPreferredSize();
> d.width = 300;
> cboCustomer.setPreferredSize(d);
> cbBinding = new MauiComboBoxBinding(formModel, "order.customer", cboCustomer);
> builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
>
> //5
> builder.setColumn(6);
> cboShipTo = new LocationComboBox(order.getCustomer());
> cbBinding = new MauiComboBoxBinding(formModel, "order.shipToLocation", cboShipTo);
> builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
>
> //7
> builder.setColumn(6);
> txtPO = (JTextField) builder.add("order.purchaseOrderNumber", 7)[1];
>
> SalesRepresentative defaultSalesRep = getCustomerManufacturerSalesRep(order.getCustomer());
> cboSalesRep = new SalesRepComboBox(order.getCustomer(), defaultSalesRep);
> cbBinding = new MauiComboBoxBinding(formModel, "order.salesRepresentative", cboSalesRep);
> builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
>
> //9
> builder.setColumn(6);
> cboSurgeon = new SurgeonComboBox();
> builder.add(new ComboBoxBinding(cboSurgeon, formModel, "order.surgeonName"), 3);
> txtPatient = (JTextField) builder.add("order.patientName", 5)[1];
> builder.add("order.surgeryDate", MauiFormBuilder.COL_SPAN_ALL);
>
> //11
> LineItemsBinding lib = new LineItemsBinding(formModel, "genericLineItems");
> builder.cell(lib.getControl(), MauiFormBuilder.COL_SPAN_ALL);
>
> //13
> builder.cell(lblSignature, builder.cellConstraints(2, CellConstraints.LEFT, CellConstraints.BOTTOM));
> builder.setColumn(12);
> builder.cell(lblNotes, builder.cellConstraints(1, CellConstraints.LEFT, CellConstraints.BOTTOM));
> builder.setColumn(24);
> builder.cell(cmdDelete);
> builder.row();
>
> //15
> SignatureBinding sb = new SignatureBinding(formModel, "capture");
> capture = (Capture)sb.getControl();
> builder.cell("capture", capture, 10, 3);
> builder.setColumn(12);
> JComponent notesCtrl = createNotesBinding(formModel, builder);
> builder.cell(notesCtrl, MauiFormBuilder.COL_SPAN_ALL);
>
> //17
> builder.setColumn(16);
> ToggleButtonBinding tb = new ToggleButtonBinding(new JCheckBox(), formModel, "sendEmailFax");
> builder.cell("sendEmailFax", tb.getControl(), builder.cellConstraints(6, CellConstraints.RIGHT));
> builder.setColumn(24);
> builder.cell(cmdSubmit);
> builder.row();
>
> //19
> cboTitle = createTitleCombo();
> builder.add(new ComboBoxBinding(cboTitle, formModel, "title"), 6);
> builder.cell(cmdClear);
> builder.setColumn(24);
> builder.cell(cmdSave);
> builder.row();
>
> //21
> cboName = createNameCombo();
> builder.add(new ComboBoxBinding(cboName, formModel, "printedName"), 6);
> builder.setColumn(24);
> builder.cell(cmdCancel);
>
> return builder.getForm();
> }
> [/code]
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:26:24
|
[ http://jira.springframework.org/browse/RCP-567?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=40219#action_40219 ]
Lieven Doclo commented on RCP-567:
----------------------------------
In the next version, an extended form builder will be added
> New form builder for creating complex forms.
> --------------------------------------------
>
> Key: RCP-567
> URL: http://jira.springframework.org/browse/RCP-567
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Dialog System
> Affects Versions: 1.0.0
> Environment: Windwos XP
> Reporter: Brad Maupin
> Fix For: 1.0.2
>
> Attachments: orderform.jpg
>
>
> The provided TableFormBuilder is only useful for very simple forms. I was able to create a form builder that extends AbstractFormBuilder and uses the jGoodies DefaultFormBuilder for layout. The main advantage of the jGoodies form builder is the ability to override the default layout's column span and orientation in a cell on a control by control basis. It is also nice to be able to specify the column and row definitions each in one (long) string. The builder also allowed me to create a complex form that also resized sensibly (which was a major priority).
> Here is my form builder. It has the provisions to create the complex form in the attached screen shot. The functionality it provides was catered to my needs and therefore I'd expect it to be changed as necessary to be general and follow common guidelines. The "add" methods create labels for the new controls and the "cell" methods only perform layout. Column spans can be overridden by either specifying a column span value other than 1 and by using CellConstraints. The use of CellConstraints also provides the means to override cell alignment for the control being layed out. For convenience the column span value can be specified to "extend to the last column". The builder will automatically commit the row when the column span is specified as such.
> One minor downside to this implementation is that gap column and row sizes must be specified. This impl does allow defining different gaps. The builder could easy insert the gap values into the row spec, but my form requires specifying the column gaps since they are not regularly placed.
> [code]
> import javax.swing.JButton;
> import javax.swing.JComponent;
> import javax.swing.JLabel;
> import javax.swing.JPanel;
> import net.mobileworkforce.maui.app.MauiApplication;
> import org.springframework.richclient.form.binding.Binding;
> import org.springframework.richclient.form.binding.BindingFactory;
> import org.springframework.richclient.form.builder.AbstractFormBuilder;
> import org.springframework.richclient.form.builder.FormComponentInterceptor;
> import org.springframework.util.Assert;
> import com.jgoodies.forms.builder.DefaultFormBuilder;
> import com.jgoodies.forms.layout.CellConstraints;
> import com.jgoodies.forms.layout.FormLayout;
> import com.jgoodies.forms.layout.CellConstraints.Alignment;
> public class MauiFormBuilder extends AbstractFormBuilder {
>
> public static final int COL_SPAN_ALL = 0;
> protected FormLayout layout;
> protected DefaultFormBuilder builder;
> protected CellConstraints cc = new CellConstraints();
> protected FormComponentInterceptor interceptor;
> private String formName = null;
> protected MauiFormBuilder(BindingFactory bindingFactory, String colSpec, String rowSpec) {
> super(bindingFactory);
> layout = new FormLayout(colSpec, rowSpec);
> builder = new DefaultFormBuilder(layout);
> interceptor = getFormComponentInterceptor();
> }
> public JPanel getForm() {
> return builder.getPanel();
> }
>
> public void setFormPropertyName(String name) {
> formName = name;
> }
>
> public JComponent[] add(Binding binding, int colSpan, int rowSpan) {
> Assert.notNull(binding, "binding is null");
> Assert.isTrue(getFormModel() == binding.getFormModel(),
> "Binding's form model must match FormBuilder's form model");
> JComponent component = binding.getControl();
> processComponent(binding.getProperty(), component);
> final JLabel label = createLabelFor(binding.getProperty(), component);
> builder.append(label);
> boolean newRow = false;
> if (colSpan == COL_SPAN_ALL) {
> colSpan = builder.getColumnCount() - builder.getColumn() + 1;
> newRow = true;
> }
> builder.setRowSpan(rowSpan);
> builder.append(component, colSpan);
> builder.setRowSpan(1);
> if (newRow) {
> row();
> }
> return new JComponent[] { label, component };
> }
> public JComponent[] add(Binding binding, int colSpan) {
> return add(binding, colSpan, 1);
> }
>
> public JComponent[] add(String fieldName) {
> return add(fieldName, 1);
> }
> public JComponent[] add(String fieldName, int colSpan) {
> return add(createDefaultBinding(fieldName), colSpan);
> }
>
> public JComponent cellWithLabel(String labelProperty, JComponent component, int colSpan) {
> boolean newRow = false;
> if (colSpan == COL_SPAN_ALL) {
> colSpan = builder.getColumnCount() - builder.getColumn() + 1 - 2;
> newRow = true;
> }
> processComponent(labelProperty, component);
> final JLabel label = createLabelFor(labelProperty, component);
> builder.append(label);
> builder.append(component, colSpan);
> if (newRow) {
> row();
> }
> return label;
> }
>
> public MauiFormBuilder cell(JComponent component) {
> builder.append(component);
> return this;
> }
>
> public MauiFormBuilder cell(JComponent component, int colSpan) {
> return cell(component, cc.xyw(1, 1, colSpan));
> }
> public MauiFormBuilder cell(String fieldName, JComponent component, int colSpan) {
> processComponent(fieldName, component);
> return cell(component, cc.xyw(1, 1, colSpan));
> }
> public MauiFormBuilder cell(JComponent component, int colSpan, int rowSpan) {
> return cell(component, cc.xywh(1, 1, colSpan, rowSpan));
> }
>
> public MauiFormBuilder cell(String fieldName, JComponent component, int colSpan, int rowSpan) {
> processComponent(fieldName, component);
> return cell(component, cc.xywh(1, 1, colSpan, rowSpan));
> }
>
> public MauiFormBuilder cell(JComponent component, CellConstraints c) {
> c.gridX = builder.getColumn();
> c.gridY = builder.getRow();
> boolean newRow = false;
> if (c.gridWidth == COL_SPAN_ALL) {
> c.gridWidth = builder.getColumnCount() - builder.getColumn() + 1;
> newRow = true;
> }
> builder.add(component, c);
> if (newRow) {
> row();
> } else {
> builder.nextColumn(c.gridWidth);
> }
> return this;
> }
>
> public MauiFormBuilder cell(String fieldName, JComponent component, CellConstraints c) {
> processComponent(fieldName, component);
> return cell(component, c);
> }
>
> public void row() {
> builder.nextLine(2);
> }
>
> public void setColumn(int column) {
> builder.setColumn(column);
> }
>
> public CellConstraints cellConstraints(int colSpan, int rowSpan, Alignment colAlign, Alignment rowAlign) {
> return cc.xywh(1, 1, colSpan, rowSpan, colAlign, rowAlign);
> }
> public CellConstraints cellConstraints(int colSpan, Alignment colAlign, Alignment rowAlign) {
> return cc.xywh(1, 1, colSpan, 1, colAlign, rowAlign);
> }
> public CellConstraints cellConstraints(int colSpan, Alignment colAlign) {
> return cc.xywh(1, 1, colSpan, 1, colAlign, CellConstraints.DEFAULT);
> }
> public void processComponent(String fieldName, JComponent component) {
> if (interceptor != null) {
> interceptor.processComponent(fieldName, component);
> }
> if (formName != null) {
> String property = formName + "." + fieldName + ".caption";
> String tooltip = MauiApplication.getMessage(property);
> if (tooltip != null) {
> component.setToolTipText(tooltip);
> }
> }
> }
>
> public JLabel createLabel(String fieldName) {
> return createLabelFor(fieldName, null);
> }
>
> public JButton createButton(String fieldName) {
> JButton button = getComponentFactory().createButton("");
> getFormModel().getFieldFace(fieldName).configure(button);
> processComponent(fieldName, button);
> return button;
> }
>
> }
> [/code]
> The following is the code to create the attached complex form. I also used formLayoutMaker to visually create the form's layout.
> [code]
> public JPanel createFormControl() {
> FormModel formModel = getFormModel();
>
> //columns 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
> String colSpec = "right:30dlu,3dlu,5dlu,100dlu,3dlu,right:50dlu,3dlu,10dlu,10dlu,50dlu,3dlu,right:30dlu,3dlu,10dlu,3dlu,right:65dlu,3dlu,10dlu,3dlu,right:40dlu,3dlu,right:min(10dlu;pref):grow,3dlu,max(50dlu;pref)";
> //rows 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
> String rowSpec = "pref,3dlu,pref,3dlu,pref,3dlu,pref,3dlu,pref,3dlu,150dlu:grow,3dlu,pref,3dlu,fill:40dlu,3dlu,pref,3dlu,pref,3dlu,pref";
> MauiFormBuilder builder = new MauiFormBuilder(getBindingFactory(), colSpec, rowSpec);
>
> mfgImage = new JPanel();
> cmdClear = builder.createButton("cmdClear");
> cmdDelete = builder.createButton("cmdDelete");
> cmdSubmit = builder.createButton("cmdSubmit");
> cmdSave = builder.createButton("cmdSave");
> cmdCancel = builder.createButton("cmdCancel");
> lblSignature = builder.createLabel("capture");
> lblNotes = builder.createLabel("note");
>
> //1
> builder.cell(mfgImage, 5, 3);
> cboMfg = new ManufacturerComboBox();
> MauiComboBoxBinding cbBinding = new MauiComboBoxBinding(formModel, "order.manufacturer", cboMfg);
> builder.add(cbBinding, 7);
> cboShowCustOf = new SalesRepComboBox();
> cbBinding = new MauiComboBoxBinding(formModel, "order.showCustomersOfSalesRep", cboShowCustOf);
> builder.cellWithLabel("showCustOf", cboShowCustOf, MauiFormBuilder.COL_SPAN_ALL);
>
> //3
> builder.setColumn(6);
> cboCustomer = new CustomerComboBox(order.getShowCustomersOfSalesRep());
> //this keeps the control size to a minimum - otherwise the form is very wide because the control sizes to fit its data (long)
> Dimension d = cboCustomer.getPreferredSize();
> d.width = 300;
> cboCustomer.setPreferredSize(d);
> cbBinding = new MauiComboBoxBinding(formModel, "order.customer", cboCustomer);
> builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
>
> //5
> builder.setColumn(6);
> cboShipTo = new LocationComboBox(order.getCustomer());
> cbBinding = new MauiComboBoxBinding(formModel, "order.shipToLocation", cboShipTo);
> builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
>
> //7
> builder.setColumn(6);
> txtPO = (JTextField) builder.add("order.purchaseOrderNumber", 7)[1];
>
> SalesRepresentative defaultSalesRep = getCustomerManufacturerSalesRep(order.getCustomer());
> cboSalesRep = new SalesRepComboBox(order.getCustomer(), defaultSalesRep);
> cbBinding = new MauiComboBoxBinding(formModel, "order.salesRepresentative", cboSalesRep);
> builder.add(cbBinding, MauiFormBuilder.COL_SPAN_ALL);
>
> //9
> builder.setColumn(6);
> cboSurgeon = new SurgeonComboBox();
> builder.add(new ComboBoxBinding(cboSurgeon, formModel, "order.surgeonName"), 3);
> txtPatient = (JTextField) builder.add("order.patientName", 5)[1];
> builder.add("order.surgeryDate", MauiFormBuilder.COL_SPAN_ALL);
>
> //11
> LineItemsBinding lib = new LineItemsBinding(formModel, "genericLineItems");
> builder.cell(lib.getControl(), MauiFormBuilder.COL_SPAN_ALL);
>
> //13
> builder.cell(lblSignature, builder.cellConstraints(2, CellConstraints.LEFT, CellConstraints.BOTTOM));
> builder.setColumn(12);
> builder.cell(lblNotes, builder.cellConstraints(1, CellConstraints.LEFT, CellConstraints.BOTTOM));
> builder.setColumn(24);
> builder.cell(cmdDelete);
> builder.row();
>
> //15
> SignatureBinding sb = new SignatureBinding(formModel, "capture");
> capture = (Capture)sb.getControl();
> builder.cell("capture", capture, 10, 3);
> builder.setColumn(12);
> JComponent notesCtrl = createNotesBinding(formModel, builder);
> builder.cell(notesCtrl, MauiFormBuilder.COL_SPAN_ALL);
>
> //17
> builder.setColumn(16);
> ToggleButtonBinding tb = new ToggleButtonBinding(new JCheckBox(), formModel, "sendEmailFax");
> builder.cell("sendEmailFax", tb.getControl(), builder.cellConstraints(6, CellConstraints.RIGHT));
> builder.setColumn(24);
> builder.cell(cmdSubmit);
> builder.row();
>
> //19
> cboTitle = createTitleCombo();
> builder.add(new ComboBoxBinding(cboTitle, formModel, "title"), 6);
> builder.cell(cmdClear);
> builder.setColumn(24);
> builder.cell(cmdSave);
> builder.row();
>
> //21
> cboName = createNameCombo();
> builder.add(new ComboBoxBinding(cboName, formModel, "printedName"), 6);
> builder.setColumn(24);
> builder.cell(cmdCancel);
>
> return builder.getForm();
> }
> [/code]
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:26:20
|
[ http://jira.springframework.org/browse/RCP-560?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-560:
-----------------------------
Fix Version/s: 1.x
> Form model show be able to give dirty information in the form object with more granularity
> ------------------------------------------------------------------------------------------
>
> Key: RCP-560
> URL: http://jira.springframework.org/browse/RCP-560
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Binding System
> Affects Versions: 0.2.1
> Reporter: Jonathan Erlich
> Assignee: Lieven Doclo
> Priority: Minor
> Fix For: 1.x
>
>
> I have a form that extends from AbstractForm, and when i do commit i want to show a particular message..
> Currently I check the ValidatingFormModel's isDirty message to know if the model is dirty to know whether to show the message or not.
> The problem is that what i need is to show that message only if some particular o particulars properties have been changed.
> I could manage the changes by myself by knowing the current and the old objects but if i have a lot of forms this becomes rather difficult.
> I've seen the source code and it seems like AbstractFormModel has a private Set with the changed properties.. maybe if this map is exposed somehow i could do what i need.
> If there's a simpler way to do it that i'm not aware of please tell me
> Thanks
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:26:19
|
[ http://jira.springframework.org/browse/RCP-566?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-566:
-----------------------------
Fix Version/s: 1.x
> Hide splash screen before showing main application window.
> ----------------------------------------------------------
>
> Key: RCP-566
> URL: http://jira.springframework.org/browse/RCP-566
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Application Framework
> Affects Versions: 1.0.0
> Environment: Windows XP
> Reporter: Brad Maupin
> Priority: Minor
> Fix For: 1.x
>
>
> My application first displays a login form before displaying the main application window. The splash screen is still visible when the login form is displayed. It would be nice to be able to hide the splash screen before showing the login form.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:26:19
|
[ http://jira.springframework.org/browse/RCP-565?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-565:
-----------------------------
Fix Version/s: 1.x
> Windows taskbar entry at startup is not configured
> --------------------------------------------------
>
> Key: RCP-565
> URL: http://jira.springframework.org/browse/RCP-565
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Application Framework
> Affects Versions: 1.0.0
> Environment: Windows XP
> Reporter: Brad Maupin
> Assignee: Lieven Doclo
> Fix For: 1.x
>
>
> During application startup the application entry in Windows' task bar is blank and shows the Java icon - I'd like it to show the application's name and icon. Of course it would be fine to be able to set these seperately from the main window.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:24:19
|
[ http://jira.springframework.org/browse/RCP-568?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-568:
-----------------------------
Fix Version/s: 1.0.2
> ShowFrameCommand does not restore the MDI frame if minimized.
> -------------------------------------------------------------
>
> Key: RCP-568
> URL: http://jira.springframework.org/browse/RCP-568
> Project: Spring Framework Rich Client Project
> Issue Type: Bug
> Affects Versions: 1.0.0
> Reporter: Benoit Xhenseval
> Priority: Minor
> Fix For: 1.0.2
>
> Attachments: ShowFrameCommand.java.patch
>
>
> Hi
> Trivial issue, probably for Peter, if the MDI frame is minimized, using the right-click menu on the desktop to re-select the frame does not restore /de-iconify the frame.
> Patch in ShowFrameCommand, simply add setIcon(false).
> protected void doExecuteCommand() {
> try {
> frame.setSelected( true );
> frame.setIcon( false );
> } catch( PropertyVetoException e ) {
> // ignore
> }
> }
> I will provide a SVN patch.
> Thanks!
> Benoit
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:24:19
|
[ http://jira.springframework.org/browse/RCP-570?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-570:
-----------------------------
Fix Version/s: 1.x
> ListSelectionDialog should be configurable if it supports null values
> ---------------------------------------------------------------------
>
> Key: RCP-570
> URL: http://jira.springframework.org/browse/RCP-570
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Dialog System
> Affects Versions: 1.0.0
> Reporter: Johannes Schneider
> Fix For: 1.x
>
> Attachments: nullableListSelectionDialog.patch
>
>
> I would like to configure whether a list selection dialog binding supports null values. Depending on that configuration the button with the "x" should be shown or hidden.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:22:18
|
[ http://jira.springframework.org/browse/RCP-571?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-571:
-----------------------------
Fix Version/s: 1.x
> ShuttleBinder does not update dirty property correctly
> ------------------------------------------------------
>
> Key: RCP-571
> URL: http://jira.springframework.org/browse/RCP-571
> Project: Spring Framework Rich Client Project
> Issue Type: Bug
> Components: Binding System
> Affects Versions: 1.0.0
> Reporter: Benoit Xhenseval
> Assignee: Lieven Doclo
> Fix For: 1.x
>
>
> Hi
> I'm facing the following problems:
> - When loading an object and doing a ValidationFormModel.setFormObject(myobject); The ShuttleList will trigger a DIRTY = true on the model although nothing has changed!
> - Furthermore, if the original selected list is NOT empty at the beginning and then an item is added (moved left to right) to the selected list, the DIRTY attribute is NOT changed to true (the set has changed! if you commit the model, your object has changed!).
> Has anyone seen this / anyone got a fix?
> Thanks
> Benoit.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:20:18
|
[ http://jira.springframework.org/browse/RCP-572?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-572:
-----------------------------
Fix Version/s: 1.0.2
> Validation icons are not displayed for JTextArea inside JScrollPane
> -------------------------------------------------------------------
>
> Key: RCP-572
> URL: http://jira.springframework.org/browse/RCP-572
> Project: Spring Framework Rich Client Project
> Issue Type: Bug
> Components: Helper Classes
> Affects Versions: 1.0.0
> Environment: JDK5, Win XP
> Reporter: Andreas Kuhtz
> Fix For: 1.0.2
>
> Attachments: OverlayHelperPatch.txt
>
>
> The OverlayHelper does not display the validation icons if a JTextArea is inside a JScrollPane. The attached patch solves this problem.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:18:19
|
[ http://jira.springframework.org/browse/RCP-559?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-559:
-----------------------------
Fix Version/s: 1.0.2
> Clean Shutdown due to exception...
> ----------------------------------
>
> Key: RCP-559
> URL: http://jira.springframework.org/browse/RCP-559
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Application Framework
> Affects Versions: 1.0.0
> Reporter: Benoit Xhenseval
> Priority: Minor
> Fix For: 1.0.2
>
> Attachments: Application.java.patch
>
>
> As discussed with Geoffrey and on the forum:
> http://forum.springframework.org/showthread.php?t=55945
> At the moment, it is not possible to detect a forced shutdown due to an exception; if the application implements a method onPreWindowClose in DefaultApplicationLifecycleAdvisor to ask the user if they are sure that they want to close the window, the application should not ask this question, furthermore at the moment, the results are ignored
> I would like to submit a patch on Application which will keep the state "forceShutdown" when the Application.close(true, n) is called.
> The method onPreWindowClose can then query this flag.
> I believe it is reasonable and increase the flexibility.
> Thanks for considering it
> Benoit
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:16:29
|
[ http://jira.springframework.org/browse/RCP-108?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-108:
-----------------------------
Fix Version/s: (was: 1.0.1)
1.0.2
> Add collection support to FormModel architecture
> ------------------------------------------------
>
> Key: RCP-108
> URL: http://jira.springframework.org/browse/RCP-108
> Project: Spring Framework Rich Client Project
> Issue Type: New Feature
> Components: Binding System
> Reporter: Scott Russell
> Assignee: Oliver Hutchison
> Fix For: 1.0.2
>
>
> Currently, the creation of Forms and FormModels centres around a single form object being edited. Validation and commit/revert logic also revolve around this principle.
> At least two use cases exist where one would want to have a FormModel wrapping a collection of form objects, rather than a single form object.
> a) User edits a (top-level) collection of form objects (eg. in an editable JTable), then wants to commit/revert all edited objects. Validation rules should be able to apply to all elements in collection, and to the collection as a whole. Thus validation feedback, and form guards, can be aware of validation state of all form objects.
> b) User edits a top-level form object, which has a (detail) property of type Collection. This property could for example be displayed in an editable JTable (or JTree or TreeTable). Validation rules should be able to be applied to all elements in the collection individually, and to the collection as a whole (eg. size must > 1, etc). This allows for validation feedback and enablement/disablement of form guards.
> -Scott
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:16:26
|
[ http://jira.springframework.org/browse/RCP-164?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-164:
-----------------------------
Fix Version/s: (was: 1.0.1)
1.0.2
> Improve abstraction of Application.services and Application.instance singletons
> -------------------------------------------------------------------------------
>
> Key: RCP-164
> URL: http://jira.springframework.org/browse/RCP-164
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Application Framework
> Reporter: Oliver Hutchison
> Assignee: Oliver Hutchison
> Fix For: 1.0.2
>
>
> We need to make these 2 singleton service locators *much* more abstract so that it's possible to use the various components of Spring Rich independently.
>
> As a first step I think we should move Application.services into it's own class so you can have services with out requiring an Application we should then extract and ApplicationServices interface and remove all of the strongly typed getters replacing them with a single getService(Class serviceClass) method and ideally we should also start pushing the use of ApplicationObjectConfigurer by having ApplicationServices extend this interface.
> A similar set of refatorings should also be applied to Application.instance
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:16:26
|
[ http://jira.springframework.org/browse/RCP-211?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-211:
-----------------------------
Fix Version/s: (was: 1.0.1)
1.0.2
> Write step by step guide to using binding system
> ------------------------------------------------
>
> Key: RCP-211
> URL: http://jira.springframework.org/browse/RCP-211
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Documentation
> Reporter: Oliver Hutchison
> Assignee: Oliver Hutchison
> Fix For: 1.0.2
>
>
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:16:26
|
[ http://jira.springframework.org/browse/RCP-169?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-169:
-----------------------------
Fix Version/s: (was: 1.0.1)
1.0.2
> Add/remove a ValueChangeListener to all valueModels of a formModel
> ------------------------------------------------------------------
>
> Key: RCP-169
> URL: http://jira.springframework.org/browse/RCP-169
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Binding System
> Reporter: Jan Hoskens
> Assignee: Oliver Hutchison
> Fix For: 1.0.2
>
> Attachments: patch-RCP-169-fix.txt
>
>
> Add/remove a valuechangelistener to all valueModels of a formModel instead of a specific property.
> Sometimes any change in a FormObject should trigger an event, so instead of coupling the listener to each property explicitly you can choose to attach it to each property of the FormObject.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:16:25
|
[ http://jira.springframework.org/browse/RCP-210?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-210:
-----------------------------
Fix Version/s: (was: 1.0.1)
1.0.2
> Abstract out Swing dependancy from binding system
> -------------------------------------------------
>
> Key: RCP-210
> URL: http://jira.springframework.org/browse/RCP-210
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Binding System
> Reporter: Oliver Hutchison
> Assignee: Oliver Hutchison
> Fix For: 1.0.2
>
>
> The core form model and binding system should be totaly independent of any specific GUI framework.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:16:25
|
[ http://jira.springframework.org/browse/RCP-183?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-183:
-----------------------------
Fix Version/s: (was: 1.0.1)
1.0.2
> Pluggable Null property path handling
> -------------------------------------
>
> Key: RCP-183
> URL: http://jira.springframework.org/browse/RCP-183
> Project: Spring Framework Rich Client Project
> Issue Type: New Feature
> Components: Binding System
> Reporter: Oliver Hutchison
> Assignee: Oliver Hutchison
> Fix For: 1.0.2
>
>
> We need to provide a strategy that allows end users to implement their own null property path handling.
> Once we have implemented a solution to RCP-182 I believe this should be fairly simple as this "no value" idea would also dovetails in with the null property path handing. You could have the property access strategy return NoValue for nested properties whose parent is null or NoValue rather than throwing an exception like they do now. You could even extend this so that when you try to write a new value to one of these NoValue properties the property access strategy then uses some MissingParentPropertyStrategy to try and instantiate the parent so that the write can be successful, this would also mean that the parent property would only get instantiated if one of its child properties was written to.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:16:25
|
[ http://jira.springframework.org/browse/RCP-182?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-182:
-----------------------------
Fix Version/s: (was: 1.0.1)
1.0.2
> Support for "no value"
> ----------------------
>
> Key: RCP-182
> URL: http://jira.springframework.org/browse/RCP-182
> Project: Spring Framework Rich Client Project
> Issue Type: New Feature
> Components: Binding System
> Reporter: Oliver Hutchison
> Assignee: Oliver Hutchison
> Fix For: 1.0.2
>
>
> We need a way to tell a form model that it currently represents "no value". A form with "no value" being a form that does not have a backing object.
> The question is how do we represent this? I'd imagine we could simply introduce a new class NoValue which when set into a form model causes all of the form model's property values to also become NoValue, you'd then need some logic in the bindings to detect no value so that they can modify themselves to display "nothing" however is appropriate.
> This idea can also be extended to the form's properties .
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:16:24
|
[ http://jira.springframework.org/browse/RCP-212?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-212:
-----------------------------
Fix Version/s: (was: 1.0.1)
1.0.2
> Full JavaDocs for all binding module classes
> --------------------------------------------
>
> Key: RCP-212
> URL: http://jira.springframework.org/browse/RCP-212
> Project: Spring Framework Rich Client Project
> Issue Type: Improvement
> Components: Binding System, Documentation
> Reporter: Oliver Hutchison
> Assignee: Oliver Hutchison
> Fix For: 1.0.2
>
>
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:16:23
|
[ http://jira.springframework.org/browse/RCP-236?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-236:
-----------------------------
Fix Version/s: (was: 1.0.1)
1.0.2
> Promote Master/Detail forms from sandbox to src
> -----------------------------------------------
>
> Key: RCP-236
> URL: http://jira.springframework.org/browse/RCP-236
> Project: Spring Framework Rich Client Project
> Issue Type: New Feature
> Reporter: Larry Streepy
> Assignee: Larry Streepy
> Fix For: 1.0.2
>
>
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:16:23
|
[ http://jira.springframework.org/browse/RCP-214?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-214:
-----------------------------
Fix Version/s: (was: 1.0.1)
1.0.2
> Handle collections at the PropertyAccessStrategy level
> ------------------------------------------------------
>
> Key: RCP-214
> URL: http://jira.springframework.org/browse/RCP-214
> Project: Spring Framework Rich Client Project
> Issue Type: New Feature
> Reporter: Oliver Hutchison
> Assignee: Oliver Hutchison
> Fix For: 1.0.2
>
>
> We need a CollectionPropertyAccessStrategy and also the ability to proxy collections returned by all PropertyAccessStrategies so that changes to collections are properly detected.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
|
From: Lieven D. (JIRA) <no...@sp...> - 2008-10-09 19:16:23
|
[ http://jira.springframework.org/browse/RCP-285?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lieven Doclo updated RCP-285:
-----------------------------
Fix Version/s: (was: 1.0.1)
1.0.2
> Petclinic: (Re)Enable webstart + standalone webstart on site demo
> -----------------------------------------------------------------
>
> Key: RCP-285
> URL: http://jira.springframework.org/browse/RCP-285
> Project: Spring Framework Rich Client Project
> Issue Type: New Feature
> Components: Build System
> Reporter: Geoffrey De Smet
> Assignee: Geoffrey De Smet
> Fix For: 1.0.2
>
>
> Enable webstart for petlinic:
> - client webstart included in server
> - standalone webstart included in maven site as demo "WEB START ME NOW"
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.springframework.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|