How to pass a Parameterized Command to a CommandContributionItem - swt

Using Eclipse and SWT I am currently trying to get a CommandContributionItem (CCI) as a Button into a ViewPart with two text fields. When I push the button my ParameterizedCommand should be called using the current text values of the text fields as parameters.
I was able to pass the initial values of the text fields to the CCI like that:
public void createPartControl(Composite parent) {
parent.setLayout(new GridLayout(1, false));
text = new Text(parent, SWT.BORDER);
text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
text_1 = new Text(parent, SWT.BORDER);
text_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Map<String, String> params = new HashMap<String, String>();
params.put("myString", text.getText());
params.put("mySecondString", text_1.getText());
CommandContributionItemParameter p = new CommandContributionItemParameter(getSite(),
"commandSyso","com.voo.example.commandparameter.simple.sysoCommand", CommandContributionItem.STYLE_PUSH);
p.label = "My Label";
p.parameters = params;
CommandContributionItem item = new CommandContributionItem(p);
item.fill(parent);
}
But it is a static one-time pass. Is there a way to update this dynamically every time the CCI is called?

CommandContributionItem parameters are static in nature. You can't modify them, only create a new instance of CommandContributionItem.
When working with commands, implementation of IHandler should look for the current selection using the ExecutionEvent.getApplicationContext(). If it is an IEvaluationContext, the selection can be retrieved using org.eclipse.ui.handlers.HandlerUtil
But in your example, you would need some way to supply the values of your 2 text fields to the framework, either by implementing an ISelectionProvider, an ISourceProvider (where you could provide each text field under a new name), or by having your handler check for your IViewPart and then access the information through accessors.

Related

ID attribute not displayed in Browser for Eclipse SWT/RAP HTML components

We are using RAP with Eclipse SWT to render our application UI in browser.
We want to automate the Testing of Application with selenium, which requires IDs for each HTML component.
But the problem is widgets (Text in this case) does not have "id" as an attributes visible in the browser.
We have tried using following setData method of Text widget but still id attribute is not visible in browser.
tf_offerId.setData(SWT.SKIN_ID, "myId1");
tf_offerId.setData(SWT.SKIN_CLASS, "myClass");
Here is our sample Code.
class A {
private Text tf_offerId;
void method1() {
Composite comp_left = new Composite(this, SWT.NONE);
Composite comp = new Composite(comp_left, SWT.NONE);
GridLayout gl_comp = new GridLayout(3, false);
gl_comp.marginWidth = 0;
comp.setLayout(gl_comp);
comp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false,1, 1));
Label lbl = new Label(comp, SWT.NONE);
lbl.setText("Offer Id / Cluster Id");
lbl.setBackground(new Color(getDisplay(),220,220,220));
lbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
tf_offerId = new Text(comp, SWT.BORDER);
tf_offerId.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,true, false, 1, 1));
tf_offerId.setToolTipText("Usage:\nsss_pricing/se_configuration-OfferId\nse_calculation-OfferId\nsss_build/sss_validation-ClusterId");
}
}
Please suggest possible solution.
To identify a widget on the client side it is best to define an dedicated test attribute that holds the id used for testing. With this id, the widget can be identified in Selenium.
A discussion of various alternatives to identify widgets on the client side for testing with Selenium can be found here:
How to write UI tests for RAP with Selenium 2.0

ToggleGroup in a GXT ColumnConfig

I'm using a ColumnConfig for presenting and editing data. For the gender I wann to have RadioButtons which where defined by an enumeration.
In every row i want to have:
id | (x) male ( ) female | name | date
The only way I have found was adding a "button" with defined rendering code. But there I cannot get the values or actions for pushed radio.
ColumnConfig<SomeValueGto, String> begIdCol = createColumnConfig(begIdProvider, "Id", sizeBegId);
//gender
ColumnConfig<SomeValueGto, GenderCode> genderCol = createColumnConfig(GRID_PROPERTIES.sex(), "Sex*", sizeGender);
ColumnConfig<SomeValueGto, String> nameCol = createColumnConfig(GRID_PROPERTIES.name(), "Name*", sizeName);
ColumnConfig<SomeValueGto, Date> birthdateCol = createColumnConfig(GRID_PROPERTIES.birthdate(), "Birthdate*", sizeBirthdate);
DateCell gebCell = new DateCell(DateTimeFormat.getFormat("dd.MM.yyyy"));
geburtsdatumCol.setCell(gebCell);
//add fields to the row
List<ColumnConfig<SomeValueGto, ?>> columnList = new ArrayList<ColumnConfig<SomeValueGto, ?>>();
columnList.add(begIdCol);
columnList.add(genderCol);
columnList.add(nameCol);
columnList.add(birthdateCol);
ColumnModel<SomeValueGto> cm = new ColumnModel<SomeValueGto>(columnList);
ListStore<SomeValueGto> gridStore = new ListStore<SomeValueGto>(GRID_PROPERTIES.id());
myGrid = new SLGrid<SomeValueGto>(gridStore, cm);
// empty entries. default ids 1/2/3
myGrid.getStore().add(new SomeValueGto(1));
myGrid.getStore().add(new SomeValueGto(2));
myGrid.getStore().add(new SomeValueGto(3));
final GridInlineEditing<SomeValueGto> editing = new GridInlineEditing<SomeValueGto>(myGrid);
editing.setErrorSummary(false);
editing.addEditor(nameCol, new TextField());
final SLDateField dateField = new SLDateField("date", false, true);
editing.addEditor(geburtsdatumCol, new Converter<Date, Date>() {.....}, dateField);
The helper createColumnConfig:
private <T> ColumnConfig<SomeValueGto, T> createColumnConfig(ValueProvider<SomeValueGto, T> aValueProvider, String aHeader, int aWidth) {
ColumnConfig<SomeValueGto, T> columnCol = new ColumnConfig<SomeValueGto, T>(aValueProvider);
columnCol.setHeader(aHeader);
columnCol.setWidth(aWidth);
columnCol.setMenuDisabled(true);
return columnCol;
}
Does anyone have already solved a problem like this?
GXT Grids uses com.google.gwt.cell.client.Cell to render data in the grid. I don't think the kind of cell you want exist in GXT. So I think you will have to implement your own cell. You can take example of ColorPaletteCell, which allow the user to select a color from the cell itself.
So you will need to implement the render and onBrowserEvent methods to manage your radio buttons and what append when the user click on it.

How to coloriate differently even rows and odd rows of a List in LWUIT?

There is a List in a LWUIT application. I want to make odd rows and even rows to be of different colors. How to achieve that ?
You can set two differents UIIDs to the rows. Setting this UIID you can modify selectively the colors of your rows.
EDIT
Ok this will be more difficult.
You need to make a Render and set it in your List with List.setRender(Render r).
The ´Render´ class will extend from ListCellRender. In this class you can set UIID to the Render, setting its Selected or Unselected styles.
See this example. #Shai Almog could have more info for your problem.
http://www.lwuit.com/2008/07/lwuit-list-renderer-by-chen-fishbein.html
What you need is the Generic List Cell Renderer, you will probably have to create the styles in code, or set the UIID from the resource editor.
List list = new List(createGenericListCellRendererModelData());
list.setRenderer(new GenericListCellRenderer(createGenericRendererContainer(), createGenericRendererContainer()));
private Container createGenericRendererContainer() {
Container c = new Container(new BorderLayout());
c.setUIID("ListRenderer");
Label name = new Label();
name.setFocusable(true);
name.setName("Name");
c.addComponent(BorderLayout.CENTER, name);
Label surname = new Label();
surname.setFocusable(true);
surname.setName("Surname");
c.addComponent(BorderLayout.SOUTH, surname);
CheckBox selected = new CheckBox();
selected.setName("Selected");
selected.setFocusable(true);
c.addComponent(BorderLayout.WEST, selected);
return c;
}
private Hashtable[] createGenericListCellRendererModelData() {
Hashtable[] data = new Hashtable[5];
data[0] = new Hashtable();
data[0].put("Name", "Shai");
data[0].put("Surname", "Almog");
data[0].put("Selected", Boolean.TRUE);
data[1] = new Hashtable();
data[1].put("Name", "Chen");
data[1].put("Surname", "Fishbein");
data[1].put("Selected", Boolean.TRUE);
data[2] = new Hashtable();
data[2].put("Name", "Ofir");
data[2].put("Surname", "Leitner");
data[3] = new Hashtable();
data[3].put("Name", "Yaniv");
data[3].put("Surname", "Vakarat");
data[4] = new Hashtable();
data[4].put("Name", "Meirav");
data[4].put("Surname", "Nachmanovitch");
return data;
}
Full details here : http://lwuit.blogspot.com/2011/03/list-rendering-easy-way-generic-list.html (code gotten from this link).

Wicket palette with dropdownchoice

I created a palette which contains values, and i created a DropDownChoice ddcdomaines with an AjaxFormComponentUpdatingBehavior to update choice list, but i dont know how to do it, can you help me?
Here my code:
List<PartnerDomainDTO> domaines = partenaireHelper.allDomains();
ChoiceRenderer choiceRenderer = new ChoiceRenderer("label", "sid");
final Palette palette =
new Palette("partenaires", new PropertyModel(offre, "partenaires"), new Model(
(Serializable) partenairesPossibles), renderer, 10, false) {
private static final long serialVersionUID = 1178320215146881229L;
boolean first = true;
#Override
public Iterator getSelectedChoices() {
if (first) {
first = false;
return partenairesExistants.iterator();
}
return super.getSelectedChoices();
}
};
palette.setOutputMarkupId(true);
palette.setOutputMarkupPlaceholderTag(true);
DropDownChoice ddcdomaines = new DropDownChoice("domaines", new Model(domaines.get(0)), domaines, choiceRenderer);
ddcdomaines.add(new AjaxFormComponentUpdatingBehavior("onchange") {
#Override
protected void onUpdate(AjaxRequestTarget target) {
remove(palette);
Palette palette1 =
new Palette(
"partenaires",
new PropertyModel(offre, "partenaires"),
new Model(new ArrayList<Partenaire>()),
renderer,
10,
false);
palette1.setOutputMarkupId(true);
palette1.setOutputMarkupPlaceholderTag(true);
add(palette1);
target.addComponent(palette);
target.addComponent(palette1);
}
});
add(palette);
add(ddcdomaines);
}
Here is an excellent example of DropDownChoice with AjaxFormComponentUpdatingBehavior:
http://wicketstuff.org/wicket/ajax/choice
Click on the Source Code link to see the source. If you need more information, than you need to provide more detail in your question.
Update: According to the JavaDoc, there is a specific way to update Palettes using Ajax:
http://wicket.apache.org/apidocs/1.4/org/apache/wicket/extensions/markup/html/form/palette/Palette.html
Make sure you follow those instructions before doing anything else.
In your code, you are attempting to remove one Palette and put in another Palette. While this might work in the long run, it is not very Wicket-y. Sadly, Palette does not have a public method to change the choices. However, if you keep a reference to your choicesModel, then you can modify that list and the Palette should see the change on re-render. Something like this:
final Model<List<String>> choicesModel = new Model<List<String>>(partenairesPossibles)
final Palette palette = new Palette("partenaires", new PropertyModel(offre, "partenaires"), choicesModel, renderer, 10, false) {...};
And then in your Ajax onUpdate
choicesModel.setObject(/* Insert your other list */);
target.addComponent(palette);
Be careful with keeping track of the selected choices and the possible choices. I'm not sure what will happen if these don't match up. Hope that helps!

Can user add new Sections in a view?

I am using eclipse 3.6 and developing RCP application with java 6.
I am using the Section and trying to let the use able to add new n-sections. I need the text in the field after that.
Now the User can see a section. I need that he is able to add a n-sections and then to write text in stopRouteStreet-field. I would like to read all the n Text written in this field.
Any idea how to do this?.
Here is my code
Section sectionStop = toolkit.createSection(form.getBody(), Section.DESCRIPTION|Section.TWISTIE|Section.TITLE_BAR);
td = new TableWrapData(TableWrapData.FILL);
td.colspan = 2;
sectionStop.setLayoutData(td);
sectionStop.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
form.reflow(true);
}
});
sectionStop.setText(Messages.SearchMapView_endPoint); //$NON-NLS-1$
Composite sectionClientStop = toolkit.createComposite(sectionStop);
sectionClientStop.setLayout(new GridLayout());
final Composite stopComposite = toolkit.createComposite(sectionClientStop, SWT.NONE);
final GridLayout gridLayoutStop = new GridLayout();
gridLayoutStop.numColumns = 2;
stopComposite.setLayout(gridLayoutStop);
toolkit.createLabel(stopComposite, Messages.SearchMapView_Street);
stopRouteStreet = toolkit.createText(stopComposite, "", SWT.BORDER); //$NON-NLS-1$
sectionStop.setClient(sectionClientStop);
You need a global variable (a HashMap would do), that saves a mapping between each newly created Section and the Text control.
// define global field
HashMap <Section, Text> dynamicControls = new HashMap <Section, Text> ();
// after you create the text field, save the newly created Text field
....
...
dynamicControls.put(section, text);
// Later when you need to read the values in all the text fields
for(Section s: dynamicControls.keySet()){
Text textField = dynamicControls.get(s);
System.out.println(textField.getText());
}